From 2a30567223a5edd95e2e5c748ea49db8efc37007 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Mon, 9 Nov 2015 12:03:11 +0100 Subject: [PATCH 001/340] Additional RRC procedures (RRCConnectionReconfiguration) for dedicated bearer estatblishment triggered by S1AP messages. eNB mac scheduler for dedicated DTCH. UE MAC logical channel prioritization with additional DTCH. S1AP messages for dedicated bearer establishment (eNB and UE). --- openair2/COMMON/s1ap_messages_def.h | 3 + openair2/COMMON/s1ap_messages_types.h | 39 ++- openair2/LAYER2/MAC/config.c | 4 + openair2/LAYER2/MAC/defs.h | 2 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 154 ++++++----- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 111 ++++---- openair2/LAYER2/MAC/ue_procedures.c | 181 +++++++------ openair2/RRC/LITE/defs.h | 8 +- openair2/RRC/LITE/proto.h | 11 + openair2/RRC/LITE/rrc_eNB.c | 316 ++++++++++++++++++++-- openair2/RRC/LITE/rrc_eNB_S1AP.c | 139 +++++++++- openair3/S1AP/s1ap_eNB.c | 6 + openair3/S1AP/s1ap_eNB_decoder.c | 8 + openair3/S1AP/s1ap_eNB_handlers.c | 113 +++++++- openair3/S1AP/s1ap_eNB_nas_procedures.c | 91 +++++++ 15 files changed, 945 insertions(+), 241 deletions(-) diff --git a/openair2/COMMON/s1ap_messages_def.h b/openair2/COMMON/s1ap_messages_def.h index ce51ac78ca..b9f7a0d02f 100644 --- a/openair2/COMMON/s1ap_messages_def.h +++ b/openair2/COMMON/s1ap_messages_def.h @@ -58,12 +58,15 @@ MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_RESP , MESSAGE_PRIORITY_MED, s1ap_ue_relea MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMPLETE, MESSAGE_PRIORITY_MED, s1ap_ue_release_complete_t , s1ap_ue_release_complete) MESSAGE_DEF(S1AP_UE_CTXT_MODIFICATION_RESP , MESSAGE_PRIORITY_MED, s1ap_ue_ctxt_modification_resp_t , s1ap_ue_ctxt_modification_resp) MESSAGE_DEF(S1AP_UE_CTXT_MODIFICATION_FAIL , MESSAGE_PRIORITY_MED, s1ap_ue_ctxt_modification_fail_t , s1ap_ue_ctxt_modification_fail) +MESSAGE_DEF(S1AP_E_RAB_SETUP_RESP , MESSAGE_PRIORITY_MED, s1ap_e_rab_setup_resp_t , s1ap_e_rab_setup_resp) +MESSAGE_DEF(S1AP_E_RAB_SETUP_REQUEST_FAIL , MESSAGE_PRIORITY_MED, s1ap_e_rab_setup_req_fail_t , s1ap_e_rab_setup_request_fail) /* S1AP -> RRC messages */ MESSAGE_DEF(S1AP_DOWNLINK_NAS , MESSAGE_PRIORITY_MED, s1ap_downlink_nas_t , s1ap_downlink_nas ) MESSAGE_DEF(S1AP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, s1ap_initial_context_setup_req_t , s1ap_initial_context_setup_req ) MESSAGE_DEF(S1AP_UE_CTXT_MODIFICATION_REQ , MESSAGE_PRIORITY_MED, s1ap_ue_ctxt_modification_req_t , s1ap_ue_ctxt_modification_req) MESSAGE_DEF(S1AP_PAGING_IND , MESSAGE_PRIORITY_MED, s1ap_paging_ind_t , s1ap_paging_ind ) +MESSAGE_DEF(S1AP_E_RAB_SETUP_REQ , MESSAGE_PRIORITY_MED, s1ap_e_rab_setup_req_t , s1ap_e_rab_setup_req ) MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMMAND, MESSAGE_PRIORITY_MED, s1ap_ue_release_command_t , s1ap_ue_release_command) /* S1AP <-> RRC messages (can be initiated either by MME or eNB) */ diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h index c39725b737..83c9ca64ca 100644 --- a/openair2/COMMON/s1ap_messages_types.h +++ b/openair2/COMMON/s1ap_messages_types.h @@ -47,12 +47,15 @@ #define S1AP_NAS_NON_DELIVERY_IND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_nas_non_delivery_ind #define S1AP_UE_CTXT_MODIFICATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_ctxt_modification_resp #define S1AP_UE_CTXT_MODIFICATION_FAIL(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_ctxt_modification_fail +#define S1AP_E_RAB_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_resp +#define S1AP_E_RAB_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_req_fail #define S1AP_DOWNLINK_NAS(mSGpTR) (mSGpTR)->ittiMsg.s1ap_downlink_nas #define S1AP_INITIAL_CONTEXT_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_initial_context_setup_req #define S1AP_UE_CTXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_ctxt_modification_req #define S1AP_UE_CONTEXT_RELEASE_COMMAND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_release_command #define S1AP_UE_CONTEXT_RELEASE_COMPLETE(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_release_complete +#define S1AP_E_RAB_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_req #define S1AP_PAGIND_IND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_paging_ind #define S1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_release_req @@ -390,7 +393,7 @@ typedef struct s1ap_initial_context_setup_fail_s { unsigned eNB_ue_s1ap_id:24; /* TODO add cause */ -} s1ap_initial_context_setup_fail_t, s1ap_ue_ctxt_modification_fail_t; +} s1ap_initial_context_setup_fail_t, s1ap_ue_ctxt_modification_fail_t, s1ap_e_rab_setup_req_fail_t; typedef struct s1ap_nas_non_delivery_ind_s { unsigned eNB_ue_s1ap_id:24; @@ -439,6 +442,7 @@ typedef struct s1ap_downlink_nas_s { nas_pdu_t nas_pdu; } s1ap_downlink_nas_t; + typedef struct s1ap_initial_context_setup_req_s { /* UE id for initial connection to S1AP */ uint16_t ue_initial_id; @@ -479,6 +483,39 @@ typedef struct s1ap_paging_ind_s { paging_priority_t paging_priority; } s1ap_paging_ind_t; +typedef struct s1ap_e_rab_setup_req_s { + /* UE id for initial connection to S1AP */ + uint16_t ue_initial_id; + + /* MME UE id */ + uint16_t mme_ue_s1ap_id; + + /* eNB ue s1ap id as initialized by S1AP layer */ + unsigned eNB_ue_s1ap_id:24; + + /* Number of e_rab to be setup in the list */ + uint8_t nb_e_rabs_tosetup; + + /* E RAB setup request */ + e_rab_t e_rab_setup_params[S1AP_MAX_E_RAB]; + +} s1ap_e_rab_setup_req_t; + +typedef struct s1ap_e_rab_setup_resp_s { + unsigned eNB_ue_s1ap_id:24; + + /* Number of e_rab setup-ed in the list */ + uint8_t nb_of_e_rabs; + /* list of e_rab setup-ed by RRC layers */ + e_rab_setup_t e_rabs[S1AP_MAX_E_RAB]; + + /* Number of e_rab failed to be setup in list */ + uint8_t nb_of_e_rabs_failed; + /* list of e_rabs that failed to be setup */ + e_rab_failed_t e_rabs_failed[S1AP_MAX_E_RAB]; +} s1ap_e_rab_setup_resp_t; + + // S1AP --> RRC messages typedef struct s1ap_ue_release_command_s { diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index e3f6d8e78c..e719d6729f 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -189,6 +189,10 @@ rrc_mac_config_req( mac_xface->macphy_exit("NULL ul_SpecificParameters"); } } + else { + eNB_mac_inst[Mod_id].lcid_active[logicalChannelIdentity]=1; + LOG_I(MAC,"[CONFIG][eNB %d] lcid %d is active for UE rnti %x on cc_id % \n",Mod_id,rntiP,CC_id); + } } if (mac_MainConfig != NULL) { diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index a0a43b6d79..3c9568d41f 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -887,7 +887,7 @@ typedef struct { SBMAP_CONF sbmap_conf; /// active flag for Other lcid - // uint8_t lcid_active[NB_RB_MAX]; + uint8_t lcid_active[NB_RB_MAX]; /// eNB stats eNB_STATS eNB_stats[MAX_NUM_CCs]; // MAC function execution peformance profiler diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 52e0f60d65..ca08f07695 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -435,10 +435,12 @@ schedule_ue_spec( int N_RBG[MAX_NUM_CCs]; unsigned char aggregation; mac_rlc_status_resp_t rlc_status; - unsigned char header_len_dcch=0, header_len_dcch_tmp=0,header_len_dtch=0,header_len_dtch_tmp=0, ta_len=0; - unsigned char sdu_lcids[11],offset,num_sdus=0; + unsigned char header_len_dcch=0, header_len_dcch_tmp=0, header_len_dcch_last=0; + unsigned char header_len_dtch=0, header_len_dtch_tmp=0, header_len_dtch_last=0; + unsigned char ta_len=0; + unsigned char sdu_lcids[NB_RB_MAX],lcid,offset,num_sdus=0; uint16_t nb_rb,nb_rb_temp,total_nb_available_rb[MAX_NUM_CCs],nb_available_rb; - uint16_t TBS,j,sdu_lengths[11],rnti,padding=0,post_padding=0; + uint16_t TBS,j,sdu_lengths[NB_RB_MAX],rnti,padding=0,post_padding=0; unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; unsigned char round = 0; unsigned char harq_pid = 0; @@ -903,84 +905,92 @@ schedule_ue_spec( ENB_FLAG_YES, MBMS_FLAG_NO, DCCH+1, - (char *)&dlsch_buffer[sdu_lengths[0]]); + (char *)&dlsch_buffer[sdu_lengths[num_sdus]]); sdu_lcids[num_sdus] = DCCH1; sdu_length_total += sdu_lengths[num_sdus]; header_len_dcch += 2; UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH1]+=1; UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH1]+=sdu_lengths[num_sdus]; - num_sdus++; - LOG_D(MAC,"[eNB %d] CC_id %d Got %d bytes for DCCH from RLC\n",module_idP,CC_id,sdu_lengths[0]); - } + LOG_D(MAC,"[eNB %d] CC_id %d Got %d bytes for DCCH from RLC\n",module_idP,CC_id,sdu_lengths[num_sdus]); + num_sdus++; + } } - // check for DTCH and update header information - // here we should loop over all possible DTCH - - header_len_dtch = 3; // 3 bytes DTCH SDU subheader - - LOG_D(MAC,"[eNB %d], Frame %d, DTCH->DLSCH, CC_id %d, Checking RLC status (rab %d, tbs %d, len %d)\n", - module_idP,frameP,CC_id,DTCH,TBS, - TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - - if (TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch > 0 ) { - rlc_status = mac_rlc_status_ind( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DTCH, - TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - - if (rlc_status.bytes_in_buffer > 0) { - - LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB], Frame %d, DTCH->DLSCH, CC_id %d, Requesting %d bytes from RLC (hdr len dtch %d)\n", - module_idP,frameP,CC_id,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch); - sdu_lengths[num_sdus] = mac_rlc_data_req( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DTCH, - (char*)&dlsch_buffer[sdu_length_total]); - - LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] CC_id %d Got %d bytes for DTCH %d \n", - module_idP,CC_id,sdu_lengths[num_sdus],DTCH); - sdu_lcids[num_sdus] = DTCH; - sdu_length_total += sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DTCH]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DTCH]+=sdu_lengths[num_sdus]; - - if (sdu_lengths[num_sdus] < 128) { - header_len_dtch=2; - } - - num_sdus++; - } else { - header_len_dtch = 0; - } - } - - // there is a payload - if (((sdu_length_total + header_len_dcch + header_len_dtch )> 0)) { - - // Now compute number of required RBs for total sdu length - // Assume RAH format 2 - // adjust header lengths - header_len_dcch_tmp = header_len_dcch; - header_len_dtch_tmp = header_len_dtch; - - if (header_len_dtch==0) { - header_len_dcch = (header_len_dcch >0) ? 1 : header_len_dcch; // remove length field - } else { - header_len_dtch = (header_len_dtch > 0) ? 1 :header_len_dtch; // remove length field for the last SDU - } + // assume the max dtch header size, and adjust it later + header_len_dtch=0; + header_len_dtch_last=0; // the header length of the last mac sdu + // lcid has to be sorted before the actual allocation (similar struct as ue_list). + for (lcid=NB_RB_MAX-1; lcid>=DTCH ; lcid--){ + // TBD: check if the lcid is active + + header_len_dtch+=3; + header_len_dtch_last=3; + LOG_D(MAC,"[eNB %d], Frame %d, DTCH%d->DLSCH, Checking RLC status (tbs %d, len %d)\n", + module_idP,frameP,lcid,TBS, + TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); + + if (TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch > 0 ) { // NN: > 2 ? + rlc_status = mac_rlc_status_ind(module_idP, + rnti, + module_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + lcid, + TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); + + if (rlc_status.bytes_in_buffer > 0) { + + LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH%d->DLSCH, Requesting %d bytes from RLC (total hdr len dtch %d)\n", + module_idP,frameP,lcid,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch); + sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, + rnti, + module_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + lcid, + (char*)&dlsch_buffer[sdu_length_total]); + + LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",module_idP,sdu_lengths[num_sdus],lcid); + sdu_lcids[num_sdus] = lcid; + sdu_length_total += sdu_lengths[num_sdus]; + UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[lcid]+=1; + UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[lcid]+=sdu_lengths[num_sdus]; + if (sdu_lengths[num_sdus] < 128) { + header_len_dtch--; + header_len_dtch_last--; + } + num_sdus++; + } // no data for this LCID + else { + header_len_dtch-=3; + } + } // no TBS left + else { + header_len_dtch-=3; + break; + } + } + if (header_len_dtch == 0 ) + header_len_dtch_last= 0; + // there is at least one SDU + // if (num_sdus > 0 ){ + if ((sdu_length_total + header_len_dcch + header_len_dtch )> 0) { + + // Now compute number of required RBs for total sdu length + // Assume RAH format 2 + // adjust header lengths + header_len_dcch_tmp = header_len_dcch; + header_len_dtch_tmp = header_len_dtch; + if (header_len_dtch==0) { + header_len_dcch = (header_len_dcch >0) ? 1 : 0;//header_len_dcch; // remove length field + } else { + header_len_dtch_last-=1; // now use it to find how many bytes has to be removed for the last MAC SDU + header_len_dtch = (header_len_dtch > 0) ? header_len_dtch - header_len_dtch_last :header_len_dtch; // remove length field for the last SDU + } mcs = eNB_UE_stats->dlsch_mcs1; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 1018c6e7d8..6bfb598db5 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -69,16 +69,15 @@ // This table holds the allowable PRB sizes for ULSCH transmissions uint8_t rb_table[33] = {1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48,50,54,60,72,75,80,81,90,96,100}; -void rx_sdu( - const module_id_t enb_mod_idP, - const int CC_idP, - const frame_t frameP, - const sub_frame_t subframeP, - const rnti_t rntiP, - uint8_t *sduP, - const uint16_t sdu_lenP, - const int harq_pidP, - uint8_t *msg3_flagP) +void rx_sdu(const module_id_t enb_mod_idP, + const int CC_idP, + const frame_t frameP, + const sub_frame_t subframeP, + const rnti_t rntiP, + uint8_t *sduP, + const uint16_t sdu_lenP, + const int harq_pidP, + uint8_t *msg3_flagP) { unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; @@ -216,8 +215,8 @@ void rx_sdu( for (i=0; i UL-DCCH, received %d bytes form UE %d on LCID %d \n", - enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id, rx_lcids[i]); - + LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DCCH%d, received %d bytes form UE %d \n", + enb_mod_idP,CC_idP,frameP, rx_lcids[i], rx_lengths[i], UE_id); + mac_rlc_data_ind( - enb_mod_idP, - rntiP, - enb_mod_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - rx_lcids[i], - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL);//(unsigned int*)crc_status); + enb_mod_idP, + rntiP, + enb_mod_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + rx_lcids[i], + (char *)payload_ptr, + rx_lengths[i], + 1, + NULL);//(unsigned int*)crc_status); UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1; UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; } } /* UE_id != -1 */ - - // } - break; - - case DTCH: // default DRB - // if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){ + + } else if ((rx_lcids[i] < NB_RB_MAX) && (rx_lcids[i] > DCCH1 )) { + LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH%d, received %d bytes form UE %d \n", + enb_mod_idP,CC_idP,frameP, rx_lcids[i], rx_lengths[i], UE_id); #if defined(ENABLE_MAC_PAYLOAD_DEBUG) LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sduP)); - for (j=0; j<32; j++) { LOG_T(MAC,"%x ",payload_ptr[j]); } - LOG_T(MAC,"\n"); #endif - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d\n", - enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id,rx_lcids[i]); - if (UE_id != -1) { if ((rx_lengths[i] 0) ) { // MAX SIZE OF transport block mac_rlc_data_ind( - enb_mod_idP, - rntiP, - enb_mod_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DTCH, - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL);//(unsigned int*)crc_status); + enb_mod_idP, + rntiP, + enb_mod_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + rx_lcids[i], + (char *)payload_ptr, + rx_lengths[i], + 1, + NULL);//(unsigned int*)crc_status); + UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1; UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; } - } /* UE_id != -1 */ - - // } - break; - - default : //if (rx_lcids[i] >= DTCH) { - if (UE_id != -1) - UE_list->eNB_UE_stats[CC_idP][UE_id].num_errors_rx+=1; + } else { /* UE_id != -1 */ + UE_list->eNB_UE_stats[CC_idP][UE_id].num_errors_rx+=1; + } + } else { + UE_list->eNB_UE_stats[CC_idP][UE_id].num_errors_rx+=1; LOG_E(MAC,"[eNB %d] CC_id %d Frame %d : received unsupported or unknown LCID %d from UE %d ", enb_mod_idP, CC_idP, frameP, rx_lcids[i], UE_id); - break; } - + payload_ptr+=rx_lengths[i]; } diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index ee6340cb43..90d227eb35 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -302,16 +302,12 @@ uint32_t ue_get_SR(module_id_t module_idP,int CC_id,frame_t frameP,uint8_t eNB_i //------------------------------------------------------------------------------ void -ue_send_sdu( - module_id_t module_idP, - uint8_t CC_id, - frame_t frameP, - uint8_t* sdu, - uint16_t sdu_len, - uint8_t eNB_index -) -//------------------------------------------------------------------------------ -{ +ue_send_sdu(module_id_t module_idP, + uint8_t CC_id, + frame_t frameP, + uint8_t* sdu, + uint16_t sdu_len, + uint8_t eNB_index) { unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; unsigned char rx_lcids[NB_RB_MAX]; @@ -401,7 +397,7 @@ ue_send_sdu( #ifdef DEBUG_HEADER_PARSING LOG_D(MAC,"[UE] SDU %d : LCID %d, length %d\n",i,rx_lcids[i],rx_lengths[i]); #endif - + if (rx_lcids[i] == CCCH) { LOG_D(MAC,"[UE %d] rnti %x Frame %d : DLSCH -> DL-CCCH, RRC message (eNB %d, %d bytes)\n", @@ -431,7 +427,7 @@ ue_send_sdu( eNB_index, 0); - } else if (rx_lcids[i] == DCCH) { + } else if ((rx_lcids[i] == DCCH) || (rx_lcids[i] == DCCH1)) { LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", module_idP, frameP, rx_lcids[i],eNB_index,rx_lengths[i]); mac_rlc_data_ind(module_idP, UE_mac_inst[module_idP].crnti, @@ -439,53 +435,39 @@ ue_send_sdu( frameP, ENB_FLAG_NO, MBMS_FLAG_NO, - DCCH, + rx_lcids[i], (char *)payload_ptr, rx_lengths[i], 1, NULL); - } else if (rx_lcids[i] == DCCH1) { - LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", module_idP, frameP, rx_lcids[i], eNB_index,rx_lengths[i]); - mac_rlc_data_ind(module_idP, - UE_mac_inst[module_idP].crnti, - eNB_index, - frameP, - ENB_FLAG_NO, - MBMS_FLAG_NO, - DCCH1, - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL); - } else if (rx_lcids[i] == DTCH) { + + } else if ((rx_lcids[i] < NB_RB_MAX) && (rx_lcids[i] > DCCH1 )) { + LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DTCH%d (eNB %d, %d bytes)\n", module_idP, frameP,rx_lcids[i], eNB_index,rx_lengths[i]); #if defined(ENABLE_MAC_PAYLOAD_DEBUG) int j; - - for (j=0; j ULSCH, RRC message has %d bytes to " "send (Transport Block size %d, mac header len %d)\n", module_idP,frameP, rlc_status.bytes_in_buffer,buflen,dcch_header_len); - sdu_lengths[0] += mac_rlc_data_req(module_idP, UE_mac_inst[module_idP].crnti,eNB_index,frameP,ENB_FLAG_NO, MBMS_FLAG_NO, + sdu_lengths[0] += mac_rlc_data_req(module_idP, + UE_mac_inst[module_idP].crnti, + eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_NO, DCCH, (char *)&ulsch_buff[sdu_lengths[0]]); @@ -1306,11 +1298,15 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf // if the RLC AM is used, then RLC will only provide 2 bytes for ACK // in this case, we sould add bsr - // DCCH1 if (UE_mac_inst[module_idP].scheduling_info.LCID_status[DCCH1] == LCID_NOT_EMPTY) { - rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti, eNB_index,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index + rlc_status = mac_rlc_status_ind(module_idP, + UE_mac_inst[module_idP].crnti, + eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_NO, // eNB_index DCCH1, (buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-sdu_length_total)); @@ -1318,9 +1314,14 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf " send (Transport Block size %d, mac header len %d)\n", module_idP,frameP, rlc_status.bytes_in_buffer,buflen,dcch1_header_len); - sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, UE_mac_inst[module_idP].crnti,eNB_index,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, - DCCH1, - (char *)&ulsch_buff[sdu_lengths[0]]); + sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, + UE_mac_inst[module_idP].crnti, + eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_NO, + DCCH1, + (char *)&ulsch_buff[sdu_lengths[num_sdus]]); sdu_length_total += sdu_lengths[num_sdus]; sdu_lcids[num_sdus] = DCCH1; LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH1\n",module_idP,sdu_lengths[num_sdus]); @@ -1331,8 +1332,14 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf dcch1_header_len =0; } - if ((UE_mac_inst[module_idP].scheduling_info.LCID_status[DTCH] == LCID_NOT_EMPTY) && - ((bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len+sdu_length_total) <= buflen)) { + dtch_header_len=0; + dtch_header_len_last=0; + for (lcid=NB_RB_MAX-1; lcid>=DTCH ; lcid--){ + dtch_header_len+=3; + dtch_header_len_last=3; + + if ((UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY) && + ((bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len+sdu_length_total) <= buflen)) { // optimize the dtch header lenght //if ((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH] > 128) && @@ -1343,29 +1350,47 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf else dtch_header_len = 2;//sizeof(SCH_SUBHEADER_SHORT); */ - rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti, eNB_index,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index - DTCH, - buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total); + rlc_status = mac_rlc_status_ind(module_idP, + UE_mac_inst[module_idP].crnti, + eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_NO, // eNB_index + lcid, + buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total); - LOG_D(MAC,"[UE %d] Frame %d : UL-DTCH -> ULSCH, %d bytes to send (Transport Block size %d, mac header len %d, BSR byte[DTCH] %d)\n", - module_idP,frameP, rlc_status.bytes_in_buffer,buflen,dtch_header_len, - UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH]); - - sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,UE_mac_inst[module_idP].crnti,eNB_index,frameP, ENB_FLAG_NO, MBMS_FLAG_NO, // eNB_index - DTCH, - (char *)&ulsch_buff[sdu_length_total]); - - //adjust dtch header - dtch_header_len = (sdu_lengths[num_sdus] >= 128) ? 3 : 2; - LOG_D(MAC,"[UE %d] TX Got %d bytes for DTCH\n",module_idP,sdu_lengths[num_sdus]); - sdu_lcids[num_sdus] = DTCH; - sdu_length_total += sdu_lengths[num_sdus]; - num_sdus++; - UE_mac_inst[module_idP].ul_active = update_bsr(module_idP, frameP, eNB_index,DTCH, UE_mac_inst[module_idP].scheduling_info.LCGID[DTCH]); - } else { // no rlc pdu : generate the dummy header - dtch_header_len = 0; + LOG_D(MAC,"[UE %d] Frame %d : UL-DTCH -> ULSCH%d, %d bytes to send (Transport Block size %d, mac header len %d, BSR byte[%d] %d)\n", + module_idP,frameP, lcid, rlc_status.bytes_in_buffer,buflen,dtch_header_len, + lcid, UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcid]); + + if (rlc_status.bytes_in_buffer > 0) { + sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, + UE_mac_inst[module_idP].crnti, + eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_NO, // eNB_index + lcid, + (char *)&ulsch_buff[sdu_length_total]); + + //adjust dtch header + LOG_D(MAC,"[UE %d] TX Got %d bytes for DTCH\n",module_idP,sdu_lengths[num_sdus]); + sdu_lcids[num_sdus] = lcid; + sdu_length_total += sdu_lengths[num_sdus]; + if (sdu_lengths[num_sdus] < 128) { + dtch_header_len --; + dtch_header_len_last --; + } + num_sdus++; + UE_mac_inst[module_idP].ul_active = update_bsr(module_idP, frameP, eNB_index,lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]); + } else { + dtch_header_len -= 3; + } + } else { // no rlc pdu : generate the dummy header + dtch_header_len -= 3; + } } - + lcgid= get_bsr_lcgid(module_idP); if (lcgid < 0 ) { @@ -1406,6 +1431,9 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf LOG_T(MAC,"[UE %d] Frame %d: bsr s %p bsr_l %p, phr_p %p\n", module_idP,frameP,bsr_s, bsr_l, phr_p); + if (dtch_header_len == 0 ) + dtch_header_len_last =0; + // adjust the header length dcch_header_len_tmp = dcch_header_len; dtch_header_len_tmp = dtch_header_len; @@ -1413,7 +1441,8 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf if (dtch_header_len==0) { dcch_header_len = (dcch_header_len>0)? 1: dcch_header_len; } else { - dtch_header_len= (dtch_header_len >0)? 1: dtch_header_len; // for short and long, cut the length+F fields + dtch_header_len_last-=1; + dtch_header_len= (dtch_header_len >0)? dtch_header_len - dtch_header_len_last : dtch_header_len; } if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) <= 2) { diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index bae3dc887a..1a4d6e0fe1 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -220,7 +220,8 @@ typedef struct UE_S_TMSI_s { #if defined(ENABLE_ITTI) typedef enum e_rab_satus_e { E_RAB_STATUS_NEW, - E_RAB_STATUS_DONE, + E_RAB_STATUS_DONE, // from the eNB perspective + E_RAB_STATUS_ESTABLISHED, // get the reconfigurationcomplete form UE E_RAB_STATUS_FAILED, } e_rab_status_t; @@ -232,7 +233,6 @@ typedef struct e_rab_param_s { - /* Intermediate structure for Handover management. Associated per-UE in eNB_RRC_INST */ typedef struct HANDOVER_INFO_s { uint8_t ho_prepare; @@ -347,10 +347,12 @@ typedef struct eNB_RRC_UE_s { security_capabilities_t security_capabilities; + /* Total number of e_rab already setup in the list */ + uint8_t setup_e_rabs; /* Number of e_rab to be setup in the list */ uint8_t nb_of_e_rabs; /* list of e_rab to be setup by RRC layers */ - e_rab_param_t e_rab[S1AP_MAX_E_RAB]; + e_rab_param_t e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB]; // LG: For GTPV1 TUNNELS uint32_t enb_gtp_teid[S1AP_MAX_E_RAB]; diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 5d77698c8e..5d5875b032 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -257,6 +257,17 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( const uint8_t ho_state ); +void +rrc_eNB_generate_dedeicatedRRCConnectionReconfiguration( + const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state +); + +void +rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* ue_context_pP); + #if defined(ENABLE_ITTI) /**\brief RRC eNB task. \param void *args_p Pointer on arguments to start the task. */ diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index f19c3bced4..db70e4daf5 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1055,13 +1055,232 @@ rrc_eNB_generate_RRCConnectionRelease( PDCP_TRANSMISSION_MODE_CONTROL); } +// TBD: this directive can be remived if we create a similar e_rab_param_t structure in RRC context +#if defined(ENABLE_ITTI) //----------------------------------------------------------------------------- void -rrc_eNB_generate_defaultRRCConnectionReconfiguration( - const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, - const uint8_t ho_state -) +rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state + ) +//----------------------------------------------------------------------------- +{ + + uint8_t buffer[RRC_BUF_SIZE]; + uint16_t size; + int i; + + struct DRB_ToAddMod *DRB_config = NULL; + struct RLC_Config *DRB_rlc_config = NULL; + struct PDCP_Config *DRB_pdcp_config = NULL; + struct PDCP_Config__rlc_AM *PDCP_rlc_AM = NULL; + struct PDCP_Config__rlc_UM *PDCP_rlc_UM = NULL; + struct LogicalChannelConfig *DRB_lchan_config = NULL; + struct LogicalChannelConfig__ul_SpecificParameters + *DRB_ul_SpecificParameters = NULL; + DRB_ToAddModList_t** DRB_configList; + //DRB_ToAddModList_t** RRC_DRB_configList=&ue_context_pP->ue_context.DRB_configList; + + struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; + DedicatedInfoNAS_t *dedicatedInfoNas = NULL; + + long *logicalchannelgroup, *logicalchannelgroup_drb; + int drb_Identity_index; + +// Configure DRB + //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); + *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); + + for ( i = 0 ; + i < ue_context_pP->ue_context.nb_of_e_rabs; + i++){ + // bypass the already configured erabs + if (ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_DONE) { + //drb_identiy_index++; + continue; + } + DRB_config = CALLOC(1, sizeof(*DRB_config)); + + DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long)); + *(DRB_config->eps_BearerIdentity) = 5L; + + DRB_config->drb_Identity = (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + // 1 + drb_identiy_index; + + DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); + *(DRB_config->logicalChannelIdentity) = (long) (ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 2); // value : x+2 + DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config)); + DRB_config->rlc_Config = DRB_rlc_config; + + DRB_pdcp_config = CALLOC(1, sizeof(*DRB_pdcp_config)); + DRB_config->pdcp_Config = DRB_pdcp_config; + DRB_pdcp_config->discardTimer = CALLOC(1, sizeof(long)); + *DRB_pdcp_config->discardTimer = PDCP_Config__discardTimer_infinity; + DRB_pdcp_config->rlc_AM = NULL; + DRB_pdcp_config->rlc_UM = NULL; + + switch (ue_context_pP->ue_context.e_rab[i].param.qos.qci){ + case 1: // RLC _UM + case 2: + case 3: + case 4: + case 5: + // RLC + DRB_rlc_config->present = RLC_Config_PR_um_Bi_Directional; + DRB_rlc_config->choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = SN_FieldLength_size10; + DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.sn_FieldLength = SN_FieldLength_size10; + // PDCP + PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM)); + DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; + PDCP_rlc_UM->pdcp_SN_Size = PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits; + break; + case 6: + case 7: + case 8: + case 9: + default: + // RLC + DRB_rlc_config->present = RLC_Config_PR_am; + DRB_rlc_config->choice.am.ul_AM_RLC.t_PollRetransmit = T_PollRetransmit_ms50; + DRB_rlc_config->choice.am.ul_AM_RLC.pollPDU = PollPDU_p16; + DRB_rlc_config->choice.am.ul_AM_RLC.pollByte = PollByte_kBinfinity; + DRB_rlc_config->choice.am.ul_AM_RLC.maxRetxThreshold = UL_AM_RLC__maxRetxThreshold_t8; + DRB_rlc_config->choice.am.dl_AM_RLC.t_Reordering = T_Reordering_ms35; + DRB_rlc_config->choice.am.dl_AM_RLC.t_StatusProhibit = T_StatusProhibit_ms25; + + // PDCP + PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); + DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; + PDCP_rlc_AM->statusReportRequired = FALSE; + + //LOG_I(RRC,"not supported qci %d\n", ue_context_pP->ue_context.e_rab[i].param.qos.qci); + break; + } + + DRB_pdcp_config->headerCompression.present = PDCP_Config__headerCompression_PR_notUsed; + + DRB_lchan_config = CALLOC(1, sizeof(*DRB_lchan_config)); + DRB_config->logicalChannelConfig = DRB_lchan_config; + DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters)); + DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters; + + DRB_ul_SpecificParameters->priority = ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level; + // TO DO + DRB_ul_SpecificParameters->prioritisedBitRate = + LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; + DRB_ul_SpecificParameters->bucketSizeDuration = + LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; + + // LCG for DTCH can take the value from 1 to 3 as defined in 36331: normally controlled by upper layers (like RRM) + logicalchannelgroup_drb = CALLOC(1, sizeof(long)); + *logicalchannelgroup_drb = 1; + DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; + + ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); + +#if defined(ENABLE_ITTI) + + if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { + dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); + memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); + OCTET_STRING_fromBuf(dedicatedInfoNas, + (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); + ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); + } + /* TODO parameters yet to process ... */ + { + // ue_context_pP->ue_context.e_rab[i].param.qos; + // ue_context_pP->ue_context.e_rab[i].param.sgw_addr; + // ue_context_pP->ue_context.e_rab[i].param.gtp_teid; + } + + /* If list is empty free the list and reset the address */ + if (dedicatedInfoNASList->list.count == 0) { + free(dedicatedInfoNASList); + dedicatedInfoNASList = NULL; + } +#endif + + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; + + } + + memset(buffer, 0, RRC_BUF_SIZE); + + size = do_RRCConnectionReconfiguration(ctxt_pP, + buffer, + rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), //Transaction_id, + (SRB_ToAddModList_t*)NULL, + (DRB_ToAddModList_t*)*DRB_configList, + (DRB_ToReleaseList_t*)NULL, // DRB2_list, + (struct SPS_Config*)NULL, // *sps_Config, + NULL, NULL, NULL, NULL,NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + (struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList*)dedicatedInfoNASList +#ifdef Rel10 + , (SCellToAddMod_r10_t*)NULL +#endif + ); + +#ifdef RRC_MSG_PRINT + LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); + for (i = 0; i < size; i++) { + LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); + } + LOG_F(RRC,"\n"); + //////////////////////////////////////// +#endif + +#if defined(ENABLE_ITTI) + + /* Free all NAS PDUs */ + for (i = 0; i < ue_context_pP->ue_context.nb_of_e_rabs; i++) { + if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { + /* Free the NAS PDU buffer and invalidate it */ + free(ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer); + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL; + } + } +#endif + + LOG_I(RRC, + "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration (bytes %d, UE id %x)\n", + ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti); + + LOG_D(RRC, + "[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n", + ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_eNB_mui, ctxt_pP->module_id, DCCH); + + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_RRC_UE, + buffer, + size, + MSC_AS_TIME_FMT" dedicated rrcConnectionReconfiguration UE %x MUI %d size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_context.rnti, + rrc_eNB_mui, + size); + + pdcp_rrc_data_req( + ctxt_pP, + DCCH, + rrc_eNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + + +} +#endif +//----------------------------------------------------------------------------- +void +rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state + ) //----------------------------------------------------------------------------- { uint8_t buffer[RRC_BUF_SIZE]; @@ -1193,7 +1412,6 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( *(DRB_config->eps_BearerIdentity) = 5L; // LW set to first value, allowed value 5..15, value : x+4 // DRB_config->drb_Identity = (DRB_Identity_t) 1; //allowed values 1..32 // NN: this is the 1st DRB for this ue, so set it to 1 - // NN: this is the 1st DRB for this ue, so set it to 1 DRB_config->drb_Identity = (DRB_Identity_t) 1; // (ue_mod_idP+1); //allowed values 1..32, value: x DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); *(DRB_config->logicalChannelIdentity) = (long)3; // value : x+2 @@ -1625,11 +1843,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); - for (i = 0; i < size; i++) { LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); } - LOG_F(RRC,"\n"); //////////////////////////////////////// #endif @@ -3818,7 +4034,8 @@ rrc_eNB_decode_dcch( UE_EUTRA_Capability_t *UE_EUTRA_Capability = NULL; int i; struct rrc_eNB_ue_context_s* ue_context_p = NULL; - + int dedicated_DRB=0; + if ((Srb_id != 1) && (Srb_id != 2)) { LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Received message on SRB%d, should not have ...\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), @@ -3946,23 +4163,36 @@ rrc_eNB_decode_dcch( rrcConnectionReconfigurationComplete. criticalExtensions.choice. rrcConnectionReconfigurationComplete_r8); - ue_context_p->ue_context.Status = RRC_RECONFIGURED; - LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED \n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + if (ue_context_p->ue_context.Status == RRC_RECONFIGURED){ + dedicated_DRB = 1; + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + }else { + ue_context_p->ue_context.Status = RRC_RECONFIGURED; + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (default DRB)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + } } - -#if defined(ENABLE_USE_MME) -# if defined(ENABLE_ITTI) - +#if defined(ENABLE_ITTI) +# if defined(ENABLE_USE_MME) if (EPC_MODE_ENABLED == 1) { - rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP( - ctxt_pP, - ue_context_p); + if (dedicated_DRB == 1){ + rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(ctxt_pP, + ue_context_p); + }else { + rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(ctxt_pP, + ue_context_p); + } + } +#else // establish a dedicated bearer + if (dedicated_DRB == 0 ) { + rrc_eNB_reconfigure_DRBs(ctxt_pP,ue_context_p); } - -# endif + #endif +#endif break; case UL_DCCH_MessageType__c1_PR_rrcConnectionReestablishmentComplete: @@ -4255,6 +4485,41 @@ rrc_eNB_decode_dcch( } #if defined(ENABLE_ITTI) +void rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* ue_context_pP){ + + int i; + + for (i = 0; + i < NB_RB_MAX; // S1AP_MAX_E_RAB + i++) { + + if ( (ue_context_pP->ue_context.e_rab[i].status != E_RAB_STATUS_ESTABLISHED) || + (ue_context_pP->ue_context.e_rab[i].status != E_RAB_STATUS_DONE) ){ + LOG_I(RRC,"setting up the dedicated DRBs %d \n", i); + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_pP->ue_context.e_rab[i].param.e_rab_id = i; + ue_context_pP->ue_context.e_rab[i].param.qos.qci = i % 9; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level= i % PRIORITY_LEVEL_LOWEST; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.pre_emp_capability= PRE_EMPTION_CAPABILITY_DISABLED; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.pre_emp_vulnerability= PRE_EMPTION_VULNERABILITY_DISABLED; + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL; + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length = 0; + // memset (ue_context_pP->ue_context.e_rab[i].param.sgw_addr.buffer,0,20); + ue_context_pP->ue_context.e_rab[i].param.sgw_addr.length = 0; + ue_context_pP->ue_context.e_rab[i].param.gtp_teid=0; + + ue_context_pP->ue_context.nb_of_e_rabs++; + } + + ue_context_pP->ue_context.setup_e_rabs+=ue_context_pP->ue_context.nb_of_e_rabs; + + } + + rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(ctxt_pP, ue_context_pP, 0); +} + + //----------------------------------------------------------------------------- void* rrc_enb_task( @@ -4350,7 +4615,12 @@ rrc_enb_task( case S1AP_PAGING_IND: LOG_E(RRC, "[eNB %d] Received not yet implemented message %s\n", instance, msg_name_p); break; - + + case S1AP_E_RAB_SETUP_REQ: + rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(msg_p, msg_name_p, instance); + LOG_D(RRC, "[eNB %d] Received the message %s\n", instance, msg_name_p); + break; + case S1AP_UE_CONTEXT_RELEASE_REQ: rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_REQ(msg_p, msg_name_p, instance); break; diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 5c41658862..da5c749b11 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -474,8 +474,10 @@ rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP( S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab]; S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab]; S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length = 4; + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; } else { e_rabs_failed++; + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED; S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs_failed[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; // TODO add cause when it will be integrated } @@ -842,6 +844,93 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( return (0); } } +int rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) +{ + uint16_t ue_initial_id; + uint32_t eNB_ue_s1ap_id; + MessageDef *message_gtpv1u_p = NULL; + gtpv1u_enb_create_tunnel_req_t create_tunnel_req; + gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp; + + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + protocol_ctxt_t ctxt; + ue_initial_id = S1AP_E_RAB_SETUP_REQ (msg_p).ue_initial_id; + eNB_ue_s1ap_id = S1AP_E_RAB_SETUP_REQ (msg_p).eNB_ue_s1ap_id; + ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, ue_initial_id, eNB_ue_s1ap_id); + LOG_I(RRC, "[eNB %d] Received %s: ue_initial_id %d, eNB_ue_s1ap_id %d, nb_of_e_rabs %d\n", + instance, msg_name, ue_initial_id, eNB_ue_s1ap_id, S1AP_E_RAB_SETUP_REQ (msg_p).nb_e_rabs_tosetup); + + if (ue_context_p == NULL) { + /* Can not associate this message to an UE index, send a failure to S1AP and discard it! */ + MessageDef *msg_fail_p = NULL; + + LOG_W(RRC, "[eNB %d] In S1AP_E_RAB_SETUP_REQ: unknown UE from S1AP ids (%d, %d)\n", instance, ue_initial_id, eNB_ue_s1ap_id); + + msg_fail_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_SETUP_REQUEST_FAIL); + S1AP_E_RAB_SETUP_REQ (msg_fail_p).eNB_ue_s1ap_id = eNB_ue_s1ap_id; + + // TODO add failure cause when defined! + + itti_send_msg_to_task (TASK_S1AP, instance, msg_fail_p); + return (-1); + } else { + + PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); + ue_context_p->ue_context.eNB_ue_s1ap_id = S1AP_E_RAB_SETUP_REQ (msg_p).eNB_ue_s1ap_id; + + /* Save e RAB information for later */ + { + int i; + + memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); + uint8_t nb_e_rabs_tosetup = S1AP_E_RAB_SETUP_REQ (msg_p).nb_e_rabs_tosetup; + + // keep the previous bearer + for (i = ue_context_p->ue_context.setup_e_rabs; + i < ue_context_p->ue_context.setup_e_rabs + nb_e_rabs_tosetup; + i++) { + if (ue_context_p->ue_context.e_rab[i].status == E_RAB_STATUS_DONE) + LOG_W(RRC,"E-RAB already configured, reconfiguring\n"); + ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.e_rab[i].param = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i]; + + + create_tunnel_req.eps_bearer_id[i] = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].e_rab_id; + create_tunnel_req.sgw_S1u_teid[i] = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].gtp_teid; + + memcpy(&create_tunnel_req.sgw_addr[i], + & S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].sgw_addr, + sizeof(transport_layer_addr_t)); + + } + ue_context_p->ue_context.nb_of_e_rabs=nb_e_rabs_tosetup; + ue_context_p->ue_context.setup_e_rabs+=nb_e_rabs_tosetup; + + create_tunnel_req.rnti = ue_context_p->ue_context.rnti; // warning put zero above + create_tunnel_req.num_tunnels = i; + + // NN: not sure if we should create a new tunnel: need to check teid, etc. + gtpv1u_create_s1u_tunnel( + instance, + &create_tunnel_req, + &create_tunnel_resp); + + rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( + &ctxt, + &create_tunnel_resp); + + } + + /* TODO parameters yet to process ... */ + { + // S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).ue_ambr; + } + + rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(&ctxt, ue_context_p, 0); + + return (0); + } +} /*------------------------------------------------------------------------------*/ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) @@ -884,7 +973,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); ue_context_p->ue_context.nb_of_e_rabs = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_e_rabs; - + for (i = 0; i < ue_context_p->ue_context.nb_of_e_rabs; i++) { ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; ue_context_p->ue_context.e_rab[i].param = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i]; @@ -897,6 +986,8 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char &S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i].sgw_addr, sizeof(transport_layer_addr_t)); } + + ue_context_p->ue_context.setup_e_rabs =ue_context_p->ue_context.nb_of_e_rabs; create_tunnel_req.rnti = ue_context_p->ue_context.rnti; // warning put zero above create_tunnel_req.num_tunnels = i; @@ -1217,6 +1308,52 @@ int rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_COMMAND (MessageDef *msg_p, const ch } } +rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP){ + + MessageDef *msg_p = NULL; + int e_rab; + int e_rabs_done = 0; + int e_rabs_failed = 0; + + msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_SETUP_RESP); + S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; + + for (e_rab = ue_context_pP->ue_context.setup_e_rabs - ue_context_pP->ue_context.nb_of_e_rabs; + e_rab < ue_context_pP->ue_context.setup_e_rabs; e_rab++) { + if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) { + e_rabs_done++; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; + // TODO add other information from S1-U when it will be integrated + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab]; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab]; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length = 4; + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; + } else { + e_rabs_failed++; + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs_failed[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; + // TODO add cause when it will be integrated + } + } + + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_S1AP_ENB, + (const char *)&S1AP_E_RAB_SETUP_RESP (msg_p), + sizeof(s1ap_e_rab_setup_resp_t), + MSC_AS_TIME_FMT" E_RAB_SETUP_RESP UE %X eNB_ue_s1ap_id %u e_rabs:%u succ %u fail", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_id_rnti, + S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id, + e_rabs_done, e_rabs_failed); + + + S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs = e_rabs_done; + S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs_failed = e_rabs_failed; + + itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); +} # endif /* defined(ENABLE_ITTI) */ #endif /* defined(ENABLE_USE_MME) */ diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index c880c3f3b4..0b1eee094d 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -328,6 +328,12 @@ void *s1ap_eNB_task(void *arg) } break; + case S1AP_E_RAB_SETUP_RESP: { + s1ap_eNB_e_rab_setup_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg), + &S1AP_E_RAB_SETUP_RESP(received_msg)); + } + break; + case S1AP_NAS_NON_DELIVERY_IND: { s1ap_eNB_nas_non_delivery_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg), &S1AP_NAS_NON_DELIVERY_IND(received_msg)); diff --git a/openair3/S1AP/s1ap_eNB_decoder.c b/openair3/S1AP/s1ap_eNB_decoder.c index f8230520ce..0c4a70a204 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.c +++ b/openair3/S1AP/s1ap_eNB_decoder.c @@ -120,6 +120,14 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message, break; + case S1ap_ProcedureCode_id_E_RABSetup: + ret = s1ap_decode_s1ap_e_rabsetuprequesties( + &message->msg.s1ap_E_RABSetupRequestIEs, &initiating_p->value); + s1ap_xer_print_s1ap_paging(s1ap_xer__print2sp, message_string, message); + //message_id = S1AP_E_RABSETUP_REQ_LOG; + S1AP_ERROR("TODO E_RABSetup initiating message\n"); + free(message_string); + break; default: S1AP_ERROR("Unknown procedure ID (%d) for initiating message\n", (int)initiating_p->procedureCode); diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index 6f0d4128c7..45cf8f4cea 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.c +++ b/openair3/S1AP/s1ap_eNB_handlers.c @@ -82,6 +82,13 @@ int s1ap_eNB_handle_ue_context_release_command(uint32_t assoc_id, uint32_t stream, struct s1ap_message_s *s1ap_message_p); + +static +int s1ap_eNB_handle_e_rab_setup_request(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p); + + /* Handlers matrix. Only eNB related procedure present here */ s1ap_message_decoded_callback messages_callback[][3] = { { 0, 0, 0 }, /* HandoverPreparation */ @@ -89,7 +96,7 @@ s1ap_message_decoded_callback messages_callback[][3] = { { 0, 0, 0 }, /* HandoverNotification */ { 0, 0, 0 }, /* PathSwitchRequest */ { 0, 0, 0 }, /* HandoverCancel */ - { 0, 0, 0 }, /* E_RABSetup */ + { s1ap_eNB_handle_e_rab_setup_request, 0, 0 }, /* E_RABSetup */ { 0, 0, 0 }, /* E_RABModify */ { 0, 0, 0 }, /* E_RABRelease */ { 0, 0, 0 }, /* E_RABReleaseIndication */ @@ -872,3 +879,107 @@ int s1ap_eNB_handle_ue_context_release_command(uint32_t assoc_id, } } +static +int s1ap_eNB_handle_e_rab_setup_request(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p) { + + int i; + + s1ap_eNB_mme_data_t *mme_desc_p = NULL; + s1ap_eNB_ue_context_t *ue_desc_p = NULL; + MessageDef *message_p = NULL; + + S1ap_E_RABSetupRequestIEs_t *s1ap_E_RABSetupRequest; + DevAssert(s1ap_message_p != NULL); + + s1ap_E_RABSetupRequest = &s1ap_message_p->msg.s1ap_E_RABSetupRequestIEs; + + if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) { + S1AP_ERROR("[SCTP %d] Received initial context setup request for non " + "existing MME context\n", assoc_id); + return -1; + } + + + if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, + s1ap_E_RABSetupRequest->eNB_UE_S1AP_ID)) == NULL) { + S1AP_ERROR("[SCTP %d] Received initial context setup request for non " + "existing UE context 0x%06x\n", assoc_id, + s1ap_E_RABSetupRequest->eNB_UE_S1AP_ID); + return -1; + } + + /* Initial context request = UE-related procedure -> stream != 0 */ + if (stream == 0) { + S1AP_ERROR("[SCTP %d] Received UE-related procedure on stream (%d)\n", + assoc_id, stream); + return -1; + } + + ue_desc_p->rx_stream = stream; + + if ( ue_desc_p->mme_ue_s1ap_id != s1ap_E_RABSetupRequest->mme_ue_s1ap_id){ + S1AP_WARN("UE context mme_ue_s1ap_id is different form that of the message (%d != %d)", + ue_desc_p->mme_ue_s1ap_id, s1ap_E_RABSetupRequest->mme_ue_s1ap_id); + + } + message_p = itti_alloc_new_message(TASK_S1AP, S1AP_E_RAB_SETUP_REQ); + + S1AP_E_RAB_SETUP_REQ(message_p).ue_initial_id = ue_desc_p->ue_initial_id; + + S1AP_E_RAB_SETUP_REQ(message_p).mme_ue_s1ap_id = s1ap_E_RABSetupRequest->mme_ue_s1ap_id; + S1AP_E_RAB_SETUP_REQ(message_p).eNB_ue_s1ap_id = s1ap_E_RABSetupRequest->eNB_UE_S1AP_ID; + + S1AP_E_RAB_SETUP_REQ(message_p).nb_e_rabs_tosetup = + s1ap_E_RABSetupRequest->e_RABToBeSetupListBearerSUReq.s1ap_E_RABToBeSetupItemBearerSUReq.count; + + for (i = 0; i < s1ap_E_RABSetupRequest->e_RABToBeSetupListBearerSUReq.s1ap_E_RABToBeSetupItemBearerSUReq.count; i++) { + S1ap_E_RABToBeSetupItemBearerSUReq_t *item_p; + + item_p = (S1ap_E_RABToBeSetupItemBearerSUReq_t *)s1ap_E_RABSetupRequest->e_RABToBeSetupListBearerSUReq.s1ap_E_RABToBeSetupItemBearerSUReq.array[i]; + + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].e_rab_id = item_p->e_RAB_ID; + + // check for the NAS PDU + if (item_p->nAS_PDU.size > 0 ) { + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.length = item_p->nAS_PDU.size; + + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer = malloc(sizeof(uint8_t) * item_p->nAS_PDU.size); + + memcpy(S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer, + item_p->nAS_PDU.buf, item_p->nAS_PDU.size); + } else { + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.length = 0; + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer = NULL; + + S1AP_WARN("NAS PDU is not provided, generate a E_RAB_SETUP Failure (TBD) back to MME \n"); + return -1; + } + + /* Set the transport layer address */ + memcpy(S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.buffer, + item_p->transportLayerAddress.buf, item_p->transportLayerAddress.size); + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.length = + item_p->transportLayerAddress.size * 8 - item_p->transportLayerAddress.bits_unused; + + /* GTP tunnel endpoint ID */ + OCTET_STRING_TO_INT32(&item_p->gTP_TEID, S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].gtp_teid); + + /* Set the QOS informations */ + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].qos.qci = item_p->e_RABlevelQoSParameters.qCI; + + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].qos.allocation_retention_priority.priority_level = + item_p->e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel; + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].qos.allocation_retention_priority.pre_emp_capability = + item_p->e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability; + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].qos.allocation_retention_priority.pre_emp_vulnerability = + item_p->e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability; + } + + itti_send_msg_to_task(TASK_RRC_ENB, ue_desc_p->eNB_instance->instance, message_p); + + return 0; +} + + diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c index 0cd4c08cb1..e54a04f009 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c @@ -686,3 +686,94 @@ int s1ap_eNB_ue_capabilities(instance_t instance, return ret; } +//------------------------------------------------------------------------------ +int s1ap_eNB_e_rab_setup_resp(instance_t instance, + s1ap_e_rab_setup_resp_t *e_rab_setup_resp_p) +//------------------------------------------------------------------------------ +{ + s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL; + struct s1ap_eNB_ue_context_s *ue_context_p = NULL; + + S1ap_E_RABSetupResponseIEs_t *initial_ies_p = NULL; + + s1ap_message message; + + uint8_t *buffer = NULL; + uint32_t length; + int ret = -1; + int i; + + /* Retrieve the S1AP eNB instance associated with Mod_id */ + s1ap_eNB_instance_p = s1ap_eNB_get_instance(instance); + + DevAssert(e_rab_setup_resp_p != NULL); + DevAssert(s1ap_eNB_instance_p != NULL); + + if ((ue_context_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance_p, + e_rab_setup_resp_p->eNB_ue_s1ap_id)) == NULL) { + /* The context for this eNB ue s1ap id doesn't exist in the map of eNB UEs */ + S1AP_WARN("Failed to find ue context associated with eNB ue s1ap id: 0x%06x\n", + e_rab_setup_resp_p->eNB_ue_s1ap_id); + return -1; + } + + /* Uplink NAS transport can occur either during an s1ap connected state + * or during initial attach (for example: NAS authentication). + */ + if (!(ue_context_p->ue_state == S1AP_UE_CONNECTED || + ue_context_p->ue_state == S1AP_UE_WAITING_CSR)) { + S1AP_WARN("You are attempting to send NAS data over non-connected " + "eNB ue s1ap id: %06x, current state: %d\n", + e_rab_setup_resp_p->eNB_ue_s1ap_id, ue_context_p->ue_state); + return -1; + } + + /* Prepare the S1AP message to encode */ + memset(&message, 0, sizeof(s1ap_message)); + + message.direction = S1AP_PDU_PR_successfulOutcome; + message.procedureCode = S1ap_ProcedureCode_id_E_RABSetup; + + initial_ies_p = &message.msg.s1ap_E_RABSetupResponseIEs; + + initial_ies_p->eNB_UE_S1AP_ID = e_rab_setup_resp_p->eNB_ue_s1ap_id; + initial_ies_p->mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id; + + for (i = 0; i < e_rab_setup_resp_p->nb_of_e_rabs; i++) { + S1ap_E_RABSetupItemBearerSURes_t *new_item; + + new_item = calloc(1, sizeof(S1ap_E_RABSetupItemBearerSURes_t)); + + new_item->e_RAB_ID = e_rab_setup_resp_p->e_rabs[i].e_rab_id; + GTP_TEID_TO_ASN1(e_rab_setup_resp_p->e_rabs[i].gtp_teid, &new_item->gTP_TEID); + new_item->transportLayerAddress.buf = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer; + new_item->transportLayerAddress.size = e_rab_setup_resp_p->e_rabs[i].eNB_addr.length; + new_item->transportLayerAddress.bits_unused = 0; + + ASN_SEQUENCE_ADD(&initial_ies_p->e_RABSetupListBearerSURes.s1ap_E_RABSetupItemBearerSURes, + new_item); + } + + if (s1ap_eNB_encode_pdu(&message, &buffer, &length) < 0) { + S1AP_ERROR("Failed to encode uplink NAS transport\n"); + /* Encode procedure has failed... */ + return -1; + } + + MSC_LOG_TX_MESSAGE( + MSC_S1AP_ENB, + MSC_S1AP_MME, + (const char *)buffer, + length, + MSC_AS_TIME_FMT" E_RAN Setup successfulOutcome eNB_ue_s1ap_id %u mme_ue_s1ap_id %u", + 0,0,//MSC_AS_TIME_ARGS(ctxt_pP), + initial_ies_p->eNB_UE_S1AP_ID, + initial_ies_p->mme_ue_s1ap_id); + + /* UE associated signalling -> use the allocated stream */ + s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, + ue_context_p->mme_ref->assoc_id, buffer, + length, ue_context_p->tx_stream); + + return ret; +} From 8c9c7833f931f9c8e47b408bc27d54134aff72da Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Mon, 9 Nov 2015 15:12:49 +0100 Subject: [PATCH 002/340] Few fixes for dedicated DRBs --- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 8 ++-- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 4 +- openair2/LAYER2/RLC/rlc_rrc.c | 2 +- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 2 +- openair2/RRC/LITE/rrc_eNB.c | 57 ++++++++++++++--------- 5 files changed, 42 insertions(+), 31 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index 412f7cbae9..b483297aca 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -53,10 +53,10 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) if (rssi>0) rx_power_fil_dB = rssi; else rx_power_fil_dB = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]; - printf("Gain control: rssi %d (%d,%d)\n", - rssi, - phy_vars_ue->PHY_measurements.rssi, - phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] + LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n", + rssi, + phy_vars_ue->PHY_measurements.rssi, + phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] ); // Gain control with hysterisis diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index f25e921570..3eb1ed83fc 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -906,7 +906,7 @@ pdcp_run ( RRC_DCCH_DATA_REQ (msg_p).frame, 0, RRC_DCCH_DATA_REQ (msg_p).eNB_index); - LOG_D(PDCP, PROTOCOL_CTXT_FMT"Received %s from %s: instance %d, rb_id %d, muiP %d, confirmP %d, mode %d\n", + LOG_I(PDCP, PROTOCOL_CTXT_FMT"Received %s from %s: instance %d, rb_id %d, muiP %d, confirmP %d, mode %d\n", PROTOCOL_CTXT_ARGS(&ctxt), msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), @@ -1427,7 +1427,7 @@ pdcp_config_req_asn1 ( pdcp_pP->first_missing_pdu = -1; pdcp_pP->rx_hfn_offset = 0; - LOG_D(PDCP, PROTOCOL_PDCP_CTXT_FMT" Action ADD LCID %d (rb id %d) " + LOG_I(PDCP, PROTOCOL_PDCP_CTXT_FMT" Action ADD LCID %d (rb id %d) " "configured with SN size %d bits and RLC %s\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP), lc_idP, diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index 05ad79d7d4..64112d2e8f 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -229,7 +229,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP drb_id = drb_toaddmod_p->drb_Identity; lc_id = drb_id + 2; - LOG_D(RLC, "Adding DRB %d, lc_id %d\n",drb_id,lc_id); + LOG_I(RLC, "Adding DRB %d, lc_id %d\n",drb_id,lc_id); if (drb_toaddmod_p->rlc_Config) { diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 110dc6442d..2aa2921ec5 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -2015,7 +2015,7 @@ do_RRCConnectionReconfiguration( (void*)&dl_dcch_msg, buffer, RRC_BUF_SIZE); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %l)!\n", enc_rval.failed_type->name, enc_rval.encoded); #ifdef XER_PRINT diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index db70e4daf5..a33cdf18de 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1078,7 +1078,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co struct LogicalChannelConfig *DRB_lchan_config = NULL; struct LogicalChannelConfig__ul_SpecificParameters *DRB_ul_SpecificParameters = NULL; - DRB_ToAddModList_t** DRB_configList; + DRB_ToAddModList_t** DRB_configList=&ue_context_pP->ue_context.DRB_configList; //DRB_ToAddModList_t** RRC_DRB_configList=&ue_context_pP->ue_context.DRB_configList; struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; @@ -1109,6 +1109,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); *(DRB_config->logicalChannelIdentity) = (long) (ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 2); // value : x+2 + DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config)); DRB_config->rlc_Config = DRB_rlc_config; @@ -1129,6 +1130,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_rlc_config->present = RLC_Config_PR_um_Bi_Directional; DRB_rlc_config->choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = SN_FieldLength_size10; DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.sn_FieldLength = SN_FieldLength_size10; + DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = T_Reordering_ms35; // PDCP PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM)); DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; @@ -1171,9 +1173,8 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_ul_SpecificParameters->bucketSizeDuration = LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; - // LCG for DTCH can take the value from 1 to 3 as defined in 36331: normally controlled by upper layers (like RRM) logicalchannelgroup_drb = CALLOC(1, sizeof(long)); - *logicalchannelgroup_drb = 1; + *logicalchannelgroup_drb = (i+1) % 3; DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); @@ -1801,6 +1802,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons /* TODO should test if e RAB are Ok before! */ ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; + LOG_D(RRC, "setting the status for the default DRB (index %d) to (%d,%s)\n", + i, ue_context_pP->ue_context.e_rab[i].status, "E_RAB_STATUS_DONE"); } /* If list is empty free the list and reset the address */ @@ -4188,6 +4191,7 @@ rrc_eNB_decode_dcch( } #else // establish a dedicated bearer if (dedicated_DRB == 0 ) { + // ue_context_p->ue_context.e_rab[0].status = E_RAB_STATUS_ESTABLISHED; rrc_eNB_reconfigure_DRBs(ctxt_pP,ue_context_p); } @@ -4402,7 +4406,14 @@ rrc_eNB_decode_dcch( ue_context_p, ul_dcch_msg); } - +#else + ue_context_p->ue_context.nb_of_e_rabs = 1; + for (i = 0; i < ue_context_p->ue_context.nb_of_e_rabs; i++){ + ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.e_rab[i].param.e_rab_id = 1+i; + ue_context_p->ue_context.e_rab[i].param.qos.qci=9; + } + ue_context_p->ue_context.setup_e_rabs =ue_context_p->ue_context.nb_of_e_rabs; #endif rrc_eNB_generate_defaultRRCConnectionReconfiguration(ctxt_pP, @@ -4491,29 +4502,29 @@ void rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP, int i; for (i = 0; - i < NB_RB_MAX; // S1AP_MAX_E_RAB + i < NB_RB_MAX - 3; // S1AP_MAX_E_RAB i++) { - if ( (ue_context_pP->ue_context.e_rab[i].status != E_RAB_STATUS_ESTABLISHED) || - (ue_context_pP->ue_context.e_rab[i].status != E_RAB_STATUS_DONE) ){ - LOG_I(RRC,"setting up the dedicated DRBs %d \n", i); - ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; - ue_context_pP->ue_context.e_rab[i].param.e_rab_id = i; - ue_context_pP->ue_context.e_rab[i].param.qos.qci = i % 9; - ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level= i % PRIORITY_LEVEL_LOWEST; - ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.pre_emp_capability= PRE_EMPTION_CAPABILITY_DISABLED; - ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.pre_emp_vulnerability= PRE_EMPTION_VULNERABILITY_DISABLED; - ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL; - ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length = 0; - // memset (ue_context_pP->ue_context.e_rab[i].param.sgw_addr.buffer,0,20); - ue_context_pP->ue_context.e_rab[i].param.sgw_addr.length = 0; - ue_context_pP->ue_context.e_rab[i].param.gtp_teid=0; - - ue_context_pP->ue_context.nb_of_e_rabs++; - } + if ( ue_context_pP->ue_context.e_rab[i].status < E_RAB_STATUS_DONE){ + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_pP->ue_context.e_rab[i].param.e_rab_id = i + 1; + ue_context_pP->ue_context.e_rab[i].param.qos.qci = i % 9; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level= i % PRIORITY_LEVEL_LOWEST; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.pre_emp_capability= PRE_EMPTION_CAPABILITY_DISABLED; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.pre_emp_vulnerability= PRE_EMPTION_VULNERABILITY_DISABLED; + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL; + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length = 0; + // memset (ue_context_pP->ue_context.e_rab[i].param.sgw_addr.buffer,0,20); + ue_context_pP->ue_context.e_rab[i].param.sgw_addr.length = 0; + ue_context_pP->ue_context.e_rab[i].param.gtp_teid=0; + + ue_context_pP->ue_context.nb_of_e_rabs++; + + LOG_I(RRC,"setting up the dedicated DRBs %d (index %d) status %d \n", + ue_context_pP->ue_context.e_rab[i].param.e_rab_id, i, ue_context_pP->ue_context.e_rab[i].status); + } ue_context_pP->ue_context.setup_e_rabs+=ue_context_pP->ue_context.nb_of_e_rabs; - } rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(ctxt_pP, ue_context_pP, 0); From 9ff6bb7a5d576d5d38928f8080a497a6b33434c6 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Thu, 19 Nov 2015 16:58:27 +0100 Subject: [PATCH 003/340] Protocol implementation for dedicated E-RABSetup. Test of dedicated bearer setup in both control and data plane. --- cmake_targets/CMakeLists.txt | 4 +- openair2/COMMON/s1ap_messages_def.h | 2 + openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 8 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 2 +- openair2/RRC/LITE/rrc_eNB.c | 40 +-- openair2/RRC/LITE/rrc_eNB_GTPV1U.c | 17 +- openair2/RRC/LITE/rrc_eNB_S1AP.c | 229 ++++++++++-------- openair3/S1AP/s1ap_common.c | 5 +- openair3/S1AP/s1ap_eNB.c | 9 + .../s1ap_eNB_context_management_procedures.c | 9 +- openair3/S1AP/s1ap_eNB_decoder.c | 25 +- openair3/S1AP/s1ap_eNB_encoder.c | 49 +++- openair3/S1AP/s1ap_eNB_handlers.c | 10 +- openair3/S1AP/s1ap_eNB_nas_procedures.c | 83 ++++++- 14 files changed, 340 insertions(+), 152 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 17d921d4d9..41186dc72b 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -42,6 +42,8 @@ set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}) project (OpenAirInterface) +#add_definitions("-DEMIT_ASN_DEBUG=1") + ########################################### # macros to define options as there is numerous options in oai ################################################ @@ -196,7 +198,7 @@ add_definitions("-DPACKAGE_BUGREPORT=\"OpenAirInterface web site\"") add_boolean_option(MSG_PRINT False "print debug messages") add_boolean_option(DISABLE_XER_PRINT False "print XER Format") add_boolean_option(XER_PRINT False "print XER Format") -add_boolean_option(RRC_MSG_PRINT False "print RRC messages") +add_boolean_option(RRC_MSG_PRINT Flase "print RRC messages") add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log") add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace diff --git a/openair2/COMMON/s1ap_messages_def.h b/openair2/COMMON/s1ap_messages_def.h index b9f7a0d02f..e2012a91c5 100644 --- a/openair2/COMMON/s1ap_messages_def.h +++ b/openair2/COMMON/s1ap_messages_def.h @@ -39,6 +39,8 @@ MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_REQ_LOG, MESSAGE_PRIORITY_MED, IttiMsgText MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMMAND_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_command_log) MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMPLETE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_complete_log) MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_log) +MESSAGE_DEF(S1AP_E_RAB_SETUP_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_setup_request_log) +MESSAGE_DEF(S1AP_E_RAB_SETUP_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_setup_response_log) /* eNB application layer -> S1AP messages */ MESSAGE_DEF(S1AP_REGISTER_ENB_REQ , MESSAGE_PRIORITY_MED, s1ap_register_enb_req_t , s1ap_register_enb_req) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index ca08f07695..1d36c93470 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -1104,12 +1104,12 @@ schedule_ue_spec( post_padding); //#ifdef DEBUG_eNB_SCHEDULER - if (ta_update) { + // if (ta_update) { LOG_I(MAC, - "[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n", - module_idP,frameP, UE_id, CC_id, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset, + "[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d LCID %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n", + module_idP,frameP, UE_id, CC_id, sdu_lcids[0], sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset, ta_update,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch); - } + // } //#endif #ifdef DEBUG_eNB_SCHEDULER diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 6bfb598db5..0e30bfb535 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -309,7 +309,7 @@ void rx_sdu(const module_id_t enb_mod_idP, } /* UE_id != -1 */ } else if ((rx_lcids[i] < NB_RB_MAX) && (rx_lcids[i] > DCCH1 )) { - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH%d, received %d bytes form UE %d \n", + LOG_I(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH%d, received %d bytes form UE %d \n", enb_mod_idP,CC_idP,frameP, rx_lcids[i], rx_lengths[i], UE_id); #if defined(ENABLE_MAC_PAYLOAD_DEBUG) diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index a33cdf18de..bff756a25b 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1085,30 +1085,33 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DedicatedInfoNAS_t *dedicatedInfoNas = NULL; long *logicalchannelgroup, *logicalchannelgroup_drb; - int drb_Identity_index; + int drb_identity_index=0; // Configure DRB //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); + dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); for ( i = 0 ; - i < ue_context_pP->ue_context.nb_of_e_rabs; + i < ue_context_pP->ue_context.setup_e_rabs ; i++){ + // bypass the already configured erabs - if (ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_DONE) { - //drb_identiy_index++; + if (ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_ESTABLISHED) { + drb_identity_index++; continue; } + DRB_config = CALLOC(1, sizeof(*DRB_config)); DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long)); - *(DRB_config->eps_BearerIdentity) = 5L; + *(DRB_config->eps_BearerIdentity) = ue_context_pP->ue_context.e_rab[i].param.e_rab_id; - DRB_config->drb_Identity = (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + DRB_config->drb_Identity = 1 + drb_identity_index;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; // 1 + drb_identiy_index; DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); - *(DRB_config->logicalChannelIdentity) = (long) (ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 2); // value : x+2 + *(DRB_config->logicalChannelIdentity) = DRB_config->drb_Identity + 2; //(long) (ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 2); // value : x+2 DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config)); DRB_config->rlc_Config = DRB_rlc_config; @@ -1174,13 +1177,20 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; logicalchannelgroup_drb = CALLOC(1, sizeof(long)); - *logicalchannelgroup_drb = (i+1) % 3; + *logicalchannelgroup_drb = 1;//(i+1) % 3; DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; - - ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); - -#if defined(ENABLE_ITTI) + ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); + + LOG_I(RRC,"EPS ID %d, DRB ID %d (index %d), QCI %d, priority %d, LCID %d LCGID %d \n", + *DRB_config->eps_BearerIdentity, + DRB_config->drb_Identity, i, + ue_context_pP->ue_context.e_rab[i].param.qos.qci, + DRB_ul_SpecificParameters->priority, + *(DRB_config->logicalChannelIdentity), + DRB_ul_SpecificParameters->logicalChannelGroup + ); + if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); @@ -1188,7 +1198,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); - } + } /* TODO parameters yet to process ... */ { // ue_context_pP->ue_context.e_rab[i].param.qos; @@ -1201,7 +1211,6 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co free(dedicatedInfoNASList); dedicatedInfoNASList = NULL; } -#endif ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; @@ -1788,7 +1797,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); - OCTET_STRING_fromBuf(dedicatedInfoNas, (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, + OCTET_STRING_fromBuf(dedicatedInfoNas, + (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); } diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c index b85933ad47..85544c9833 100755 --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c @@ -68,14 +68,19 @@ rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( ctxt_pP->rnti); for (i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) { - LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP tunnel %u bearer index %u id %u\n", + + ue_context_p->ue_context.enb_gtp_teid[i+ue_context_p->ue_context.setup_e_rabs] = create_tunnel_resp_pP->enb_S1u_teid[i]; + ue_context_p->ue_context.enb_gtp_addrs[i+ue_context_p->ue_context.setup_e_rabs] = create_tunnel_resp_pP->enb_addr; + ue_context_p->ue_context.enb_gtp_ebi[i+ue_context_p->ue_context.setup_e_rabs] = create_tunnel_resp_pP->eps_bearer_id[i]; + + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP tunnel (%u, %u) bearer UE context index %u, msg index %u, id %u, gtp addr len %d \n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), create_tunnel_resp_pP->enb_S1u_teid[i], - i, - create_tunnel_resp_pP->eps_bearer_id[i]); - ue_context_p->ue_context.enb_gtp_teid[i] = create_tunnel_resp_pP->enb_S1u_teid[i]; - ue_context_p->ue_context.enb_gtp_addrs[i] = create_tunnel_resp_pP->enb_addr; - ue_context_p->ue_context.enb_gtp_ebi[i] = create_tunnel_resp_pP->eps_bearer_id[i]; + ue_context_p->ue_context.enb_gtp_teid[i+ue_context_p->ue_context.setup_e_rabs], + i+ue_context_p->ue_context.setup_e_rabs, + i, + create_tunnel_resp_pP->eps_bearer_id[i], + create_tunnel_resp_pP->enb_addr.length); } MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index da5c749b11..23ec2d2b74 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -844,93 +844,6 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( return (0); } } -int rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) -{ - uint16_t ue_initial_id; - uint32_t eNB_ue_s1ap_id; - MessageDef *message_gtpv1u_p = NULL; - gtpv1u_enb_create_tunnel_req_t create_tunnel_req; - gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp; - - struct rrc_eNB_ue_context_s* ue_context_p = NULL; - protocol_ctxt_t ctxt; - ue_initial_id = S1AP_E_RAB_SETUP_REQ (msg_p).ue_initial_id; - eNB_ue_s1ap_id = S1AP_E_RAB_SETUP_REQ (msg_p).eNB_ue_s1ap_id; - ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, ue_initial_id, eNB_ue_s1ap_id); - LOG_I(RRC, "[eNB %d] Received %s: ue_initial_id %d, eNB_ue_s1ap_id %d, nb_of_e_rabs %d\n", - instance, msg_name, ue_initial_id, eNB_ue_s1ap_id, S1AP_E_RAB_SETUP_REQ (msg_p).nb_e_rabs_tosetup); - - if (ue_context_p == NULL) { - /* Can not associate this message to an UE index, send a failure to S1AP and discard it! */ - MessageDef *msg_fail_p = NULL; - - LOG_W(RRC, "[eNB %d] In S1AP_E_RAB_SETUP_REQ: unknown UE from S1AP ids (%d, %d)\n", instance, ue_initial_id, eNB_ue_s1ap_id); - - msg_fail_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_SETUP_REQUEST_FAIL); - S1AP_E_RAB_SETUP_REQ (msg_fail_p).eNB_ue_s1ap_id = eNB_ue_s1ap_id; - - // TODO add failure cause when defined! - - itti_send_msg_to_task (TASK_S1AP, instance, msg_fail_p); - return (-1); - } else { - - PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); - ue_context_p->ue_context.eNB_ue_s1ap_id = S1AP_E_RAB_SETUP_REQ (msg_p).eNB_ue_s1ap_id; - - /* Save e RAB information for later */ - { - int i; - - memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); - uint8_t nb_e_rabs_tosetup = S1AP_E_RAB_SETUP_REQ (msg_p).nb_e_rabs_tosetup; - - // keep the previous bearer - for (i = ue_context_p->ue_context.setup_e_rabs; - i < ue_context_p->ue_context.setup_e_rabs + nb_e_rabs_tosetup; - i++) { - if (ue_context_p->ue_context.e_rab[i].status == E_RAB_STATUS_DONE) - LOG_W(RRC,"E-RAB already configured, reconfiguring\n"); - ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; - ue_context_p->ue_context.e_rab[i].param = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i]; - - - create_tunnel_req.eps_bearer_id[i] = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].e_rab_id; - create_tunnel_req.sgw_S1u_teid[i] = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].gtp_teid; - - memcpy(&create_tunnel_req.sgw_addr[i], - & S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].sgw_addr, - sizeof(transport_layer_addr_t)); - - } - ue_context_p->ue_context.nb_of_e_rabs=nb_e_rabs_tosetup; - ue_context_p->ue_context.setup_e_rabs+=nb_e_rabs_tosetup; - - create_tunnel_req.rnti = ue_context_p->ue_context.rnti; // warning put zero above - create_tunnel_req.num_tunnels = i; - - // NN: not sure if we should create a new tunnel: need to check teid, etc. - gtpv1u_create_s1u_tunnel( - instance, - &create_tunnel_req, - &create_tunnel_resp); - - rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( - &ctxt, - &create_tunnel_resp); - - } - - /* TODO parameters yet to process ... */ - { - // S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).ue_ambr; - } - - rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(&ctxt, ue_context_p, 0); - - return (0); - } -} /*------------------------------------------------------------------------------*/ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) @@ -986,9 +899,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char &S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i].sgw_addr, sizeof(transport_layer_addr_t)); } - - ue_context_p->ue_context.setup_e_rabs =ue_context_p->ue_context.nb_of_e_rabs; - + create_tunnel_req.rnti = ue_context_p->ue_context.rnti; // warning put zero above create_tunnel_req.num_tunnels = i; @@ -999,7 +910,8 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( &ctxt, - &create_tunnel_resp); + &create_tunnel_resp); + ue_context_p->ue_context.setup_e_rabs =ue_context_p->ue_context.nb_of_e_rabs; } /* TODO parameters yet to process ... */ @@ -1308,6 +1220,101 @@ int rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_COMMAND (MessageDef *msg_p, const ch } } +int rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) +{ + uint16_t ue_initial_id; + uint32_t eNB_ue_s1ap_id; + MessageDef *message_gtpv1u_p = NULL; + gtpv1u_enb_create_tunnel_req_t create_tunnel_req; + gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp; + + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + protocol_ctxt_t ctxt; + ue_initial_id = S1AP_E_RAB_SETUP_REQ (msg_p).ue_initial_id; + eNB_ue_s1ap_id = S1AP_E_RAB_SETUP_REQ (msg_p).eNB_ue_s1ap_id; + ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, ue_initial_id, eNB_ue_s1ap_id); + LOG_I(RRC, "[eNB %d] Received %s: ue_initial_id %d, eNB_ue_s1ap_id %d, nb_of_e_rabs %d\n", + instance, msg_name, ue_initial_id, eNB_ue_s1ap_id, S1AP_E_RAB_SETUP_REQ (msg_p).nb_e_rabs_tosetup); + + if (ue_context_p == NULL) { + /* Can not associate this message to an UE index, send a failure to S1AP and discard it! */ + MessageDef *msg_fail_p = NULL; + + LOG_W(RRC, "[eNB %d] In S1AP_E_RAB_SETUP_REQ: unknown UE from S1AP ids (%d, %d)\n", instance, ue_initial_id, eNB_ue_s1ap_id); + + msg_fail_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_SETUP_REQUEST_FAIL); + S1AP_E_RAB_SETUP_REQ (msg_fail_p).eNB_ue_s1ap_id = eNB_ue_s1ap_id; + + // TODO add failure cause when defined! + + itti_send_msg_to_task (TASK_S1AP, instance, msg_fail_p); + return (-1); + } else { + + PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); + ue_context_p->ue_context.eNB_ue_s1ap_id = S1AP_E_RAB_SETUP_REQ (msg_p).eNB_ue_s1ap_id; + + /* Save e RAB information for later */ + { + int i; + + memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); + uint8_t nb_e_rabs_tosetup = S1AP_E_RAB_SETUP_REQ (msg_p).nb_e_rabs_tosetup; + + // keep the previous bearer + // the index for the rec + for (i = 0; + i < nb_e_rabs_tosetup; + i++) { + if (ue_context_p->ue_context.e_rab[i+ue_context_p->ue_context.setup_e_rabs].status == E_RAB_STATUS_DONE) + LOG_W(RRC,"E-RAB already configured, reconfiguring\n"); + ue_context_p->ue_context.e_rab[i+ue_context_p->ue_context.setup_e_rabs].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.e_rab[i+ue_context_p->ue_context.setup_e_rabs].param = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i]; + + + create_tunnel_req.eps_bearer_id[i] = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].e_rab_id; + create_tunnel_req.sgw_S1u_teid[i] = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].gtp_teid; + + memcpy(&create_tunnel_req.sgw_addr[i], + & S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i].sgw_addr, + sizeof(transport_layer_addr_t)); + + LOG_I(RRC,"E_RAB setup REQ: local index %d teid %u, eps id %d \n", + i+ue_context_p->ue_context.setup_e_rabs, + create_tunnel_req.sgw_S1u_teid[i], + create_tunnel_req.eps_bearer_id[i] ); + } + ue_context_p->ue_context.nb_of_e_rabs=nb_e_rabs_tosetup; + + + create_tunnel_req.rnti = ue_context_p->ue_context.rnti; // warning put zero above + create_tunnel_req.num_tunnels = i; + + // NN: not sure if we should create a new tunnel: need to check teid, etc. + gtpv1u_create_s1u_tunnel( + instance, + &create_tunnel_req, + &create_tunnel_resp); + + rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( + &ctxt, + &create_tunnel_resp); + + ue_context_p->ue_context.setup_e_rabs+=nb_e_rabs_tosetup; + + } + + /* TODO parameters yet to process ... */ + { + // S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).ue_ambr; + } + + rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(&ctxt, ue_context_p, 0); + + return (0); + } +} + rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP){ @@ -1315,28 +1322,48 @@ rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, int e_rab; int e_rabs_done = 0; int e_rabs_failed = 0; - + int established_e_rab_index=0; + msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_SETUP_RESP); S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; - for (e_rab = ue_context_pP->ue_context.setup_e_rabs - ue_context_pP->ue_context.nb_of_e_rabs; - e_rab < ue_context_pP->ue_context.setup_e_rabs; e_rab++) { - if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) { + established_e_rab_index=ue_context_pP->ue_context.setup_e_rabs - ue_context_pP->ue_context.nb_of_e_rabs; + + for (e_rab = 0; e_rab < ue_context_pP->ue_context.nb_of_e_rabs ; e_rab++) { + + + /* if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_ESTABLISHED) + continue; + else + */ + if (ue_context_pP->ue_context.e_rab[e_rab+established_e_rab_index].status == E_RAB_STATUS_DONE) { e_rabs_done++; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab+established_e_rab_index].param.e_rab_id; // TODO add other information from S1-U when it will be integrated - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab]; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab]; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length = 4; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab+established_e_rab_index]; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab+established_e_rab_index]; + //S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length += 4; ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; + + LOG_I (RRC,"enb_gtp_addr (msg index %d, local index %d, status %d): nb_of_e_rabs %d, e_rab_id %d, teid: %u, addr: %d.%d.%d.%d \n ", + e_rab,established_e_rab_index, ue_context_pP->ue_context.e_rab[e_rab+established_e_rab_index].status, + ue_context_pP->ue_context.nb_of_e_rabs, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].e_rab_id, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer[0], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer[1], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer[2], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer[3]); } else { e_rabs_failed++; ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs_failed[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs_failed[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab+established_e_rab_index].param.e_rab_id; // TODO add cause when it will be integrated } } - + + LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: nb_of_erabs %d, total e_rabs %d, index %d, \n", + ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, established_e_rab_index); MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, MSC_S1AP_ENB, diff --git a/openair3/S1AP/s1ap_common.c b/openair3/S1AP/s1ap_common.c index 055641d12e..dabde30b16 100644 --- a/openair3/S1AP/s1ap_common.c +++ b/openair3/S1AP/s1ap_common.c @@ -29,8 +29,9 @@ /*! \file s1ap_common.c * \brief s1ap procedures for both eNB and MME - * \author Sebastien ROUX - * \date 2012 + * \author Sebastien ROUX and Navid Nikaein + * \email navid.nikaein@eurecom.fr + * \date 2012-2015 * \version 0.1 */ diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index 0b1eee094d..8af891a2b6 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -26,6 +26,15 @@ Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. *******************************************************************************/ +/*! \file s1ap_eNB.c + * \brief S1AP eNB task + * \author S. Roux and Navid Nikaein + * \date 2010 - 2015 + * \email: navid.nikaein@eurecom.fr + * \version 1.0 + * @ingroup _s1ap + + */ #include #include diff --git a/openair3/S1AP/s1ap_eNB_context_management_procedures.c b/openair3/S1AP/s1ap_eNB_context_management_procedures.c index 801dfd8780..8bf5d0a313 100755 --- a/openair3/S1AP/s1ap_eNB_context_management_procedures.c +++ b/openair3/S1AP/s1ap_eNB_context_management_procedures.c @@ -26,7 +26,14 @@ Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. *******************************************************************************/ - +/*! \file s1ap_eNB_context_management_procedures.c + * \brief S1AP context management procedures + * \author S. Roux and Navid Nikaein + * \date 2010 - 2015 + * \email: navid.nikaein@eurecom.fr + * \version 1.0 + * @ingroup _s1ap + */ #include #include #include diff --git a/openair3/S1AP/s1ap_eNB_decoder.c b/openair3/S1AP/s1ap_eNB_decoder.c index 0c4a70a204..f212b08478 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.c +++ b/openair3/S1AP/s1ap_eNB_decoder.c @@ -29,8 +29,9 @@ /*! \file s1ap_eNB_decoder.c * \brief s1ap pdu decode procedures for eNB - * \author Sebastien ROUX - * \date 2013 + * \author Sebastien ROUX and Navid Nikaein + * \email navid.nikaein@eurecom.fr + * \date 2013 - 2015 * \version 0.1 */ @@ -123,11 +124,25 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message, case S1ap_ProcedureCode_id_E_RABSetup: ret = s1ap_decode_s1ap_e_rabsetuprequesties( &message->msg.s1ap_E_RABSetupRequestIEs, &initiating_p->value); - s1ap_xer_print_s1ap_paging(s1ap_xer__print2sp, message_string, message); - //message_id = S1AP_E_RABSETUP_REQ_LOG; - S1AP_ERROR("TODO E_RABSetup initiating message\n"); + s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); + message_id = S1AP_E_RAB_SETUP_REQUEST_LOG; + message_string_size = strlen(message_string); + message_p = itti_alloc_new_message_sized(TASK_S1AP, + message_id, + message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_e_rab_setup_request_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_e_rab_setup_request_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); free(message_string); + S1AP_INFO("E_RABSetup initiating message\n"); break; + case S1ap_ProcedureCode_id_E_RABRelease: + ret = s1ap_decode_s1ap_e_rabreleasecommandies(&message->msg.s1ap_E_RABReleaseCommandIEs, + &initiating_p->value); + s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); + S1AP_ERROR("TODO E_RABReleas initiating message\n"); + free(message_string); + default: S1AP_ERROR("Unknown procedure ID (%d) for initiating message\n", (int)initiating_p->procedureCode); diff --git a/openair3/S1AP/s1ap_eNB_encoder.c b/openair3/S1AP/s1ap_eNB_encoder.c index a93bdc68f2..58f7cc1753 100644 --- a/openair3/S1AP/s1ap_eNB_encoder.c +++ b/openair3/S1AP/s1ap_eNB_encoder.c @@ -29,8 +29,9 @@ /*! \file s1ap_eNB_encoder.c * \brief s1ap pdu encode procedures for eNB - * \author Sebastien ROUX - * \date 2013 + * \author Sebastien ROUX and Navid Nikaein + * \email navid.nikaein@eurecom.fr + * \date 2013 - 2015 * \version 0.1 */ @@ -38,6 +39,8 @@ #include #include +#include "assertions.h" + #include "conversions.h" #include "intertask_interface.h" @@ -100,6 +103,11 @@ int s1ap_eNB_encode_ue_context_release_request( uint8_t **buffer, uint32_t *length); +static inline +int s1ap_eNB_encode_e_rab_setup_response(S1ap_E_RABSetupResponseIEs_t *E_RABSetupResponseIEs, + uint8_t **buffer, + uint32_t *length); + int s1ap_eNB_encode_pdu(s1ap_message *message, uint8_t **buffer, uint32_t *len) { DevAssert(message != NULL); @@ -251,8 +259,21 @@ int s1ap_eNB_encode_successfull_outcome(s1ap_message *s1ap_message_p, free(message_string); break; + case S1ap_ProcedureCode_id_E_RABSetup: + + ret = s1ap_eNB_encode_e_rab_setup_response ( + &s1ap_message_p->msg.s1ap_E_RABSetupResponseIEs, buffer, len); + //s1ap_xer_print_s1ap_e_rabsetupresponse (s1ap_xer__print2sp, message_string, s1ap_message_p); + message_id = S1AP_E_RAB_SETUP_RESPONSE_LOG ; + message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_e_rab_setup_response_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_e_rab_setup_response_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); + free(message_string); + S1AP_INFO("E_RABSetup successful message\n"); + break; default: - S1AP_DEBUG("Unknown procedure ID (%d) for successfull outcome message\n", + S1AP_WARN("Unknown procedure ID (%d) for successfull outcome message\n", (int)s1ap_message_p->procedureCode); return ret; break; @@ -528,3 +549,25 @@ int s1ap_eNB_encode_ue_context_release_request( ue_context_release_request_p); } +static inline +int s1ap_eNB_encode_e_rab_setup_response(S1ap_E_RABSetupResponseIEs_t *s1ap_E_RABSetupResponseIEs, + uint8_t **buffer, + uint32_t *length) +{ + S1ap_E_RABSetupResponse_t e_rab_setup_response; + S1ap_E_RABSetupResponse_t *e_rab_setup_response_p = &e_rab_setup_response; + + memset((void *)e_rab_setup_response_p, 0, + sizeof(e_rab_setup_response)); + + if (s1ap_encode_s1ap_e_rabsetupresponseies (e_rab_setup_response_p, s1ap_E_RABSetupResponseIEs) < 0) { + return -1; + } + + return s1ap_generate_successfull_outcome(buffer, + length, + S1ap_ProcedureCode_id_E_RABSetup, + S1ap_Criticality_reject, + &asn_DEF_S1ap_E_RABSetupResponse, + e_rab_setup_response_p); +} diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index 45cf8f4cea..752e6513c3 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.c +++ b/openair3/S1AP/s1ap_eNB_handlers.c @@ -29,8 +29,9 @@ /*! \file s1ap_eNB_handlers.c * \brief s1ap messages handlers for eNB part - * \author Sebastien ROUX - * \date 2013 + * \author Sebastien ROUX and Navid Nikaein + * \email navid.nikaein@eurecom.fr + * \date 2013 - 2015 * \version 0.1 */ @@ -963,6 +964,11 @@ int s1ap_eNB_handle_e_rab_setup_request(uint32_t assoc_id, S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.length = item_p->transportLayerAddress.size * 8 - item_p->transportLayerAddress.bits_unused; + /* S1AP_INFO("sgw addr %s len: %d (size %d, index %d)\n", + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.buffer, + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.length, + item_p->transportLayerAddress.size, i); + */ /* GTP tunnel endpoint ID */ OCTET_STRING_TO_INT32(&item_p->gTP_TEID, S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].gtp_teid); diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c index e54a04f009..b8412e2089 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c @@ -26,7 +26,14 @@ Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. *******************************************************************************/ - +/*! \file s1ap_eNB_nas_procedures.c + * \brief S1AP eNb NAS procedure handler + * \author S. Roux and Navid Nikaein + * \date 2010 - 2015 + * \email: navid.nikaein@eurecom.fr + * \version 1.0 + * @ingroup _s1ap + */ #include #include #include @@ -579,6 +586,14 @@ int s1ap_eNB_initial_ctxt_resp( new_item->transportLayerAddress.size = initial_ctxt_resp_p->e_rabs[i].eNB_addr.length; new_item->transportLayerAddress.bits_unused = 0; + S1AP_DEBUG("initial_ctxt_resp_p: e_rab ID %d, enb_addr %d.%d.%d.%d, SIZE %d \n", + new_item->e_RAB_ID, + new_item->transportLayerAddress.buf[0], + new_item->transportLayerAddress.buf[1], + new_item->transportLayerAddress.buf[2], + new_item->transportLayerAddress.buf[3], + new_item->transportLayerAddress.size); + ASN_SEQUENCE_ADD(&initial_ies_p->e_RABSetupListCtxtSURes.s1ap_E_RABSetupItemCtxtSURes, new_item); } @@ -695,7 +710,7 @@ int s1ap_eNB_e_rab_setup_resp(instance_t instance, struct s1ap_eNB_ue_context_s *ue_context_p = NULL; S1ap_E_RABSetupResponseIEs_t *initial_ies_p = NULL; - + s1ap_message message; uint8_t *buffer = NULL; @@ -727,39 +742,85 @@ int s1ap_eNB_e_rab_setup_resp(instance_t instance, e_rab_setup_resp_p->eNB_ue_s1ap_id, ue_context_p->ue_state); return -1; } - + /* Prepare the S1AP message to encode */ memset(&message, 0, sizeof(s1ap_message)); message.direction = S1AP_PDU_PR_successfulOutcome; message.procedureCode = S1ap_ProcedureCode_id_E_RABSetup; + message.criticality = S1ap_Criticality_reject; initial_ies_p = &message.msg.s1ap_E_RABSetupResponseIEs; - + initial_ies_p->eNB_UE_S1AP_ID = e_rab_setup_resp_p->eNB_ue_s1ap_id; initial_ies_p->mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id; - - for (i = 0; i < e_rab_setup_resp_p->nb_of_e_rabs; i++) { + + if ( e_rab_setup_resp_p->nb_of_e_rabs >= 1 ) + initial_ies_p->presenceMask |= S1AP_E_RABSETUPRESPONSEIES_E_RABSETUPLISTBEARERSURES_PRESENT; + + for (i = 0; i < e_rab_setup_resp_p->nb_of_e_rabs; i++) { S1ap_E_RABSetupItemBearerSURes_t *new_item; new_item = calloc(1, sizeof(S1ap_E_RABSetupItemBearerSURes_t)); new_item->e_RAB_ID = e_rab_setup_resp_p->e_rabs[i].e_rab_id; GTP_TEID_TO_ASN1(e_rab_setup_resp_p->e_rabs[i].gtp_teid, &new_item->gTP_TEID); - new_item->transportLayerAddress.buf = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer; + + /* + new_item->transportLayerAddress.buf = MALLOC(e_rab_setup_resp_p->e_rabs[i].eNB_addr.length); + memcpy (new_item->transportLayerAddress.buf, + e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer, + e_rab_setup_resp_p->e_rabs[i].eNB_addr.length); + + */ + /* + new_item->transportLayerAddress.buf[0] = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer[0]; + new_item->transportLayerAddress.buf[1] = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer[1]; + new_item->transportLayerAddress.buf[2] = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer[2]; + new_item->transportLayerAddress.buf[3] = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer[3]; + */ + new_item->transportLayerAddress.buf = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer; new_item->transportLayerAddress.size = e_rab_setup_resp_p->e_rabs[i].eNB_addr.length; new_item->transportLayerAddress.bits_unused = 0; - + + S1AP_DEBUG("e_rab_setup_resp: e_rab ID %d, teid %u, enb_addr %d.%d.%d.%d, SIZE %d\n", + new_item->e_RAB_ID, + e_rab_setup_resp_p->e_rabs[i].gtp_teid, + new_item->transportLayerAddress.buf[0], + new_item->transportLayerAddress.buf[1], + new_item->transportLayerAddress.buf[2], + new_item->transportLayerAddress.buf[3], + new_item->transportLayerAddress.size); + + S1ap_IE_t *ie = s1ap_new_ie(S1ap_ProtocolIE_ID_id_E_RABSetupItemBearerSURes, + S1ap_Criticality_ignore, + &asn_DEF_S1ap_E_RABSetupItemBearerSURes, + new_item); + /* + S1ap_IE_t *ie = s1ap_new_ie(S1ap_ProtocolIE_ID_id_E_RABSetupListBearerSURes, + S1ap_Criticality_ignore, + &asn_DEF_S1ap_E_RABSetupListBearerSURes, + new_item); + */ ASN_SEQUENCE_ADD(&initial_ies_p->e_RABSetupListBearerSURes.s1ap_E_RABSetupItemBearerSURes, - new_item); + ie); } - + + /* S1ap_E_RABSetupListBearerSURes_t e_RABSetupListBearerSURes; + memset(&e_RABSetupListBearerSURes, 0, sizeof(S1ap_E_RABSetupListBearerSURes_t)); + if (s1ap_encode_s1ap_e_rabsetuplistbearersures(&e_RABSetupListBearerSURes, &initial_ies_p->e_RABSetupListBearerSURes.s1ap_E_RABSetupItemBearerSURes) < 0 ) + return -1; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1ap_E_RABSetupListBearerSURes, &e_RABSetupListBearerSURes); + */ + fprintf(stderr, "start encode\n"); if (s1ap_eNB_encode_pdu(&message, &buffer, &length) < 0) { - S1AP_ERROR("Failed to encode uplink NAS transport\n"); + S1AP_ERROR("Failed to encode uplink transport\n"); /* Encode procedure has failed... */ return -1; } + + MSC_LOG_TX_MESSAGE( MSC_S1AP_ENB, MSC_S1AP_MME, From 8ef25c89538cce49a4d8af1f99cc2f962417cbd5 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Wed, 25 Nov 2015 11:22:45 +0100 Subject: [PATCH 004/340] * improve the management of two simultaneous E_RAB_SETUP_REQ. --- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 2 +- openair2/RRC/LITE/defs.h | 1 + openair2/RRC/LITE/rrc_eNB.c | 61 +++++++++++++++------------- openair2/RRC/LITE/rrc_eNB_S1AP.c | 63 ++++++++++++++--------------- openair3/S1AP/s1ap_eNB.c | 1 - openair3/S1AP/s1ap_eNB_decoder.c | 4 +- 6 files changed, 69 insertions(+), 63 deletions(-) diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 3eb1ed83fc..c71b83ec2e 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -130,7 +130,7 @@ boolean_t pdcp_data_req( PROTOCOL_CTXT_ARGS(ctxt_pP), rb_idP); return FALSE; - } + } } if (sdu_buffer_sizeP == 0) { diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 1a4d6e0fe1..85d8e9cabe 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -303,6 +303,7 @@ typedef struct eNB_RRC_UE_s { #endif SRB_ToAddModList_t* SRB_configList; DRB_ToAddModList_t* DRB_configList; + DRB_ToAddModList_t* DRB_configList2[8]; uint8_t DRB_active[8]; struct PhysicalConfigDedicated* physicalConfigDedicated; struct SPS_Config* sps_Config; diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index bff756a25b..9a9b39ed0d 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1077,7 +1077,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co struct PDCP_Config__rlc_UM *PDCP_rlc_UM = NULL; struct LogicalChannelConfig *DRB_lchan_config = NULL; struct LogicalChannelConfig__ul_SpecificParameters - *DRB_ul_SpecificParameters = NULL; + *DRB_ul_SpecificParameters = NULL; DRB_ToAddModList_t** DRB_configList=&ue_context_pP->ue_context.DRB_configList; //DRB_ToAddModList_t** RRC_DRB_configList=&ue_context_pP->ue_context.DRB_configList; @@ -1085,8 +1085,8 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DedicatedInfoNAS_t *dedicatedInfoNas = NULL; long *logicalchannelgroup, *logicalchannelgroup_drb; - int drb_identity_index=0; - + int drb_identity_index=0, nas_sequence_flag = 0; + // Configure DRB //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); @@ -1097,7 +1097,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co i++){ // bypass the already configured erabs - if (ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_ESTABLISHED) { + if (ue_context_pP->ue_context.e_rab[i].status >= E_RAB_STATUS_DONE) { drb_identity_index++; continue; } @@ -1107,7 +1107,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long)); *(DRB_config->eps_BearerIdentity) = ue_context_pP->ue_context.e_rab[i].param.e_rab_id; - DRB_config->drb_Identity = 1 + drb_identity_index;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + DRB_config->drb_Identity = 1 + drb_identity_index ;// + i ;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; // 1 + drb_identiy_index; DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); @@ -1181,35 +1181,40 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); - + //ue_context_pP->ue_context.DRB_configList2[drb_identity_index] = &(*DRB_configList); + LOG_I(RRC,"EPS ID %d, DRB ID %d (index %d), QCI %d, priority %d, LCID %d LCGID %d \n", *DRB_config->eps_BearerIdentity, DRB_config->drb_Identity, i, ue_context_pP->ue_context.e_rab[i].param.qos.qci, DRB_ul_SpecificParameters->priority, *(DRB_config->logicalChannelIdentity), - DRB_ul_SpecificParameters->logicalChannelGroup + *DRB_ul_SpecificParameters->logicalChannelGroup ); - - if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { - dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); - memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); - OCTET_STRING_fromBuf(dedicatedInfoNas, - (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, - ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); - ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); - } - /* TODO parameters yet to process ... */ - { - // ue_context_pP->ue_context.e_rab[i].param.qos; - // ue_context_pP->ue_context.e_rab[i].param.sgw_addr; - // ue_context_pP->ue_context.e_rab[i].param.gtp_teid; - } - /* If list is empty free the list and reset the address */ - if (dedicatedInfoNASList->list.count == 0) { - free(dedicatedInfoNASList); - dedicatedInfoNASList = NULL; + //if (nas_sequence_flag == 0) + { + if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { + dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); + memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); + OCTET_STRING_fromBuf(dedicatedInfoNas, + (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); + ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); + // nas_sequence_flag = 1; + } + /* TODO parameters yet to process ... */ + { + // ue_context_pP->ue_context.e_rab[i].param.qos; + // ue_context_pP->ue_context.e_rab[i].param.sgw_addr; + // ue_context_pP->ue_context.e_rab[i].param.gtp_teid; + } + + /* If list is empty free the list and reset the address */ + if (dedicatedInfoNASList->list.count == 0) { + free(dedicatedInfoNASList); + dedicatedInfoNASList = NULL; + } } ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; @@ -1482,6 +1487,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); + //ue_context_pP->ue_context.DRB_configList2[0] = &(*DRB_configList); mac_MainConfig = CALLOC(1, sizeof(*mac_MainConfig)); ue_context_pP->ue_context.mac_MainConfig = mac_MainConfig; @@ -3238,7 +3244,8 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( rrc_pdcp_config_asn1_req( ctxt_pP, NULL, //LG-RK 14/05/2014 SRB_configList, - DRB_configList, (DRB_ToReleaseList_t *) NULL, + DRB_configList, + (DRB_ToReleaseList_t *) NULL, /*eNB_rrc_inst[ctxt_pP->module_id].ciphering_algorithm[ue_mod_idP] | (eNB_rrc_inst[ctxt_pP->module_id].integrity_algorithm[ue_mod_idP] << 4), */ diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 23ec2d2b74..76a10d948f 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -1322,48 +1322,46 @@ rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, int e_rab; int e_rabs_done = 0; int e_rabs_failed = 0; - int established_e_rab_index=0; - + msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_SETUP_RESP); S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; - - established_e_rab_index=ue_context_pP->ue_context.setup_e_rabs - ue_context_pP->ue_context.nb_of_e_rabs; - - for (e_rab = 0; e_rab < ue_context_pP->ue_context.nb_of_e_rabs ; e_rab++) { + + for (e_rab = 0; e_rab < ue_context_pP->ue_context.setup_e_rabs ; e_rab++) { - - /* if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_ESTABLISHED) - continue; - else - */ - if (ue_context_pP->ue_context.e_rab[e_rab+established_e_rab_index].status == E_RAB_STATUS_DONE) { - e_rabs_done++; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab+established_e_rab_index].param.e_rab_id; + + if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) { + + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; // TODO add other information from S1-U when it will be integrated - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab+established_e_rab_index]; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab+established_e_rab_index]; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab]; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab]; //S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length += 4; - ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; + ue_context_pP->ue_context.e_rab[e_rabs_done].status = E_RAB_STATUS_ESTABLISHED; - LOG_I (RRC,"enb_gtp_addr (msg index %d, local index %d, status %d): nb_of_e_rabs %d, e_rab_id %d, teid: %u, addr: %d.%d.%d.%d \n ", - e_rab,established_e_rab_index, ue_context_pP->ue_context.e_rab[e_rab+established_e_rab_index].status, + LOG_I (RRC,"enb_gtp_addr (msg index %d, context index %d, status %d): nb_of_e_rabs %d, e_rab_id %d, teid: %u, addr: %d.%d.%d.%d \n ", + e_rabs_done, e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, ue_context_pP->ue_context.nb_of_e_rabs, - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].e_rab_id, - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid, - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer[0], - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer[1], - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer[2], - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer[3]); - } else { + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].gtp_teid, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[0], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[1], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[2], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[3]); + + e_rabs_done++; + } else if ((ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_NEW) || + (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_ESTABLISHED)){ + LOG_D (RRC,"E-RAB is NEW or already ESTABLISHED\n"); + }else { + ue_context_pP->ue_context.e_rab[e_rabs_failed].status = E_RAB_STATUS_FAILED; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs_failed[e_rabs_failed].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; e_rabs_failed++; - ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs_failed[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab+established_e_rab_index].param.e_rab_id; // TODO add cause when it will be integrated } } - LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: nb_of_erabs %d, total e_rabs %d, index %d, \n", - ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, established_e_rab_index); + LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: nb_of_erabs %d, total e_rabs %d, index %d \n", + ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, e_rab); MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, MSC_S1AP_ENB, @@ -1378,8 +1376,9 @@ rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs = e_rabs_done; S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs_failed = e_rabs_failed; - - itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); + if ((e_rabs_done > 0) ) + itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); + } # endif /* defined(ENABLE_ITTI) */ diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index 8af891a2b6..9dd34b35c4 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -33,7 +33,6 @@ * \email: navid.nikaein@eurecom.fr * \version 1.0 * @ingroup _s1ap - */ #include diff --git a/openair3/S1AP/s1ap_eNB_decoder.c b/openair3/S1AP/s1ap_eNB_decoder.c index f212b08478..4a3689cec0 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.c +++ b/openair3/S1AP/s1ap_eNB_decoder.c @@ -124,7 +124,7 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message, case S1ap_ProcedureCode_id_E_RABSetup: ret = s1ap_decode_s1ap_e_rabsetuprequesties( &message->msg.s1ap_E_RABSetupRequestIEs, &initiating_p->value); - s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); + //s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); message_id = S1AP_E_RAB_SETUP_REQUEST_LOG; message_string_size = strlen(message_string); message_p = itti_alloc_new_message_sized(TASK_S1AP, @@ -139,7 +139,7 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message, case S1ap_ProcedureCode_id_E_RABRelease: ret = s1ap_decode_s1ap_e_rabreleasecommandies(&message->msg.s1ap_E_RABReleaseCommandIEs, &initiating_p->value); - s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); + //s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); S1AP_ERROR("TODO E_RABReleas initiating message\n"); free(message_string); From ba735d181f90a1d11011193145b38c7e90367acb Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Wed, 30 Mar 2016 09:45:40 +0200 Subject: [PATCH 005/340] improve the S1AP e_rab setup messages --- openair2/RRC/LITE/defs.h | 1 + openair2/RRC/LITE/rrc_eNB.c | 7 +- openair2/RRC/LITE/rrc_eNB_S1AP.c | 116 +++++++++++++++++-------------- openair2/RRC/LITE/rrc_eNB_S1AP.h | 19 +++++ 4 files changed, 88 insertions(+), 55 deletions(-) diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 85d8e9cabe..e90c55635d 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -228,6 +228,7 @@ typedef enum e_rab_satus_e { typedef struct e_rab_param_s { e_rab_t param; uint8_t status; + uint8_t xid; // transaction_id } __attribute__ ((__packed__)) e_rab_param_t; #endif diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 9a9b39ed0d..ada0ec1a05 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1218,6 +1218,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co } ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; + ue_context_pP->ue_context.e_rab[i].xid =rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, } @@ -1225,7 +1226,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co size = do_RRCConnectionReconfiguration(ctxt_pP, buffer, - rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), //Transaction_id, + ue_context_pP->ue_context.e_rab[i].xid, (SRB_ToAddModList_t*)NULL, (DRB_ToAddModList_t*)*DRB_configList, (DRB_ToReleaseList_t*)NULL, // DRB2_list, @@ -4183,6 +4184,7 @@ rrc_eNB_decode_dcch( rrcConnectionReconfigurationComplete. criticalExtensions.choice. rrcConnectionReconfigurationComplete_r8); + /*NN: revise the condition */ if (ue_context_p->ue_context.Status == RRC_RECONFIGURED){ dedicated_DRB = 1; LOG_I(RRC, @@ -4200,7 +4202,8 @@ rrc_eNB_decode_dcch( if (EPC_MODE_ENABLED == 1) { if (dedicated_DRB == 1){ rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(ctxt_pP, - ue_context_p); + ue_context_p, + ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); }else { rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(ctxt_pP, ue_context_p); diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 76a10d948f..e8ad798276 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -1,6 +1,6 @@ /******************************************************************************* OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom + Copyright(c) 1999 - 2016 Eurecom OpenAirInterface is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,8 +28,8 @@ *******************************************************************************/ /*! \file rrc_eNB_S1AP.c * \brief rrc S1AP procedures for eNB - * \author Laurent Winckel and Sebastien ROUX and Navid Nikaein and Lionel GAUTHIER - * \date 2013-2014 + * \author Laurent Winckel, Sebastien ROUX, Navid Nikaein and Lionel GAUTHIER + * \date 2013-2016 * \version 1.0 * \company Eurecom * \email: navid.nikaein@eurecom.fr @@ -1315,8 +1315,10 @@ int rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name } } -rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP){ +/*NN: careful about the typcast of xid (long -> uint8_t*/ +int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + uint8_t xid ){ MessageDef *msg_p = NULL; int e_rab; @@ -1327,58 +1329,66 @@ rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; for (e_rab = 0; e_rab < ue_context_pP->ue_context.setup_e_rabs ; e_rab++) { - - - if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) { - - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; - // TODO add other information from S1-U when it will be integrated - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab]; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab]; - //S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length += 4; - ue_context_pP->ue_context.e_rab[e_rabs_done].status = E_RAB_STATUS_ESTABLISHED; - - LOG_I (RRC,"enb_gtp_addr (msg index %d, context index %d, status %d): nb_of_e_rabs %d, e_rab_id %d, teid: %u, addr: %d.%d.%d.%d \n ", - e_rabs_done, e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, - ue_context_pP->ue_context.nb_of_e_rabs, - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id, - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].gtp_teid, - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[0], - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[1], - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[2], - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[3]); - e_rabs_done++; - } else if ((ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_NEW) || - (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_ESTABLISHED)){ - LOG_D (RRC,"E-RAB is NEW or already ESTABLISHED\n"); - }else { - ue_context_pP->ue_context.e_rab[e_rabs_failed].status = E_RAB_STATUS_FAILED; - S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs_failed[e_rabs_failed].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; - e_rabs_failed++; - // TODO add cause when it will be integrated + /* only respond to the corresponding transaction */ + if (xid == ue_context_pP->ue_context.e_rab[e_rab].xid) { + + if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) { + + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; + // TODO add other information from S1-U when it will be integrated + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab]; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab]; + //S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length += 4; + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; + + LOG_I (RRC,"enb_gtp_addr (msg index %d, context index %d, status %d, xid %d): nb_of_e_rabs %d, e_rab_id %d, teid: %u, addr: %d.%d.%d.%d \n ", + e_rabs_done, e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid, + ue_context_pP->ue_context.nb_of_e_rabs, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].gtp_teid, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[0], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[1], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[2], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[3]); + + e_rabs_done++; + } else if ((ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_NEW) || + (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_ESTABLISHED)){ + LOG_D (RRC,"E-RAB is NEW or already ESTABLISHED\n"); + }else { /* to be improved */ + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs_failed[e_rabs_failed].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; + e_rabs_failed++; + // TODO add cause when it will be integrated + } } + + LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: nb_of_erabs %d, total e_rabs %d, index %d \n", + ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, e_rab); + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_S1AP_ENB, + (const char *)&S1AP_E_RAB_SETUP_RESP (msg_p), + sizeof(s1ap_e_rab_setup_resp_t), + MSC_AS_TIME_FMT" E_RAB_SETUP_RESP UE %X eNB_ue_s1ap_id %u e_rabs:%u succ %u fail", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_id_rnti, + S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id, + e_rabs_done, e_rabs_failed); + + + S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs = e_rabs_done; + S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs_failed = e_rabs_failed; + if ((e_rabs_done > 0) ) + itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); + } else { + /*debug info for the xid */ + LOG_D (RRC,"xid does not corresponds (context e_rab index %d, status %d, xid %d) \n ", + e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid); } - LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: nb_of_erabs %d, total e_rabs %d, index %d \n", - ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, e_rab); - MSC_LOG_TX_MESSAGE( - MSC_RRC_ENB, - MSC_S1AP_ENB, - (const char *)&S1AP_E_RAB_SETUP_RESP (msg_p), - sizeof(s1ap_e_rab_setup_resp_t), - MSC_AS_TIME_FMT" E_RAB_SETUP_RESP UE %X eNB_ue_s1ap_id %u e_rabs:%u succ %u fail", - MSC_AS_TIME_ARGS(ctxt_pP), - ue_context_pP->ue_id_rnti, - S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id, - e_rabs_done, e_rabs_failed); - - - S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs = e_rabs_done; - S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs_failed = e_rabs_failed; - if ((e_rabs_done > 0) ) - itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); - + return 0; } # endif /* defined(ENABLE_ITTI) */ diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.h b/openair2/RRC/LITE/rrc_eNB_S1AP.h index ea797e8c20..55f501ec07 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.h +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.h @@ -164,6 +164,25 @@ int rrc_eNB_process_S1AP_DOWNLINK_NAS(MessageDef *msg_p, const char *msg_name, i */ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance); + +/*! \fn rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance); + *\brief process a S1AP dedicated E_RAB setup request message received from S1AP. + *\param msg_p Message received by RRC. + *\param msg_name Message name. + *\param instance Message instance. + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance); + +/*! \fn rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid ) + *\brief send a S1AP dedicated E_RAB setup response + *\param ctxt_pP contxt infirmation + *\param e_contxt_pP ue specific context at the eNB + *\param xid transaction identifier + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid ); + /*! \fn rrc_eNB_process_S1AP_UE_CTXT_MODIFICATION_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) *\brief process a S1AP_UE_CTXT_MODIFICATION_REQ message received from S1AP. *\param msg_p Message received by RRC. From 15d5095914cc5c6017f32fc73abce0c0bd1799f6 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Wed, 30 Mar 2016 15:22:14 +0200 Subject: [PATCH 006/340] fix a compilation error --- openair2/RRC/LITE/rrc_eNB_S1AP.c | 50 ++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index ff83ddbd76..c8ae96d084 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -1372,30 +1372,36 @@ int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, e_rabs_failed++; // TODO add cause when it will be integrated } + + + S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs = e_rabs_done; + S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs_failed = e_rabs_failed; + // NN: add conditions for e_rabs_failed + if ((e_rabs_done > 0) ){ + + LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: sending the message: nb_of_erabs %d, total e_rabs %d, index %d \n", + ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, e_rab); + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_S1AP_ENB, + (const char *)&S1AP_E_RAB_SETUP_RESP (msg_p), + sizeof(s1ap_e_rab_setup_resp_t), + MSC_AS_TIME_FMT" E_RAB_SETUP_RESP UE %X eNB_ue_s1ap_id %u e_rabs:%u succ %u fail", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_id_rnti, + S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id, + e_rabs_done, e_rabs_failed); + + + itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); + } + + } else { + /*debug info for the xid */ + LOG_D (RRC,"xid does not corresponds (context e_rab index %d, status %d, xid %d) \n ", + e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid); } - LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: nb_of_erabs %d, total e_rabs %d, index %d \n", - ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, e_rab); - MSC_LOG_TX_MESSAGE( - MSC_RRC_ENB, - MSC_S1AP_ENB, - (const char *)&S1AP_E_RAB_SETUP_RESP (msg_p), - sizeof(s1ap_e_rab_setup_resp_t), - MSC_AS_TIME_FMT" E_RAB_SETUP_RESP UE %X eNB_ue_s1ap_id %u e_rabs:%u succ %u fail", - MSC_AS_TIME_ARGS(ctxt_pP), - ue_context_pP->ue_id_rnti, - S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id, - e_rabs_done, e_rabs_failed); - - - S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs = e_rabs_done; - S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs_failed = e_rabs_failed; - if ((e_rabs_done > 0) ) - itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); - } else { - /*debug info for the xid */ - LOG_D (RRC,"xid does not corresponds (context e_rab index %d, status %d, xid %d) \n ", - e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid); } return 0; From 68fb9ef07fb9a95d2b5e2ad7344f54482f20e29b Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 4 Apr 2016 16:29:06 -0700 Subject: [PATCH 007/340] modifications to eMBMS-related L1 processing. mbmssim now works again (performance to be checked for 10/20 MHz), but error rates decay as they should with SNR. --- .../lte_dl_mbsfn_channel_estimation.c | 13 +++++----- openair1/PHY/LTE_TRANSPORT/pmch.c | 2 ++ openair1/SIMULATION/LTE_PHY/mbmssim.c | 26 ++++++++++++++----- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c index dbb2ba231f..a22df77b69 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c @@ -711,7 +711,7 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, //------------------------Temporal Interpolation ------------------------------ if (l==6) { ch = (short *)&dl_ch_estimates[aarx][ch_offset]; - // printf("Interpolating ch 2,6 => %d\n",ch_offset); + // printf("Interpolating ch 2,6 => %d\n",ch_offset); ch_prev = (short *)&dl_ch_estimates[aarx][2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; ch0 = (short *)&dl_ch_estimates[aarx][0*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; memcpy(ch0,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); @@ -722,6 +722,7 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, // 3/4 ch2 + 1/4 ch6 => ch3 multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + // 1/2 ch2 + 1/2 ch6 => ch4 multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); @@ -755,26 +756,26 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa]) { switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { case 6: - idft128((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][LTE_CE_OFFSET], + idft128((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; case 25: - idft512((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][LTE_CE_OFFSET], + idft512((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; case 50: - idft1024((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][LTE_CE_OFFSET], + idft1024((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; case 75: - idft1536((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][LTE_CE_OFFSET], + idft1536((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa]); break; case 100: - idft2048((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][LTE_CE_OFFSET], + idft2048((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index fbcec50333..7b93201dd0 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -379,6 +379,7 @@ void mch_extract_rbs(int **rxdataF, dl_ch_estimates_ext[aarx][(frame_parms->N_RB_DL*3)+j+symbol*(frame_parms->N_RB_DL*12)] = dl_ch_estimates[aarx][i+(frame_parms->N_RB_DL*6)+(symbol*frame_parms->ofdm_symbol_size)]; } } else { + memcpy((void*)&rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)], (void*)&rxdataF[aarx][frame_parms->first_carrier_offset + (symbol*frame_parms->ofdm_symbol_size)], frame_parms->N_RB_DL*24); @@ -388,6 +389,7 @@ void mch_extract_rbs(int **rxdataF, memcpy((void*)&dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)], (void*)&dl_ch_estimates[aarx][(symbol*frame_parms->ofdm_symbol_size)], frame_parms->N_RB_DL*48); + } } diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 8522b7be9a..e2fa439be5 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -128,7 +128,7 @@ int main(int argc, char **argv) char c; - int i,l,aa,aarx,k; + int i,l,l2,aa,aarx,k; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0; uint8_t snr1set=0; double snr_step=1,input_snr_step=1; @@ -538,11 +538,25 @@ int main(int argc, char **argv) } } } - - rx_pmch(PHY_vars_UE, - 0, - subframe%10, - l); + + if (l==6) + for (l2=2;l2<7;l2++) + rx_pmch(PHY_vars_UE, + 0, + subframe%10, + l2); + if (l==6) + for (l2=2;l2<7;l2++) + rx_pmch(PHY_vars_UE, + 0, + subframe%10, + l2); + if (l==11) + for (l2=7;l2<12;l2++) + rx_pmch(PHY_vars_UE, + 0, + subframe%10, + l2); } PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&PHY_vars_UE->lte_frame_parms, From 0a3a8a5daf4660a42952c24a72ccfc1e9a2e4df2 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Wed, 6 Apr 2016 19:21:53 +0200 Subject: [PATCH 008/340] fix the dedicated DRB setup with multiple E_RAB_SETUP_REQ --- openair2/LAYER2/MAC/config.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 4 ++-- openair2/RRC/LITE/rrc_eNB.c | 27 +++++++++++++++-------- openair2/RRC/LITE/rrc_eNB_S1AP.c | 11 ++++----- openair3/S1AP/s1ap_eNB_decoder.c | 2 +- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index e719d6729f..47852a6492 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -191,7 +191,7 @@ rrc_mac_config_req( } else { eNB_mac_inst[Mod_id].lcid_active[logicalChannelIdentity]=1; - LOG_I(MAC,"[CONFIG][eNB %d] lcid %d is active for UE rnti %x on cc_id % \n",Mod_id,rntiP,CC_id); + LOG_I(MAC,"[CONFIG][eNB %d] lcid %d is active for UE rnti %x on cc_id %d \n",Mod_id,logicalChannelIdentity, rntiP,CC_id); } } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 4737212d10..143cb7bbf1 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -918,8 +918,8 @@ schedule_ue_spec( if (rlc_status.bytes_in_buffer > 0) { - LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH%d->DLSCH, Requesting %d bytes from RLC (total hdr len dtch %d)\n", - module_idP,frameP,lcid,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch); + LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting %d bytes from RLC (lcid %d total hdr len %d)\n", + module_idP,frameP,TBS-header_len_dcch-sdu_length_total-header_len_dtch,lcid, header_len_dtch); sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, rnti, module_idP, diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 0a230ea8ef..4f644f4545 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -113,7 +113,7 @@ extern void* bigphys_malloc(int); extern uint16_t two_tier_hexagonal_cellIds[7]; /* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */ -static const uint8_t RRC_TRANSACTION_IDENTIFIER_NUMBER = 4; +static const uint8_t RRC_TRANSACTION_IDENTIFIER_NUMBER = 3; mui_t rrc_eNB_mui = 0; @@ -504,6 +504,7 @@ rrc_eNB_get_next_transaction_identifier( { static uint8_t rrc_transaction_identifier[NUMBER_OF_eNB_MAX]; rrc_transaction_identifier[enb_mod_idP] = (rrc_transaction_identifier[enb_mod_idP] + 1) % RRC_TRANSACTION_IDENTIFIER_NUMBER; + LOG_T(RRC,"generated xid is %d\n",rrc_transaction_identifier[enb_mod_idP]); return rrc_transaction_identifier[enb_mod_idP]; } /*------------------------------------------------------------------------------*/ @@ -1140,7 +1141,9 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co struct LogicalChannelConfig *DRB_lchan_config = NULL; struct LogicalChannelConfig__ul_SpecificParameters *DRB_ul_SpecificParameters = NULL; - DRB_ToAddModList_t** DRB_configList=&ue_context_pP->ue_context.DRB_configList; + // DRB_ToAddModList_t** DRB_configList=&ue_context_pP->ue_context.DRB_configList; + DRB_ToAddModList_t* DRB_configList=ue_context_pP->ue_context.DRB_configList; + DRB_ToAddModList_t* DRB_configList2=NULL; //DRB_ToAddModList_t** RRC_DRB_configList=&ue_context_pP->ue_context.DRB_configList; struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; @@ -1148,17 +1151,19 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co long *logicalchannelgroup, *logicalchannelgroup_drb; int drb_identity_index=0, nas_sequence_flag = 0; - + + uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, + // Configure DRB //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); - *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); + DRB_configList2 = CALLOC(1, sizeof(*DRB_configList2)); dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); for ( i = 0 ; i < ue_context_pP->ue_context.setup_e_rabs ; i++){ - // bypass the already configured erabs + // bypass the new and already configured erabs if (ue_context_pP->ue_context.e_rab[i].status >= E_RAB_STATUS_DONE) { drb_identity_index++; continue; @@ -1242,7 +1247,8 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co *logicalchannelgroup_drb = 1;//(i+1) % 3; DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; - ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); + ASN_SEQUENCE_ADD(&DRB_configList->list, DRB_config); + ASN_SEQUENCE_ADD(&DRB_configList2->list, DRB_config); //ue_context_pP->ue_context.DRB_configList2[drb_identity_index] = &(*DRB_configList); LOG_I(RRC,"EPS ID %d, DRB ID %d (index %d), QCI %d, priority %d, LCID %d LCGID %d \n", @@ -1280,7 +1286,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co } ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; - ue_context_pP->ue_context.e_rab[i].xid =rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, + ue_context_pP->ue_context.e_rab[i].xid = xid; } @@ -1288,9 +1294,9 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co size = do_RRCConnectionReconfiguration(ctxt_pP, buffer, - ue_context_pP->ue_context.e_rab[i].xid, + xid, (SRB_ToAddModList_t*)NULL, - (DRB_ToAddModList_t*)*DRB_configList, + (DRB_ToAddModList_t*)DRB_configList2, (DRB_ToReleaseList_t*)NULL, // DRB2_list, (struct SPS_Config*)NULL, // *sps_Config, NULL, NULL, NULL, NULL,NULL, @@ -1482,6 +1488,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons // Configure DRB //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); + if (*DRB_configList) { + free(*DRB_configList); + } *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); /// DRB DRB_config = CALLOC(1, sizeof(*DRB_config)); diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index c8ae96d084..e38bbcf17c 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -921,7 +921,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( &ctxt, &create_tunnel_resp); - ue_context_p->ue_context.setup_e_rabs =ue_context_p->ue_context.nb_of_e_rabs; + ue_context_p->ue_context.setup_e_rabs=ue_context_p->ue_context.nb_of_e_rabs; } /* TODO parameters yet to process ... */ @@ -1341,6 +1341,7 @@ int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, for (e_rab = 0; e_rab < ue_context_pP->ue_context.setup_e_rabs ; e_rab++) { /* only respond to the corresponding transaction */ + //if (((xid+1)%4) == ue_context_pP->ue_context.e_rab[e_rab].xid) { if (xid == ue_context_pP->ue_context.e_rab[e_rab].xid) { if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) { @@ -1352,7 +1353,7 @@ int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, //S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length += 4; ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; - LOG_I (RRC,"enb_gtp_addr (msg index %d, context index %d, status %d, xid %d): nb_of_e_rabs %d, e_rab_id %d, teid: %u, addr: %d.%d.%d.%d \n ", + LOG_I (RRC,"enb_gtp_addr (msg index %d, e_rab index %d, status %d, xid %d): nb_of_e_rabs %d, e_rab_id %d, teid: %u, addr: %d.%d.%d.%d \n ", e_rabs_done, e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid, ue_context_pP->ue_context.nb_of_e_rabs, S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id, @@ -1379,7 +1380,7 @@ int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, // NN: add conditions for e_rabs_failed if ((e_rabs_done > 0) ){ - LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: sending the message: nb_of_erabs %d, total e_rabs %d, index %d \n", + LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: sending the message: nb_of_erabs %d, total e_rabs %d, index %d\n", ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, e_rab); MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, @@ -1398,8 +1399,8 @@ int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, } else { /*debug info for the xid */ - LOG_D (RRC,"xid does not corresponds (context e_rab index %d, status %d, xid %d) \n ", - e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid); + LOG_D(RRC,"xid does not corresponds (context e_rab index %d, status %d, xid %d/%d) \n ", + e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid, ue_context_pP->ue_context.e_rab[e_rab].xid); } } diff --git a/openair3/S1AP/s1ap_eNB_decoder.c b/openair3/S1AP/s1ap_eNB_decoder.c index 4a3689cec0..cb1de2e6e9 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.c +++ b/openair3/S1AP/s1ap_eNB_decoder.c @@ -140,7 +140,7 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message, ret = s1ap_decode_s1ap_e_rabreleasecommandies(&message->msg.s1ap_E_RABReleaseCommandIEs, &initiating_p->value); //s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); - S1AP_ERROR("TODO E_RABReleas initiating message\n"); + S1AP_INFO("TODO E_RABRelease nitiating message\n"); free(message_string); default: From 2176299a2d3108fcbb52aa9b616e9a47a52b563d Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 14 Apr 2016 00:40:50 -0700 Subject: [PATCH 009/340] pdcchsim change for debugging CCE allocations --- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 0c51959f14..4adf61a3c0 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -373,9 +373,9 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 if (lte_frame_parms->N_RB_DL >= 25) { // add ue specific dci DCI_pdu.dci_alloc[1].dci_length = dci_length; - DCI_pdu.dci_alloc[1].L = log2L; - DCI_pdu.dci_alloc[1].rnti = rnti; - DCI_pdu.dci_alloc[1].format = format1; + DCI_pdu.dci_alloc[1].L = log2Lcommon;//log2L; + DCI_pdu.dci_alloc[1].rnti = 12;//rnti; + DCI_pdu.dci_alloc[1].format = format1A; //format1 DCI_pdu.dci_alloc[1].ra_flag = 0; memcpy((void*)&DCI_pdu.dci_alloc[1].dci_pdu[0], &DLSCH_alloc_pdu[0], dci_length_bytes); DCI_pdu.Num_ue_spec_dci++; From 4b8251838dd8d123e2e7a1e4983629f0a47a9ea9 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Wed, 20 Apr 2016 13:14:16 +0200 Subject: [PATCH 010/340] enabling SRB2 --- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 6 ++-- openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 2 +- openair2/RRC/LITE/rrc_eNB.c | 38 ++++++++++++++---------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index c71b83ec2e..595bdfd310 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -115,7 +115,7 @@ boolean_t pdcp_data_req( AssertError (rb_idP < NB_RB_MBMS_MAX, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, NB_RB_MBMS_MAX, ctxt_pP->module_id, ctxt_pP->rnti); } else { if (srb_flagP) { - AssertError (rb_idP < 2, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, 2, ctxt_pP->module_id, ctxt_pP->rnti); + AssertError (rb_idP < 3, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, 3, ctxt_pP->module_id, ctxt_pP->rnti); } else { AssertError (rb_idP < maxDRB, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, maxDRB, ctxt_pP->module_id, ctxt_pP->rnti); } @@ -1475,8 +1475,8 @@ pdcp_config_req_asn1 ( pdcp_pP->seq_num_size=5; } - LOG_D(PDCP,PROTOCOL_PDCP_CTXT_FMT" Action MODIFY LCID %d " - "RB id %d configured with SN size %d and RLC %s \n", + LOG_I(PDCP,PROTOCOL_PDCP_CTXT_FMT" Action MODIFY LCID %d " + "RB id %d reconfigured with SN size %d and RLC %s \n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP), lc_idP, rb_idP, diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index 787d463b32..40ce7c728a 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -482,7 +482,7 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) ctxt.enb_flag = ENB_FLAG_NO; ctxt.module_id = pdcp_read_header_g.inst - oai_emulation.info.nb_enb_local + oai_emulation.info.first_ue_local; ctxt.rnti = pdcp_UE_UE_module_id_to_rnti[ctxt.module_id]; - rab_id = pdcp_read_header_g.rb_id; + rab_id = pdcp_read_header_g.rb_id % maxDRB; } CHECK_CTXT_ARGS(&ctxt); diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 0a230ea8ef..6a68d67600 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1153,6 +1153,8 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); + + int e_rab_done=0; for ( i = 0 ; i < ue_context_pP->ue_context.setup_e_rabs ; @@ -1167,9 +1169,10 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_config = CALLOC(1, sizeof(*DRB_config)); DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long)); - *(DRB_config->eps_BearerIdentity) = ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + // allowed value 5..15, value : x+4 + *(DRB_config->eps_BearerIdentity) = ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 4; - DRB_config->drb_Identity = 1 + drb_identity_index ;// + i ;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + DRB_config->drb_Identity = 1 + drb_identity_index + e_rab_done;// + i ;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; // 1 + drb_identiy_index; DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); @@ -1273,12 +1276,14 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co } /* If list is empty free the list and reset the address */ - if (dedicatedInfoNASList->list.count == 0) { - free(dedicatedInfoNASList); - dedicatedInfoNASList = NULL; - } + if (dedicatedInfoNASList != NULL) { + if (dedicatedInfoNASList->list.count == 0) { + free(dedicatedInfoNASList); + dedicatedInfoNASList = NULL; + } + } } - + e_rab_done++; ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; ue_context_pP->ue_context.e_rab[i].xid =rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, @@ -1477,7 +1482,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons SRB2_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup; SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters = SRB2_ul_SpecificParameters; + // this list has the configuration for SRB1 and SRB2 ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config); + // this list has only the configuration for SRB2 ASN_SEQUENCE_ADD(&SRB_configList2->list, SRB2_config); // Configure DRB @@ -1898,7 +1905,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons size = do_RRCConnectionReconfiguration(ctxt_pP, buffer, rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), //Transaction_id, - (SRB_ToAddModList_t*)NULL, /// NN: do not reconfig srb1: SRB_configList2, + (SRB_ToAddModList_t*)SRB_configList, // SRB_configList (DRB_ToAddModList_t*)*DRB_configList, (DRB_ToReleaseList_t*)NULL, // DRB2_list, (struct SPS_Config*)NULL, // *sps_Config, @@ -3306,7 +3313,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( rrc_pdcp_config_asn1_req( ctxt_pP, - NULL, //LG-RK 14/05/2014 SRB_configList, + SRB_configList, //NULL, //LG-RK 14/05/2014 SRB_configList, DRB_configList, (DRB_ToReleaseList_t *) NULL, /*eNB_rrc_inst[ctxt_pP->module_id].ciphering_algorithm[ue_mod_idP] | @@ -3323,7 +3330,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( // Refresh SRBs/DRBs rrc_rlc_config_asn1_req( ctxt_pP, - NULL, //LG-RK 14/05/2014 SRB_configList, + SRB_configList, // NULL, //LG-RK 14/05/2014 SRB_configList, DRB_configList, (DRB_ToReleaseList_t *) NULL #ifdef Rel10 @@ -4581,9 +4588,9 @@ void rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* ue_context_pP){ int i; - + int e_rab_done=0; for (i = 0; - i < NB_RB_MAX - 3; // S1AP_MAX_E_RAB + i < 3;//NB_RB_MAX - 3; // S1AP_MAX_E_RAB i++) { if ( ue_context_pP->ue_context.e_rab[i].status < E_RAB_STATUS_DONE){ @@ -4600,14 +4607,13 @@ void rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP, ue_context_pP->ue_context.e_rab[i].param.gtp_teid=0; ue_context_pP->ue_context.nb_of_e_rabs++; - + e_rab_done++; LOG_I(RRC,"setting up the dedicated DRBs %d (index %d) status %d \n", ue_context_pP->ue_context.e_rab[i].param.e_rab_id, i, ue_context_pP->ue_context.e_rab[i].status); } - - ue_context_pP->ue_context.setup_e_rabs+=ue_context_pP->ue_context.nb_of_e_rabs; } - + ue_context_pP->ue_context.setup_e_rabs+=e_rab_done; + rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(ctxt_pP, ue_context_pP, 0); } From d54fe24f9e536c7d079c0f3911397106cd2603e0 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 21 Apr 2016 00:53:28 -0700 Subject: [PATCH 011/340] acceleration of dlsch_modulation --- openair1/PHY/CODING/lte_rate_matching.c | 8 +- .../PHY/LTE_TRANSPORT/dlsch_llr_computation.c | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 531 ++++++++++++++++-- openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c | 51 +- openair1/PHY/LTE_TRANSPORT/proto.h | 4 +- openair1/PHY/TOOLS/cmult_vv.c | 2 +- openair1/PHY/TOOLS/lte_dfts.c | 4 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 8 +- 8 files changed, 524 insertions(+), 86 deletions(-) diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 96663bd8a6..483cda3f93 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -53,7 +53,7 @@ uint32_t sub_block_interleaving_turbo(uint32_t D, uint8_t *d,uint8_t *w) { uint32_t RTC = (D>>5), ND, ND3; - uint32_t row,col,Kpi,index; + uint32_t row,col,Kpi; uint32_t index3,k,k2; #ifdef RM_DEBUG uint32_t nulled=0; @@ -84,7 +84,6 @@ uint32_t sub_block_interleaving_turbo(uint32_t D, uint8_t *d,uint8_t *w) #ifdef RM_DEBUG printf("Col %d\n",col); #endif - index = bitrev[col]; index3 = bitrev_x3[col];//3*index; for (row=0; row>2; // length in quad words (4 REs) - len2+=(len_mod4?0:1); + len2+=((len_mod4==0)?0:1); for (i=0; i>15); */ } +uint32_t FOUR[2]={0,4}; +uint32_t TWO[2]={0,2}; + +int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, + mod_sym_t **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + int *P1_SHIFT, + int *P2_SHIFT) +{ + + + uint8_t *x0 = dlsch0_harq->e; + uint32_t qam16_table_offset_re = 0; + uint32_t qam16_table_offset_im = 0; + + uint32_t tti_offset; + uint8_t re; + uint8_t *x0p; + + if (skip_dc == 0) { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; + re<12; + re++,x0p+=4,tti_offset++) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + } + } + else { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; + re<6; + re++,x0p+=4,tti_offset++) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + } + + for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7; + re<12; + re++,x0p+=4,tti_offset++) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + } + } + *re_allocated = *re_allocated + 12; + *jj=*jj + 48; + + return(0); +} + +int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, + mod_sym_t **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + int *P1_SHIFT, + int *P2_SHIFT) +{ + + + uint8_t *x0 = dlsch0_harq->e; + uint32_t qam16_table_offset_re = 0; + uint32_t qam16_table_offset_im = 0; + + uint32_t tti_offset; + uint8_t re; + uint8_t *x0p; + + + if (skip_dc == 0) { + // printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; + re<12; + x0p+=4) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + // printf("pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]); + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + } + else { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; + re<6; + x0p+=4) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + + for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6]; + re<12; + x0p+=4) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + } + *re_allocated = *re_allocated + 10; + *jj=*jj + 40; + + return(0); +} + +int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, + mod_sym_t **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + int *P1_SHIFT, + int *P2_SHIFT) +{ + + + uint8_t *x0 = dlsch0_harq->e; + uint32_t qam64_table_offset_re = 0; + uint32_t qam64_table_offset_im = 0; + + uint32_t tti_offset; + uint8_t re; + uint8_t *x0p; + + if (skip_dc == 0) { + + + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; + re<12; + re++,x0p+=6,tti_offset++) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + } + } + else { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; + re<6; + re++,x0p+=6,tti_offset++) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + } + + for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7; + re<12; + re++,x0p+=6,tti_offset++) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + } + } + + *re_allocated = *re_allocated + 12; + *jj=*jj + 72; + + return(0); +} + +int allocate_REs_in_RB_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, + mod_sym_t **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + int *P1_SHIFT, + int *P2_SHIFT) +{ + + + uint8_t *x0 = dlsch0_harq->e; + uint32_t qam64_table_offset_re = 0; + uint32_t qam64_table_offset_im = 0; + + uint32_t tti_offset; + uint8_t re; + uint8_t *x0p; + + + if (skip_dc == 0) { + // printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; + re<12; + x0p+=6) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + // printf("pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]); + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + } + else { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; + re<6; + x0p+=6) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + + for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6]; + re<12; + x0p+=6) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + } + *re_allocated = *re_allocated + 10; + *jj=*jj + 60; + + return(0); +} + int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, mod_sym_t **txdataF, uint32_t *jj, @@ -151,7 +479,9 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, int16_t *qam_table_s1, uint32_t *re_allocated, uint8_t skip_dc, - uint8_t skip_half) + uint8_t skip_half, + int *P1_SHIFT, + int *P2_SHIFT) { @@ -209,27 +539,6 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, } - /* - switch (mod_order) { - case 2: - // QPSK single stream - - break; - case 4: - //16QAM Single stream - gain_lin_16QAM1 = (int16_t)(((int32_t)amp*QAM16_n1)>>15); - gain_lin_16QAM2 = (int16_t)(((int32_t)amp*QAM16_n2)>>15); - - break; - - case 6: - //64QAM Single stream - break; - default: - break; - } - */ - #ifdef DEBUG_DLSCH_MODULATION printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); #endif @@ -242,6 +551,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, else if (skip_half==2) first_re=6; + for (re=first_re; renb_antennas_tx; aa++) { - ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im]; } break; @@ -970,7 +1280,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, } } } else if (mimo_mode>=TM9_10) { - msg("allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode); + printf("allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode); return(-1); } } @@ -1191,7 +1501,7 @@ int dlsch_modulation(mod_sym_t **txdataF, uint8_t harq_pid = dlsch0->current_harq_pid; LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid]; LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid]; - uint32_t i,jj,jj2,re_allocated,symbol_offset; + uint32_t i,i2,jj,jj2,re_allocated,symbol_offset; uint16_t l,rb,re_offset; uint32_t rb_alloc_ind; uint32_t *rb_alloc = dlsch0_harq->rb_alloc; @@ -1202,7 +1512,28 @@ int dlsch_modulation(mod_sym_t **txdataF, int16_t amp_rho_a, amp_rho_b; int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8]; int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8]; - int16_t *qam_table_s0,*qam_table_s1; + int16_t *qam_table_s0=NULL,*qam_table_s1=NULL; + int (*allocate_REs)(LTE_DL_FRAME_PARMS *, + mod_sym_t **, + uint32_t*, + uint32_t*, + uint16_t, + uint32_t, + LTE_DL_eNB_HARQ_t *, + LTE_DL_eNB_HARQ_t *, + uint8_t, + int16_t, + uint8_t, + int16_t *, + int16_t *, + uint32_t *, + uint8_t, + uint8_t, + int *, + int *); + int P1_SHIFT[13],P2_SHIFT[13]; + int offset,nushiftmod3; + #ifdef DEBUG_DLSCH_MODULATION uint8_t Nl0 = dlsch0_harq->Nl; uint8_t Nl1; @@ -1255,7 +1586,7 @@ int dlsch_modulation(mod_sym_t **txdataF, for (l=num_pdcch_symbols; lmimo_mode, pmi2hex_2Ar1(dlsch0_harq->pmi_alloc), @@ -1281,6 +1612,32 @@ int dlsch_modulation(mod_sym_t **txdataF, pilots=0; } + offset = (pilots==2)?3:0; + nushiftmod3 = frame_parms->nushift%3; + + if (pilots>0) { // compute pilot arrays, could be done statically if performance suffers + if (frame_parms->mode1_flag == 1) { + // printf("l %d, nushift %d, offset %d\n",l,frame_parms->nushift,offset); + for (i=0,i2=0;i<12;i++) { + if ((i!=(frame_parms->nushift+offset)) && (i!=((frame_parms->nushift+6+offset)%12))) + P1_SHIFT[i2++]=1; + else + P1_SHIFT[i2++]=2; + } + P1_SHIFT[0]--; + } + else { + for (i=0,i2=0;i<12;i++) { + if ((i!=nushiftmod3) && (i!=nushiftmod3+6) && (i!=nushiftmod3+3) && (i!=nushiftmod3+9)) + P2_SHIFT[i2++]=1; + else + P2_SHIFT[i2++]=2; + } + P2_SHIFT[0]--; + } + } + P1_SHIFT[12]=1;P2_SHIFT[12]=1; + re_offset = frame_parms->first_carrier_offset; symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe_offset*nsymb)); @@ -1421,50 +1778,100 @@ int dlsch_modulation(mod_sym_t **txdataF, } if (dlsch0_harq->Nlayers>1) { - msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); + printf("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); return(-1); } if (dlsch1) { if (dlsch1_harq->Nlayers>1) { - msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); + printf("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); return(-1); } } - if (mod_order0 == 4) - qam_table_s0 = ((pilots) ? qam16_table_b0 : qam16_table_a0); - else if (mod_order0 == 6) - qam_table_s0 = ((pilots) ? qam64_table_b0 : qam64_table_a0); - else - qam_table_s0 = NULL; + allocate_REs = allocate_REs_in_RB; - if (mod_order1 == 4) - qam_table_s1 = ((pilots) ? qam16_table_b1 : qam16_table_a1); - else if (mod_order1 == 6) - qam_table_s1 = ((pilots) ? qam64_table_b1 : qam64_table_a1); - else - qam_table_s1 = NULL; + switch (mod_order0) { + case 2: + qam_table_s0 = NULL; + break; + case 4: + if (pilots) { + qam_table_s0 = qam16_table_b0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_pilots_16QAM_siso : + allocate_REs_in_RB; + } + else { + qam_table_s0 = qam16_table_a0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_no_pilots_16QAM_siso : + allocate_REs_in_RB; + + } + break; + + case 6: + if (pilots) { + qam_table_s0 = qam64_table_b0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_pilots_64QAM_siso : + allocate_REs_in_RB; + } + else { + qam_table_s0 = qam64_table_a0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_no_pilots_64QAM_siso : + allocate_REs_in_RB; + } + break; + + } + + switch (mod_order1) { + case 2: + qam_table_s1 = NULL; + allocate_REs = allocate_REs_in_RB; + break; + case 4: + if (pilots) { + qam_table_s1 = qam16_table_b1; + } + else { + qam_table_s1 = qam16_table_a1; + } + break; + case 6: + if (pilots) { + qam_table_s1 = qam64_table_b1; + } + else { + qam_table_s1 = qam64_table_a1; + } + break; + + } if (rb_alloc_ind > 0) { - // printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); - allocate_REs_in_RB(frame_parms, - txdataF, - &jj, - &jj2, - re_offset, - symbol_offset, - dlsch0->harq_processes[harq_pid], - (dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid], - pilots, - ((pilots) ? amp_rho_b : amp_rho_a), - get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb), - qam_table_s0, - qam_table_s1, - &re_allocated, - skip_dc, - skip_half); - + // printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); + allocate_REs(frame_parms, + txdataF, + &jj, + &jj2, + re_offset, + symbol_offset, + dlsch0->harq_processes[harq_pid], + (dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid], + pilots, + ((pilots) ? amp_rho_b : amp_rho_a), + get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb), + qam_table_s0, + qam_table_s1, + &re_allocated, + skip_dc, + skip_half, + P1_SHIFT, + P2_SHIFT); } re_offset+=12; // go to next RB @@ -1484,7 +1891,7 @@ int dlsch_modulation(mod_sym_t **txdataF, #ifdef DEBUG_DLSCH_MODULATION - msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset)); + printf("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset)); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT); @@ -1583,7 +1990,7 @@ int mch_modulation(mod_sym_t **txdataF, #ifdef DEBUG_DLSCH_MODULATION - msg("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset)); + printf("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset)); #endif return (re_allocated); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c index dd971748cb..a5dd4bf764 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c @@ -56,10 +56,11 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, uint8_t Ns) { - int i,j,k=0; + int i; // uint8_t reset; uint32_t x1, x2, s=0; - uint8_t *e=dlsch->harq_processes[dlsch->current_harq_pid]->e; + uint8_t *dlsch_e=dlsch->harq_processes[dlsch->current_harq_pid]->e; + uint8_t *e=dlsch_e; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_IN); @@ -78,24 +79,56 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, for (i=0; i<(1+(G>>5)); i++) { - for (j=0; j<32; j++,k++) { #ifdef DEBUG_SCRAMBLING - printf("scrambling %d : %d => ",k,e[k]); + printf("scrambling %d : %d => ",k,e[k]); #endif - e[k] = (e[k]&1) ^ ((s>>j)&1); + + e[0] = (e[0]&1) ^ (s&1); + e[1] = (e[1]&1) ^ ((s>>1)&1); + e[2] = (e[2]&1) ^ ((s>>2)&1); + e[3] = (e[3]&1) ^ ((s>>3)&1); + e[4] = (e[4]&1) ^ ((s>>4)&1); + e[5] = (e[5]&1) ^ ((s>>5)&1); + e[6] = (e[6]&1) ^ ((s>>6)&1); + e[7] = (e[7]&1) ^ ((s>>7)&1); + e[8] = (e[8]&1) ^ ((s>>8)&1); + e[9] = (e[9]&1) ^ ((s>>9)&1); + e[10] = (e[10]&1) ^ ((s>>10)&1); + e[11] = (e[11]&1) ^ ((s>>11)&1); + e[12] = (e[12]&1) ^ ((s>>12)&1); + e[13] = (e[13]&1) ^ ((s>>13)&1); + e[14] = (e[14]&1) ^ ((s>>14)&1); + e[15] = (e[15]&1) ^ ((s>>15)&1); + e[16] = (e[16]&1) ^ ((s>>16)&1); + e[17] = (e[17]&1) ^ ((s>>17)&1); + e[18] = (e[18]&1) ^ ((s>>18)&1); + e[19] = (e[19]&1) ^ ((s>>19)&1); + e[20] = (e[20]&1) ^ ((s>>20)&1); + e[21] = (e[21]&1) ^ ((s>>21)&1); + e[22] = (e[22]&1) ^ ((s>>22)&1); + e[23] = (e[23]&1) ^ ((s>>23)&1); + e[24] = (e[24]&1) ^ ((s>>24)&1); + e[25] = (e[25]&1) ^ ((s>>25)&1); + e[26] = (e[26]&1) ^ ((s>>26)&1); + e[27] = (e[27]&1) ^ ((s>>27)&1); + e[28] = (e[28]&1) ^ ((s>>28)&1); + e[29] = (e[29]&1) ^ ((s>>29)&1); + e[30] = (e[30]&1) ^ ((s>>30)&1); + e[31] = (e[31]&1) ^ ((s>>31)&1); + #ifdef DEBUG_SCRAMBLING - printf("%d\n",e[k]); + printf("%d\n",e[k]); #endif - } - + + s = lte_gold_generic(&x1, &x2, 0); + e += 32; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_OUT); } - void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, int mbsfn_flag, LTE_UE_DLSCH_t *dlsch, diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 9afea790b3..ab1119020c 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -183,7 +183,9 @@ int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, int16_t *qam_table_s1, uint32_t *re_allocated, uint8_t skip_dc, - uint8_t skip_half); + uint8_t skip_half, + int *P1_SHIFT, + int *P2_SHIFT); /** \fn int32_t dlsch_modulation(mod_sym_t **txdataF, diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c index f970d33224..ec6aacc440 100755 --- a/openair1/PHY/TOOLS/cmult_vv.c +++ b/openair1/PHY/TOOLS/cmult_vv.c @@ -85,7 +85,7 @@ int mult_cpx_conj_vector(int16_t *x1, // we compute 4 cpx multiply for each loop for(i=0; i<(N>>2); i++) { - #if defined(__x86_64__) || defined(__i386__) +#if defined(__x86_64__) || defined(__i386__) tmp_re = _mm_madd_epi16(*x1_128,*x2_128); tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1)); tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1)); diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index b010f93aab..e2c23c8538 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -105,7 +105,6 @@ static inline void cmacc(__m128i a,__m128i b, __m128i *re32, __m128i *im32) - static inline void cmult(__m128i a,__m128i b, __m128i *re32, __m128i *im32) __attribute__((always_inline)); static inline void cmult(__m128i a,__m128i b, __m128i *re32, __m128i *im32) @@ -1754,7 +1753,8 @@ int16_t tw64c[96] __attribute__((aligned(16))) = { 0,32767,3212,32609,6393,32137 #define simdshort_q15_t __m64 #define shiftright_int16(a,shift) _mm_srai_epi16(a,shift) #define set1_int16(a) _mm_set1_epi16(a); -#define mulhi_int16(a,b) _mm_slli_epi16(_mm_mulhi_epi16(a,b),1); +//#define mulhi_int16(a,b) _mm_slli_epi16(_mm_mulhi_epi16(a,b),1); +#define mulhi_int16(a,b) _mm_mulhrs_epi16 (a,b) #elif defined(__arm__) #define simd_q15_t int16x8_t #define simdshort_q15_t int16x4_t diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 6f2c1f1d22..58cf77568a 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -215,7 +215,7 @@ int main(int argc, char **argv) // void *data; // int ii; // int bler; - double blerr[4],uncoded_ber;//,avg_ber; + double blerr[4],uncoded_ber,avg_ber; short *uncoded_ber_bit=NULL; uint8_t N_RB_DL=25,osf=1; frame_t frame_type = FDD; @@ -2623,7 +2623,7 @@ PMI_FEEDBACK: &PHY_vars_eNB->lte_frame_parms, num_pdcch_symbols, PHY_vars_eNB->dlsch_eNB[k][0], - PHY_vars_eNB->dlsch_eNB[k][1]); + (transmission_mode==3)||(transmission_mode==4) ? PHY_vars_eNB->dlsch_eNB[k][1] : NULL); /* avoid gcc warnings */ (void)re_allocated; @@ -3292,7 +3292,7 @@ PMI_FEEDBACK: PHY_vars_UE->dlsch_ue[0][cw]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid]->G = coded_bits_per_codeword; - /* + // calculate uncoded BLER uncoded_ber=0; for (i=0;idlsch_unscrambling_stats); dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms, From 58ba008937b2d7f0c3bdd32735bcab57dabe9134 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 8 May 2016 10:23:34 -0700 Subject: [PATCH 012/340] added lte-enb.c which extracts all enb-specific code from lte-softmodem. corrects merge from develop branch in dlsch_modulations.c. removal of HW-specific code in lte-softmodem.c --- cmake_targets/CMakeLists.txt | 1 + openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 10 +- targets/RT/USER/lte-enb.c | 1474 +++++++++++ targets/RT/USER/lte-softmodem.c | 2175 +---------------- 4 files changed, 1524 insertions(+), 2136 deletions(-) create mode 100644 targets/RT/USER/lte-enb.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index b50c017a92..166da4a48d 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1579,6 +1579,7 @@ add_executable(lte-softmodem ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/RT/USER/lte-ue.c ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c + ${OPENAIR_TARGETS}/RT/USER/lte-enb.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c ${OPENAIR_TARGETS}/COMMON/create_tasks.c diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index af6c72fc6a..034dc0ada8 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -140,7 +140,7 @@ uint32_t FOUR[2]={0,4}; uint32_t TWO[2]={0,2}; int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, + int **txdataF, uint32_t *jj, uint32_t *jj2, uint16_t re_offset, @@ -213,7 +213,7 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, } int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, + int **txdataF, uint32_t *jj, uint32_t *jj2, uint16_t re_offset, @@ -295,7 +295,7 @@ int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, } int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, + int **txdataF, uint32_t *jj, uint32_t *jj2, uint16_t re_offset, @@ -377,7 +377,7 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, } int allocate_REs_in_RB_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, + int **txdataF, uint32_t *jj, uint32_t *jj2, uint16_t re_offset, @@ -1514,7 +1514,7 @@ int dlsch_modulation(int32_t **txdataF, int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8]; int16_t *qam_table_s0=NULL,*qam_table_s1=NULL; int (*allocate_REs)(LTE_DL_FRAME_PARMS *, - mod_sym_t **, + int **, uint32_t*, uint32_t*, uint16_t, diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c new file mode 100644 index 0000000000..7234cf4f08 --- /dev/null +++ b/targets/RT/USER/lte-enb.c @@ -0,0 +1,1474 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + +*******************************************************************************/ + +/*! \file lte-enb.c + * \brief Top-level threads for eNodeB + * \author R. Knopp, F. Kaltenberger, Navid Nikaein + * \date 2012 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr + * \note + * \warning + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "rt_wrapper.h" + +#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "assertions.h" +#include "msc.h" + +#include "PHY/types.h" + +#include "PHY/defs.h" +#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all +//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "../../ARCH/COMMON/common_lib.h" + +//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "PHY/extern.h" +#include "SCHED/extern.h" +#include "LAYER2/MAC/extern.h" + +#include "../../SIMU/USER/init_lte.h" + +#include "LAYER2/MAC/defs.h" +#include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/proto.h" +#include "RRC/LITE/extern.h" +#include "PHY_INTERFACE/extern.h" + +#ifdef SMBV +#include "PHY/TOOLS/smbv.h" +unsigned short config_frames[4] = {2,9,11,13}; +#endif +#include "UTIL/LOG/log_extern.h" +#include "UTIL/OTG/otg_tx.h" +#include "UTIL/OTG/otg_externs.h" +#include "UTIL/MATH/oml.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/OPT/opt.h" +#include "enb_config.h" +//#include "PHY/TOOLS/time_meas.h" + +#ifndef OPENAIR2 +#include "UTIL/OTG/otg_extern.h" +#endif + +#if defined(ENABLE_ITTI) +# if defined(ENABLE_USE_MME) +# include "s1ap_eNB.h" +#ifdef PDCP_USE_NETLINK +# include "SIMULATION/ETH_TRANSPORT/proto.h" +#endif +# endif +#endif + + + + + +//#define DEBUG_THREADS 1 + +//#define USRP_DEBUG 1 +struct timing_info_t { + //unsigned int frame, hw_slot, last_slot, next_slot; + RTIME time_min, time_max, time_avg, time_last, time_now; + //unsigned int mbox0, mbox1, mbox2, mbox_target; + unsigned int n_samples; +} timing_info; + + +extern openair0_device openair0; + +#if defined(ENABLE_ITTI) +extern volatile int start_eNB; +extern volatile int start_UE; +#endif +extern volatile int oai_exit; + +extern openair0_config_t openair0_cfg[MAX_CARDS]; + +extern pthread_cond_t sync_cond; +extern pthread_mutex_t sync_mutex; +extern int sync_var; + +pthread_attr_t attr_eNB_proc_tx[MAX_NUM_CCs][NUM_ENB_THREADS]; +pthread_attr_t attr_eNB_proc_rx[MAX_NUM_CCs][NUM_ENB_THREADS]; + +#ifndef LOWLATENCY +struct sched_param sched_param_eNB_proc_tx[MAX_NUM_CCs][NUM_ENB_THREADS]; +struct sched_param sched_param_eNB_proc_rx[MAX_NUM_CCs][NUM_ENB_THREADS]; +#endif + +pthread_t main_eNB_thread; +pthread_attr_t attr_dlsch_threads; +#ifndef LOWLATENCY +struct sched_param sched_param_dlsch; +#endif + +time_stats_t softmodem_stats_mt; // main thread +time_stats_t softmodem_stats_hw; // hw acquisition +time_stats_t softmodem_stats_tx_sf[10]; // total tx time +time_stats_t softmodem_stats_rx_sf[10]; // total rx time +int32_t **rxdata; +int32_t **txdata; + +static int time_offset[4] = {0,0,0,0}; + +/* mutex, cond and variable to serialize phy proc TX calls + * (this mechanism may be relaxed in the future for better + * performances) + */ +static struct { + pthread_mutex_t mutex_phy_proc_tx; + pthread_cond_t cond_phy_proc_tx; + volatile uint8_t phy_proc_CC_id; +} sync_phy_proc[NUM_ENB_THREADS]; + + +void exit_fun(const char* s); + +void init_eNB(void); +void stop_eNB(void); + +void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) +{ + + unsigned int aa,slot_offset, slot_offset_F; + int dummy_tx_b[7680*4] __attribute__((aligned(32))); + int i, tx_offset; + int slot_sizeF = (phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)* + ((phy_vars_eNB->lte_frame_parms.Ncp==1) ? 6 : 7); + int len; + + slot_offset_F = (subframe<<1)*slot_sizeF; + + slot_offset = subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti; + + if ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_DL)|| + ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_S))) { + // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); + + + for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + if (phy_vars_eNB->lte_frame_parms.Ncp == EXTENDED) { + PHY_ofdm_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F], + dummy_tx_b, + phy_vars_eNB->lte_frame_parms.ofdm_symbol_size, + 6, + phy_vars_eNB->lte_frame_parms.nb_prefix_samples, + CYCLIC_PREFIX); + PHY_ofdm_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], + dummy_tx_b+(phy_vars_eNB->lte_frame_parms.samples_per_tti>>1), + phy_vars_eNB->lte_frame_parms.ofdm_symbol_size, + 6, + phy_vars_eNB->lte_frame_parms.nb_prefix_samples, + CYCLIC_PREFIX); + } else { + normal_prefix_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F], + dummy_tx_b, + 7, + &(phy_vars_eNB->lte_frame_parms)); + // if S-subframe generate first slot only + if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_DL) + normal_prefix_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], + dummy_tx_b+(phy_vars_eNB->lte_frame_parms.samples_per_tti>>1), + 7, + &(phy_vars_eNB->lte_frame_parms)); + } + + // if S-subframe generate first slot only + if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_S) + len = phy_vars_eNB->lte_frame_parms.samples_per_tti>>1; + else + len = phy_vars_eNB->lte_frame_parms.samples_per_tti; + /* + for (i=0;ilte_frame_parms.samples_per_tti; + + if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti)) + tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; + + ((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[0] = ((short*)dummy_tx_b)[2*i]<lte_eNB_common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<lte_frame_parms,subframe) == SF_S) { + for (i=0; ilte_eNB_common_vars.txdata[0][aa][tx_offset++] = 0x00010001; + } + } + + if ((((phy_vars_eNB->lte_frame_parms.tdd_config==0) || + (phy_vars_eNB->lte_frame_parms.tdd_config==1) || + (phy_vars_eNB->lte_frame_parms.tdd_config==2) || + (phy_vars_eNB->lte_frame_parms.tdd_config==6)) && + (subframe==0)) || (subframe==5)) { + // turn on tx switch N_TA_offset before + //LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,phy_vars_eNB->N_TA_offset,slot_offset); + for (i=0; iN_TA_offset; i++) { + tx_offset = (int)slot_offset+time_offset[aa]+i-phy_vars_eNB->N_TA_offset/2; + if (tx_offset<0) + tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; + + if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti)) + tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; + + phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset] = 0x00000000; + } + } + } + } +} + +/*! + * \brief The transmit thread of eNB. + * \ref NUM_ENB_THREADS threads of this type are active at the same time. + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread_tx( void* param ) +{ + static int eNB_thread_tx_status[NUM_ENB_THREADS]; + + eNB_proc_t *proc = (eNB_proc_t*)param; + FILE *tx_time_file = NULL; + char tx_time_name[101]; + + if (opp_enabled == 1) { + snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->subframe); + tx_time_file = fopen(tx_time_name,"w"); + } + // set default return value + eNB_thread_tx_status[proc->subframe] = 0; + + MSC_START_USE(); + +#ifdef LOWLATENCY + struct sched_attr attr; + unsigned int flags = 0; + uint64_t runtime = 850000 ; + uint64_t deadline = 1 * 1000000 ; // each tx thread will finish within 1ms + uint64_t period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = runtime; + attr.sched_deadline = deadline; + attr.sched_period = period; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] eNB tx thread: sched_setattr failed\n"); + return &eNB_thread_tx_status[proc->subframe]; + } + + LOG_I( HW, "[SCHED] eNB TX deadline thread %d(TID %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() ); + +#else //LOW_LATENCY + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD threads */ + /* CPU 1 is reserved for all TX threads */ + /* Enable CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); + +#ifdef CPU_AFFINITY + if (get_nprocs() > 2) + { + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun("Error setting processor affinity"); + } + } +#endif //CPU_AFFINITY + + /* Check the actual affinity mask assigned to the thread */ + + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_getaffinity_np"); + exit_fun("Error getting processor affinity "); + } + memset(cpu_affinity,0,sizeof(cpu_affinity)); + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) + { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + memset(&sparam, 0 , sizeof (sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; + policy = SCHED_FIFO ; + + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) + { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) + { + perror("pthread_getschedparam : "); + exit_fun("Error getting thread priority"); + + } + + LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", proc->subframe, sched_getcpu(),gettid(), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, cpu_affinity ); + + +#endif //LOW_LATENCY + + + mlockall(MCL_CURRENT | MCL_FUTURE); + + while (!oai_exit) { + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 0 ); + + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe ); + exit_fun("nothing to add"); + break; + } + + while (proc->instance_cnt_tx < 0) { + // most of the time the thread is waiting here + // proc->instance_cnt_tx is -1 + pthread_cond_wait( &proc->cond_tx, &proc->mutex_tx ); // this unlocks mutex_tx while waiting and then locks it again + } + + if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); + exit_fun("nothing to add"); + break; + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 1 ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); + start_meas( &softmodem_stats_tx_sf[proc->subframe] ); + + if (oai_exit) break; + + if (((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD) && + ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_DL) || + (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_S))) || + (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD)) { + /* run PHY TX procedures the one after the other for all CCs to avoid race conditions + * (may be relaxed in the future for performance reasons) + */ + if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe); + exit_fun("nothing to add"); + break; + } + /* wait for our turn or oai_exit */ + while (sync_phy_proc[proc->subframe].phy_proc_CC_id != proc->CC_id && !oai_exit) { + pthread_cond_wait(&sync_phy_proc[proc->subframe].cond_phy_proc_tx, + &sync_phy_proc[proc->subframe].mutex_phy_proc_tx); + } + + if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->subframe); + exit_fun("nothing to add"); + } + + if (oai_exit) + break; + + phy_procedures_eNB_TX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL ); + + /* we're done, let the next one proceed */ + if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe); + exit_fun("nothing to add"); + break; + } + sync_phy_proc[proc->subframe].phy_proc_CC_id++; + sync_phy_proc[proc->subframe].phy_proc_CC_id %= MAX_NUM_CCs; + pthread_cond_broadcast(&sync_phy_proc[proc->subframe].cond_phy_proc_tx); + if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->subframe); + exit_fun("nothing to add"); + break; + } + } + + do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); + /* + short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->lte_eNB_common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.samples_per_tti]; + int i; + for (i=0;iCC_id]->lte_frame_parms.samples_per_tti*2;i+=8) { + txdata[i] = 2047; + txdata[i+1] = 0; + txdata[i+2] = 0; + txdata[i+3] = 2047; + txdata[i+4] = -2047; + txdata[i+5] = 0; + txdata[i+6] = 0; + txdata[i+7] = -2047; + } + */ + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe ); + exit_fun("nothing to add"); + break; + } + + proc->instance_cnt_tx--; + + if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n", proc->subframe ); + exit_fun("nothing to add"); + break; + } + + proc->frame_tx++; + + if (proc->frame_tx==1024) + proc->frame_tx=0; + stop_meas( &softmodem_stats_tx_sf[proc->subframe] ); +#ifdef LOWLATENCY + if (opp_enabled){ + if(softmodem_stats_tx_sf[proc->subframe].diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf[proc->subframe].diff_now/cpuf - attr.sched_runtime)/1000000.0); + } + } +#endif + print_meas_now(&softmodem_stats_tx_sf[proc->subframe],"eNB_TX_SF",proc->subframe, tx_time_file); + + } + + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 0 ); + +#ifdef DEBUG_THREADS + printf( "Exiting eNB thread TX %d\n", proc->subframe ); +#endif + + eNB_thread_tx_status[proc->subframe] = 0; + return &eNB_thread_tx_status[proc->subframe]; +} + + +/*! + * \brief The receive thread of eNB. + * \ref NUM_ENB_THREADS threads of this type are active at the same time. + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread_rx( void* param ) +{ + static int eNB_thread_rx_status[NUM_ENB_THREADS]; + + eNB_proc_t *proc = (eNB_proc_t*)param; + + FILE *rx_time_file = NULL; + char rx_time_name[101]; + //int i; + + if (opp_enabled == 1){ + snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf_%d", "eNB", proc->subframe); + rx_time_file = fopen(rx_time_name,"w"); + } + // set default return value + eNB_thread_rx_status[proc->subframe] = 0; + + MSC_START_USE(); + +#ifdef LOWLATENCY + struct sched_attr attr; + unsigned int flags = 0; + uint64_t runtime = 870000 ; + uint64_t deadline = 1 * 1000000; + uint64_t period = 1 * 10000000; // each rx thread has a period of 10ms from the starting point + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = runtime; + attr.sched_deadline = deadline; + attr.sched_period = period; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] eNB RX sched_setattr failed\n"); + return &eNB_thread_rx_status[proc->subframe]; + } + + LOG_I( HW, "[SCHED] eNB RX deadline thread %d(TID %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() ); +#else // LOW_LATENCY + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD */ + /* CPU 1 is reserved for all TX threads */ + /* CPU 2..MAX_CPUS is reserved for all RX threads */ + /* Set CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); +#ifdef CPU_AFFINITY + if (get_nprocs() >2) + { + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun (" Error setting processor affinity :"); + } + } +#endif //CPU_AFFINITY + /* Check the actual affinity mask assigned to the thread */ + + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror ("pthread_getaffinity_np"); + exit_fun (" Error getting processor affinity :"); + } + memset(cpu_affinity,0, sizeof(cpu_affinity)); + + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) + { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + + memset(&sparam, 0 , sizeof (sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; + + policy = SCHED_FIFO ; + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) + { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + + memset(&sparam, 0 , sizeof (sparam)); + + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) + { + perror("pthread_getschedparam"); + exit_fun("Error getting thread priority"); + } + + + LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->subframe, sched_getcpu(),gettid(), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, cpu_affinity); + + +#endif // LOWLATENCY + + mlockall(MCL_CURRENT | MCL_FUTURE); + + + while (!oai_exit) { + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 0 ); + + if (pthread_mutex_lock(&proc->mutex_rx) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RX proc %d\n", proc->subframe ); + exit_fun( "error locking mutex" ); + break; + } + + while (proc->instance_cnt_rx < 0) { + // most of the time the thread is waiting here + // proc->instance_cnt_rx is -1 + pthread_cond_wait( &proc->cond_rx, &proc->mutex_rx ); // this unlocks mutex_rx while waiting and then locks it again + } + + if (pthread_mutex_unlock(&proc->mutex_rx) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->subframe ); + exit_fun( "error unlocking mutex" ); + break; + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 1 ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + start_meas( &softmodem_stats_rx_sf[proc->subframe] ); + + if (oai_exit) break; + + if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD )&&(subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx)==SF_UL)) || + (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { + + phy_procedures_eNB_RX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); + } + + if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx) == SF_S)) { + phy_procedures_eNB_S_RX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); + } + + if (pthread_mutex_lock(&proc->mutex_rx) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RX proc %d\n", proc->subframe ); + exit_fun( "error locking mutex" ); + break; + } + + proc->instance_cnt_rx--; + + if (pthread_mutex_unlock(&proc->mutex_rx) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->subframe ); + exit_fun( "error unlocking mutex" ); + break; + } + + proc->frame_rx++; + + if (proc->frame_rx==1024) + proc->frame_rx=0; + + stop_meas( &softmodem_stats_rx_sf[proc->subframe] ); +#ifdef LOWLATENCY + if (opp_enabled){ + if(softmodem_stats_rx_sf[proc->subframe].diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf[proc->subframe].diff_now/cpuf - attr.sched_runtime)/1000000.0); + } + } +#endif // LOWLATENCY + print_meas_now(&softmodem_stats_rx_sf[proc->subframe],"eNB_RX_SF",proc->subframe, rx_time_file); + } + + //stop_meas( &softmodem_stats_rx_sf[proc->subframe] ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 0 ); + + +#ifdef DEBUG_THREADS + printf( "Exiting eNB thread RX %d\n", proc->subframe ); +#endif + + eNB_thread_rx_status[proc->subframe] = 0; + return &eNB_thread_rx_status[proc->subframe]; +} + + + + +void init_eNB_proc(void) +{ + int i; + int CC_id; + + for (CC_id=0; CC_idproc[i].instance_cnt_tx = -1; + PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx = -1; + PHY_vars_eNB_g[0][CC_id]->proc[i].subframe = i; + PHY_vars_eNB_g[0][CC_id]->proc[i].CC_id = CC_id; + pthread_mutex_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx, NULL); + pthread_mutex_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx, NULL); + pthread_cond_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx, NULL); + pthread_cond_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx, NULL); +#ifndef LOWLATENCY + pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, &attr_eNB_proc_tx[CC_id][i], eNB_thread_tx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); + pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, &attr_eNB_proc_rx[CC_id][i], eNB_thread_rx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); +#else + pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, NULL, eNB_thread_tx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); + pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, NULL, eNB_thread_rx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); +#endif + char name[16]; + snprintf( name, sizeof(name), "TX %d", i ); + pthread_setname_np( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, name ); + snprintf( name, sizeof(name), "RX %d", i ); + pthread_setname_np( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, name ); + PHY_vars_eNB_g[0][CC_id]->proc[i].frame_tx = 0; + PHY_vars_eNB_g[0][CC_id]->proc[i].frame_rx = 0; + PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_rx = i; + PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_tx = (i+2)%10; + } + + + + // TX processes subframe +2, RX subframe + // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 8,9 and 0 have to start with frame 1 + // PHY_vars_eNB_g[0][CC_id]->proc[7].frame_tx = 1; + PHY_vars_eNB_g[0][CC_id]->proc[8].frame_tx = 1; + PHY_vars_eNB_g[0][CC_id]->proc[9].frame_tx = 1; + // PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1; + } + + /* setup PHY proc TX sync mechanism */ + for (i=0; iproc[i].instance_cnt_tx = 0; // FIXME data race! + pthread_cond_signal( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx ); + pthread_cond_broadcast(&sync_phy_proc[i].cond_phy_proc_tx); + +#ifdef DEBUG_THREADS + printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i ); +#endif + int result = pthread_join( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, (void**)&status ); + +#ifdef DEBUG_THREADS + + if (result != 0) { + printf( "Error joining thread.\n" ); + } else { + if (status) { + printf( "status %d\n", *status ); + } else { + printf( "The thread was killed. No status available.\n" ); + } + } + +#else + UNUSED(result) +#endif + +#ifdef DEBUG_THREADS + printf( "Killing RX CC_id %d thread %d\n", CC_id, i ); +#endif + + PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx = 0; // FIXME data race! + pthread_cond_signal( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx ); + +#ifdef DEBUG_THREADS + printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i ); +#endif + result = pthread_join( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, (void**)&status ); + +#ifdef DEBUG_THREADS + + if (result != 0) { + printf( "Error joining thread.\n" ); + } else { + if (status) { + printf( "status %d\n", *status ); + } else { + printf( "The thread was killed. No status available.\n" ); + } + } + +#else + UNUSED(result) +#endif + + pthread_mutex_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx ); + pthread_mutex_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx ); + pthread_cond_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx ); + pthread_cond_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx ); + } +} + + +/* this function maps the phy_vars_eNB tx and rx buffers to the available rf chains. + Each rf chain is is addressed by the card number and the chain on the card. The + rf_map specifies for each CC, on which rf chain the mapping should start. Multiple + antennas are mapped to successive RF chains on the same card. */ +int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) +{ + + int i, CC_id; +#ifndef EXMIMO + uint16_t N_TA_offset = 0; +#else + int j; +#endif + LTE_DL_FRAME_PARMS *frame_parms; + + + for (CC_id=0; CC_idlte_frame_parms); + printf("setup_eNB_buffers: frame_parms = %p\n",frame_parms); + } else { + printf("phy_vars_eNB[%d] not initialized\n", CC_id); + return(-1); + } + +#ifndef EXMIMO + + if (frame_parms->frame_type == TDD) { + if (frame_parms->N_RB_DL == 100) + N_TA_offset = 624; + else if (frame_parms->N_RB_DL == 50) + N_TA_offset = 624/2; + else if (frame_parms->N_RB_DL == 25) + N_TA_offset = 624/4; + } + +#endif + + // replace RX signal buffers with mmaped HW versions +#ifdef EXMIMO + openair0_cfg[CC_id].tx_num_channels = 0; + openair0_cfg[CC_id].rx_num_channels = 0; + + for (i=0; inb_antennas_rx; i++) { + printf("Mapping eNB CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); + free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); + phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i]; + + if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) { + printf("Error with rf_map! A channel has already been allocated!\n"); + return(-1); + } else { + openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; + openair0_cfg[rf_map[CC_id].card].rx_gain[rf_map[CC_id].chain+i] = rx_gain[CC_id][i]; + openair0_cfg[rf_map[CC_id].card].rx_num_channels++; + } + + printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); + + for (j=0; j<16; j++) { + printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j]); + phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j] = 16-j; + } + } + + for (i=0; inb_antennas_tx; i++) { + printf("Mapping eNB CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); + free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); + phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; + + if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) { + printf("Error with rf_map! A channel has already been allocated!\n"); + return(-1); + } else { + openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]; + openair0_cfg[rf_map[CC_id].card].tx_gain[rf_map[CC_id].chain+i] = tx_gain[CC_id][i]; + openair0_cfg[rf_map[CC_id].card].tx_num_channels++; + } + + printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); + + for (j=0; j<16; j++) { + printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j]); + phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j] = 16-j; + } + } + +#else // not EXMIMO + rxdata = (int32_t**)malloc16(frame_parms->nb_antennas_rx*sizeof(int32_t*)); + txdata = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); + + for (i=0; inb_antennas_rx; i++) { + free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); + rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation + phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory + memset(rxdata[i], 0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); + printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i],rxdata[i],N_TA_offset); + + } + + for (i=0; inb_antennas_tx; i++) { + free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); + txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation + phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = txdata[i]; + memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); + printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); + + } + +#endif + } + + return(0); +} + + +#if defined(ENABLE_ITTI) +static void wait_system_ready (char *message, volatile int *start_flag) +{ + /* Wait for eNB application initialization to be complete (eNB registration to MME) */ + { + static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", + " ....", " ...", " ..", " .", " " + }; + int i = 0; + + while ((!oai_exit) && (*start_flag == 0)) { + LOG_N(EMU, message, indicator[i]); + fflush(stdout); + i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); + usleep(200000); + } + + LOG_D(EMU,"\n"); + } +} +#endif + +/*! + * \brief This is the main eNB thread. + * \param arg unused + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread( void* arg ) +{ + UNUSED(arg); + static int eNB_thread_status; + + unsigned char slot; + // the USRP implementation operates on subframes, not slots + // one subframe consists of one even and one odd slot + slot = 1; + int spp; + int tx_launched = 0; + int card=0; + + void *rxp[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_rx + void *txp[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_tx + + int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9 + + unsigned int rx_pos = 0; + unsigned int tx_pos = 0; + + int CC_id=0; + struct timespec trx_time0, trx_time1, trx_time2; + + /* avoid gcc warnings */ + (void)trx_time0; + (void)trx_time1; + (void)trx_time2; + +#ifdef LOWLATENCY + struct sched_attr attr; + unsigned int flags = 0; + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + /* This creates a .2 ms reservation */ + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = (0.3 * 100) * 10000; + attr.sched_deadline = (0.9 * 100) * 10000; + attr.sched_period = 1 * 1000000; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] main eNB thread: sched_setattr failed\n"); + exit_fun("Nothing to add"); + } else { + LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", + gettid(),sched_getcpu()); + } + +#else + + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD threads */ + CPU_ZERO(&cpuset); +#ifdef CPU_AFFINITY + if (get_nprocs() >2) + { + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun("Error setting processor affinity"); + } + } +#endif // CPU_AFFINITY + + /* Check the actual affinity mask assigned to the thread */ + + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_getaffinity_np"); + exit_fun("Error getting processor affinity "); + } + memset(cpu_affinity, 0 , sizeof(cpu_affinity)); + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) + { + char temp[1024]; + sprintf(temp, " CPU_%d ", j); + strcat(cpu_affinity, temp); + } + + memset(&sparam, 0 , sizeof (sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); + policy = SCHED_FIFO ; + + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) + { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) + { + perror("pthread_getschedparam : "); + exit_fun("Error getting thread priority"); + + } + + + LOG_I( HW, "[SCHED][eNB] Started eNB main thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + (int) sparam.sched_priority, cpu_affinity); + + +#endif //LOWLATENCY + + + // stop early, if an exit is requested + // FIXME really neccessary? + if (oai_exit) + goto eNB_thread_cleanup; + + printf("eNB_thread: mlockall in ...\n"); + mlockall(MCL_CURRENT | MCL_FUTURE); + printf("eNB_thread: mlockall out ...\n"); + + timing_info.time_min = 100000000ULL; + timing_info.time_max = 0; + timing_info.time_avg = 0; + timing_info.n_samples = 0; + + printf( "waiting for sync (eNB_thread)\n" ); + pthread_mutex_lock( &sync_mutex ); + + while (sync_var<0) + pthread_cond_wait( &sync_cond, &sync_mutex ); + + pthread_mutex_unlock(&sync_mutex); + + printf( "got sync (eNB_thread)\n" ); + + int frame = 0; + + + spp = openair0_cfg[0].samples_per_packet; + tx_pos = openair0_cfg[0].tx_scheduling_advance; + +#if defined(ENABLE_ITTI) + wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); +#endif + + while (!oai_exit) { + start_meas( &softmodem_stats_mt ); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); + tx_launched = 0; + + while (rx_pos < ((1+hw_subframe)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti)) { + + unsigned int rxs; +#ifndef USRP_DEBUG + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TXCNT, tx_pos ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, rx_pos ); + + clock_gettime( CLOCK_MONOTONIC, &trx_time0 ); + + start_meas( &softmodem_stats_hw ); + + openair0_timestamp timestamp; + int i=0; + // prepare rx buffer pointers + for (i=0; ilte_frame_parms.nb_antennas_rx; i++) + rxp[i] = (void*)&rxdata[i][rx_pos]; + // check if nsymb_read == spp + // map antenna port i to the cc_id. Now use the 1:1 mapping + rxs = openair0.trx_read_func(&openair0, + ×tamp, + rxp, + spp, + PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx); + + stop_meas( &softmodem_stats_hw ); + if (frame > 50) { + clock_gettime( CLOCK_MONOTONIC, &trx_time1 ); + } + + if (frame > 20){ + if (rxs != spp) + exit_fun( "problem receiving samples" ); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + + // Transmit TX buffer based on timestamp from RX + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + for (i=0; ilte_frame_parms.nb_antennas_tx; i++) + txp[i] = (void*)&txdata[i][tx_pos]; + // if symb_written < spp ==> error + if (frame > 50) { + openair0.trx_write_func(&openair0, + (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance), + txp, + spp, + PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx, + 1); + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, timestamp&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance)&0xffffffff ); + + stop_meas( &softmodem_stats_mt ); + if (frame > 50) { + clock_gettime( CLOCK_MONOTONIC, &trx_time2 ); + //update_difftimes(trx_time1, trx_time2); + } + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0); +#else + // USRP_DEBUG is active + rt_sleep_ns(1000000); +#endif + /* FT configurable tx lauch delay (in slots): txlaunch_wait, txlaunch_wait_slotcount is device specific and + set in the corresponding library (with txlaunch_wait=1 and txlaunch_wait_slotcount=1 the check is as it previously was) */ + /* old check: + if ((frame>50) && + (tx_launched == 0) && + (rx_pos >= (((2*hw_subframe)+1)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))) {*/ + if ( (frame>50) && (tx_launched == 0) && + ((openair0_cfg[card].txlaunch_wait == 0) || + ((openair0_cfg[card].txlaunch_wait == 1) && + (rx_pos >= (((2*hw_subframe)+openair0_cfg[card].txlaunch_wait_slotcount)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))))) { + + tx_launched = 1; + + for (CC_id=0; CC_idproc[hw_subframe].mutex_tx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", hw_subframe, PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx ); + exit_fun( "error locking mutex_tx" ); + break; + } + + int cnt_tx = ++PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx; + + pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].mutex_tx ); + + if (cnt_tx == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].cond_tx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n", hw_subframe ); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, eNB TX thread %d busy!! (rx_cnt %u, cnt_tx %i)\n", PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].frame_tx, hw_subframe, rx_pos, cnt_tx ); + exit_fun( "TX thread busy" ); + break; + } + } + } + + rx_pos += spp; + tx_pos += spp; + + if (tx_pos >= openair0_cfg[card].samples_per_frame) + tx_pos -= openair0_cfg[card].samples_per_frame; + } + + if (rx_pos >= openair0_cfg[card].samples_per_frame) + rx_pos -= openair0_cfg[card].samples_per_frame; + + + + if (oai_exit) break; + + timing_info.time_last = timing_info.time_now; + timing_info.time_now = rt_get_time_ns(); + + if (timing_info.n_samples>0) { + RTIME time_diff = timing_info.time_now - timing_info.time_last; + + if (time_diff < timing_info.time_min) + timing_info.time_min = time_diff; + + if (time_diff > timing_info.time_max) + timing_info.time_max = time_diff; + + timing_info.time_avg += time_diff; + } + + timing_info.n_samples++; + + if ((slot&1) == 1) { + // odd slot + int sf = hw_subframe; + if (frame>50) { + for (int CC_id=0; CC_idproc[sf].mutex_rx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n", sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx ); + exit_fun( "error locking mutex_rx" ); + break; + } + + int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx; + + pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx ); + + if (cnt_rx == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_rx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n", sf ); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } + } else { + LOG_W( PHY, "[eNB] Frame %d, eNB RX thread %d busy!! instance_cnt %d CC_id %d\n", PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx, sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx, CC_id ); + exit_fun( "RX thread busy" ); + break; + } + } + } + } + + hw_subframe++; + slot += 2; + + if (hw_subframe == NUM_ENB_THREADS) { + // the radio frame is complete, start over + hw_subframe = 0; + frame++; + slot = 1; + } + +#if defined(ENABLE_ITTI) + itti_update_lte_time( frame, slot ); +#endif + } + +eNB_thread_cleanup: +#ifdef DEBUG_THREADS + printf( "eNB_thread: finished, ran %d times.\n", frame ); +#endif + +#ifdef DEBUG_THREADS + printf( "Exiting eNB_thread ..." ); +#endif + + eNB_thread_status = 0; + + // print_difftimes(); + + return &eNB_thread_status; +} + +void reset_opp_meas(void) { + int sfn; + reset_meas(&softmodem_stats_mt); + reset_meas(&softmodem_stats_hw); + + for (sfn=0; sfn < 10; sfn++) { + reset_meas(&softmodem_stats_tx_sf[sfn]); + reset_meas(&softmodem_stats_rx_sf[sfn]); + } +} + +void print_opp_meas(void) { + + int sfn=0; + print_meas(&softmodem_stats_mt, "Main ENB Thread", NULL, NULL); + print_meas(&softmodem_stats_hw, "HW Acquisation", NULL, NULL); + + for (sfn=0; sfn < 10; sfn++) { + print_meas(&softmodem_stats_tx_sf[sfn],"[eNB][total_phy_proc_tx]",NULL, NULL); + print_meas(&softmodem_stats_rx_sf[sfn],"[eNB][total_phy_proc_rx]",NULL,NULL); + } +} + + +void init_eNB() { + + int error_code; + + pthread_attr_init (&attr_dlsch_threads); + pthread_attr_setstacksize(&attr_dlsch_threads,4*PTHREAD_STACK_MIN); + +#ifndef LOWLATENCY + sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&attr_dlsch_threads, &sched_param_dlsch); + pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); + printf("Setting eNB_thread FIFO scheduling policy with priority %d \n", sched_param_dlsch.sched_priority); +#endif + + init_eNB_proc(); + sleep(1); + LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); + + + printf("Creating main eNB_thread \n"); + error_code = pthread_create( &main_eNB_thread, &attr_dlsch_threads, eNB_thread, NULL ); + + if (error_code!= 0) { + LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code); + } else { + LOG_D( HW, "[lte-softmodem.c] Allocate eNB_thread successful\n" ); + pthread_setname_np( main_eNB_thread, "main eNB" ); + } +} + + +void stop_eNB() { + +#ifdef DEBUG_THREADS + printf("Joining eNB_thread ..."); +#endif + int *eNB_thread_status_p; + int result = pthread_join( main_eNB_thread, (void**)&eNB_thread_status_p ); +#ifdef DEBUG_THREADS + + if (result != 0) { + printf( "\nError joining main_eNB_thread.\n" ); + } else { + if (eNB_thread_status_p) { + printf( "status %d\n", *eNB_thread_status_p ); + } else { + printf( "The thread was killed. No status available.\n"); + } + } + +#else + UNUSED(result); +#endif // DEBUG_THREADS + + printf("Killing eNB processing threads\n"); + kill_eNB_proc(); +} diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index b6c3e20464..4664b0aa21 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -27,8 +27,8 @@ *******************************************************************************/ -/*! \file lte-softmodem.c - * \brief main program to control HW and scheduling +/*! \file lte-enb.c + * \brief Top-level threads for eNodeB * \author R. Knopp, F. Kaltenberger, Navid Nikaein * \date 2012 * \version 0.1 @@ -58,22 +58,13 @@ #include "assertions.h" #include "msc.h" -#ifdef EMOS -#include -struct gps_fix_t dummy_gps_data; -#endif - #include "PHY/types.h" #include "PHY/defs.h" #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all -#ifdef EXMIMO -#include "openair0_lib.h" -#else #include "../../ARCH/COMMON/common_lib.h" -#endif //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all @@ -83,10 +74,6 @@ struct gps_fix_t dummy_gps_data; #include "../../SIMU/USER/init_lte.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif - #include "LAYER2/MAC/defs.h" #include "LAYER2/MAC/vars.h" #include "LAYER2/MAC/proto.h" @@ -126,32 +113,10 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "stats.h" #endif -#define FRAME_PERIOD 100000000ULL -#define DAQ_PERIOD 66667ULL - -//#define DEBUG_THREADS 1 - -//#define USRP_DEBUG 1 - -struct timing_info_t { - //unsigned int frame, hw_slot, last_slot, next_slot; - RTIME time_min, time_max, time_avg, time_last, time_now; - //unsigned int mbox0, mbox1, mbox2, mbox_target; - unsigned int n_samples; -} timing_info; - - - -openair0_config_t openair0_cfg[MAX_CARDS]; - -int32_t **rxdata; -int32_t **txdata; -int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); - -uint16_t runtime_phy_rx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] -uint16_t runtime_phy_tx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] -double cpuf; +int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); +extern void init_eNB(void); +extern void stop_eNB(void); void fill_ue_band_info(void); #ifdef XFORMS @@ -164,22 +129,13 @@ char title[255]; unsigned char scope_enb_num_ue = 2; #endif //XFORMS -#ifdef RTAI -static long main_eNB_thread; -static long main_ue_thread; - -#else -pthread_t main_eNB_thread; pthread_t main_ue_thread; -pthread_attr_t attr_dlsch_threads; pthread_attr_t attr_UE_thread; -#ifndef LOWLATENCY -struct sched_param sched_param_dlsch; -#endif -#endif + + pthread_cond_t sync_cond; pthread_mutex_t sync_mutex; @@ -190,43 +146,24 @@ int sync_var=-1; //!< protected by mutex \ref sync_mutex. struct sched_param sched_param_UE_thread; -pthread_attr_t attr_eNB_proc_tx[MAX_NUM_CCs][NUM_ENB_THREADS]; -pthread_attr_t attr_eNB_proc_rx[MAX_NUM_CCs][NUM_ENB_THREADS]; -#ifndef LOWLATENCY -struct sched_param sched_param_eNB_proc_tx[MAX_NUM_CCs][NUM_ENB_THREADS]; -struct sched_param sched_param_eNB_proc_rx[MAX_NUM_CCs][NUM_ENB_THREADS]; -#endif + #ifdef XFORMS static pthread_t forms_thread; //xforms #endif -#ifdef EMOS -static pthread_t thread3; //emos -static pthread_t thread4; //GPS -#endif openair0_device openair0; - -/* - static int instance_cnt=-1; //0 means worker is busy, -1 means its free - int instance_cnt_ptr_kern,*instance_cnt_ptr_user; - int pci_interface_ptr_kern; -*/ -//extern unsigned int bigphys_top; -//extern unsigned int mem_base; - -//int card = 0; +uint16_t runtime_phy_rx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] +uint16_t runtime_phy_tx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] #if defined(ENABLE_ITTI) -static volatile int start_eNB = 0; -static volatile int start_UE = 0; +volatile int start_eNB = 0; +volatile int start_UE = 0; #endif volatile int oai_exit = 0; -//static int time_offset[4] = {-138,-138,-138,-138}; -//static int time_offset[4] = {-145,-145,-145,-145}; -static int time_offset[4] = {0,0,0,0}; + static char UE_flag=0; @@ -251,37 +188,18 @@ runmode_t mode = normal_txrx; FILE *input_fd=NULL; -#ifdef EXMIMO -#if MAX_NUM_CCs == 1 -double tx_gain[MAX_NUM_CCs][4] = {{20,20,0,0}}; -double rx_gain[MAX_NUM_CCs][4] = {{20,20,0,0}}; -#else -double tx_gain[MAX_NUM_CCs][4] = {{20,20,0,0},{20,20,0,0}}; -double rx_gain[MAX_NUM_CCs][4] = {{20,20,0,0},{20,20,0,0}}; -#endif -// these are for EXMIMO2 target only -/* - static unsigned int rxg_max[4] = {133,133,133,133}; - static unsigned int rxg_med[4] = {127,127,127,127}; - static unsigned int rxg_byp[4] = {120,120,120,120}; - */ -// these are for EXMIMO2 card 39 -unsigned int rxg_max[4] = {128,128,128,126}; -unsigned int rxg_med[4] = {122,123,123,120}; -unsigned int rxg_byp[4] = {116,117,116,116}; -unsigned int nf_max[4] = {7,9,16,12}; -unsigned int nf_med[4] = {12,13,22,17}; -unsigned int nf_byp[4] = {15,20,29,23}; #if MAX_NUM_CCs == 1 rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}}; -#else -rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain},{max_gain,max_gain,max_gain,max_gain}}; -#endif -#else double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0}}; double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0}}; +#else +rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain},{max_gain,max_gain,max_gain,max_gain}}; +double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0},{20,0,0,0}}; +double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,0,0}}; #endif + + double sample_rate=30.72e6; double bw = 10.0e6; @@ -292,12 +210,10 @@ char rf_config_file[1024]; int chain_offset=0; int phy_test = 0; -#ifndef EXMIMO + char ref[128] = "internal"; char channels[128] = "0"; -#endif - int rx_input_level_dBm; static int online_log_messages=0; #ifdef XFORMS @@ -307,14 +223,11 @@ static char do_forms=0; int otg_enabled; #endif //int number_of_cards = 1; -#ifdef EXMIMO -static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers -//static int mbox_bounds[20] = {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers -#endif + static LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; -int multi_thread=1; + uint32_t target_dl_mcs = 28; //maximum allowed mcs uint32_t target_ul_mcs = 20; uint32_t timing_advance = 0; @@ -322,12 +235,9 @@ uint8_t exit_missed_slots=1; uint64_t num_missed_slots=0; // counter for the number of missed slots -time_stats_t softmodem_stats_mt; // main thread -time_stats_t softmodem_stats_hw; // hw acquisition -time_stats_t softmodem_stats_tx_sf[10]; // total tx time -time_stats_t softmodem_stats_rx_sf[10]; // total rx time -void reset_opp_meas(void); -void print_opp_meas(void); + +extern void reset_opp_meas(void); +extern void print_opp_meas(void); int transmission_mode=1; int16_t glog_level = LOG_INFO; @@ -369,9 +279,14 @@ uint8_t local_remote_radio = BBU_LOCAL_RADIO_HEAD; /* struct for ethernet specific parameters given in eNB conf file */ eth_params_t *eth_params; +openair0_config_t openair0_cfg[MAX_CARDS]; + +double cpuf; + char uecap_xer[1024],uecap_xer_in=0; extern void *UE_thread(void *arg); extern void init_UE_threads(void); +extern void kill_eNB_proc(void); /*---------------------BMC: timespec helpers -----------------------------*/ @@ -486,6 +401,7 @@ void help (void) { printf(" -x Set the transmission mode, valid options: 1 \n"RESET); } + void exit_fun(const char* s) { if (s != NULL) { @@ -499,9 +415,6 @@ void exit_fun(const char* s) itti_terminate_tasks (TASK_UNKNOWN); #endif - //rt_sleep_ns(FRAME_PERIOD); - - //exit (-1); } @@ -634,227 +547,8 @@ static void *scope_thread(void *arg) } #endif -#ifdef EMOS -#define NO_ESTIMATES_DISK 100 //No. of estimates that are aquired before dumped to disk - -void* gps_thread (void *arg) -{ - - struct gps_data_t gps_data; - struct gps_data_t *gps_data_ptr = &gps_data; - struct sched_param sched_param; - int ret; - - sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1; - sched_setscheduler(0, SCHED_FIFO,&sched_param); - - printf("GPS thread has priority %d\n",sched_param.sched_priority); - - memset(&dummy_gps_data,0,sizeof(struct gps_fix_t)); - -#if GPSD_API_MAJOR_VERSION>=5 - ret = gps_open("127.0.0.1","2947",gps_data_ptr); - - if (ret!=0) -#else - gps_data_ptr = gps_open("127.0.0.1","2947"); - - if (gps_data_ptr == NULL) -#endif - { - printf("[EMOS] Could not open GPS\n"); - pthread_exit((void*)arg); - } - -#if GPSD_API_MAJOR_VERSION>=4 - else if (gps_stream(gps_data_ptr, WATCH_ENABLE,NULL) != 0) -#else - else if (gps_query(gps_data_ptr, "w+x") != 0) -#endif - { - printf("[EMOS] Error sending command to GPS\n"); - pthread_exit((void*) arg); - } else - printf("[EMOS] Opened GPS, gps_data=%p\n", gps_data_ptr); - while (!oai_exit) { - printf("[EMOS] polling data from gps\n"); -#if GPSD_API_MAJOR_VERSION>=5 - - if (gps_waiting(gps_data_ptr,500)) { - if (gps_read(gps_data_ptr) <= 0) { -#else - - if (gps_waiting(gps_data_ptr)) { - if (gps_poll(gps_data_ptr) != 0) { -#endif - printf("[EMOS] problem polling data from gps\n"); - } else { - memcpy(&dummy_gps_data,&(gps_data_ptr->fix),sizeof(struct gps_fix_t)); - printf("[EMOS] lat %g, lon %g\n",gps_data_ptr->fix.latitude,gps_data_ptr->fix.longitude); - } - } //gps_waiting - else { - printf("[EMOS] WARNING: No GPS data available, storing dummy packet\n"); - } - - //rt_sleep_ns(1000000000LL); - sleep(1); - } //oai_exit - - pthread_exit((void*) arg); - -} - -void *emos_thread (void *arg) -{ - char c; - char *fifo2file_buffer, *fifo2file_ptr; - - int fifo, counter=0, bytes; - - FILE *dumpfile_id; - char dumpfile_name[1024]; - time_t starttime_tmp; - struct tm starttime; - - int channel_buffer_size,ret; - - time_t timer; - struct tm *now; - - struct sched_param sched_param; - - sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - sched_setscheduler(0, SCHED_FIFO,&sched_param); - - printf("EMOS thread has priority %d\n",sched_param.sched_priority); - - timer = time(NULL); - now = localtime(&timer); - - if (UE_flag==0) - channel_buffer_size = sizeof(fifo_dump_emos_eNB); - else - channel_buffer_size = sizeof(fifo_dump_emos_UE); - - // allocate memory for NO_FRAMES_DISK channes estimations - fifo2file_buffer = malloc(NO_ESTIMATES_DISK*channel_buffer_size); - fifo2file_ptr = fifo2file_buffer; - - if (fifo2file_buffer == NULL) { - printf("[EMOS] Cound not allocate memory for fifo2file_buffer\n"); - exit(EXIT_FAILURE); - } - - if ((fifo = open(CHANSOUNDER_FIFO_DEV, O_RDONLY)) < 0) { - fprintf(stderr, "[EMOS] Error opening the fifo\n"); - exit(EXIT_FAILURE); - } - - - time(&starttime_tmp); - localtime_r(&starttime_tmp,&starttime); - snprintf(dumpfile_name,1024,"/tmp/%s_data_%d%02d%02d_%02d%02d%02d.EMOS", - (UE_flag==0) ? "eNB" : "UE", - 1900+starttime.tm_year, starttime.tm_mon+1, starttime.tm_mday, starttime.tm_hour, starttime.tm_min, starttime.tm_sec); - - dumpfile_id = fopen(dumpfile_name,"w"); - - if (dumpfile_id == NULL) { - fprintf(stderr, "[EMOS] Error opening dumpfile %s\n",dumpfile_name); - exit(EXIT_FAILURE); - } - - - printf("[EMOS] starting dump, channel_buffer_size=%d, fifo %d\n",channel_buffer_size,fifo); - - while (!oai_exit) { - /* - bytes = rtf_read_timed(fifo, fifo2file_ptr, channel_buffer_size,100); - if (bytes==0) - continue; - */ - bytes = rtf_read_all_at_once(fifo, fifo2file_ptr, channel_buffer_size); - - if (bytes<=0) { - usleep(100); - continue; - } - - if (bytes != channel_buffer_size) { - printf("[EMOS] ERROR! Only got %d bytes instead of %d!\n",bytes,channel_buffer_size); - } - - /* - if (UE_flag==0) - printf("eNB: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_eNB*)fifo2file_ptr)->frame_tx,bytes); - else - printf("UE: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_UE*)fifo2file_ptr)->frame_rx,bytes); - */ - - fifo2file_ptr += channel_buffer_size; - counter ++; - - if (counter == NO_ESTIMATES_DISK) { - //reset stuff - fifo2file_ptr = fifo2file_buffer; - counter = 0; - - //flush buffer to disk - if (UE_flag==0) - printf("[EMOS] eNB: count %d, frame %d, flushing buffer to disk\n", - counter, ((fifo_dump_emos_eNB*)fifo2file_ptr)->frame_tx); - else - printf("[EMOS] UE: count %d, frame %d, flushing buffer to disk\n", - counter, ((fifo_dump_emos_UE*)fifo2file_ptr)->frame_rx); - - - if (fwrite(fifo2file_buffer, sizeof(char), NO_ESTIMATES_DISK*channel_buffer_size, dumpfile_id) != NO_ESTIMATES_DISK*channel_buffer_size) { - fprintf(stderr, "[EMOS] Error writing to dumpfile\n"); - exit(EXIT_FAILURE); - } - - if (fwrite(&dummy_gps_data, sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t)) { - printf("[EMOS] Error writing to dumpfile, stopping recording\n"); - exit(EXIT_FAILURE); - } - } - } - - free(fifo2file_buffer); - fclose(dumpfile_id); - close(fifo); - - pthread_exit((void*) arg); - -} -#endif - - - -#if defined(ENABLE_ITTI) -static void wait_system_ready (char *message, volatile int *start_flag) -{ - /* Wait for eNB application initialization to be complete (eNB registration to MME) */ - { - static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", - " ....", " ...", " ..", " .", " " - }; - int i = 0; - - while ((!oai_exit) && (*start_flag == 0)) { - LOG_N(EMU, message, indicator[i]); - fflush(stdout); - i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); - usleep(200000); - } - - LOG_D(EMU,"\n"); - } -} -#endif #if defined(ENABLE_ITTI) void *l2l1_task(void *arg) @@ -935,1347 +629,9 @@ void *l2l1_task(void *arg) #endif -void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) -{ - unsigned int aa,slot_offset, slot_offset_F; - int dummy_tx_b[7680*4] __attribute__((aligned(32))); - int i, tx_offset; - int slot_sizeF = (phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)* - ((phy_vars_eNB->lte_frame_parms.Ncp==1) ? 6 : 7); - int len; - slot_offset_F = (subframe<<1)*slot_sizeF; - slot_offset = subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti; - - if ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_DL)|| - ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_S))) { - // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); - - - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - if (phy_vars_eNB->lte_frame_parms.Ncp == EXTENDED) { - PHY_ofdm_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F], - dummy_tx_b, - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size, - 6, - phy_vars_eNB->lte_frame_parms.nb_prefix_samples, - CYCLIC_PREFIX); - PHY_ofdm_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], - dummy_tx_b+(phy_vars_eNB->lte_frame_parms.samples_per_tti>>1), - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size, - 6, - phy_vars_eNB->lte_frame_parms.nb_prefix_samples, - CYCLIC_PREFIX); - } else { - normal_prefix_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F], - dummy_tx_b, - 7, - &(phy_vars_eNB->lte_frame_parms)); - // if S-subframe generate first slot only - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_DL) - normal_prefix_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], - dummy_tx_b+(phy_vars_eNB->lte_frame_parms.samples_per_tti>>1), - 7, - &(phy_vars_eNB->lte_frame_parms)); - } - - // if S-subframe generate first slot only - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_S) - len = phy_vars_eNB->lte_frame_parms.samples_per_tti>>1; - else - len = phy_vars_eNB->lte_frame_parms.samples_per_tti; - /* - for (i=0;ilte_frame_parms.samples_per_tti; - - if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti)) - tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; - - ((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[0] = ((short*)dummy_tx_b)[2*i]<lte_eNB_common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<lte_frame_parms,subframe) == SF_S) { - for (i=0; ilte_eNB_common_vars.txdata[0][aa][tx_offset++] = 0x00010001; - } - } - - if ((((phy_vars_eNB->lte_frame_parms.tdd_config==0) || - (phy_vars_eNB->lte_frame_parms.tdd_config==1) || - (phy_vars_eNB->lte_frame_parms.tdd_config==2) || - (phy_vars_eNB->lte_frame_parms.tdd_config==6)) && - (subframe==0)) || (subframe==5)) { - // turn on tx switch N_TA_offset before - //LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,phy_vars_eNB->N_TA_offset,slot_offset); - for (i=0; iN_TA_offset; i++) { - tx_offset = (int)slot_offset+time_offset[aa]+i-phy_vars_eNB->N_TA_offset/2; - if (tx_offset<0) - tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; - - if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti)) - tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; - - phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset] = 0x00000000; - } - } - } - } -} - -/* mutex, cond and variable to serialize phy proc TX calls - * (this mechanism may be relaxed in the future for better - * performances) - */ -static struct { - pthread_mutex_t mutex_phy_proc_tx; - pthread_cond_t cond_phy_proc_tx; - volatile uint8_t phy_proc_CC_id; -} sync_phy_proc[NUM_ENB_THREADS]; - -/*! - * \brief The transmit thread of eNB. - * \ref NUM_ENB_THREADS threads of this type are active at the same time. - * \param param is a \ref eNB_proc_t structure which contains the info what to process. - * \returns a pointer to an int. The storage is not on the heap and must not be freed. - */ -static void* eNB_thread_tx( void* param ) -{ - static int eNB_thread_tx_status[NUM_ENB_THREADS]; - - eNB_proc_t *proc = (eNB_proc_t*)param; - FILE *tx_time_file = NULL; - char tx_time_name[101]; - - if (opp_enabled == 1) { - snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->subframe); - tx_time_file = fopen(tx_time_name,"w"); - } - // set default return value - eNB_thread_tx_status[proc->subframe] = 0; - - MSC_START_USE(); - -#ifdef RTAI - RT_TASK *task; - char task_name[8]; - - sprintf(task_name,"TXC%dS%d",proc->CC_id,proc->subframe); - task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task == NULL) { - LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_TX thread_index %d (%s)!!!!\n",proc->subframe,task_name); - return 0; - } else { - LOG_I(PHY,"[SCHED][eNB] eNB TX thread CC %d SF %d started with id %p\n", - proc->CC_id, - proc->subframe, - task); - } - -#else -#ifdef LOWLATENCY - struct sched_attr attr; - unsigned int flags = 0; - uint64_t runtime = 850000 ; - uint64_t deadline = 1 * 1000000 ; // each tx thread will finish within 1ms - uint64_t period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = runtime; - attr.sched_deadline = deadline; - attr.sched_period = period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - return &eNB_thread_tx_status[proc->subframe]; - } - - LOG_I( HW, "[SCHED] eNB TX deadline thread %d(TID %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() ); -#else - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ - /* CPU 1 is reserved for all TX threads */ - /* Enable CPU Affinity only if number of CPUs >2 */ - CPU_ZERO(&cpuset); - - #ifdef CPU_AFFINITY - if (get_nprocs() > 2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } - #endif - - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity,0,sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", proc->subframe, sched_getcpu(),gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - sparam.sched_priority, cpu_affinity ); - - -#endif - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - while (!oai_exit) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 0 ); - - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe ); - exit_fun("nothing to add"); - break; - } - - while (proc->instance_cnt_tx < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_tx is -1 - pthread_cond_wait( &proc->cond_tx, &proc->mutex_tx ); // this unlocks mutex_tx while waiting and then locks it again - } - - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); - exit_fun("nothing to add"); - break; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); - start_meas( &softmodem_stats_tx_sf[proc->subframe] ); - - if (oai_exit) break; - - if (((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD) && - ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_DL) || - (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_S))) || - (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD)) { - /* run PHY TX procedures the one after the other for all CCs to avoid race conditions - * (may be relaxed in the future for performance reasons) - */ - if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - break; - } - /* wait for our turn or oai_exit */ - while (sync_phy_proc[proc->subframe].phy_proc_CC_id != proc->CC_id && !oai_exit) { - pthread_cond_wait(&sync_phy_proc[proc->subframe].cond_phy_proc_tx, - &sync_phy_proc[proc->subframe].mutex_phy_proc_tx); - } - - if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - } - - if (oai_exit) - break; - - phy_procedures_eNB_TX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL ); - - /* we're done, let the next one proceed */ - if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - break; - } - sync_phy_proc[proc->subframe].phy_proc_CC_id++; - sync_phy_proc[proc->subframe].phy_proc_CC_id %= MAX_NUM_CCs; - pthread_cond_broadcast(&sync_phy_proc[proc->subframe].cond_phy_proc_tx); - if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - break; - } - } - - do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); - /* - short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->lte_eNB_common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.samples_per_tti]; - int i; - for (i=0;iCC_id]->lte_frame_parms.samples_per_tti*2;i+=8) { - txdata[i] = 2047; - txdata[i+1] = 0; - txdata[i+2] = 0; - txdata[i+3] = 2047; - txdata[i+4] = -2047; - txdata[i+5] = 0; - txdata[i+6] = 0; - txdata[i+7] = -2047; - } - */ - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe ); - exit_fun("nothing to add"); - break; - } - - proc->instance_cnt_tx--; - - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n", proc->subframe ); - exit_fun("nothing to add"); - break; - } - - proc->frame_tx++; - - if (proc->frame_tx==1024) - proc->frame_tx=0; - stop_meas( &softmodem_stats_tx_sf[proc->subframe] ); -#ifdef LOWLATENCY - if (opp_enabled){ - if(softmodem_stats_tx_sf[proc->subframe].diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf[proc->subframe].diff_now/cpuf - attr.sched_runtime)/1000000.0); - } - } -#endif - print_meas_now(&softmodem_stats_tx_sf[proc->subframe],"eNB_TX_SF",proc->subframe, tx_time_file); - - } - - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 0 ); - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - -#ifdef DEBUG_THREADS - printf( "Exiting eNB thread TX %d\n", proc->subframe ); -#endif - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - - eNB_thread_tx_status[proc->subframe] = 0; - return &eNB_thread_tx_status[proc->subframe]; -} - - -/*! - * \brief The receive thread of eNB. - * \ref NUM_ENB_THREADS threads of this type are active at the same time. - * \param param is a \ref eNB_proc_t structure which contains the info what to process. - * \returns a pointer to an int. The storage is not on the heap and must not be freed. - */ -static void* eNB_thread_rx( void* param ) -{ - static int eNB_thread_rx_status[NUM_ENB_THREADS]; - - eNB_proc_t *proc = (eNB_proc_t*)param; - - FILE *rx_time_file = NULL; - char rx_time_name[101]; - //int i; - - if (opp_enabled == 1){ - snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf_%d", "eNB", proc->subframe); - rx_time_file = fopen(rx_time_name,"w"); - } - // set default return value - eNB_thread_rx_status[proc->subframe] = 0; - - MSC_START_USE(); - -#ifdef RTAI - RT_TASK *task; - char task_name[8]; - - sprintf(task_name,"RXC%1dS%1d",proc->CC_id,proc->subframe); - task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_RX thread_index %d (%s)!!!!\n",proc->subframe,task_name); - return 0; - } else { - LOG_I(PHY,"[SCHED][eNB] eNB RX thread CC_id %d SF %d started with id %p\n", /* on CPU %d*/ - proc->CC_id, - proc->subframe, - task); /*,rtai_cpuid()*/ - } - -#else -#ifdef LOWLATENCY - struct sched_attr attr; - unsigned int flags = 0; - uint64_t runtime = 870000 ; - uint64_t deadline = 1 * 1000000; - uint64_t period = 1 * 10000000; // each rx thread has a period of 10ms from the starting point - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = runtime; - attr.sched_deadline = deadline; - attr.sched_period = period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB RX sched_setattr failed\n"); - return &eNB_thread_rx_status[proc->subframe]; - } - - LOG_I( HW, "[SCHED] eNB RX deadline thread %d(TID %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() ); -#else - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD */ - /* CPU 1 is reserved for all TX threads */ - /* CPU 2..MAX_CPUS is reserved for all RX threads */ - /* Set CPU Affinity only if number of CPUs >2 */ - CPU_ZERO(&cpuset); - #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun (" Error setting processor affinity :"); - } - } - #endif - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror ("pthread_getaffinity_np"); - exit_fun (" Error getting processor affinity :"); - } - memset(cpu_affinity,0, sizeof(cpu_affinity)); - - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - - policy = SCHED_FIFO ; - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - - memset(&sparam, 0 , sizeof (sparam)); - - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam"); - exit_fun("Error getting thread priority"); - } - - -LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->subframe, sched_getcpu(),gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - sparam.sched_priority, cpu_affinity); - - -#endif -#endif // RTAI - - mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - while (!oai_exit) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 0 ); - - if (pthread_mutex_lock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error locking mutex" ); - break; - } - - while (proc->instance_cnt_rx < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_rx is -1 - pthread_cond_wait( &proc->cond_rx, &proc->mutex_rx ); // this unlocks mutex_rx while waiting and then locks it again - } - - if (pthread_mutex_unlock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error unlocking mutex" ); - break; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - start_meas( &softmodem_stats_rx_sf[proc->subframe] ); - - if (oai_exit) break; - - if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD )&&(subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx)==SF_UL)) || - (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { - - phy_procedures_eNB_RX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); - } - - if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx) == SF_S)) { - phy_procedures_eNB_S_RX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); - } - - if (pthread_mutex_lock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error locking mutex" ); - break; - } - - proc->instance_cnt_rx--; - - if (pthread_mutex_unlock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error unlocking mutex" ); - break; - } - - proc->frame_rx++; - - if (proc->frame_rx==1024) - proc->frame_rx=0; - - stop_meas( &softmodem_stats_rx_sf[proc->subframe] ); -#ifdef LOWLATENCY - if (opp_enabled){ - if(softmodem_stats_rx_sf[proc->subframe].diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf[proc->subframe].diff_now/cpuf - attr.sched_runtime)/1000000.0); - } - } -#endif - print_meas_now(&softmodem_stats_rx_sf[proc->subframe],"eNB_RX_SF",proc->subframe, rx_time_file); - } - - //stop_meas( &softmodem_stats_rx_sf[proc->subframe] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 0 ); - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - -#ifdef DEBUG_THREADS - printf( "Exiting eNB thread RX %d\n", proc->subframe ); -#endif - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - - eNB_thread_rx_status[proc->subframe] = 0; - return &eNB_thread_rx_status[proc->subframe]; -} - - - - -void init_eNB_proc(void) -{ - int i; - int CC_id; - - for (CC_id=0; CC_idproc[i].instance_cnt_tx = -1; - PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx = -1; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe = i; - PHY_vars_eNB_g[0][CC_id]->proc[i].CC_id = CC_id; - pthread_mutex_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx, NULL); - pthread_mutex_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx, NULL); - pthread_cond_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx, NULL); - pthread_cond_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx, NULL); -#ifndef LOWLATENCY - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, &attr_eNB_proc_tx[CC_id][i], eNB_thread_tx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, &attr_eNB_proc_rx[CC_id][i], eNB_thread_rx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); -#else - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, NULL, eNB_thread_tx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, NULL, eNB_thread_rx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); -#endif - char name[16]; - snprintf( name, sizeof(name), "TX %d", i ); - pthread_setname_np( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, name ); - snprintf( name, sizeof(name), "RX %d", i ); - pthread_setname_np( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, name ); - PHY_vars_eNB_g[0][CC_id]->proc[i].frame_tx = 0; - PHY_vars_eNB_g[0][CC_id]->proc[i].frame_rx = 0; -#ifdef EXMIMO - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_rx = (i+9)%10; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_tx = (i+1)%10; -#else - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_rx = i; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_tx = (i+2)%10; -#endif - } - - -#ifdef EXMIMO - // TX processes subframe + 1, RX subframe -1 - // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 9 and 0 have to start with frame 1 - - //PHY_vars_eNB_g[0][CC_id]->proc[0].frame_rx = 1023; - PHY_vars_eNB_g[0][CC_id]->proc[9].frame_tx = 1; - PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1; -#else - // TX processes subframe +2, RX subframe - // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 8,9 and 0 have to start with frame 1 - // PHY_vars_eNB_g[0][CC_id]->proc[7].frame_tx = 1; - PHY_vars_eNB_g[0][CC_id]->proc[8].frame_tx = 1; - PHY_vars_eNB_g[0][CC_id]->proc[9].frame_tx = 1; - // PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1; -#endif - } - - /* setup PHY proc TX sync mechanism */ - for (i=0; iproc[i].instance_cnt_tx = 0; // FIXME data race! - pthread_cond_signal( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx ); - pthread_cond_broadcast(&sync_phy_proc[i].cond_phy_proc_tx); - -#ifdef DEBUG_THREADS - printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i ); -#endif - int result = pthread_join( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, (void**)&status ); - -#ifdef DEBUG_THREADS - - if (result != 0) { - printf( "Error joining thread.\n" ); - } else { - if (status) { - printf( "status %d\n", *status ); - } else { - printf( "The thread was killed. No status available.\n" ); - } - } - -#else - UNUSED(result) -#endif - -#ifdef DEBUG_THREADS - printf( "Killing RX CC_id %d thread %d\n", CC_id, i ); -#endif - - PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx = 0; // FIXME data race! - pthread_cond_signal( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx ); - -#ifdef DEBUG_THREADS - printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i ); -#endif - result = pthread_join( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, (void**)&status ); - -#ifdef DEBUG_THREADS - - if (result != 0) { - printf( "Error joining thread.\n" ); - } else { - if (status) { - printf( "status %d\n", *status ); - } else { - printf( "The thread was killed. No status available.\n" ); - } - } - -#else - UNUSED(result) -#endif - - pthread_mutex_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx ); - pthread_mutex_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx ); - pthread_cond_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx ); - pthread_cond_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx ); - } -} - - - - - - -/*! - * \brief This is the main eNB thread. - * \param arg unused - * \returns a pointer to an int. The storage is not on the heap and must not be freed. - */ -static void* eNB_thread( void* arg ) -{ - UNUSED(arg); - static int eNB_thread_status; - - unsigned char slot; -#ifdef EXMIMO - slot=0; - RTIME time_in; - volatile unsigned int *DAQ_MBOX = openair0_daq_cnt(); - int mbox_target=0,mbox_current=0; - int hw_slot,delay_cnt; - int diff; - int ret; - int first_run=1; -#else - // the USRP implementation operates on subframes, not slots - // one subframe consists of one even and one odd slot - slot = 1; - int spp; - int tx_launched = 0; - int card=0; - - void *rxp[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_rx - void *txp[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_tx - - int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9 - - unsigned int rx_pos = 0; - unsigned int tx_pos = 0; -#endif - int CC_id=0; - struct timespec trx_time0, trx_time1, trx_time2; - - /* avoid gcc warnings */ - (void)trx_time0; - (void)trx_time1; - (void)trx_time2; - -#ifdef RTAI - RT_TASK* task = rt_task_init_schmod(nam2num("eNBmain"), 0, 0, 0, SCHED_FIFO, 0xF); -#else -#ifdef LOWLATENCY - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - /* This creates a .2 ms reservation */ - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = (0.3 * 100) * 10000; - attr.sched_deadline = (0.9 * 100) * 10000; - attr.sched_period = 1 * 1000000; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] main eNB thread: sched_setattr failed\n"); - exit_fun("Nothing to add"); - } else { - LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", - gettid(),sched_getcpu()); - } - -#else - - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ - CPU_ZERO(&cpuset); - #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } - #endif - - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity, 0 , sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - - LOG_I( HW, "[SCHED][eNB] Started eNB main thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); - - -#endif -#endif - - // stop early, if an exit is requested - // FIXME really neccessary? - if (oai_exit) - goto eNB_thread_cleanup; - -#ifdef RTAI - LOG_I( HW, "[SCHED][eNB] Started eNB main thread (id %p)\n", task ); -#endif - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - printf("eNB_thread: mlockall in ...\n"); - mlockall(MCL_CURRENT | MCL_FUTURE); - printf("eNB_thread: mlockall out ...\n"); - - timing_info.time_min = 100000000ULL; - timing_info.time_max = 0; - timing_info.time_avg = 0; - timing_info.n_samples = 0; - - printf( "waiting for sync (eNB_thread)\n" ); - pthread_mutex_lock( &sync_mutex ); - - while (sync_var<0) - pthread_cond_wait( &sync_cond, &sync_mutex ); - - pthread_mutex_unlock(&sync_mutex); - - printf( "got sync (eNB_thread)\n" ); - - int frame = 0; - -#ifndef EXMIMO - spp = openair0_cfg[0].samples_per_packet; - tx_pos = openair0_cfg[0].tx_scheduling_advance; -#endif - -#if defined(ENABLE_ITTI) - wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); -#endif - - while (!oai_exit) { - start_meas( &softmodem_stats_mt ); - -#ifdef EXMIMO - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - // LOG_D(HW,"eNB frame %d, time %llu: slot %d, hw_slot %d (mbox %d)\n",frame,rt_get_time_ns(),slot,hw_slot,((unsigned int *)DAQ_MBOX)[0]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_slot>>1); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame); - //this is the mbox counter where we should be - mbox_target = mbox_bounds[slot]; - //this is the mbox counter where we are - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD) - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - - //when we start the aquisition we want to start with slot 0, so we rather wait for the hardware than to advance the slot number (a positive diff will cause the programm to go into the second if clause rather than the first) - if (first_run==1) { - first_run=0; - - if (diff<0) - diff = diff + 150; - - LOG_I(HW,"eNB Frame %d, time %llu: slot %d, hw_slot %d, diff %d\n",frame, rt_get_time_ns(), slot, hw_slot, diff); - } - - if (((slot%2==0) && (diff < (-14))) || ((slot%2==1) && (diff < (-7)))) { - - // at the eNB, even slots have double as much time since most of the processing is done here and almost nothing in odd slots - LOG_W(HW,"eNB Frame %d, time %llu: missed slot %d, proceeding with next one (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n", - frame, rt_get_time_ns(), num_missed_slots, slot, hw_slot, mbox_current,mbox_target, diff); - - if (exit_missed_slots==1) { - stop_meas(&softmodem_stats_mt); - exit_fun("[HW][eNB] missed slot"); - } else { - num_missed_slots++; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_MISSED_SLOTS_ENB,num_missed_slots ); - } - - if ((slot&1) == 1) { - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++){ - if (PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx==1023) - PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx=0; - else - PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx += 1; - - if (PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx==1023) - PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx=0; - else - PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx += 1; - } - } - - slot++; - if (slot == 20) { - frame++; - slot = 0; - } - - - } - - if (diff>8) - LOG_D(HW,"eNB Frame %d, time %llu: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, rt_get_time_ns(), slot, hw_slot, mbox_current, - mbox_target, diff); - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff); - - delay_cnt = 0; - - while ((diff>0) && (!oai_exit)) { - time_in = rt_get_time_ns(); - //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d, (slot+1)*15=%d, diff %d, time %llu\n",frame,delay_cnt,hw_slot,((unsigned int *)DAQ_MBOX)[0],slot,(((slot+1)*15)>>1),diff,time_in); - //LOG_D(HW,"eNB Frame %d, time %llu: sleeping for %llu (slot %d, hw_slot %d, diff %d, mbox %d, delay_cnt %d)\n", frame, time_in, diff*DAQ_PERIOD,slot,hw_slot,diff,((volatile unsigned int *)DAQ_MBOX)[0],delay_cnt); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1); - ret = rt_sleep_ns(diff*DAQ_PERIOD); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - - if (ret) - LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in); - - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_slot>>1); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame); -//LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns()); - delay_cnt++; - - if (delay_cnt == 10) { - stop_meas(&softmodem_stats_mt); - LOG_D(HW,"eNB Frame %d: HW stopped ... \n",frame); - exit_fun("[HW][eNB] HW stopped"); - } - - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - } - -#else // EXMIMO - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); - tx_launched = 0; - - while (rx_pos < ((1+hw_subframe)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti)) { - - unsigned int rxs; -#ifndef USRP_DEBUG - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TXCNT, tx_pos ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, rx_pos ); - - clock_gettime( CLOCK_MONOTONIC, &trx_time0 ); - - start_meas( &softmodem_stats_hw ); - - openair0_timestamp timestamp; - int i=0; - // prepare rx buffer pointers - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) - rxp[i] = (void*)&rxdata[i][rx_pos]; - // check if nsymb_read == spp - // map antenna port i to the cc_id. Now use the 1:1 mapping - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - spp, - PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx); - - stop_meas( &softmodem_stats_hw ); - if (frame > 50) { - clock_gettime( CLOCK_MONOTONIC, &trx_time1 ); - } - - if (frame > 20){ - if (rxs != spp) - exit_fun( "problem receiving samples" ); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - - // Transmit TX buffer based on timestamp from RX - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - for (i=0; ilte_frame_parms.nb_antennas_tx; i++) - txp[i] = (void*)&txdata[i][tx_pos]; - // if symb_written < spp ==> error - if (frame > 50) { - openair0.trx_write_func(&openair0, - (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance), - txp, - spp, - PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx, - 1); - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, timestamp&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance)&0xffffffff ); - - stop_meas( &softmodem_stats_mt ); - if (frame > 50) { - clock_gettime( CLOCK_MONOTONIC, &trx_time2 ); - //update_difftimes(trx_time1, trx_time2); - } - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0); -#else - // USRP_DEBUG is active - rt_sleep_ns(1000000); -#endif - /* FT configurable tx lauch delay (in slots): txlaunch_wait, txlaunch_wait_slotcount is device specific and - set in the corresponding library (with txlaunch_wait=1 and txlaunch_wait_slotcount=1 the check is as it previously was) */ - /* old check: - if ((frame>50) && - (tx_launched == 0) && - (rx_pos >= (((2*hw_subframe)+1)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))) {*/ - if ( (frame>50) && (tx_launched == 0) && - ((openair0_cfg[card].txlaunch_wait == 0) || - ((openair0_cfg[card].txlaunch_wait == 1) && - (rx_pos >= (((2*hw_subframe)+openair0_cfg[card].txlaunch_wait_slotcount)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))))) { - - tx_launched = 1; - - for (CC_id=0; CC_idproc[hw_subframe].mutex_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", hw_subframe, PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx ); - exit_fun( "error locking mutex_tx" ); - break; - } - - int cnt_tx = ++PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx; - - pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].mutex_tx ); - - if (cnt_tx == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].cond_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n", hw_subframe ); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB TX thread %d busy!! (rx_cnt %u, cnt_tx %i)\n", PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].frame_tx, hw_subframe, rx_pos, cnt_tx ); - exit_fun( "TX thread busy" ); - break; - } - } - } - - rx_pos += spp; - tx_pos += spp; - - if (tx_pos >= openair0_cfg[card].samples_per_frame) - tx_pos -= openair0_cfg[card].samples_per_frame; - } - - if (rx_pos >= openair0_cfg[card].samples_per_frame) - rx_pos -= openair0_cfg[card].samples_per_frame; - - -#endif // USRP - - if (oai_exit) break; - - timing_info.time_last = timing_info.time_now; - timing_info.time_now = rt_get_time_ns(); - - if (timing_info.n_samples>0) { - RTIME time_diff = timing_info.time_now - timing_info.time_last; - - if (time_diff < timing_info.time_min) - timing_info.time_min = time_diff; - - if (time_diff > timing_info.time_max) - timing_info.time_max = time_diff; - - timing_info.time_avg += time_diff; - } - - timing_info.n_samples++; - - if ((slot&1) == 1) { - // odd slot -#ifdef EXMIMO - int sf = ((slot>>1)+1)%10; -#else - int sf = hw_subframe; -#endif - if (frame>50) { - for (int CC_id=0; CC_idproc[sf].mutex_tx) != 0) { - LOG_E(PHY,"[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx); - } else { - // LOG_I(PHY,"[eNB] Waking up eNB process %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt); - PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx++; - pthread_mutex_unlock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx); - - if (PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx == 0) { - if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_tx) != 0) { - LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n",sf); - exit_fun("nothing to add"); - } - } else { - LOG_W(PHY,"[eNB] Frame %d, eNB TX thread %d busy!!\n",PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_tx,sf); - exit_fun("nothing to add"); - } - } - -#endif - - if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n", sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx ); - exit_fun( "error locking mutex_rx" ); - break; - } - - int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx; - - pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx ); - - if (cnt_rx == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_rx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n", sf ); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY, "[eNB] Frame %d, eNB RX thread %d busy!! instance_cnt %d CC_id %d\n", PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx, sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx, CC_id ); - exit_fun( "RX thread busy" ); - break; - } - } - } - } - -#ifdef EXMIMO - slot++; - - if (slot == 20) { - frame++; - slot = 0; - } - -#else - hw_subframe++; - slot += 2; - - if (hw_subframe == NUM_ENB_THREADS) { - // the radio frame is complete, start over - hw_subframe = 0; - frame++; - slot = 1; - } - -#endif - -#if defined(ENABLE_ITTI) - itti_update_lte_time( frame, slot ); -#endif - } - -eNB_thread_cleanup: -#ifdef DEBUG_THREADS - printf( "eNB_thread: finished, ran %d times.\n", frame ); -#endif - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - -#ifdef DEBUG_THREADS - printf( "Exiting eNB_thread ..." ); -#endif - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - - eNB_thread_status = 0; - - // print_difftimes(); - - return &eNB_thread_status; -} @@ -2290,12 +646,6 @@ static void get_options (int argc, char **argv) int clock_src; #endif int CC_id; -#ifdef EXMIMO - char rxg_fname[256], line[1000]; - FILE *rxg_fd; - int l; -#endif - @@ -2586,30 +936,6 @@ static void get_options (int argc, char **argv) break; case 'F': -#ifdef EXMIMO - sprintf(rxg_fname,"%srxg.lime",optarg); - rxg_fd = fopen(rxg_fname,"r"); - - if (rxg_fd) { - printf("Loading RX Gain parameters from %s\n",rxg_fname); - l=0; - - while (fgets(line, sizeof(line), rxg_fd)) { - if ((strlen(line)==0) || (*line == '#')) continue; //ignore empty or comment lines - else { - if (l==0) sscanf(line,"%d %d %d %d",&rxg_max[0],&rxg_max[1],&rxg_max[2],&rxg_max[3]); - - if (l==1) sscanf(line,"%d %d %d %d",&rxg_med[0],&rxg_med[1],&rxg_med[2],&rxg_med[3]); - - if (l==2) sscanf(line,"%d %d %d %d",&rxg_byp[0],&rxg_byp[1],&rxg_byp[2],&rxg_byp[3]); - - l++; - } - } - } else - printf("%s not found, running with defaults\n",rxg_fname); - -#endif break; case 'G': @@ -2786,7 +1112,7 @@ static void get_options (int argc, char **argv) int main( int argc, char **argv ) { int i,aa,card=0; -#if defined (XFORMS) || defined (EMOS) || defined (EXMIMO) +#if defined (XFORMS) void *status; #endif @@ -2794,17 +1120,11 @@ int main( int argc, char **argv ) uint16_t Nid_cell = 0; uint8_t cooperation_flag=0, abstraction_flag=0; uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; - -#ifdef ENABLE_TCXO - unsigned int tcxo = 114; -#endif + int error_code; #if defined (XFORMS) int ret; #endif -#if defined (EMOS) || (! defined (RTAI)) - int error_code; -#endif #ifdef DEBUG_CONSOLE setvbuf(stdout, NULL, _IONBF, 0); @@ -2961,9 +1281,8 @@ int main( int argc, char **argv ) signal(SIGINT, signal_handler); #endif -#ifndef RTAI + check_clock(); -#endif // init the parameters for (CC_id=0; CC_idlte_ue_pdcch_vars[0]->crnti = 0x1235; -#ifdef EXMIMO - for (i=0; i<4; i++) { - UE[CC_id]->rx_gain_max[i] = rxg_max[i]; - UE[CC_id]->rx_gain_med[i] = rxg_med[i]; - UE[CC_id]->rx_gain_byp[i] = rxg_byp[i]; - } - - if ((UE[0]->mode == normal_txrx) || - (UE[0]->mode == rx_calib_ue) || - (UE[0]->mode == no_L2_connect) || - (UE[0]->mode == debug_prach)) { - for (i=0; i<4; i++) - rx_gain_mode[CC_id][i] = max_gain; - - UE[CC_id]->rx_total_gain_dB = UE[CC_id]->rx_gain_max[0] + (int)rx_gain[CC_id][0] - 30; //-30 because it was calibrated with a 30dB gain - } else if ((mode == rx_calib_ue_med)) { - for (i=0; i<4; i++) - rx_gain_mode[CC_id][i] = med_gain; - - UE[CC_id]->rx_total_gain_dB = UE[CC_id]->rx_gain_med[0] + (int)rx_gain[CC_id][0] - 30; //-30 because it was calibrated with a 30dB gain; - } else if ((mode == rx_calib_ue_byp)) { - for (i=0; i<4; i++) - rx_gain_mode[CC_id][i] = byp_gain; - - UE[CC_id]->rx_total_gain_dB = UE[CC_id]->rx_gain_byp[0] + (int)rx_gain[CC_id][0] - 30; //-30 because it was calibrated with a 30dB gain; - } - -#else UE[CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0]; -#endif - UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id]; - - -#ifdef EXMIMO - //N_TA_offset - if (UE[CC_id]->lte_frame_parms.frame_type == TDD) { - if (UE[CC_id]->lte_frame_parms.N_RB_DL == 100) - UE[CC_id]->N_TA_offset = 624; - else if (UE[CC_id]->lte_frame_parms.N_RB_DL == 50) - UE[CC_id]->N_TA_offset = 624/2; - else if (UE[CC_id]->lte_frame_parms.N_RB_DL == 25) - UE[CC_id]->N_TA_offset = 624/4; - } else { - UE[CC_id]->N_TA_offset = 0; - } -#else - //already taken care of in lte-softmodem UE[CC_id]->N_TA_offset = 0; -#endif + } openair_daq_vars.manual_timing_advance = 0; @@ -3138,39 +1411,10 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.frame_type, PHY_vars_eNB_g[0][CC_id]->X_u); -#ifndef EXMIMO - PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = (int)rx_gain[CC_id][0]; -#else - PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = rxg_max[0] + (int)rx_gain[CC_id][0] - 30; //was measured at rxgain=30; - - printf("Setting RX total gain to %d\n",PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB); - - // set eNB to max gain - for (i=0; i<4; i++) - rx_gain_mode[CC_id][i] = max_gain; - -#endif - -#ifdef EXMIMO - - //N_TA_offset - if (PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.frame_type == TDD) { - if (PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.N_RB_DL == 100) - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624; - else if (PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.N_RB_DL == 50) - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/2; - else if (PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.N_RB_DL == 25) - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/4; - } else { - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; - } - -#else //already taken care of in lte-softmodem.c PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; -#endif } @@ -3184,10 +1428,10 @@ int main( int argc, char **argv ) openair_daq_vars.target_ue_ul_mcs=target_ul_mcs; } -#ifndef RTAI + fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx); cpuf=get_cpu_freq_GHz(); -#endif + dump_frame_parms(frame_parms[0]); @@ -3254,7 +1498,7 @@ int main( int argc, char **argv ) // in the case of the USRP, the following variables need to be initialized before the init // since the USRP only supports one CC (for the moment), we initialize all the cards with first CC. // in the case of EXMIMO2, these values are overwirtten in the function setup_eNB/UE_buffer -#ifndef EXMIMO + openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx)); openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx)); @@ -3277,32 +1521,10 @@ int main( int argc, char **argv ) openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB; } -#if 0 // UHD 3.8 - switch(frame_parms[0]->N_RB_DL) { - case 6: - openair0_cfg[card].rx_gain[i] -= 12; - break; - - case 25: - openair0_cfg[card].rx_gain[i] -= 6; - break; - - case 50: - openair0_cfg[card].rx_gain[i] -= 3; - break; - - case 100: - openair0_cfg[card].rx_gain[i] -= 0; - break; - - default: - break; - } -#endif } -#endif + } #ifndef LOWLATENCY @@ -3412,30 +1634,7 @@ int main( int argc, char **argv ) mac_xface->mrbch_phy_sync_failure (0, 0, 0); } - /* #ifdef OPENAIR2 - //if (otg_enabled) { - init_all_otg(0); - g_otg->seed = 0; - init_seeds(g_otg->seed); - g_otg->num_nodes = 2; - for (i=0; inum_nodes; i++){ - for (j=0; jnum_nodes; j++){ - g_otg->application_idx[i][j] = 1; - //g_otg->packet_gen_type=SUBSTRACT_STRING; - g_otg->aggregation_level[i][j][0]=1; - g_otg->application_type[i][j][0] = BCBR; //MCBR, BCBR - } - } - init_predef_traffic(UE_flag ? 1 : 0, UE_flag ? 0 : 1); - // } - #endif */ - -#ifdef EXMIMO - number_of_cards = openair0_num_detected_cards; -#else number_of_cards = 1; -#endif - for(CC_id=0; CC_idrf.do_autocal[ant] = 0; - */ - -#ifdef EMOS - error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE); - - if (error_code==0) - printf("[OPENAIR][SCHED][INIT] Created EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); - else if (error_code==ENODEV) - printf("[OPENAIR][SCHED][INIT] Problem: EMOS FIFO %d is greater than or equal to RTF_NO\n",CHANSOUNDER_FIFO_MINOR); - else if (error_code==ENOMEM) - printf("[OPENAIR][SCHED][INIT] Problem: cannot allocate memory for EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); - else - printf("[OPENAIR][SCHED][INIT] Problem creating EMOS FIFO %d, error_code %d\n",CHANSOUNDER_FIFO_MINOR,error_code); - -#endif - mlockall(MCL_CURRENT | MCL_FUTURE); -#ifdef RTAI - // make main thread LXRT soft realtime - /* task = */ rt_task_init_schmod(nam2num("MAIN"), 9, 0, 0, SCHED_FIFO, 0xF); - - // start realtime timer and scheduler - //rt_set_oneshot_mode(); - rt_set_periodic_mode(); - start_rt_timer(0); -#endif - pthread_cond_init(&sync_cond,NULL); pthread_mutex_init(&sync_mutex, NULL); - // this starts the DMA transfers -#ifdef EXMIMO - - if (UE_flag!=1) - for (card=0; card0) { - init_eNB_proc(); - sleep(1); - LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); - } - - printf("Creating main eNB_thread \n"); -#ifdef RTAI - main_eNB_thread = rt_thread_create(eNB_thread, NULL, PTHREAD_STACK_MIN); -#else - error_code = pthread_create( &main_eNB_thread, &attr_dlsch_threads, eNB_thread, NULL ); - - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code); - return(error_code); - } else { - LOG_D( HW, "[lte-softmodem.c] Allocate eNB_thread successful\n" ); - pthread_setname_np( main_eNB_thread, "main eNB" ); - } - -#endif + init_eNB(); } // Sleep to allow all threads to setup @@ -3684,7 +1795,7 @@ int main( int argc, char **argv ) -#ifndef EXMIMO + #ifndef USRP_DEBUG if (mode!=loop_through_memory) @@ -3693,7 +1804,6 @@ int main( int argc, char **argv ) #endif -#endif printf("Sending sync to all threads\n"); @@ -3713,7 +1823,7 @@ int main( int argc, char **argv ) #else while (oai_exit==0) - rt_sleep_ns(FRAME_PERIOD); + rt_sleep_ns(100000000ULL); #endif @@ -3748,79 +1858,16 @@ int main( int argc, char **argv ) // cleanup if (UE_flag == 1) { -#ifdef EXMIMO -#ifdef RTAI - rt_thread_join(main_ue_thread); -#else - pthread_join(main_ue_thread,&status); -#endif -#ifdef DLSCH_THREAD - cleanup_dlsch_threads(); - cleanup_rx_pdsch_thread(); -#endif -#endif } else { -#ifdef DEBUG_THREADS - printf("Joining eNB_thread ..."); -#endif -#ifdef RTAI - rt_thread_join(main_eNB_thread); -#else - int *eNB_thread_status_p; - int result = pthread_join( main_eNB_thread, (void**)&eNB_thread_status_p ); -#ifdef DEBUG_THREADS - - if (result != 0) { - printf( "\nError joining main_eNB_thread.\n" ); - } else { - if (eNB_thread_status_p) { - printf( "status %d\n", *eNB_thread_status_p ); - } else { - printf( "The thread was killed. No status available.\n"); - } - } - -#else - UNUSED(result); -#endif // DEBUG_THREADS -#endif // RTAI - - if (multi_thread>0) { - printf("Killing eNB processing threads\n"); - kill_eNB_proc(); - } + stop_eNB(); } -#ifdef RTAI - stop_rt_timer(); -#endif pthread_cond_destroy(&sync_cond); pthread_mutex_destroy(&sync_mutex); -#ifdef EXMIMO - printf("stopping card\n"); - openair0_stop(0); - printf("closing openair0_lib\n"); - openair0_close(); -#else openair0.trx_end_func(&openair0); -#endif - -#ifdef EMOS - printf("waiting for EMOS thread\n"); - pthread_cancel(thread3); - pthread_join(thread3,&status); - printf("waiting for GPS thread\n"); - pthread_cancel(thread4); - pthread_join(thread4,&status); -#endif - -#ifdef EMOS - error_code = rtf_destroy(CHANSOUNDER_FIFO_MINOR); - printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code); -#endif if (ouput_vcd) VCD_SIGNAL_DUMPER_CLOSE(); @@ -3834,142 +1881,8 @@ int main( int argc, char **argv ) } -/* this function maps the phy_vars_eNB tx and rx buffers to the available rf chains. - Each rf chain is is addressed by the card number and the chain on the card. The - rf_map specifies for each CC, on which rf chain the mapping should start. Multiple - antennas are mapped to successive RF chains on the same card. */ -int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) -{ - - int i, CC_id; -#ifndef EXMIMO - uint16_t N_TA_offset = 0; -#else - int j; -#endif - LTE_DL_FRAME_PARMS *frame_parms; - for (CC_id=0; CC_idlte_frame_parms); - printf("setup_eNB_buffers: frame_parms = %p\n",frame_parms); - } else { - printf("phy_vars_eNB[%d] not initialized\n", CC_id); - return(-1); - } -#ifndef EXMIMO - - if (frame_parms->frame_type == TDD) { - if (frame_parms->N_RB_DL == 100) - N_TA_offset = 624; - else if (frame_parms->N_RB_DL == 50) - N_TA_offset = 624/2; - else if (frame_parms->N_RB_DL == 25) - N_TA_offset = 624/4; - } - -#endif - - // replace RX signal buffers with mmaped HW versions -#ifdef EXMIMO - openair0_cfg[CC_id].tx_num_channels = 0; - openair0_cfg[CC_id].rx_num_channels = 0; - - for (i=0; inb_antennas_rx; i++) { - printf("Mapping eNB CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_gain[rf_map[CC_id].chain+i] = rx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_num_channels++; - } - - printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); - - for (j=0; j<16; j++) { - printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j] = 16-j; - } - } - - for (i=0; inb_antennas_tx; i++) { - printf("Mapping eNB CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_gain[rf_map[CC_id].chain+i] = tx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_num_channels++; - } - - printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - - for (j=0; j<16; j++) { - printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j] = 16-j; - } - } - -#else // not EXMIMO - rxdata = (int32_t**)malloc16(frame_parms->nb_antennas_rx*sizeof(int32_t*)); - txdata = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); - - for (i=0; inb_antennas_rx; i++) { - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); - rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory - memset(rxdata[i], 0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i],rxdata[i],N_TA_offset); - - } - - for (i=0; inb_antennas_tx; i++) { - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = txdata[i]; - memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - - } - -#endif - } - - return(0); -} - -void reset_opp_meas(void) { - int sfn; - reset_meas(&softmodem_stats_mt); - reset_meas(&softmodem_stats_hw); - - for (sfn=0; sfn < 10; sfn++) { - reset_meas(&softmodem_stats_tx_sf[sfn]); - reset_meas(&softmodem_stats_rx_sf[sfn]); - } -} - -void print_opp_meas(void) { - - int sfn=0; - print_meas(&softmodem_stats_mt, "Main ENB Thread", NULL, NULL); - print_meas(&softmodem_stats_hw, "HW Acquisation", NULL, NULL); - - for (sfn=0; sfn < 10; sfn++) { - print_meas(&softmodem_stats_tx_sf[sfn],"[eNB][total_phy_proc_tx]",NULL, NULL); - print_meas(&softmodem_stats_rx_sf[sfn],"[eNB][total_phy_proc_rx]",NULL,NULL); - } -} From e2c322280296d18f9afa33fe3e27f1c4c2309acf Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 9 May 2016 23:40:36 -0700 Subject: [PATCH 013/340] removal of EXPRESSMIMO #ifdef's in lte-ue. move UE-specific code from lte-softmodem.c to lte-ue.c --- cmake_targets/CMakeLists.txt | 13 - targets/RT/USER/lte-softmodem.c | 54 +-- targets/RT/USER/lte-ue.c | 667 ++++--------------------------- targets/RT/USER/sched_dlsch.c | 354 ---------------- targets/RT/USER/sched_rx_pdsch.c | 321 --------------- targets/RT/USER/sched_ulsch.c | 255 ------------ 6 files changed, 95 insertions(+), 1569 deletions(-) delete mode 100644 targets/RT/USER/sched_dlsch.c delete mode 100644 targets/RT/USER/sched_rx_pdsch.c delete mode 100644 targets/RT/USER/sched_ulsch.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 166da4a48d..966ef6e085 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -259,15 +259,6 @@ if (${ENABLE_ITTI}) endif (${ENABLE_ITTI}) add_boolean_option(RTAI False "Use RTAI") -if (${RTAI}) - set(LOWLATENCY False) - set(CPU_AFFINITY False) - add_definitions("-DENABLE_RTAI_CLOCK") - add_definitions("-DCONFIG_RTAI_LXRT_INLINE") - include_directories ("/usr/realtime/include") - include_directories ("/usr/realtime/include/asm") - set(RTAI_SOURCE sched_dlsch.c sched_rx_pdsch.c rt_wrapper.c vcd_signal_dumper.c log.c) -endif (${RTAI}) ############################# # ASN.1 grammar C code generation & dependancies @@ -1574,8 +1565,6 @@ add_executable(lte-softmodem ${rrc_h} ${s1ap_h} ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_TARGETS}/RT/USER/sched_dlsch.c - ${OPENAIR_TARGETS}/RT/USER/sched_rx_pdsch.c ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/RT/USER/lte-ue.c ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c @@ -1611,8 +1600,6 @@ add_executable(lte-softmodem-nos1 ${rrc_h} ${s1ap_h} ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_TARGETS}/RT/USER/sched_dlsch.c - ${OPENAIR_TARGETS}/RT/USER/sched_rx_pdsch.c ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/RT/USER/lte-ue.c ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 4664b0aa21..822409f302 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -113,12 +113,18 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "stats.h" #endif +// In lte-enb.c int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); -int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); + extern void init_eNB(void); extern void stop_eNB(void); +extern void kill_eNB_proc(void); +// In lte-ue.c +int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); void fill_ue_band_info(void); +extern void init_UE(void); + #ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // at eNB 0, an UL scope for every UE @@ -130,9 +136,6 @@ unsigned char scope_enb_num_ue = 2; #endif //XFORMS -pthread_t main_ue_thread; - -pthread_attr_t attr_UE_thread; @@ -144,7 +147,6 @@ int sync_var=-1; //!< protected by mutex \ref sync_mutex. -struct sched_param sched_param_UE_thread; #ifdef XFORMS @@ -284,9 +286,8 @@ openair0_config_t openair0_cfg[MAX_CARDS]; double cpuf; char uecap_xer[1024],uecap_xer_in=0; -extern void *UE_thread(void *arg); -extern void init_UE_threads(void); -extern void kill_eNB_proc(void); + + /*---------------------BMC: timespec helpers -----------------------------*/ @@ -1120,7 +1121,6 @@ int main( int argc, char **argv ) uint16_t Nid_cell = 0; uint8_t cooperation_flag=0, abstraction_flag=0; uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; - int error_code; #if defined (XFORMS) int ret; @@ -1752,43 +1752,11 @@ int main( int argc, char **argv ) rt_sleep_ns(10*100000000ULL); - pthread_attr_init (&attr_UE_thread); - pthread_attr_setstacksize(&attr_UE_thread,8192);//5*PTHREAD_STACK_MIN); -#ifndef LOWLATENCY - sched_param_UE_thread.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_setschedparam(&attr_UE_thread,&sched_param_UE_thread); -#endif // start the main thread - if (UE_flag == 1) { - printf("Intializing UE Threads ...\n"); - init_UE_threads(); - sleep(1); - error_code = pthread_create(&main_ue_thread, &attr_UE_thread, UE_thread, NULL); - - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code); - return(error_code); - } else { - LOG_D( HW, "[lte-softmodem.c] Allocate UE_thread successful\n" ); - pthread_setname_np( main_ue_thread, "main UE" ); - } - - printf("UE threads created\n"); -#ifdef USE_MME - - while (start_UE == 0) { - sleep(1); - } - -#endif - - - - } else { - init_eNB(); - } + if (UE_flag == 1) init_UE(); + else init_eNB(); // Sleep to allow all threads to setup sleep(1); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 561554516c..3049fd4e02 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -69,11 +69,7 @@ #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all -#ifdef EXMIMO -#include "openair0_lib.h" -#else #include "../../ARCH/COMMON/common_lib.h" -#endif #include "PHY/extern.h" #include "SCHED/extern.h" @@ -96,10 +92,9 @@ typedef enum { si=2 } sync_mode_t; -int init_dlsch_threads(void); -void cleanup_dlsch_threads(void); -int32_t init_rx_pdsch_thread(void); -void cleanup_rx_pdsch_thread(void); +void init_UE_threads(void); +void *UE_thread(void *arg); +void init_UE(void); extern pthread_cond_t sync_cond; extern pthread_mutex_t sync_mutex; @@ -125,19 +120,6 @@ extern uint64_t num_missed_slots; // counter for the number of missed slots extern void exit_fun(const char* s); -#ifdef EXMIMO - -extern unsigned int rxg_max[4]; -extern unsigned int rxg_med[4]; -extern unsigned int rxg_byp[4]; -extern unsigned int nf_max[4]; -extern unsigned int nf_med[4]; -extern unsigned int nf_byp[4]; -extern rx_gain_t rx_gain_mode[MAX_NUM_CCs][4]; - -extern double tx_gain[MAX_NUM_CCs][4]; -extern double rx_gain[MAX_NUM_CCs][4]; -#endif #define KHz (1000UL) #define MHz (1000 * KHz) @@ -189,6 +171,38 @@ static const eutra_band_t eutra_bands[] = { {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD}, }; +pthread_t main_ue_thread; +pthread_attr_t attr_UE_thread; +struct sched_param sched_param_UE_thread; + +void init_UE() { + + int error_code; + + printf("Intializing UE Threads ...\n"); + init_UE_threads(); + sleep(1); + error_code = pthread_create(&main_ue_thread, &attr_UE_thread, UE_thread, NULL); + + if (error_code!= 0) { + LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code); + return; + } else { + LOG_D( HW, "[lte-softmodem.c] Allocate UE_thread successful\n" ); + pthread_setname_np( main_ue_thread, "main UE" ); + } + + printf("UE threads created\n"); +#ifdef USE_MME + + while (start_UE == 0) { + sleep(1); + } + +#endif + +} + /*! * \brief This is the UE synchronize thread. * It performs band scanning and synchonization. @@ -512,15 +526,10 @@ static void *UE_thread_synch(void *arg) // openair0_cfg[0].rx_gain[0] -= 0; break; } -#ifndef EXMIMO + openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); //openair0.trx_set_gains_func(&openair0,&openair0_cfg[0]); //openair0.trx_stop_func(0); -#else - openair0_set_frequencies(&openair0,&openair0_cfg[0],0); - openair0_set_gains(&openair0,&openair0_cfg[0]); - openair0_stop(0); -#endif sleep(1); init_frame_parms(&UE->lte_frame_parms,1); } @@ -550,13 +559,9 @@ static void *UE_thread_synch(void *arg) } -#ifndef EXMIMO + UE->slot_rx = 0; UE->slot_tx = 4; -#else - UE->slot_rx = 18; - UE->slot_tx = 2; -#endif } } else { // initial sync failed @@ -598,42 +603,13 @@ static void *UE_thread_synch(void *arg) for (i=0; irx_total_gain_dB;//-USRP_GAIN_OFFSET; -#if 0 - switch(UE->lte_frame_parms.N_RB_DL) { - case 6: - openair0_cfg[card].rx_gain[i] -= 12; - break; - - case 25: - openair0_cfg[card].rx_gain[i] -= 6; - break; - - case 50: - openair0_cfg[card].rx_gain[i] -= 0;//3; - break; - - case 100: - openair0_cfg[card].rx_gain[i] -= 0; - break; - - default: - printf("Unknown number of RBs %d\n",UE->lte_frame_parms.N_RB_DL); - break; - } -#endif -#endif } } if (UE->UE_scan_carrier==1) { @@ -690,17 +666,6 @@ static void *UE_thread_tx(void *arg) UE->instance_cnt_tx=-1; -#ifdef RTAI - RT_TASK *task = rt_task_init_schmod(nam2num("UE TX Thread"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][UE] Problem starting UE TX thread!!!!\n"); - return 0; - } - - LOG_D(HW,"Started UE TX thread (id %p)\n",task); -#else - #ifdef LOWLATENCY struct sched_attr attr; unsigned int flags = 0; @@ -745,7 +710,7 @@ static void *UE_thread_tx(void *arg) exit_fun("Error setting processor affinity"); } } - #endif +#endif /* Check the actual affinity mask assigned to the thread */ @@ -790,7 +755,6 @@ static void *UE_thread_tx(void *arg) (int) sparam.sched_priority, cpu_affinity); -#endif #endif printf("waiting for sync (UE_thread_tx)\n"); @@ -909,17 +873,6 @@ static void *UE_thread_rx(void *arg) UE->instance_cnt_rx=-1; -#ifdef RTAI - RT_TASK *task = rt_task_init_schmod(nam2num("UE RX Thread"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][UE] Problem starting UE RX thread!!!!\n"); - return &UE_thread_rx_retval; - } - - LOG_D(HW,"Started UE RX thread (id %p)\n",task); -#else - #ifdef LOWLATENCY struct sched_attr attr; unsigned int flags = 0; @@ -1008,7 +961,6 @@ static void *UE_thread_rx(void *arg) (int) sparam.sched_priority, cpu_affinity); -#endif #endif // Lock memory from swapping. This is a process wide call (not constraint to this thread). @@ -1186,7 +1138,7 @@ static void *UE_thread_rx(void *arg) -#ifndef EXMIMO + #define RX_OFF_MAX 10 #define RX_OFF_MIN 5 #define RX_OFF_MID ((RX_OFF_MAX+RX_OFF_MIN)/2) @@ -1227,16 +1179,6 @@ void *UE_thread(void *arg) MessageDef *message_p; #endif -#ifdef RTAI - RT_TASK *task = rt_task_init_schmod(nam2num("UE thread"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][UE] Problem starting UE thread!!!!\n"); - return 0; - } - -#else - #ifdef LOWLATENCY struct sched_attr attr; unsigned int flags = 0; @@ -1264,7 +1206,6 @@ void *UE_thread(void *arg) struct sched_param sp; sp.sched_priority = sched_get_priority_max(SCHED_FIFO); pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp); -#endif #endif // Lock memory from swapping. This is a process wide call (not constraint to this thread). @@ -1591,410 +1532,9 @@ void *UE_thread(void *arg) return &UE_thread_retval; } -#endif -#ifdef EXMIMO -/* This is the main UE thread. Initially it is doing a periodic get_frame. One synchronized it gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */ -void *UE_thread(void *arg) -{ - PHY_VARS_UE *UE=PHY_vars_UE_g[0][0]; -#ifdef RTAI - RT_TASK *task; -#endif - // RTIME in, out, diff; - int slot=0,frame=0,hw_slot; - // unsigned int aa; - int delay_cnt; - RTIME time_in; - int /* hw_slot_offset=0, */ rx_offset_mbox=0,mbox_target=0,mbox_current=0; - int diff2; - int /* i, */ ret; - int /* CC_id, */ card; - volatile unsigned int *DAQ_MBOX = openair0_daq_cnt(); - - int wait_sync_cnt = 0; - int first_synch = 1; -#ifdef LOWLATENCY - struct sched_attr attr; - unsigned int flags = 0; - // unsigned long mask = 1; // processor 0 -#endif - int freq_offset; - - -#ifdef RTAI - task = rt_task_init_schmod(nam2num("UE thread"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][UE] Problem starting UE thread!!!!\n"); - return 0; - } - -#endif - - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - -#ifdef LOWLATENCY - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - // This creates a .25 ms reservation - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = (0.1 * 100) * 10000; - attr.sched_deadline = (0.25 * 100) * 10000; - attr.sched_period = (0.5 * 100) * 10000; - - // pin the UE main thread to CPU0 - // if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) { - // perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n"); - // } - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] main UE thread: sched_setattr failed\n"); - exit_fun("Nothing to add"); - } else { - LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", - gettid(),sched_getcpu()); - } - -#endif - - - mlockall(MCL_CURRENT | MCL_FUTURE); - - printf("waiting for sync (UE_thread)\n"); - - pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_thread)\n"); - - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - - pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex, waiting (UE_thread)\n"); - - printf("starting UE thread\n"); - - freq_offset = 0; //-7500; - - first_synch = 1; - - while (!oai_exit) { - - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store - - - if (UE->is_synchronized) { - - if (first_synch == 1) { - first_synch = 0; - - for (card=0; cardrx_offset * 150) / (10*UE->lte_frame_parms.samples_per_tti); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_RX_OFFSET, UE->rx_offset); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_OFFSET_MBOX, rx_offset_mbox); - //this is the mbox counter where we should be - mbox_target = (((((slot+1)%20)*15+1)>>1) + rx_offset_mbox + 1)%150; - // round up to the next multiple of two (mbox counter from express MIMO gives only even numbers) - mbox_target = ((mbox_target+1)-((mbox_target-1)%2))%150; - //this is the mbox counter where we are - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD) - if ((mbox_current>=120) && (mbox_target<30)) //handle the frame wrap-arround - diff2 = 150-mbox_current+mbox_target; - else if ((mbox_current<30) && (mbox_target>=120)) - diff2 = -150+mbox_target-mbox_current; - else - diff2 = mbox_target - mbox_current; - - if (diff2 <(-7)) { - LOG_D(HW,"UE Frame %d: missed slot, proceeding with next one (slot %d, hw_slot %d, diff %d)\n",frame, slot, hw_slot, diff2); - - if (frame>0) { - if (exit_missed_slots==1) - exit_fun("[HW][UE] missed slot"); - else { - num_missed_slots++; - LOG_W(HW,"[UE] just missed slot (total missed slots %ld)\n", num_missed_slots); - } - } - - slot++; - - if (slot==20) { - slot=0; - frame++; - } - - // update thread slot/frame counters because of skipped slot - UE->slot_rx++; - UE->slot_tx++; - - if (UE->slot_rx == 20) { - UE->slot_rx = 0; - UE->frame_rx++; - } - - if (UE->slot_tx == 20) { - UE->slot_tx = 0; - UE->frame_tx++; - } - - continue; - } - - if (diff2>8) - LOG_D(HW,"UE Frame %d: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, slot, hw_slot, mbox_current, mbox_target, diff2); - - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2); - - - - // This loop implements the delay of 1 slot to allow for processing - delay_cnt = 0; - - while ((diff2>0) && (!oai_exit) ) { - time_in = rt_get_time_ns(); - //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1); - ret = rt_sleep_ns(diff2*DAQ_PERIOD); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - - if (ret) - LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in); - - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - //LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns()); - delay_cnt++; - - if (delay_cnt == 30) { - LOG_D(HW,"UE frame %d: HW stopped ... \n",frame); - exit_fun("[HW][UE] HW stopped"); - } - - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff2 = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff2 = -150+mbox_target-mbox_current; - else - diff2 = mbox_target - mbox_current; - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2); - } - - // on even slots, schedule processing of entire subframe - if ((slot&1) == 0) { - - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { - LOG_E(PHY,"[SCHED][UE] error locking mutex for UE RX thread\n"); - exit_fun("nothing to add"); - } else { - - int instance_cnt_rx = ++UE->instance_cnt_rx; - - pthread_mutex_unlock(&UE->mutex_rx); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, instance_cnt_rx); - - - if (instance_cnt_rx == 0) { - LOG_D(HW,"Scheduling UE RX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_rx,frame,slot>>1,UE->slot_rx>>1,UE->mode); - - if (pthread_cond_signal(&UE->cond_rx) != 0) { - LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n"); - exit_fun("nothing to add"); - } else { - // printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0); - } - - if (UE->mode == rx_calib_ue) { - if (frame == 10) { - LOG_D(PHY, - "[SCHED][UE] Found cell with N_RB_DL %d, PHICH CONFIG (%d,%d), Nid_cell %d, NB_ANTENNAS_TX %d, initial frequency offset %d Hz, frequency offset %d Hz, RSSI (digital) %d dB, measured Gain %d dB, total_rx_gain %d dB, USRP rx gain %f dB\n", - UE->lte_frame_parms.N_RB_DL, - UE->lte_frame_parms.phich_config_common.phich_duration, - UE->lte_frame_parms.phich_config_common.phich_resource, - UE->lte_frame_parms.Nid_cell, - UE->lte_frame_parms.nb_antennas_tx_eNB, - freq_offset, - UE->lte_ue_common_vars.freq_offset, - UE->PHY_measurements.rx_power_avg_dB[0], - UE->PHY_measurements.rx_power_avg_dB[0] - rx_input_level_dBm, - UE->rx_total_gain_dB, - openair0_cfg[0].rx_gain[0] - ); - exit_fun("[HW][UE] UE in RX calibration mode, exiting"); - } - } - } else { - LOG_E(PHY,"[SCHED][UE] UE RX thread busy!!\n"); - exit_fun("nothing to add"); - } - } - - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E(PHY,"[SCHED][UE] error locking mutex for UE TX thread\n"); - exit_fun("nothing to add"); - } else { - - int instance_cnt_tx = ++UE->instance_cnt_tx; - - pthread_mutex_unlock(&UE->mutex_tx); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, instance_cnt_tx); - - if (instance_cnt_tx == 0) { - LOG_D(HW,"Scheduling UE TX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_tx,frame,slot>>1,UE->slot_tx>>1,UE->mode); - - if (pthread_cond_signal(&UE->cond_tx) != 0) { - LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n"); - exit_fun("nothing to add"); - } else { - // printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0); - } - } else { - LOG_E(PHY,"[SCHED][UE] UE TX thread busy!!\n"); - exit_fun("nothing to add"); - } - } - } - - /* - if ((slot%2000)<10) - LOG_D(HW,"fun0: doing very hard work\n"); - */ - // now increment slot and frame counters - slot++; - - if (slot==20) { - slot=0; - frame++; - } - } else if (UE->is_synchronized == 0) { // we are not yet synchronized - //hw_slot_offset = 0; - first_synch = 1; - slot = 0; - - - // wait until we can lock mutex_synch - //printf("Locking mutex_synch (UE_thread)\n"); - if (pthread_mutex_lock(&UE->mutex_synch) != 0) { - LOG_E(PHY,"[SCHED][UE] error locking mutex for UE initial synch thread\n"); - exit_fun("noting to add"); - } else { - - if (UE->instance_cnt_synch < 0) { - - wait_sync_cnt=0; - openair0_config(&openair0_cfg[0],1); - // openair0_set_gains(&openair0,&openair0_cfg[0]); - - printf("Getting frame\n"); - openair0_get_frame(0); - rt_sleep_ns(FRAME_PERIOD); - // increment instance count for sync thread - UE->instance_cnt_synch++; - pthread_mutex_unlock(&UE->mutex_synch); - - if (pthread_cond_signal(&UE->cond_synch) != 0) { - LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n"); - exit_fun("nothing to add"); - } - } else { - wait_sync_cnt++; - pthread_mutex_unlock(&UE->mutex_synch); - - if (wait_sync_cnt>1000) - exit_fun("waiting to long for synch thread"); - else - rt_sleep_ns(FRAME_PERIOD); - } - } - - - /* - if (initial_sync(UE,mode)==0) { - - if (mode == rx_calib_ue) { - exit_fun("[HW][UE] UE in RX calibration mode"); - } - else { - is_synchronized = 1; - //start the streaming DMA transfers - for (card=0;cardrx_offset<<1) / UE->lte_frame_parms.samples_per_tti; - } - } - else { - if (freq_offset >= 0) { - freq_offset += 100; - freq_offset *= -1; - } - else { - freq_offset *= -1; - } - if (abs(freq_offset) > 7500) { - LOG_I(PHY,"[initial_sync] No cell synchronization found, abondoning\n"); - mac_xface->macphy_exit("No cell synchronization found, abondoning"); - } - else { - // LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",freq_offset); - #ifndef USRP - for (CC_id=0;CC_idinstance_cnt_tx = -1; UE->instance_cnt_rx = -1; @@ -2063,97 +1611,50 @@ void fill_ue_band_info(void) int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) { - //#ifndef EXMIMO - // uint16_t N_TA_offset = 0; - //#endif - int i, CC_id; LTE_DL_FRAME_PARMS *frame_parms; - + for (CC_id=0; CC_idlte_frame_parms); - } else { - printf("phy_vars_UE[%d] not initialized\n", CC_id); - return(-1); - } + if (phy_vars_ue[CC_id]) { + frame_parms = &(phy_vars_ue[CC_id]->lte_frame_parms); + } else { + printf("phy_vars_UE[%d] not initialized\n", CC_id); + return(-1); + } - //#ifndef EXMIMO - // if (frame_parms->frame_type == TDD) { - // if (frame_parms->N_RB_DL == 100) - // N_TA_offset = 624; - // else if (frame_parms->N_RB_DL == 50) - // N_TA_offset = 624/2; - // else if (frame_parms->N_RB_DL == 25) - // N_TA_offset = 624/4; - // } - //#endif - -#ifdef EXMIMO - openair0_cfg[CC_id].tx_num_channels = 0; - openair0_cfg[CC_id].rx_num_channels = 0; + if (frame_parms->frame_type == TDD) { + if (frame_parms->N_RB_DL == 100) + N_TA_offset = 624; + else if (frame_parms->N_RB_DL == 50) + N_TA_offset = 624/2; + else if (frame_parms->N_RB_DL == 25) + N_TA_offset = 624/4; + } + // replace RX signal buffers with mmaped HW versions - for (i=0; inb_antennas_rx; i++) { - printf("Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i]); - phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i]; + rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_gain[rf_map[CC_id].chain+i] = rx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rxg_mode[rf_map[CC_id].chain+i] = rx_gain_mode[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_num_channels++; - } - - printf("rxdata[%d] @ %p\n",i,phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i]); - } - - for (i=0; inb_antennas_tx; i++) { - printf("Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i]); - phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_gain[rf_map[CC_id].chain+i] = tx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_num_channels++; - } - - printf("txdata[%d] @ %p\n",i,phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i]); - } - -#else - // replace RX signal buffers with mmaped HW versions - rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - printf( "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); - free( phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] ); - rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); - phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD - } - - for (i=0; inb_antennas_tx; i++) { - printf( "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); - free( phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] ); - txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); - phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = txdata[i]; - } - - // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[x] - // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[x] - // be careful when releasing memory! - // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes) -#endif + for (i=0; inb_antennas_rx; i++) { + printf( "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); + free( phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] ); + rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); + phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD + } + + for (i=0; inb_antennas_tx; i++) { + printf( "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); + free( phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] ); + txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); + phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = txdata[i]; + } + + // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[x] + // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[x] + // be careful when releasing memory! + // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes) } diff --git a/targets/RT/USER/sched_dlsch.c b/targets/RT/USER/sched_dlsch.c deleted file mode 100644 index 48fac642a9..0000000000 --- a/targets/RT/USER/sched_dlsch.c +++ /dev/null @@ -1,354 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file sched_dlsch.c -* \brief DLSCH decoding thread (RTAI) -* \author R. Knopp, F. Kaltenberger -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include - -#include "rt_wrapper.h" - -#include - -#include "PHY/types.h" -#include "PHY/defs.h" -#include "PHY/extern.h" - -#include "SCHED/defs.h" - -#include "UTIL/LOG/vcd_signal_dumper.h" - -#define DEBUG_PHY - -/// Mutex for instance count on dlsch scheduling -pthread_mutex_t dlsch_mutex[8]; -/// Condition variable for dlsch thread -pthread_cond_t dlsch_cond[8]; - -pthread_t dlsch_threads[8]; -pthread_attr_t attr_dlsch_threads; -unsigned char dlsch_thread_indices[8]; - -// activity indicators for harq_pid's -int dlsch_instance_cnt[8]; -// process ids for cpu -int dlsch_cpuid[8]; -// subframe number for each harq_pid (needed to store ack in right place for UL) -int dlsch_subframe[8]; - -extern int oai_exit; - -/* -extern int dlsch_errors; -extern int dlsch_received; -extern int dlsch_errors_last; -extern int dlsch_received_last; -extern int dlsch_fer; -extern int current_dlsch_cqi; -*/ - -/** DLSCH Decoding Thread */ -static void * dlsch_thread(void *param) -{ - - //unsigned long cpuid; - unsigned char dlsch_thread_index = *((unsigned char *)param); - unsigned int ret=0; - uint8_t harq_pid; - - -#ifdef RTAI - RT_TASK *task; - char task_name[8]; -#endif - - int eNB_id = 0, UE_id = 0, CC_id=0; - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[UE_id][CC_id]; - - if ((dlsch_thread_index <0) || (dlsch_thread_index>7)) { - LOG_E(PHY,"[SCHED][DLSCH] Illegal dlsch_thread_index %d (%p)!!!!\n",dlsch_thread_index,param); - return 0; - } - -#ifdef RTAI - sprintf(task_name,"DLSCH%d",dlsch_thread_index); - task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][DLSCH] Problem starting dlsch_thread_index %d (%s)!!!!\n",dlsch_thread_index,task_name); - return 0; - } else { - LOG_I(PHY,"[SCHED][DLSCH] dlsch_thread for process %d started with id %p\n", - dlsch_thread_index, - task); - } - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - //rt_set_runnable_on_cpuid(task,1); - //cpuid = rtai_cpuid(); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - //dlsch_cpuid[dlsch_thread_index] = cpuid; - - while (!oai_exit) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0+dlsch_thread_index,0); - - if (pthread_mutex_lock(&dlsch_mutex[dlsch_thread_index]) != 0) { - LOG_E(PHY,"[SCHED][DLSCH] error locking mutex.\n"); - } else { - - while (dlsch_instance_cnt[dlsch_thread_index] < 0) { - pthread_cond_wait(&dlsch_cond[dlsch_thread_index],&dlsch_mutex[dlsch_thread_index]); - } - - if (pthread_mutex_unlock(&dlsch_mutex[dlsch_thread_index]) != 0) { - LOG_E(PHY,"[SCHED][DLSCH] error unlocking mutex.\n"); - } - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0+dlsch_thread_index,1); - - if (oai_exit) break; - - LOG_I(PHY,"[SCHED][DLSCH] Frame %d: Calling dlsch_decoding with dlsch_thread_index = %d\n",phy_vars_ue->frame_rx,dlsch_thread_index); - - - - if (phy_vars_ue->frame_rx < phy_vars_ue->dlsch_errors[eNB_id]) { - phy_vars_ue->dlsch_errors[eNB_id]=0; - phy_vars_ue->dlsch_received[eNB_id] = 0; - } - - harq_pid = dlsch_thread_index; - - if (phy_vars_ue->dlsch_ue[eNB_id][0]) { - - // rt_printk("[SCHED][DLSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",phy_vars_ue->frame,last_slot,time0,time1,(time1-time0)); - - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, - 0, - phy_vars_ue->dlsch_ue[eNB_id][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], - 0, - dlsch_subframe[dlsch_thread_index]<<1); - - LOG_I(PHY,"[UE %d] PDSCH Calling dlsch_decoding for subframe %d, harq_pid %d, G%d\n", phy_vars_ue->Mod_id,dlsch_subframe[dlsch_thread_index], harq_pid, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0+dlsch_thread_index,1); - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid], - dlsch_subframe[dlsch_thread_index], - harq_pid, - 1, // is_crnti - 0); // llr8_flag - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0+dlsch_thread_index,0); - - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid, - phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],ret, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); - - - if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_ue->dlsch_errors[eNB_id]++; - -#ifdef DEBUG_PHY - LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid,phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); -#endif - } else { - LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH (rv %d,mcs %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid,phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); - -#ifdef OPENAIR2 - mac_xface->ue_send_sdu(phy_vars_ue->Mod_id, - 0, // CC_id - phy_vars_ue->frame_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->b, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS>>3, - eNB_id); -#endif - phy_vars_ue->total_TBS[eNB_id] = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS + phy_vars_ue->total_TBS[eNB_id]; - phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_received_bits[eNB_id] + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS; - } - } - - // this is done in main thread - /* - if (phy_vars_ue->frame % 100 == 0) { - if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0) - phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]); - phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id]; - phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id]; - } - */ - - -#ifdef DEBUG_PHY - - if (phy_vars_ue->dlsch_ue[eNB_id][0]) { - LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid, - phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],ret, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); - - if (phy_vars_ue->frame_rx%100==0) { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index], - phy_vars_ue->dlsch_errors[eNB_id], - phy_vars_ue->dlsch_received[eNB_id], - phy_vars_ue->dlsch_fer[eNB_id], - phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id]); - } - } else { - LOG_I( PHY,"[UE %d][PDSCH ?/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (phy_vars_ue->dlsch_ue[eNB_id][0] == 0)\n", - phy_vars_ue->Mod_id, - harq_pid, - phy_vars_ue->frame_rx, dlsch_subframe[dlsch_thread_index], ret ); - } - -#endif - - if (pthread_mutex_lock(&dlsch_mutex[dlsch_thread_index]) != 0) { - msg("[openair][SCHED][DLSCH] error locking mutex.\n"); - } else { - dlsch_instance_cnt[dlsch_thread_index]--; - - if (pthread_mutex_unlock(&dlsch_mutex[dlsch_thread_index]) != 0) { - msg("[openair][SCHED][DLSCH] error unlocking mutex.\n"); - } - } - - } - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - msg("[openair][SCHED][DLSCH] DLSCH thread %d exiting\n",dlsch_thread_index); - - return 0; -} - -int init_dlsch_threads(void) -{ - - int error_code; - struct sched_param p; - unsigned char dlsch_thread_index; - - pthread_attr_init (&attr_dlsch_threads); - pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE); - //attr_dlsch_threads.priority = 1; - - p.sched_priority = OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_dlsch_threads, &p); -#ifndef RTAI_ISNT_POSIX - pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); -#endif - - for(dlsch_thread_index=0; dlsch_thread_index<8; dlsch_thread_index++) { - - pthread_mutex_init(&dlsch_mutex[dlsch_thread_index],NULL); - pthread_cond_init(&dlsch_cond[dlsch_thread_index],NULL); - - dlsch_instance_cnt[dlsch_thread_index] = -1; - dlsch_thread_indices[dlsch_thread_index] = dlsch_thread_index; - rt_printk("[openair][SCHED][DLSCH][INIT] Allocating DLSCH thread for dlsch_thread_index %d (%p)\n",dlsch_thread_index,&dlsch_thread_indices[dlsch_thread_index]); - error_code = pthread_create(&dlsch_threads[dlsch_thread_index], - &attr_dlsch_threads, - dlsch_thread, - (void *)&dlsch_thread_indices[dlsch_thread_index]); - - if (error_code!= 0) { - rt_printk("[openair][SCHED][DLSCH][INIT] Could not allocate dlsch_thread %d, error %d\n",dlsch_thread_index,error_code); - return(error_code); - } else { - rt_printk("[openair][SCHED][DLSCH][INIT] Allocate dlsch_thread %d successful\n",dlsch_thread_index); - } - } - - return(0); -} - -void cleanup_dlsch_threads(void) -{ - - unsigned char dlsch_thread_index; - - for(dlsch_thread_index=0; dlsch_thread_index<8; dlsch_thread_index++) { - // pthread_exit(&dlsch_threads[dlsch_thread_index]); - rt_printk("[openair][SCHED][DLSCH] Scheduling dlsch_thread %d to exit\n",dlsch_thread_index); - - dlsch_instance_cnt[dlsch_thread_index] = 0; - - if (pthread_cond_signal(&dlsch_cond[dlsch_thread_index]) != 0) - rt_printk("[openair][SCHED][DLSCH] ERROR pthread_cond_signal\n"); - else - rt_printk("[openair][SCHED][DLSCH] Signalled dlsch_thread %d to exit\n",dlsch_thread_index); - - rt_printk("[openair][SCHED][DLSCH] Exiting ...\n"); - pthread_cond_destroy(&dlsch_cond[dlsch_thread_index]); - pthread_mutex_destroy(&dlsch_mutex[dlsch_thread_index]); - } -} diff --git a/targets/RT/USER/sched_rx_pdsch.c b/targets/RT/USER/sched_rx_pdsch.c deleted file mode 100644 index e792fe737d..0000000000 --- a/targets/RT/USER/sched_rx_pdsch.c +++ /dev/null @@ -1,321 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file sched_dlsch.c -* \brief DLSCH decoding thread (RTAI) -* \author R. Knopp, F. Kaltenberger -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include - -#include "rt_wrapper.h" - -#include - -#include "PHY/types.h" -#include "PHY/defs.h" -#include "PHY/extern.h" -#include "SCHED/defs.h" -#include "SCHED/extern.h" - -#include "UTIL/LOG/vcd_signal_dumper.h" - -RTIME time0,time1; - -#define DEBUG_PHY - -/// Mutex for instance count on rx_pdsch scheduling -pthread_mutex_t rx_pdsch_mutex; -/// Condition variable for rx_pdsch thread -pthread_cond_t rx_pdsch_cond; - -pthread_t rx_pdsch_thread_var; -pthread_attr_t attr_rx_pdsch_thread; - -// activity indicators for harq_pid's -int rx_pdsch_instance_cnt; -// process ids for cpu -int rx_pdsch_cpuid; -// subframe number for each harq_pid (needed to store ack in right place for UL) -int rx_pdsch_slot; - -extern int oai_exit; -extern pthread_mutex_t dlsch_mutex[8]; -extern int dlsch_instance_cnt[8]; -extern int dlsch_subframe[8]; -extern pthread_cond_t dlsch_cond[8]; - -/** RX_PDSCH Decoding Thread */ -static void * rx_pdsch_thread(void *param) -{ - - //unsigned long cpuid; - uint8_t dlsch_thread_index = 0; - uint8_t pilot2,harq_pid,subframe; - // uint8_t last_slot; - - uint8_t dual_stream_UE = 0; - uint8_t i_mod = 0; - - -#ifdef RTAI - RT_TASK *task; -#endif - - int m,eNB_id = 0; - int eNB_id_i = 1; - PHY_VARS_UE *UE = PHY_vars_UE_g[0][0]; - -#ifdef RTAI - task = rt_task_init_schmod(nam2num("RX_PDSCH_THREAD"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][RX_PDSCH] Problem starting rx_pdsch thread!!!!\n"); - return 0; - } else { - LOG_I(PHY,"[SCHED][RX_PDSCH] rx_pdsch_thread started for with id %p\n",task); - } - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - //rt_set_runnable_on_cpuid(task,1); - //cpuid = rtai_cpuid(); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - if (UE->lte_frame_parms.Ncp == NORMAL) { // normal prefix - pilot2 = 7; - } else { // extended prefix - pilot2 = 6; - } - - - while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_THREAD, 0); - - if (pthread_mutex_lock(&rx_pdsch_mutex) != 0) { - LOG_E(PHY,"[SCHED][RX_PDSCH] error locking mutex.\n"); - } else { - while (rx_pdsch_instance_cnt < 0) { - pthread_cond_wait(&rx_pdsch_cond,&rx_pdsch_mutex); - } - - if (pthread_mutex_unlock(&rx_pdsch_mutex) != 0) { - LOG_E(PHY,"[SCHED][RX_PDSCH] error unlocking mutex.\n"); - } - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_THREAD, 1); - - // last_slot = rx_pdsch_slot; - subframe = UE->slot_rx>>1; - // Important! assumption that PDCCH procedure of next SF is not called yet - harq_pid = UE->dlsch_ue[eNB_id][0]->current_harq_pid; - UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&UE->lte_frame_parms, - UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs), - UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, - UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - UE->frame_rx,subframe); - - if ((UE->transmission_mode[eNB_id] == 5) && - (UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver > 0)) { - dual_stream_UE = 1; - eNB_id_i = UE->n_connected_eNB; - - if (openair_daq_vars.use_ia_receiver == 2) { - i_mod = get_Qm(((UE->frame_rx%1024)/3)%28); - } else { - i_mod = get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); - } - } else { - dual_stream_UE = 0; - eNB_id_i = eNB_id+1; - i_mod = 0; - } - - if (oai_exit) break; - - LOG_D(PHY,"[SCHED][RX_PDSCH] Frame %d, slot %d: Calling rx_pdsch_decoding with harq_pid %d\n",UE->frame_rx,UE->slot_rx,harq_pid); - - - // Check if we are in even or odd slot - if (UE->slot_rx%2) { // odd slots - - // measure time - //time0 = rt_get_time_ns(); - // rt_printk("[SCHED][RX_PDSCH][before rx_pdsch] Frame %d, slot %d, time %llu\n",UE->frame,last_slot,rt_get_time_ns()); - for (m=pilot2; mlte_frame_parms.symbols_per_tti; m++) { - - rx_pdsch(UE, - PDSCH, - eNB_id, - eNB_id_i, - subframe, - m, - 0, - dual_stream_UE, - i_mod, - harq_pid); - - } - - // time1 = rt_get_time_ns(); - // rt_printk("[SCHED][RX_PDSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",UE->frame_rx,last_slot,time0,time1,(time1-time0)); - - dlsch_thread_index = harq_pid; - - if (pthread_mutex_lock (&dlsch_mutex[dlsch_thread_index]) != 0) { // Signal MAC_PHY Scheduler - LOG_E(PHY,"[UE %d] ERROR pthread_mutex_lock\n",UE->Mod_id); // lock before accessing shared resource - // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - //return(-1); - } - - dlsch_instance_cnt[dlsch_thread_index]++; - dlsch_subframe[dlsch_thread_index] = subframe; - pthread_mutex_unlock (&dlsch_mutex[dlsch_thread_index]); - - if (dlsch_instance_cnt[dlsch_thread_index] == 0) { - if (pthread_cond_signal(&dlsch_cond[dlsch_thread_index]) != 0) { - LOG_E(PHY,"[UE %d] ERROR pthread_cond_signal for dlsch_cond[%d]\n",UE->Mod_id,dlsch_thread_index); - // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - //return(-1); - } - } else { - LOG_W(PHY,"[UE %d] DLSCH thread for dlsch_thread_index %d busy!!!\n",UE->Mod_id,dlsch_thread_index); - // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - //return(-1); - } - - } else { // even slots - - for (m=UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; mlte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag - dual_stream_UE, - i_mod, - harq_pid); - } - } - - - if (pthread_mutex_lock(&rx_pdsch_mutex) != 0) { - msg("[openair][SCHED][RX_PDSCH] error locking mutex.\n"); - } else { - rx_pdsch_instance_cnt--; - - if (pthread_mutex_unlock(&rx_pdsch_mutex) != 0) { - msg("[openair][SCHED][RX_PDSCH] error unlocking mutex.\n"); - } - } - - } - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - LOG_D(PHY,"[openair][SCHED][RX_PDSCH] RX_PDSCH thread exiting\n"); - - return 0; -} - -int init_rx_pdsch_thread(void) -{ - - int error_code; - struct sched_param p; - - pthread_mutex_init(&rx_pdsch_mutex,NULL); - - pthread_cond_init(&rx_pdsch_cond,NULL); - - pthread_attr_init (&attr_rx_pdsch_thread); - pthread_attr_setstacksize(&attr_rx_pdsch_thread,OPENAIR_THREAD_STACK_SIZE); - - //attr_rx_pdsch_thread.priority = 1; - - p.sched_priority = OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_rx_pdsch_thread, &p); -#ifndef RTAI_ISNT_POSIX - pthread_attr_setschedpolicy (&attr_rx_pdsch_thread, SCHED_FIFO); -#endif - - rx_pdsch_instance_cnt = -1; - rt_printk("[openair][SCHED][RX_PDSCH][INIT] Allocating RX_PDSCH thread\n"); - error_code = pthread_create(&rx_pdsch_thread_var, - &attr_rx_pdsch_thread, - rx_pdsch_thread, - 0); - - if (error_code!= 0) { - rt_printk("[openair][SCHED][RX_PDSCH][INIT] Could not allocate rx_pdsch_thread, error %d\n",error_code); - return(error_code); - } else { - rt_printk("[openair][SCHED][RX_PDSCH][INIT] Allocate rx_pdsch_thread successful\n"); - return(0); - } - -} - -void cleanup_rx_pdsch_thread(void) -{ - - rt_printk("[openair][SCHED][RX_PDSCH] Scheduling rx_pdsch_thread to exit\n"); - - rx_pdsch_instance_cnt = 0; - - if (pthread_cond_signal(&rx_pdsch_cond) != 0) - rt_printk("[openair][SCHED][RX_PDSCH] ERROR pthread_cond_signal\n"); - else - rt_printk("[openair][SCHED][RX_PDSCH] Signalled rx_pdsch_thread to exit\n"); - - rt_printk("[openair][SCHED][RX_PDSCH] Exiting ...\n"); - pthread_cond_destroy(&rx_pdsch_cond); - pthread_mutex_destroy(&rx_pdsch_mutex); -} diff --git a/targets/RT/USER/sched_ulsch.c b/targets/RT/USER/sched_ulsch.c deleted file mode 100644 index 3ab0c312f5..0000000000 --- a/targets/RT/USER/sched_ulsch.c +++ /dev/null @@ -1,255 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file sched_ulsch.c -* \brief ULSCH decoding thread (RTAI) -* \author R. Knopp, F. Kaltenberger -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include - -#include "rt_wrapper.h" - -#include - -#include "PHY/types.h" -#include "PHY/defs.h" -#include "PHY/extern.h" - -#include "SCHED/defs.h" - -#include "MAC_INTERFACE/extern.h" - -#ifdef CBMIMO1 -#include "ARCH/CBMIMO1/DEVICE_DRIVER/cbmimo1_device.h" -#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h" -#include "ARCH/CBMIMO1/DEVICE_DRIVER/defs.h" -#endif // CBMIMO1 - - - -#define DEBUG_PHY - -/// Mutex for instance count on ulsch scheduling -pthread_mutex_t ulsch_mutex[NUMBER_OF_UE_MAX]; -/// Condition variable for ulsch thread -pthread_cond_t ulsch_cond[NUMBER_OF_UE_MAX]; - -pthread_t ulsch_threads[NUMBER_OF_UE_MAX]; -pthread_attr_t attr_ulsch_threads; - -// activity indicators for harq_pid's -int ulsch_instance_cnt[NUMBER_OF_UE_MAX]; -// process ids for cpu -int ulsch_cpuid[NUMBER_OF_UE_MAX]; -// subframe number for each harq_pid (needed to store ack in right place for UL) -int ulsch_subframe[NUMBER_OF_UE_MAX]; - -extern int oai_exit; - -/* -extern int ulsch_errors; -extern int ulsch_received; -extern int ulsch_errors_last; -extern int ulsch_received_last; -extern int ulsch_fer; -extern int current_ulsch_cqi; -*/ - -/** ULSCH Decoding Thread */ -static void * ulsch_thread(void *param) -{ - - //unsigned long cpuid; - unsigned int ulsch_thread_index = (unsigned int)param; - - RTIME time_in,time_out; -#ifdef RTAI - RT_TASK *task; - char ulsch_thread_name[64]; -#endif - - int eNB_id = 0, UE_id = 0; - PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[eNB_id]; - - if ((ulsch_thread_index <0) || (ulsch_thread_index>NUMBER_OF_UE_MAX)) { - LOG_E(PHY,"[SCHED][ULSCH] Illegal ulsch_thread_index %d!!!!\n",ulsch_thread_index); - return 0; - } - -#ifdef RTAI - sprintf(ulsch_thread_name,"ULSCH_THREAD%d",ulsch_thread_index); - - LOG_I(PHY,"[SCHED][ULSCH] starting ulsch_thread %s for process %d\n", - ulsch_thread_name, - ulsch_thread_index); - - task = rt_task_init_schmod(nam2num(ulsch_thread_name), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][ULSCH] Problem starting ulsch_thread_index %d!!!!\n",ulsch_thread_index); - return 0; - } else { - LOG_I(PHY,"[SCHED][ULSCH] ulsch_thread for process %d started with id %p\n", - ulsch_thread_index, - task); - } - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - //rt_set_runnable_on_cpuid(task,1); - //cpuid = rtai_cpuid(); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - //ulsch_cpuid[ulsch_thread_index] = cpuid; - - while (!oai_exit) { - - if (pthread_mutex_lock(&ulsch_mutex[ulsch_thread_index]) != 0) { - LOG_E(PHY,"[SCHED][ULSCH] error locking mutex.\n"); - } else { - - while (ulsch_instance_cnt[ulsch_thread_index] < 0) { - pthread_cond_wait(&ulsch_cond[ulsch_thread_index],&ulsch_mutex[ulsch_thread_index]); - } - - if (pthread_mutex_unlock(&ulsch_mutex[ulsch_thread_index]) != 0) { - LOG_E(PHY,"[SCHED][ULSCH] error unlocking mutex.\n"); - } - } - - if (oai_exit) break; - - LOG_D(PHY,"[SCHED][ULSCH] Frame %d: Calling ulsch_decoding with ulsch_thread_index = %d\n",phy_vars_eNB->proc[0].frame_tx,ulsch_thread_index); - - time_in = rt_get_time_ns(); - - ulsch_decoding_procedures(ulsch_subframe[ulsch_thread_index]<<1,ulsch_thread_index,phy_vars_eNB,0); - - time_out = rt_get_time_ns(); - - if (pthread_mutex_lock(&ulsch_mutex[ulsch_thread_index]) != 0) { - msg("[openair][SCHED][ULSCH] error locking mutex.\n"); - } else { - ulsch_instance_cnt[ulsch_thread_index]--; - - if (pthread_mutex_unlock(&ulsch_mutex[ulsch_thread_index]) != 0) { - msg("[openair][SCHED][ULSCH] error unlocking mutex.\n"); - } - } - } - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - msg("[openair][SCHED][ULSCH] ULSCH thread %d exiting\n",ulsch_thread_index); - - return 0; -} - -int init_ulsch_threads(void) -{ - - int error_code, return_code=0; - struct sched_param p; - int ulsch_thread_index; - - // later loop on all harq_pids, do 0 for now - for (ulsch_thread_index=0; ulsch_thread_index Date: Fri, 13 May 2016 02:15:09 -0700 Subject: [PATCH 014/340] RRCConnectionSetupComplete-Timer --- cmake_targets/CMakeLists.txt | 2 +- openair1/PHY/CODING/3gpplte_sse.c | 2 +- openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c | 1 + openair2/RRC/LITE/rrc_common.c | 4 ++-- openair2/RRC/LITE/rrc_eNB.c | 8 +++++++- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index b50c017a92..611ce31e54 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -138,7 +138,7 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") endif() if (CPUINFO MATCHES "sse4_1") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mavx2") endif() if (CPUINFO MATCHES "ssse3") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3") diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c index 50c084d2a8..6806967921 100755 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -52,7 +52,7 @@ #define print_bytes2(s,x) printf("%s %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7],(x)[8],(x)[9],(x)[10],(x)[11],(x)[12],(x)[13],(x)[14],(x)[15],(x)[16],(x)[17],(x)[18],(x)[19],(x)[20],(x)[21],(x)[22],(x)[23],(x)[24],(x)[25],(x)[26],(x)[27],(x)[28],(x)[29],(x)[30],(x)[31]) //#define DEBUG_TURBO_ENCODER 1 -#define CALLGRIND 1 +//#define CALLGRIND 1 unsigned short threegpplte_interleaver_output; unsigned long long threegpplte_interleaver_tmp; diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c index b70b1aee95..f5be10ae39 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c @@ -44,6 +44,7 @@ /// /// +#undef __AVX2__ #include "PHY/sse_intrin.h" #ifndef TEST_DEBUG diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index bd77c8463a..2092317647 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -536,8 +536,8 @@ rrc_rx_tx( } if (ue_context_p->ue_context.ue_release_timer>0) { ue_context_p->ue_context.ue_release_timer++; - if (ue_context_p->ue_context.ue_release_timer >= 100) { - // remove UE after 10 frames after RRCConnectionRelease is triggered + if (ue_context_p->ue_context.ue_release_timer >= + ue_context_p->ue_context.ue_release_timer_thres) { LOG_I(RRC,"Removing UE %x instance\n",ue_context_p->ue_context.rnti); ue_to_be_removed = ue_context_p; break; diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index e67f0af0d3..0d7c8f915e 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1094,7 +1094,8 @@ rrc_eNB_generate_RRCConnectionRelease( size = do_RRCConnectionRelease(ctxt_pP->module_id, buffer,rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id)); // set release timer ue_context_pP->ue_context.ue_release_timer=1; - + // remove UE after 10 frames after RRCConnectionRelease is triggered + ue_context_pP->ue_context.ue_release_timer_thres=100; LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate RRCConnectionRelease (bytes %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), @@ -3385,6 +3386,10 @@ rrc_eNB_generate_RRCConnectionSetup( PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); + // activate release timer, if RRCSetupComplete not received after 10 frames, remove UE + ue_context_pP->ue_context.ue_release_timer=1; + // remove UE after 10 frames after RRCConnectionRelease is triggered + ue_context_pP->ue_context.ue_release_timer_thres=100; } #if defined(ENABLE_ITTI) @@ -4132,6 +4137,7 @@ rrc_eNB_decode_dcch( } } + ue_context_p->ue_context.ue_release_timer=0; break; case UL_DCCH_MessageType__c1_PR_securityModeComplete: From 475f1f8937f343ecdf5c4b324b5b6fc0a108fad6 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 15 May 2016 02:07:06 -0700 Subject: [PATCH 015/340] removed -mavx2 from CMakelists.txt for non AVX2 targets --- cmake_targets/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 611ce31e54..b50c017a92 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -138,7 +138,7 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") endif() if (CPUINFO MATCHES "sse4_1") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mavx2") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1") endif() if (CPUINFO MATCHES "ssse3") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3") From d3d423f51ebbe94affbb3999aa30313781c839d3 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 15 May 2016 14:10:04 -0700 Subject: [PATCH 016/340] split phy_procedures_eNB_TX into sub-modules for better understanding. No functional differences. --- openair1/PHY/LTE_TRANSPORT/defs.h | 4 +- openair1/PHY/LTE_TRANSPORT/prach.c | 2 +- openair1/PHY/LTE_TRANSPORT/print_stats.c | 4 +- openair1/PHY/TOOLS/lte_phy_scope.c | 4 +- openair1/PHY/TOOLS/lte_phy_scope.h | 1 - openair1/PHY/defs.h | 14 + openair1/SCHED/defs.h | 3 +- openair1/SCHED/extern.h | 1 - openair1/SCHED/phy_mac_stub.c | 66 +- openair1/SCHED/phy_procedures_lte_eNb.c | 2743 ++++++++++----------- openair1/SCHED/phy_procedures_lte_ue.c | 71 +- openair1/SCHED/vars.h | 1 - openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 10 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 8 +- openair2/LAYER2/MAC/pre_processor.c | 2 +- targets/RT/USER/lte-softmodem.c | 49 +- targets/RT/USER/lte-ue.c | 4 +- targets/SIMU/USER/oaisim.c | 2 +- targets/SIMU/USER/oaisim_functions.c | 21 +- 19 files changed, 1440 insertions(+), 1570 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 43bc7e3515..a8ebb99c8a 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -726,7 +726,9 @@ typedef enum {format0, format2B, format2C, format2D, - format3 + format3, + format3A, + format4 } DCI_format_t; typedef enum { diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index b93519d393..5e58b13737 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -638,7 +638,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra prach_start = ((subframe*phy_vars_ue->lte_frame_parms.samples_per_tti)<<1)-phy_vars_ue->N_TA_offset; #else #if defined(EXMIMO) || defined(OAI_USRP) - prach_start = (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-openair_daq_vars.timing_advance-phy_vars_ue->N_TA_offset); + prach_start = (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-phy_vars_ue->hw_timing_advance-phy_vars_ue->N_TA_offset); if (prach_start<0) prach_start+=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 7445fca40f..16cc75b290 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -102,7 +102,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB); #endif #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset); + len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz, estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset); #endif len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]); len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance); @@ -529,7 +529,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t #endif len += sprintf(&buffer[len], "[UE PROC] DLSCH Bitrate %dkbps\n",(phy_vars_ue->bitrate[0]/1000)); len += sprintf(&buffer[len], "[UE PROC] Total Received Bits %dkbits\n",(phy_vars_ue->total_received_bits[0]/1000)); - len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",openair_daq_vars.use_ia_receiver); + len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",phy_vars_ue->use_ia_receiver); } diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 4b623fb9dc..468aae8052 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -47,11 +47,11 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg) if (fl_get_button(button)) { fl_set_object_label(button, "IA Receiver ON"); - openair_daq_vars.use_ia_receiver = 1; + // PHY_vars_UE_g[0][0]->use_ia_receiver = 1; fl_set_object_color(button, FL_GREEN, FL_GREEN); } else { fl_set_object_label(button, "IA Receiver OFF"); - openair_daq_vars.use_ia_receiver = 0; + // PHY_vars_UE_g[0][0]->use_ia_receiver = 0; fl_set_object_color(button, FL_RED, FL_RED); } } diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h index 877934fc7a..814e340808 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.h +++ b/openair1/PHY/TOOLS/lte_phy_scope.h @@ -37,7 +37,6 @@ #include "../defs.h" #include "../../SCHED/defs.h" // for OPENAIR_DAQ_VARS -extern OPENAIR_DAQ_VARS openair_daq_vars; /* Forms and Objects */ typedef struct { diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 26239b024c..b72c5f648a 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -330,6 +330,15 @@ typedef struct PHY_VARS_eNB_s { MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX]; + /// target_ue_dl_mcs : only for debug purposes + uint32_t target_ue_dl_mcs; + /// target_ue_ul_mcs : only for debug purposes + uint32_t target_ue_ul_mcs; + /// target_ue_dl_rballoc : only for debug purposes + uint32_t ue_dl_rb_alloc; + /// target ul PRBs : only for debug + uint32_t ue_ul_nb_rb; + ///check for Total Transmissions uint32_t check_for_total_transmissions; @@ -347,6 +356,8 @@ typedef struct PHY_VARS_eNB_s { uint32_t total_transmitted_bits; uint32_t total_system_throughput; + int hw_timing_advance; + time_stats_t phy_proc; time_stats_t phy_proc_tx; time_stats_t phy_proc_rx; @@ -577,6 +588,7 @@ typedef struct { // uint8_t prach_timer; int rx_offset; /// Timing offset int timing_advance; ///timing advance signalled from eNB + int hw_timing_advance; int N_TA_offset; ///timing offset used in TDD /// Flag to tell if UE is secondary user (cognitive mode) unsigned char is_secondary_ue; @@ -645,6 +657,8 @@ typedef struct { time_stats_t phy_proc_tx; time_stats_t phy_proc_rx; + uint32_t use_ia_receiver; + time_stats_t ofdm_mod_stats; time_stats_t ulsch_encoding_stats; time_stats_t ulsch_modulation_stats; diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index af6acca880..23e44d6692 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -86,7 +86,7 @@ enum openair_SYNCH_STATUS { #define DAQ_AGC_OFF 0 - +/* typedef struct { boolean_t is_eNB; uint8_t mode; @@ -133,6 +133,7 @@ typedef struct { uint32_t get_frame_done; uint32_t use_ia_receiver; } OPENAIR_DAQ_VARS; +*/ #ifndef USER_MODE int32_t openair_sched_init(void); diff --git a/openair1/SCHED/extern.h b/openair1/SCHED/extern.h index dd3892a290..657037b823 100644 --- a/openair1/SCHED/extern.h +++ b/openair1/SCHED/extern.h @@ -75,7 +75,6 @@ extern int openair_sched_status; extern int synch_wait_cnt; -extern OPENAIR_DAQ_VARS openair_daq_vars; extern int16_t hundred_times_delta_TF[100]; extern uint16_t hundred_times_log10_NPRB[100]; diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 286b11b4ad..ea6e45e739 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -234,7 +234,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; @@ -253,7 +253,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -265,7 +265,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; @@ -284,7 +284,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -301,7 +301,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; @@ -320,7 +320,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); @@ -332,7 +332,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; @@ -351,7 +351,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); @@ -367,7 +367,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; @@ -386,7 +386,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -398,7 +398,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; @@ -417,7 +417,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -438,14 +438,14 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = openair_daq_vars.target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = phy_vars_eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = openair_daq_vars.target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = phy_vars_eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = openair_daq_vars.ue_dl_rb_alloc; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = phy_vars_eNB->ue_dl_rb_alloc; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0; } else if (transmission_mode==5) { @@ -462,13 +462,13 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]]; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu1E.mcs = phy_vars_eNB->target_ue_dl_mcs; //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; DLSCH_alloc_pdu1E.harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; DLSCH_alloc_pdu1E.dai = 0; DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rballoc = phy_vars_eNB->ue_dl_rb_alloc; DLSCH_alloc_pdu1E.rah = 0; DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); @@ -479,7 +479,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc[1].rnti = 0x1236; DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; DCI_pdu->dci_alloc[1].ra_flag = 0; - //DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + //DLSCH_alloc_pdu1E.mcs = phy_vars_eNB->target_ue_dl_mcs; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28); @@ -531,8 +531,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,2,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cshift = 0; @@ -551,10 +551,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.rballoc = computeRIV(25,2+phy_vars_eNB->ue_ul_nb_rb,phy_vars_eNB->ue_ul_nb_rb); else - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) @@ -611,11 +611,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN DCI_pdu->dci_alloc[0].format = format1; DCI_pdu->dci_alloc[0].ra_flag = 0; - DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu.rballoc = phy_vars_eNB->ue_dl_rb_alloc; DLSCH_alloc_pdu.TPC = 0; DLSCH_alloc_pdu.dai = 0; DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu.mcs = phy_vars_eNB->target_ue_dl_mcs; DLSCH_alloc_pdu.ndi = 1; DLSCH_alloc_pdu.rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -632,7 +632,7 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN DLSCH_alloc_pdu.TPC = 0; DLSCH_alloc_pdu.dai = 0; DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu.mcs = phy_vars_eNB->target_ue_dl_mcs; DLSCH_alloc_pdu.ndi = 1; DLSCH_alloc_pdu.rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -649,11 +649,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback DLSCH_alloc_pdu1E.rv = 0; DLSCH_alloc_pdu1E.ndi = 1; - DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + DLSCH_alloc_pdu1E.mcs = phy_vars_eNB->target_ue_dl_mcs; DLSCH_alloc_pdu1E.harq_pid = 1; DLSCH_alloc_pdu1E.dai = 0; DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rballoc = phy_vars_eNB->ue_dl_rb_alloc; DLSCH_alloc_pdu1E.rah = 0; DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); @@ -705,8 +705,8 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = 1; UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cshift = 0; @@ -725,10 +725,10 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.rballoc = computeRIV(25,2+phy_vars_eNB->ue_ul_nb_rb,phy_vars_eNB->ue_ul_nb_rb); else - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = 1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6a785ebf33..b0a94b8f59 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -90,7 +90,7 @@ int max_sync_pos; fifo_dump_emos_eNB emos_dump_eNB; #endif -#if defined(SMBV) && !defined(EXMIMO) +#if defined(SMBV) extern const char smbv_fname[]; extern unsigned short config_frames[4]; extern uint8_t smbv_frame_cnt; @@ -211,7 +211,7 @@ int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { #ifdef DEBUG_PHY_PROC LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",phy_vars_eNB->Mod_id,i,rnti); #endif - //msg("[PHY] UE_id %d\n",i); + //LOG_D(PHY,("[PHY] UE_id %d\n",i); clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]); clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]); //phy_vars_eNB->eNB_UE_stats[i].crnti = 0; @@ -562,49 +562,710 @@ void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshol unsigned int taus(void); -void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag, - relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) -{ - UNUSED(phy_vars_rn); - uint8_t *pbch_pdu=&phy_vars_eNB->pbch_pdu[0]; - uint16_t input_buffer_length, re_allocated=0; - uint32_t i,aa; - uint8_t harq_pid; - DCI_PDU *DCI_pdu; - uint8_t *DLSCH_pdu=NULL; - DCI_PDU DCI_pdu_tmp; - uint8_t DLSCH_pdu_tmp[768*8]; - int8_t UE_id; - uint8_t num_pdcch_symbols=0; - uint8_t ul_subframe; - uint32_t ul_frame; +void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int sched_subframe,int abstraction_flag,relaying_type_t r_type) { + #ifdef Rel10 MCH_PDU *mch_pduP; MCH_PDU mch_pdu; // uint8_t sync_area=255; #endif -#if defined(SMBV) && !defined(EXMIMO) + + if (abstraction_flag==0) { + // This is DL-Cell spec pilots in Control region + generate_pilots_slot(eNB, + eNB->lte_eNB_common_vars.txdataF[0], + AMP, + subframe<<1,1); + } + +#ifdef Rel10 + // if mcch is active, send regardless of the node type: eNB or RN + // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing + mch_pduP = mac_xface->get_mch_sdu(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, + subframe); + + switch (r_type) { + case no_relay: + if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 + LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs, + eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); + else { + LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->sync_area, + (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment"); + mch_pduP = NULL; + } + + break; + + case multicast_relay: + if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)) { + LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", + rn->Mod_id,rn->frame, subframe, + mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size); + } else if (rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8 + mch_pduP= &mch_pdu; + memcpy(&mch_pduP->payload, // could be a simple copy + rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b, + rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); + mch_pduP->Pdu_size = (uint16_t) (rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); + mch_pduP->mcs = rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs; + LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", + rn->Mod_id,rn->frame, subframe,subframe%5, + rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size); + } else { + mch_pduP=NULL; + } + + rn->mch_avtive[subframe]=0; + break; + + default: + LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,r_type); + mch_pduP=NULL; + break; + }// switch + + if (mch_pduP) { + fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag); + // Generate PMCH + generate_mch(eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag); + } else { + LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",eNB->proc[sched_subframe].frame_tx,subframe); + } + +#endif +} + +void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB,int abstraction_flag) { + + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + int **txdataF = eNB->lte_eNB_common_vars.txdataF[0]; + uint8_t *pbch_pdu=&eNB->pbch_pdu[0]; + + // generate Cell-Specific Reference Signals for both slots + if (abstraction_flag==0) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); + generate_pilots_slot(eNB, + txdataF, + AMP, + subframe<<1,0); + // check that 2nd slot is for DL + if (subframe_select(fp,subframe) == SF_DL) + generate_pilots_slot(eNB, + txdataF, + AMP, + (subframe<<1)+1,0); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0); + } + + // First half of PSS/SSS (FDD, slot 0) + if (subframe == 0) { + if ((fp->frame_type == FDD) && + (abstraction_flag==0)) { + generate_pss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 0); + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 5 : 4, + 0); + + } + + // generate PBCH (Physical Broadcast CHannel) info + if ((eNB->proc[sched_subframe].frame_tx&3) == 0) { + pbch_pdu[2] = 0; + + // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators + switch (fp->N_RB_DL) { + case 6: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (0<<5); + break; + + case 15: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (1<<5); + break; + + case 25: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); + break; + + case 50: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (3<<5); + break; + + case 75: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (4<<5); + break; + + case 100: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (5<<5); + break; + + default: + // FIXME if we get here, this should be flagged as an error, right? + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); + break; + } + + pbch_pdu[2] = (pbch_pdu[2]&0xef) | + ((fp->phich_config_common.phich_duration << 4)&0x10); + + switch (fp->phich_config_common.phich_resource) { + case oneSixth: + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (0<<2); + break; + + case half: + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (1<<2); + break; + + case one: + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (2<<2); + break; + + case two: + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (3<<2); + break; + + default: + // unreachable + break; + } + + pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((eNB->proc[sched_subframe].frame_tx>>8)&0x3); + pbch_pdu[1] = eNB->proc[sched_subframe].frame_tx&0xfc; + pbch_pdu[0] = 0; + } + + /// First half of SSS (TDD, slot 1) + + if ((fp->frame_type == TDD)&& + (abstraction_flag==0)){ + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 1); + } + + /// generate PBCH + if (abstraction_flag==0) { + generate_pbch(&eNB->lte_eNB_pbch, + txdataF, + AMP, + fp, + pbch_pdu, + eNB->proc[sched_subframe].frame_tx&3); + } +#ifdef PHY_ABSTRACTION + else { + generate_pbch_emul(eNB,pbch_pdu); + } +#endif + + } + else if ((subframe == 1) && + (fp->frame_type == TDD)&& + (abstraction_flag==0)) { + generate_pss(txdataF, + AMP, + fp, + 2, + 2); + } + + // Second half of PSS/SSS (FDD, slot 10) + else if ((subframe == 5) && + (fp->frame_type == FDD) && + (abstraction_flag==0)) { + generate_pss(txdataF, + AMP, + &eNB->lte_frame_parms, + (fp->Ncp==NORMAL) ? 6 : 5, + 10); + generate_sss(txdataF, + AMP, + &eNB->lte_frame_parms, + (fp->Ncp==NORMAL) ? 5 : 4, + 10); + + } + + // Second-half of SSS (TDD, slot 11) + else if ((subframe == 5) && + (fp->frame_type == TDD) && + (abstraction_flag==0)) { + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 11); + } + + // Second half of PSS (TDD, slot 12) + else if ((subframe == 6) && + (fp->frame_type == TDD) && + (abstraction_flag==0)) { + generate_pss(txdataF, + AMP, + fp, + 2, + 12); + } + +} + +void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subframe,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { + + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + + // if we have SI_RNTI, configure dlsch parameters and CCE index + if (dci_alloc->rnti == SI_RNTI) { + LOG_D(PHY,"Generating dlsch params for SI_RNTI\n"); + generate_eNB_dlsch_params_from_dci(frame, + subframe, + &dci_alloc->dci_pdu[0], + dci_alloc->rnti, + dci_alloc->format, + &eNB->dlsch_eNB_SI, + fp, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->eNB_UE_stats[0].DL_pmi_single); + + + eNB->dlsch_eNB_SI->nCCE[subframe] = dci_alloc->firstCCE; + + LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, + eNB->dlsch_eNB_SI->nCCE[subframe]); + +#if defined(SMBV) + + // configure SI DCI + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", dci_alloc, i); + } + +#endif + + + } else if (dci_alloc->ra_flag == 1) { // This is format 1A allocation for RA + // configure dlsch parameters and CCE index + LOG_D(PHY,"Generating dlsch params for RA_RNTI\n"); + generate_eNB_dlsch_params_from_dci(frame, + subframe, + &dci_alloc->dci_pdu[0], + dci_alloc->rnti, + dci_alloc->format, + &eNB->dlsch_eNB_ra, + fp, + eNB->pdsch_config_dedicated, + SI_RNTI, + dci_alloc->rnti, + P_RNTI, + eNB->eNB_UE_stats[0].DL_pmi_single); + + + eNB->dlsch_eNB_ra->nCCE[subframe] = dci_alloc->firstCCE; + + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, + eNB->dlsch_eNB_ra->nCCE[subframe]); +#if defined(SMBV) + + // configure RA DCI + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", dci_alloc, i); + } + +#endif + + } + + else if ((dci_alloc->format != format0)&& + (dci_alloc->format != format3)&& + (dci_alloc->format != format3A)&& + (dci_alloc->format != format4)){ // this is a normal DLSCH allocation + + + + if (UE_id>=0) { +#if defined(SMBV) + // Configure this user + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, + dci_alloc->rnti,eNB->transmission_mode[(uint8_t)UE_id]); + smbv_configure_user(smbv_fname,UE_id+1,eNB->transmission_mode[(uint8_t)UE_id],dci_alloc->rnti); + } + +#endif + + LOG_D(PHY,"Generating dlsch params for RNTI %x\n",dci_alloc->rnti); + generate_eNB_dlsch_params_from_dci(frame, + subframe, + &dci_alloc->dci_pdu[0], + dci_alloc->rnti, + dci_alloc->format, + eNB->dlsch_eNB[(uint8_t)UE_id], + fp, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->eNB_UE_stats[(uint8_t)UE_id].DL_pmi_single); + LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n", + eNB->Mod_id,dci_alloc->rnti,eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,eNB->proc[sched_subframe].frame_tx,subframe); + + + eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE; + + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, + dci_alloc->rnti,eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe]); + +#if defined(SMBV) + + // configure UE-spec DCI + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1,dci_alloc, i); + } + +#endif + + LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n", + eNB->Mod_id, dci_alloc->rnti, + eNB->proc[sched_subframe].frame_tx, subframe,UE_id, + dci_alloc->format, + 1<L); + } else { + LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,dci_alloc->rnti); + } + } + +} + +void generate_eNB_ulsch_params(const int frame,const int subframe,int sched_subframe,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { + + int harq_pid; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + + LOG_D(PHY, + "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n", + eNB->Mod_id, + subframe2harq_pid(fp, + pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_subframe(fp,subframe)), + eNB->proc[sched_subframe].frame_tx, + subframe, + pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_subframe(fp,subframe), + dci_alloc->rnti, + dci_alloc->dci_pdu[0], + 1<L); + + generate_eNB_ulsch_params_from_dci(&dci_alloc->dci_pdu[0], + dci_alloc->rnti, + sched_subframe, + format0, + UE_id, + eNB, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + 0); // do_srs + + LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d\n", + eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,dci_alloc->rnti, + dci_alloc->firstCCE); + +#if defined(SMBV) + + // configure UE-spec DCI for UL Grant + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); + } + +#endif + + + // get the hard_pid for this subframe + harq_pid = subframe2harq_pid(fp, + pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_subframe(fp,subframe)); + + if (harq_pid==255) { // should not happen, log an error and exit, this is a fatal error + LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx); + mac_xface->macphy_exit("FATAL\n"); + } + + if ((dci_alloc->rnti >= CBA_RNTI) && (dci_alloc->rnti < P_RNTI)) + eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; + else + eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + +} + +void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int subframe,int sched_subframe,int num_pdcch_symbols,int abstraction_flag) { + + int harq_pid = dlsch->current_harq_pid; + LTE_DL_eNB_HARQ_t *dlsch_harq=dlsch->harq_processes[harq_pid]; + int input_buffer_length = dlsch_harq->TBS/8; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + uint8_t *DLSCH_pdu=NULL; + uint8_t DLSCH_pdu_tmp[768*8]; + uint8_t DLSCH_pdu_rar[256]; + int i; + + LOG_D(PHY, + "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", + eNB->Mod_id, dlsch->rnti,harq_pid, + eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + get_Qm(dlsch_harq->mcs), + dlsch_harq->Nl, + num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + dlsch_harq->nb_rb, + dlsch_harq->mcs, + pmi2hex_2Ar1(dlsch_harq->pmi_alloc), + dlsch_harq->rvidx, + dlsch_harq->round); + +#if defined(MESSAGE_CHART_GENERATOR_PHY) + MSC_LOG_TX_MESSAGE( + MSC_PHY_ENB,MSC_PHY_UE, + NULL,0, + "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")", + eNB->proc[sched_subframe].frame_tx, subframe, + input_buffer_length, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + get_Qm(dlsch_harq->mcs), + dlsch_harq->Nl, + num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + dlsch_harq->nb_rb, + dlsch_harq->mcs, + pmi2hex_2Ar1(dlsch_harq->pmi_alloc), + dlsch_harq->rvidx, + dlsch_harq->round); +#endif + + if (ue_stats) ue_stats->dlsch_sliding_cnt++; + + if (dlsch_harq->round == 0) { + + if (ue_stats) + ue_stats->dlsch_trials[harq_pid][0]++; + + if (eNB->mac_enabled==1) { + if (ra_flag == 0) { + DLSCH_pdu = mac_xface->get_dlsch_sdu(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, + dlsch->rnti, + 0); + } + else { + int16_t crnti = mac_xface->fill_rar(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, + DLSCH_pdu_rar, + fp->N_RB_UL, + input_buffer_length); + DLSCH_pdu = DLSCH_pdu_rar; + + int UE_id; + + if (crnti!=0) + UE_id = add_ue(crnti,eNB); + else + UE_id = -1; + + if (UE_id==-1) { + LOG_W(PHY,"[eNB] Max user count reached.\n"); + mac_xface->cancel_ra_proc(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, + crnti); + } else { + eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE; + // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged) + eNB->first_sr[(uint32_t)UE_id] = 1; + + generate_eNB_ulsch_params_from_rar(DLSCH_pdu, + eNB->proc[sched_subframe].frame_tx, + (subframe), + eNB->ulsch_eNB[(uint32_t)UE_id], + fp); + + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1; + + get_Msg3_alloc(fp, + subframe, + eNB->proc[sched_subframe].frame_tx, + &eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, + &eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + LOG_D(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %"PRId8" in frame %"PRIu32", subframe %"PRIu8"\n", + eNB->proc[sched_subframe].frame_tx, + subframe, + UE_id, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + } + if (ue_stats) ue_stats->total_TBS_MAC += dlsch_harq->TBS; + } + } + else { + DLSCH_pdu = DLSCH_pdu_tmp; + + for (i=0; iproc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + smbv_configure_datalist_for_user(smbv_fname, find_ue(dlsch->rnti,eNB)+1, DLSCH_pdu, input_buffer_length); + } + +#endif + + +#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_DLSCH + LOG_T(PHY,"eNB DLSCH SDU: \n"); + + for (i=0; iTBS>>3; i++) + LOG_T(PHY,"%"PRIx8".",DLSCH_pdu[i]); + + LOG_T(PHY,"\n"); +#endif +#endif + } else { + ue_stats->dlsch_trials[harq_pid][dlsch_harq->round]++; +#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_DLSCH + LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n"); +#endif +#endif + } + + if (abstraction_flag==0) { + + LOG_D(PHY,"Generating DLSCH/PDSCH %d\n",ra_flag); + // 36-212 + start_meas(&eNB->dlsch_encoding_stats); + dlsch_encoding(DLSCH_pdu, + fp, + num_pdcch_symbols, + dlsch, + eNB->proc[sched_subframe].frame_tx,subframe, + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats); + stop_meas(&eNB->dlsch_encoding_stats); + // 36-211 + start_meas(&eNB->dlsch_scrambling_stats); + dlsch_scrambling(fp, + 0, + dlsch, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + get_Qm(dlsch_harq->mcs), + dlsch_harq->Nl, + num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + 0, + subframe<<1); + stop_meas(&eNB->dlsch_scrambling_stats); + start_meas(&eNB->dlsch_modulation_stats); + + + dlsch_modulation(eNB->lte_eNB_common_vars.txdataF[0], + AMP, + subframe, + fp, + num_pdcch_symbols, + dlsch, + dlsch1); + + stop_meas(&eNB->dlsch_modulation_stats); + } + +#ifdef PHY_ABSTRACTION + else { + start_meas(&eNB->dlsch_encoding_stats); + dlsch_encoding_emul(eNB, + DLSCH_pdu, + dlsch); + stop_meas(&eNB->dlsch_encoding_stats); + } + +#endif + dlsch->active = 0; +} + +void phy_procedures_eNB_TX(unsigned char sched_subframe, + PHY_VARS_eNB *eNB, + uint8_t abstraction_flag, + relaying_type_t r_type, + PHY_VARS_RN *rn) +{ + UNUSED(rn); + uint16_t input_buffer_length; + uint32_t i,aa; + uint8_t harq_pid; + DCI_PDU *DCI_pdu; + DCI_PDU DCI_pdu_tmp; + int8_t UE_id; + uint8_t num_pdcch_symbols=0; + uint8_t ul_subframe; + uint32_t ul_frame; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + DCI_ALLOC_t *dci_alloc=(DCI_ALLOC_t *)NULL; + +#if defined(SMBV) // counts number of allocations in subframe // there is at least one allocation for PDCCH uint8_t smbv_alloc_cnt = 1; #endif - int frame = phy_vars_eNB->proc[sched_subframe].frame_tx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + int frame = eNB->proc[sched_subframe].frame_tx; + int subframe = eNB->proc[sched_subframe].subframe_tx; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); - start_meas(&phy_vars_eNB->phy_proc_tx); + start_meas(&eNB->phy_proc_tx); for (i=0; ieNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) { + if (eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) { LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors); - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; - mac_xface->UL_failure_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + eNB->Mod_id,eNB->CC_id,frame,subframe, i, eNB->eNB_UE_stats[i].ulsch_consecutive_errors); + eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + mac_xface->UL_failure_indication(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->eNB_UE_stats[i].crnti, + eNB->eNB_UE_stats[i].crnti, subframe); } @@ -613,589 +1274,134 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } - // Get scheduling info for next subframe - if (phy_vars_eNB->mac_enabled==1) { - if (phy_vars_eNB->CC_id == 0) { - mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1); +// Get scheduling info for next subframe +// This is called only for the CC_id = 0 and triggers scheduling for all CC_id's + if (eNB->mac_enabled==1) { + if (eNB->CC_id == 0) { + mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,eNB->proc[sched_subframe].frame_tx,subframe);//,1); } } +// clear the transmit data array for the current subframe if (abstraction_flag==0) { - // clear the transmit data array for the current subframe - for (aa=0; aalte_frame_parms.nb_antennas_tx_eNB; aa++) { - - memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)], - 0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(int32_t)); + for (aa=0; aanb_antennas_tx_eNB; aa++) { + memset(&eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], + 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); } } - - if (is_pmch_subframe(phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,&phy_vars_eNB->lte_frame_parms)) { - - if (abstraction_flag==0) { - // This is DL-Cell spec pilots in Control region - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe<<1,1); - } - -#ifdef Rel10 - // if mcch is active, send regardless of the node type: eNB or RN - // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing - mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe); - - switch (r_type) { - case no_relay: - if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 - LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); - else { - LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->sync_area, - (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment"); - mch_pduP = NULL; - } - - break; - - case multicast_relay: - if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)) { - LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe, - mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size); - } else if (phy_vars_rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8 - mch_pduP= &mch_pdu; - memcpy(&mch_pduP->payload, // could be a simple copy - phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b, - phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); - mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); - mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs; - LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,subframe%5, - phy_vars_rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size); - } else { - mch_pduP=NULL; - } - - phy_vars_rn->mch_avtive[subframe]=0; - break; - - default: - LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,r_type); - mch_pduP=NULL; - break; - }// switch - - if (mch_pduP) { - fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag); - // Generate PMCH - generate_mch(phy_vars_eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag); -#ifdef DEBUG_PHY - - for (i=0; iPdu_size; i++) - msg("%2"PRIx8".",(uint8_t)mch_pduP->payload[i]); - - msg("\n"); -#endif - } else { - LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - } - -#endif + if (is_pmch_subframe(eNB->proc[sched_subframe].frame_tx,subframe,fp)) { + pmch_procedures(eNB,rn,subframe,sched_subframe,abstraction_flag,r_type); } - else { - // this is not a pmch subframe - - if (abstraction_flag==0) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe<<1,0); - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_DL) - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - (subframe<<1)+1,0); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0); - - // First half of PSS/SSS (FDD) - if (subframe == 0) { - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 0); - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4, - 0); - - } - } - } + // this is not a pmch subframe, so generate PSS/SSS/PBCH + common_signal_procedures(subframe,sched_subframe,eNB,abstraction_flag); } - if (subframe == 0) { - // generate PBCH (Physical Broadcast CHannel) info - if ((phy_vars_eNB->proc[sched_subframe].frame_tx&3) == 0) { - pbch_pdu[2] = 0; - - // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (0<<5); - break; - - case 15: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (1<<5); - break; - - case 25: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); - break; - - case 50: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (3<<5); - break; - - case 75: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (4<<5); - break; - - case 100: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (5<<5); - break; - - default: - // FIXME if we get here, this should be flagged as an error, right? - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); - break; - } - - pbch_pdu[2] = (pbch_pdu[2]&0xef) | - ((phy_vars_eNB->lte_frame_parms.phich_config_common.phich_duration << 4)&0x10); - - switch (phy_vars_eNB->lte_frame_parms.phich_config_common.phich_resource) { - case oneSixth: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (0<<2); - break; - - case half: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (1<<2); - break; - - case one: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (2<<2); - break; - - case two: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (3<<2); - break; - - default: - // unreachable - break; - } - - pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((phy_vars_eNB->proc[sched_subframe].frame_tx>>8)&0x3); - pbch_pdu[1] = phy_vars_eNB->proc[sched_subframe].frame_tx&0xfc; - pbch_pdu[0] = 0; - } - - /// First half of SSS (TDD) - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 1); - } - } - - - - - if (abstraction_flag==0) { - - generate_pbch(&phy_vars_eNB->lte_eNB_pbch, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - pbch_pdu, - phy_vars_eNB->proc[sched_subframe].frame_tx&3); - - } - -#ifdef PHY_ABSTRACTION - else { - generate_pbch_emul(phy_vars_eNB,pbch_pdu); - } - -#endif - - - } - - if (subframe == 1) { - - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - 2, - 2); - } - } - } - - // Second half of PSS/SSS (FDD) - if (subframe == 5) { - - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 10); - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4, - 10); - - } - } - } - - // Second-half of SSS (TDD) - if (subframe == 5) { - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 11); - } - } - } - - // Second half of PSS (TDD) - if (subframe == 6) { - - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - 2, - 12); - } - } - } - - - -#if defined(SMBV) && !defined(EXMIMO) +#if defined(SMBV) // PBCH takes one allocation - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { if (subframe==0) smbv_alloc_cnt++; } #endif - if (phy_vars_eNB->mac_enabled==1) { + if (eNB->mac_enabled==1) { // Parse DCI received from MAC VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); - DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, + DCI_pdu = mac_xface->get_dci_sdu(eNB->Mod_id, + eNB->CC_id, + eNB->proc[sched_subframe].frame_tx, subframe); } else { DCI_pdu = &DCI_pdu_tmp; #ifdef EMOS_CHANNEL - fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB); + fill_dci_emos(DCI_pdu,sched_subframe,eNB); #else - fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB); + fill_dci(DCI_pdu,sched_subframe,eNB); #endif } // clear existing ulsch dci allocations before applying info from MAC (this is table - ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe); - ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); + ul_subframe = pdcch_alloc2ul_subframe(fp,subframe); + ul_frame = pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe); - if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) || - (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) { - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe); + if ((subframe_select(fp,ul_subframe)==SF_UL) || + (fp->frame_type == FDD)) { + harq_pid = subframe2harq_pid(fp,ul_frame,ul_subframe); + // clear DCI allocation maps for new subframe for (i=0; iulsch_eNB[i]) { - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0; + if (eNB->ulsch_eNB[i]) { + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0; } } // clear previous allocation information for all UEs for (i=0; idlsch_eNB[i][0]->subframe_tx[subframe] = 0; + eNB->dlsch_eNB[i][0]->subframe_tx[subframe] = 0; } num_pdcch_symbols = DCI_pdu->num_pdcch_symbols; - - LOG_D(PHY,"num_pdcch_symbols %"PRIu8", nCCE %u (dci commond %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols,DCI_pdu->nCCE, + LOG_D(PHY,"num_pdcch_symbols %"PRIu8", (dci commond %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols, DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); -#if defined(SMBV) && !defined(EXMIMO) - +#if defined(SMBV) // Sets up PDCCH and DCI table - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { - msg("[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); - dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]); + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); + dump_dci(fp,&DCI_pdu->dci_alloc[0]); smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (subframe),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); } - #endif - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->num_pdcch_symbols); + // loop over all DCIs for this subframe to generate DLSCH allocations for (i=0; iNum_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { LOG_D(PHY,"[eNB] Subframe %d: DCI %d/%d : rnti %x, CCEind %d\n",subframe,i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,DCI_pdu->dci_alloc[i].rnti,DCI_pdu->dci_alloc[i].firstCCE); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].rnti); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].format); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].firstCCE); + dci_alloc = &DCI_pdu->dci_alloc[i]; - if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) { - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - &phy_vars_eNB->dlsch_eNB_SI, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - - phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe],DCI_pdu->nCCE); - -#if defined(SMBV) && !defined(EXMIMO) - - // configure SI DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", &DCI_pdu->dci_alloc[i], i); - } - -#endif - - - } else if (DCI_pdu->dci_alloc[i].ra_flag == 1) { - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - &phy_vars_eNB->dlsch_eNB_ra, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - DCI_pdu->dci_alloc[i].rnti, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - - phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe],DCI_pdu->nCCE); -#if defined(SMBV) && !defined(EXMIMO) - - // configure RA DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", &DCI_pdu->dci_alloc[i], i); - } - -#endif - - } - - else if (DCI_pdu->dci_alloc[i].format != format0) { // this is a normal DLSCH allocation - - if (phy_vars_eNB->mac_enabled==1) - UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); + if ((dci_alloc->rnti<= P_RNTI) && + (dci_alloc->ra_flag!=1)) { + if (eNB->mac_enabled==1) + UE_id = find_ue((int16_t)dci_alloc->rnti,eNB); else UE_id = i; - - if (UE_id>=0) { - if ((frame%100)==0) { - LOG_D(PHY,"Frame %3d, SF %d \n",frame,subframe); - dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); - } -#if defined(SMBV) && !defined(EXMIMO) - // Configure this user - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, - DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(uint8_t)UE_id]); - smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(uint8_t)UE_id],DCI_pdu->dci_alloc[i].rnti); - } - -#endif - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id], - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].DL_pmi_single); - LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n", - phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - - - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe],DCI_pdu->nCCE); - -#if defined(SMBV) && !defined(EXMIMO) - - // configure UE-spec DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); - } - -#endif - - LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n", - phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,UE_id, - DCI_pdu->dci_alloc[i].format, - 1<dci_alloc[i].L); - } else { - LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti); - } } + else UE_id=0; + + generate_eNB_dlsch_params(frame,subframe,sched_subframe,eNB,dci_alloc,UE_id); } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,(frame*10)+subframe); // Apply physicalConfigDedicated if needed - phy_config_dedicated_eNB_step2(phy_vars_eNB); - + // This is for UEs that have received this IE, which changes these DL and UL configuration, we apply after a delay for the eNodeB UL parameters + phy_config_dedicated_eNB_step2(eNB); + + // Now loop again over the DCIs for UL configuration for (i=0; iNum_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { - if (DCI_pdu->dci_alloc[i].format == format0) { // this is a ULSCH allocation - - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)); - - if (harq_pid==255) { - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx); - return; - } - - if (phy_vars_eNB->mac_enabled==1) - UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); + if (dci_alloc->format == format0) { // this is a ULSCH allocation + if (eNB->mac_enabled==1) + UE_id = find_ue((int16_t)dci_alloc->rnti,eNB); else UE_id = i; - - if (UE_id<0) { - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti); - mac_exit_wrapper("Invalid UE id (< 0) detected"); - return; // not reached + + if (UE_id<0) { // should not happen, log an error and exit, this is a fatal error + LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,dci_alloc->rnti); + mac_xface->macphy_exit("FATAL\n"); } - - LOG_D(PHY, - "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8") (DCI pos %"PRIu32"/%d), aggregation %d\n", - phy_vars_eNB->Mod_id, - subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)), - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe), - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].dci_pdu[0], - i, - DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci, - 1<dci_alloc[i].L); - - generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - sched_subframe, - format0, - UE_id, - phy_vars_eNB, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - 0); // do_srs - - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d/%u\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].firstCCE,DCI_pdu->nCCE); - -#if defined(SMBV) && !defined(EXMIMO) - - // configure UE-spec DCI for UL Grant - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); - } - -#endif - - - - if ((DCI_pdu->dci_alloc[i].rnti >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI)) - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; - else - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - + generate_eNB_ulsch_params(frame,subframe,sched_subframe,eNB,dci_alloc,UE_id); } } @@ -1208,14 +1414,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } else { // for emulation!! - phy_vars_eNB->num_ue_spec_dci[(subframe)&1]=0; - phy_vars_eNB->num_common_dci[(subframe)&1]=0; + eNB->num_ue_spec_dci[(subframe)&1]=0; + eNB->num_common_dci[(subframe)&1]=0; } if (abstraction_flag == 0) { if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx, subframe, DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); @@ -1224,16 +1430,16 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc, 0, AMP, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], + fp, + eNB->lte_eNB_common_vars.txdataF[0], subframe); } #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious else { - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe); - num_pdcch_symbols = generate_dci_top_emul(phy_vars_eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe); + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx, subframe); + num_pdcch_symbols = generate_dci_top_emul(eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe); } #endif @@ -1242,361 +1448,65 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e // Check for SI activity - if (phy_vars_eNB->dlsch_eNB_SI->active == 1) { - input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8; + if (eNB->dlsch_eNB_SI->active == 1) { + pdsch_procedures(eNB,eNB->dlsch_eNB_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); - if (phy_vars_eNB->mac_enabled==1) { - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - SI_RNTI, - 0); - } - else { - DLSCH_pdu = DLSCH_pdu_tmp; - - for (i=0; iproc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length); } #endif - - if (abstraction_flag == 0) { - - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding(DLSCH_pdu, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_SI, - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - - start_meas(&phy_vars_eNB->dlsch_scrambling_stats); - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB_SI, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->nb_rb, - phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs), - 1, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - - stop_meas(&phy_vars_eNB->dlsch_scrambling_stats); - - start_meas(&phy_vars_eNB->dlsch_modulation_stats); - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_SI, - (LTE_eNB_DLSCH_t *)NULL); - stop_meas(&phy_vars_eNB->dlsch_modulation_stats); - } - -#ifdef PHY_ABSTRACTION - else { - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding_emul(phy_vars_eNB, - DLSCH_pdu, - phy_vars_eNB->dlsch_eNB_SI); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - } - -#endif - phy_vars_eNB->dlsch_eNB_SI->active = 0; - } // Check for RA activity - if (phy_vars_eNB->dlsch_eNB_ra->active == 1) { + if (eNB->dlsch_eNB_ra->active == 1) { - input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8; - - int16_t crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - dlsch_input_buffer, - phy_vars_eNB->lte_frame_parms.N_RB_UL, - input_buffer_length); - if (crnti!=0) - UE_id = add_ue(crnti,phy_vars_eNB); - else - UE_id = -1; - - if (UE_id==-1) { - LOG_W(PHY,"[eNB] Max user count reached.\n"); - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - crnti); - } else { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE; - // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged) - phy_vars_eNB->first_sr[(uint32_t)UE_id] = 1; - - generate_eNB_ulsch_params_from_rar(dlsch_input_buffer, - phy_vars_eNB->proc[sched_subframe].frame_tx, - (subframe), - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id], - &phy_vars_eNB->lte_frame_parms); - - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1; - - get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms, - subframe, - phy_vars_eNB->proc[sched_subframe].frame_tx, - &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - LOG_D(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %"PRId8" in frame %"PRIu32", subframe %"PRIu8"\n", - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe, - UE_id, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - -#if defined(SMBV) && !defined(EXMIMO) - - // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); - smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length); - } +#if defined(SMBV) + // Configures the data source of allocation (allocation is configured by DCI) + if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length); + } + #endif - - - LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - - - if (abstraction_flag == 0) { - - dlsch_encoding(dlsch_input_buffer, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_ra, - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - - // phy_vars_eNB->dlsch_eNB_ra->rnti = RA_RNTI; - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB_ra, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->nb_rb, - phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs), - 1, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_ra, - (LTE_eNB_DLSCH_t *)NULL); - } - -#ifdef PHY_ABSTRACTION - else { - dlsch_encoding_emul(phy_vars_eNB, - dlsch_input_buffer, - phy_vars_eNB->dlsch_eNB_ra); - } - -#endif - LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - - } //max user count - - phy_vars_eNB->dlsch_eNB_ra->active = 0; + + + LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", + eNB->Mod_id, + eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + + pdsch_procedures(eNB,eNB->dlsch_eNB_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); + + + eNB->dlsch_eNB_ra->active = 0; } - + // Now scan UE specific DLSCH for (UE_id=0; UE_iddlsch_eNB[(uint8_t)UE_id][0])&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) { - harq_pid = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid; - input_buffer_length = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS/8; + if ((eNB->dlsch_eNB[(uint8_t)UE_id][0])&& + (eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& + (eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) { + pdsch_procedures(eNB,eNB->dlsch_eNB[(uint8_t)UE_id][0],eNB->dlsch_eNB[(uint8_t)UE_id][1],&eNB->eNB_UE_stats[(uint32_t)UE_id],0,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); - LOG_D(PHY, - "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", - phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round); - -#if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_TX_MESSAGE( - MSC_PHY_ENB,MSC_PHY_UE, - NULL,0, - "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")", - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, - input_buffer_length, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round); -#endif - - phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].dlsch_sliding_cnt++; - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->harq_processes[harq_pid]->round == 0) { - - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][0]++; - - if (phy_vars_eNB->mac_enabled==1) { - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti, - 0); - phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS; - } - else { - DLSCH_pdu = DLSCH_pdu_tmp; - - for (i=0; iproc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); - smbv_configure_datalist_for_user(smbv_fname, UE_id+1, DLSCH_pdu, input_buffer_length); - } - -#endif - - -#ifdef DEBUG_PHY_PROC -#ifdef DEBUG_DLSCH - LOG_T(PHY,"eNB DLSCH SDU: \n"); - - for (i=0; idlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS>>3; i++) - LOG_T(PHY,"%"PRIx8".",DLSCH_pdu[i]); - - LOG_T(PHY,"\n"); -#endif -#endif - } else { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round]++; -#ifdef DEBUG_PHY_PROC -#ifdef DEBUG_DLSCH - LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n"); -#endif -#endif - } - - if (abstraction_flag==0) { - - // 36-212 - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding(DLSCH_pdu, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - // 36-211 - start_meas(&phy_vars_eNB->dlsch_scrambling_stats); - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - stop_meas(&phy_vars_eNB->dlsch_scrambling_stats); - start_meas(&phy_vars_eNB->dlsch_modulation_stats); - - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][1]); - - stop_meas(&phy_vars_eNB->dlsch_modulation_stats); - } - -#ifdef PHY_ABSTRACTION - else { - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding_emul(phy_vars_eNB, - DLSCH_pdu, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - } - -#endif - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0; - } - else if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 0)) { + else if ((eNB->dlsch_eNB[(uint8_t)UE_id][0])&& + (eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& + (eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 0)) { // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0; + eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0; } } @@ -1604,9 +1514,9 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e // if we have PHICH to generate - if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,subframe)) + if (is_phich_subframe(fp,subframe)) { - generate_phich_top(phy_vars_eNB, + generate_phich_top(eNB, sched_subframe, AMP, 0, @@ -1616,60 +1526,59 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #ifdef EMOS - phy_procedures_emos_eNB_TX(subframe, phy_vars_eNB); + phy_procedures_emos_eNB_TX(subframe, eNB); #endif #if !(defined(EXMIMO) || defined(OAI_USRP) || defined (CPRIGW)) if (abstraction_flag==0) { - start_meas(&phy_vars_eNB->ofdm_mod_stats); - do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - phy_vars_eNB->lte_eNB_common_vars.txdata[0], - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe<<1, - &phy_vars_eNB->lte_frame_parms); - do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - phy_vars_eNB->lte_eNB_common_vars.txdata[0], - phy_vars_eNB->proc[sched_subframe].frame_tx,1+(subframe<<1), - &phy_vars_eNB->lte_frame_parms); - stop_meas(&phy_vars_eNB->ofdm_mod_stats); + start_meas(&eNB->ofdm_mod_stats); + do_OFDM_mod(eNB->lte_eNB_common_vars.txdataF[0], + eNB->lte_eNB_common_vars.txdata[0], + eNB->proc[sched_subframe].frame_tx,subframe<<1, + fp); + do_OFDM_mod(eNB->lte_eNB_common_vars.txdataF[0], + eNB->lte_eNB_common_vars.txdata[0], + eNB->proc[sched_subframe].frame_tx,1+(subframe<<1), + fp); + stop_meas(&eNB->ofdm_mod_stats); } #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0); - stop_meas(&phy_vars_eNB->phy_proc_tx); + stop_meas(&eNB->phy_proc_tx); - (void)re_allocated; /* remove gcc warning "set but not used" */ } -void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid) +void process_Msg3(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid) { // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + int subframe = eNB->proc[sched_subframe].subframe_rx; + int frame = eNB->proc[sched_subframe].frame_rx; LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame,subframe, - UE_id,phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame); - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0; + UE_id,eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe, + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame); + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0; - if ((phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && - (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) && - (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame)) { + if ((eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && + (eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) && + (eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame)) { // harq_pid = 0; - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0; - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1; - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0; + eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1; + eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame,subframe,UE_id); } } @@ -1682,39 +1591,41 @@ void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_i void process_HARQ_feedback(uint8_t UE_id, uint8_t sched_subframe, - PHY_VARS_eNB *phy_vars_eNB, + PHY_VARS_eNB *eNB, uint8_t pusch_flag, uint8_t *pucch_payload, uint8_t pucch_sel, uint8_t SR_payload) { + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe; - LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]; - LTE_eNB_UE_stats *ue_stats = &phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id]; + LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_eNB[(uint32_t)UE_id][0]; + LTE_eNB_UE_stats *ue_stats = &eNB->eNB_UE_stats[(uint32_t)UE_id]; LTE_DL_eNB_HARQ_t *dlsch_harq_proc; uint8_t subframe_m4,M,m; int mp; int all_ACKed=1,nb_alloc=0,nb_ACK=0; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int harq_pid = subframe2harq_pid( &phy_vars_eNB->lte_frame_parms,frame,subframe); + int frame = eNB->proc[sched_subframe].frame_rx; + int subframe = eNB->proc[sched_subframe].subframe_rx; + int harq_pid = subframe2harq_pid( fp,frame,subframe); - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { //FDD + + if (fp->frame_type == FDD) { //FDD subframe_m4 = (subframe<4) ? subframe+6 : subframe-4; dl_harq_pid[0] = dlsch->harq_ids[subframe_m4]; M=1; if (pusch_flag == 1) { - dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; + dlsch_ACK[0] = eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; if (dlsch->subframe_tx[subframe_m4]==1) - LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",eNB->Mod_id, frame,dlsch_ACK[0],subframe_m4); } else { dlsch_ACK[0] = pucch_payload[0]; - LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUCCH for subframe %d\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUCCH for subframe %d\n",eNB->Mod_id, frame,dlsch_ACK[0],subframe_m4); /* if (dlsch_ACK[0]==0) @@ -1738,7 +1649,7 @@ void process_HARQ_feedback(uint8_t UE_id, #endif } else { // TDD Handle M=1,2 cases only - M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms, + M=ul_ACK_subframe2_M(fp, subframe); // Now derive ACK information for TDD @@ -1749,10 +1660,9 @@ void process_HARQ_feedback(uint8_t UE_id, // otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this, // but we have to adapt the code below. For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used - dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; - dlsch_ACK[1] = (phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling) - ?phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1]; - // printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]); + dlsch_ACK[0] = eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; + dlsch_ACK[1] = (eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling) + ?eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1]; } else { // PUCCH ACK/NAK @@ -1773,7 +1683,6 @@ void process_HARQ_feedback(uint8_t UE_id, nb_ACK = 3; } } else if (pucch_sel == 2) { // bundling or M=1 - // printf("*** (%d,%d)\n",pucch_payload[0],pucch_payload[1]); dlsch_ACK[0] = pucch_payload[0]; dlsch_ACK[1] = pucch_payload[0]; } else { // multiplexing with no SR, this is table 10.1 @@ -1801,7 +1710,7 @@ void process_HARQ_feedback(uint8_t UE_id, nb_alloc = 0; for (m=0; mlte_frame_parms, + dl_subframe = ul_ACK_subframe2_dl_subframe(fp, subframe, m); @@ -1813,14 +1722,12 @@ void process_HARQ_feedback(uint8_t UE_id, all_ACKed = 1; else all_ACKed = 0; - - // printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed); } for (m=0,mp=-1; mlte_frame_parms, + dl_subframe = ul_ACK_subframe2_dl_subframe(fp, subframe, m); @@ -1842,7 +1749,7 @@ void process_HARQ_feedback(uint8_t UE_id, if (dl_harq_pid[m]Mdlharq) { dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]]; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",eNB->Mod_id, dlsch->rnti,dl_harq_pid[m],dl_subframe, dlsch_harq_proc->status,dlsch_harq_proc->round, dlsch->harq_processes[dl_harq_pid[m]]->mcs, @@ -1858,11 +1765,10 @@ void process_HARQ_feedback(uint8_t UE_id, (dlsch_harq_proc->status == ACTIVE)) { // dl_harq_pid of DLSCH is still active - // msg("[PHY] eNB %d Process %d is active (%d)\n",phy_vars_eNB->Mod_id,dl_harq_pid[m],dlsch_ACK[m]); if ( dlsch_ACK[mp]==0) { // Received NAK #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",eNB->Mod_id, dlsch->rnti,dl_harq_pid[m],M,m,mp,dlsch_harq_proc->round); #endif @@ -1879,7 +1785,7 @@ void process_HARQ_feedback(uint8_t UE_id, if (dlsch_harq_proc->round == dlsch->Mlimit) { // This was the last round for DLSCH so reset round and increment l2_error counter #ifdef DEBUG_PHY_PROC - LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id, + LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",eNB->Mod_id, dlsch->rnti,dl_harq_pid[m]); #endif #if defined(MESSAGE_CHART_GENERATOR_PHY) @@ -1896,7 +1802,7 @@ void process_HARQ_feedback(uint8_t UE_id, } } else { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id, + LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",eNB->Mod_id, dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round); #endif ue_stats->dlsch_ACK[dl_harq_pid[m]][dlsch_harq_proc->round]++; @@ -1908,10 +1814,10 @@ void process_HARQ_feedback(uint8_t UE_id, dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; ue_stats->total_TBS = ue_stats->total_TBS + - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; + eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; /* ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits + - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; + eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; */ } @@ -1954,7 +1860,7 @@ void process_HARQ_feedback(uint8_t UE_id, } } -void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, +void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, uint8_t UE_id, uint8_t sched_subframe, int16_t *n1_pucch0, @@ -1963,18 +1869,17 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, int16_t *n1_pucch3) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&eNB->lte_frame_parms; uint8_t nCCE0,nCCE1; int sf; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + int frame = eNB->proc[sched_subframe].frame_rx; + int subframe = eNB->proc[sched_subframe].subframe_rx; if (frame_parms->frame_type == FDD ) { sf = (subframe<4) ? (subframe+6) : (subframe-4); - // printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]); - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) { - *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) { + *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]; *n1_pucch1 = -1; } else { *n1_pucch0 = -1; @@ -1985,15 +1890,15 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, switch (frame_parms->tdd_config) { case 1: // DL:S:UL:UL:DL:DL:S:UL:UL:DL if (subframe == 2) { // ACK subframes 5 and 6 - /* if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; + /* if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { + nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch1 = -1;*/ - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -2001,8 +1906,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, *n1_pucch1 = -1; } else if (subframe == 3) { // ACK subframe 9 - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -2012,8 +1917,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, } else if (subframe == 7) { // ACK subframes 0 and 1 //harq_ack[0].nCCE; //harq_ack[1].nCCE; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -2021,8 +1926,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, *n1_pucch1 = -1; } else if (subframe == 8) { // ACK subframes 4 //harq_ack[4].nCCE; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[4]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[4]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -2030,7 +1935,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, *n1_pucch1 = -1; } else { LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame, subframe,frame_parms->tdd_config); return; @@ -2040,49 +1945,49 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, case 3: // DL:S:UL:UL:UL:DL:DL:DL:DL:DL if (subframe == 2) { // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe) - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { + nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch1 = -1; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; } else if (subframe == 3) { // ACK subframes 7 and 8 LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n", - phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]); + eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7],eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]); - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[8]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) { + nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[8]; *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1); } else *n1_pucch1 = -1; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[7]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[7]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0); } else *n1_pucch0 = -1; } else if (subframe == 4) { // ACK subframes 9 and 0 - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { + nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch1 = -1; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; + if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { + nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; } else { LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config); + eNB->Mod_id,frame,subframe,frame_parms->tdd_config); return; } @@ -2095,26 +2000,27 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, } } -void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t abstraction_flag) +void prach_procedures(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t abstraction_flag) { + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; uint16_t preamble_energy_list[64],preamble_delay_list[64]; uint16_t preamble_max,preamble_energy_max; uint16_t i; int8_t UE_id; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - uint8_t CC_id = phy_vars_eNB->CC_id; + int subframe = eNB->proc[sched_subframe].subframe_rx; + int frame = eNB->proc[sched_subframe].frame_rx; + uint8_t CC_id = eNB->CC_id; memset(&preamble_energy_list[0],0,64*sizeof(uint16_t)); memset(&preamble_delay_list[0],0,64*sizeof(uint16_t)); if (abstraction_flag == 0) { - LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id, - frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB); + LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",eNB->Mod_id, + frame,subframe,dB_fixed(signal_energy(&eNB->lte_eNB_common_vars.rxdata[0][0][subframe*fp->samples_per_tti],512)) - eNB->rx_total_gain_eNB_dB); - rx_prach(phy_vars_eNB, + rx_prach(eNB, subframe, preamble_energy_list, preamble_delay_list, @@ -2126,12 +2032,12 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n", UE_id,PHY_vars_UE_g[UE_id][CC_id],PHY_vars_UE_g[UE_id][CC_id]->generate_prach, PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex, - phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex, + fp->prach_config_common.rootSequenceIndex, PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex); if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach==1) && (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex == - phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) { + fp->prach_config_common.rootSequenceIndex) ) { preamble_energy_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 800; preamble_delay_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 5; @@ -2158,15 +2064,15 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t if (preamble_energy_list[preamble_max] > 580) { - UE_id = find_next_ue_index(phy_vars_eNB); + UE_id = find_next_ue_index(eNB); if (UE_id>=0) { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits + eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0; + eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0; LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + eNB->Mod_id, + eNB->CC_id, frame, subframe, UE_id, @@ -2175,10 +2081,10 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t preamble_energy_max%10, preamble_delay_list[preamble_max]); - if (phy_vars_eNB->mac_enabled==1) { + if (eNB->mac_enabled==1) { uint8_t update_TA=4; - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (fp->N_RB_DL) { case 6: update_TA = 16; break; @@ -2196,8 +2102,8 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t break; } - mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->initiate_ra_proc(eNB->Mod_id, + eNB->CC_id, frame, preamble_max, preamble_delay_list[preamble_max]*update_TA, @@ -2207,24 +2113,24 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t } else { MSC_LOG_EVENT(MSC_PHY_ENB, "0 RA Failed add user, too many"); LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", - phy_vars_eNB->Mod_id,frame, subframe); + eNB->Mod_id,frame, subframe); } } } -void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag) +void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *eNB, unsigned char abstraction_flag) { UNUSED(subframe); UNUSED(i); - UNUSED(phy_vars_eNB); + UNUSED(eNB); UNUSED(abstraction_flag); LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called"); } -void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3; uint8_t do_SR = 0; @@ -2233,20 +2139,20 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ ANFBmode_t bundling_flag; PUCCH_FMT_t format; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + const int subframe = eNB->proc[sched_subframe].subframe_rx; + const int frame = eNB->proc[sched_subframe].frame_rx; - if ((phy_vars_eNB->dlsch_eNB[UE_id][0]) && - (phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti>0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { + if ((eNB->dlsch_eNB[UE_id][0]) && + (eNB->dlsch_eNB[UE_id][0]->rnti>0) && + (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { // check SR availability - do_SR = is_SR_subframe(phy_vars_eNB,UE_id,sched_subframe); + do_SR = is_SR_subframe(eNB,UE_id,sched_subframe); // do_SR = 0; // Now ACK/NAK // First check subframe_tx flag for earlier subframes - get_n1_pucch_eNB(phy_vars_eNB, + get_n1_pucch_eNB(eNB, UE_id, sched_subframe, &n1_pucch0, @@ -2255,7 +2161,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ &n1_pucch3); LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + eNB->Mod_id,eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); @@ -2264,41 +2170,41 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ // otherwise we have some PUCCH detection to do // Null out PUCCH PRBs for noise measurement - switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) { + switch(fp->N_RB_UL) { case 6: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 + eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 break; case 15: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 + eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 break; case 25: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 + eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 break; case 50: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) break; case 75: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) break; case 100: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) break; default: - LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL); + LOG_E(PHY,"Unknown number for N_RB_UL %d\n",fp->N_RB_UL); break; } if (do_SR == 1) { - phy_vars_eNB->eNB_UE_stats[UE_id].sr_total++; + eNB->eNB_UE_stats[UE_id].sr_total++; if (abstraction_flag == 0) - metric0_SR = rx_pucch(phy_vars_eNB, + metric0_SR = rx_pucch(eNB, pucch_format1, UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, 0, // n2_pucch 0, // shortened format, should be use_srs flag, later &SR_payload, @@ -2307,56 +2213,56 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ #ifdef PHY_ABSTRACTION else { - metric0_SR = rx_pucch_emul(phy_vars_eNB, + metric0_SR = rx_pucch_emul(eNB, UE_id, pucch_format1, 0, &SR_payload, sched_subframe); - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id, + eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); } #endif if (SR_payload == 1) { - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); - phy_vars_eNB->eNB_UE_stats[UE_id].sr_received++; + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id, + eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); + eNB->eNB_UE_stats[UE_id].sr_received++; - if (phy_vars_eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 + if (eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 /* is this test necessary? */ - if (phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE) - put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[UE_id][0], 0); - phy_vars_eNB->first_sr[UE_id] = 0; - phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0; - phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE; + if (eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE) + put_harq_pid_in_freelist(eNB->dlsch_eNB[UE_id][0], 0); + eNB->first_sr[UE_id] = 0; + eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0; + eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE; LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); + eNB->Mod_id, + eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); } - if (phy_vars_eNB->mac_enabled==1) { - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + if (eNB->mac_enabled==1) { + mac_xface->SR_indication(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe); + eNB->dlsch_eNB[UE_id][0]->rnti,subframe); } } }// do_SR==1 if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR - } else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD + } else if (fp->frame_type==FDD) { // FDD // if SR was detected, use the n1_pucch from SR, else use n1_pucch0 - // n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; + // n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; - LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); + LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); if (abstraction_flag == 0) { - metric0 = rx_pucch(phy_vars_eNB, + metric0 = rx_pucch(eNB, pucch_format1a, UE_id, (uint16_t)n1_pucch0, @@ -2367,10 +2273,10 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ PUCCH1a_THRES); if (metric0 < metric0_SR) - metric0=rx_pucch(phy_vars_eNB, + metric0=rx_pucch(eNB, pucch_format1a, UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, 0, //n2_pucch 0, // shortened format pucch_payload0, @@ -2379,7 +2285,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + metric0 = rx_pucch_emul(eNB,UE_id, pucch_format1a, 0, pucch_payload0, @@ -2389,13 +2295,13 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + eNB->Mod_id, + eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, pucch_payload0[0],metric0); #endif - process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB, + process_HARQ_feedback(UE_id,sched_subframe,eNB, 0,// pusch_flag pucch_payload0, 2, @@ -2404,34 +2310,32 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } // FDD else { //TDD - bundling_flag = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; + bundling_flag = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; // fix later for 2 TB case and format1b - if ((frame_parms->frame_type==FDD) || + if ((fp->frame_type==FDD) || (bundling_flag==bundling) || - ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) { + ((fp->frame_type==TDD)&&(fp->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) { format = pucch_format1a; - // msg("PUCCH 1a\n"); - } else { + } else { format = pucch_format1b; - // msg("PUCCH 1b\n"); - } + } // if SR was detected, use the n1_pucch from SR if (SR_payload==1) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",eNB->Mod_id, + eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif if (abstraction_flag == 0) - metric0_SR = rx_pucch(phy_vars_eNB, + metric0_SR = rx_pucch(eNB, format, UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, 0, //n2_pucch 0, // shortened format pucch_payload0, @@ -2439,7 +2343,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + metric0 = rx_pucch_emul(eNB,UE_id, format, 0, pucch_payload0, @@ -2448,8 +2352,8 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } } else { //using n1_pucch0/n1_pucch1 resources #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",eNB->Mod_id, + eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif @@ -2459,7 +2363,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ // Check n1_pucch0 metric if (n1_pucch0 != -1) { if (abstraction_flag == 0) - metric0 = rx_pucch(phy_vars_eNB, + metric0 = rx_pucch(eNB, format, UE_id, (uint16_t)n1_pucch0, @@ -2470,7 +2374,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + metric0 = rx_pucch_emul(eNB,UE_id, format, 0, pucch_payload0, @@ -2482,7 +2386,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ // Check n1_pucch1 metric if (n1_pucch1 != -1) { if (abstraction_flag == 0) - metric1 = rx_pucch(phy_vars_eNB, + metric1 = rx_pucch(eNB, format, UE_id, (uint16_t)n1_pucch1, @@ -2493,7 +2397,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric1 = rx_pucch_emul(phy_vars_eNB,UE_id, + metric1 = rx_pucch_emul(eNB,UE_id, format, 1, pucch_payload1, @@ -2523,12 +2427,12 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",eNB->Mod_id, + eNB->dlsch_eNB[UE_id][0]->rnti, frame,subframe, metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); #endif - process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB, + process_HARQ_feedback(UE_id,sched_subframe,eNB, 0,// pusch_flag pucch_payload, pucch_sel, @@ -2539,61 +2443,62 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_ } } -void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { uint8_t access_mode; int num_active_cba_groups; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + const int subframe = eNB->proc[sched_subframe].subframe_rx; + const int frame = eNB->proc[sched_subframe].frame_rx; uint16_t rnti=0; int ret=0; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; - num_active_cba_groups = phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups; + num_active_cba_groups = eNB->ulsch_eNB[UE_id]->num_active_cba_groups; - if ((phy_vars_eNB->ulsch_eNB[UE_id]) && + if ((eNB->ulsch_eNB[UE_id]) && (num_active_cba_groups > 0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { + (eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && + (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { rnti=0; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, - UE_id, (uint16_t)phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[UE_id].mode]); + UE_id, (uint16_t)eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[eNB->eNB_UE_stats[UE_id].mode]); #endif if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, + rx_ulsch(eNB, sched_subframe, - phy_vars_eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id + eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id UE_id, - phy_vars_eNB->ulsch_eNB, + eNB->ulsch_eNB, 0); } #ifdef PHY_ABSTRACTION else { - rx_ulsch_emul(phy_vars_eNB, + rx_ulsch_emul(eNB, subframe, - phy_vars_eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id + eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id UE_id); } #endif if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, + ret = ulsch_decoding(eNB, UE_id, sched_subframe, 0, // control_only_flag - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI, + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); } #ifdef PHY_ABSTRACTION else { - ret = ulsch_decoding_emul(phy_vars_eNB, + ret = ulsch_decoding_emul(eNB, sched_subframe, UE_id, &rnti); @@ -2601,60 +2506,60 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN #endif - if (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) { + if (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - print_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); + print_CQI(eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); #endif access_mode = UNKNOWN_ACCESS; - extract_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format, - &phy_vars_eNB->eNB_UE_stats[UE_id], - phy_vars_eNB->lte_frame_parms.N_RB_DL, + extract_CQI(eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o, + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format, + &eNB->eNB_UE_stats[UE_id], + fp->N_RB_DL, &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[UE_id].rank = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0]; + eNB->eNB_UE_stats[UE_id].rank = eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0]; } - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE; if ((num_active_cba_groups > 0) && (UE_id + num_active_cba_groups < NUMBER_OF_UE_MAX) && - (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) && - (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) { + (eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) && + (eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid, - UE_id+num_active_cba_groups, UE_id%phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups); + eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid, + UE_id+num_active_cba_groups, UE_id%eNB->ulsch_eNB[UE_id]->num_active_cba_groups); #endif - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS; + eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; + eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; + eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS; } if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; + eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; } // ulsch in error else { LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe); - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1; + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0; + eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0; #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:", frame,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3); + harq_pid,eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3); - for (j=0; julsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]); + for (j=0; julsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]); LOG_T(PHY,"\n"); #endif @@ -2662,37 +2567,37 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN if (access_mode > UNKNOWN_ACCESS) { LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", - phy_vars_eNB->Mod_id, frame,subframe, - UE_id, phy_vars_eNB->ulsch_eNB[UE_id]->rnti, - UE_id % phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); + eNB->Mod_id, frame,subframe, + UE_id, eNB->ulsch_eNB[UE_id]->rnti, + UE_id % eNB->ulsch_eNB[UE_id]->num_active_cba_groups, eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); // detect if there is a CBA collision - if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + if (eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) { + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, frame,subframe, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3, + eNB->ulsch_eNB[UE_id]->rnti, + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b, + eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3, harq_pid, NULL); - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe); + eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe); } else { - if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 ) + if (eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 ) LOG_N(PHY,"[eNB%d] Frame %d subframe %d : first CBA collision detected \n ", - phy_vars_eNB->Mod_id,frame,subframe); + eNB->Mod_id,frame,subframe); LOG_N(PHY,"[eNB%d] Frame %d subframe %d : CBA collision set SR for UE %d in group %d \n ", - phy_vars_eNB->Mod_id,frame,subframe, - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups ); + eNB->Mod_id,frame,subframe, + eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups ); - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1; + eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1; - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->SR_indication(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe); + eNB->dlsch_eNB[UE_id][0]->rnti,subframe); } } // UNKNOWN_ACCESS } // ULSCH CBA not in error @@ -2700,61 +2605,61 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN } -void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) +void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) { //RX processing UNUSED(r_type); uint32_t l, ret=0,i,j,k; uint32_t harq_pid, harq_idx, round; uint8_t nPRS; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; int sync_pos; uint16_t rnti=0; uint8_t access_mode; + LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + const int subframe = eNB->proc[sched_subframe].subframe_rx; + const int frame = eNB->proc[sched_subframe].frame_rx; AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); - start_meas(&phy_vars_eNB->phy_proc_rx); + start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe); + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); #endif - phy_vars_eNB->rb_mask_ul[0]=0; - phy_vars_eNB->rb_mask_ul[1]=0; - phy_vars_eNB->rb_mask_ul[2]=0; - phy_vars_eNB->rb_mask_ul[3]=0; + eNB->rb_mask_ul[0]=0; + eNB->rb_mask_ul[1]=0; + eNB->rb_mask_ul[2]=0; + eNB->rb_mask_ul[3]=0; if (abstraction_flag == 0) { - remove_7_5_kHz(phy_vars_eNB,subframe<<1); - remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1); + remove_7_5_kHz(eNB,subframe<<1); + remove_7_5_kHz(eNB,(subframe<<1)+1); } // check if we have to detect PRACH first - if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) { + if (is_prach_subframe(fp,frame,subframe)>0) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag); + prach_procedures(eNB,sched_subframe,abstraction_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); } if (abstraction_flag == 0) { - start_meas(&phy_vars_eNB->ofdm_demod_stats); + start_meas(&eNB->ofdm_demod_stats); - for (l=0; llte_frame_parms.symbols_per_tti/2; l++) { + for (l=0; lsymbols_per_tti/2; l++) { - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, + slot_fep_ul(fp, + &eNB->lte_eNB_common_vars, l, subframe<<1, 0, 0 ); - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, + slot_fep_ul(fp, + &eNB->lte_eNB_common_vars, l, (subframe<<1)+1, 0, @@ -2762,265 +2667,265 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ ); } - stop_meas(&phy_vars_eNB->ofdm_demod_stats); + stop_meas(&eNB->ofdm_demod_stats); } // Check for active processes in current subframe - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, + harq_pid = subframe2harq_pid(fp, frame,subframe); // reset the cba flag used for collision detection for (i=0; i < NUM_MAX_CBA_GROUP; i++) { - phy_vars_eNB->cba_last_reception[i]=0; + eNB->cba_last_reception[i]=0; } // Do PUCCH processing first for (i=0; imac_enabled==1) { - if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { - process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid); + if (eNB->mac_enabled==1) { + if (eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { + process_Msg3(eNB,sched_subframe,i,harq_pid); } } - phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63; - phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = 0; - phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63; + eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63; + eNB->pusch_stats_round[i][(frame*10)+subframe] = 0; + eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63; - if ((phy_vars_eNB->ulsch_eNB[i]) && - (phy_vars_eNB->ulsch_eNB[i]->rnti>0) && - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { + if ((eNB->ulsch_eNB[i]) && + (eNB->ulsch_eNB[i]->rnti>0) && + (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { // UE is has ULSCH scheduling - round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; + round = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; for (int rb=0; - rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; + rb<=eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; rb++) { - int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb; - phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); + int rb2 = rb+eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb; + eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti,i); + eNB->Mod_id,harq_pid, + frame,subframe,eNB->ulsch_eNB[i]->rnti,i); #endif - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame, subframe, - phy_vars_eNB->eNB_UE_stats[i].sector); + eNB->eNB_UE_stats[i].sector); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,1); } else { LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame, subframe, i, - mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); + mode_string[eNB->eNB_UE_stats[i].mode]); } - nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]; + nPRS = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]; - phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + + eNB->ulsch_eNB[i]->cyclicShift = (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + nPRS)%12; - if (frame_parms->frame_type == FDD ) { + if (fp->frame_type == FDD ) { int sf = (subframe<4) ? (subframe+6) : (subframe-4); - if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1; + if (eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1; } else { - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; } } LOG_D(PHY, "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->ulsch_eNB[i]->cyclicShift, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, - phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, + eNB->Mod_id,harq_pid,frame,subframe, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, + eNB->ulsch_eNB[i]->cyclicShift, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, nPRS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); - phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; - phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; - phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs; - start_meas(&phy_vars_eNB->ulsch_demodulation_stats); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); + eNB->pusch_stats_rb[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; + eNB->pusch_stats_round[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; + eNB->pusch_stats_mcs[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs; + start_meas(&eNB->ulsch_demodulation_stats); if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, + rx_ulsch(eNB, sched_subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + eNB->eNB_UE_stats[i].sector, // this is the effective sector id i, - phy_vars_eNB->ulsch_eNB, + eNB->ulsch_eNB, 0); } #ifdef PHY_ABSTRACTION else { - rx_ulsch_emul(phy_vars_eNB, + rx_ulsch_emul(eNB, subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + eNB->eNB_UE_stats[i].sector, // this is the effective sector id i); } #endif - stop_meas(&phy_vars_eNB->ulsch_demodulation_stats); + stop_meas(&eNB->ulsch_demodulation_stats); - start_meas(&phy_vars_eNB->ulsch_decoding_stats); + start_meas(&eNB->ulsch_decoding_stats); if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, + ret = ulsch_decoding(eNB, i, sched_subframe, 0, // control_only_flag - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); } #ifdef PHY_ABSTRACTION else { - ret = ulsch_decoding_emul(phy_vars_eNB, + ret = ulsch_decoding_emul(eNB, sched_subframe, i, &rnti); } #endif - stop_meas(&phy_vars_eNB->ulsch_decoding_stats); + stop_meas(&eNB->ulsch_decoding_stats); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch_eNB[i]->rnti, + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + eNB->eNB_UE_stats[i].UL_rssi[0], + eNB->eNB_UE_stats[i].UL_rssi[1], + eNB->PHY_measurements_eNB->n0_power_dB[0], + eNB->PHY_measurements_eNB->n0_power_dB[1], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], ret); //compute the expected ULSCH RX power (for the stats) - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered + eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = + get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0); // 0 means bw_factor is not considered - //dump_ulsch(phy_vars_eNB, sched_subframe, i); + //dump_ulsch(eNB, sched_subframe, i); - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid); + eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid); #endif - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { + if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) - print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); + //if (((eNB->proc[sched_subframe].frame_tx%10) == 0) || (eNB->proc[sched_subframe].frame_tx < 50)) + print_CQI(eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); #endif - extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, - &phy_vars_eNB->eNB_UE_stats[i], - phy_vars_eNB->lte_frame_parms.N_RB_DL, + extract_CQI(eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, + &eNB->eNB_UE_stats[i], + fp->N_RB_DL, &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; + eNB->eNB_UE_stats[i].rank = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; } - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,0); if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; + eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; - LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); + LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + eNB->Mod_id, + eNB->CC_id, frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + fp->maxHARQ_Msg3Tx-1); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch_eNB[i]->rnti, + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + eNB->eNB_UE_stats[i].UL_rssi[0], + eNB->eNB_UE_stats[i].UL_rssi[1], + eNB->PHY_measurements_eNB->n0_power_dB[0], + eNB->PHY_measurements_eNB->n0_power_dB[1], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], ret); - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) { + if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == + fp->maxHARQ_Msg3Tx) { LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n", - phy_vars_eNB->Mod_id, i); - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; - if (phy_vars_eNB->mac_enabled==1) { - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + eNB->Mod_id, i); + eNB->eNB_UE_stats[i].mode = PRACH; + if (eNB->mac_enabled==1) { + mac_xface->cancel_ra_proc(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); + eNB->eNB_UE_stats[i].crnti); } - mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); + mac_phy_remove_ue(eNB->Mod_id,eNB->eNB_UE_stats[i].crnti); - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; - //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; + eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; + //eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; } else { // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI) - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1; + eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1; - get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms, + get_Msg3_alloc_ret(fp, subframe, frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe); + &eNB->ulsch_eNB[i]->Msg3_frame, + &eNB->ulsch_eNB[i]->Msg3_subframe); } LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i); } // This is Msg3 error else { //normal ULSCH LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->ulsch_eNB[i]->Mlimit, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + eNB->ulsch_eNB[i]->Mlimit, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]); #if defined(MESSAGE_CHART_GENERATOR_PHY) MSC_LOG_RX_DISCARDED_MESSAGE( @@ -3028,51 +2933,51 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ NULL,0, "%05u:%02u ULSCH received rnti %x harq id %u round %d", frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1 + eNB->ulsch_eNB[i]->rnti,harq_pid, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1 ); #endif - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mlimit) { + if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== eNB->ulsch_eNB[i]->Mlimit) { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->Mlimit); + eNB->ulsch_eNB[i]->Mlimit); - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors++; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; + eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; + eNB->eNB_UE_stats[i].ulsch_consecutive_errors++; // indicate error to MAC - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, + eNB->ulsch_eNB[i]->rnti, NULL, 0, harq_pid, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); + &eNB->ulsch_eNB[i]->Msg3_flag); } } } // ulsch in error else { - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, + eNB->Mod_id,harq_pid, frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch_eNB[i]->rnti, + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + eNB->eNB_UE_stats[i].UL_rssi[0], + eNB->eNB_UE_stats[i].UL_rssi[1], + eNB->PHY_measurements_eNB->n0_power_dB[0], + eNB->PHY_measurements_eNB->n0_power_dB[1], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], ret); } #if defined(MESSAGE_CHART_GENERATOR_PHY) @@ -3081,115 +2986,115 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ NULL,0, "%05u:%02u ULSCH received rnti %x harq id %u", frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid + eNB->ulsch_eNB[i]->rnti,harq_pid ); #endif - for (j=0; jlte_frame_parms.nb_antennas_rx; j++) + for (j=0; jnb_antennas_rx; j++) //this is the RSSI per RB - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = + eNB->eNB_UE_stats[i].UL_rssi[j] = - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]* - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/ - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) - - phy_vars_eNB->rx_total_gain_eNB_dB - - hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100; + dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]* + (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/ + fp->ofdm_symbol_size) - + eNB->rx_total_gain_eNB_dB - + hundred_times_log10_NPRB[eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - + get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0)/100; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; + eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - if (phy_vars_eNB->mac_enabled==1) { + if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->mac_enabled==1) { LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame,harq_pid,i); - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, + eNB->ulsch_eNB[i]->rnti, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, harq_pid, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); + &eNB->ulsch_eNB[i]->Msg3_flag); // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI) - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) { - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + if (eNB->ulsch_eNB[i]->Msg3_flag == 0 ) { + eNB->eNB_UE_stats[i].mode = PRACH; + mac_xface->cancel_ra_proc(eNB->Mod_id, + eNB->CC_id, frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); - mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; + eNB->eNB_UE_stats[i].crnti); + mac_phy_remove_ue(eNB->Mod_id,eNB->eNB_UE_stats[i].crnti); + eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; } // Msg3_flag == 0 } // mac_enabled==1 - phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH; - phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; + eNB->eNB_UE_stats[i].mode = PUSCH; + eNB->ulsch_eNB[i]->Msg3_flag = 0; - LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i); + LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",eNB->Mod_id,frame,subframe,i); for (k=0; k<8; k++) { //harq_processes - for (j=0; jdlsch_eNB[i][0]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; + for (j=0; jdlsch_eNB[i][0]->Mlimit; j++) { + eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; + eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; + eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; } - phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; + eNB->eNB_UE_stats[i].ulsch_errors[k]=0; + eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; - for (j=0; julsch_eNB[i]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; + for (j=0; julsch_eNB[i]->Mlimit; j++) { + eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; + eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; + eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; + eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; } } - phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; + eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; + eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; + eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; } // Msg3_flag==1 else { // Msg3_flag == 0 #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + harq_pid,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - for (j=0; julsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); + for (j=0; julsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); LOG_T(PHY,"\n"); #endif #endif - if (phy_vars_eNB->mac_enabled==1) { + if (eNB->mac_enabled==1) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, + eNB->ulsch_eNB[i]->rnti, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, harq_pid, NULL); #ifdef LOCALIZATION - start_meas(&phy_vars_eNB->localization_stats); - aggregate_eNB_UE_localization_stats(phy_vars_eNB, + start_meas(&eNB->localization_stats); + aggregate_eNB_UE_localization_stats(eNB, i, frame, subframe, - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100); - stop_meas(&phy_vars_eNB->localization_stats); + get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 1)/100); + stop_meas(&eNB->localization_stats); #endif } // mac_enabled==1 @@ -3197,16 +3102,16 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ // estimate timing advance for MAC if (abstraction_flag == 0) { - sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe); - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/4; //to check + sync_pos = lte_est_timing_advance_pusch(eNB,i,sched_subframe); + eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d: timing advance = %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame, subframe, i, - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update); + eNB->eNB_UE_stats[i].timing_advance_update); #endif @@ -3214,14 +3119,14 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ // process HARQ feedback #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",eNB->Mod_id, + eNB->dlsch_eNB[i][0]->rnti, frame,subframe, i); #endif process_HARQ_feedback(i, sched_subframe, - phy_vars_eNB, + eNB, 1, // pusch_flag 0, 0, @@ -3229,24 +3134,24 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", - phy_vars_eNB->Mod_id,frame,subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, + eNB->Mod_id,frame,subframe, + eNB->eNB_UE_stats[i].sector, harq_pid, i, ret, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], + eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); #endif // dump stats to VCD if (i==0) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,phy_vars_eNB->pusch_stats_mcs[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,phy_vars_eNB->pusch_stats_rb[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,phy_vars_eNB->pusch_stats_round[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0])); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,eNB->pusch_stats_mcs[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,eNB->pusch_stats_rb[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,eNB->pusch_stats_round[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(eNB->lte_eNB_pusch_vars[0]->ulsch_power[0])); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0+harq_pid,ret); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0+harq_pid,(frame*10)+subframe); } @@ -3256,48 +3161,48 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ // update ULSCH statistics for tracing if ((frame % 100 == 0) && (subframe == 4)) { for (harq_idx=0; harq_idx<8; harq_idx++) { - for (round=0; roundulsch_eNB[i]->Mlimit; round++) { - if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = - (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/ - (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]); + for (round=0; roundulsch_eNB[i]->Mlimit; round++) { + if ((eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - + eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) { + eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = + (100*(eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] - + eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/ + (eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - + eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]); } else { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0; + eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0; } - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] = - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round]; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] = - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round]; + eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] = + eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round]; + eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] = + eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round]; } } } if ((frame % 100 == 0) && (subframe==4)) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS - - phy_vars_eNB->eNB_UE_stats[i].total_TBS_last); + eNB->eNB_UE_stats[i].dlsch_bitrate = (eNB->eNB_UE_stats[i].total_TBS - + eNB->eNB_UE_stats[i].total_TBS_last); - phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS; + eNB->eNB_UE_stats[i].total_TBS_last = eNB->eNB_UE_stats[i].total_TBS; } // CBA (non-LTE) - cba_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag); + cba_procedures(sched_subframe,eNB,i,harq_pid,abstraction_flag); } // loop i=0 ... NUMBER_OF_UE_MAX-1 if (abstraction_flag == 0) { - lte_eNB_I0_measurements(phy_vars_eNB, + lte_eNB_I0_measurements(eNB, subframe, 0, - phy_vars_eNB->first_run_I0_measurements); - phy_vars_eNB->first_run_I0_measurements = 0; + eNB->first_run_I0_measurements); + eNB->first_run_I0_measurements = 0; } #ifdef PHY_ABSTRACTION else { - lte_eNB_I0_measurements_emul(phy_vars_eNB, + lte_eNB_I0_measurements_emul(eNB, 0); } @@ -3307,11 +3212,11 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ //} #ifdef EMOS - phy_procedures_emos_eNB_RX(subframe,phy_vars_eNB); + phy_procedures_emos_eNB_RX(subframe,eNB); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0); - stop_meas(&phy_vars_eNB->phy_proc_rx); + stop_meas(&eNB->phy_proc_rx); } @@ -3345,8 +3250,8 @@ int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, r return do_proc; } #endif -void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, - relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) +void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t abstraction_flag, + relaying_type_t r_type, PHY_VARS_RN *rn) { #if defined(ENABLE_ITTI) MessageDef *msg_p; @@ -3360,12 +3265,12 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,u int CC_id=0; /* - if (phy_vars_eNB->proc[sched_subframe].frame_tx >= 1000) + if (eNB->proc[sched_subframe].frame_tx >= 1000) mac_xface->macphy_exit("Exiting after 1000 Frames\n"); */ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, phy_vars_eNB[0]->proc[subframe].frame_tx); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, eNB[0]->proc[subframe].frame_tx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1); - start_meas(&phy_vars_eNB[0]->phy_proc); + start_meas(&eNB[0]->phy_proc); #if defined(ENABLE_ITTI) @@ -3512,45 +3417,45 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,u for (CC_id=0; CC_idlte_frame_parms.frame_type == TDD)&& - (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))|| - (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { + if ((((eNB[CC_id]->lte_frame_parms.frame_type == TDD)&& + (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))|| + (eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { #ifdef Rel10 - if (phy_procedures_RN_eNB_TX(phy_vars_eNB[CC_id]->proc[subframe].subframe_rx, phy_vars_eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 ) + if (phy_procedures_RN_eNB_TX(eNB[CC_id]->proc[subframe].subframe_rx, eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 ) #endif - phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn); + phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn); } - if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD )&& - (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) || - (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { - phy_procedures_eNB_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type); + if ((((eNB[CC_id]->lte_frame_parms.frame_type == TDD )&& + (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) || + (eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { + phy_procedures_eNB_RX(subframe,eNB[CC_id],abstraction_flag,r_type); } - if (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) { + if (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) { #ifdef Rel10 if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 ) #endif - phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn); + phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn); } - if ((subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)) { - phy_procedures_eNB_S_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type); + if ((subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)) { + phy_procedures_eNB_S_RX(subframe,eNB[CC_id],abstraction_flag,r_type); } - phy_vars_eNB[CC_id]->proc[subframe].frame_tx++; - phy_vars_eNB[CC_id]->proc[subframe].frame_rx++; + eNB[CC_id]->proc[subframe].frame_tx++; + eNB[CC_id]->proc[subframe].frame_rx++; - if (phy_vars_eNB[CC_id]->proc[subframe].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h - phy_vars_eNB[CC_id]->proc[subframe].frame_tx-=MAX_FRAME_NUMBER; + if (eNB[CC_id]->proc[subframe].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h + eNB[CC_id]->proc[subframe].frame_tx-=MAX_FRAME_NUMBER; - if (phy_vars_eNB[CC_id]->proc[subframe].frame_rx>=MAX_FRAME_NUMBER) - phy_vars_eNB[CC_id]->proc[subframe].frame_rx-=MAX_FRAME_NUMBER; + if (eNB[CC_id]->proc[subframe].frame_rx>=MAX_FRAME_NUMBER) + eNB[CC_id]->proc[subframe].frame_rx-=MAX_FRAME_NUMBER; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0); - stop_meas(&phy_vars_eNB[0]->phy_proc); + stop_meas(&eNB[0]->phy_proc); } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index ac09ac77b3..084173248f 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -115,7 +115,7 @@ extern int rx_sig_fifo; extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; #endif -#ifdef USER_MODE + void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) { @@ -286,7 +286,7 @@ void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); } -#endif + void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { @@ -367,13 +367,11 @@ void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance timing_advance = timing_advance - (1<<11); */ - if (openair_daq_vars.manual_timing_advance == 0) { - phy_vars_ue->timing_advance = timing_advance*4; + phy_vars_ue->timing_advance = timing_advance*4; - } #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance,openair_daq_vars.timing_advance); + LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance); #endif } @@ -386,11 +384,8 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance) // timing advance has Q1.5 format timing_advance = timing_advance - 31; - if (openair_daq_vars.manual_timing_advance == 0) { - //if ( (frame % 100) == 0) { - //if ((timing_advance > 3) || (timing_advance < -3) ) - PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4; //this is for 25RB only!!! - } + PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4; //this is for 25RB only!!! + LOG_I(PHY,"[UE %d] Got timing advance %d from MAC, new value %d\n",Mod_id, timing_advance, PHY_vars_UE_g[Mod_id][CC_id]->timing_advance); @@ -1223,7 +1218,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- - openair_daq_vars.timing_advance- + phy_vars_ue->hw_timing_advance- phy_vars_ue->timing_advance- phy_vars_ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); #else //this is the normal case @@ -1234,7 +1229,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra Mod_id,frame_tx,subframe_tx, ulsch_start, phy_vars_ue->rx_offset, - openair_daq_vars.timing_advance, + phy_vars_ue->hw_timing_advance, phy_vars_ue->timing_advance, phy_vars_ue->N_TA_offset); @@ -1525,14 +1520,7 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t // AGC VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_IN); -#if defined EXMIMO - if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && - (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) - if (phy_vars_ue->frame_rx%100==0) - gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); - -#else #ifndef OAI_USRP #ifndef OAI_BLADERF #ifndef OAI_LMSSDR @@ -1540,7 +1528,7 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t #endif #endif #endif -#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN); eNB_id = 0; @@ -1554,29 +1542,6 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); - /* if (openair_daq_vars.auto_freq_correction == 1) { - if (frame_rx % 100 == 0) { - if ((phy_vars_ue->lte_ue_common_vars.freq_offset>100) && (openair_daq_vars.freq_offset < 1000)) { - openair_daq_vars.freq_offset+=100; - #if defined(EXMIMO) && defined(DRIVER2013) - for (aa = 0; aa<4; aa++) { - p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - } - #endif - } - else if ((phy_vars_ue->lte_ue_common_vars.freq_offset<-100) && (openair_daq_vars.freq_offset > -1000)) { - openair_daq_vars.freq_offset-=100; - #if defined(EXMIMO) && defined(DRIVER2013) - for (aa = 0; aa<4; aa++) { - p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - } - #endif - } - } - }*/ - } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT); @@ -1681,9 +1646,7 @@ void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_fla // first_run = 1; if (abstraction_flag ==0 ) { - openair_daq_vars.mode = openair_NOT_SYNCHED; phy_vars_ue->UE_mode[eNB_id] = NOT_SYNCHED; - openair_daq_vars.sync_state=0; } else { phy_vars_ue->UE_mode[eNB_id] = PRACH; phy_vars_ue->prach_resources[eNB_id]=NULL; @@ -1691,8 +1654,8 @@ void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_fla phy_vars_ue->frame_rx = -1; phy_vars_ue->frame_tx = -1; - openair_daq_vars.synch_wait_cnt=0; - openair_daq_vars.sched_cnt=-1; + // phy_vars_ue->synch_wait_cnt=0; + // phy_vars_ue->sched_cnt=-1; phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq=0; phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors=0; @@ -2564,7 +2527,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { + (phy_vars_ue->use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; @@ -2975,9 +2938,9 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if (ret == (1+phy_vars_ue->dlsch_ue_ra[eNB_id]->max_turbo_iterations)) { phy_vars_ue->dlsch_ra_errors[eNB_id]++; LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received RA in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev); -#ifdef USER_MODE - //dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev); -#endif + + // dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev); exit(-1); + // oai_exit=1; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); stop_meas(&phy_vars_ue->phy_proc_rx); @@ -3107,7 +3070,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { + (phy_vars_ue->use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; @@ -3176,7 +3139,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { + (phy_vars_ue->use_ia_receiver ==1)) { dual_stream_UE = 1; eNB_id_i = phy_vars_ue->n_connected_eNB; i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; diff --git a/openair1/SCHED/vars.h b/openair1/SCHED/vars.h index 532251a2f0..2c4c93cfad 100644 --- a/openair1/SCHED/vars.h +++ b/openair1/SCHED/vars.h @@ -28,7 +28,6 @@ *******************************************************************************/ #include "defs.h" -OPENAIR_DAQ_VARS openair_daq_vars; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 4d8e32b63c..62422bf9ae 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -569,17 +569,9 @@ schedule_ue_spec( eNB_UE_stats->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); */ eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); + eNB_UE_stats->dlsch_mcs1 = eNB_UE_stats->dlsch_mcs1;//cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); -#ifdef EXMIMO - - if (mac_xface->get_transmission_mode(module_idP,CC_id, rnti)==5) { - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); - } - -#endif - // store stats UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->DL_cqi[0]; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 2973bedd00..e508e24eb5 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -826,14 +826,14 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul; - mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS + mcs = UE_template->pre_assigned_mcs_ul;//cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS if ((cqi_req==1) && (mcs>19)) { mcs=19; } if (UE_template->pre_allocated_rb_table_index_ul >=0) { rb_table_index=UE_template->pre_allocated_rb_table_index_ul; } else { - mcs=cmin (10, openair_daq_vars.target_ue_ul_mcs); + mcs=10;//cmin (10, openair_daq_vars.target_ue_ul_mcs); rb_table_index=5; // for PHR } @@ -1171,7 +1171,7 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f required_rbs[cba_group] = 0; num_cba_resources[cba_group]=0; active_UEs[cba_group]=0; - mcs[cba_group]=openair_daq_vars.target_ue_ul_mcs; + mcs[cba_group]=10;//openair_daq_vars.target_ue_ul_mcs; } //LOG_D(MAC, "[eNB ] CBA granted ues are %d\n",granted_UEs ); @@ -1219,7 +1219,7 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f } } - mcs[cba_group]= cmin(mcs[cba_group],openair_daq_vars.target_ue_ul_mcs); + mcs[cba_group]= mcs[cba_group];//cmin(mcs[cba_group],openair_daq_vars.target_ue_ul_mcs); if (available_rbs < min_rb_unit ) break; diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index fe8fe55d44..d28614699b 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -178,7 +178,7 @@ void assign_rbs_required (module_id_t Mod_id, */ eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]]; - eNB_UE_stats[CC_id]->dlsch_mcs1 = cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs); + eNB_UE_stats[CC_id]->dlsch_mcs1 = eNB_UE_stats[CC_id]->dlsch_mcs1;//cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 822409f302..e903fd0c9a 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -114,15 +114,14 @@ unsigned short config_frames[4] = {2,9,11,13}; #endif // In lte-enb.c -int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); - +extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); extern void init_eNB(void); extern void stop_eNB(void); extern void kill_eNB_proc(void); // In lte-ue.c -int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); -void fill_ue_band_info(void); +extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); +extern void fill_ue_band_info(void); extern void init_UE(void); #ifdef XFORMS @@ -1139,6 +1138,7 @@ int main( int argc, char **argv ) memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs); set_latency_target(); + // det defaults for (CC_id=0; CC_idmac_enabled = 1; - if (UE[CC_id]->mac_enabled == 0) { + if (UE[CC_id]->mac_enabled == 0) { //set default UL parameters for testing mode for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; @@ -1373,13 +1373,6 @@ int main( int argc, char **argv ) } - openair_daq_vars.manual_timing_advance = 0; - openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; - openair_daq_vars.auto_freq_correction = 0; - openair_daq_vars.use_ia_receiver = 0; - - - // printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power)); } else { //this is eNB @@ -1390,12 +1383,10 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms[CC_id],0,frame_parms[CC_id]->Nid_cell,cooperation_flag,transmission_mode,abstraction_flag); PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id; - if (phy_test==1) - PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0; - else - PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1; + if (phy_test==1) PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0; + else PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1; - if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { + if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { //set default parameters for testing mode for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; @@ -1413,7 +1404,6 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = (int)rx_gain[CC_id][0]; - //already taken care of in lte-softmodem.c PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; } @@ -1422,11 +1412,6 @@ int main( int argc, char **argv ) NB_eNB_INST=1; NB_INST=1; - openair_daq_vars.ue_dl_rb_alloc=0x1fff; - openair_daq_vars.target_ue_dl_mcs=target_dl_mcs; - openair_daq_vars.ue_ul_nb_rb=6; - openair_daq_vars.target_ue_ul_mcs=target_ul_mcs; - } fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx); @@ -1644,11 +1629,16 @@ int main( int argc, char **argv ) // connect the TX/RX buffers if (UE_flag==1) { + + for (CC_id=0;CC_idhw_timing_advance = timing_advance; #else - openair_daq_vars.timing_advance = 160; + UE[CC_id]->hw_timing_advance = 160; #endif + } if (setup_ue_buffers(UE,&openair0_cfg[0],rf_map)!=0) { printf("Error setting up eNB buffer\n"); exit(-1); @@ -1673,7 +1663,8 @@ int main( int argc, char **argv ) } //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; } else { - openair_daq_vars.timing_advance = 0; + + if (setup_eNB_buffers(PHY_vars_eNB_g[0],&openair0_cfg[0],rf_map)!=0) { printf("Error setting up eNB buffer\n"); @@ -1684,6 +1675,7 @@ int main( int argc, char **argv ) // Set LSBs for antenna switch (ExpressMIMO) for (CC_id=0; CC_idhw_timing_advance = 0; for (i=0; isamples_per_tti*10; i++) for (aa=0; aanb_antennas_tx; aa++) PHY_vars_eNB_g[0][CC_id]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001; @@ -1730,13 +1722,16 @@ int main( int argc, char **argv ) sprintf (title, "LTE DL SCOPE UE"); fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); + /* if (openair_daq_vars.use_ia_receiver) { fl_set_button(form_ue[UE_id]->button_0,1); fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON"); } else { fl_set_button(form_ue[UE_id]->button_0,0); fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); - } + }*/ + fl_set_button(form_ue[UE_id]->button_0,0); + fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); } ret = pthread_create(&forms_thread, NULL, scope_thread, NULL); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 3049fd4e02..865f257135 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -1622,7 +1622,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, return(-1); } - + /* if (frame_parms->frame_type == TDD) { if (frame_parms->N_RB_DL == 100) N_TA_offset = 624; @@ -1631,7 +1631,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, else if (frame_parms->N_RB_DL == 25) N_TA_offset = 624/4; } - + */ // replace RX signal buffers with mmaped HW versions rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 8a5d23afac..7c335fdd10 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -500,7 +500,7 @@ l2l1_task (void *args_p) sprintf (title, "LTE DL SCOPE eNB %d to UE %d CC_id %d", eNB_inst, UE_inst, CC_id); fl_show_form (form_ue[CC_id][UE_inst]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - if (openair_daq_vars.use_ia_receiver == 1) { + if (PHY_vars_UE_g[UE_inst][CC_id]->use_ia_receiver == 1) { fl_set_button(form_ue[CC_id][UE_inst]->button_0,1); fl_set_object_label(form_ue[CC_id][UE_inst]->button_0, "IA Receiver ON"); fl_set_object_color(form_ue[CC_id][UE_inst]->button_0, FL_GREEN, FL_GREEN); diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index b87142c3e5..ea9d298904 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -951,22 +951,23 @@ void init_openair1(void) number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - openair_daq_vars.tdd = 1; - openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; +// openair_daq_vars.rx_rf_mode = 1; +// openair_daq_vars.tdd = 1; +// openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; - openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0]; +// openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0]; //#warning "NN->FK: OAI EMU channel abstraction does not work for MCS higher than" - openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16); - openair_daq_vars.target_ue_ul_mcs = target_ul_mcs; - openair_daq_vars.ue_dl_rb_alloc=0x1fff; - openair_daq_vars.ue_ul_nb_rb=6; - openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag; - openair_daq_vars.use_ia_receiver = 0; +// openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16); +// openair_daq_vars.target_ue_ul_mcs = target_ul_mcs; +// openair_daq_vars.ue_dl_rb_alloc=0x1fff; +// openair_daq_vars.ue_ul_nb_rb=6; +// openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag; //N_TA_offset for (CC_id=0; CC_iduse_ia_receiver = 0; + if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.frame_type == TDD) { if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 100) PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624; From 80b3850fa1c7ad4832328151fa5fd246dcd48316 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 16 May 2016 05:29:04 -0700 Subject: [PATCH 017/340] removal of mod_sym_t --- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index af6c72fc6a..2a7760909c 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -140,7 +140,7 @@ uint32_t FOUR[2]={0,4}; uint32_t TWO[2]={0,2}; int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, + int32_t * **txdataF, uint32_t *jj, uint32_t *jj2, uint16_t re_offset, @@ -213,7 +213,7 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, } int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, + int32_t * **txdataF, uint32_t *jj, uint32_t *jj2, uint16_t re_offset, @@ -295,7 +295,7 @@ int allocate_REs_in_RB_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, } int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, + int32_t * **txdataF, uint32_t *jj, uint32_t *jj2, uint16_t re_offset, @@ -377,7 +377,7 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, } int allocate_REs_in_RB_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, - mod_sym_t **txdataF, + int32_t * **txdataF, uint32_t *jj, uint32_t *jj2, uint16_t re_offset, @@ -1514,7 +1514,7 @@ int dlsch_modulation(int32_t **txdataF, int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8]; int16_t *qam_table_s0=NULL,*qam_table_s1=NULL; int (*allocate_REs)(LTE_DL_FRAME_PARMS *, - mod_sym_t **, + int32_t * **, uint32_t*, uint32_t*, uint16_t, From d9761e7adc47a3d1bb40251f7c13f9766a0287cb Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 16 May 2016 05:47:02 -0700 Subject: [PATCH 018/340] added missing structure element in eNB_RRC_UE_t : ue_release_timer_thres --- openair2/RRC/LITE/defs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 7a52115440..f730a95c48 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -359,6 +359,7 @@ typedef struct eNB_RRC_UE_s { #endif uint32_t ul_failure_timer; uint32_t ue_release_timer; + uint32_t ue_release_timer_thres; } eNB_RRC_UE_t; typedef uid_t ue_uid_t; From 7e03fe232e00d5768704b3ecb6419fd0051f2dac Mon Sep 17 00:00:00 2001 From: Dominique Nussbaum Date: Thu, 26 May 2016 15:47:57 +0200 Subject: [PATCH 019/340] fixes for 20MHz --- openair1/SCHED/phy_mac_stub.c | 39 ++++++++++--------- openair1/SCHED/phy_procedures_lte_eNb.c | 3 +- targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m | 14 +++---- .../CONF/enb.band7.tm1.exmimo2.conf | 4 +- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 3620b8bf27..56882bf404 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -57,6 +57,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e uint32_t rballoc = 0x7FFF; //uint32_t rballoc2 = 0x000F; + uint32_t rballoc_test = 0xFFFF; int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; LTE_eNB_DLSCH_t *DLSCH_ptr = phy_vars_eNB->dlsch_eNB[0][0]; @@ -143,7 +144,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(50,10,3); ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1; @@ -154,7 +155,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(50,10,3); ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; @@ -170,7 +171,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_FDD_t; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(100,10,3); ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1; @@ -181,7 +182,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(100,10,3); ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; @@ -231,14 +232,14 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(25,10,3); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_FDD_t)); /* //user2 @@ -261,7 +262,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e } else { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(25,10,3); ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; @@ -298,14 +299,14 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_FDD_t; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(50,10,3); ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_FDD_t)); /* //user2 @@ -328,7 +329,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e } else { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_TDD_t; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(50,10,3); ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; @@ -362,16 +363,16 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e case 100: if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_20MHz_FDD_t; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(100,10,3); + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_FDD_t)); /* //user2 @@ -394,7 +395,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e } else { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_20MHz_TDD_t; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(100,10,3); ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 161e2e5c58..5b38d495ec 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -562,6 +562,7 @@ void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshol unsigned int taus(void); +DCI_PDU DCI_pdu_tmp; void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag, relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) @@ -573,7 +574,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e uint8_t harq_pid; DCI_PDU *DCI_pdu; uint8_t *DLSCH_pdu=NULL; - DCI_PDU DCI_pdu_tmp; + //DCI_PDU DCI_pdu_tmp; uint8_t DLSCH_pdu_tmp[768*8]; int8_t UE_id; uint8_t num_pdcch_symbols=0; diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m index ad33d26123..455963b651 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m @@ -1,4 +1,4 @@ -fc = 1907600000; +fc = 2655000000; %fc = 1907600000; %fc = 859.5e6; @@ -8,9 +8,9 @@ eNB_flag = 0; card = 0; active_rf = [1 1 1 1]; autocal = [1 1 1 1]; -resampling_factor = [2 2 2 2]; +resampling_factor = [0 0 0 0]; limeparms; -rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAMax+RFBBNORM) * active_rf; +rf_mode = (RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF10+RXLPFNORM+RXLPFEN+RXLPF10+LNA1ON+LNAMax+RFBBNORM) * active_rf; rf_mode = rf_mode + (DMAMODE_RX + DMAMODE_TX)*active_rf; %rf_mode = rf_mode + (DMAMODE_TX)*active_rf + DMAMODE_RX*active_rf; %rf_mode = RXEN+TXEN+TXLPFNORM+TXLPFEN+TXLPF25+RXLPFNORM+RXLPFEN+RXLPF25+LNA1ON+LNAByp+RFBBLNA1; @@ -56,10 +56,10 @@ case 0 s(:,4) = amp * ones(1,length); case 1 - s(:,1) = floor(amp * (exp(1i*2*pi*(0:((length)-1))/4))); - s(:,2) = floor(amp * (exp(1i*2*pi*(0:((length)-1))/4))); - s(:,3) = floor(amp * (exp(1i*2*pi*(0:((length)-1))/4))); - s(:,4) = floor(amp * (exp(1i*2*pi*(0:((length)-1))/4))); + s(:,1) = floor(amp * (exp(1i*2*pi*(0:((length)-1))/256))); + s(:,2) = floor(amp * (exp(1i*2*pi*(0:((length)-1))/256))); + s(:,3) = floor(amp * (exp(1i*2*pi*(0:((length)-1))/256))); + s(:,4) = floor(amp * (exp(1i*2*pi*(0:((length)-1))/256))); case 2 s(38400+128,1)= 80-1j*40; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf index f1160e78ca..852d9603ce 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -31,11 +31,11 @@ eNBs = downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; - N_RB_DL = 25; + N_RB_DL = 50; Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; - tx_gain = 25; + tx_gain = 0; rx_gain = 20; prach_root = 0; prach_config_index = 0; From b188a5cfeb6c06a215b7b1cca6ce524fe9f6b880 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 26 May 2016 15:14:57 -0700 Subject: [PATCH 020/340] changed threading (acqusition is slot based). removal of eNB_thread. timing all based on received timestamp. --- openair1/PHY/INIT/lte_init.c | 1199 +++++---- openair1/PHY/INIT/lte_param_init.c | 74 +- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 74 +- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 54 +- .../lte_dl_channel_estimation.c | 158 +- .../lte_dl_mbsfn_channel_estimation.c | 114 +- .../PHY/LTE_ESTIMATION/lte_eNB_measurements.c | 122 +- .../PHY/LTE_ESTIMATION/lte_sync_timefreq.c | 6 +- .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 442 ++-- .../lte_ul_channel_estimation.c | 62 +- openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c | 46 +- openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c | 26 +- openair1/PHY/LTE_REFSIG/lte_dl_uespec.c | 40 +- openair1/PHY/LTE_TRANSPORT/dci.c | 220 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 152 +- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 6 +- .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 628 ++--- openair1/PHY/LTE_TRANSPORT/drs_modulation.c | 22 +- openair1/PHY/LTE_TRANSPORT/initial_sync.c | 334 ++- openair1/PHY/LTE_TRANSPORT/phich.c | 126 +- openair1/PHY/LTE_TRANSPORT/pilots.c | 44 +- openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c | 10 +- openair1/PHY/LTE_TRANSPORT/pmch.c | 192 +- openair1/PHY/LTE_TRANSPORT/prach.c | 457 ++-- openair1/PHY/LTE_TRANSPORT/print_stats.c | 896 +++---- openair1/PHY/LTE_TRANSPORT/pucch.c | 100 +- openair1/PHY/LTE_TRANSPORT/rar_tools.c | 33 +- openair1/PHY/LTE_TRANSPORT/srs_modulation.c | 8 +- openair1/PHY/LTE_TRANSPORT/sss.c | 80 +- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 88 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 132 +- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 204 +- openair1/PHY/MODULATION/slot_fep.c | 68 +- openair1/PHY/MODULATION/slot_fep_mbsfn.c | 46 +- openair1/PHY/MODULATION/ul_7_5_kHz.c | 29 +- openair1/PHY/TOOLS/lte_phy_scope.c | 56 +- openair1/PHY/defs.h | 117 +- openair1/SCHED/defs.h | 45 +- openair1/SCHED/phy_mac_stub.c | 184 +- openair1/SCHED/phy_procedures_lte_common.c | 172 +- openair1/SCHED/phy_procedures_lte_eNb.c | 1566 ++++++------ openair1/SCHED/phy_procedures_lte_ue.c | 2231 ++++++++--------- openair1/SCHED/pucch_pc.c | 38 +- openair1/SCHED/pusch_pc.c | 96 +- openair2/LAYER2/MAC/eNB_scheduler.c | 52 +- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 58 +- openair2/LAYER2/MAC/eNB_scheduler_bch.c | 28 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 16 +- openair2/LAYER2/MAC/eNB_scheduler_mch.c | 24 +- .../LAYER2/MAC/eNB_scheduler_primitives.c | 24 +- openair2/LAYER2/MAC/lte_transport_init.c | 6 +- openair2/LAYER2/MAC/main.c | 12 +- openair2/LAYER2/MAC/pre_processor.c | 10 +- openair2/LAYER2/MAC/ra_procedures.c | 4 +- openair2/LAYER2/MAC/ue_procedures.c | 16 +- openair2/PHY_INTERFACE/defs.h | 2 +- openair2/RRC/LITE/rrc_UE.c | 10 +- openair2/RRC/LITE/rrc_eNB.c | 18 +- targets/RT/USER/lte-enb.c | 732 +++--- targets/RT/USER/lte-softmodem.c | 67 +- targets/RT/USER/lte-ue.c | 134 +- targets/SIMU/USER/init_lte.c | 82 +- 62 files changed, 5977 insertions(+), 6115 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 6a50c2d113..9787c476a6 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -52,7 +52,7 @@ extern uint16_t prach_root_sequence_map4[138]; uint8_t dmrs1_tab[8] = {0,2,3,4,6,8,9,10}; // FIXME not used anywhere -void phy_config_mib(LTE_DL_FRAME_PARMS *lte_frame_parms, +void phy_config_mib(LTE_DL_FRAME_PARMS *frame_parms, uint8_t N_RB_DL, uint8_t Nid_cell, uint8_t Ncp, @@ -61,14 +61,14 @@ void phy_config_mib(LTE_DL_FRAME_PARMS *lte_frame_parms, PHICH_CONFIG_COMMON *phich_config) { - lte_frame_parms->N_RB_DL = N_RB_DL; - lte_frame_parms->Nid_cell = Nid_cell; - lte_frame_parms->nushift = Nid_cell%6; - lte_frame_parms->Ncp = Ncp; - lte_frame_parms->frame_type = frame_type; - lte_frame_parms->nb_antennas_tx_eNB = p_eNB; - lte_frame_parms->phich_config_common.phich_resource = phich_config->phich_resource; - lte_frame_parms->phich_config_common.phich_duration = phich_config->phich_duration; + frame_parms->N_RB_DL = N_RB_DL; + frame_parms->Nid_cell = Nid_cell; + frame_parms->nushift = Nid_cell%6; + frame_parms->Ncp = Ncp; + frame_parms->frame_type = frame_type; + frame_parms->nb_antennas_tx_eNB = p_eNB; + frame_parms->phich_config_common.phich_resource = phich_config->phich_resource; + frame_parms->phich_config_common.phich_duration = phich_config->phich_duration; } void phy_config_sib1_eNB(uint8_t Mod_id, @@ -78,15 +78,15 @@ void phy_config_sib1_eNB(uint8_t Mod_id, uint16_t SIPeriod) { - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; if (tdd_Config) { - lte_frame_parms->tdd_config = tdd_Config->subframeAssignment; - lte_frame_parms->tdd_config_S = tdd_Config->specialSubframePatterns; + frame_parms->tdd_config = tdd_Config->subframeAssignment; + frame_parms->tdd_config_S = tdd_Config->specialSubframePatterns; } - lte_frame_parms->SIwindowsize = SIwindowsize; - lte_frame_parms->SIPeriod = SIPeriod; + frame_parms->SIwindowsize = SIwindowsize; + frame_parms->SIPeriod = SIPeriod; } void phy_config_sib1_ue(uint8_t Mod_id,int CC_id, @@ -96,15 +96,15 @@ void phy_config_sib1_ue(uint8_t Mod_id,int CC_id, uint16_t SIperiod) { - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; if (tdd_Config) { - lte_frame_parms->tdd_config = tdd_Config->subframeAssignment; - lte_frame_parms->tdd_config_S = tdd_Config->specialSubframePatterns; + frame_parms->tdd_config = tdd_Config->subframeAssignment; + frame_parms->tdd_config_S = tdd_Config->specialSubframePatterns; } - lte_frame_parms->SIwindowsize = SIwindowsize; - lte_frame_parms->SIPeriod = SIperiod; + frame_parms->SIwindowsize = SIwindowsize; + frame_parms->SIPeriod = SIperiod; } void phy_config_sib2_eNB(uint8_t Mod_id, @@ -116,132 +116,132 @@ void phy_config_sib2_eNB(uint8_t Mod_id, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList) { - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; //LTE_eNB_UE_stats *eNB_UE_stats = PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats; //int32_t rx_total_gain_eNB_dB = PHY_vars_eNB_g[Mod_id][CC_id]->rx_total_gain_eNB_dB; int i; - LOG_D(PHY,"[eNB%d] CCid %d Frame %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[8].frame_tx); + LOG_D(PHY,"[eNB%d] CCid %d Frame %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[0].frame_tx); - lte_frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",lte_frame_parms->prach_config_common.rootSequenceIndex ); + frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; + LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",frame_parms->prach_config_common.rootSequenceIndex ); - lte_frame_parms->prach_config_common.prach_Config_enabled=1; + frame_parms->prach_config_common.prach_Config_enabled=1; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_ConfigIndex = %d\n",lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); + frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_ConfigIndex = %d\n",frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); - lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.highSpeedFlag = %d\n",lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag); - lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig); - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset); - compute_prach_seq(<e_frame_parms->prach_config_common,lte_frame_parms->frame_type, + frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.highSpeedFlag = %d\n",frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag); + frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig); + frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset); + compute_prach_seq(&frame_parms->prach_config_common,frame_parms->frame_type, PHY_vars_eNB_g[Mod_id][CC_id]->X_u); - lte_frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; - lte_frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; - lte_frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; - lte_frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; + frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; + frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; + frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; + frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; - lte_frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; - lte_frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; + frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; + frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; - lte_frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - LOG_D(PHY,"pusch_config_common.n_SB = %d\n",lte_frame_parms->pusch_config_common.n_SB ); + frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + LOG_D(PHY,"pusch_config_common.n_SB = %d\n",frame_parms->pusch_config_common.n_SB ); - lte_frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - LOG_D(PHY,"pusch_config_common.hoppingMode = %d\n",lte_frame_parms->pusch_config_common.hoppingMode); + frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + LOG_D(PHY,"pusch_config_common.hoppingMode = %d\n",frame_parms->pusch_config_common.hoppingMode); - lte_frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - LOG_D(PHY,"pusch_config_common.pusch_HoppingOffset = %d\n",lte_frame_parms->pusch_config_common.pusch_HoppingOffset); + frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + LOG_D(PHY,"pusch_config_common.pusch_HoppingOffset = %d\n",frame_parms->pusch_config_common.pusch_HoppingOffset); - lte_frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - LOG_D(PHY,"pusch_config_common.enable64QAM = %d\n",lte_frame_parms->pusch_config_common.enable64QAM ); + frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + LOG_D(PHY,"pusch_config_common.enable64QAM = %d\n",frame_parms->pusch_config_common.enable64QAM ); - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = %d\n",lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = %d\n",lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = %d\n",lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = %d\n",lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift); + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift); - init_ul_hopping(lte_frame_parms); + init_ul_hopping(frame_parms); - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 0; + frame_parms->soundingrs_ul_config_common.enabled_flag = 0; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) { - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - lte_frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; - lte_frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; - lte_frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; + frame_parms->soundingrs_ul_config_common.enabled_flag = 1; + frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; + frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; + frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; + frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; else - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; + frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; } - lte_frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; - lte_frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; - lte_frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; - lte_frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; + frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; + frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; + frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; + frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; - lte_frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; + frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; // Now configure some of the Physical Channels // PUCCH - init_ncs_cell(lte_frame_parms,PHY_vars_eNB_g[Mod_id][CC_id]->ncs_cell); + init_ncs_cell(frame_parms,PHY_vars_eNB_g[Mod_id][CC_id]->ncs_cell); - init_ul_hopping(lte_frame_parms); + init_ul_hopping(frame_parms); // MBSFN if (mbsfn_SubframeConfigList != NULL) { - lte_frame_parms->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; + frame_parms->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; for (i=0; ilist.count; i++) { - lte_frame_parms->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; - lte_frame_parms->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; + frame_parms->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; + frame_parms->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { - lte_frame_parms->MBSFN_config[i].fourFrames_flag = 0; - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration + frame_parms->MBSFN_config[i].fourFrames_flag = 0; + frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration - lte_frame_parms->MBSFN_config[i].fourFrames_flag = 1; - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = + frame_parms->MBSFN_config[i].fourFrames_flag = 1; + frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); } } } else - lte_frame_parms->num_MBSFN_config = 0; + frame_parms->num_MBSFN_config = 0; } @@ -254,106 +254,106 @@ void phy_config_sib2_ue(uint8_t Mod_id,int CC_id, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList) { - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; int i; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_IN); LOG_I(PHY,"[UE%d] Frame %d: Applying radioResourceConfigCommon from eNB%d\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,CH_index); - lte_frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; + frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - lte_frame_parms->prach_config_common.prach_Config_enabled=1; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; - lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; - lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; + frame_parms->prach_config_common.prach_Config_enabled=1; + frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; + frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; - compute_prach_seq(<e_frame_parms->prach_config_common,lte_frame_parms->frame_type,PHY_vars_UE_g[Mod_id][CC_id]->X_u); + compute_prach_seq(&frame_parms->prach_config_common,frame_parms->frame_type,PHY_vars_UE_g[Mod_id][CC_id]->X_u); - lte_frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; - lte_frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; - lte_frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; - lte_frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; + frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; + frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; + frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; + frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; - lte_frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; - lte_frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; + frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; + frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; - lte_frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - lte_frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - lte_frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - lte_frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; + frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; - init_ul_hopping(lte_frame_parms); - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 0; + init_ul_hopping(frame_parms); + frame_parms->soundingrs_ul_config_common.enabled_flag = 0; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) { - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - lte_frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; - lte_frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; - lte_frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; + frame_parms->soundingrs_ul_config_common.enabled_flag = 1; + frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; + frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; + frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; + frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; else - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; + frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; } - lte_frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; - lte_frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; - lte_frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; - lte_frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; + frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; + frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; + frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; + frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; - lte_frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; + frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; // Now configure some of the Physical Channels // PUCCH - init_ncs_cell(lte_frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); + init_ncs_cell(frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); - init_ul_hopping(lte_frame_parms); + init_ul_hopping(frame_parms); // MBSFN if (mbsfn_SubframeConfigList != NULL) { - lte_frame_parms->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; + frame_parms->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; for (i=0; ilist.count; i++) { - lte_frame_parms->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; - lte_frame_parms->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; + frame_parms->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; + frame_parms->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { - lte_frame_parms->MBSFN_config[i].fourFrames_flag = 0; - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration + frame_parms->MBSFN_config[i].fourFrames_flag = 0; + frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration - lte_frame_parms->MBSFN_config[i].fourFrames_flag = 1; - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = + frame_parms->MBSFN_config[i].fourFrames_flag = 1; + frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); } } } @@ -366,17 +366,17 @@ void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index,int mbsfn_Are long mbsfn_AreaId_r9) { - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; LOG_I(PHY,"[UE%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { - lte_frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; + frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; LOG_N(PHY,"Fix me: only called when mbsfn_Area_idx == 0)\n"); } - lte_gold_mbsfn(lte_frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_mbsfn_table,lte_frame_parms->Nid_cell_mbsfn); + lte_gold_mbsfn(frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_mbsfn_table,frame_parms->Nid_cell_mbsfn); } @@ -385,56 +385,56 @@ void phy_config_sib13_eNB(uint8_t Mod_id,int CC_id,int mbsfn_Area_idx, long mbsfn_AreaId_r9) { - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; - LOG_I(PHY,"[eNB%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[8].frame_tx,mbsfn_AreaId_r9,mbsfn_Area_idx); + LOG_I(PHY,"[eNB%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[0].frame_tx,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { - lte_frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; + frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; LOG_N(PHY,"Fix me: only called when mbsfn_Area_idx == 0)\n"); } - lte_gold_mbsfn(lte_frame_parms,PHY_vars_eNB_g[Mod_id][CC_id]->lte_gold_mbsfn_table,lte_frame_parms->Nid_cell_mbsfn); + lte_gold_mbsfn(frame_parms,PHY_vars_eNB_g[Mod_id][CC_id]->lte_gold_mbsfn_table,frame_parms->Nid_cell_mbsfn); } -void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB) +void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB) { uint8_t UE_id; struct PhysicalConfigDedicated *physicalConfigDedicated; for (UE_id=0; UE_idphysicalConfigDedicated[UE_id]; + physicalConfigDedicated = eNB->physicalConfigDedicated[UE_id]; if (physicalConfigDedicated != NULL) { - LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",phy_vars_eNB->Mod_id, phy_vars_eNB->proc[8].frame_tx,physicalConfigDedicated,UE_id); + LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id, eNB->proc[0].frame_tx,physicalConfigDedicated,UE_id); LOG_D(PHY,"------------------------------------------------------------------------\n"); if (physicalConfigDedicated->pdsch_ConfigDedicated) { - phy_vars_eNB->pdsch_config_dedicated[UE_id].p_a=physicalConfigDedicated->pdsch_ConfigDedicated->p_a; - LOG_D(PHY,"pdsch_config_dedicated.p_a %d\n",phy_vars_eNB->pdsch_config_dedicated[UE_id].p_a); + eNB->pdsch_config_dedicated[UE_id].p_a=physicalConfigDedicated->pdsch_ConfigDedicated->p_a; + LOG_D(PHY,"pdsch_config_dedicated.p_a %d\n",eNB->pdsch_config_dedicated[UE_id].p_a); LOG_D(PHY,"\n"); } if (physicalConfigDedicated->pucch_ConfigDedicated) { if (physicalConfigDedicated->pucch_ConfigDedicated->ackNackRepetition.present==PUCCH_ConfigDedicated__ackNackRepetition_PR_release) - phy_vars_eNB->pucch_config_dedicated[UE_id].ackNackRepetition=0; + eNB->pucch_config_dedicated[UE_id].ackNackRepetition=0; else { - phy_vars_eNB->pucch_config_dedicated[UE_id].ackNackRepetition=1; + eNB->pucch_config_dedicated[UE_id].ackNackRepetition=1; } - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = multiplexing; + if (eNB->frame_parms.frame_type == FDD) { + eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = multiplexing; } else { if (physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode) - phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = *physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; + eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = *physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; else - phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = bundling; + eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = bundling; } - if ( phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == multiplexing) + if ( eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == multiplexing) LOG_D(PHY,"pucch_config_dedicated.tdd_AckNackFeedbackMode = multiplexing\n"); else LOG_D(PHY,"pucch_config_dedicated.tdd_AckNackFeedbackMode = bundling\n"); @@ -442,13 +442,13 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB) } if (physicalConfigDedicated->pusch_ConfigDedicated) { - phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; - phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; - phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; + eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; + eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; + eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; - LOG_D(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index); - LOG_D(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index); - LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d\n",phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index); + LOG_D(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index); + LOG_D(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index); + LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d\n",eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index); LOG_D(PHY,"\n"); @@ -456,43 +456,43 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB) if (physicalConfigDedicated->uplinkPowerControlDedicated) { - phy_vars_eNB->ul_power_control_dedicated[UE_id].p0_UE_PUSCH = physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUSCH; - phy_vars_eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled= physicalConfigDedicated->uplinkPowerControlDedicated->deltaMCS_Enabled; - phy_vars_eNB->ul_power_control_dedicated[UE_id].accumulationEnabled= physicalConfigDedicated->uplinkPowerControlDedicated->accumulationEnabled; - phy_vars_eNB->ul_power_control_dedicated[UE_id].p0_UE_PUCCH= physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUCCH; - phy_vars_eNB->ul_power_control_dedicated[UE_id].pSRS_Offset= physicalConfigDedicated->uplinkPowerControlDedicated->pSRS_Offset; - phy_vars_eNB->ul_power_control_dedicated[UE_id].filterCoefficient= *physicalConfigDedicated->uplinkPowerControlDedicated->filterCoefficient; - LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUSCH %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].p0_UE_PUSCH); - LOG_D(PHY,"ul_power_control_dedicated.deltaMCS_Enabled %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled); - LOG_D(PHY,"ul_power_control_dedicated.accumulationEnabled %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].accumulationEnabled); - LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUCCH %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].p0_UE_PUCCH); - LOG_D(PHY,"ul_power_control_dedicated.pSRS_Offset %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].pSRS_Offset); - LOG_D(PHY,"ul_power_control_dedicated.filterCoefficient %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].filterCoefficient); + eNB->ul_power_control_dedicated[UE_id].p0_UE_PUSCH = physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUSCH; + eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled= physicalConfigDedicated->uplinkPowerControlDedicated->deltaMCS_Enabled; + eNB->ul_power_control_dedicated[UE_id].accumulationEnabled= physicalConfigDedicated->uplinkPowerControlDedicated->accumulationEnabled; + eNB->ul_power_control_dedicated[UE_id].p0_UE_PUCCH= physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUCCH; + eNB->ul_power_control_dedicated[UE_id].pSRS_Offset= physicalConfigDedicated->uplinkPowerControlDedicated->pSRS_Offset; + eNB->ul_power_control_dedicated[UE_id].filterCoefficient= *physicalConfigDedicated->uplinkPowerControlDedicated->filterCoefficient; + LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUSCH %d\n",eNB->ul_power_control_dedicated[UE_id].p0_UE_PUSCH); + LOG_D(PHY,"ul_power_control_dedicated.deltaMCS_Enabled %d\n",eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled); + LOG_D(PHY,"ul_power_control_dedicated.accumulationEnabled %d\n",eNB->ul_power_control_dedicated[UE_id].accumulationEnabled); + LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUCCH %d\n",eNB->ul_power_control_dedicated[UE_id].p0_UE_PUCCH); + LOG_D(PHY,"ul_power_control_dedicated.pSRS_Offset %d\n",eNB->ul_power_control_dedicated[UE_id].pSRS_Offset); + LOG_D(PHY,"ul_power_control_dedicated.filterCoefficient %d\n",eNB->ul_power_control_dedicated[UE_id].filterCoefficient); LOG_D(PHY,"\n"); } if (physicalConfigDedicated->antennaInfo) { - phy_vars_eNB->transmission_mode[UE_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode); - LOG_D(PHY,"Transmission Mode %d\n",phy_vars_eNB->transmission_mode[UE_id]); + eNB->transmission_mode[UE_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode); + LOG_D(PHY,"Transmission Mode %d\n",eNB->transmission_mode[UE_id]); LOG_D(PHY,"\n"); } if (physicalConfigDedicated->schedulingRequestConfig) { if (physicalConfigDedicated->schedulingRequestConfig->present == SchedulingRequestConfig_PR_setup) { - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex = physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex; - phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex=physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_ConfigIndex; - phy_vars_eNB->scheduling_request_config[UE_id].dsr_TransMax=physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax; + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex = physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex; + eNB->scheduling_request_config[UE_id].sr_ConfigIndex=physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_ConfigIndex; + eNB->scheduling_request_config[UE_id].dsr_TransMax=physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax; - LOG_D(PHY,"scheduling_request_config.sr_PUCCH_ResourceIndex %d\n",phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); - LOG_D(PHY,"scheduling_request_config.sr_ConfigIndex %d\n",phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex); - LOG_D(PHY,"scheduling_request_config.dsr_TransMax %d\n",phy_vars_eNB->scheduling_request_config[UE_id].dsr_TransMax); + LOG_D(PHY,"scheduling_request_config.sr_PUCCH_ResourceIndex %d\n",eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"scheduling_request_config.sr_ConfigIndex %d\n",eNB->scheduling_request_config[UE_id].sr_ConfigIndex); + LOG_D(PHY,"scheduling_request_config.dsr_TransMax %d\n",eNB->scheduling_request_config[UE_id].dsr_TransMax); } LOG_D(PHY,"------------------------------------------------------------\n"); } - phy_vars_eNB->physicalConfigDedicated[UE_id] = NULL; + eNB->physicalConfigDedicated[UE_id] = NULL; } } } @@ -506,13 +506,13 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility if(mobilityControlInfo!=NULL) { RadioResourceConfigCommon_t *radioResourceConfigCommon = &mobilityControlInfo->radioResourceConfigCommon; LOG_I(PHY,"radioResourceConfigCommon %p\n", radioResourceConfigCommon); - memcpy((void *)&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms_before_ho, - (void *)&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms, + memcpy((void *)&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms_before_ho, + (void *)&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms, sizeof(LTE_DL_FRAME_PARMS)); PHY_vars_UE_g[Mod_id][CC_id]->ho_triggered = 1; //PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH; - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; // int N_ZC; // uint8_t prach_fmt; // int u; @@ -520,98 +520,98 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility LOG_I(PHY,"[UE%d] Frame %d: Handover triggered: Applying radioResourceConfigCommon from eNB %d\n", Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,eNB_id); - lte_frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - lte_frame_parms->prach_config_common.prach_Config_enabled=1; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex; - lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag; - lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset; + frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; + frame_parms->prach_config_common.prach_Config_enabled=1; + frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex; + frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag; + frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig; + frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset; - // prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,lte_frame_parms->frame_type); + // prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,frame_parms->frame_type); // N_ZC = (prach_fmt <4)?839:139; - // u = (prach_fmt < 4) ? prach_root_sequence_map0_3[lte_frame_parms->prach_config_common.rootSequenceIndex] : - // prach_root_sequence_map4[lte_frame_parms->prach_config_common.rootSequenceIndex]; + // u = (prach_fmt < 4) ? prach_root_sequence_map0_3[frame_parms->prach_config_common.rootSequenceIndex] : + // prach_root_sequence_map4[frame_parms->prach_config_common.rootSequenceIndex]; //compute_prach_seq(u,N_ZC, PHY_vars_UE_g[Mod_id]->X_u); - compute_prach_seq(&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms.prach_config_common, - lte_frame_parms->frame_type, + compute_prach_seq(&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common, + frame_parms->frame_type, PHY_vars_UE_g[Mod_id][CC_id]->X_u); - lte_frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift; - lte_frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI; - lte_frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN; - lte_frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN; - lte_frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower; - lte_frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b; + frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift; + frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI; + frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN; + frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN; + frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower; + frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b; - lte_frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - lte_frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - lte_frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - lte_frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift; + frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift; - init_ul_hopping(lte_frame_parms); - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 0; + init_ul_hopping(frame_parms); + frame_parms->soundingrs_ul_config_common.enabled_flag = 0; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->present==SoundingRS_UL_ConfigCommon_PR_setup) { - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - lte_frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_BandwidthConfig; - lte_frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig; - lte_frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.ackNackSRS_SimultaneousTransmission; + frame_parms->soundingrs_ul_config_common.enabled_flag = 1; + frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_BandwidthConfig; + frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig; + frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.ackNackSRS_SimultaneousTransmission; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_MaxUpPts) - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; + frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; else - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; + frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; } - lte_frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUSCH; - lte_frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon->alpha; - lte_frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUCCH; - lte_frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaPreambleMsg3; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1b; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b; + frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUSCH; + frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon->alpha; + frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUCCH; + frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaPreambleMsg3; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1b; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a; + frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b; - lte_frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx; + frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx; // Now configure some of the Physical Channels if (radioResourceConfigCommon->antennaInfoCommon) - lte_frame_parms->nb_antennas_tx = (1<antennaInfoCommon->antennaPortsCount); + frame_parms->nb_antennas_tx = (1<antennaInfoCommon->antennaPortsCount); else - lte_frame_parms->nb_antennas_tx = 1; + frame_parms->nb_antennas_tx = 1; //PHICH if (radioResourceConfigCommon->antennaInfoCommon) { - lte_frame_parms->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource; - lte_frame_parms->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration; + frame_parms->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource; + frame_parms->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration; } //Target CellId - lte_frame_parms->Nid_cell = mobilityControlInfo->targetPhysCellId; - lte_frame_parms->nushift = lte_frame_parms->Nid_cell%6; + frame_parms->Nid_cell = mobilityControlInfo->targetPhysCellId; + frame_parms->nushift = frame_parms->Nid_cell%6; // PUCCH - init_ncs_cell(lte_frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); + init_ncs_cell(frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); - init_ul_hopping(lte_frame_parms); + init_ul_hopping(frame_parms); // RNTI - PHY_vars_UE_g[Mod_id][CC_id]->lte_ue_pdcch_vars[eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8); + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8); } if(ho_failed) { LOG_D(PHY,"[UE%d] Handover failed, triggering RACH procedure\n",Mod_id); - memcpy((void *)&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms,(void *)&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms_before_ho, sizeof(LTE_DL_FRAME_PARMS)); + memcpy((void *)&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms,(void *)&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms_before_ho, sizeof(LTE_DL_FRAME_PARMS)); PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_id] = PRACH; } } @@ -619,14 +619,14 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility void phy_config_meas_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n_adj_cells,unsigned int *adj_cell_id) { - PHY_MEASUREMENTS *phy_meas = &PHY_vars_UE_g[Mod_id][CC_id]->PHY_measurements; + PHY_MEASUREMENTS *phy_meas = &PHY_vars_UE_g[Mod_id][CC_id]->measurements; int i; LOG_I(PHY,"Configuring inter-cell measurements for %d cells, ids: \n",n_adj_cells); for (i=0; ilte_frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_table[i+1],adj_cell_id[i]); + lte_gold(&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_table[i+1],adj_cell_id[i]); } phy_meas->n_adj_cells = n_adj_cells; @@ -640,20 +640,20 @@ void phy_config_dedicated_eNB(uint8_t Mod_id, struct PhysicalConfigDedicated *physicalConfigDedicated) { - PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[Mod_id][CC_id]; - int8_t UE_id = find_ue(rnti,phy_vars_eNB); + PHY_VARS_eNB *eNB = PHY_vars_eNB_g[Mod_id][CC_id]; + int8_t UE_id = find_ue(rnti,eNB); if (UE_id == -1) { - LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id, phy_vars_eNB->proc[8].frame_tx ); + LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id, eNB->proc[0].frame_tx ); return; } if (physicalConfigDedicated) { - phy_vars_eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated; + eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated; LOG_I(PHY,"phy_config_dedicated_eNB: physicalConfigDedicated=%p\n",physicalConfigDedicated); } else { - LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, phy_vars_eNB->proc[8].frame_tx,UE_id); + LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, eNB->proc[0].frame_tx,UE_id); return; } @@ -672,7 +672,7 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, int CC_id) { - //PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[Mod_id][CC_id]; + //PHY_VARS_eNB *eNB = PHY_vars_eNB_g[Mod_id][CC_id]; uint8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][0]); struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; //struct RadioResourceConfigCommonSCell_r10 *physicalConfigCommonSCell_r10 = sCellToAddMod_r10->radioResourceConfigCommonSCell_r10; @@ -688,7 +688,7 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, if ((dl_CarrierFreq_r10>=36000) && (dl_CarrierFreq_r10<=36199)) { carrier_freq_local = 1900000000 + (dl_CarrierFreq_r10-36000)*100000; //band 33 from 3GPP 36.101 v 10.9 Table 5.7.3-1 - LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*phy_vars_eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); + LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); #ifdef EXMIMO #ifdef DRIVER2013 //carrier_freq[CC_id] = carrier_freq_local; @@ -704,7 +704,7 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, } else if ((dl_CarrierFreq_r10>=6150) && (dl_CarrierFreq_r10<=6449)) { carrier_freq_local = 832000000 + (dl_CarrierFreq_r10-6150)*100000; //band 20 from 3GPP 36.101 v 10.9 Table 5.7.3-1 // this is actually for the UL only, but we use it for DL too, since there is no TDD mode for this band - LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*phy_vars_eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); + LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); #ifdef EXMIMO #ifdef DRIVER2013 //carrier_freq[CC_id] = carrier_freq_local; @@ -718,15 +718,15 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, #endif #endif } else { - LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %d of SCell %d for UE %d not supported\n",Mod_id,/*phy_vars_eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id); + LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %d of SCell %d for UE %d not supported\n",Mod_id,/*eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id); } if (physicalConfigDedicatedSCell_r10) { -//#warning " phy_vars_eNB->physicalConfigDedicatedSCell_r10 does not exist in phy_vars_eNB" - // phy_vars_eNB->physicalConfigDedicatedSCell_r10[UE_id] = physicalConfigDedicatedSCell_r10; - LOG_I(PHY,"[eNB %d] Frame %d: Configured phyConfigDedicatedSCell with CC_id %d for UE %d\n",Mod_id,/*phy_vars_eNB->frame*/0,CC_id,UE_id); +//#warning " eNB->physicalConfigDedicatedSCell_r10 does not exist in eNB" + // eNB->physicalConfigDedicatedSCell_r10[UE_id] = physicalConfigDedicatedSCell_r10; + LOG_I(PHY,"[eNB %d] Frame %d: Configured phyConfigDedicatedSCell with CC_id %d for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,UE_id); } else { - LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated (CC_id %d, UE %d)\n",Mod_id, /*phy_vars_eNB->frame*/0,CC_id,UE_id); + LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated (CC_id %d, UE %d)\n",Mod_id, /*eNB->frame*/0,CC_id,UE_id); return; } @@ -855,18 +855,18 @@ void phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uin if (eNB_flag == 0 ) { //LOG_D(PHY,"[UE %d] configure cba group %d with rnti %x, num active cba grp %d\n", index, index, cba_rnti, num_active_cba_groups); - PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[index]->num_active_cba_groups=num_active_cba_groups; - PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[index]->cba_rnti[cba_group_id]=cba_rnti; + PHY_vars_UE_g[Mod_id][CC_id]->ulsch[index]->num_active_cba_groups=num_active_cba_groups; + PHY_vars_UE_g[Mod_id][CC_id]->ulsch[index]->cba_rnti[cba_group_id]=cba_rnti; } else { //for (i=index; i < NUMBER_OF_UE_MAX; i+=num_active_cba_groups){ // LOG_D(PHY,"[eNB %d] configure cba group %d with rnti %x for UE %d, num active cba grp %d\n",Mod_id, i%num_active_cba_groups, cba_rnti, i, num_active_cba_groups); - PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[index]->num_active_cba_groups=num_active_cba_groups; - PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[index]->cba_rnti[cba_group_id] = cba_rnti; + PHY_vars_eNB_g[Mod_id][CC_id]->ulsch[index]->num_active_cba_groups=num_active_cba_groups; + PHY_vars_eNB_g[Mod_id][CC_id]->ulsch[index]->cba_rnti[cba_group_id] = cba_rnti; //} } } -void phy_init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms) +void phy_init_lte_top(LTE_DL_FRAME_PARMS *frame_parms) { crcTableInit(); @@ -888,7 +888,7 @@ void phy_init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms) init_td16avx2(); #endif - lte_sync_time_init(lte_frame_parms); + lte_sync_time_init(frame_parms); generate_ul_ref_sigs(); generate_ul_ref_sigs_rx(); @@ -946,527 +946,460 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS } } -/*! \brief Helper function to allocate memory for DLSCH_FLP data structures. - * \param[out] pdsch_flp Pointer to the LTE_UE_PDSCH_FLP structure to initialize. - * \param[in] frame_parms LTE_DL_FRAME_PARMS structure. - * \note This function is optimistic in that it expects malloc() to succeed. - */ -void phy_init_lte_ue__PDSCH_FLP( LTE_UE_PDSCH_FLP* const pdsch_flp, const LTE_DL_FRAME_PARMS* const frame_parms ) -{ - AssertFatal( pdsch_flp, "pdsch==0" ); - pdsch_flp->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - pdsch_flp->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - pdsch_flp->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) ); - // FIXME! no further allocation for (int16_t*)pdsch_flp->llr128 !!! expect SIGSEGV - - pdsch_flp->pmi_ext = (uint8_t*)malloc16_clear( frame_parms->N_RB_DL ); - pdsch_flp->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch_flp->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch_flp->rxdataF_comp = (double**)malloc16_clear( 8*sizeof(double*) ); - pdsch_flp->dl_ch_rho_ext = (double**)malloc16_clear( 8*sizeof(double*) ); - pdsch_flp->dl_ch_mag = (double**)malloc16_clear( 8*sizeof(double*) ); - pdsch_flp->dl_ch_magb = (double**)malloc16_clear( 8*sizeof(double*) ); - pdsch_flp->rho = (double**)malloc16_clear( frame_parms->nb_antennas_rx*sizeof(double*) ); - - // the allocated memory size is fixed: - AssertFatal( frame_parms->nb_antennas_rx <= 2, "nb_antennas_rx > 2" ); - - for (int i=0; inb_antennas_rx; i++) { - pdsch_flp->rho[i] = (double*)malloc16_clear( sizeof(double)*(frame_parms->N_RB_DL*12*7*2) ); - - for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++) - const int idx = (j<<1)+i; - const size_t num = 7*2*frame_parms->N_RB_DL*12; - pdsch_flp->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch_flp->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch_flp->rxdataF_comp[idx] = (double*)malloc16_clear( sizeof(double) * num ); - pdsch_flp->dl_ch_rho_ext[idx] = (double*)malloc16_clear( sizeof(double) * num ); - pdsch_flp->dl_ch_mag[idx] = (double*)malloc16_clear( sizeof(double) * num ); - pdsch_flp->dl_ch_magb[idx] = (double*)malloc16_clear( sizeof(double) * num ); - } - } -} - -int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, +int phy_init_lte_ue(PHY_VARS_UE *ue, int nb_connected_eNB, uint8_t abstraction_flag) { // create shortcuts - LTE_DL_FRAME_PARMS* const frame_parms = &phy_vars_ue->lte_frame_parms; - LTE_UE_COMMON* const ue_common_vars = &phy_vars_ue->lte_ue_common_vars; - LTE_UE_PDSCH** const ue_pdsch_vars = phy_vars_ue->lte_ue_pdsch_vars; - LTE_UE_PDSCH_FLP** const ue_pdsch_vars_flp = phy_vars_ue->lte_ue_pdsch_vars_flp; - LTE_UE_PDSCH** const ue_pdsch_vars_SI = phy_vars_ue->lte_ue_pdsch_vars_SI; - LTE_UE_PDSCH** const ue_pdsch_vars_ra = phy_vars_ue->lte_ue_pdsch_vars_ra; - LTE_UE_PDSCH** const ue_pdsch_vars_mch = phy_vars_ue->lte_ue_pdsch_vars_MCH; - LTE_UE_PBCH** const ue_pbch_vars = phy_vars_ue->lte_ue_pbch_vars; - LTE_UE_PDCCH** const ue_pdcch_vars = phy_vars_ue->lte_ue_pdcch_vars; - LTE_UE_PRACH** const ue_prach_vars = phy_vars_ue->lte_ue_prach_vars; + LTE_DL_FRAME_PARMS* const frame_parms = &ue->frame_parms; + LTE_UE_COMMON* const common_vars = &ue->common_vars; + LTE_UE_PDSCH** const pdsch_vars = ue->pdsch_vars; + LTE_UE_PDSCH** const pdsch_vars_SI = ue->pdsch_vars_SI; + LTE_UE_PDSCH** const pdsch_vars_ra = ue->pdsch_vars_ra; + LTE_UE_PDSCH** const pdsch_vars_mch = ue->pdsch_vars_MCH; + LTE_UE_PBCH** const pbch_vars = ue->pbch_vars; + LTE_UE_PDCCH** const pdcch_vars = ue->pdcch_vars; + LTE_UE_PRACH** const prach_vars = ue->prach_vars; int i,j,k; int eNB_id; msg("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx); - LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", phy_vars_ue->Mod_id+NB_eNB_INST); + LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST); // many memory allocation sizes are hard coded AssertFatal( frame_parms->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" ); - AssertFatal( phy_vars_ue->n_connected_eNB <= NUMBER_OF_CONNECTED_eNB_MAX, "n_connected_eNB is too large" ); -#ifndef USER_MODE - AssertFatal( frame_parms->nb_antennas_tx <= NB_ANTENNAS_TX, "nb_antennas_tx too large" ); - AssertFatal( frame_parms->nb_antennas_rx <= NB_ANTENNAS_RX, "nb_antennas_rx too large" ); -#endif + AssertFatal( ue->n_connected_eNB <= NUMBER_OF_CONNECTED_eNB_MAX, "n_connected_eNB is too large" ); // init phy_vars_ue for (i=0; i<4; i++) { - phy_vars_ue->rx_gain_max[i] = 135; - phy_vars_ue->rx_gain_med[i] = 128; - phy_vars_ue->rx_gain_byp[i] = 120; + ue->rx_gain_max[i] = 135; + ue->rx_gain_med[i] = 128; + ue->rx_gain_byp[i] = 120; } - phy_vars_ue->n_connected_eNB = nb_connected_eNB; + ue->n_connected_eNB = nb_connected_eNB; - for(eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) { - phy_vars_ue->total_TBS[eNB_id] = 0; - phy_vars_ue->total_TBS_last[eNB_id] = 0; - phy_vars_ue->bitrate[eNB_id] = 0; - phy_vars_ue->total_received_bits[eNB_id] = 0; + for(eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) { + ue->total_TBS[eNB_id] = 0; + ue->total_TBS_last[eNB_id] = 0; + ue->bitrate[eNB_id] = 0; + ue->total_received_bits[eNB_id] = 0; } - phy_vars_ue->tx_power_dBm=-127; + ue->tx_power_dBm=-127; if (abstraction_flag == 0) { // init TX buffers - ue_common_vars->txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - ue_common_vars->txdataF = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); + common_vars->txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); + common_vars->txdataF = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); for (i=0; inb_antennas_tx; i++) { -#ifdef USER_MODE - ue_common_vars->txdata[i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); -#else //USER_MODE - ue_common_vars->txdata[i] = TX_DMA_BUFFER[0][i]; -#endif //USER_MODE - ue_common_vars->txdataF[i] = (int32_t *)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); + + common_vars->txdata[i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); + common_vars->txdataF[i] = (int32_t *)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); } // init RX buffers - ue_common_vars->rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - ue_common_vars->rxdataF = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - ue_common_vars->rxdataF2 = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdataF = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdataF2 = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); for (i=0; inb_antennas_rx; i++) { -#ifndef USER_MODE - ue_common_vars->rxdata[i] = (int32_t*) RX_DMA_BUFFER[0][i]; -#else //USER_MODE - ue_common_vars->rxdata[i] = (int32_t*) malloc16_clear( (FRAME_LENGTH_COMPLEX_SAMPLES+2048)*sizeof(int32_t) ); -#endif //USER_MODE - // RK 2 times because of output format of FFT! - // FIXME We should get rid of this - ue_common_vars->rxdataF[i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*(frame_parms->ofdm_symbol_size*14) ); - // RK 2 times because of output format of FFT! We should get rid of this - // FIXME We should get rid of this - ue_common_vars->rxdataF2[i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*10) ); + common_vars->rxdata[i] = (int32_t*) malloc16_clear( (FRAME_LENGTH_COMPLEX_SAMPLES+2048)*sizeof(int32_t) ); + common_vars->rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->ofdm_symbol_size*14) ); + common_vars->rxdataF2[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*10) ); } } // Channel estimates for (eNB_id=0; eNB_id<7; eNB_id++) { - ue_common_vars->dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); - ue_common_vars->dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); + common_vars->dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); + common_vars->dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); for (i=0; inb_antennas_rx; i++) for (j=0; j<4; j++) { int idx = (j<<1) + i; - ue_common_vars->dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->symbols_per_tti*(frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); - ue_common_vars->dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size*2 ); + common_vars->dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->symbols_per_tti*(frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); + common_vars->dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size*2 ); } } // DLSCH - for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) { - ue_pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); -#ifdef ENABLE_FULL_FLP - ue_pdsch_vars_flp[eNB_id] = (LTE_UE_PDSCH_FLP *)malloc16_clear(sizeof(LTE_UE_PDSCH_FLP)); -#else - ue_pdsch_vars_flp[eNB_id] = 0; -#endif - ue_pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); - ue_pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); - ue_pdsch_vars_mch[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); - ue_pdcch_vars[eNB_id] = (LTE_UE_PDCCH *)malloc16_clear(sizeof(LTE_UE_PDCCH)); - ue_prach_vars[eNB_id] = (LTE_UE_PRACH *)malloc16_clear(sizeof(LTE_UE_PRACH)); - ue_pbch_vars[eNB_id] = (LTE_UE_PBCH *)malloc16_clear(sizeof(LTE_UE_PBCH)); + for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) { + pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); + pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); + pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); + pdsch_vars_mch[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); + pdcch_vars[eNB_id] = (LTE_UE_PDCCH *)malloc16_clear(sizeof(LTE_UE_PDCCH)); + prach_vars[eNB_id] = (LTE_UE_PRACH *)malloc16_clear(sizeof(LTE_UE_PRACH)); + pbch_vars[eNB_id] = (LTE_UE_PBCH *)malloc16_clear(sizeof(LTE_UE_PBCH)); if (abstraction_flag == 0) { - phy_init_lte_ue__PDSCH( ue_pdsch_vars[eNB_id], frame_parms ); + phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], frame_parms ); - ue_pdsch_vars[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*frame_parms->N_RB_DL*12); - ue_pdsch_vars[eNB_id]->llr_shifts_p = ue_pdsch_vars[eNB_id]->llr_shifts; - ue_pdsch_vars[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdsch_vars[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + pdsch_vars[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*frame_parms->N_RB_DL*12); + pdsch_vars[eNB_id]->llr_shifts_p = pdsch_vars[eNB_id]->llr_shifts; + pdsch_vars[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch_vars[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); for (k=0; k<8; k++) - ue_pdsch_vars[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch_vars[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); for (i=0; inb_antennas_rx; i++) for (j=0; j<4; j++) { int idx = (j<<1)+i; - ue_pdsch_vars[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(frame_parms->N_RB_DL*12) ); - ue_pdsch_vars[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(frame_parms->N_RB_DL*12) ); + pdsch_vars[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(frame_parms->N_RB_DL*12) ); + pdsch_vars[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(frame_parms->N_RB_DL*12) ); for (k=0; k<8; k++) - ue_pdsch_vars[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*14) ); + pdsch_vars[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*14) ); } -#ifdef ENABLE_FULL_FLP - phy_init_lte_ue__PDSCH_FLP( ue_pdsch_vars_flp[eNB_id], frame_parms ); -#endif - - phy_init_lte_ue__PDSCH( ue_pdsch_vars_SI[eNB_id], frame_parms ); - phy_init_lte_ue__PDSCH( ue_pdsch_vars_ra[eNB_id], frame_parms ); - phy_init_lte_ue__PDSCH( ue_pdsch_vars_mch[eNB_id], frame_parms ); + phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], frame_parms ); + phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], frame_parms ); + phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], frame_parms ); // 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE - ue_pdcch_vars[eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); - ue_pdcch_vars[eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); - ue_pdcch_vars[eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); - ue_pdcch_vars[eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 ); + pdcch_vars[eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + pdcch_vars[eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + pdcch_vars[eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + pdcch_vars[eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 ); - ue_pdcch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdcch_vars[eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdcch_vars[eNB_id]->rho = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - ue_pdcch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdcch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdcch_vars[eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdcch_vars[eNB_id]->rho = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pdcch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdcch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); for (i=0; inb_antennas_rx; i++) { //ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*7*2) ); - ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) ); + pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) ); for (j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++) int idx = (j<<1)+i; // size_t num = 7*2*frame_parms->N_RB_DL*12; size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB - ue_pdcch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - ue_pdcch_vars[eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - ue_pdcch_vars[eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdcch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdcch_vars[eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdcch_vars[eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdcch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); } } // PBCH - ue_pbch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - ue_pbch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pbch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pbch_vars[eNB_id]->llr = (int8_t*)malloc16_clear( 1920 ); - ue_prach_vars[eNB_id]->prachF = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(frame_parms->ofdm_symbol_size*12)) ); - ue_prach_vars[eNB_id]->prach = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(frame_parms->ofdm_symbol_size*12)) ); + pbch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pbch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pbch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pbch_vars[eNB_id]->llr = (int8_t*)malloc16_clear( 1920 ); + prach_vars[eNB_id]->prachF = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(frame_parms->ofdm_symbol_size*12)) ); + prach_vars[eNB_id]->prach = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(frame_parms->ofdm_symbol_size*12)) ); for (i=0; inb_antennas_rx; i++) { - ue_pbch_vars[eNB_id]->rxdataF_ext[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); + pbch_vars[eNB_id]->rxdataF_ext[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); for (j=0; j<4; j++) {//frame_parms->nb_antennas_tx;j++) { int idx = (j<<1)+i; - ue_pbch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); - ue_pbch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); + pbch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); + pbch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); } } } - ue_pbch_vars[eNB_id]->decoded_output = (uint8_t*)malloc16_clear( 64 ); + pbch_vars[eNB_id]->decoded_output = (uint8_t*)malloc16_clear( 64 ); } - // initialization for the last instance of ue_pdsch_vars (used for MU-MIMO) + // initialization for the last instance of pdsch_vars (used for MU-MIMO) - ue_pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); - ue_pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); - ue_pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); - ue_pdsch_vars_flp[eNB_id] = (LTE_UE_PDSCH_FLP *)malloc16_clear( sizeof(LTE_UE_PDSCH_FLP) ); + pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); + pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); + pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); if (abstraction_flag == 0) { - phy_init_lte_ue__PDSCH( ue_pdsch_vars[eNB_id], frame_parms ); - ue_pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], frame_parms ); + pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - phy_init_lte_ue__PDSCH_FLP( ue_pdsch_vars_flp[eNB_id], frame_parms ); } else { //abstraction == 1 - phy_vars_ue->sinr_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); + ue->sinr_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); } - phy_vars_ue->sinr_CQI_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); + ue->sinr_CQI_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); - phy_vars_ue->init_averaging = 1; - phy_vars_ue->pdsch_config_dedicated->p_a = dB0; // default value until overwritten by RRCConnectionReconfiguration + ue->init_averaging = 1; + ue->pdsch_config_dedicated->p_a = dB0; // default value until overwritten by RRCConnectionReconfiguration // set channel estimation to do linear interpolation in time - phy_vars_ue->high_speed_flag = 1; - phy_vars_ue->ch_est_alpha = 24576; + ue->high_speed_flag = 1; + ue->ch_est_alpha = 24576; init_prach_tables(839); return 0; } -int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB, +int phy_init_lte_eNB(PHY_VARS_eNB *eNB, unsigned char is_secondary_eNB, uint8_t cooperation_flag, unsigned char abstraction_flag) { // shortcuts - LTE_DL_FRAME_PARMS* const frame_parms = &phy_vars_eNB->lte_frame_parms; - LTE_eNB_COMMON* const eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars; - LTE_eNB_PUSCH** const eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars; - LTE_eNB_SRS* const eNB_srs_vars = phy_vars_eNB->lte_eNB_srs_vars; - LTE_eNB_PRACH* const eNB_prach_vars = &phy_vars_eNB->lte_eNB_prach_vars; + LTE_DL_FRAME_PARMS* const frame_parms = &eNB->frame_parms; + LTE_eNB_COMMON* const common_vars = &eNB->common_vars; + LTE_eNB_PUSCH** const pusch_vars = eNB->pusch_vars; + LTE_eNB_SRS* const srs_vars = eNB->srs_vars; + LTE_eNB_PRACH* const prach_vars = &eNB->prach_vars; int i, j, eNB_id, UE_id; - phy_vars_eNB->total_dlsch_bitrate = 0; - phy_vars_eNB->total_transmitted_bits = 0; - phy_vars_eNB->total_system_throughput = 0; - phy_vars_eNB->check_for_MUMIMO_transmissions=0; + eNB->total_dlsch_bitrate = 0; + eNB->total_transmitted_bits = 0; + eNB->total_system_throughput = 0; + eNB->check_for_MUMIMO_transmissions=0; LOG_I(PHY,"[eNB %"PRIu8"] Initializing DL_FRAME_PARMS : N_RB_DL %"PRIu8", PHICH Resource %d, PHICH Duration %d\n", - phy_vars_eNB->Mod_id, + eNB->Mod_id, frame_parms->N_RB_DL,frame_parms->phich_config_common.phich_resource, frame_parms->phich_config_common.phich_duration); - LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_eNB][MOD %02"PRIu8"][]\n", phy_vars_eNB->Mod_id); + LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_eNB][MOD %02"PRIu8"][]\n", eNB->Mod_id); - lte_gold(frame_parms,phy_vars_eNB->lte_gold_table,frame_parms->Nid_cell); - generate_pcfich_reg_mapping(frame_parms); - generate_phich_reg_mapping(frame_parms); + if (eNB->node_function != NGFI_RRU_IF4) { + lte_gold(frame_parms,eNB->lte_gold_table,frame_parms->Nid_cell); + generate_pcfich_reg_mapping(frame_parms); + generate_phich_reg_mapping(frame_parms); + + for (UE_id=0; UE_idfirst_run_timing_advance[UE_id] = + 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here. - for (UE_id=0; UE_idfirst_run_timing_advance[UE_id] = + // clear whole structure + bzero( &eNB->UE_stats[UE_id], sizeof(LTE_eNB_UE_stats) ); + + eNB->physicalConfigDedicated[UE_id] = NULL; + } + + eNB->first_run_I0_measurements = 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here. - - // clear whole structure - bzero( &phy_vars_eNB->eNB_UE_stats[UE_id], sizeof(LTE_eNB_UE_stats) ); - - phy_vars_eNB->physicalConfigDedicated[UE_id] = NULL; } - - phy_vars_eNB->first_run_I0_measurements = - 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here. - -#ifndef USER_MODE - AssertFatal( frame_parms->nb_antennas_tx <= NB_ANTENNAS_TX, "nb_antennas_tx too large" ); - AssertFatal( frame_parms->nb_antennas_rx <= NB_ANTENNAS_RX, "nb_antennas_rx too large" ); -#endif - - for (eNB_id=0; eNB_id<3; eNB_id++) { - + // for (eNB_id=0; eNB_id<3; eNB_id++) { + { + eNB_id=0; if (abstraction_flag==0) { - + // TX vars - eNB_common_vars->txdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - eNB_common_vars->txdataF[eNB_id] = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - + if (eNB->node_function != NGFI_RCC_IF4) + common_vars->txdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); + common_vars->txdataF[eNB_id] = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); + for (i=0; inb_antennas_tx; i++) { -#ifdef USER_MODE - eNB_common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); - eNB_common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); -#else // USER_MODE - eNB_common_vars->txdata[eNB_id][i] = TX_DMA_BUFFER[eNB_id][i]; - eNB_common_vars->txdataF[eNB_id][i] = (int32_t *)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); -#endif //USER_MODE + if (eNB->node_function != NGFI_RCC_IF4) + common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); + common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->txdata[%d][%d] = %p\n",eNB_id,i,eNB_common_vars->txdata[eNB_id][i]); - msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->txdataF[%d][%d] = %p (%d bytes)\n", - eNB_id,i,eNB_common_vars->txdataF[eNB_id][i], - FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + msg("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]); + msg("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%d bytes)\n", + eNB_id,i,common_vars->txdataF[eNB_id][i], + FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); #endif } - + // RX vars - eNB_common_vars->rxdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - + if (eNB->node_function != NGFI_RCC_IF4) { + common_vars->rxdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + } + common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + for (i=0; inb_antennas_rx; i++) { -#ifndef USER_MODE - eNB_common_vars->rxdata[eNB_id][i] = (int32_t*)RX_DMA_BUFFER[eNB_id][i]; -#else //USER_MODE - eNB_common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); -#endif //USER_MODE - eNB_common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->samples_per_tti*sizeof(int32_t) ); - // RK 2 times because of output format of FFT! - // FIXME We should get rid of this - eNB_common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti) ); + if (eNB->node_function != NGFI_RCC_IF4) { + common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); + common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->samples_per_tti*sizeof(int32_t) ); + } + + common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti) ); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,eNB_common_vars->rxdata[eNB_id][i]); - msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,eNB_common_vars->rxdata_7_5kHz[eNB_id][i]); + msg("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata[eNB_id][i]); + msg("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i]); #endif } - - // Channel estimates for SRS - for (UE_id=0; UE_idnb_antennas_rx*sizeof(int32_t*) ); - eNB_srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - eNB_srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size ); - eNB_srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size*2 ); - } - } //UE_id - - eNB_common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*frame_parms->samples_per_tti ); + + if (eNB->node_function != NGFI_RRU_IF4) { + // Channel estimates for SRS + for (UE_id=0; UE_idnb_antennas_rx*sizeof(int32_t*) ); + srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + + for (i=0; inb_antennas_rx; i++) { + srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size ); + srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size*2 ); + } + } //UE_id + + common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*frame_parms->samples_per_tti ); + } } else { //UPLINK abstraction = 1 - phy_vars_eNB->sinr_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); + eNB->sinr_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); } } //eNB_id - -#ifndef NO_UL_REF - + + + if (abstraction_flag==0) { - generate_ul_ref_sigs_rx(); - - // SRS - for (UE_id=0; UE_idofdm_symbol_size*sizeof(int32_t)); + if (eNB->node_function != NGFI_RRU_IF4) { + generate_ul_ref_sigs_rx(); + + // SRS + for (UE_id=0; UE_idofdm_symbol_size*sizeof(int32_t)); + } } } - -#endif - - // ULSCH VARS - - eNB_prach_vars->prachF = (int16_t*)malloc16_clear( 2*1024 /*FIXME what is the correct number?*/ *sizeof(int16_t) ); - + + + + // ULSCH VARS, skip if NFGI_RRU_IF4 + + if (eNB->node_function!=NGFI_RRU_IF4) + prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) ); + /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */ - AssertFatal(frame_parms->nb_antennas_rx <= sizeof(eNB_prach_vars->rxsigF) / sizeof(eNB_prach_vars->rxsigF[0]), + AssertFatal(frame_parms->nb_antennas_rx <= sizeof(prach_vars->rxsigF) / sizeof(prach_vars->rxsigF[0]), "nb_antennas_rx too large"); for (i=0; inb_antennas_rx; i++) { - eNB_prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( frame_parms->ofdm_symbol_size*12*2*sizeof(int16_t) ); + prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( frame_parms->ofdm_symbol_size*12*2*sizeof(int16_t) ); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] prach_vars->rxsigF[%d] = %p\n",i,eNB_prach_vars->rxsigF[i]); + msg("[openair][LTE_PHY][INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]); #endif } - - AssertFatal(frame_parms->nb_antennas_rx <= sizeof(eNB_prach_vars->prach_ifft) / sizeof(eNB_prach_vars->prach_ifft[0]), - "nb_antennas_rx too large"); - for (i=0; inb_antennas_rx; i++) { - eNB_prach_vars->prach_ifft[i] = (int16_t*)malloc16_clear(1024*2*sizeof(int16_t)); + + if (eNB->node_function != NGFI_RRU_IF4) { + AssertFatal(frame_parms->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]), + "nb_antennas_rx too large"); + for (i=0; inb_antennas_rx; i++) { + prach_vars->prach_ifft[i] = (int16_t*)malloc16_clear(1024*2*sizeof(int16_t)); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] prach_vars->prach_ifft[%d] = %p\n",i,eNB_prach_vars->prach_ifft[i]); + msg("[openair][LTE_PHY][INIT] prach_vars->prach_ifft[%d] = %p\n",i,prach_vars->prach_ifft[i]); #endif - } - - for (UE_id=0; UE_idrxdataF_ext[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - // RK 2 times because of output format of FFT! - // FIXME We should get rid of this - eNB_pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - eNB_pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - eNB_pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - eNB_pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*frame_parms->ofdm_symbol_size ); - eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - eNB_pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - - // In case of Distributed Alamouti Collabrative scheme separate channel estimates are required for both the UEs - if (cooperation_flag == 2) { - eNB_pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // UE 0 DRS estimates - eNB_pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // UE 1 DRS estimates - - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - - // Compensated data for the case of Distributed Alamouti Scheme - eNB_pusch_vars[UE_id]->rxdataF_comp_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y)*(h0*) - eNB_pusch_vars[UE_id]->rxdataF_comp_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y*)*(h1) - - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars[UE_id]->rxdataF_comp_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->rxdataF_comp_1[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - - // UE 0 - eNB_pusch_vars[UE_id]->ul_ch_mag_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->ul_ch_magb_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars[UE_id]->ul_ch_mag_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->ul_ch_magb_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - - // UE 1 - eNB_pusch_vars[UE_id]->ul_ch_mag_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->ul_ch_magb_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars[UE_id]->ul_ch_mag_1[eNB_id][i] = (int32_t*)malloc16( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->ul_ch_magb_1[eNB_id][i] = (int32_t*)malloc16( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - }//cooperation_flag - } //eNB_id - - eNB_pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - } // abstraction_flag - } //UE_id - - if (abstraction_flag==0) { - if (is_secondary_eNB) { - for (eNB_id=0; eNB_id<3; eNB_id++) { - phy_vars_eNB->dl_precoder_SeNB[eNB_id] = (int **)malloc16(4*sizeof(int*)); - - if (phy_vars_eNB->dl_precoder_SeNB[eNB_id]) { -#ifdef DEBUG_PHY - msg("[openair][SECSYS_PHY][INIT] phy_vars_eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id, - phy_vars_eNB->dl_precoder_SeNB[eNB_id]); -#endif - } else { - msg("[openair][SECSYS_PHY][INIT] phy_vars_eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id); - return(-1); - } - - for (j=0; jlte_frame_parms.nb_antennas_tx; j++) { - phy_vars_eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)); // repeated format (hence the '2*') - - if (phy_vars_eNB->dl_precoder_SeNB[eNB_id][j]) { -#ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] phy_vars_eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j, - phy_vars_eNB->dl_precoder_SeNB[eNB_id][j]); -#endif - memset(phy_vars_eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)); - } else { - msg("[openair][LTE_PHY][INIT] phy_vars_eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j); - return(-1); - } - } //for(j=...nb_antennas_tx - - } //for(eNB_id... } - } - for (UE_id=0; UE_ideNB_UE_stats_ptr[UE_id] = &phy_vars_eNB->eNB_UE_stats[UE_id]; + for (UE_id=0; UE_idrxdataF_ext[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + + for (i=0; inb_antennas_rx; i++) { + // RK 2 times because of output format of FFT! + // FIXME We should get rid of this + pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); + pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); + pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); + pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*frame_parms->ofdm_symbol_size ); + pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); + pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + } + + // In case of Distributed Alamouti Collabrative scheme separate channel estimates are required for both the UEs + if (cooperation_flag == 2) { + pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // UE 0 DRS estimates + pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // UE 1 DRS estimates + + for (i=0; inb_antennas_rx; i++) { + pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + } + + // Compensated data for the case of Distributed Alamouti Scheme + pusch_vars[UE_id]->rxdataF_comp_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y)*(h0*) + pusch_vars[UE_id]->rxdataF_comp_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y*)*(h1) + + for (i=0; inb_antennas_rx; i++) { + pusch_vars[UE_id]->rxdataF_comp_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + pusch_vars[UE_id]->rxdataF_comp_1[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + } + + // UE 0 + pusch_vars[UE_id]->ul_ch_mag_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_magb_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + + for (i=0; inb_antennas_rx; i++) { + pusch_vars[UE_id]->ul_ch_mag_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + pusch_vars[UE_id]->ul_ch_magb_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + } + + // UE 1 + pusch_vars[UE_id]->ul_ch_mag_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_magb_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + + for (i=0; inb_antennas_rx; i++) { + pusch_vars[UE_id]->ul_ch_mag_1[eNB_id][i] = (int32_t*)malloc16( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + pusch_vars[UE_id]->ul_ch_magb_1[eNB_id][i] = (int32_t*)malloc16( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + } + }//cooperation_flag + } //eNB_id + + pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + } // abstraction_flag + } //UE_id - phy_vars_eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration + + if (abstraction_flag==0) { + if (is_secondary_eNB) { + for (eNB_id=0; eNB_id<3; eNB_id++) { + eNB->dl_precoder_SeNB[eNB_id] = (int **)malloc16(4*sizeof(int*)); + + if (eNB->dl_precoder_SeNB[eNB_id]) { +#ifdef DEBUG_PHY + msg("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id, + eNB->dl_precoder_SeNB[eNB_id]); +#endif + } else { + msg("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id); + return(-1); + } + + for (j=0; jframe_parms.nb_antennas_tx; j++) { + eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(eNB->frame_parms.ofdm_symbol_size)); // repeated format (hence the '2*') + + if (eNB->dl_precoder_SeNB[eNB_id][j]) { +#ifdef DEBUG_PHY + msg("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j, + eNB->dl_precoder_SeNB[eNB_id][j]); +#endif + memset(eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(eNB->frame_parms.ofdm_symbol_size)); + } else { + msg("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j); + return(-1); + } + } //for(j=...nb_antennas_tx + + } //for(eNB_id... + } + } + + for (UE_id=0; UE_idUE_stats_ptr[UE_id] = &eNB->UE_stats[UE_id]; + + eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration - init_prach_tables(839); + init_prach_tables(839); + } // node_function != NGFI_RRU_IF4 return (0); } diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c index 0db51e8b17..d13b624cfd 100644 --- a/openair1/PHY/INIT/lte_param_init.c +++ b/openair1/PHY/INIT/lte_param_init.c @@ -25,7 +25,7 @@ void lte_param_init(unsigned char N_tx, uint32_t perfect_ce) { - LTE_DL_FRAME_PARMS *lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms; int i; @@ -39,64 +39,64 @@ void lte_param_init(unsigned char N_tx, randominit(0); set_taus_seed(0); - lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms); + frame_parms = &(PHY_vars_eNB->frame_parms); - lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz - lte_frame_parms->N_RB_UL = N_RB_DL; - lte_frame_parms->threequarter_fs = threequarter_fs; - lte_frame_parms->Ncp = extended_prefix_flag; - lte_frame_parms->Ncp_UL = extended_prefix_flag; - lte_frame_parms->Nid_cell = Nid_cell; - lte_frame_parms->nushift = Nid_cell%6; - lte_frame_parms->nb_antennas_tx = N_tx; - lte_frame_parms->nb_antennas_rx = N_rx; - lte_frame_parms->nb_antennas_tx_eNB = N_tx; - lte_frame_parms->phich_config_common.phich_resource = one; - lte_frame_parms->tdd_config = tdd_config; - lte_frame_parms->frame_type = frame_type; - // lte_frame_parms->Csrs = 2; - // lte_frame_parms->Bsrs = 0; - // lte_frame_parms->kTC = 0;44 - // lte_frame_parms->n_RRC = 0; - lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0; + frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz + frame_parms->N_RB_UL = N_RB_DL; + frame_parms->threequarter_fs = threequarter_fs; + frame_parms->Ncp = extended_prefix_flag; + frame_parms->Ncp_UL = extended_prefix_flag; + frame_parms->Nid_cell = Nid_cell; + frame_parms->nushift = Nid_cell%6; + frame_parms->nb_antennas_tx = N_tx; + frame_parms->nb_antennas_rx = N_rx; + frame_parms->nb_antennas_tx_eNB = N_tx; + frame_parms->phich_config_common.phich_resource = one; + frame_parms->tdd_config = tdd_config; + frame_parms->frame_type = frame_type; + // frame_parms->Csrs = 2; + // frame_parms->Bsrs = 0; + // frame_parms->kTC = 0;44 + // frame_parms->n_RRC = 0; + frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0; - init_frame_parms(lte_frame_parms,osf); + init_frame_parms(frame_parms,osf); - //copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing)); + //copy_lte_parms_to_phy_framing(frame_parms, &(PHY_config->PHY_framing)); - // phy_init_top(lte_frame_parms); //allocation + // phy_init_top(frame_parms); //allocation PHY_vars_UE->is_secondary_ue = 0; - PHY_vars_UE->lte_frame_parms = *lte_frame_parms; - PHY_vars_eNB->lte_frame_parms = *lte_frame_parms; + PHY_vars_UE->frame_parms = *frame_parms; + PHY_vars_eNB->frame_parms = *frame_parms; - phy_init_lte_top(lte_frame_parms); - dump_frame_parms(lte_frame_parms); + phy_init_lte_top(frame_parms); + dump_frame_parms(frame_parms); - PHY_vars_UE->PHY_measurements.n_adj_cells=0; - PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1; - PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2; + PHY_vars_UE->measurements.n_adj_cells=0; + PHY_vars_UE->measurements.adj_cell_id[0] = Nid_cell+1; + PHY_vars_UE->measurements.adj_cell_id[1] = Nid_cell+2; for (i=0; i<3; i++) - lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i); + lte_gold(frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i); phy_init_lte_ue(PHY_vars_UE,1,0); phy_init_lte_eNB(PHY_vars_eNB,0,0,0); - generate_pcfich_reg_mapping(&PHY_vars_UE->lte_frame_parms); - generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms); + generate_pcfich_reg_mapping(&PHY_vars_UE->frame_parms); + generate_phich_reg_mapping(&PHY_vars_UE->frame_parms); // DL power control init if (transmission_mode == 1) { PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 0; + ((PHY_vars_eNB->frame_parms).pdsch_config_common).p_b = 0; PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 0; + ((PHY_vars_UE->frame_parms).pdsch_config_common).p_b = 0; } else { // rho_a = rhob PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 1; + ((PHY_vars_eNB->frame_parms).pdsch_config_common).p_b = 1; PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 1; + ((PHY_vars_UE->frame_parms).pdsch_config_common).p_b = 1; } PHY_vars_UE->perfect_ce = perfect_ce; diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index af72bce967..48339de4cd 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -36,7 +36,7 @@ extern int card; #endif void -phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB_id) +phy_adjust_gain (PHY_VARS_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id) { #ifdef EXMIMO @@ -46,72 +46,72 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n", rx_power_fil_dB, - phy_vars_ue->PHY_measurements.rssi, - phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] + ue->measurements.rssi, + ue->measurements.rx_power_avg_dB[eNB_id] ); // Gain control with hysterisis - // Adjust gain in phy_vars_ue->rx_vars[0].rx_total_gain_dB + // Adjust gain in ue->rx_vars[0].rx_total_gain_dB - if (rx_power_fil_dB < TARGET_RX_POWER - 5) //&& (phy_vars_ue->rx_total_gain_dB < MAX_RF_GAIN) ) - phy_vars_ue->rx_total_gain_dB+=5; - else if (rx_power_fil_dB > TARGET_RX_POWER + 5) //&& (phy_vars_ue->rx_total_gain_dB > MIN_RF_GAIN) ) - phy_vars_ue->rx_total_gain_dB-=5; + if (rx_power_fil_dB < TARGET_RX_POWER - 5) //&& (ue->rx_total_gain_dB < MAX_RF_GAIN) ) + ue->rx_total_gain_dB+=5; + else if (rx_power_fil_dB > TARGET_RX_POWER + 5) //&& (ue->rx_total_gain_dB > MIN_RF_GAIN) ) + ue->rx_total_gain_dB-=5; - if (phy_vars_ue->rx_total_gain_dB>MAX_RF_GAIN) { + if (ue->rx_total_gain_dB>MAX_RF_GAIN) { /* if ((openair_daq_vars.rx_rf_mode==0) && (openair_daq_vars.mode == openair_NOT_SYNCHED)) { openair_daq_vars.rx_rf_mode=1; - phy_vars_ue->rx_total_gain_dB = max(MIN_RF_GAIN,MAX_RF_GAIN-25); + ue->rx_total_gain_dB = max(MIN_RF_GAIN,MAX_RF_GAIN-25); } else { */ - phy_vars_ue->rx_total_gain_dB = MAX_RF_GAIN; - } else if (phy_vars_ue->rx_total_gain_dBrx_total_gain_dB = MAX_RF_GAIN; + } else if (ue->rx_total_gain_dBrx_total_gain_dB = min(MAX_RF_GAIN,MIN_RF_GAIN+25); + ue->rx_total_gain_dB = min(MAX_RF_GAIN,MIN_RF_GAIN+25); } else { */ - phy_vars_ue->rx_total_gain_dB = MIN_RF_GAIN; + ue->rx_total_gain_dB = MIN_RF_GAIN; } - LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",phy_vars_ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); + LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); #ifdef EXMIMO - if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_max[0]) { - phy_vars_ue->rx_total_gain_dB = phy_vars_ue->rx_gain_max[0]; + if (ue->rx_total_gain_dB>ue->rx_gain_max[0]) { + ue->rx_total_gain_dB = ue->rx_gain_max[0]; - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) { + for (i=0; iframe_parms.nb_antennas_rx; i++) { p_exmimo_config->rf.rx_gain[i][0] = 30; } - } else if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_max[0]-30)) { + } else if (ue->rx_total_gain_dB<(ue->rx_gain_max[0]-30)) { // for the moment we stay in max gain mode - phy_vars_ue->rx_total_gain_dB = phy_vars_ue->rx_gain_max[0] - 30; + ue->rx_total_gain_dB = ue->rx_gain_max[0] - 30; - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) { + for (i=0; iframe_parms.nb_antennas_rx; i++) { p_exmimo_config->rf.rx_gain[i][0] = 0; } /* - phy_vars_ue->rx_gain_mode[0] = byp; - phy_vars_ue->rx_gain_mode[1] = byp; + ue->rx_gain_mode[0] = byp; + ue->rx_gain_mode[1] = byp; exmimo_pci_interface->rf.rf_mode0 = 22991; //bypass exmimo_pci_interface->rf.rf_mode1 = 22991; //bypass - if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_byp[0]-50)) { + if (ue->rx_total_gain_dB<(ue->rx_gain_byp[0]-50)) { exmimo_pci_interface->rf.rx_gain00 = 0; exmimo_pci_interface->rf.rx_gain10 = 0; } */ } else { - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) { - p_exmimo_config->rf.rx_gain[i][0] = 30 - phy_vars_ue->rx_gain_max[0] + phy_vars_ue->rx_total_gain_dB; + for (i=0; iframe_parms.nb_antennas_rx; i++) { + p_exmimo_config->rf.rx_gain[i][0] = 30 - ue->rx_gain_max[0] + ue->rx_total_gain_dB; } } @@ -119,28 +119,28 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB break; case med_gain: case byp_gain: - if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_byp[0]) { - phy_vars_ue->rx_gain_mode[0] = max_gain; - phy_vars_ue->rx_gain_mode[1] = max_gain; + if (ue->rx_total_gain_dB>ue->rx_gain_byp[0]) { + ue->rx_gain_mode[0] = max_gain; + ue->rx_gain_mode[1] = max_gain; exmimo_pci_interface->rf.rf_mode0 = 55759; //max gain exmimo_pci_interface->rf.rf_mode1 = 55759; //max gain - if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_max[0]) { + if (ue->rx_total_gain_dB>ue->rx_gain_max[0]) { exmimo_pci_interface->rf.rx_gain00 = 50; exmimo_pci_interface->rf.rx_gain10 = 50; } else { - exmimo_pci_interface->rf.rx_gain00 = 50 - phy_vars_ue->rx_gain_max[0] + phy_vars_ue->rx_total_gain_dB; - exmimo_pci_interface->rf.rx_gain10 = 50 - phy_vars_ue->rx_gain_max[1] + phy_vars_ue->rx_total_gain_dB; + exmimo_pci_interface->rf.rx_gain00 = 50 - ue->rx_gain_max[0] + ue->rx_total_gain_dB; + exmimo_pci_interface->rf.rx_gain10 = 50 - ue->rx_gain_max[1] + ue->rx_total_gain_dB; } } - else if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_byp[0]-50)) { + else if (ue->rx_total_gain_dB<(ue->rx_gain_byp[0]-50)) { exmimo_pci_interface->rf.rx_gain00 = 0; exmimo_pci_interface->rf.rx_gain10 = 0; } else { - exmimo_pci_interface->rf.rx_gain00 = 50 - phy_vars_ue->rx_gain_byp[0] + phy_vars_ue->rx_total_gain_dB; - exmimo_pci_interface->rf.rx_gain10 = 50 - phy_vars_ue->rx_gain_byp[1] + phy_vars_ue->rx_total_gain_dB; + exmimo_pci_interface->rf.rx_gain00 = 50 - ue->rx_gain_byp[0] + ue->rx_total_gain_dB; + exmimo_pci_interface->rf.rx_gain10 = 50 - ue->rx_gain_byp[1] + ue->rx_total_gain_dB; } break; default: @@ -152,9 +152,9 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB #endif #ifdef DEBUG_PHY - /* if ((phy_vars_ue->frame%100==0) || (phy_vars_ue->frame < 10)) + /* if ((ue->frame%100==0) || (ue->frame < 10)) msg("[PHY][ADJUST_GAIN] frame %d, rx_power = %d, rx_power_fil = %d, rx_power_fil_dB = %d, coef=%d, ncoef=%d, rx_total_gain_dB = %d (%d,%d,%d)\n", - phy_vars_ue->frame,rx_power,rx_power_fil,rx_power_fil_dB,coef,ncoef,phy_vars_ue->rx_total_gain_dB, + ue->frame,rx_power,rx_power_fil,rx_power_fil_dB,coef,ncoef,ue->rx_total_gain_dB, TARGET_RX_POWER,MAX_RF_GAIN,MIN_RF_GAIN); */ #endif //DEBUG_PHY diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 059119c605..7467dd38a5 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -37,7 +37,7 @@ // last channel estimate of the receiver void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, - PHY_VARS_UE *phy_vars_ue, + PHY_VARS_UE *ue, unsigned char eNB_id, unsigned char clear, short coef) @@ -51,7 +51,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, ncoef = 32767 - coef; #ifdef DEBUG_PHY - LOG_D(PHY,"frame %d, slot %d: rx_offset (before) = %d\n",phy_vars_ue->frame_rx,phy_vars_ue->slot_rx,phy_vars_ue->rx_offset); + LOG_D(PHY,"frame %d, slot %d: rx_offset (before) = %d\n",ue->frame_rx,ue->slot_rx,ue->rx_offset); #endif //DEBUG_PHY @@ -60,8 +60,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, temp = 0; for (aa=0; aanb_antennas_rx; aa++) { - Re = ((int16_t*)phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id][aa])[(i<<2)]; - Im = ((int16_t*)phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)]; + Re = ((int16_t*)ue->common_vars.dl_ch_estimates_time[eNB_id][aa])[(i<<2)]; + Im = ((int16_t*)ue->common_vars.dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)]; temp += (Re*Re/2) + (Im*Im/2); } @@ -81,21 +81,21 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, diff = max_pos_fil - frame_parms->nb_prefix_samples/8; if ( diff > SYNCH_HYST ) - phy_vars_ue->rx_offset++; + ue->rx_offset++; else if (diff < -SYNCH_HYST) - phy_vars_ue->rx_offset--; + ue->rx_offset--; - if ( phy_vars_ue->rx_offset < 0 ) - phy_vars_ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES; + if ( ue->rx_offset < 0 ) + ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES; - if ( phy_vars_ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES ) - phy_vars_ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES; + if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES ) + ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES; #ifdef DEBUG_PHY LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n", - phy_vars_ue->frame_rx,phy_vars_ue->rx_offset,max_pos,max_pos_fil,temp); + ue->frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp); #endif //DEBUG_PHY @@ -103,7 +103,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, - LTE_eNB_SRS *lte_eNb_srs, + LTE_eNB_SRS *lte_eNB_srs, unsigned int *eNB_id, unsigned char clear, unsigned char number_of_cards, @@ -133,23 +133,23 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, // do ifft of channel estimate switch(frame_parms->N_RB_DL) { case 6: - dft128((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0], - (int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa], + dft128((int16_t*) <e_eNB_srs->srs_ch_estimates[ind][aa][0], + (int16_t*) lte_eNB_srs->srs_ch_estimates_time[ind][aa], 1); break; case 25: - dft512((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0], - (int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa], + dft512((int16_t*) <e_eNB_srs->srs_ch_estimates[ind][aa][0], + (int16_t*) lte_eNB_srs->srs_ch_estimates_time[ind][aa], 1); break; case 50: - dft1024((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0], - (int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa], + dft1024((int16_t*) <e_eNB_srs->srs_ch_estimates[ind][aa][0], + (int16_t*) lte_eNB_srs->srs_ch_estimates_time[ind][aa], 1); break; case 100: - dft2048((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0], - (int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa], + dft2048((int16_t*) <e_eNB_srs->srs_ch_estimates[ind][aa][0], + (int16_t*) lte_eNB_srs->srs_ch_estimates_time[ind][aa], 1); break; } @@ -157,7 +157,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, #ifdef DEBUG_PHY sprintf(fname,"srs_ch_estimates_time_%d%d.m",ind,aa); sprintf(vname,"srs_time_%d%d",ind,aa); - write_output(fname,vname,lte_eNb_srs->srs_ch_estimates_time[ind][aa],frame_parms->ofdm_symbol_size*2,2,1); + write_output(fname,vname,lte_eNB_srs->srs_ch_estimates_time[ind][aa],frame_parms->ofdm_symbol_size*2,2,1); #endif #endif } @@ -168,8 +168,8 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, temp = 0; for (aa=0; aanb_antennas_rx; aa++) { - Re = ((int16_t*)lte_eNb_srs->srs_ch_estimates_time[ind][aa])[(i<<1)]; - Im = ((int16_t*)lte_eNb_srs->srs_ch_estimates_time[ind][aa])[1+(i<<1)]; + Re = ((int16_t*)lte_eNB_srs->srs_ch_estimates_time[ind][aa])[(i<<1)]; + Im = ((int16_t*)lte_eNB_srs->srs_ch_estimates_time[ind][aa])[1+(i<<1)]; temp += (Re*Re/2) + (Im*Im/2); } @@ -195,7 +195,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, } -int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe) +int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id,uint8_t thread_id) { static int first_run=1; static int max_pos_fil2=0; @@ -203,8 +203,8 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_ short Re,Im,coef=24576; short ncoef = 32768 - coef; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + LTE_eNB_PUSCH *eNB_pusch_vars = eNB->pusch_vars[UE_id]; int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time[0]; uint8_t cyclic_shift = 0; int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size); @@ -236,7 +236,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_ max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15; #ifdef DEBUG_PHY - LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",phy_vars_eNB->proc[sched_subframe].frame_rx,max_pos,max_pos_fil2,sync_pos); + LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc[thread_id].frame_rx,max_pos,max_pos_fil2,sync_pos); #endif //DEBUG_PHY return(max_pos_fil2-sync_pos); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index bfbe94bb61..b8baec980a 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -34,7 +34,7 @@ #include "filt96_32.h" //#define DEBUG_CH -int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, +int lte_dl_channel_estimation(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, @@ -54,13 +54,13 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, // unsigned int n; // int i; - uint16_t Nid_cell = (eNB_offset == 0) ? phy_vars_ue->lte_frame_parms.Nid_cell : phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1]; + uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift,pilot1,pilot2,pilot3; - int **dl_ch_estimates=phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset]; - int **rxdataF=phy_vars_ue->lte_ue_common_vars.rxdataF; + int **dl_ch_estimates=ue->common_vars.dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.rxdataF; - if (phy_vars_ue->lte_frame_parms.Ncp == 0) { // normal prefix + if (ue->frame_parms.Ncp == 0) { // normal prefix pilot1 = 4; pilot2 = 7; pilot3 = 11; @@ -87,19 +87,19 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, } - //ch_offset = (l*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); - if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage - ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size ; + //ch_offset = (l*(ue->frame_parms.ofdm_symbol_size)); + if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage + ch_offset = ue->frame_parms.ofdm_symbol_size ; else - ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol; + ch_offset = ue->frame_parms.ofdm_symbol_size*symbol; - symbol_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol; + symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol; k = (nu + nushift)%6; #ifdef DEBUG_CH - printf("Channel Estimation : eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d\n",eNB_offset,Nid_cell,ch_offset,phy_vars_ue->lte_frame_parms.ofdm_symbol_size, - phy_vars_ue->lte_frame_parms.Ncp,l,Ns,k); + printf("Channel Estimation : eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d\n",eNB_offset,Nid_cell,ch_offset,ue->frame_parms.ofdm_symbol_size, + ue->frame_parms.Ncp,l,Ns,k); #endif switch (k) { @@ -182,7 +182,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, // generate pilot - lte_dl_cell_spec_rx(phy_vars_ue, + lte_dl_cell_spec_rx(ue, eNB_offset, &pilot[p][0], Ns, @@ -190,25 +190,25 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, p); - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { pil = (int16_t *)&pilot[p][0]; - rxF = (int16_t *)&rxdataF[aarx][((symbol_offset+k+phy_vars_ue->lte_frame_parms.first_carrier_offset))]; + rxF = (int16_t *)&rxdataF[aarx][((symbol_offset+k+ue->frame_parms.first_carrier_offset))]; dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset]; // if (eNb_id==0) - memset(dl_ch,0,4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); - if (phy_vars_ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha - multadd_complex_vector_real_scalar(dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1), - phy_vars_ue->ch_est_alpha,dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1), - 1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size)); + if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha + multadd_complex_vector_real_scalar(dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), + ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), + 1,ue->frame_parms.ofdm_symbol_size); #ifdef DEBUG_CH - printf("k %d, first_carrier %d\n",k,phy_vars_ue->lte_frame_parms.first_carrier_offset); + printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset); #endif - if ((phy_vars_ue->lte_frame_parms.N_RB_DL==6) || - (phy_vars_ue->lte_frame_parms.N_RB_DL==50) || - (phy_vars_ue->lte_frame_parms.N_RB_DL==100)) { + if ((ue->frame_parms.N_RB_DL==6) || + (ue->frame_parms.N_RB_DL==50) || + (ue->frame_parms.N_RB_DL==100)) { //First half of pilots // Treat first 2 pilots specially (left edge) @@ -238,7 +238,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, rxF+=12; dl_ch+=16; - for (pilot_cnt=2; pilot_cnt<((phy_vars_ue->lte_frame_parms.N_RB_DL)-1); pilot_cnt+=2) { + for (pilot_cnt=2; pilot_cnt<((ue->frame_parms.N_RB_DL)-1); pilot_cnt+=2) { @@ -285,7 +285,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, #ifdef DEBUG_CH printf("second half k %d\n",k); #endif - for (pilot_cnt=0; pilot_cnt<((phy_vars_ue->lte_frame_parms.N_RB_DL)-3); pilot_cnt+=2) { + for (pilot_cnt=0; pilot_cnt<((ue->frame_parms.N_RB_DL)-3); pilot_cnt+=2) { ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -342,7 +342,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, } - else if (phy_vars_ue->lte_frame_parms.N_RB_DL==25) { + else if (ue->frame_parms.N_RB_DL==25) { //printf("Channel estimation\n"); // Treat first 2 pilots specially (left edge) @@ -385,7 +385,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, for (pilot_cnt=2; pilot_cnt<24; pilot_cnt+=2) { // printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]); - // printf("rx[%d][%d] -> (%d,%d)\n",p,phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]); + // printf("rx[%d][%d] -> (%d,%d)\n",p,ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); @@ -466,7 +466,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, for (pilot_cnt=0; pilot_cnt<22; pilot_cnt+=2) { // printf("* pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]); - // printf("rx[%d][%d] -> (%d,%d)\n",p,phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]); + // printf("rx[%d][%d] -> (%d,%d)\n",p,ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); @@ -539,7 +539,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, dl_ch, 24); - } else if (phy_vars_ue->lte_frame_parms.N_RB_DL==15) { + } else if (ue->frame_parms.N_RB_DL==15) { //printf("First Half\n"); for (rb=0; rb<28; rb+=4) { @@ -547,7 +547,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, //printf("aarx=%d\n",aarx); //printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]); //printf("rx[%d][%d] -> (%d,%d)\n",p, - // phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p), + // ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p), // rxF[0], // rxF[1]); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -602,7 +602,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, //printf("aarx=%d\n",aarx); //printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]); //printf("rx[%d][%d] -> (%d,%d)\n",p, - // phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p), + // ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p), // rxF[0], // rxF[1]); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -629,78 +629,78 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, } } else { - msg("channel estimation not implemented for phy_vars_ue->lte_frame_parms.N_RB_DL = %d\n",phy_vars_ue->lte_frame_parms.N_RB_DL); + msg("channel estimation not implemented for ue->frame_parms.N_RB_DL = %d\n",ue->frame_parms.N_RB_DL); } - if (phy_vars_ue->perfect_ce == 0) { + if (ue->perfect_ce == 0) { // Temporal Interpolation // printf("ch_offset %d\n",ch_offset); dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset]; - if (phy_vars_ue->high_speed_flag == 0) { + if (ue->high_speed_flag == 0) { multadd_complex_vector_real_scalar(dl_ch, - 32767-phy_vars_ue->ch_est_alpha, - dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + 32767-ue->ch_est_alpha, + dl_ch-(ue->frame_parms.ofdm_symbol_size<<1),0,ue->frame_parms.ofdm_symbol_size); } else { // high_speed_flag == 1 if (symbol == 0) { - // printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp); - // dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + // printf("Interpolating %d->0\n",4-ue->frame_parms.Ncp); + // dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-ue->frame_parms.Ncp)*(ue->frame_parms.ofdm_symbol_size)]; + dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)]; - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); } // this is 1/3,2/3 combination for pilots spaced by 3 symbols else if (symbol == pilot1) { dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][0]; - if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) - multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + if (ue->frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) + multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); } else { - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)<<1),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); } // pilot spacing 3 symbols (1/3,2/3 combination) } else if (symbol == pilot2) { - dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(ue->frame_parms.ofdm_symbol_size)]; - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); } else { // symbol == pilot3 - // printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp); - dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + // printf("Interpolating 0->%d\n",4-ue->frame_parms.Ncp); + dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(ue->frame_parms.ofdm_symbol_size)]; - if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) - multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + if (ue->frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) + multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); } else { - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)<<1),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); } // pilot spacing 3 symbols (1/3,2/3 combination) } @@ -710,7 +710,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, void (*idft)(int16_t *,int16_t *, int); - switch (phy_vars_ue->lte_frame_parms.ofdm_symbol_size) { + switch (ue->frame_parms.ofdm_symbol_size) { case 128: idft = idft128; break; @@ -741,11 +741,11 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, } // do ifft of channel estimate - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) - for (p=0; plte_frame_parms.nb_antennas_tx_eNB; p++) { - if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx]) - idft((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) + for (p=0; pframe_parms.nb_antennas_tx_eNB; p++) { + if (ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx]) + idft((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8], + (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); } return(0); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c index f257678c2c..5d9074ea73 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c @@ -33,7 +33,7 @@ #include "PHY/defs.h" //#define DEBUG_CH -int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, +int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, int subframe, @@ -51,28 +51,16 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, // unsigned int n; // int i; - int **dl_ch_estimates=phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[0]; - int **rxdataF=phy_vars_ue->lte_ue_common_vars.rxdataF; + int **dl_ch_estimates=ue->common_vars.dl_ch_estimates[0]; + int **rxdataF=ue->common_vars.rxdataF; - ch_offset = (l*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); + ch_offset = (l*(ue->frame_parms.ofdm_symbol_size)); symbol_offset = ch_offset;//phy_vars_ue->lte_frame_parms.ofdm_symbol_size*l; - // printf("dl_mbsfn_channel_estimation.c: symbol %d (%d)\n",l,ch_offset); - // m=phy_vars_ue->lte_frame_parms.N_RB_DL*6; - /* - if ((l==2) || (l==10)) - k = 0;//m<<1; - else if (l==6) - k = 1;//+(m<<1); - else { - msg("lte_dl_mbsfn: l %d -> ERROR\n",l); - return(-1); - } - */ - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { // generate pilot if ((l==2)||(l==6)||(l==10)) { - lte_dl_mbsfn_rx(phy_vars_ue, + lte_dl_mbsfn_rx(ue, &pilot[0], subframe, l>>2); @@ -81,16 +69,16 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, pil = (short *)&pilot[0]; - rxF = (short *)&rxdataF[aarx][((symbol_offset+phy_vars_ue->lte_frame_parms.first_carrier_offset))]; + rxF = (short *)&rxdataF[aarx][((symbol_offset+ue->frame_parms.first_carrier_offset))]; ch = (short *)&dl_ch_estimates[aarx][ch_offset]; // if (eNb_id==0) - memset(ch,0,4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); + memset(ch,0,4*(ue->frame_parms.ofdm_symbol_size)); //*********************************************************************** - if ((phy_vars_ue->lte_frame_parms.N_RB_DL==6) || - (phy_vars_ue->lte_frame_parms.N_RB_DL==50) || - (phy_vars_ue->lte_frame_parms.N_RB_DL==100)) { + if ((ue->frame_parms.N_RB_DL==6) || + (ue->frame_parms.N_RB_DL==50) || + (ue->frame_parms.N_RB_DL==100)) { // Interpolation and extrapolation; if (l==6) { @@ -99,10 +87,10 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, rxF+=2; } - for (rb=0; rblte_frame_parms.N_RB_DL; rb++) { + for (rb=0; rbframe_parms.N_RB_DL; rb++) { // ------------------------1st pilot------------------------ - if (rb==(phy_vars_ue->lte_frame_parms.N_RB_DL>>1)) { + if (rb==(ue->frame_parms.N_RB_DL>>1)) { rxF = (short *)&rxdataF[aarx][symbol_offset+1]; if (l==6) @@ -117,7 +105,7 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, /* printf("rb %d: pil0 (%d,%d) x (%d,%d) = (%d,%d)\n", rb,pil[0],pil[1],rxF[0],rxF[1],ch[0],ch[1]);*/ - if ((rb>0)&&(rb!=(phy_vars_ue->lte_frame_parms.N_RB_DL>>1))) { + if ((rb>0)&&(rb!=(ue->frame_parms.N_RB_DL>>1))) { ch[-2] += ch[2]; ch[-1] += ch[3]; } else { @@ -165,8 +153,8 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, ch[20] = (short)(((int)pil[10]*rxF[20] - (int)pil[11]*rxF[21])>>15); ch[21] = (short)(((int)pil[10]*rxF[21] + (int)pil[11]*rxF[20])>>15); - if ((rb<(phy_vars_ue->lte_frame_parms.N_RB_DL-1))&& - (rb!=((phy_vars_ue->lte_frame_parms.N_RB_DL>>1)-1))) { + if ((rb<(ue->frame_parms.N_RB_DL-1))&& + (rb!=((ue->frame_parms.N_RB_DL>>1)-1))) { ch[22] = ch[20]>>1; ch[23] = ch[21]>>1; ch[18] += ch[22]; @@ -188,7 +176,7 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, } //********************************************************************* - else if (phy_vars_ue->lte_frame_parms.N_RB_DL==25) { + else if (ue->frame_parms.N_RB_DL==25) { //printf("Channel estimation\n"); //------------------------ loop over first 12 RBs------------------------ if (l==6) { @@ -712,72 +700,72 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, if (l==6) { ch = (short *)&dl_ch_estimates[aarx][ch_offset]; // printf("Interpolating ch 2,6 => %d\n",ch_offset); - ch_prev = (short *)&dl_ch_estimates[aarx][2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - ch0 = (short *)&dl_ch_estimates[aarx][0*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - memcpy(ch0,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + ch_prev = (short *)&dl_ch_estimates[aarx][2*(ue->frame_parms.ofdm_symbol_size)]; + ch0 = (short *)&dl_ch_estimates[aarx][0*(ue->frame_parms.ofdm_symbol_size)]; + memcpy(ch0,ch_prev,4*ue->frame_parms.ofdm_symbol_size); - ch1 = (short *)&dl_ch_estimates[aarx][1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - memcpy(ch1,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + ch1 = (short *)&dl_ch_estimates[aarx][1*(ue->frame_parms.ofdm_symbol_size)]; + memcpy(ch1,ch_prev,4*ue->frame_parms.ofdm_symbol_size); // 3/4 ch2 + 1/4 ch6 => ch3 - multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); // 1/2 ch2 + 1/2 ch6 => ch4 - multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); // 1/4 ch2 + 3/4 ch6 => ch5 - multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),0,ue->frame_parms.ofdm_symbol_size); } if (l==10) { ch = (short *)&dl_ch_estimates[aarx][ch_offset]; - ch_prev = (short *)&dl_ch_estimates[aarx][6*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + ch_prev = (short *)&dl_ch_estimates[aarx][6*(ue->frame_parms.ofdm_symbol_size)]; // 3/4 ch6 + 1/4 ch10 => ch7 - multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); // 1/2 ch6 + 1/2 ch10 => ch8 - multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); // 1/4 ch6 + 3/4 ch10 => ch9 - multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),0,ue->frame_parms.ofdm_symbol_size); // 5/4 ch10 - 1/4 ch6 => ch11 // Ch11 - ch_prev = (short *)&dl_ch_estimates[aarx][10*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - ch11 = (short *)&dl_ch_estimates[aarx][11*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - memcpy(ch11,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + ch_prev = (short *)&dl_ch_estimates[aarx][10*(ue->frame_parms.ofdm_symbol_size)]; + ch11 = (short *)&dl_ch_estimates[aarx][11*(ue->frame_parms.ofdm_symbol_size)]; + memcpy(ch11,ch_prev,4*ue->frame_parms.ofdm_symbol_size); } } // do ifft of channel estimate - for (aa=0; aalte_frame_parms.nb_antennas_rx*phy_vars_ue->lte_frame_parms.nb_antennas_tx; aa++) { - if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa]) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + for (aa=0; aaframe_parms.nb_antennas_rx*ue->frame_parms.nb_antennas_tx; aa++) { + if (ue->common_vars.dl_ch_estimates[eNB_offset][aa]) { + switch (ue->frame_parms.N_RB_DL) { case 6: - idft128((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft128((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; case 25: - idft512((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft512((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; case 50: - idft1024((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft1024((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; case 75: - idft1536((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft1536((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; case 100: - idft2048((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft2048((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa], 1); break; default: diff --git a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c index 8b5c1a1806..5750733edf 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c @@ -39,16 +39,16 @@ int32_t rx_power_avg_eNB[3][3]; -void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, +void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB, int subframe, unsigned char eNB_id, unsigned char clear) { - LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNB->PHY_measurements_eNB[eNB_id]; - uint32_t *rb_mask = phy_vars_eNB->rb_mask_ul; + LTE_eNB_COMMON *common_vars = &eNB->common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + PHY_MEASUREMENTS_eNB *measurements = &eNB->measurements[eNB_id]; + uint32_t *rb_mask = eNB->rb_mask_ul; uint32_t aarx /* ,rx_power_correction */; uint32_t rb; @@ -59,24 +59,24 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, // noise measurements // for the moment we measure the noise on the 7th OFDM symbol (in S subframe) - phy_measurements->n0_power_tot = 0; + measurements->n0_power_tot = 0; for (aarx=0; aarxnb_antennas_rx; aarx++) { if (clear == 1) - phy_measurements->n0_power[aarx]=0; + measurements->n0_power[aarx]=0; - phy_measurements->n0_power[aarx] = ((k1*signal_energy(&eNB_common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size], - frame_parms->ofdm_symbol_size)) + k2*phy_measurements->n0_power[aarx])>>10; - //phy_measurements->n0_power[aarx] = (phy_measurements->n0_power[aarx]) * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size); - phy_measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_measurements->n0_power[aarx]); - phy_measurements->n0_power_tot += phy_measurements->n0_power[aarx]; + measurements->n0_power[aarx] = ((k1*signal_energy(&common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size], + frame_parms->ofdm_symbol_size)) + k2*measurements->n0_power[aarx])>>10; + //measurements->n0_power[aarx] = (measurements->n0_power[aarx]) * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size); + measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(measurements->n0_power[aarx]); + measurements->n0_power_tot += measurements->n0_power[aarx]; } - phy_measurements->n0_power_tot_dB = (unsigned short) dB_fixed(phy_measurements->n0_power_tot); + measurements->n0_power_tot_dB = (unsigned short) dB_fixed(measurements->n0_power_tot); - phy_measurements->n0_power_tot_dBm = phy_measurements->n0_power_tot_dB - phy_vars_eNB->rx_total_gain_eNB_dB; - // printf("n0_power %d\n",phy_measurements->n0_power_tot_dB); + measurements->n0_power_tot_dBm = measurements->n0_power_tot_dB - eNB->rx_total_gain_dB; + // printf("n0_power %d\n",measurements->n0_power_tot_dB); for (rb=0; rbN_RB_UL; rb++) { @@ -88,7 +88,7 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, // select the 7th symbol in an uplink subframe offset = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size; offset += (7*frame_parms->ofdm_symbol_size); - ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][offset]; + ul_ch = &common_vars->rxdataF[eNB_id][aarx][offset]; len = 12; // just do first half of middle PRB for odd number of PRBs if (((frame_parms->N_RB_UL&1) == 1) && @@ -96,36 +96,36 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, len=6; } if (clear == 1) - phy_measurements->n0_subband_power[aarx][rb]=0; + measurements->n0_subband_power[aarx][rb]=0; AssertFatal(ul_ch, "RX signal buffer (freq) problem"); - phy_measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len); + measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len); //((k1*(signal_energy_nodc(ul_ch,len))) - // + (k2*phy_measurements->n0_subband_power[aarx][rb])); + // + (k2*measurements->n0_subband_power[aarx][rb])); - phy_measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(phy_measurements->n0_subband_power[aarx][rb]); - // printf("subframe %d (%d): eNb %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len), - // phy_measurements->n0_subband_power_dB[aarx][rb]); - n0_power_tot += phy_measurements->n0_subband_power[aarx][rb]; + measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]); + // printf("subframe %d (%d): eNB %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len), + // measurements->n0_subband_power_dB[aarx][rb]); + n0_power_tot += measurements->n0_subband_power[aarx][rb]; } - phy_measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot); - phy_measurements->n0_subband_power_tot_dBm[rb] = phy_measurements->n0_subband_power_tot_dB[rb] - phy_vars_eNB->rx_total_gain_eNB_dB - dB_fixed(frame_parms->N_RB_UL); + measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot); + measurements->n0_subband_power_tot_dBm[rb] = measurements->n0_subband_power_tot_dB[rb] - eNB->rx_total_gain_dB - dB_fixed(frame_parms->N_RB_UL); } } } -void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb, +void lte_eNB_srs_measurements(PHY_VARS_eNB *eNB, unsigned char eNB_id, unsigned char UE_id, unsigned char init_averaging) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNb->lte_frame_parms; - PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNb->PHY_measurements_eNB[eNB_id]; - LTE_eNB_SRS *eNB_srs_vars = &phy_vars_eNb->lte_eNB_srs_vars[UE_id]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + PHY_MEASUREMENTS_eNB *measurements = &eNB->measurements[eNB_id]; + LTE_eNB_SRS *srs_vars = &eNB->srs_vars[UE_id]; int32_t aarx,rx_power_correction; int32_t rx_power; @@ -151,39 +151,39 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb, for (aarx=0; aarxnb_antennas_rx; aarx++) { - phy_measurements->rx_spatial_power[UE_id][0][aarx] = - ((signal_energy_nodc(&eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset], + measurements->rx_spatial_power[UE_id][0][aarx] = + ((signal_energy_nodc(&srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset], (frame_parms->N_RB_DL*6)) + - signal_energy_nodc(&eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][1], + signal_energy_nodc(&srs_vars->srs_ch_estimates[eNB_id][aarx][1], (frame_parms->N_RB_DL*6)))*rx_power_correction) - - phy_measurements->n0_power[aarx]; + measurements->n0_power[aarx]; - phy_measurements->rx_spatial_power[UE_id][0][aarx]<<=1; // because of noise only in odd samples + measurements->rx_spatial_power[UE_id][0][aarx]<<=1; // because of noise only in odd samples - phy_measurements->rx_spatial_power_dB[UE_id][0][aarx] = (unsigned short) dB_fixed(phy_measurements->rx_spatial_power[UE_id][0][aarx]); + measurements->rx_spatial_power_dB[UE_id][0][aarx] = (unsigned short) dB_fixed(measurements->rx_spatial_power[UE_id][0][aarx]); - phy_measurements->wideband_cqi[UE_id][aarx] = phy_measurements->rx_spatial_power[UE_id][0][aarx]; + measurements->wideband_cqi[UE_id][aarx] = measurements->rx_spatial_power[UE_id][0][aarx]; - // phy_measurements->rx_power[UE_id][aarx]/=frame_parms->nb_antennas_tx; - phy_measurements->wideband_cqi_dB[UE_id][aarx] = (unsigned short) dB_fixed(phy_measurements->wideband_cqi[UE_id][aarx]); - rx_power += phy_measurements->wideband_cqi[UE_id][aarx]; - // phy_measurements->rx_avg_power_dB[UE_id] += phy_measurements->rx_power_dB[UE_id][aarx]; + // measurements->rx_power[UE_id][aarx]/=frame_parms->nb_antennas_tx; + measurements->wideband_cqi_dB[UE_id][aarx] = (unsigned short) dB_fixed(measurements->wideband_cqi[UE_id][aarx]); + rx_power += measurements->wideband_cqi[UE_id][aarx]; + // measurements->rx_avg_power_dB[UE_id] += measurements->rx_power_dB[UE_id][aarx]; } - // phy_measurements->rx_avg_power_dB[UE_id]/=frame_parms->nb_antennas_rx; + // measurements->rx_avg_power_dB[UE_id]/=frame_parms->nb_antennas_rx; if (init_averaging == 0) rx_power_avg_eNB[UE_id][eNB_id] = ((k1*rx_power_avg_eNB[UE_id][eNB_id]) + (k2*rx_power))>>10; else rx_power_avg_eNB[UE_id][eNB_id] = rx_power; - phy_measurements->wideband_cqi_tot[UE_id] = dB_fixed2(rx_power,2*phy_measurements->n0_power_tot); + measurements->wideband_cqi_tot[UE_id] = dB_fixed2(rx_power,2*measurements->n0_power_tot); // times 2 since we have noise only in the odd carriers of the srs comb - phy_measurements->rx_rssi_dBm[UE_id] = (int32_t)dB_fixed(rx_power_avg_eNB[UE_id][eNB_id])-phy_vars_eNb->rx_total_gain_eNB_dB; + measurements->rx_rssi_dBm[UE_id] = (int32_t)dB_fixed(rx_power_avg_eNB[UE_id][eNB_id])-eNB->rx_total_gain_dB; @@ -193,52 +193,52 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb, for (rb=0; rbN_RB_DL; rb++) { - // printf("eNB_common_vars->srs_ch_estimates[0] => %x\n",eNB_common_vars->srs_ch_estimates[0]); + // printf("common_vars->srs_ch_estimates[0] => %x\n",common_vars->srs_ch_estimates[0]); if (rb < 12) - ul_ch = &eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset + (rb*12)]; + ul_ch = &srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset + (rb*12)]; else if (rb>12) - ul_ch = &eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][6 + (rb-13)*12]; + ul_ch = &srs_vars->srs_ch_estimates[eNB_id][aarx][6 + (rb-13)*12]; else { - phy_measurements->subband_cqi_dB[UE_id][aarx][rb] = 0; + measurements->subband_cqi_dB[UE_id][aarx][rb] = 0; continue; } // cqi if (aarx==0) - phy_measurements->subband_cqi_tot[UE_id][rb]=0; + measurements->subband_cqi_tot[UE_id][rb]=0; - phy_measurements->subband_cqi[UE_id][aarx][rb] = (signal_energy_nodc(ul_ch,12))*rx_power_correction - phy_measurements->n0_power[aarx]; + measurements->subband_cqi[UE_id][aarx][rb] = (signal_energy_nodc(ul_ch,12))*rx_power_correction - measurements->n0_power[aarx]; - if (phy_measurements->subband_cqi[UE_id][aarx][rb] < 0) - phy_measurements->subband_cqi[UE_id][aarx][rb]=0; + if (measurements->subband_cqi[UE_id][aarx][rb] < 0) + measurements->subband_cqi[UE_id][aarx][rb]=0; - phy_measurements->subband_cqi_tot[UE_id][rb] += phy_measurements->subband_cqi[UE_id][aarx][rb]; - phy_measurements->subband_cqi_dB[UE_id][aarx][rb] = dB_fixed2(phy_measurements->subband_cqi[UE_id][aarx][rb], - 2*phy_measurements->n0_power[aarx]); + measurements->subband_cqi_tot[UE_id][rb] += measurements->subband_cqi[UE_id][aarx][rb]; + measurements->subband_cqi_dB[UE_id][aarx][rb] = dB_fixed2(measurements->subband_cqi[UE_id][aarx][rb], + 2*measurements->n0_power[aarx]); // 2*n0_power since we have noise from the odd carriers in the comb of the srs - // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,rb,phy_measurements->subband_cqi[eNB_id][aarx][rb],phy_measurements->subband_cqi_dB[eNB_id][aarx][rb]); + // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,rb,measurements->subband_cqi[eNB_id][aarx][rb],measurements->subband_cqi_dB[eNB_id][aarx][rb]); } } for (rb=0; rbN_RB_DL; rb++) { - phy_measurements->subband_cqi_tot_dB[UE_id][rb] = dB_fixed2(phy_measurements->subband_cqi_tot[UE_id][rb], - phy_measurements->n0_power_tot); + measurements->subband_cqi_tot_dB[UE_id][rb] = dB_fixed2(measurements->subband_cqi_tot[UE_id][rb], + measurements->n0_power_tot); /* - if (phy_measurements->subband_cqi_tot_dB[UE_id][rb] == 65) - msg("eNB meas error *****subband_cqi_tot[%d][%d] %d => %d dB (n0 %d)\n",UE_id,rb,phy_measurements->subband_cqi_tot[UE_id][rb],phy_measurements->subband_cqi_tot_dB[UE_id][rb],phy_measurements->n0_power_tot); + if (measurements->subband_cqi_tot_dB[UE_id][rb] == 65) + msg("eNB meas error *****subband_cqi_tot[%d][%d] %d => %d dB (n0 %d)\n",UE_id,rb,measurements->subband_cqi_tot[UE_id][rb],measurements->subband_cqi_tot_dB[UE_id][rb],measurements->n0_power_tot); */ } } -void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *phy_vars_eNb, +void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *eNB, uint8_t sect_id) { - LOG_D(PHY,"EMUL lte_eNB_IO_measurements_emul: eNB %d, sect %d\n",phy_vars_eNb->Mod_id,sect_id); + LOG_D(PHY,"EMUL lte_eNB_IO_measurements_emul: eNB %d, sect %d\n",eNB->Mod_id,sect_id); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c index 74b46c5eb6..f3c9b973ea 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c @@ -82,7 +82,7 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq) //compute frequency-domain representation of 6144-sample chunk - rxp = &ue->lte_ue_common_vars.rxdata[0][i]; + rxp = &ue->common_vars.rxdata[0][i]; sp=spectrum; while (1) { @@ -341,8 +341,8 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq) } // loop on pss index } - if (rxp == &ue->lte_ue_common_vars.rxdata[0][i+38400*4]) { - rxp = &ue->lte_ue_common_vars.rxdata[0][i+38400*4]; + if (rxp == &ue->common_vars.rxdata[0][i+38400*4]) { + rxp = &ue->common_vars.rxdata[0][i+38400*4]; sp=spectrum_p5ms; } else { break; diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 3bc26ad7e8..ae484092b8 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -66,36 +66,36 @@ void print_ints(char *s,int *x) int16_t get_PL(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; /* int RSoffset; - if (phy_vars_ue->lte_frame_parms.mode1_flag == 1) + if (ue->frame_parms.mode1_flag == 1) RSoffset = 6; else RSoffset = 3; */ - LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", phy_vars_ue->frame_rx, - (1.0*dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_index])-(10.0*phy_vars_ue->rx_total_gain_dB))/10.0, - 10*log10((double)phy_vars_ue->PHY_measurements.rsrp[eNB_index]), - phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower); + LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", ue->frame_rx, + (1.0*dB_fixed_times10(ue->measurements.rsrp[eNB_index])-(10.0*ue->rx_total_gain_dB))/10.0, + 10*log10((double)ue->measurements.rsrp[eNB_index]), + ue->frame_parms.pdsch_config_common.referenceSignalPower); - return((int16_t)(((10*phy_vars_ue->rx_total_gain_dB) - - dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_index])+ - // dB_fixed_times10(RSoffset*12*PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL) + - (phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower*10))/10)); + return((int16_t)(((10*ue->rx_total_gain_dB) - + dB_fixed_times10(ue->measurements.rsrp[eNB_index])+ + // dB_fixed_times10(RSoffset*12*ue_g[Mod_id][CC_id]->frame_parms.N_RB_DL) + + (ue->frame_parms.pdsch_config_common.referenceSignalPower*10))/10)); } uint8_t get_n_adj_cells (uint8_t Mod_id,uint8_t CC_id) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->PHY_measurements.n_adj_cells; + if (ue) + return ue->measurements.n_adj_cells; else return 0; } @@ -103,30 +103,30 @@ uint8_t get_n_adj_cells (uint8_t Mod_id,uint8_t CC_id) uint32_t get_rx_total_gain_dB (uint8_t Mod_id,uint8_t CC_id) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->rx_total_gain_dB; + if (ue) + return ue->rx_total_gain_dB; return 0xFFFFFFFF; } uint32_t get_RSSI (uint8_t Mod_id,uint8_t CC_id) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->PHY_measurements.rssi; + if (ue) + return ue->measurements.rssi; return 0xFFFFFFFF; } uint32_t get_RSRP(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->PHY_measurements.rsrp[eNB_index]; + if (ue) + return ue->measurements.rsrp[eNB_index]; return 0xFFFFFFFF; } @@ -134,10 +134,10 @@ uint32_t get_RSRP(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) uint32_t get_RSRQ(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->PHY_measurements.rsrq[eNB_index]; + if (ue) + return ue->measurements.rsrq[eNB_index]; return 0xFFFFFFFF; } @@ -145,10 +145,10 @@ uint32_t get_RSRQ(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) int8_t set_RSRP_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rsrp) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) { - phy_vars_ue->PHY_measurements.rsrp_filtered[eNB_index]=rsrp; + if (ue) { + ue->measurements.rsrp_filtered[eNB_index]=rsrp; return 0; } @@ -159,10 +159,10 @@ int8_t set_RSRP_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rsrq) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) { - phy_vars_ue->PHY_measurements.rsrq_filtered[eNB_index]=rsrq; + if (ue) { + ue->measurements.rsrq_filtered[eNB_index]=rsrq; return 0; } @@ -171,7 +171,7 @@ int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs } -void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, +void ue_rrc_measurements(PHY_VARS_UE *ue, uint8_t slot, uint8_t abstraction_flag) { @@ -179,95 +179,95 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, int aarx,rb; int16_t *rxF,*rxF_pss,*rxF_sss; - uint16_t Nid_cell = phy_vars_ue->lte_frame_parms.Nid_cell; + uint16_t Nid_cell = ue->frame_parms.Nid_cell; uint8_t eNB_offset,nu,l,nushift,k; uint16_t off; - for (eNB_offset = 0; eNB_offset<1+phy_vars_ue->PHY_measurements.n_adj_cells; eNB_offset++) { + for (eNB_offset = 0; eNB_offset<1+ue->measurements.n_adj_cells; eNB_offset++) { if (eNB_offset==0) { - phy_vars_ue->PHY_measurements.rssi = 0; - phy_vars_ue->PHY_measurements.n0_power_tot = 0; + ue->measurements.rssi = 0; + ue->measurements.n0_power_tot = 0; if (abstraction_flag == 0) { - if ((phy_vars_ue->lte_frame_parms.frame_type == FDD) && + if ((ue->frame_parms.frame_type == FDD) && ((slot == 0) || (slot == 10))) { // FDD PSS/SSS, compute noise in DTX REs - if (phy_vars_ue->lte_frame_parms.Ncp==NORMAL) { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + if (ue->frame_parms.Ncp==NORMAL) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { - rxF_sss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(5*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(6*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)]; //-ve spectrum from SSS // printf("slot %d: SSS DTX: %d,%d, non-DTX %d,%d\n",slot,rxF_pss[-72],rxF_pss[-71],rxF_pss[-36],rxF_pss[-35]); - // phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); - // printf("sssn36 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); - phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); - // printf("sssm32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); + // ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); + // printf("sssn36 %d\n",ue->measurements.n0_power[aarx]); + ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); + // printf("sssm32 %d\n",ue->measurements.n0_power[aarx]); //+ve spectrum from SSS - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63])); - // printf("sssp32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63])); + // printf("sssp32 %d\n",ue->measurements.n0_power[aarx]); //+ve spectrum from PSS - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63])); - // printf("pss32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); //-ve spectrum from PSS - rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(7*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); - // printf("pssm36 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); - // printf("pssm32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); - phy_vars_ue->PHY_measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power[aarx]/12); - phy_vars_ue->PHY_measurements.n0_power_tot += phy_vars_ue->PHY_measurements.n0_power[aarx]; + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63])); + // printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS + rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)]; + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); + // printf("pssm36 %d\n",ue->measurements.n0_power[aarx]); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); + // printf("pssm32 %d\n",ue->measurements.n0_power[aarx]); + ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/12); + ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx]; } - phy_vars_ue->PHY_measurements.n0_power_tot_dB = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power_tot/(12*aarx)); - phy_vars_ue->PHY_measurements.n0_power_tot_dBm = phy_vars_ue->PHY_measurements.n0_power_tot_dB - phy_vars_ue->rx_total_gain_dB - dB_fixed(phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(12*aarx)); + ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size); } } - else if ((phy_vars_ue->lte_frame_parms.frame_type == TDD) && + else if ((ue->frame_parms.frame_type == TDD) && (slot == 1)) { // TDD SSS, compute noise in DTX REs - if (phy_vars_ue->lte_frame_parms.Ncp==NORMAL) { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + if (ue->frame_parms.Ncp==NORMAL) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { - rxF_sss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(6*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)]; // note this is a dummy pointer, the pss is not really there! // in FDD the pss is in the symbol after the sss, but not in TDD - rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(7*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)]; //-ve spectrum from SSS - // phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); - phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); + // ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); + ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); //+ve spectrum from SSS - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+72]*rxF_sss[2+72])+((int32_t)rxF_sss[2+71]*rxF_sss[2+71])); - phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+72]*rxF_sss[2+72])+((int32_t)rxF_sss[2+71]*rxF_sss[2+71])); + ue->measurements.n0_power[aarx] = (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63])); - phy_vars_ue->PHY_measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power[aarx]/(6)); - phy_vars_ue->PHY_measurements.n0_power_tot += phy_vars_ue->PHY_measurements.n0_power[aarx]; + ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/(6)); + ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx]; } - phy_vars_ue->PHY_measurements.n0_power_tot_dB = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power_tot/(6*aarx)); - phy_vars_ue->PHY_measurements.n0_power_tot_dBm = phy_vars_ue->PHY_measurements.n0_power_tot_dB - phy_vars_ue->rx_total_gain_dB - dB_fixed(phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(6*aarx)); + ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size); } @@ -275,58 +275,58 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, } } // recompute nushift with eNB_offset corresponding to adjacent eNB on which to perform channel estimation - // printf("[PHY][UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, Nid2 %d, nushift %d, eNB_offset %d)\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,slot,Nid_cell,Nid2,nushift,eNB_offset); + // printf("[PHY][UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, Nid2 %d, nushift %d, eNB_offset %d)\n",ue->Mod_id,ue->frame,slot,Nid_cell,Nid2,nushift,eNB_offset); if (eNB_offset > 0) - Nid_cell = phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1]; + Nid_cell = ue->measurements.adj_cell_id[eNB_offset-1]; nushift = Nid_cell%6; - phy_vars_ue->PHY_measurements.rsrp[eNB_offset] = 0; + ue->measurements.rsrp[eNB_offset] = 0; if (abstraction_flag == 0) { // compute RSRP using symbols 0 and 4-frame_parms->Ncp - for (l=0,nu=0; l<=(4-phy_vars_ue->lte_frame_parms.Ncp); l+=(4-phy_vars_ue->lte_frame_parms.Ncp),nu=3) { + for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) { k = (nu + nushift)%6; #ifdef DEBUG_MEAS - LOG_I(PHY,"[UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,slot,Nid_cell,nushift, + LOG_I(PHY,"[UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->frame_rx,slot,Nid_cell,nushift, eNB_offset,k,l); #endif - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { - rxF = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(l*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - off = (phy_vars_ue->lte_frame_parms.first_carrier_offset+k)<<1; + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + rxF = (int16_t *)&ue->common_vars.rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)]; + off = (ue->frame_parms.first_carrier_offset+k)<<1; - if (l==(4-phy_vars_ue->lte_frame_parms.Ncp)) { - for (rb=0; rblte_frame_parms.N_RB_DL; rb++) { + if (l==(4-ue->frame_parms.Ncp)) { + for (rb=0; rbframe_parms.N_RB_DL; rb++) { // printf("rb %d, off %d, off2 %d\n",rb,off,off2); - phy_vars_ue->PHY_measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])); + ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])); // printf("rb %d, off %d : %d\n",rb,off,((((int32_t)rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]))); - // if ((phy_vars_ue->frame_rx&0x3ff) == 0) + // if ((ue->frame_rx&0x3ff) == 0) // printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1]))); off+=12; - if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1)) + if (off>=(ue->frame_parms.ofdm_symbol_size<<1)) off = (1+k)<<1; - phy_vars_ue->PHY_measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])); + ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])); // printf("rb %d, off %d : %d\n",rb,off,(((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]))); /* - if ((phy_vars_ue->frame_rx&0x3ff) == 0) + if ((ue->frame_rx&0x3ff) == 0) printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1]))); */ off+=12; - if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1)) + if (off>=(ue->frame_parms.ofdm_symbol_size<<1)) off = (1+k)<<1; } @@ -334,40 +334,40 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, /* if ((eNB_offset==0)&&(l==0)) { for (i=0;i<6;i++,off2+=4) - phy_vars_ue->PHY_measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1])); - if (off2==(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<2)) + ue->measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1])); + if (off2==(ue->frame_parms.ofdm_symbol_size<<2)) off2=4; for (i=0;i<6;i++,off2+=4) - phy_vars_ue->PHY_measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1])); + ue->measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1])); } */ - // printf("slot %d, rb %d => rsrp %d, rssi %d\n",slot,rb,phy_vars_ue->PHY_measurements.rsrp[eNB_offset],phy_vars_ue->PHY_measurements.rssi); + // printf("slot %d, rb %d => rsrp %d, rssi %d\n",slot,rb,ue->measurements.rsrp[eNB_offset],ue->measurements.rssi); } } } // 2 RE per PRB - // phy_vars_ue->PHY_measurements.rsrp[eNB_offset]/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL); - phy_vars_ue->PHY_measurements.rsrp[eNB_offset]/=(2*phy_vars_ue->lte_frame_parms.N_RB_DL*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - // LOG_I(PHY,"eNB: %d, RSRP: %d \n",eNB_offset,phy_vars_ue->PHY_measurements.rsrp[eNB_offset]); + // ue->measurements.rsrp[eNB_offset]/=(24*ue->frame_parms.N_RB_DL); + ue->measurements.rsrp[eNB_offset]/=(2*ue->frame_parms.N_RB_DL*ue->frame_parms.ofdm_symbol_size); + // LOG_I(PHY,"eNB: %d, RSRP: %d \n",eNB_offset,ue->measurements.rsrp[eNB_offset]); if (eNB_offset == 0) { - // phy_vars_ue->PHY_measurements.rssi/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL); - // phy_vars_ue->PHY_measurements.rssi*=rx_power_correction; - // phy_vars_ue->PHY_measurements.rssi=phy_vars_ue->PHY_measurements.rsrp[0]*24/2; - phy_vars_ue->PHY_measurements.rssi=phy_vars_ue->PHY_measurements.rsrp[0]*(12*phy_vars_ue->lte_frame_parms.N_RB_DL); + // ue->measurements.rssi/=(24*ue->frame_parms.N_RB_DL); + // ue->measurements.rssi*=rx_power_correction; + // ue->measurements.rssi=ue->measurements.rsrp[0]*24/2; + ue->measurements.rssi=ue->measurements.rsrp[0]*(12*ue->frame_parms.N_RB_DL); } - if (phy_vars_ue->PHY_measurements.rssi>0) - phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = 100*phy_vars_ue->PHY_measurements.rsrp[eNB_offset]*phy_vars_ue->lte_frame_parms.N_RB_DL/phy_vars_ue->PHY_measurements.rssi; + if (ue->measurements.rssi>0) + ue->measurements.rsrq[eNB_offset] = 100*ue->measurements.rsrp[eNB_offset]*ue->frame_parms.N_RB_DL/ue->measurements.rssi; else - phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = -12000; + ue->measurements.rsrq[eNB_offset] = -12000; - //((200*phy_vars_ue->PHY_measurements.rsrq[eNB_offset]) + ((1024-200)*100*phy_vars_ue->PHY_measurements.rsrp[eNB_offset]*phy_vars_ue->lte_frame_parms.N_RB_DL/phy_vars_ue->PHY_measurements.rssi))>>10; + //((200*ue->measurements.rsrq[eNB_offset]) + ((1024-200)*100*ue->measurements.rsrp[eNB_offset]*ue->frame_parms.N_RB_DL/ue->measurements.rssi))>>10; } else { // Do abstraction of RSRP and RSRQ - phy_vars_ue->PHY_measurements.rssi = phy_vars_ue->PHY_measurements.rx_power_avg[0]; + ue->measurements.rssi = ue->measurements.rx_power_avg[0]; // dummay value for the moment - phy_vars_ue->PHY_measurements.rsrp[eNB_offset] = -93 ; - phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = 3; + ue->measurements.rsrp[eNB_offset] = -93 ; + ue->measurements.rsrq[eNB_offset] = 3; } @@ -376,24 +376,24 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, // if (slot == 0) { if (eNB_offset == 0) - LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx,slot,10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB, - 10*log10(phy_vars_ue->PHY_measurements.rssi), - phy_vars_ue->rx_total_gain_dB, - phy_vars_ue->PHY_measurements.n0_power_tot_dBm); + LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id, + ue->frame_rx,slot,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rssi), + ue->rx_total_gain_dB, + ue->measurements.n0_power_tot_dBm); LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx,slot,eNB_offset, - (eNB_offset>0) ? phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1] : phy_vars_ue->lte_frame_parms.Nid_cell, - 10*log10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])-phy_vars_ue->rx_total_gain_dB, - phy_vars_ue->PHY_measurements.rsrp[eNB_offset], - (10*log10(phy_vars_ue->PHY_measurements.rsrq[eNB_offset]))); - //LOG_D(PHY,"RSRP_total_dB: %3.2f \n",(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0)-phy_vars_ue->rx_total_gain_dB-dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12)); + ue->Mod_id, + ue->frame_rx,slot,eNB_offset, + (eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell, + 10*log10(ue->measurements.rsrp[eNB_offset])-ue->rx_total_gain_dB, + ue->measurements.rsrp[eNB_offset], + (10*log10(ue->measurements.rsrq[eNB_offset]))); + //LOG_D(PHY,"RSRP_total_dB: %3.2f \n",(dB_fixed_times10(ue->measurements.rsrp[eNB_offset])/10.0)-ue->rx_total_gain_dB-dB_fixed(ue->frame_parms.N_RB_DL*12)); - //LOG_D(PHY,"RSRP_dB: %3.2f \n",(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0)); - //LOG_D(PHY,"gain_loss_dB: %d \n",phy_vars_ue->rx_total_gain_dB); - //LOG_D(PHY,"gain_fixed_dB: %d \n",dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12)); + //LOG_D(PHY,"RSRP_dB: %3.2f \n",(dB_fixed_times10(ue->measurements.rsrp[eNB_offset])/10.0)); + //LOG_D(PHY,"gain_loss_dB: %d \n",ue->rx_total_gain_dB); + //LOG_D(PHY,"gain_fixed_dB: %d \n",dB_fixed(ue->frame_parms.N_RB_DL*12)); // } @@ -402,7 +402,7 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, } -void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, +void lte_ue_measurements(PHY_VARS_UE *ue, unsigned int subframe_offset, unsigned char N0_symbol, unsigned char abstraction_flag) @@ -419,7 +419,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, int16x8_t *dl_ch0_128, *dl_ch1_128; #endif int *dl_ch0,*dl_ch1; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; int nb_subbands,subband_size,last_subband_size; int N_RB_DL = frame_parms->N_RB_DL; @@ -451,121 +451,121 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, } // signal measurements - for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) { + for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { - phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx] = - (signal_energy_nodc(&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0], + ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = + (signal_energy_nodc(&ue->common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0], (N_RB_DL*12))); - //- phy_vars_ue->PHY_measurements.n0_power[aarx]; + //- ue->measurements.n0_power[aarx]; - if (phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]<0) - phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //phy_vars_ue->PHY_measurements.n0_power[aarx]; + if (ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]<0) + ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //ue->measurements.n0_power[aarx]; - phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]); + ue->measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]); if (aatx==0) - phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx] = phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]; + ue->measurements.rx_power[eNB_id][aarx] = ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]; else - phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx] += phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]; + ue->measurements.rx_power[eNB_id][aarx] += ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]; } //aatx - phy_vars_ue->PHY_measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx]); + ue->measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[eNB_id][aarx]); if (aarx==0) - phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id] = phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx]; + ue->measurements.rx_power_tot[eNB_id] = ue->measurements.rx_power[eNB_id][aarx]; else - phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id] += phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx]; + ue->measurements.rx_power_tot[eNB_id] += ue->measurements.rx_power[eNB_id][aarx]; } //aarx - phy_vars_ue->PHY_measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id]); + ue->measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[eNB_id]); } //eNB_id // filter to remove jitter - if (phy_vars_ue->init_averaging == 0) { - for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) - phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id] = (int) - (((k1*((long long int)(phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id]))) + - (k2*((long long int)(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id]))))>>10); + if (ue->init_averaging == 0) { + for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) + ue->measurements.rx_power_avg[eNB_id] = (int) + (((k1*((long long int)(ue->measurements.rx_power_avg[eNB_id]))) + + (k2*((long long int)(ue->measurements.rx_power_tot[eNB_id]))))>>10); - phy_vars_ue->PHY_measurements.n0_power_avg = (int) - (((k1*((long long int) (phy_vars_ue->PHY_measurements.n0_power_avg))) + - (k2*((long long int) (phy_vars_ue->PHY_measurements.n0_power_tot))))>>10); + ue->measurements.n0_power_avg = (int) + (((k1*((long long int) (ue->measurements.n0_power_avg))) + + (k2*((long long int) (ue->measurements.n0_power_tot))))>>10); } else { - for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) - phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id] = phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id]; + for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) + ue->measurements.rx_power_avg[eNB_id] = ue->measurements.rx_power_tot[eNB_id]; - phy_vars_ue->PHY_measurements.n0_power_avg = phy_vars_ue->PHY_measurements.n0_power_tot; - phy_vars_ue->init_averaging = 0; + ue->measurements.n0_power_avg = ue->measurements.n0_power_tot; + ue->init_averaging = 0; } - for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) { - phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] = dB_fixed( phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id]); - phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id],phy_vars_ue->PHY_measurements.n0_power_tot); - phy_vars_ue->PHY_measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id],phy_vars_ue->PHY_measurements.n0_power_avg); - phy_vars_ue->PHY_measurements.rx_rssi_dBm[eNB_id] = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] - phy_vars_ue->rx_total_gain_dB; + for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) { + ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed( ue->measurements.rx_power_avg[eNB_id]); + ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot); + ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg); + ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB; #ifdef DEBUG_MEAS LOG_I(PHY,"[eNB %d] lte_ue_measurements: RSSI %d dBm, RSSI (digital) %d dB\n", - eNB_id,phy_vars_ue->PHY_measurements.rx_rssi_dBm[eNB_id], - phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]); + eNB_id,ue->measurements.rx_rssi_dBm[eNB_id], + ue->measurements.rx_power_avg_dB[eNB_id]); #endif } - phy_vars_ue->PHY_measurements.n0_power_avg_dB = dB_fixed( phy_vars_ue->PHY_measurements.n0_power_avg); + ue->measurements.n0_power_avg_dB = dB_fixed( ue->measurements.n0_power_avg); - for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) { + for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) { if (frame_parms->mode1_flag==0) { // cqi/pmi information for (aarx=0; aarxnb_antennas_rx; aarx++) { - dl_ch0 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0 = &ue->common_vars.dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1 = &ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; for (subband=0; subbandPHY_measurements.subband_cqi_tot[eNB_id][subband]=0; + ue->measurements.subband_cqi_tot[eNB_id][subband]=0; if ((subband<(nb_subbands-1))||(N_RB_DL==6)) { /*for (i=0;i<48;i++) msg("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); */ - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = + ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,subband_size) + signal_energy_nodc(dl_ch1,subband_size)); - if ( phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] < 0) - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]=0; + if ( ue->measurements.subband_cqi[eNB_id][aarx][subband] < 0) + ue->measurements.subband_cqi[eNB_id][aarx][subband]=0; /* else - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]-=phy_vars_ue->PHY_measurements.n0_power[aarx]; + ue->measurements.subband_cqi[eNB_id][aarx][subband]-=ue->measurements.n0_power[aarx]; */ - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]; - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband], - phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; + ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], + ue->measurements.n0_power[aarx]); } else { // this is for the last subband which is smaller in size // for (i=0;i<12;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) + - signal_energy_nodc(dl_ch1,last_subband_size)); // - phy_vars_ue->PHY_measurements.n0_power[aarx]; - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]; - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband], - phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) + + signal_energy_nodc(dl_ch1,last_subband_size)); // - ue->measurements.n0_power[aarx]; + ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; + ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], + ue->measurements.n0_power[aarx]); } dl_ch1+=subband_size; dl_ch0+=subband_size; - // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband]); + // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]); } } for (subband=0; subbandPHY_measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot); - // msg("subband_cqi_tot[%d][%d] => %d dB (n0 %d)\n",eNB_id,subband,phy_vars_ue->PHY_measurements.subband_cqi_tot_dB[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot); + ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot); + // msg("subband_cqi_tot[%d][%d] => %d dB (n0 %d)\n",eNB_id,subband,ue->measurements.subband_cqi_tot_dB[eNB_id][subband],ue->measurements.n0_power_tot); } for (aarx=0; aarxnb_antennas_rx; aarx++) { @@ -574,13 +574,13 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, #if defined(__x86_64__) || defined(__i386__) __m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ; - dl_ch0_128 = (__m128i *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1_128 = (__m128i *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0_128 = (__m128i *)&ue->common_vars.dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1_128 = (__m128i *)&ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; #elif defined(__arm__) int32x4_t pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmtmpPMI0b,mmtmpPMI1b; - dl_ch0_128 = (int16x8_t *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1_128 = (int16x8_t *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0_128 = (int16x8_t *)&ue->common_vars.dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1_128 = (int16x8_t *)&ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; #endif for (subband=0; subbandPHY_measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2; - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2; - phy_vars_ue->PHY_measurements.wideband_pmi_re[eNB_id][aarx] += phy_vars_ue->PHY_measurements.subband_pmi_re[eNB_id][subband][aarx]; - phy_vars_ue->PHY_measurements.wideband_pmi_im[eNB_id][aarx] += phy_vars_ue->PHY_measurements.subband_pmi_im[eNB_id][subband][aarx]; + ue->measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2; + ue->measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2; + ue->measurements.wideband_pmi_re[eNB_id][aarx] += ue->measurements.subband_pmi_re[eNB_id][subband][aarx]; + ue->measurements.wideband_pmi_im[eNB_id][aarx] += ue->measurements.subband_pmi_im[eNB_id][subband][aarx]; } // subband loop } // rx antenna loop } // if frame_parms->mode1_flag == 0 else { // cqi information only for mode 1 for (aarx=0; aarxnb_antennas_rx; aarx++) { - dl_ch0 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4]; + dl_ch0 = &ue->common_vars.dl_ch_estimates[eNB_id][aarx][4]; for (subband=0; subband<7; subband++) { // cqi if (aarx==0) - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband]=0; + ue->measurements.subband_cqi_tot[eNB_id][subband]=0; if (subband<6) { // for (i=0;i<48;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = - (signal_energy_nodc(dl_ch0,48) ) - phy_vars_ue->PHY_measurements.n0_power[aarx]; + ue->measurements.subband_cqi[eNB_id][aarx][subband] = + (signal_energy_nodc(dl_ch0,48) ) - ue->measurements.n0_power[aarx]; - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]; - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband], - phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; + ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], + ue->measurements.n0_power[aarx]); } else { // for (i=0;i<12;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - phy_vars_ue->PHY_measurements.n0_power[aarx]; - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]; - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband], - phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - ue->measurements.n0_power[aarx]; + ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; + ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], + ue->measurements.n0_power[aarx]); } dl_ch1+=48; - // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband]); + // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]); } } for (subband=0; subbandPHY_measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot); + ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot); } } - phy_vars_ue->PHY_measurements.rank[eNB_id] = 0; + ue->measurements.rank[eNB_id] = 0; for (i=0; iPHY_measurements.selected_rx_antennas[eNB_id][i] = 0; + ue->measurements.selected_rx_antennas[eNB_id][i] = 0; if (frame_parms->nb_antennas_rx>1) { - if (phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][0][i] >= phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][1][i]) - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 0; + if (ue->measurements.subband_cqi_dB[eNB_id][0][i] >= ue->measurements.subband_cqi_dB[eNB_id][1][i]) + ue->measurements.selected_rx_antennas[eNB_id][i] = 0; else - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 1; + ue->measurements.selected_rx_antennas[eNB_id][i] = 1; } else - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 0; + ue->measurements.selected_rx_antennas[eNB_id][i] = 0; } // if(eNB_id==0) - // printf("in lte_ue_measurements: selected rx_antenna[eNB_id==0]:%u\n", phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i]); + // printf("in lte_ue_measurements: selected rx_antenna[eNB_id==0]:%u\n", ue->measurements.selected_rx_antennas[eNB_id][i]); } // eNB_id loop #if defined(__x86_64__) || defined(__i386__) @@ -699,7 +699,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, } -void lte_ue_measurements_emul(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_t eNB_id) +void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id) { msg("[PHY] EMUL UE lte_ue_measurements_emul last slot %d, eNB_id %d\n",last_slot,eNB_id); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index 1eb663ec89..723b143d26 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -52,29 +52,29 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32 #define SCALE 0x3FFF -int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, +int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB, uint8_t eNB_id, uint8_t UE_id, - uint8_t sched_subframe, + uint8_t thread_id, unsigned char l, unsigned char Ns, uint8_t cooperation_flag) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id]; - int32_t **ul_ch_estimates=eNB_pusch_vars->drs_ch_estimates[eNB_id]; - int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time[eNB_id]; - int32_t **ul_ch_estimates_0= eNB_pusch_vars->drs_ch_estimates_0[eNB_id]; - int32_t **ul_ch_estimates_1= eNB_pusch_vars->drs_ch_estimates_1[eNB_id]; - int32_t **rxdataF_ext= eNB_pusch_vars->rxdataF_ext[eNB_id]; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe); + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + LTE_eNB_PUSCH *pusch_vars = eNB->pusch_vars[UE_id]; + int32_t **ul_ch_estimates=pusch_vars->drs_ch_estimates[eNB_id]; + int32_t **ul_ch_estimates_time= pusch_vars->drs_ch_estimates_time[eNB_id]; + int32_t **ul_ch_estimates_0= pusch_vars->drs_ch_estimates_0[eNB_id]; + int32_t **ul_ch_estimates_1= pusch_vars->drs_ch_estimates_1[eNB_id]; + int32_t **rxdataF_ext= pusch_vars->rxdataF_ext[eNB_id]; + int subframe = eNB->proc[thread_id].subframe_rx; + uint8_t harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe); int16_t delta_phase = 0; int16_t *ru1 = ru_90; int16_t *ru2 = ru_90; int16_t current_phase1,current_phase2; - uint16_t N_rb_alloc = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb; + uint16_t N_rb_alloc = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb; uint16_t aa,Msc_RS,Msc_RS_idx; uint16_t * Msc_idx_ptr; int k,pilot_pos1 = 3 - frame_parms->Ncp, pilot_pos2 = 10 - 2*frame_parms->Ncp; @@ -116,7 +116,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, Msc_RS = N_rb_alloc*12; cyclic_shift = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS2 + + eNB->ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS2 + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+Ns]) % 12; #if defined(USER_MODE) @@ -669,11 +669,11 @@ extern uint16_t transmission_offset_tdd[16]; #define DEBUG_SRS int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, - LTE_eNB_COMMON *eNb_common_vars, - LTE_eNB_SRS *eNb_srs_vars, + LTE_eNB_COMMON *common_vars, + LTE_eNB_SRS *srs_vars, SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated, unsigned char sub_frame_number, - unsigned char eNb_id) + unsigned char eNB_id) { int T_SFC,aa; @@ -690,7 +690,7 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, T_SFC = (Ssrs<=7 ? 5 : 10); /* - msg("SRS channel estimation eNb %d, subframs %d, %d %d %d %d %d\n",eNb_id,sub_frame_number, + msg("SRS channel estimation eNB %d, subframs %d, %d %d %d %d %d\n",eNB_id,sub_frame_number, SRS_parms->Csrs, SRS_parms->Bsrs, SRS_parms->kTC, @@ -702,34 +702,34 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, if (generate_srs_rx(frame_parms, soundingrs_ul_config_dedicated, - eNb_srs_vars->srs)==-1) { + srs_vars->srs)==-1) { msg("lte_srs_channel_estimation: Error in generate_srs_rx\n"); return(-1); } for (aa=0; aarxdataF[eNb_id][aa][2*frame_parms->ofdm_symbol_size*symbol], - eNb_srs_vars->srs, - eNb_srs_vars->srs_ch_estimates[eNb_id][aa]); + msg("SRS channel estimation eNB %d, subframs %d, aarx %d, %p, %p, %p\n",eNB_id,sub_frame_number,aa, + &common_vars->rxdataF[eNB_id][aa][2*frame_parms->ofdm_symbol_size*symbol], + srs_vars->srs, + srs_vars->srs_ch_estimates[eNB_id][aa]); #endif - //write_output("eNb_rxF.m","rxF",&eNb_common_vars->rxdataF[0][aa][2*frame_parms->ofdm_symbol_size*symbol],2*(frame_parms->ofdm_symbol_size),2,1); - //write_output("eNb_srs.m","srs_eNb",eNb_common_vars->srs,(frame_parms->ofdm_symbol_size),1,1); + //write_output("eNB_rxF.m","rxF",&common_vars->rxdataF[0][aa][2*frame_parms->ofdm_symbol_size*symbol],2*(frame_parms->ofdm_symbol_size),2,1); + //write_output("eNB_srs.m","srs_eNB",common_vars->srs,(frame_parms->ofdm_symbol_size),1,1); - mult_cpx_conj_vector((int16_t*) &eNb_common_vars->rxdataF[eNb_id][aa][2*frame_parms->ofdm_symbol_size*symbol], - (int16_t*) eNb_srs_vars->srs, - (int16_t*) eNb_srs_vars->srs_ch_estimates[eNb_id][aa], + mult_cpx_conj_vector((int16_t*) &common_vars->rxdataF[eNB_id][aa][2*frame_parms->ofdm_symbol_size*symbol], + (int16_t*) srs_vars->srs, + (int16_t*) srs_vars->srs_ch_estimates[eNB_id][aa], frame_parms->ofdm_symbol_size, 15); //msg("SRS channel estimation cmult out\n"); #ifdef USER_MODE #ifdef DEBUG_SRS - sprintf(fname,"eNB_id%d_an%d_srs_ch_est.m",eNb_id,aa); - sprintf(vname,"eNB%d_%d_srs_ch_est",eNb_id,aa); - write_output(fname,vname,eNb_srs_vars->srs_ch_estimates[eNb_id][aa],frame_parms->ofdm_symbol_size,1,1); + sprintf(fname,"eNB_id%d_an%d_srs_ch_est.m",eNB_id,aa); + sprintf(vname,"eNB%d_%d_srs_ch_est",eNB_id,aa); + write_output(fname,vname,srs_vars->srs_ch_estimates[eNB_id][aa],frame_parms->ofdm_symbol_size,1,1); #endif #endif } @@ -738,7 +738,7 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, /* else { for (aa=0;aasrs_ch_estimates[eNb_id][aa],frame_parms->ofdm_symbol_size*sizeof(int)); + bzero(srs_vars->srs_ch_estimates[eNB_id][aa],frame_parms->ofdm_symbol_size*sizeof(int)); } */ return(0); diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c index 9ffda3a83d..17b57bc085 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c @@ -40,7 +40,7 @@ //Calibration -int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, +int lte_dl_cell_spec_SS(PHY_VARS_eNB *eNB, int32_t *output, short amp, unsigned char Ns, @@ -76,27 +76,27 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, return(-1); } - mprime = 110 - phy_vars_eNB->lte_frame_parms.N_RB_DL; + mprime = 110 - eNB->frame_parms.N_RB_DL; - k = (nu + phy_vars_eNB->lte_frame_parms.nushift); + k = (nu + eNB->frame_parms.nushift); if (k > 6)//b k -=6;//b - k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset; + k+=eNB->frame_parms.first_carrier_offset; - for (m=0; mlte_frame_parms.N_RB_DL<<1; m++) { // loop over pilots in one slot/symbol, 2*N_RB_DL pilots + for (m=0; mframe_parms.N_RB_DL<<1; m++) { // loop over pilots in one slot/symbol, 2*N_RB_DL pilots mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; //output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; #ifdef DEBUG_DL_CELL_SPEC printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + printf("index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); #endif mprime++; @@ -108,9 +108,9 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, #endif k+=6;//b - if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { + if (k >= eNB->frame_parms.ofdm_symbol_size) { k++; // skip DC carrier - k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size; + k-=eNB->frame_parms.ofdm_symbol_size; } // printf("** k %d\n",k); @@ -120,7 +120,7 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, } -int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, +int lte_dl_cell_spec(PHY_VARS_eNB *eNB, int32_t *output, short amp, unsigned char Ns, @@ -155,31 +155,31 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, return(-1); } - mprime = 110 - phy_vars_eNB->lte_frame_parms.N_RB_DL; + mprime = 110 - eNB->frame_parms.N_RB_DL; - k = (nu + phy_vars_eNB->lte_frame_parms.nushift); + k = (nu + eNB->frame_parms.nushift); if (k > 5) k -=6; - k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset; + k+=eNB->frame_parms.first_carrier_offset; DevAssert( Ns < 20 ); DevAssert( l < 2 ); DevAssert( mprime>>4 < 14 ); - for (m=0; mlte_frame_parms.N_RB_DL<<1; m++) { + for (m=0; mframe_parms.N_RB_DL<<1; m++) { mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; //output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; #ifdef DEBUG_DL_CELL_SPEC printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + printf("index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); #endif mprime++; @@ -191,9 +191,9 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, #endif k+=6; - if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { + if (k >= eNB->frame_parms.ofdm_symbol_size) { k++; // skip DC carrier - k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size; + k-=eNB->frame_parms.ofdm_symbol_size; } // printf("** k %d\n",k); @@ -202,7 +202,7 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, return(0); } -int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue, +int lte_dl_cell_spec_rx(PHY_VARS_UE *ue, uint8_t eNB_offset, int *output, unsigned char Ns, @@ -230,19 +230,19 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue, ((short *)&qpsk[3])[0] = -pamp; ((short *)&qpsk[3])[1] = pamp; - mprime = 110 - phy_vars_ue->lte_frame_parms.N_RB_DL; + mprime = 110 - ue->frame_parms.N_RB_DL; - for (m=0; mlte_frame_parms.N_RB_DL<<1; m++) { + for (m=0; mframe_parms.N_RB_DL<<1; m++) { mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; #ifdef DEBUG_DL_CELL_SPEC printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + printf("index = %d (k %d)\n",(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); #endif mprime++; diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c index 9c3269b863..06edf4a5f5 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c @@ -39,7 +39,7 @@ //extern unsigned int lte_gold_table[10][3][42]; //#define DEBUG_DL_MBSFN -int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, +int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output, short amp, int subframe, unsigned char l) @@ -62,9 +62,9 @@ int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, ((short *)&qpsk[3])[1] = -a; - mprime = 3*(110 - phy_vars_eNB->lte_frame_parms.N_RB_DL); + mprime = 3*(110 - eNB->frame_parms.N_RB_DL); - for (m=0; mlte_frame_parms.N_RB_DL*6; m++) { + for (m=0; mframe_parms.N_RB_DL*6; m++) { if ((l==0) || (l==2)) k = m<<1; @@ -75,24 +75,24 @@ int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, return(-1); } - k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset; + k+=eNB->frame_parms.first_carrier_offset; mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; - if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { + if (k >= eNB->frame_parms.ofdm_symbol_size) { k++; // skip DC carrier - k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size; + k-=eNB->frame_parms.ofdm_symbol_size; } - output[k] = qpsk[(phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; //output[k] = (lte_gold_table[eNB_offset][subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; #ifdef DEBUG_DL_MBSFN msg("subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n", subframe,l,m,mprime,mprime_dword,mprime_qpsk_symb); - msg("index = %d (k %d)(%x)\n",(phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]); + msg("index = %d (k %d)(%x)\n",(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]); #endif mprime++; @@ -110,7 +110,7 @@ int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, -int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue, +int lte_dl_mbsfn_rx(PHY_VARS_UE *ue, int *output, int subframe, unsigned char l) @@ -131,20 +131,20 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue, ((short *)&qpsk[3])[0] = -ONE_OVER_SQRT2_Q15; ((short *)&qpsk[3])[1] = ONE_OVER_SQRT2_Q15; - mprime = 3*(110 - phy_vars_ue->lte_frame_parms.N_RB_DL); + mprime = 3*(110 - ue->frame_parms.N_RB_DL); - for (m=0; mlte_frame_parms.N_RB_DL*6; m++) { + for (m=0; mframe_parms.N_RB_DL*6; m++) { mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; #ifdef DEBUG_DL_MBSFN printf("subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n", subframe,l,m,mprime, mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d) (%x)\n",(phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]); + printf("index = %d (k %d) (%x)\n",(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]); #endif mprime++; diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c index 9b094393c7..ae971c4c6c 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c @@ -52,7 +52,7 @@ int Wbar_NCP[8][4] = {{1,1,1,1},{1,-1,1,-1},{1,1,1,1},{1,-1,1,-1},{1,1,-1,-1},{-1,-1,1,1},{1,-1,-1,1},{-1,1,1,-1}}; -int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, +int lte_dl_ue_spec(PHY_VARS_eNB *eNB, uint8_t UE_id, int32_t *output, short amp, @@ -64,7 +64,7 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, int32_t qpsk[4],nqpsk[4],*qpsk_p,*output_p; int16_t a; int w,lprime,ind,l,ind_dword,ind_qpsk_symb,nPRB; - // LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[UE_id][0]; + // LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_eNB[UE_id][0]; a = (amp*ONE_OVER_SQRT2_Q15)>>15; ((short *)&qpsk[0])[0] = a; @@ -87,13 +87,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, if (p>=7) { if (SS_flag==0) { - if (phy_vars_eNB->lte_frame_parms.Ncp == NORMAL) { + if (eNB->frame_parms.Ncp == NORMAL) { // this is 3GPP 36-211 6.10.3.2, NORMAL CP, p>=7 // position output pointer to 5th symbol in slot - output_p = output+(60*phy_vars_eNB->lte_frame_parms.N_RB_DL); + output_p = output+(60*eNB->frame_parms.N_RB_DL); // shift to 2nd RE in PRB for p=7,8,11,13 if ((p==7) || (p==8) || (p==11) || (p==13)) output_p++; @@ -101,12 +101,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, for (lprime=0; lprime<2; lprime++) { - ind = 3*lprime*phy_vars_eNB->lte_frame_parms.N_RB_DL; + ind = 3*lprime*eNB->frame_parms.N_RB_DL; l = lprime + ((Ns&1)<<1); // loop over pairs of PRBs, this is the periodicity of the W_bar_NCP sequence // unroll the computations for the 6 pilots, select qpsk or nqpsk as function of W_bar_NCP - for (nPRB=0; nPRBlte_frame_parms.N_RB_DL; nPRB+=2) { + for (nPRB=0; nPRBframe_parms.N_RB_DL; nPRB+=2) { // First pilot w = Wbar_NCP[p-7][l]; @@ -116,13 +116,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ind_dword = ind>>4; ind_qpsk_symb = ind&0xf; - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + *output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; #ifdef DEBUG_DL_UESPEC LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); + LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); #endif output_p+=5; @@ -135,12 +135,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ind_dword = ind>>4; ind_qpsk_symb = ind&0xf; - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + *output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; #ifdef DEBUG_DL_UESPEC LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); + LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); #endif output_p+=5; @@ -152,12 +152,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ind_dword = ind>>4; ind_qpsk_symb = ind&0xf; - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + *output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; #ifdef DEBUG_DL_UESPEC LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); + LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); #endif output_p+=2; @@ -171,13 +171,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ind_dword = ind>>4; ind_qpsk_symb = ind&0xf; - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + *output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; #ifdef DEBUG_DL_UESPEC LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); + LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); #endif output_p+=5; @@ -190,12 +190,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ind_dword = ind>>4; ind_qpsk_symb = ind&0xf; - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + *output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; #ifdef DEBUG_DL_UESPEC LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); + LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); #endif output_p+=5; @@ -207,12 +207,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ind_dword = ind>>4; ind_qpsk_symb = ind&0xf; - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + *output_p = qpsk_p[(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; #ifdef DEBUG_DL_UESPEC LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); + LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); #endif output_p+=2; @@ -260,9 +260,9 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue, ((short *)&qpsk[3])[0] = -pamp; ((short *)&qpsk[3])[1] = pamp; - mprime = 110 - phy_vars_ue->lte_frame_parms.N_RB_DL; + mprime = 110 - phy_vars_ue->frame_parms.N_RB_DL; - for (m=0;mlte_frame_parms.N_RB_DL<<1;m++) { + for (m=0;mframe_parms.N_RB_DL<<1;m++) { mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index e79f603a49..c0ea61d48e 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -1686,8 +1686,8 @@ void pdcch_alamouti(LTE_DL_FRAME_PARMS *frame_parms, int32_t avgP[4]; -int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, - LTE_UE_PDCCH **lte_ue_pdcch_vars, +int32_t rx_pdcch(LTE_UE_COMMON *common_vars, + LTE_UE_PDCCH **pdcch_vars, LTE_DL_FRAME_PARMS *frame_parms, uint8_t subframe, uint8_t eNB_id, @@ -1701,49 +1701,49 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, uint8_t eNB_id_i=eNB_id+1;//add 1 to eNB_id to separate from wanted signal, chosen as the B/F'd pilots from the SeNB are shifted by 1 #endif int32_t avgs,s; - uint8_t n_pdcch_symbols = 3; //lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; + uint8_t n_pdcch_symbols = 3; //pdcch_vars[eNB_id]->num_pdcch_symbols; uint8_t mi = get_mi(frame_parms,subframe); // printf("In rx_pdcch, subframe %d, eNB_id %d\n",subframe,eNB_id); for (s=0; srxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB - lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_extract_rbs_single(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, high_speed_flag, frame_parms); #ifdef MU_RECEIVER - pdcch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB - lte_ue_pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna - lte_ue_pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna + pdcch_extract_rbs_single(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB + pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna s, high_speed_flag, frame_parms); #endif //MU_RECEIVER } else if (frame_parms->nb_antennas_tx_eNB>1) { - pdcch_extract_rbs_dual(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_extract_rbs_dual(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id], + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, high_speed_flag, frame_parms); } else { - pdcch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_extract_rbs_single(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id], + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, s, high_speed_flag, frame_parms); } } - pdcch_channel_level(lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_channel_level(pdcch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, avgP, frame_parms->N_RB_DL); @@ -1761,10 +1761,10 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, for (s=0; srxdataF_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - (aatx>1) ? lte_ue_pdcch_vars[eNB_id]->rho : NULL, + pdcch_channel_compensation(pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_vars[eNB_id]->rxdataF_comp, + (aatx>1) ? pdcch_vars[eNB_id]->rho : NULL, frame_parms, s, log2_maxh); // log2_maxh+I0_shift @@ -1773,7 +1773,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, #ifdef DEBUG_PHY if (subframe==5) - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); #endif @@ -1781,21 +1781,21 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, if (is_secondary_ue) { //get MF output for interfering stream - pdcch_channel_compensation(lte_ue_pdcch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdcch_vars[eNB_id_i]->rxdataF_comp, - (aatx>1) ? lte_ue_pdcch_vars[eNB_id_i]->rho : NULL, + pdcch_channel_compensation(pdcch_vars[eNB_id_i]->rxdataF_ext, + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdcch_vars[eNB_id_i]->rxdataF_comp, + (aatx>1) ? pdcch_vars[eNB_id_i]->rho : NULL, frame_parms, s, log2_maxh); // log2_maxh+I0_shift #ifdef DEBUG_PHY - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); #endif pdcch_dual_stream_correlation(frame_parms, s, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_rho_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdcch_vars[eNB_id]->dl_ch_rho_ext, log2_maxh); } @@ -1807,54 +1807,54 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, if (is_secondary_ue) { pdcch_detection_mrc_i(frame_parms, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdcch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdcch_vars[eNB_id]->rho, - lte_ue_pdcch_vars[eNB_id]->dl_ch_rho_ext, + pdcch_vars[eNB_id]->rxdataF_comp, + pdcch_vars[eNB_id_i]->rxdataF_comp, + pdcch_vars[eNB_id]->rho, + pdcch_vars[eNB_id]->dl_ch_rho_ext, s); #ifdef DEBUG_PHY - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); #endif } else #endif //MU_RECEIVER pdcch_detection_mrc(frame_parms, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, + pdcch_vars[eNB_id]->rxdataF_comp, s); } if (mimo_mode == SISO) - pdcch_siso(frame_parms,lte_ue_pdcch_vars[eNB_id]->rxdataF_comp,s); + pdcch_siso(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s); else - pdcch_alamouti(frame_parms,lte_ue_pdcch_vars[eNB_id]->rxdataF_comp,s); + pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s); #ifdef MU_RECEIVER if (is_secondary_ue) { pdcch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdcch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdcch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder) - lte_ue_pdcch_vars[eNB_id]->llr, + pdcch_vars[eNB_id]->rxdataF_comp, + pdcch_vars[eNB_id_i]->rxdataF_comp, + pdcch_vars[eNB_id]->dl_ch_rho_ext, + pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder) + pdcch_vars[eNB_id]->llr, s); /* #ifdef DEBUG_PHY if (subframe==5) { - write_output("llr8_seq.m","llr8",<e_ue_pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); - write_output("llr16_seq.m","llr16",<e_ue_pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + write_output("llr16_seq.m","llr16",&pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); } #endif*/ } else { #endif //MU_RECEIVER pdcch_llr(frame_parms, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - (char *)lte_ue_pdcch_vars[eNB_id]->llr, + pdcch_vars[eNB_id]->rxdataF_comp, + (char *)pdcch_vars[eNB_id]->llr, s); /*#ifdef DEBUG_PHY - write_output("llr8_seq.m","llr8",<e_ue_pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); #endif*/ #ifdef MU_RECEIVER } @@ -1866,7 +1866,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, // decode pcfich here n_pdcch_symbols = rx_pcfich(frame_parms, subframe, - lte_ue_pdcch_vars[eNB_id], + pdcch_vars[eNB_id], mimo_mode); if (n_pdcch_symbols>3) @@ -1879,24 +1879,24 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, printf("demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config); #endif - pdcch_demapping(lte_ue_pdcch_vars[eNB_id]->llr, - lte_ue_pdcch_vars[eNB_id]->wbar, + pdcch_demapping(pdcch_vars[eNB_id]->llr, + pdcch_vars[eNB_id]->wbar, frame_parms, n_pdcch_symbols, get_mi(frame_parms,subframe)); pdcch_deinterleaving(frame_parms, - (uint16_t*)lte_ue_pdcch_vars[eNB_id]->e_rx, - lte_ue_pdcch_vars[eNB_id]->wbar, + (uint16_t*)pdcch_vars[eNB_id]->e_rx, + pdcch_vars[eNB_id]->wbar, n_pdcch_symbols, mi); pdcch_unscrambling(frame_parms, subframe, - lte_ue_pdcch_vars[eNB_id]->e_rx, + pdcch_vars[eNB_id]->e_rx, get_nCCE(n_pdcch_symbols,frame_parms,mi)*72); - lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols = n_pdcch_symbols; + pdcch_vars[eNB_id]->num_pdcch_symbols = n_pdcch_symbols; return(0); } @@ -2356,7 +2356,7 @@ uint8_t generate_dci_top_emul(PHY_VARS_eNB *phy_vars_eNB, LTE_eNB_DLSCH_t *dlsch_eNB; uint8_t num_pdcch_symbols = get_num_pdcch_symbols(num_ue_spec_dci+num_common_dci, dci_alloc, - &phy_vars_eNB->lte_frame_parms, + &phy_vars_eNB->frame_parms, subframe); eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].cntl.cfi=num_pdcch_symbols; @@ -2542,8 +2542,8 @@ uint16_t get_nCCE_mac(uint8_t Mod_id,uint8_t CC_id,int num_pdcch_symbols,int sub // check for eNB only ! return(get_nCCE(num_pdcch_symbols, - &PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms, - get_mi(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe))); + &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms, + get_mi(&PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms,subframe))); } @@ -2647,7 +2647,7 @@ int get_nCCE_offset_l1(int *CCE_table, } -void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, +void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, int do_common, uint8_t subframe, DCI_ALLOC_t *dci_alloc, @@ -2676,7 +2676,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, unsigned int Yk,nb_candidates = 0,i,m; unsigned int CCEmap_cand; - nCCE = get_nCCE(lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,frame_parms,mi); + nCCE = get_nCCE(pdcch_vars[eNB_id]->num_pdcch_symbols,frame_parms,mi); if (nCCE > get_nCCE(3,frame_parms,1)) return; @@ -2691,7 +2691,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, // Find first available in ue specific search space // according to procedure in Section 9.1.1 of 36.213 (v. 8.6) // compute Yk - Yk = (unsigned int)lte_ue_pdcch_vars[eNB_id]->crnti; + Yk = (unsigned int)pdcch_vars[eNB_id]->crnti; for (i=0; i<=subframe; i++) Yk = (Yk*39827)%65537; @@ -2777,7 +2777,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, dci_decoding(sizeof_bits, L, - <e_ue_pdcch_vars[eNB_id]->e_rx[CCEind*72], + &pdcch_vars[eNB_id]->e_rx[CCEind*72], dci_decoded_output); /* for (i=0;i<3+(sizeof_bits>>3);i++) @@ -2790,7 +2790,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, if (((L>1) && ((crc == si_rnti)|| (crc == ra_rnti)))|| - (crc == lte_ue_pdcch_vars[eNB_id]->crnti)) { + (crc == pdcch_vars[eNB_id]->crnti)) { dci_alloc[*dci_cnt].dci_length = sizeof_bits; dci_alloc[*dci_cnt].rnti = crc; dci_alloc[*dci_cnt].L = L; @@ -2826,28 +2826,28 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, } else if (crc==ra_rnti) { dci_alloc[*dci_cnt].format = format_ra; // store first nCCE of group for PUCCH transmission of ACK/NAK - lte_ue_pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; + pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; *dci_cnt = *dci_cnt+1; - } else if (crc==lte_ue_pdcch_vars[eNB_id]->crnti) { + } else if (crc==pdcch_vars[eNB_id]->crnti) { if ((format_c == format0)&&((dci_decoded_output[0]&0x80)==0)) {// check if pdu is format 0 or 1A if (*format0_found == 0) { dci_alloc[*dci_cnt].format = format0; *format0_found = 1; *dci_cnt = *dci_cnt+1; - lte_ue_pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; + pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; } } else if (format_c == format0) { // this is a format 1A DCI dci_alloc[*dci_cnt].format = format1A; *dci_cnt = *dci_cnt+1; - lte_ue_pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; + pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; } else { // store first nCCE of group for PUCCH transmission of ACK/NAK if (*format_c_found == 0) { dci_alloc[*dci_cnt].format = format_c; *dci_cnt = *dci_cnt+1; *format_c_found = 1; - lte_ue_pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; + pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; } } } @@ -2881,14 +2881,14 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, #endif - // if (crc==lte_ue_pdcch_vars[eNB_id]->crnti) + // if (crc==pdcch_vars[eNB_id]->crnti) // return; } // rnti match } // CCEmap_cand == 0 } // candidate loop } -uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, +uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, DCI_ALLOC_t *dci_alloc, int do_common, int16_t eNB_id, @@ -2897,12 +2897,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, uint8_t dci_cnt=0,old_dci_cnt=0; uint32_t CCEmap0=0,CCEmap1=0,CCEmap2=0; - LTE_UE_PDCCH **lte_ue_pdcch_vars = phy_vars_ue->lte_ue_pdcch_vars; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - uint8_t mi = get_mi(&phy_vars_ue->lte_frame_parms,subframe); + LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + uint8_t mi = get_mi(&ue->frame_parms,subframe); uint16_t ra_rnti=99; uint8_t format0_found=0,format_c_found=0; - uint8_t tmode = phy_vars_ue->transmission_mode[eNB_id]; + uint8_t tmode = ue->transmission_mode[eNB_id]; uint8_t frame_type = frame_parms->frame_type; uint8_t format1A_size_bits=0,format1A_size_bytes=0; uint8_t format1C_size_bits=0,format1C_size_bytes=0; @@ -3107,12 +3107,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, printf("[DCI search] doing common search/format0 aggregation 4\n"); #endif - if (phy_vars_ue->prach_resources[eNB_id]) - ra_rnti = phy_vars_ue->prach_resources[eNB_id]->ra_RNTI; + if (ue->prach_resources[eNB_id]) + ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI; // First check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI format 0/1A), // and UE_SPEC format0 (PUSCH) too while we're at it - dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe, + dci_decoding_procedure0(pdcch_vars,1,subframe, dci_alloc, eNB_id, frame_parms, @@ -3138,7 +3138,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // Now check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI and C-RNTI format 1C), // and UE_SPEC format0 (PUSCH) too while we're at it - dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe, + dci_decoding_procedure0(pdcch_vars,1,subframe, dci_alloc, eNB_id, frame_parms, @@ -3168,7 +3168,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, #ifdef DEBUG_DCI_DECODING printf("[DCI search] doing common search/format0 aggregation 8\n"); #endif - dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe, + dci_decoding_procedure0(pdcch_vars,1,subframe, dci_alloc, eNB_id, frame_parms, @@ -3194,7 +3194,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // Now check common search spaces at aggregation 8 (SI_RNTI and RA_RNTI and C-RNTI format 1C), // and UE_SPEC format0 (PUSCH) too while we're at it - dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe, + dci_decoding_procedure0(pdcch_vars,1,subframe, dci_alloc, eNB_id, frame_parms, @@ -3217,15 +3217,15 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, } - if (phy_vars_ue->UE_mode[eNB_id] <= PRACH) + if (ue->UE_mode[eNB_id] <= PRACH) return(dci_cnt); - if (phy_vars_ue->prach_resources[eNB_id]) - ra_rnti = phy_vars_ue->prach_resources[eNB_id]->ra_RNTI; + if (ue->prach_resources[eNB_id]) + ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI; // Now check UE_SPEC format0/1A ue_spec search spaces at aggregation 8 // printf("[DCI search] Format 0/1A aggregation 8\n"); - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3252,7 +3252,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // printf("[DCI search] Format 0 aggregation 4\n"); // Now check UE_SPEC format 0 search spaces at aggregation 4 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3283,7 +3283,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // printf("[DCI search] Format 0 aggregation 2\n"); // Now check UE_SPEC format 0 search spaces at aggregation 2 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3310,7 +3310,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // printf("[DCI search] Format 0 aggregation 4\n"); // Now check UE_SPEC format 0 search spaces at aggregation 1 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3342,7 +3342,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, if (tmode < 3) { // Now check UE_SPEC format 1 search spaces at aggregation 1 old_dci_cnt=dci_cnt; - dci_decoding_procedure0(lte_ue_pdcch_vars,0,subframe, + dci_decoding_procedure0(pdcch_vars,0,subframe, dci_alloc, eNB_id, frame_parms, @@ -3371,7 +3371,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // Now check UE_SPEC format 1 search spaces at aggregation 2 old_dci_cnt=dci_cnt; - dci_decoding_procedure0(lte_ue_pdcch_vars,0,subframe, + dci_decoding_procedure0(pdcch_vars,0,subframe, dci_alloc, eNB_id, frame_parms, @@ -3401,7 +3401,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // Now check UE_SPEC format 1 search spaces at aggregation 4 old_dci_cnt=dci_cnt; - dci_decoding_procedure0(lte_ue_pdcch_vars,0,subframe, + dci_decoding_procedure0(pdcch_vars,0,subframe, dci_alloc, eNB_id, frame_parms, @@ -3431,7 +3431,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, //#ifdef ALL_AGGREGATION // Now check UE_SPEC format 1 search spaces at aggregation 8 old_dci_cnt=dci_cnt; - dci_decoding_procedure0(lte_ue_pdcch_vars,0,subframe, + dci_decoding_procedure0(pdcch_vars,0,subframe, dci_alloc, eNB_id, frame_parms, @@ -3463,7 +3463,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // Now check UE_SPEC format 2A_2A search spaces at aggregation 1 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3492,7 +3492,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 2 search spaces at aggregation 2 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3521,7 +3521,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 2_2A search spaces at aggregation 4 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3551,7 +3551,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, //#ifdef ALL_AGGREGATION // Now check UE_SPEC format 2_2A search spaces at aggregation 8 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3575,7 +3575,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, } else if (tmode == 4) { // Now check UE_SPEC format 2_2A search spaces at aggregation 1 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3604,7 +3604,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 2 search spaces at aggregation 2 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3633,7 +3633,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 2_2A search spaces at aggregation 4 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3663,7 +3663,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, //#ifdef ALL_AGGREGATION // Now check UE_SPEC format 2_2A search spaces at aggregation 8 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3690,7 +3690,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, #ifdef DEBUG_DCI_DECODING LOG_I(PHY," MU-MIMO check UE_SPEC format 1E_2A_M10PRB\n"); #endif - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3720,7 +3720,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 2 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3749,7 +3749,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 4 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3780,7 +3780,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, //#ifdef ALL_AGGREGATION // Now check UE_SPEC format 1E_2A_M10PRB search spaces at aggregation 8 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0, subframe, dci_alloc, eNB_id, @@ -3816,7 +3816,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, } #ifdef PHY_ABSTRACTION -uint16_t dci_decoding_procedure_emul(LTE_UE_PDCCH **lte_ue_pdcch_vars, +uint16_t dci_decoding_procedure_emul(LTE_UE_PDCCH **pdcch_vars, uint8_t num_ue_spec_dci, uint8_t num_common_dci, DCI_ALLOC_t *dci_alloc_tx, @@ -3831,10 +3831,10 @@ uint16_t dci_decoding_procedure_emul(LTE_UE_PDCCH **lte_ue_pdcch_vars, LOG_D(PHY,"[DCI][EMUL] : num_common_dci %d\n",num_common_dci); for (i=num_common_dci; i<(num_ue_spec_dci+num_common_dci); i++) { - LOG_D(PHY,"[DCI][EMUL] Checking dci %d => %x format %d (bit 0 %d)\n",i,lte_ue_pdcch_vars[eNB_id]->crnti,dci_alloc_tx[i].format, + LOG_D(PHY,"[DCI][EMUL] Checking dci %d => %x format %d (bit 0 %d)\n",i,pdcch_vars[eNB_id]->crnti,dci_alloc_tx[i].format, dci_alloc_tx[i].dci_pdu[0]&0x80); - if (dci_alloc_tx[i].rnti == lte_ue_pdcch_vars[eNB_id]->crnti) { + if (dci_alloc_tx[i].rnti == pdcch_vars[eNB_id]->crnti) { memcpy(dci_alloc_rx+dci_cnt,dci_alloc_tx+i,sizeof(DCI_ALLOC_t)); dci_cnt++; } diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index a163225f03..90c67ed70f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -6235,7 +6235,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, uint16_t rnti, uint8_t subframe, DCI_format_t dci_format, - PHY_VARS_UE *phy_vars_ue, + PHY_VARS_UE *ue, uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, @@ -6245,13 +6245,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, { uint8_t harq_pid; - uint8_t transmission_mode = phy_vars_ue->transmission_mode[eNB_id]; - ANFBmode_t AckNackFBMode = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; - LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; - // LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[0]; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - // uint32_t current_dlsch_cqi = phy_vars_ue->current_dlsch_cqi[eNB_id]; + uint8_t transmission_mode = ue->transmission_mode[eNB_id]; + ANFBmode_t AckNackFBMode = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; + LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; + // LTE_UE_DLSCH_t **dlsch = ue->dlsch[0]; + PHY_MEASUREMENTS *meas = &ue->measurements; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + // uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id]; uint32_t cqi_req; uint32_t dai=0; @@ -6269,12 +6269,12 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, harq_pid = 0; else harq_pid = subframe2harq_pid(frame_parms, - pdcch_alloc2ul_frame(frame_parms,phy_vars_ue->frame_rx,subframe), + pdcch_alloc2ul_frame(frame_parms,ue->frame_rx,subframe), pdcch_alloc2ul_subframe(frame_parms,subframe)); if (harq_pid == 255) { LOG_E(PHY, "frame %d, subframe %d, rnti %x, format %d: illegal harq_pid!\n", - phy_vars_ue->frame_rx, subframe, rnti, dci_format); + ue->frame_rx, subframe, rnti, dci_format); return(-1); } @@ -6401,7 +6401,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, if (rballoc > RIV_max) { LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc > RIV_max\n", - phy_vars_ue->frame_rx, subframe, rnti, dci_format); + ue->frame_rx, subframe, rnti, dci_format); return(-1); } @@ -6414,18 +6414,18 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->harq_processes[harq_pid]->TPC = TPC; - if (phy_vars_ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) { + if (ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) { LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->f_pusch, - delta_PUSCH_acc[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC], - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC); - ulsch->f_pusch += delta_PUSCH_acc[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC]; + ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->f_pusch, + delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC); + ulsch->f_pusch += delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC]; } else { LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ABS) %d, adjusting to %d (TPC %d)\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->f_pusch, - delta_PUSCH_abs[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC], - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC); - ulsch->f_pusch = delta_PUSCH_abs[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC]; + ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->f_pusch, + delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC); + ulsch->f_pusch = delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC]; } if (ulsch->harq_processes[harq_pid]->first_tx==1) { @@ -6495,7 +6495,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, // The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling case 1: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6516,7 +6516,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6537,7 +6537,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6563,7 +6563,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 2: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6584,7 +6584,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6605,7 +6605,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6631,7 +6631,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 3: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6652,7 +6652,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6673,7 +6673,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6699,7 +6699,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 4: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6720,7 +6720,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz; break; @@ -6741,7 +6741,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = wideband_cqi_rank1_2A; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz; break; @@ -6767,7 +6767,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 5: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6788,7 +6788,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz; break; @@ -6809,7 +6809,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = wideband_cqi_rank1_2A; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz; break; @@ -6835,7 +6835,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 6: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6856,7 +6856,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz; break; @@ -6877,7 +6877,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = wideband_cqi_rank1_2A; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz; break; @@ -6903,7 +6903,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 7: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6924,7 +6924,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6945,7 +6945,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6979,23 +6979,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; } - print_CQI(ulsch->o,ulsch->uci_format,eNB_id,phy_vars_ue->lte_frame_parms.N_RB_DL); + print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL); - //FK: moved this part to ulsch_coding to be more recent - /* - fill_CQI(ulsch->o,ulsch->uci_format,meas,eNB_id,transmission_mode); - print_CQI(ulsch->o,ulsch->uci_format,eNB_id); - // save PUSCH pmi for later (transmission modes 4,5,6) - // msg("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); - dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; - */ - - // check this (see comment in generate_ue_ulsch_params_from_dci) if (frame_parms->frame_type == FDD) { int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4); - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission + if (ue->dlsch[eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission ulsch->harq_processes[harq_pid]->O_ACK = 1; } else { ulsch->harq_processes[harq_pid]->O_ACK = 0; @@ -7009,9 +6999,9 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, // ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1; } - ulsch->beta_offset_cqi_times8 = beta_cqi[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index];//18; - ulsch->beta_offset_ri_times8 = beta_ri[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index];//10; - ulsch->beta_offset_harqack_times8 = beta_ack[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index];//16; + ulsch->beta_offset_cqi_times8 = beta_cqi[ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index];//18; + ulsch->beta_offset_ri_times8 = beta_ri[ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index];//10; + ulsch->beta_offset_harqack_times8 = beta_ack[ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index];//16; ulsch->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1); ulsch->srs_active = use_srs; @@ -7044,8 +7034,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->harq_processes[harq_pid]->round = 0; // a Ndi=1 automatically acknowledges previous PUSCH transmission - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; + if (ue->ulsch_Msg3_active[eNB_id] == 1) + ue->ulsch_Msg3_active[eNB_id] = 0; } else { // printf("Ndi = 0 : Setting RVidx from mcs %d\n",((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs); if (mcs>28) ulsch->harq_processes[harq_pid]->rvidx = mcs - 28; @@ -7054,7 +7044,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, } LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb, + ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb, ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx); // ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift; @@ -7081,7 +7071,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, return(0); } else { LOG_E(PHY,"frame %d, subframe %d: FATAL ERROR, generate_ue_ulsch_params_from_dci, Illegal dci_format %d\n", - phy_vars_ue->frame_rx, subframe,dci_format); + ue->frame_rx, subframe,dci_format); return(-1); } @@ -7089,10 +7079,10 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, int generate_eNB_ulsch_params_from_dci(void *dci_pdu, uint16_t rnti, - uint8_t sched_subframe, + uint8_t thread_id, DCI_format_t dci_format, uint8_t UE_id, - PHY_VARS_eNB *phy_vars_eNB, + PHY_VARS_eNB *eNB, uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, @@ -7102,11 +7092,11 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, uint8_t harq_pid; uint32_t rb_alloc; - uint8_t transmission_mode=phy_vars_eNB->transmission_mode[UE_id]; - ANFBmode_t AckNackFBMode = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; - LTE_eNB_ULSCH_t *ulsch=phy_vars_eNB->ulsch_eNB[UE_id]; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + uint8_t transmission_mode=eNB->transmission_mode[UE_id]; + ANFBmode_t AckNackFBMode = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; + LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + int subframe = eNB->proc[thread_id].subframe_tx; uint32_t cqi_req = 0; uint32_t dai = 0; @@ -7127,11 +7117,11 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, harq_pid = subframe2harq_pid(frame_parms, pdcch_alloc2ul_frame(frame_parms, - phy_vars_eNB->proc[sched_subframe].frame_tx, + eNB->proc[thread_id].frame_tx, subframe), pdcch_alloc2ul_subframe(frame_parms,subframe)); - // printf("eNB: sched_subframe %d, subframe %d, frame_tx %d\n",sched_subframe,subframe,phy_vars_eNB->proc[sched_subframe].frame_tx); + // printf("eNB: thread_id %d, subframe %d, frame_tx %d\n",thread_id,subframe,eNB->proc[thread_id].frame_tx); switch (frame_parms->N_RB_DL) { case 6: @@ -7607,7 +7597,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, if (frame_parms->frame_type == FDD) { int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4); - if (phy_vars_eNB->dlsch_eNB[UE_id][0]->subframe_tx[dl_subframe]>0) { // we have downlink transmission + if (eNB->dlsch[UE_id][0]->subframe_tx[dl_subframe]>0) { // we have downlink transmission ulsch->harq_processes[harq_pid]->O_ACK = 1; } else { ulsch->harq_processes[harq_pid]->O_ACK = 0; @@ -7621,9 +7611,9 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1; } - ulsch->beta_offset_cqi_times8 = beta_cqi[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index];//18; - ulsch->beta_offset_ri_times8 = beta_ri[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index];//10; - ulsch->beta_offset_harqack_times8 = beta_ack[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index];//16; + ulsch->beta_offset_cqi_times8 = beta_cqi[eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index];//18; + ulsch->beta_offset_ri_times8 = beta_ri[eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index];//10; + ulsch->beta_offset_harqack_times8 = beta_ack[eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index];//16; ulsch->harq_processes[harq_pid]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1); ulsch->harq_processes[harq_pid]->srs_active = use_srs; @@ -7649,7 +7639,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d)\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift); + eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift); @@ -7716,15 +7706,15 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, } -double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) +double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id) { - uint8_t transmission_mode = phy_vars_ue->transmission_mode[eNB_id]; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - int32_t **dl_channel_est = phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id]; + uint8_t transmission_mode = ue->transmission_mode[eNB_id]; + PHY_MEASUREMENTS *meas = &ue->measurements; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int32_t **dl_channel_est = ue->common_vars.dl_ch_estimates[eNB_id]; double *s_dB; - s_dB = phy_vars_ue->sinr_CQI_dB; - // LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; + s_dB = ue->sinr_CQI_dB; + // LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; //for the calculation of SINR_eff for CQI calculation int count,a_rx,a_tx; double abs_channel=0; diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 2e8d70102f..0739d772f5 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -188,7 +188,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, #ifdef DEBUG_DLSCH_DECODING uint16_t i; #endif -#ifdef __AVX2__ + //#ifdef __AVX2__ +#if 0 int Kr_last,skipped_last=0; uint8_t (*tc_2cw)(int16_t *y, int16_t *y2, @@ -249,7 +250,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, } if (llr8_flag == 0) { -#ifdef __AVX2__ + //#ifdef __AVX2__ +#if 0 tc_2cw = phy_threegpplte_turbo_decoder16avx2; #endif tc = phy_threegpplte_turbo_decoder16; diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 19ce6b9edc..c41262727f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -78,10 +78,10 @@ unsigned char offset_mumimo_llr_drange[29][3]= {{0, 6, 5},{0, 4, 5},{0, 4, 5},{0 extern void print_shorts(char *s,int16_t *x); -int rx_pdsch(PHY_VARS_UE *phy_vars_ue, +int rx_pdsch(PHY_VARS_UE *ue, PDSCH_t type, unsigned char eNB_id, - unsigned char eNB_id_i, //if this == phy_vars_ue->n_connected_eNB, we assume MU interference + unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference uint8_t subframe, unsigned char symbol, unsigned char first_symbol_flag, @@ -90,11 +90,11 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, unsigned char harq_pid) { - LTE_UE_COMMON *lte_ue_common_vars = &phy_vars_ue->lte_ue_common_vars; - LTE_UE_PDSCH **lte_ue_pdsch_vars; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - PHY_MEASUREMENTS *phy_measurements = &phy_vars_ue->PHY_measurements; - LTE_UE_DLSCH_t **dlsch_ue; + LTE_UE_COMMON *common_vars = &ue->common_vars; + LTE_UE_PDSCH **pdsch_vars; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + PHY_MEASUREMENTS *phy_measurements = &ue->measurements; + LTE_UE_DLSCH_t **dlsch; unsigned char aatx,aarx; unsigned short nb_rb; @@ -104,26 +104,26 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, switch (type) { case SI_PDSCH: - lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]; - dlsch_ue = &phy_vars_ue->dlsch_ue_SI[eNB_id]; - dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + pdsch_vars = &ue->pdsch_vars_SI[eNB_id]; + dlsch = &ue->dlsch_SI[eNB_id]; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; break; case RA_PDSCH: - lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]; - dlsch_ue = &phy_vars_ue->dlsch_ue_ra[eNB_id]; - dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + pdsch_vars = &ue->pdsch_vars_ra[eNB_id]; + dlsch = &ue->dlsch_ra[eNB_id]; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; break; case PDSCH: - lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars[eNB_id]; - dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; - dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; - dlsch1_harq = dlsch_ue[1]->harq_processes[harq_pid]; + pdsch_vars = &ue->pdsch_vars[eNB_id]; + dlsch = ue->dlsch[eNB_id]; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; + dlsch1_harq = dlsch[1]->harq_processes[harq_pid]; break; default: - LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",phy_vars_ue->frame_rx,subframe,type); + LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->frame_rx,subframe,type); return(-1); break; } @@ -134,23 +134,23 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, return(-1); } - if (!lte_ue_common_vars) { - LOG_W(PHY,"dlsch_demodulation.c: Null lte_ue_common_vars\n"); + if (!common_vars) { + LOG_W(PHY,"dlsch_demodulation.c: Null common_vars\n"); return(-1); } - if (!dlsch_ue[0]) { - LOG_W(PHY,"dlsch_demodulation.c: Null dlsch_ue pointer\n"); + if (!dlsch[0]) { + LOG_W(PHY,"dlsch_demodulation.c: Null dlsch pointer\n"); return(-1); } - if (!lte_ue_pdsch_vars) { - LOG_W(PHY,"dlsch_demodulation.c: Null lte_ue_pdsch_vars pointer\n"); + if (!pdsch_vars) { + LOG_W(PHY,"dlsch_demodulation.c: Null pdsch_vars pointer\n"); return(-1); } if (!frame_parms) { - LOG_W(PHY,"dlsch_demodulation.c: Null lte_frame_parms\n"); + LOG_W(PHY,"dlsch_demodulation.c: Null frame_parms\n"); return(-1); } @@ -163,84 +163,84 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, if (frame_parms->nb_antennas_tx_eNB>1) { #ifdef DEBUG_DLSCH_MOD - LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch_ue[0],dlsch0_harq->rb_alloc_even[0]); + LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0],dlsch0_harq->rb_alloc_even[0]); #endif - nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + nb_rb = dlsch_extract_rbs_dual(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id]->pmi_ext, + pdsch_vars[eNB_id]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); if (dual_stream_flag==1) { - if (eNB_id_in_connected_eNB) - nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id_i], - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + if (eNB_id_in_connected_eNB) + nb_rb = dlsch_extract_rbs_dual(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id_i], + pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + pdsch_vars[eNB_id_i]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); else - nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + nb_rb = dlsch_extract_rbs_dual(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + pdsch_vars[eNB_id_i]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); } } // if n_tx>1 else { - nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + nb_rb = dlsch_extract_rbs_single(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id]->pmi_ext, + pdsch_vars[eNB_id]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); if (dual_stream_flag==1) { - if (eNB_id_in_connected_eNB) - nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id_i], - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + if (eNB_id_in_connected_eNB) + nb_rb = dlsch_extract_rbs_single(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id_i], + pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + pdsch_vars[eNB_id_i]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); - nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + nb_rb = dlsch_extract_rbs_single(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + pdsch_vars[eNB_id_i]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); } } //else n_tx>1 @@ -253,14 +253,14 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, /* // DL power control: Scaling of Channel estimates for PDSCH - dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + dlsch_scale_channel(pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, - dlsch_ue, + dlsch, symbol, nb_rb); */ if (first_symbol_flag==1) { - dlsch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, avg, symbol, @@ -281,14 +281,14 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, // avgs = cmax(avgs,avg[(aarx<<1)+aatx]); - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+1; + pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+1; // + log2_approx(frame_parms->nb_antennas_tx_eNB-1) //-1 because log2_approx counts the number of bits // + log2_approx(frame_parms->nb_antennas_rx-1); if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) && (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->dl_power_off==1)) // we are in TM 6 - lte_ue_pdsch_vars[eNB_id]->log2_maxh++; + pdsch_vars[eNB_id]->log2_maxh++; // this version here applies the factor .5 also to the extra terms. however, it does not work so well as the one above /* K = Nb_rx in TM1 @@ -301,11 +301,11 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, (dlsch0_harq->dl_power_off==1)) // we are in TM 6 K *= frame_parms->nb_antennas_tx_eNB; - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(K*avgs)/2); + pdsch_vars[eNB_id]->log2_maxh = (log2_approx(K*avgs)/2); */ #ifdef DEBUG_PHY - LOG_D(PHY,"[DLSCH] log2_maxh = %d (%d,%d)\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs); + LOG_D(PHY,"[DLSCH] log2_maxh = %d (%d,%d)\n",pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs); LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode); #endif } @@ -315,47 +315,47 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, if (dlsch0_harq->mimo_moderxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - (aatx>1) ? lte_ue_pdsch_vars[eNB_id]->rho : NULL, + dlsch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + (aatx>1) ? pdsch_vars[eNB_id]->rho : NULL, frame_parms, symbol, first_symbol_flag, dlsch0_harq->Qm, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh, phy_measurements); // log2_maxh+I0_shift #ifdef DEBUG_PHY if (symbol==5) - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); #endif if ((dual_stream_flag==1) && - (eNB_id_in_connected_eNB)) { + (eNB_id_in_connected_eNB)) { // get MF output for interfering stream - dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - (aatx>1) ? lte_ue_pdsch_vars[eNB_id_i]->rho : NULL, + dlsch_channel_compensation(pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_magb0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + (aatx>1) ? pdsch_vars[eNB_id_i]->rho : NULL, frame_parms, symbol, first_symbol_flag, i_mod, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh, phy_measurements); // log2_maxh+I0_shift #ifdef DEBUG_PHY if (symbol == 5) { - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); } #endif @@ -364,29 +364,29 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, dlsch_dual_stream_correlation(frame_parms, symbol, nb_rb, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->log2_maxh); } } else if (dlsch0_harq->mimo_mode == LARGE_CDD) { // TM3 // LOG_I(PHY,"Running PDSCH RX for TM3\n"); if (frame_parms->nb_antennas_tx_eNB == 2) { if (first_symbol_flag==1) { // effective channel of desired user is always stronger than interfering eff. channel - dlsch_channel_level_TM3(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + dlsch_channel_level_TM3(pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, avg, symbol, nb_rb); // LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->mcs>>1)-1]); avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->Qm>>1)-1]; - lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); - // printf("log2_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); + pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); + // printf("log2_maxh =%d\n",pdsch_vars[eNB_id]->log2_maxh); } dlsch_channel_compensation_TM3(frame_parms, - lte_ue_pdsch_vars[eNB_id], + pdsch_vars[eNB_id], phy_measurements, eNB_id, symbol, @@ -394,23 +394,23 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, dlsch1_harq->Qm, dlsch0_harq->round, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); + pdsch_vars[eNB_id]->log2_maxh); // compute correlation between signal and interference channels (rho12 and rho21) dlsch_dual_stream_correlation(frame_parms, symbol, nb_rb, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - &(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + &(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->log2_maxh); dlsch_dual_stream_correlation(frame_parms, symbol, nb_rb, - &(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); - //printf("TM3 log2_maxh : %d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); + &(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->log2_maxh); + //printf("TM3 log2_maxh : %d\n",pdsch_vars[eNB_id]->log2_maxh); } else { LOG_E(PHY, "only 2 tx antennas supported for TM3\n"); @@ -418,90 +418,90 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, } else if (dlsch0_harq->mimo_moden_connected_eNB)) { // TM5 two-user + if ((dual_stream_flag==1) && (eNB_id_i==ue->n_connected_eNB)) { // TM5 two-user // Scale the channel estimates for interfering stream - dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + dlsch_scale_channel(pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, frame_parms, - dlsch_ue, + dlsch, symbol, nb_rb); /* compute new log2_maxh for effective channel */ if (first_symbol_flag==1) { // effective channel of desired user is always stronger than interfering eff. channel - dlsch_channel_level_TM56(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, lte_ue_pdsch_vars[eNB_id]->pmi_ext, avg, symbol, nb_rb); + dlsch_channel_level_TM56(pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, pdsch_vars[eNB_id]->pmi_ext, avg, symbol, nb_rb); // LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]); avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]; - lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); - //printf("log1_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); + pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); + //printf("log1_maxh =%d\n",pdsch_vars[eNB_id]->log2_maxh); } - dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->pmi_ext, + dlsch_channel_compensation_TM56(pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->pmi_ext, frame_parms, phy_measurements, eNB_id, symbol, dlsch0_harq->Qm, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh, dlsch0_harq->dl_power_off); // if interference source is MU interference, assume opposite precoder was used at eNB // calculate opposite PMI for (rb=0; rbpmi_ext[rb]) { + switch(pdsch_vars[eNB_id]->pmi_ext[rb]) { case 0: - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=1; + pdsch_vars[eNB_id_i]->pmi_ext[rb]=1; break; case 1: - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=0; + pdsch_vars[eNB_id_i]->pmi_ext[rb]=0; break; case 2: - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=3; + pdsch_vars[eNB_id_i]->pmi_ext[rb]=3; break; case 3: - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=2; + pdsch_vars[eNB_id_i]->pmi_ext[rb]=2; break; } // if (rb==0) - // printf("pmi %d, pmi_i %d\n",lte_ue_pdsch_vars[eNB_id]->pmi_ext[rb],lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]); + // printf("pmi %d, pmi_i %d\n",pdsch_vars[eNB_id]->pmi_ext[rb],pdsch_vars[eNB_id_i]->pmi_ext[rb]); } - dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + dlsch_channel_compensation_TM56(pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_magb0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->pmi_ext, frame_parms, phy_measurements, eNB_id_i, symbol, i_mod, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh, dlsch0_harq->dl_power_off); #ifdef DEBUG_PHY if (symbol==5) { - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); } #endif @@ -509,25 +509,25 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, dlsch_dual_stream_correlation(frame_parms, symbol, nb_rb, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->log2_maxh); } else { - dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->pmi_ext, + dlsch_channel_compensation_TM56(pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->pmi_ext, frame_parms, phy_measurements, eNB_id, symbol, dlsch0_harq->Qm, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh, 1); } } @@ -537,14 +537,14 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, if (dlsch0_harq->mimo_mode == LARGE_CDD) { if (frame_parms->nb_antennas_tx_eNB == 2) { dlsch_detection_mrc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->rho, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb1, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->rho, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->dl_ch_mag1, + pdsch_vars[eNB_id]->dl_ch_magb1, symbol, nb_rb, dual_stream_flag); @@ -552,14 +552,14 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, } else { dlsch_detection_mrc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rho, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->rho, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_magb0, symbol, nb_rb, dual_stream_flag); @@ -573,17 +573,17 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, /* dlsch_siso(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, + pdsch_vars[eNB_id]->rxdataF_comp, + pdsch_vars[eNB_id_i]->rxdataF_comp, symbol, nb_rb); */ } else if (dlsch0_harq->mimo_mode == ALAMOUTI) { dlsch_alamouti(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, symbol, nb_rb); @@ -603,40 +603,40 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, if (dlsch0_harq->mimo_mode != LARGE_CDD) { if (dual_stream_flag == 0) dlsch_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); else if (i_mod == 2) { dlsch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else if (i_mod == 4) { dlsch_qpsk_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else { dlsch_qpsk_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } } else { // TM3 @@ -644,48 +644,48 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, if (dlsch1_harq->Qm == 2) { /* dlsch_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); */ dlsch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); dlsch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext, - lte_ue_pdsch_vars[eNB_id]->llr[1], + pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[1], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream); + pdsch_vars[eNB_id]->llr128_2ndstream); } else if (dlsch1_harq->Qm == 4) { dlsch_qpsk_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], + pdsch_vars[eNB_id]->dl_ch_mag1, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else { dlsch_qpsk_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], + pdsch_vars[eNB_id]->dl_ch_mag1, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } } @@ -695,44 +695,44 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, case 4 : if (dual_stream_flag == 0) { dlsch_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->dl_ch_mag0, symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else if (i_mod == 2) { dlsch_16qam_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else if (i_mod == 4) { dlsch_16qam_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else { dlsch_16qam_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } break; @@ -740,46 +740,46 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, case 6 : if (dual_stream_flag == 0) { dlsch_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else if (i_mod == 2) { dlsch_64qam_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else if (i_mod == 4) { dlsch_64qam_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } else { dlsch_64qam_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext, + pdsch_vars[eNB_id]->llr[0], symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); } break; @@ -1843,8 +1843,8 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, } void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, - LTE_UE_PDSCH *lte_ue_pdsch_vars, - PHY_MEASUREMENTS *phy_measurements, + LTE_UE_PDSCH *pdsch_vars, + PHY_MEASUREMENTS *measurements, int eNB_id, unsigned char symbol, unsigned char mod_order0, @@ -1861,14 +1861,14 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, unsigned char aarx=0,symbol_mod,pilots=0; int precoded_signal_strength0=0,precoded_signal_strength1=0; - int **rxdataF_ext = lte_ue_pdsch_vars->rxdataF_ext; - int **dl_ch_estimates_ext = lte_ue_pdsch_vars->dl_ch_estimates_ext; - int **dl_ch_mag0 = lte_ue_pdsch_vars->dl_ch_mag0; - int **dl_ch_mag1 = lte_ue_pdsch_vars->dl_ch_mag1; - int **dl_ch_magb0 = lte_ue_pdsch_vars->dl_ch_magb0; - int **dl_ch_magb1 = lte_ue_pdsch_vars->dl_ch_magb1; - int **rxdataF_comp0 = lte_ue_pdsch_vars->rxdataF_comp0; - int **rxdataF_comp1 = lte_ue_pdsch_vars->rxdataF_comp1[round]; //? + int **rxdataF_ext = pdsch_vars->rxdataF_ext; + int **dl_ch_estimates_ext = pdsch_vars->dl_ch_estimates_ext; + int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0; + int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1; + int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0; + int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1; + int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; + int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[round]; //? __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b; @@ -2178,16 +2178,16 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, Nre = (pilots==0) ? 12 : 8; precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + (nb_rb*Nre))) - (measurements->n0_power[aarx])); precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + (nb_rb*Nre))) - (measurements->n0_power[aarx])); - phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,phy_measurements->n0_power_tot); - phy_measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,phy_measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,measurements->n0_power_tot); //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, - // phy_measurements->precoded_cqi_dB[eNB_id][0]); + // measurements->precoded_cqi_dB[eNB_id][0]); _mm_empty(); _m_empty(); @@ -2206,14 +2206,14 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, int16x8_t QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b; int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift); - int **rxdataF_ext = lte_ue_pdsch_vars->rxdataF_ext; - int **dl_ch_estimates_ext = lte_ue_pdsch_vars->dl_ch_estimates_ext; - int **dl_ch_mag0 = lte_ue_pdsch_vars->dl_ch_mag0; - int **dl_ch_mag1 = lte_ue_pdsch_vars->dl_ch_mag1; - int **dl_ch_magb0 = lte_ue_pdsch_vars->dl_ch_magb0; - int **dl_ch_magb1 = lte_ue_pdsch_vars->dl_ch_magb1; - int **rxdataF_comp0 = lte_ue_pdsch_vars->rxdataF_comp0; - int **rxdataF_comp1 = lte_ue_pdsch_vars->rxdataF_comp1[round]; //? + int **rxdataF_ext = pdsch_vars->rxdataF_ext; + int **dl_ch_estimates_ext = pdsch_vars->dl_ch_estimates_ext; + int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0; + int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1; + int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0; + int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1; + int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; + int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[round]; //? int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1}; @@ -2461,14 +2461,14 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, Nre = (pilots==0) ? 12 : 8; precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + (nb_rb*Nre))) - (measurements->n0_power[aarx])); precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + (nb_rb*Nre))) - (measurements->n0_power[aarx])); - phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,phy_measurements->n0_power_tot); - phy_measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,phy_measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,measurements->n0_power_tot); #endif } @@ -2717,7 +2717,7 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, void dlsch_scale_channel(int **dl_ch_estimates_ext, LTE_DL_FRAME_PARMS *frame_parms, - LTE_UE_DLSCH_t **dlsch_ue, + LTE_UE_DLSCH_t **dlsch, uint8_t symbol, unsigned short nb_rb) { @@ -2738,7 +2738,7 @@ void dlsch_scale_channel(int **dl_ch_estimates_ext, } // Determine scaling amplitude based the symbol - ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a)); + ch_amp = ((pilots) ? (dlsch[0]->sqrt_rho_b) : (dlsch[0]->sqrt_rho_a)); // LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp); @@ -4197,74 +4197,74 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, #ifdef USER_MODE -void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round) +void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round) { - unsigned int nsymb = (phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12; + unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12; char fname[32],vname[32]; - int N_RB_DL=phy_vars_ue->lte_frame_parms.N_RB_DL; + int N_RB_DL=ue->frame_parms.N_RB_DL; sprintf(fname,"dlsch%d_rxF_r%d_ext0.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_ext0",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1); - if (phy_vars_ue->lte_frame_parms.nb_antennas_rx >1) { + if (ue->frame_parms.nb_antennas_rx >1) { sprintf(fname,"dlsch%d_rxF_r%d_ext1.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_ext1",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1); } sprintf(fname,"dlsch%d_ch_r%d_ext00.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext00",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); - if (phy_vars_ue->lte_frame_parms.nb_antennas_rx == 2) { + if (ue->frame_parms.nb_antennas_rx == 2) { sprintf(fname,"dlsch%d_ch_r%d_ext01.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext01",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); } - if (phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB == 2) { + if (ue->frame_parms.nb_antennas_tx_eNB == 2) { sprintf(fname,"dlsch%d_ch_r%d_ext10.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext10",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); - if (phy_vars_ue->lte_frame_parms.nb_antennas_rx == 2) { + if (ue->frame_parms.nb_antennas_rx == 2) { sprintf(fname,"dlsch%d_ch_r%d_ext11.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext11",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); } } /* - write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); - write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); - write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); + write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); + write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); + write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); */ sprintf(fname,"dlsch%d_r%d_rho.m",eNB_id,round); sprintf(vname,"dl_rho_r%d_%d",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_rho_ext[0],12*N_RB_DL*nsymb,1,1); sprintf(fname,"dlsch%d_rxF_r%d_comp0.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_comp0",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1); - if (phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB == 2) { + write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1); + if (ue->frame_parms.nb_antennas_tx_eNB == 2) { sprintf(fname,"dlsch%d_rxF_r%d_comp1.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_comp1",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[0][round],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->rxdataF_comp1[0][round],12*N_RB_DL*nsymb,1,1); } sprintf(fname,"dlsch%d_rxF_r%d_llr.m",eNB_id,round); sprintf(vname,"dl%d_r%d_llr",eNB_id,round); - write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],coded_bits_per_codeword,1,0); + write_output(fname,vname, ue->pdsch_vars[eNB_id]->llr[0],coded_bits_per_codeword,1,0); sprintf(fname,"dlsch%d_r%d_mag1.m",eNB_id,round); sprintf(vname,"dl%d_r%d_mag1",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1); sprintf(fname,"dlsch%d_r%d_mag2.m",eNB_id,round); sprintf(vname,"dl%d_r%d_mag2",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1); - // printf("log2_maxh = %d\n",phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->log2_maxh); + // printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh); } #endif diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c index 097bcdd691..2d3b9d3b23 100644 --- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c @@ -42,7 +42,7 @@ #include "PHY/sse_intrin.h" //#define DEBUG_DRS -int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, +int generate_drs_pusch(PHY_VARS_UE *ue, uint8_t eNB_id, short amp, unsigned int subframe, @@ -62,26 +62,26 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, int16_t alpha_im[12] = {0, 16383, 28377, 32767, 28377, 16383, 0,-16384,-28378,-32768,-28378,-16384}; uint8_t cyclic_shift,cyclic_shift0,cyclic_shift1; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - int32_t *txdataF = phy_vars_ue->lte_ue_common_vars.txdataF[ant]; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int32_t *txdataF = ue->common_vars.txdataF[ant]; uint32_t u,v,alpha_ind; uint32_t u0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]; uint32_t u1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]; uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; int32_t ref_re,ref_im; - uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_ue->frame_tx,subframe); + uint8_t harq_pid = subframe2harq_pid(frame_parms,ue->frame_tx,subframe); cyclic_shift0 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + - phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]+ - ((phy_vars_ue->ulsch_ue[0]->cooperation_flag==2)?10:0)+ + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]+ + ((ue->ulsch[0]->cooperation_flag==2)?10:0)+ ant*6) % 12; - // printf("PUSCH.cyclicShift %d, n_DMRS2 %d, nPRS %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,phy_vars_ue->ulsch_ue[eNB_id]->n_DMRS2,phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]); + // printf("PUSCH.cyclicShift %d, n_DMRS2 %d, nPRS %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,ue->ulsch[eNB_id]->n_DMRS2,ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]); cyclic_shift1 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + - phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+1]+ - ((phy_vars_ue->ulsch_ue[0]->cooperation_flag==2)?10:0)+ + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+1]+ + ((ue->ulsch[0]->cooperation_flag==2)?10:0)+ ant*6) % 12; // cyclic_shift0 = 0; diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 5a8463a861..673b7a4348 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -44,101 +44,98 @@ #include "SCHED/extern.h" #include "defs.h" #include "extern.h" -#ifdef EXMIMO -#include "gain_control.h" -#endif -#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR) + #include "common_lib.h" extern openair0_config_t openair0_cfg[]; -#endif -#define DEBUG_INITIAL_SYNCH -int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) +//#define DEBUG_INITIAL_SYNCH + +int pbch_detection(PHY_VARS_UE *ue, runmode_t mode) { -uint8_t l,pbch_decoded,frame_mod4,pbch_tx_ant,dummy; -LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; -char phich_resource[6]; - + uint8_t l,pbch_decoded,frame_mod4,pbch_tx_ant,dummy; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + char phich_resource[6]; + #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",phy_vars_ue->Mod_id, - phy_vars_ue->rx_offset); + LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id, + ue->rx_offset); #endif for (l=0; lsymbols_per_tti/2; l++) { - slot_fep(phy_vars_ue, + slot_fep(ue, l, 0, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); } for (l=0; lsymbols_per_tti/2; l++) { - slot_fep(phy_vars_ue, + slot_fep(ue, l, 1, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); } - slot_fep(phy_vars_ue, + slot_fep(ue, 0, 2, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); - lte_ue_measurements(phy_vars_ue, - phy_vars_ue->rx_offset, + lte_ue_measurements(ue, + ue->rx_offset, 0, 0); - if (phy_vars_ue->lte_frame_parms.frame_type == TDD) { - ue_rrc_measurements(phy_vars_ue, + if (ue->frame_parms.frame_type == TDD) { + ue_rrc_measurements(ue, 1, 0); } else { - ue_rrc_measurements(phy_vars_ue, + ue_rrc_measurements(ue, 0, 0); } #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE %d] RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n", - phy_vars_ue->Mod_id, - phy_vars_ue->PHY_measurements.rx_rssi_dBm[0] - ((phy_vars_ue->lte_frame_parms.nb_antennas_rx==2) ? 3 : 0), - phy_vars_ue->PHY_measurements.rx_power_dB[0][0], - phy_vars_ue->PHY_measurements.rx_power_dB[0][1], - phy_vars_ue->PHY_measurements.rx_power[0][0], - phy_vars_ue->PHY_measurements.rx_power[0][1], - phy_vars_ue->PHY_measurements.rx_power_avg_dB[0], - phy_vars_ue->PHY_measurements.rx_power_avg[0], - phy_vars_ue->rx_total_gain_dB); + ue->Mod_id, + ue->measurements.rx_rssi_dBm[0] - ((ue->frame_parms.nb_antennas_rx==2) ? 3 : 0), + ue->measurements.rx_power_dB[0][0], + ue->measurements.rx_power_dB[0][1], + ue->measurements.rx_power[0][0], + ue->measurements.rx_power[0][1], + ue->measurements.rx_power_avg_dB[0], + ue->measurements.rx_power_avg[0], + ue->rx_total_gain_dB); LOG_I(PHY,"[UE %d] N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->PHY_measurements.n0_power_tot_dBm, - phy_vars_ue->PHY_measurements.n0_power_dB[0], - phy_vars_ue->PHY_measurements.n0_power_dB[1], - phy_vars_ue->PHY_measurements.n0_power[0], - phy_vars_ue->PHY_measurements.n0_power[1], - phy_vars_ue->PHY_measurements.n0_power_avg_dB, - phy_vars_ue->PHY_measurements.n0_power_avg); + ue->Mod_id, + ue->measurements.n0_power_tot_dBm, + ue->measurements.n0_power_dB[0], + ue->measurements.n0_power_dB[1], + ue->measurements.n0_power[0], + ue->measurements.n0_power[1], + ue->measurements.n0_power_avg_dB, + ue->measurements.n0_power_avg); #endif pbch_decoded = 0; for (frame_mod4=0; frame_mod4<4; frame_mod4++) { - pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars, - phy_vars_ue->lte_ue_pbch_vars[0], + pbch_tx_ant = rx_pbch(&ue->common_vars, + ue->pbch_vars[0], frame_parms, 0, SISO, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) { @@ -146,12 +143,12 @@ char phich_resource[6]; break; } - pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars, - phy_vars_ue->lte_ue_pbch_vars[0], + pbch_tx_ant = rx_pbch(&ue->common_vars, + ue->pbch_vars[0], frame_parms, 0, ALAMOUTI, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) { @@ -171,12 +168,12 @@ char phich_resource[6]; // flip byte endian on 24-bits for MIB - // dummy = phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[0]; - // phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[0] = phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]; - // phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2] = dummy; + // dummy = ue->pbch_vars[0]->decoded_output[0]; + // ue->pbch_vars[0]->decoded_output[0] = ue->pbch_vars[0]->decoded_output[2]; + // ue->pbch_vars[0]->decoded_output[2] = dummy; // now check for Bandwidth of Cell - dummy = (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>5)&7; + dummy = (ue->pbch_vars[0]->decoded_output[2]>>5)&7; switch (dummy) { @@ -205,15 +202,15 @@ char phich_resource[6]; break; default: - LOG_E(PHY,"[UE%d] Initial sync: PBCH decoding: Unknown N_RB_DL\n",phy_vars_ue->Mod_id); + LOG_E(PHY,"[UE%d] Initial sync: PBCH decoding: Unknown N_RB_DL\n",ue->Mod_id); return -1; break; } // now check for PHICH parameters - frame_parms->phich_config_common.phich_duration = (PHICH_DURATION_t)((phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>4)&1); - dummy = (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>2)&3; + frame_parms->phich_config_common.phich_duration = (PHICH_DURATION_t)((ue->pbch_vars[0]->decoded_output[2]>>4)&1); + dummy = (ue->pbch_vars[0]->decoded_output[2]>>2)&3; switch (dummy) { case 0: @@ -237,25 +234,25 @@ char phich_resource[6]; break; default: - LOG_E(PHY,"[UE%d] Initial sync: Unknown PHICH_DURATION\n",phy_vars_ue->Mod_id); + LOG_E(PHY,"[UE%d] Initial sync: Unknown PHICH_DURATION\n",ue->Mod_id); return -1; break; } - phy_vars_ue->frame_rx = (((phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]&3)<<6) + (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[1]>>2))<<2; - phy_vars_ue->frame_rx += frame_mod4; + ue->frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2; + ue->frame_rx += frame_mod4; #ifndef USER_MODE // one frame delay - phy_vars_ue->frame_rx ++; + ue->frame_rx ++; #endif - phy_vars_ue->frame_tx = phy_vars_ue->frame_rx; + ue->frame_tx = ue->frame_rx; #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully mode1_flag %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_parms->mode1_flag, pbch_tx_ant, - phy_vars_ue->frame_rx, + ue->frame_rx, frame_parms->N_RB_DL, frame_parms->phich_config_common.phich_duration, phich_resource); //frame_parms->phich_config_common.phich_resource); @@ -271,7 +268,7 @@ char phich_string[13][4] = {"","1/6","","1/2","","","one","","","","","","two"}; char duplex_string[2][4] = {"FDD","TDD"}; char prefix_string[2][9] = {"NORMAL","EXTENDED"}; -int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) +int initial_sync(PHY_VARS_UE *ue, runmode_t mode) { int32_t sync_pos,sync_pos2,sync_pos_slot; @@ -279,7 +276,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) uint8_t phase_fdd_ncp,phase_fdd_ecp,phase_tdd_ncp,phase_tdd_ecp; uint8_t flip_fdd_ncp,flip_fdd_ecp,flip_tdd_ncp,flip_tdd_ecp; // uint16_t Nid_cell_fdd_ncp=0,Nid_cell_fdd_ecp=0,Nid_cell_tdd_ncp=0,Nid_cell_tdd_ecp=0; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; int ret=-1; int aarx,rx_power=0; /*#ifdef OAI_USRP @@ -291,21 +288,21 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) frame_parms->frame_type=FDD; init_frame_parms(frame_parms,1); /* - write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + write_output("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); exit(-1); */ - sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata, + sync_pos = lte_sync_time(ue->common_vars.rxdata, frame_parms, - (int *)&phy_vars_ue->lte_ue_common_vars.eNb_id); + (int *)&ue->common_vars.eNb_id); - // write_output("rxdata1.m","rxd1",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + // write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); if (sync_pos >= frame_parms->nb_prefix_samples) sync_pos2 = sync_pos - frame_parms->nb_prefix_samples; else sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples; #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id); + LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id); #endif // SSS detection @@ -314,25 +311,25 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - frame_parms->nb_prefix_samples; if (sync_pos2 >= sync_pos_slot) - phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot; + ue->rx_offset = sync_pos2 - sync_pos_slot; else - phy_vars_ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot; + ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot; if (((sync_pos2 - sync_pos_slot) >=0 ) && ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) { #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"Calling sss detection (FDD normal CP)\n"); #endif - rx_sss(phy_vars_ue,&metric_fdd_ncp,&flip_fdd_ncp,&phase_fdd_ncp); + rx_sss(ue,&metric_fdd_ncp,&flip_fdd_ncp,&phase_fdd_ncp); frame_parms->nushift = frame_parms->Nid_cell%6; if (flip_fdd_ncp==1) - phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); + ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); - init_frame_parms(&phy_vars_ue->lte_frame_parms,1); - lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); - ret = pbch_detection(phy_vars_ue,mode); - // write_output("rxdata2.m","rxd2",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + init_frame_parms(&ue->frame_parms,1); + lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell); + ret = pbch_detection(ue,mode); + // write_output("rxdata2.m","rxd2",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"FDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", @@ -361,25 +358,25 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - (frame_parms->nb_prefix_samples); if (sync_pos2 >= sync_pos_slot) - phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot; + ue->rx_offset = sync_pos2 - sync_pos_slot; else - phy_vars_ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot; + ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot; - //msg("nb_prefix_samples %d, rx_offset %d\n",frame_parms->nb_prefix_samples,phy_vars_ue->rx_offset); + //msg("nb_prefix_samples %d, rx_offset %d\n",frame_parms->nb_prefix_samples,ue->rx_offset); if (((sync_pos2 - sync_pos_slot) >=0 ) && ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) { - rx_sss(phy_vars_ue,&metric_fdd_ecp,&flip_fdd_ecp,&phase_fdd_ecp); + rx_sss(ue,&metric_fdd_ecp,&flip_fdd_ecp,&phase_fdd_ecp); frame_parms->nushift = frame_parms->Nid_cell%6; if (flip_fdd_ecp==1) - phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); + ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); - init_frame_parms(&phy_vars_ue->lte_frame_parms,1); - lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); - ret = pbch_detection(phy_vars_ue,mode); - // write_output("rxdata3.m","rxd3",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + init_frame_parms(&ue->frame_parms,1); + lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell); + ret = pbch_detection(ue,mode); + // write_output("rxdata3.m","rxd3",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"FDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", frame_parms->Nid_cell,metric_fdd_ecp,phase_fdd_ecp,flip_fdd_ecp,ret); @@ -408,37 +405,26 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) (frame_parms->nb_prefix_samples); if (sync_pos2 >= sync_pos_slot) - phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot; + ue->rx_offset = sync_pos2 - sync_pos_slot; else - phy_vars_ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot; + ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot; - /*if (((sync_pos2 - sync_pos_slot) >=0 ) && - ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {*/ - - - rx_sss(phy_vars_ue,&metric_tdd_ncp,&flip_tdd_ncp,&phase_tdd_ncp); + rx_sss(ue,&metric_tdd_ncp,&flip_tdd_ncp,&phase_tdd_ncp); if (flip_tdd_ncp==1) - phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); + ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); frame_parms->nushift = frame_parms->Nid_cell%6; - init_frame_parms(&phy_vars_ue->lte_frame_parms,1); + init_frame_parms(&ue->frame_parms,1); - lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); - ret = pbch_detection(phy_vars_ue,mode); - // write_output("rxdata4.m","rxd4",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell); + ret = pbch_detection(ue,mode); + // write_output("rxdata4.m","rxd4",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"TDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", frame_parms->Nid_cell,metric_tdd_ncp,phase_tdd_ncp,flip_tdd_ncp,ret); #endif - /*} - else { - #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"TDD Normal prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot); - #endif - }*/ - if (ret==-1) { // Now TDD extended prefix @@ -456,35 +442,25 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) sync_pos_slot = frame_parms->samples_per_tti + (frame_parms->ofdm_symbol_size<<1) + (frame_parms->nb_prefix_samples<<1); if (sync_pos2 >= sync_pos_slot) - phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot; + ue->rx_offset = sync_pos2 - sync_pos_slot; else - phy_vars_ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot; + ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot; - /*if (((sync_pos2 - sync_pos_slot) >=0 ) && - ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {*/ - - rx_sss(phy_vars_ue,&metric_tdd_ecp,&flip_tdd_ecp,&phase_tdd_ecp); + rx_sss(ue,&metric_tdd_ecp,&flip_tdd_ecp,&phase_tdd_ecp); frame_parms->nushift = frame_parms->Nid_cell%6; if (flip_tdd_ecp==1) - phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); + ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); - init_frame_parms(&phy_vars_ue->lte_frame_parms,1); - lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); - ret = pbch_detection(phy_vars_ue,mode); + init_frame_parms(&ue->frame_parms,1); + lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell); + ret = pbch_detection(ue,mode); - // write_output("rxdata5.m","rxd5",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + // write_output("rxdata5.m","rxd5",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"TDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", frame_parms->Nid_cell,metric_tdd_ecp,phase_tdd_ecp,flip_tdd_ecp,ret); #endif - /*} - else { - #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"TDD Extended prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot); - #endif - }*/ - } } } @@ -492,74 +468,73 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] In synch, rx_offset %d samples\n",phy_vars_ue->Mod_id, phy_vars_ue->rx_offset); + LOG_I(PHY,"[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset); #endif - if (phy_vars_ue->UE_scan_carrier == 0) { - if (phy_vars_ue->mac_enabled==1) { - LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id); + if (ue->UE_scan_carrier == 0) { + if (ue->mac_enabled==1) { + LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id); //mac_resynch(); - mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id); - phy_vars_ue->UE_mode[0] = PRACH; + mac_xface->dl_phy_sync_success(ue->Mod_id,ue->frame_rx,0,1);//ue->common_vars.eNb_id); + ue->UE_mode[0] = PRACH; } else { - phy_vars_ue->UE_mode[0] = PUSCH; + ue->UE_mode[0] = PUSCH; } generate_pcfich_reg_mapping(frame_parms); generate_phich_reg_mapping(frame_parms); - // init_prach625(frame_parms); - //phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors=0; - phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq=0; - //phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=0; + + ue->pbch_vars[0]->pdu_errors_conseq=0; + } - LOG_I(PHY,"[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx, - 10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB, - 10*log10(phy_vars_ue->PHY_measurements.rssi), - phy_vars_ue->rx_total_gain_dB, - phy_vars_ue->PHY_measurements.n0_power_tot_dBm, - 10*log10(phy_vars_ue->PHY_measurements.rsrp[0])-phy_vars_ue->rx_total_gain_dB, - (10*log10(phy_vars_ue->PHY_measurements.rsrq[0]))); + LOG_I(PHY,"[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id, + ue->frame_rx, + 10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rssi), + ue->rx_total_gain_dB, + ue->measurements.n0_power_tot_dBm, + 10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB, + (10*log10(ue->measurements.rsrq[0]))); LOG_I(PHY,"[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx, - duplex_string[phy_vars_ue->lte_frame_parms.frame_type], - prefix_string[phy_vars_ue->lte_frame_parms.Ncp], - phy_vars_ue->lte_frame_parms.Nid_cell, - phy_vars_ue->lte_frame_parms.N_RB_DL, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration, - phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource], - phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB); -#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR) + ue->Mod_id, + ue->frame_rx, + duplex_string[ue->frame_parms.frame_type], + prefix_string[ue->frame_parms.Ncp], + ue->frame_parms.Nid_cell, + ue->frame_parms.N_RB_DL, + ue->frame_parms.phich_config_common.phich_duration, + phich_string[ue->frame_parms.phich_config_common.phich_resource], + ue->frame_parms.nb_antennas_tx_eNB); + LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx, - openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset, - phy_vars_ue->lte_ue_common_vars.freq_offset); -#endif + ue->Mod_id, + ue->frame_rx, + openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset, + ue->common_vars.freq_offset); + } else { #ifdef DEBUG_INITIAL_SYNC - LOG_I(PHY,"[UE%d] Initial sync : PBCH not ok\n",phy_vars_ue->Mod_id); - LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id); + LOG_I(PHY,"[UE%d] Initial sync : PBCH not ok\n",ue->Mod_id); + LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id); /* LOG_I(PHY,"[UE%d] Initial sync: (metric fdd_ncp %d (%d), metric fdd_ecp %d (%d), metric_tdd_ncp %d (%d), metric_tdd_ecp %d (%d))\n", - phy_vars_ue->Mod_id, + ue->Mod_id, metric_fdd_ncp,Nid_cell_fdd_ncp, metric_fdd_ecp,Nid_cell_fdd_ecp, metric_tdd_ncp,Nid_cell_tdd_ncp, metric_tdd_ecp,Nid_cell_tdd_ecp);*/ - LOG_I(PHY,"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d\n",phy_vars_ue->Mod_id, + LOG_I(PHY,"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d\n",ue->Mod_id, frame_parms->Nid_cell,frame_parms->frame_type); #endif - phy_vars_ue->UE_mode[0] = NOT_SYNCHED; - phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors; - phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors++; - phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq++; + ue->UE_mode[0] = NOT_SYNCHED; + ue->pbch_vars[0]->pdu_errors_last=ue->pbch_vars[0]->pdu_errors; + ue->pbch_vars[0]->pdu_errors++; + ue->pbch_vars[0]->pdu_errors_conseq++; } @@ -569,57 +544,44 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) // do a measurement on the best guess of the PSS for (aarx=0; aarxnb_antennas_rx; aarx++) - rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][sync_pos2], + rx_power += signal_energy(&ue->common_vars.rxdata[aarx][sync_pos2], frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples); /* // do a measurement on the full frame for (aarx=0; aarxnb_antennas_rx; aarx++) - rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][0], + rx_power += signal_energy(&ue->common_vars.rxdata[aarx][0], frame_parms->samples_per_tti*10); */ // we might add a low-pass filter here later - phy_vars_ue->PHY_measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx; + ue->measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx; - phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(phy_vars_ue->PHY_measurements.rx_power_avg[0]); + ue->measurements.rx_power_avg_dB[0] = dB_fixed(ue->measurements.rx_power_avg[0]); #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] ); + LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",ue->Mod_id,ue->measurements.rx_power_avg_dB[0] ); #endif -#ifdef EXMIMO - if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && - (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) - //phy_adjust_gain(phy_vars_ue,0); - gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0); - -#else #ifndef OAI_USRP #ifndef OAI_BLADERF #ifndef OAI_LMSSDR - phy_adjust_gain(phy_vars_ue,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0); -#endif + phy_adjust_gain(ue,ue->measurements.rx_power_avg_dB[0],0); #endif #endif #endif + } else { -#ifdef EXMIMO - if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && - (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) - //phy_adjust_gain(phy_vars_ue,0); - gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); -#else #ifndef OAI_USRP #ifndef OAI_BLADERF #ifndef OAI_LMSSDR - phy_adjust_gain(phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); -#endif + phy_adjust_gain(ue,dB_fixed(ue->measurements.rssi),0); #endif #endif #endif + } // exit_fun("debug exit"); diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 8b3a6c8758..e46fb1756a 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1052,18 +1052,18 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, // This routine demodulates the PHICH and updates PUSCH/ULSCH parameters -void rx_phich(PHY_VARS_UE *phy_vars_ue, +void rx_phich(PHY_VARS_UE *ue, uint8_t subframe, uint8_t eNB_id) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - LTE_UE_PDCCH **lte_ue_pdcch_vars = phy_vars_ue->lte_ue_pdcch_vars; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars; // uint8_t HI; - uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,phy_vars_ue->frame_rx,subframe); - LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; + uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,ue->frame_rx,subframe); + LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; int16_t phich_d[24],*phich_d_ptr,HI16; // unsigned int i,aa; int8_t d[24],*dp; @@ -1074,16 +1074,16 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, uint8_t reset = 1; int16_t cs[12]; uint32_t i,i2,i3,phich_quad; - int32_t **rxdataF_comp = lte_ue_pdcch_vars[eNB_id]->rxdataF_comp; + int32_t **rxdataF_comp = pdcch_vars[eNB_id]->rxdataF_comp; uint8_t Ngroup_PHICH,ngroup_PHICH,nseq_PHICH; uint8_t NSF_PHICH = 4; uint8_t pusch_subframe; // check if we're expecting a PHICH in this subframe - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe); + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,ue->frame_rx,subframe); if (ulsch->harq_processes[harq_pid]->status == ACTIVE) { - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe); + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,ue->frame_rx,subframe); Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48; if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0) @@ -1344,35 +1344,35 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, #endif if (HI16>0) { //NACK - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) { + if (ue->ulsch_Msg3_active[eNB_id] == 1) { LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received NAK (%d) nseq %d, ngroup %d\n", - phy_vars_ue->Mod_id,harq_pid, - phy_vars_ue->frame_rx, + ue->Mod_id,harq_pid, + ue->frame_rx, subframe, HI16, nseq_PHICH, ngroup_PHICH); - get_Msg3_alloc_ret(&phy_vars_ue->lte_frame_parms, + get_Msg3_alloc_ret(&ue->frame_parms, subframe, - phy_vars_ue->frame_rx, - &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); + ue->frame_rx, + &ue->ulsch_Msg3_frame[eNB_id], + &ue->ulsch_Msg3_subframe[eNB_id]); ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; // ulsch->harq_processes[harq_pid]->Ndi = 0; ulsch->harq_processes[harq_pid]->round++; ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3]; - if (ulsch->harq_processes[harq_pid]->round>=phy_vars_ue->lte_frame_parms.maxHARQ_Msg3Tx) { + if (ulsch->harq_processes[harq_pid]->round>=ue->frame_parms.maxHARQ_Msg3Tx) { ulsch->harq_processes[harq_pid]->subframe_scheduling_flag =0; ulsch->harq_processes[harq_pid]->status = IDLE; // inform MAC that Msg3 transmission has failed - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; + ue->ulsch_Msg3_active[eNB_id] = 0; } } else { //#ifdef DEBUG_PHICH LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d\n", - phy_vars_ue->Mod_id,harq_pid, - phy_vars_ue->frame_rx, + ue->Mod_id,harq_pid, + ue->frame_rx, subframe, HI16, nseq_PHICH, @@ -1389,18 +1389,18 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, } else { //ACK - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) { + if (ue->ulsch_Msg3_active[eNB_id] == 1) { LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received ACK (%d) nseq %d, ngroup %d\n\n", - phy_vars_ue->Mod_id,harq_pid, - phy_vars_ue->frame_rx, + ue->Mod_id,harq_pid, + ue->frame_rx, subframe, HI16, nseq_PHICH,ngroup_PHICH); } else { //#ifdef PHICH_DEBUG LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n", - phy_vars_ue->Mod_id,harq_pid, - phy_vars_ue->frame_rx, + ue->Mod_id,harq_pid, + ue->frame_rx, subframe, HI16, nseq_PHICH,ngroup_PHICH); //#endif @@ -1410,29 +1410,29 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, ulsch->harq_processes[harq_pid]->status = IDLE; ulsch->harq_processes[harq_pid]->round = 0; // inform MAC? - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; + ue->ulsch_Msg3_active[eNB_id] = 0; } } -void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, - unsigned char sched_subframe, +void generate_phich_top(PHY_VARS_eNB *eNB, + unsigned char thread_id, int16_t amp, uint8_t sect_id, uint8_t abstraction_flag) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; - LTE_eNB_ULSCH_t **ulsch_eNB = phy_vars_eNB->ulsch_eNB; - int32_t **txdataF = phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id]; + LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms; + LTE_eNB_ULSCH_t **ulsch = eNB->ulsch; + int32_t **txdataF = eNB->common_vars.txdataF[sect_id]; uint8_t harq_pid; uint8_t Ngroup_PHICH,ngroup_PHICH,nseq_PHICH; uint8_t NSF_PHICH = 4; uint8_t pusch_subframe; uint8_t UE_id; uint32_t pusch_frame; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + int subframe = eNB->proc[thread_id].subframe_tx; // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211 @@ -1444,19 +1444,19 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, if (frame_parms->Ncp == 1) NSF_PHICH = 2; - pusch_frame = phich_frame2_pusch_frame(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); + pusch_frame = phich_frame2_pusch_frame(frame_parms,eNB->proc[thread_id].frame_tx,subframe); pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe); harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe); for (UE_id=0; UE_idrnti>0)) { - if (ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active == 1) { + if ((ulsch[UE_id])&&(ulsch[UE_id]->rnti>0)) { + if (ulsch[UE_id]->harq_processes[harq_pid]->phich_active == 1) { LOG_D(PHY,"[eNB][PUSCH %d/%x] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n", - harq_pid,ulsch_eNB[UE_id]->rnti,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,pusch_subframe,pusch_frame,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active); + harq_pid,ulsch[UE_id]->rnti,eNB->proc[thread_id].frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active); - ngroup_PHICH = (ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb + - ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH; + ngroup_PHICH = (ulsch[UE_id]->harq_processes[harq_pid]->first_rb + + ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH; if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) { @@ -1464,20 +1464,20 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, ngroup_PHICH += Ngroup_PHICH; } - nseq_PHICH = ((ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) + - ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH); + nseq_PHICH = ((ulsch[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) + + ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH); LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx, + eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx, subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->dci_alloc); + ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK, + ulsch[UE_id]->harq_processes[harq_pid]->first_rb, + ulsch[UE_id]->harq_processes[harq_pid]->dci_alloc); - if (ulsch_eNB[UE_id]->Msg3_active == 1) { + if (ulsch[UE_id]->Msg3_active == 1) { LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb); + eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe, + UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK, + ulsch[UE_id]->harq_processes[harq_pid]->first_rb); } if (abstraction_flag == 0) { @@ -1485,7 +1485,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, amp,//amp*2, nseq_PHICH, ngroup_PHICH, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK, + ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK, subframe, txdataF); } else { @@ -1493,7 +1493,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, generate_phich_emul(frame_parms, //nseq_PHICH, //ngroup_PHICH, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK, + ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK, subframe); */ } @@ -1501,27 +1501,27 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, // if no format0 DCI was transmitted by MAC, prepare the // MCS parameters for the retransmission - if ((ulsch_eNB[UE_id]->harq_processes[harq_pid]->dci_alloc == 0) && - (ulsch_eNB[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) { - if (ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) { + if ((ulsch[UE_id]->harq_processes[harq_pid]->dci_alloc == 0) && + (ulsch[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) { + if (ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch_eNB[UE_id]->harq_processes[harq_pid]->round&3]; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->O_RI = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or2 = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or1 = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi; + eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe); + ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + ulsch[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch[UE_id]->harq_processes[harq_pid]->round&3]; + ulsch[UE_id]->harq_processes[harq_pid]->O_RI = 0; + ulsch[UE_id]->harq_processes[harq_pid]->Or2 = 0; + ulsch[UE_id]->harq_processes[harq_pid]->Or1 = 0; + ulsch[UE_id]->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi; } else { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d PHICH ACK (no format0 DCI) Clearing subframe_scheduling_flag, setting round to 0\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->round=0; + eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe); + ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; + ulsch[UE_id]->harq_processes[harq_pid]->round=0; } } - ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active=0; + ulsch[UE_id]->harq_processes[harq_pid]->phich_active=0; } // phich_active==1 } //ulsch_ue[UE_id] is non-null }// UE loop diff --git a/openair1/PHY/LTE_TRANSPORT/pilots.c b/openair1/PHY/LTE_TRANSPORT/pilots.c index 66e32fcb49..3e84c83747 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots.c @@ -40,13 +40,13 @@ //#include "defs.h" #include "PHY/defs.h" -void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, +void generate_pilots(PHY_VARS_eNB *eNB, int32_t **txdataF, int16_t amp, uint16_t Ntti) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol; uint8_t second_pilot; @@ -71,7 +71,7 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, //Generate Pilots //antenna 0 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset], + lte_dl_cell_spec(eNB,&txdataF[0][tti_offset], amp, slot_offset, 0, @@ -80,7 +80,7 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, // printf("tti %d : second_pilot offset %d \n",tti,tti_offset+(second_pilot*samples_per_symbol)); //antenna 0 symbol 3/4 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+(second_pilot*samples_per_symbol)], + lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+(second_pilot*samples_per_symbol)], amp, slot_offset, 1, @@ -88,7 +88,7 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, // printf("tti %d : third_pilot offset %d \n",tti,tti_offset+((Nsymb>>1)*samples_per_symbol)); //antenna 0 symbol 0 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+((Nsymb>>1)*samples_per_symbol)], + lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+((Nsymb>>1)*samples_per_symbol)], amp, 1+slot_offset, 0, @@ -96,7 +96,7 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, // printf("tti %d : third_pilot offset %d \n",tti,tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)); //antenna 0 symbol 3/4 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], + lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], amp, 1+slot_offset, 1, @@ -106,28 +106,28 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, if (frame_parms->nb_antennas_tx > 1) { if (frame_parms->mode1_flag) { // antenna 1 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset], + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset], amp, slot_offset, 0, 0); // antenna 1 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)], + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)], amp, slot_offset, 1, 0); //antenna 1 symbol 0 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol], + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol], amp, 1+slot_offset, 0, 0); // antenna 1 symbol 3 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], amp, 1+slot_offset, 1, @@ -136,28 +136,28 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, } else { // antenna 1 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset], + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset], amp, slot_offset, 0, 1); // antenna 1 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)], + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)], amp, slot_offset, 1, 1); //antenna 1 symbol 0 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol], + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol], amp, 1+slot_offset, 0, 1); // antenna 1 symbol 3 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], amp, 1+slot_offset, 1, @@ -167,14 +167,14 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, } } -int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, +int generate_pilots_slot(PHY_VARS_eNB *eNB, int32_t **txdataF, int16_t amp, uint16_t slot, int first_pilot_only) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t slot_offset,Nsymb,samples_per_symbol; uint8_t second_pilot; @@ -194,7 +194,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, //Generate Pilots //antenna 0 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB, + lte_dl_cell_spec(eNB, &txdataF[0][slot_offset], amp, slot, @@ -204,7 +204,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, if (first_pilot_only==0) { //antenna 0 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB, + lte_dl_cell_spec(eNB, &txdataF[0][slot_offset+(second_pilot*samples_per_symbol)], amp, slot, @@ -215,7 +215,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, if (frame_parms->nb_antennas_tx > 1) { if (frame_parms->mode1_flag) { // antenna 1 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB, + lte_dl_cell_spec(eNB, &txdataF[1][slot_offset], amp, slot, @@ -224,7 +224,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, if (first_pilot_only==0) { // antenna 1 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB, + lte_dl_cell_spec(eNB, &txdataF[1][slot_offset+(second_pilot*samples_per_symbol)], amp, slot, @@ -234,7 +234,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, } else { // antenna 1 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB, + lte_dl_cell_spec(eNB, &txdataF[1][slot_offset], amp, slot, @@ -243,7 +243,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, if (first_pilot_only == 0) { // antenna 1 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB, + lte_dl_cell_spec(eNB, &txdataF[1][slot_offset+(second_pilot*samples_per_symbol)], amp, slot, diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c index 168f3db17c..4e0d6bba02 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c @@ -41,13 +41,13 @@ #include "PHY/defs.h" -int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, +int generate_mbsfn_pilot(PHY_VARS_eNB *eNB, int32_t **txdataF, int16_t amp, uint16_t subframe) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t subframe_offset,Nsymb,samples_per_symbol; @@ -66,7 +66,7 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, //Generate Pilots //antenna 4 symbol 2 Slot 0 - lte_dl_mbsfn(phy_vars_eNB, + lte_dl_mbsfn(eNB, &txdataF[0][subframe_offset+(2*samples_per_symbol)], amp, subframe, @@ -75,14 +75,14 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, //antenna 4 symbol 0 slot 1 - lte_dl_mbsfn(phy_vars_eNB, + lte_dl_mbsfn(eNB, &txdataF[0][subframe_offset+(6*samples_per_symbol)], amp, subframe, 1); //antenna 4 symbol 4 slot 1 - lte_dl_mbsfn(phy_vars_eNB, + lte_dl_mbsfn(eNB, &txdataF[0][subframe_offset+(10*samples_per_symbol)], amp, subframe, diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 7b93201dd0..56a01b940e 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -48,50 +48,50 @@ -void dump_mch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int subframe) +void dump_mch(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int subframe) { unsigned int nsymb_pmch=12; char fname[32],vname[32]; - int N_RB_DL=phy_vars_ue->lte_frame_parms.N_RB_DL; + int N_RB_DL=ue->frame_parms.N_RB_DL; sprintf(fname,"mch_rxF_ext0.m"); sprintf(vname,"pmch_rxF_ext0"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb_pmch,1,1); sprintf(fname,"mch_ch_ext00.m"); sprintf(vname,"pmch_ch_ext00"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb_pmch,1,1); /* - write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb_pmch,1,1); - write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb_pmch,1,1); - write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb_pmch,1,1); - write_output("dlsch%d_rho.m","dl_rho",lte_ue_pdsch_vars[eNB_id]->rho[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb_pmch,1,1); + write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb_pmch,1,1); + write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb_pmch,1,1); + write_output("dlsch%d_rho.m","dl_rho",pdsch_vars[eNB_id]->rho[0],12*N_RB_DL*nsymb_pmch,1,1); */ sprintf(fname,"mch_rxF_comp0.m"); sprintf(vname,"pmch_rxF_comp0"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb_pmch,1,1); sprintf(fname,"mch_rxF_llr.m"); sprintf(vname,"pmch_llr"); - write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->llr[0],coded_bits_per_codeword,1,0); + write_output(fname,vname, ue->pdsch_vars_MCH[eNB_id]->llr[0],coded_bits_per_codeword,1,0); sprintf(fname,"mch_mag1.m"); sprintf(vname,"pmch_mag1"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb_pmch,1,1); sprintf(fname,"mch_mag2.m"); sprintf(vname,"pmch_mag2"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1); write_output("mch00_ch0.m","pmch00_ch0", - &(phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]), - phy_vars_ue->lte_frame_parms.ofdm_symbol_size*12,1,1); + &(ue->common_vars.dl_ch_estimates[eNB_id][0][0]), + ue->frame_parms.ofdm_symbol_size*12,1,1); write_output("rxsig_mch.m","rxs_mch", - &phy_vars_ue->lte_ue_common_vars.rxdata[0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + &ue->common_vars.rxdata[0][subframe*ue->frame_parms.samples_per_tti], + ue->frame_parms.samples_per_tti,1,1); if (PHY_vars_eNB_g) write_output("txsig_mch.m","txs_mch", - &PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdata[0][0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + &PHY_vars_eNB_g[0][0]->common_vars.txdata[0][0][subframe*ue->frame_parms.samples_per_tti], + ue->frame_parms.samples_per_tti,1,1); } int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms) @@ -190,11 +190,11 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par return(0); } -void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, int abstraction_flag) +void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx, int abstraction_flag) { - LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB_MCH; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_MCH; + LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms; // dlsch->rnti = M_RNTI; dlsch->harq_processes[0]->mcs = mcs; @@ -228,23 +228,23 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, in } if (abstraction_flag) { - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].cntl.pmch_flag=1; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_common_dci=0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_ue_spec_dci=0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[0]=5;// put at the reserved position for PMCH - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[0]=0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].ue_id[0]=255;//broadcast - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[0]=dlsch->harq_processes[0]->TBS>>3; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].cntl.pmch_flag=1; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF + eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_common_dci=0; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_ue_spec_dci=0; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].dlsch_type[0]=5;// put at the reserved position for PMCH + eNB_transport_info[eNB->Mod_id][eNB->CC_id].harq_pid[0]=0; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].ue_id[0]=255;//broadcast + eNB_transport_info[eNB->Mod_id][eNB->CC_id].tbs[0]=dlsch->harq_processes[0]->TBS>>3; } } -void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eNB_id) +void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id) { - LTE_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch_ue_MCH[eNB_id]; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_UE_DLSCH_t *dlsch = ue->dlsch_MCH[eNB_id]; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; // dlsch->rnti = M_RNTI; dlsch->harq_processes[0]->mcs = mcs; @@ -286,59 +286,59 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN } } -void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int sched_subframe,uint8_t *a,int abstraction_flag) +void generate_mch(PHY_VARS_eNB *eNB,int thread_id,uint8_t *a,int abstraction_flag) { int G; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + int subframe = eNB->proc[thread_id].subframe_tx; if (abstraction_flag != 0) { - if (eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]!=0) - printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]); + if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0) + printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]); - memcpy(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->b, + memcpy(eNB->dlsch_MCH->harq_processes[0]->b, a, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); + eNB->dlsch_MCH->harq_processes[0]->TBS>>3); LOG_D(PHY, "[eNB %d] dlsch_encoding_emul pmch , tbs is %d \n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); + eNB->Mod_id, + eNB->dlsch_MCH->harq_processes[0]->TBS>>3); - memcpy(&eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].transport_blocks[eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]], + memcpy(&eNB_transport_info[eNB->Mod_id][eNB->CC_id].transport_blocks[eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]], a, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); - eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]+= phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3;//=eNB_transport_info[phy_vars_eNB->Mod_id].tbs[0]; + eNB->dlsch_MCH->harq_processes[0]->TBS>>3); + eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]+= eNB->dlsch_MCH->harq_processes[0]->TBS>>3;//=eNB_transport_info[eNB->Mod_id].tbs[0]; } else { - G = get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->lte_frame_parms.N_RB_DL, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->mcs),1, - 2,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); + G = get_G(&eNB->frame_parms, + eNB->frame_parms.N_RB_DL, + eNB->dlsch_MCH->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1, + 2,eNB->proc[thread_id].frame_tx,subframe); - generate_mbsfn_pilot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_mbsfn_pilot(eNB, + eNB->common_vars.txdataF[0], AMP, subframe); if (dlsch_encoding(a, - &phy_vars_eNB->lte_frame_parms, + &eNB->frame_parms, 1, - phy_vars_eNB->dlsch_eNB_MCH, - phy_vars_eNB->proc[sched_subframe].frame_tx, + eNB->dlsch_MCH, + eNB->proc[thread_id].frame_tx, subframe, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats )<0) mac_xface->macphy_exit("problem in dlsch_encoding"); - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,1,phy_vars_eNB->dlsch_eNB_MCH,G,0,subframe<<1); + dlsch_scrambling(&eNB->frame_parms,1,eNB->dlsch_MCH,G,0,subframe<<1); - mch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], + mch_modulation(eNB->common_vars.txdataF[0], AMP, subframe, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_MCH); + &eNB->frame_parms, + eNB->dlsch_MCH); } } @@ -962,30 +962,30 @@ void mch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, } int avg_pmch[4]; -int rx_pmch(PHY_VARS_UE *phy_vars_ue, +int rx_pmch(PHY_VARS_UE *ue, unsigned char eNB_id, uint8_t subframe, unsigned char symbol) { - LTE_UE_COMMON *lte_ue_common_vars = &phy_vars_ue->lte_ue_common_vars; - LTE_UE_PDSCH **lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - LTE_UE_DLSCH_t **dlsch_ue = &phy_vars_ue->dlsch_ue_MCH[eNB_id]; + LTE_UE_COMMON *common_vars = &ue->common_vars; + LTE_UE_PDSCH **pdsch_vars = &ue->pdsch_vars_MCH[eNB_id]; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_DLSCH_t **dlsch = &ue->dlsch_MCH[eNB_id]; int avgs,aarx; //printf("*********************mch: symbol %d\n",symbol); - mch_extract_rbs(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + mch_extract_rbs(common_vars->rxdataF, + common_vars->dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, symbol, subframe, frame_parms); if (symbol == 2) { - mch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + mch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, avg_pmch, symbol, @@ -997,55 +997,55 @@ int rx_pmch(PHY_VARS_UE *phy_vars_ue, for (aarx=0; aarxnb_antennas_rx; aarx++) avgs = cmax(avgs,avg_pmch[aarx]); - if (get_Qm(dlsch_ue[0]->harq_processes[0]->mcs)==2) - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) ;// + 2 + if (get_Qm(dlsch[0]->harq_processes[0]->mcs)==2) + pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) ;// + 2 else - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); // + 5;// + 2 + pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); // + 5;// + 2 - mch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + mch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, frame_parms, symbol, - get_Qm(dlsch_ue[0]->harq_processes[0]->mcs), - lte_ue_pdsch_vars[eNB_id]->log2_maxh); + get_Qm(dlsch[0]->harq_processes[0]->mcs), + pdsch_vars[eNB_id]->log2_maxh); if (frame_parms->nb_antennas_rx > 1) mch_detection_mrc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, symbol); - switch (get_Qm(dlsch_ue[0]->harq_processes[0]->mcs)) { + switch (get_Qm(dlsch[0]->harq_processes[0]->mcs)) { case 2 : mch_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], symbol, - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); break; case 4: mch_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->dl_ch_mag0, symbol, - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); break; case 6: mch_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, symbol, - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); break; } diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 5e58b13737..c18982f170 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -595,23 +595,23 @@ int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t su return(2==1); } -int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subframe, uint16_t Nf ) +int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint16_t Nf ) { - lte_frame_type_t frame_type = phy_vars_ue->lte_frame_parms.frame_type; - //uint8_t tdd_config = phy_vars_ue->lte_frame_parms.tdd_config; - uint16_t rootSequenceIndex = phy_vars_ue->lte_frame_parms.prach_config_common.rootSequenceIndex; - uint8_t prach_ConfigIndex = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; - uint8_t Ncs_config = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; - uint8_t restricted_set = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; - //uint8_t n_ra_prboffset = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset; - uint8_t preamble_index = phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; - uint8_t tdd_mapindex = phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index; - int16_t *prachF = phy_vars_ue->lte_ue_prach_vars[eNB_id]->prachF; + lte_frame_type_t frame_type = ue->frame_parms.frame_type; + //uint8_t tdd_config = ue->frame_parms.tdd_config; + uint16_t rootSequenceIndex = ue->frame_parms.prach_config_common.rootSequenceIndex; + uint8_t prach_ConfigIndex = ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; + uint8_t Ncs_config = ue->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; + uint8_t restricted_set = ue->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; + //uint8_t n_ra_prboffset = ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset; + uint8_t preamble_index = ue->prach_resources[eNB_id]->ra_PreambleIndex; + uint8_t tdd_mapindex = ue->prach_resources[eNB_id]->ra_TDD_map_index; + int16_t *prachF = ue->prach_vars[eNB_id]->prachF; static int16_t prach_tmp[45600*2] __attribute__((aligned(32))); int16_t *prach = prach_tmp; int16_t *prach2; - int16_t amp = phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp; + int16_t amp = ue->prach_vars[eNB_id]->amp; int16_t Ncp; uint8_t n_ra_prb; uint16_t NCS; @@ -634,23 +634,20 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra int i, prach_len; uint16_t first_nonzero_root_idx=0; -#ifdef BIT8_TX - prach_start = ((subframe*phy_vars_ue->lte_frame_parms.samples_per_tti)<<1)-phy_vars_ue->N_TA_offset; -#else #if defined(EXMIMO) || defined(OAI_USRP) - prach_start = (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-phy_vars_ue->hw_timing_advance-phy_vars_ue->N_TA_offset); + prach_start = (ue->rx_offset+subframe*ue->frame_parms.samples_per_tti-ue->hw_timing_advance-ue->N_TA_offset); if (prach_start<0) - prach_start+=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); + prach_start+=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - if (prach_start>=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) - prach_start-=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); + if (prach_start>=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) + prach_start-=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); #else //normal case (simulation) - prach_start = subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-phy_vars_ue->N_TA_offset; -#endif + prach_start = subframe*ue->frame_parms.samples_per_tti-ue->N_TA_offset; #endif + // First compute physical root sequence if (restricted_set == 0) { if (Ncs_config > 15) { @@ -670,7 +667,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra NCS = NCS_restricted[Ncs_config]; } - n_ra_prb = get_prach_prb_offset(&(phy_vars_ue->lte_frame_parms), tdd_mapindex, Nf); + n_ra_prb = get_prach_prb_offset(&(ue->frame_parms), tdd_mapindex, Nf); prach_root_sequence_map = (prach_fmt<4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4; /* @@ -678,7 +675,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra if (frame_type == TDD) { // TDD if (tdd_preamble_map[prach_ConfigIndex][tdd_config].num_prach==0) { - LOG_E( PHY, "[PHY][UE %"PRIu8"] Illegal prach_ConfigIndex %"PRIu8" for ", phy_vars_ue->Mod_id, prach_ConfigIndex ); + LOG_E( PHY, "[PHY][UE %"PRIu8"] Illegal prach_ConfigIndex %"PRIu8" for ", ue->Mod_id, prach_ConfigIndex ); } // adjust n_ra_prboffset for frequency multiplexing (p.36 36.211) @@ -688,7 +685,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra if ((f_ra&1) == 0) { n_ra_prb = n_ra_prboffset + 6*(f_ra>>1); } else { - n_ra_prb = phy_vars_ue->lte_frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1); + n_ra_prb = ue->frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1); } } else { if ((tdd_config >2) && (tdd_config<6)) @@ -699,7 +696,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra if ((((Nf&1)*(2-Nsp)+t1_ra)&1) == 0) { n_ra_prb = 6*f_ra; } else { - n_ra_prb = phy_vars_ue->lte_frame_parms.N_RB_UL - 6*(f_ra+1); + n_ra_prb = ue->frame_parms.N_RB_UL - 6*(f_ra+1); } } } @@ -715,7 +712,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra } else { // This is the high-speed case #ifdef PRACH_DEBUG - LOG_D(PHY,"[UE %d] High-speed mode, NCS_config %d\n",phy_vars_ue->Mod_id,Ncs_config); + LOG_D(PHY,"[UE %d] High-speed mode, NCS_config %d\n",ue->Mod_id,Ncs_config); #endif not_found = 1; @@ -785,24 +782,24 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra // nsymb = (frame_parms->Ncp==0) ? 14:12; // subframe_offset = (unsigned int)frame_parms->ofdm_symbol_size*subframe*nsymb; - k = (12*n_ra_prb) - 6*phy_vars_ue->lte_frame_parms.N_RB_UL; + k = (12*n_ra_prb) - 6*ue->frame_parms.N_RB_UL; if (k<0) - k+=phy_vars_ue->lte_frame_parms.ofdm_symbol_size; + k+=ue->frame_parms.ofdm_symbol_size; k*=12; k+=13; - Xu = (int16_t*)phy_vars_ue->X_u[preamble_offset-first_nonzero_root_idx]; + Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx]; /* - k+=(12*phy_vars_ue->lte_frame_parms.first_carrier_offset); - if (k>(12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)) - k-=(12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + k+=(12*ue->frame_parms.first_carrier_offset); + if (k>(12*ue->frame_parms.ofdm_symbol_size)) + k-=(12*ue->frame_parms.ofdm_symbol_size); */ k*=2; - switch (phy_vars_ue->lte_frame_parms.N_RB_UL) { + switch (ue->frame_parms.N_RB_UL) { case 6: memset((void*)prachF,0,4*1536); break; @@ -838,7 +835,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra prachF[k++]= ((Xu_re*ru[offset2<<1]) - (Xu_im*ru[1+(offset2<<1)]))>>15; prachF[k++]= ((Xu_im*ru[offset2<<1]) + (Xu_re*ru[1+(offset2<<1)]))>>15; - if (k==(12*2*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)) + if (k==(12*2*ue->frame_parms.ofdm_symbol_size)) k=0; } @@ -865,7 +862,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra break; } - switch (phy_vars_ue->lte_frame_parms.N_RB_UL) { + switch (ue->frame_parms.N_RB_UL) { case 6: Ncp>>=4; prach+=4; // makes prach2 aligned to 128-bit @@ -891,7 +888,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra prach2 = prach+(Ncp<<1); // do IDFT - switch (phy_vars_ue->lte_frame_parms.N_RB_UL) { + switch (ue->frame_parms.N_RB_UL) { case 6: if (prach_fmt == 4) { idft256(prachF,prach2,1); @@ -1015,34 +1012,34 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra } else { #if defined(EXMIMO) || defined(OAI_USRP) int j; - int overflow = prach_start + prach_len - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_ue->lte_frame_parms.samples_per_tti; + int overflow = prach_start + prach_len - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*ue->frame_parms.samples_per_tti; LOG_D( PHY, "prach_start=%d, overflow=%d\n", prach_start, overflow ); - for (i=prach_start,j=0; ilte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,prach_start+prach_len); i++,j++) { - ((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i] = prach[2*j]<<4; - ((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; + for (i=prach_start,j=0; iframe_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,prach_start+prach_len); i++,j++) { + ((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j]<<4; + ((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; } for (i=0; ilte_ue_common_vars.txdata[0])[2*i] = prach[2*j]<<4; - ((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; + ((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j]<<4; + ((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; } #if defined(EXMIMO) // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on - for (k=prach_start - (phy_vars_ue->lte_frame_parms.samples_per_tti>>1) ; kframe_parms.samples_per_tti>>1) ; klte_ue_common_vars.txdata[0][k+phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else if (k>(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) - phy_vars_ue->lte_ue_common_vars.txdata[0][k-phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + ue->common_vars.txdata[0][k+ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else if (k>(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) + ue->common_vars.txdata[0][k-ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; else - phy_vars_ue->lte_ue_common_vars.txdata[0][k] &= 0xFFFEFFFE; + ue->common_vars.txdata[0][k] &= 0xFFFEFFFE; } #endif #else for (i=0; ilte_ue_common_vars.txdata[0][prach_start]))[2*i] = prach[2*i]; - ((int16_t*)(&phy_vars_ue->lte_ue_common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1]; + ((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i] = prach[2*i]; + ((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1]; } #endif @@ -1058,7 +1055,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra } //__m128i mmtmpX0,mmtmpX1,mmtmpX2,mmtmpX3; -void rx_prach(PHY_VARS_eNB *phy_vars_eNB, +void rx_prach(PHY_VARS_eNB *eNB, uint8_t subframe, uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, @@ -1067,16 +1064,16 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, { int i; - lte_frame_type_t frame_type = phy_vars_eNB->lte_frame_parms.frame_type; + lte_frame_type_t frame_type = eNB->frame_parms.frame_type; - uint16_t rootSequenceIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex; - uint8_t prach_ConfigIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; - uint8_t Ncs_config = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; - uint8_t restricted_set = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; - int16_t *prachF = phy_vars_eNB->lte_eNB_prach_vars.prachF; - int16_t **rxsigF = phy_vars_eNB->lte_eNB_prach_vars.rxsigF; - int16_t **prach_ifft = phy_vars_eNB->lte_eNB_prach_vars.prach_ifft; - int16_t *prach[4]; + uint16_t rootSequenceIndex = eNB->frame_parms.prach_config_common.rootSequenceIndex; + uint8_t prach_ConfigIndex = eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; + uint8_t Ncs_config = eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; + uint8_t restricted_set = eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; + int16_t *prachF = eNB->prach_vars.prachF; + int16_t **rxsigF = eNB->prach_vars.rxsigF; + int16_t **prach_ifft = eNB->prach_vars.prach_ifft; + int16_t *prach[eNB->frame_parms.nb_antennas_rx]; int16_t *prach2; uint8_t n_ra_prb; uint8_t preamble_index; @@ -1102,10 +1099,10 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, int32_t lev; int16_t levdB; int fft_size,log2_ifft_size; - uint8_t nb_ant_rx = 1; //phy_vars_eNB->lte_frame_parms.nb_antennas_rx; + uint8_t nb_ant_rx = 1; //eNB->frame_parms.nb_antennas_rx; for (aa=0; aalte_eNB_common_vars.rxdata[0][aa][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti-phy_vars_eNB->N_TA_offset]; + prach[aa] = (int16_t*)&eNB->common_vars.rxdata[0][aa][subframe*eNB->frame_parms.samples_per_tti-eNB->N_TA_offset]; } // First compute physical root sequence @@ -1127,9 +1124,9 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, NCS = NCS_restricted[Ncs_config]; } - start_meas(&phy_vars_eNB->rx_prach); + start_meas(&eNB->rx_prach); - n_ra_prb = get_prach_prb_offset(&(phy_vars_eNB->lte_frame_parms),tdd_mapindex,Nf); + n_ra_prb = get_prach_prb_offset(&(eNB->frame_parms),tdd_mapindex,Nf); prach_root_sequence_map = (prach_fmt < 4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4; // PDP is oversampled, e.g. 1024 sample instead of 839 @@ -1162,7 +1159,7 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, break; } - switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) { + switch (eNB->frame_parms.N_RB_UL) { case 6: Ncp>>=4; break; @@ -1184,23 +1181,123 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, break; } + + if ((eNB->node_function == eNodeB_3GPP) || + (eNB->node_function == NGFI_RRU_IF4)) { // compute the DFTs of the PRACH temporal resources + // Do forward transform + for (aa=0; aaframe_parms.N_RB_UL) { + case 6: + if (prach_fmt == 4) { + dft256(prach2,rxsigF[aa],1); + } else { + dft1536(prach2,rxsigF[aa],1); + + if (prach_fmt>1) + dft1536(prach2+3072,rxsigF[aa]+3072,1); + } + + break; + + case 15: + if (prach_fmt == 4) { + dft256(prach2,rxsigF[aa],1); + } else { + dft3072(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft3072(prach2+6144,rxsigF[aa]+6144); + } + + break; + + case 25: + default: + if (prach_fmt == 4) { + dft1024(prach2,rxsigF[aa],1); + fft_size = 1024; + } else { + dft6144(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft6144(prach2+12288,rxsigF[aa]+12288); + + fft_size = 6144; + } + + break; + + case 50: + if (prach_fmt == 4) { + dft2048(prach2,rxsigF[aa],1); + } else { + dft12288(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft12288(prach2+24576,rxsigF[aa]+24576); + } + + break; + + case 75: + if (prach_fmt == 4) { + dft3072(prach2,rxsigF[aa]); + } else { + dft18432(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft18432(prach2+36864,rxsigF[aa]+36864); + } + + break; + + case 100: + if (prach_fmt == 4) { + dft4096(prach2,rxsigF[aa],1); + } else { + dft24576(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft24576(prach2+49152,rxsigF[aa]+49152); + } + + break; + } + } + } + + if (eNB->node_function == NGFI_RRU_IF4) { + //send prachF to RCC + return; + } + else if (eNB->node_function == NGFI_RCC_IF4) { + //wait for prachF from RRU and continue with PRACH processing + } + + + + // here onwards is for eNodeB_3GPP or NGFI_RCC_IF4 + preamble_offset_old = 99; for (preamble_index=0 ; preamble_index<64 ; preamble_index++) { if (restricted_set == 0) { // This is the relative offset in the root sequence table (5.7.2-4 from 36.211) for the given preamble index preamble_offset = ((NCS==0)? preamble_index : (preamble_index/(N_ZC/NCS))); - + if (preamble_offset != preamble_offset_old) { preamble_offset_old = preamble_offset; new_dft = 1; // This is the \nu corresponding to the preamble index preamble_shift = 0; } - + else { preamble_shift -= NCS; - + if (preamble_shift < 0) preamble_shift+=N_ZC; } @@ -1277,187 +1374,111 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, if (new_dft == 1) { new_dft = 0; - Xu=(int16_t*)phy_vars_eNB->X_u[preamble_offset-first_nonzero_root_idx]; + Xu=(int16_t*)eNB->X_u[preamble_offset-first_nonzero_root_idx]; + - for (aa=0; aalte_frame_parms.N_RB_UL; + + k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; + + if (k<0) + k+=(eNB->frame_parms.ofdm_symbol_size); + + k*=12; + k+=13; // phi + K/2 + // k+=(12*eNB->frame_parms.first_carrier_offset); + // if (k>(12*eNB->frame_parms.ofdm_symbol_size)) + // k-=(12*eNB->frame_parms.ofdm_symbol_size); + + // printf("First prach carrier : k %d\n",k); + k*=2; + - if (k<0) - k+=(phy_vars_eNB->lte_frame_parms.ofdm_symbol_size); - - k*=12; - k+=13; // phi + K/2 - // k+=(12*phy_vars_eNB->lte_frame_parms.first_carrier_offset); - // if (k>(12*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)) - // k-=(12*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size); - - // printf("First prach carrier : k %d\n",k); - k*=2; - - // do DFT - switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) { - case 6: - if (prach_fmt == 4) { - dft256(prach2,rxsigF[aa],1); - } else { - dft1536(prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft1536(prach2+3072,rxsigF[aa]+3072,1); - } - - break; - - case 15: - if (prach_fmt == 4) { - dft256(prach2,rxsigF[aa],1); - } else { - dft3072(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft3072(prach2+6144,rxsigF[aa]+6144); - } - - break; - - case 25: - default: - if (prach_fmt == 4) { - dft1024(prach2,rxsigF[aa],1); - fft_size = 1024; - } else { - dft6144(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft6144(prach2+12288,rxsigF[aa]+12288); - - fft_size = 6144; - } - - break; - - case 50: - if (prach_fmt == 4) { - dft2048(prach2,rxsigF[aa],1); - } else { - dft12288(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft12288(prach2+24576,rxsigF[aa]+24576); - } - - break; - - case 75: - if (prach_fmt == 4) { - dft3072(prach2,rxsigF[aa]); - } else { - dft18432(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft18432(prach2+36864,rxsigF[aa]+36864); - } - - break; - - case 100: - if (prach_fmt == 4) { - dft4096(prach2,rxsigF[aa],1); - } else { - dft24576(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft24576(prach2+49152,rxsigF[aa]+49152); - } - - break; - } - - memset( prachF, 0, sizeof(int16_t)*2*1024 ); + + memset( prachF, 0, sizeof(int16_t)*2*1024 ); #ifdef PRACH_DEBUG - write_output("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1); + write_output("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1); #endif - // write_output("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1); - // write_output("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1); - // write_output("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1); + // write_output("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1); + // write_output("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1); + // write_output("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1); - // Do componentwise product with Xu* - for (offset=0; offset<(N_ZC<<1); offset+=2) { - prachF[offset] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k] + (int32_t)Xu[offset+1]*rxsigF[aa][k+1])>>15); - prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15); - /* - if (offset<16) - printf("Xu[%d] %d %d, rxsigF[%d][%d] %d %d\n",offset,Xu[offset],Xu[offset+1],aa,k,rxsigF[aa][k],rxsigF[aa][k+1]); - */ - /* - mmtmpX0 = _mm_madd_epi16(*(__m128i*)&Xu[offset],*(__m128i*)&rxsigF[aa][k<<1]); - mmtmpX1 = _mm_shufflelo_epi16(*(__m128i*)&Xu[offset],_MM_SHUFFLE(2,3,0,1)); - mmtmpX1 = _mm_shufflehi_epi16(mmtmpX1,_MM_SHUFFLE(2,3,0,1)); - mmtmpX1 = _mm_sign_epi16(mmtmpX1,*(__m128i*)&conjugate[0]); - mmtmpX1 = _mm_madd_epi16(mmtmpX1,*(__m128i*)&rxsigF[aa][k<<1]); - mmtmpX0 = _mm_srai_epi32(mmtmpX0,15); - mmtmpX1 = _mm_srai_epi32(mmtmpX1,15); - mmtmpX2 = _mm_unpacklo_epi32(mmtmpX0,mmtmpX1); - mmtmpX3 = _mm_unpackhi_epi32(mmtmpX0,mmtmpX1); - *(__m128i*)&prachF[offset] = _mm_packs_epi32(mmtmpX2,mmtmpX3); - */ - k+=2; - - if (k==(12*2*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)) - k=0; - } - - // Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139) - if (N_ZC == 839) { - log2_ifft_size = 10; - idft1024(prachF,prach_ifft[aa],1); - } else { - idft256(prachF,prach_ifft[aa],1); - log2_ifft_size = 8; - } + for (aa=0;aa>15); + prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15); + /* + if (offset<16) + printf("Xu[%d] %d %d, rxsigF[%d][%d] %d %d\n",offset,Xu[offset],Xu[offset+1],aa,k,rxsigF[aa][k],rxsigF[aa][k+1]); + */ + /* + mmtmpX0 = _mm_madd_epi16(*(__m128i*)&Xu[offset],*(__m128i*)&rxsigF[aa][k<<1]); + mmtmpX1 = _mm_shufflelo_epi16(*(__m128i*)&Xu[offset],_MM_SHUFFLE(2,3,0,1)); + mmtmpX1 = _mm_shufflehi_epi16(mmtmpX1,_MM_SHUFFLE(2,3,0,1)); + mmtmpX1 = _mm_sign_epi16(mmtmpX1,*(__m128i*)&conjugate[0]); + mmtmpX1 = _mm_madd_epi16(mmtmpX1,*(__m128i*)&rxsigF[aa][k<<1]); + mmtmpX0 = _mm_srai_epi32(mmtmpX0,15); + mmtmpX1 = _mm_srai_epi32(mmtmpX1,15); + mmtmpX2 = _mm_unpacklo_epi32(mmtmpX0,mmtmpX1); + mmtmpX3 = _mm_unpackhi_epi32(mmtmpX0,mmtmpX1); + *(__m128i*)&prachF[offset] = _mm_packs_epi32(mmtmpX2,mmtmpX3); + */ + k+=2; + + if (k==(12*2*eNB->frame_parms.ofdm_symbol_size)) + k=0; + } + + // Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139) + if (N_ZC == 839) { + log2_ifft_size = 10; + idft1024(prachF,prach_ifft[aa],1); + } else { + idft256(prachF,prach_ifft[aa],1); + log2_ifft_size = 8; + } #ifdef PRACH_DEBUG - write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); + if (aa==0) write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); #endif - // write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1); - + // if (aa=1) write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1); }// antennas_rx #ifdef PRACH_DEBUG write_output("prach_ifft0.m","prach_t0",prach_ifft[0],2048,1,1); #endif // write_output("prach_ifft1.m","prach_t1",prach_ifft[1],2048,1,1); - + } // new dft - + // check energy in nth time shift preamble_shift2 = ((preamble_shift==0) ? 0 : ((preamble_shift<preamble_energy_list[preamble_index] ) { - preamble_energy_list[preamble_index] = levdB; - preamble_delay_list[preamble_index] = (i*fft_size)>>log2_ifft_size; + preamble_energy_list[preamble_index] = levdB; + preamble_delay_list[preamble_index] = (i*fft_size)>>log2_ifft_size; } } - + #ifdef PRACH_DEBUG LOG_D(PHY,"[RAPROC] Preamble %d => %d dB, %d (shift %d (%d), NCS2 %d(%d), Ncp %d)\n",preamble_index,preamble_energy_list[preamble_index],preamble_delay_list[preamble_index],preamble_shift2, - preamble_shift, NCS2,NCS,Ncp); + preamble_shift, NCS2,NCS,Ncp); #endif // exit(-1); }// preamble_index - - stop_meas(&phy_vars_eNB->rx_prach); - + + stop_meas(&eNB->rx_prach); + } void init_prach_tables(int N_ZC) diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 16cc75b290..9297d91376 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -55,7 +55,7 @@ extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index); extern openair0_config_t openair0_cfg[]; #endif -int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t mode, int input_level_dBm) +int dump_ue_stats(PHY_VARS_UE *ue, char* buffer, int length, runmode_t mode, int input_level_dBm) { uint8_t eNB=0; @@ -63,493 +63,493 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t int len=length; int harq_pid,round; - if (phy_vars_ue==NULL) + if (ue==NULL) return 0; if ((mode == normal_txrx) || (mode == no_L2_connect)) { - len += sprintf(&buffer[len], "[UE_PROC] UE %d, RNTI %x\n",phy_vars_ue->Mod_id, phy_vars_ue->lte_ue_pdcch_vars[0]->crnti); + len += sprintf(&buffer[len], "[UE_PROC] UE %d, RNTI %x\n",ue->Mod_id, ue->pdcch_vars[0]->crnti); len += sprintf(&buffer[len],"[UE PROC] RSRP[0] %.2f dBm/RE, RSSI %.2f dBm, RSRQ[0] %.2f dB, N0 %d dBm/RE (NF %.1f dB)\n", - 10*log10(phy_vars_ue->PHY_measurements.rsrp[0])-phy_vars_ue->rx_total_gain_dB, - 10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB, - 10*log10(phy_vars_ue->PHY_measurements.rsrq[0]), - phy_vars_ue->PHY_measurements.n0_power_tot_dBm, - (double)phy_vars_ue->PHY_measurements.n0_power_tot_dBm+132.24); + 10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rsrq[0]), + ue->measurements.n0_power_tot_dBm, + (double)ue->measurements.n0_power_tot_dBm+132.24); /* len += sprintf(&buffer[len], "[UE PROC] Frame count: %d\neNB0 RSSI %d dBm/RE (%d dB, %d dB)\neNB1 RSSI %d dBm/RE (%d dB, %d dB)neNB2 RSSI %d dBm/RE (%d dB, %d dB)\nN0 %d dBm/RE, %f dBm/%dPRB (%d dB, %d dB)\n", - phy_vars_ue->frame_rx, - phy_vars_ue->PHY_measurements.rx_rssi_dBm[0], - phy_vars_ue->PHY_measurements.rx_power_dB[0][0], - phy_vars_ue->PHY_measurements.rx_power_dB[0][1], - phy_vars_ue->PHY_measurements.rx_rssi_dBm[1], - phy_vars_ue->PHY_measurements.rx_power_dB[1][0], - phy_vars_ue->PHY_measurements.rx_power_dB[1][1], - phy_vars_ue->PHY_measurements.rx_rssi_dBm[2], - phy_vars_ue->PHY_measurements.rx_power_dB[2][0], - phy_vars_ue->PHY_measurements.rx_power_dB[2][1], - phy_vars_ue->PHY_measurements.n0_power_tot_dBm, - phy_vars_ue->PHY_measurements.n0_power_tot_dBm+10*log10(12*phy_vars_ue->lte_frame_parms.N_RB_DL), - phy_vars_ue->lte_frame_parms.N_RB_DL, - phy_vars_ue->PHY_measurements.n0_power_dB[0], - phy_vars_ue->PHY_measurements.n0_power_dB[1]); + ue->frame_rx, + ue->measurements.rx_rssi_dBm[0], + ue->measurements.rx_power_dB[0][0], + ue->measurements.rx_power_dB[0][1], + ue->measurements.rx_rssi_dBm[1], + ue->measurements.rx_power_dB[1][0], + ue->measurements.rx_power_dB[1][1], + ue->measurements.rx_rssi_dBm[2], + ue->measurements.rx_power_dB[2][0], + ue->measurements.rx_power_dB[2][1], + ue->measurements.n0_power_tot_dBm, + ue->measurements.n0_power_tot_dBm+10*log10(12*ue->frame_parms.N_RB_DL), + ue->frame_parms.N_RB_DL, + ue->measurements.n0_power_dB[0], + ue->measurements.n0_power_dB[1]); */ #ifdef EXMIMO - len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",phy_vars_ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]); + len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]); #endif #if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB); + len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",ue->rx_total_gain_dB); #endif #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz, estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset); + len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz, estimated carrier frequency %f Hz\n",ue->common_vars.freq_offset,openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset); #endif - len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]); - len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance); - if (phy_vars_ue->UE_mode[0]==PUSCH) { + len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[ue->UE_mode[0]],ue->UE_mode[0]); + len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",ue->timing_advance); + if (ue->UE_mode[0]==PUSCH) { len += sprintf(&buffer[len], "[UE PROC] Po_PUSCH = %d dBm (PL %d dB, Po_NOMINAL_PUSCH %d dBm, PHR %d dB)\n", - phy_vars_ue->ulsch_ue[0]->Po_PUSCH, - get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0), - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH, - phy_vars_ue->ulsch_ue[0]->PHR); + ue->ulsch[0]->Po_PUSCH, + get_PL(ue->Mod_id,ue->CC_id,0), + ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH, + ue->ulsch[0]->PHR); len += sprintf(&buffer[len], "[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)\n", - get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0)+ - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ - phy_vars_ue->dlsch_ue[0][0]->g_pucch, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - phy_vars_ue->dlsch_ue[0][0]->g_pucch); + get_PL(ue->Mod_id,ue->CC_id,0)+ + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ + ue->dlsch[0][0]->g_pucch, + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + ue->dlsch[0][0]->g_pucch); } //for (eNB=0;eNBPHY_measurements.rx_spatial_power_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB][1][1]); + ue->measurements.rx_spatial_power_dB[eNB][0][0], + ue->measurements.rx_spatial_power_dB[eNB][0][1], + ue->measurements.rx_spatial_power_dB[eNB][1][0], + ue->measurements.rx_spatial_power_dB[eNB][1][1]); - len += sprintf(&buffer[len], "[UE PROC] RX total power eNB%d: %d dB, avg: %d dB\n",eNB,phy_vars_ue->PHY_measurements.rx_power_tot_dB[eNB],phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB]); - len += sprintf(&buffer[len], "[UE PROC] RX total power lin: %d, avg: %d, RX total noise lin: %d, avg: %d\n",phy_vars_ue->PHY_measurements.rx_power_tot[eNB], - phy_vars_ue->PHY_measurements.rx_power_avg[eNB], phy_vars_ue->PHY_measurements.n0_power_tot, phy_vars_ue->PHY_measurements.n0_power_avg); - len += sprintf(&buffer[len], "[UE PROC] effective SINR %.2f dB\n",phy_vars_ue->sinr_eff); - len += sprintf(&buffer[len], "[UE PROC] Wideband CQI eNB %d: %d dB, avg: %d dB\n",eNB,phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB],phy_vars_ue->PHY_measurements.wideband_cqi_avg[eNB]); + len += sprintf(&buffer[len], "[UE PROC] RX total power eNB%d: %d dB, avg: %d dB\n",eNB,ue->measurements.rx_power_tot_dB[eNB],ue->measurements.rx_power_avg_dB[eNB]); + len += sprintf(&buffer[len], "[UE PROC] RX total power lin: %d, avg: %d, RX total noise lin: %d, avg: %d\n",ue->measurements.rx_power_tot[eNB], + ue->measurements.rx_power_avg[eNB], ue->measurements.n0_power_tot, ue->measurements.n0_power_avg); + len += sprintf(&buffer[len], "[UE PROC] effective SINR %.2f dB\n",ue->sinr_eff); + len += sprintf(&buffer[len], "[UE PROC] Wideband CQI eNB %d: %d dB, avg: %d dB\n",eNB,ue->measurements.wideband_cqi_tot[eNB],ue->measurements.wideband_cqi_avg[eNB]); - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][5]); + ue->measurements.subband_cqi_dB[eNB][0][0], + ue->measurements.subband_cqi_dB[eNB][0][1], + ue->measurements.subband_cqi_dB[eNB][0][2], + ue->measurements.subband_cqi_dB[eNB][0][3], + ue->measurements.subband_cqi_dB[eNB][0][4], + ue->measurements.subband_cqi_dB[eNB][0][5]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][5]); + ue->measurements.subband_cqi_dB[eNB][1][0], + ue->measurements.subband_cqi_dB[eNB][1][1], + ue->measurements.subband_cqi_dB[eNB][1][2], + ue->measurements.subband_cqi_dB[eNB][1][3], + ue->measurements.subband_cqi_dB[eNB][1][4], + ue->measurements.subband_cqi_dB[eNB][1][5]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][0]); + ue->measurements.subband_pmi_re[eNB][0][0], + ue->measurements.subband_pmi_im[eNB][0][0], + ue->measurements.subband_pmi_re[eNB][1][0], + ue->measurements.subband_pmi_im[eNB][1][0], + ue->measurements.subband_pmi_re[eNB][2][0], + ue->measurements.subband_pmi_im[eNB][2][0], + ue->measurements.subband_pmi_re[eNB][3][0], + ue->measurements.subband_pmi_im[eNB][3][0], + ue->measurements.subband_pmi_re[eNB][4][0], + ue->measurements.subband_pmi_im[eNB][4][0], + ue->measurements.subband_pmi_re[eNB][5][0], + ue->measurements.subband_pmi_im[eNB][5][0]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][1]); + ue->measurements.subband_pmi_re[eNB][0][1], + ue->measurements.subband_pmi_im[eNB][0][1], + ue->measurements.subband_pmi_re[eNB][1][1], + ue->measurements.subband_pmi_im[eNB][1][1], + ue->measurements.subband_pmi_re[eNB][2][1], + ue->measurements.subband_pmi_im[eNB][2][1], + ue->measurements.subband_pmi_re[eNB][3][1], + ue->measurements.subband_pmi_im[eNB][3][1], + ue->measurements.subband_pmi_re[eNB][4][1], + ue->measurements.subband_pmi_im[eNB][4][1], + ue->measurements.subband_pmi_re[eNB][5][1], + ue->measurements.subband_pmi_im[eNB][5][1]); len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d]\n", eNB, - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][0], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][1], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][2], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][3], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][4], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][5]); + ue->measurements.selected_rx_antennas[eNB][0], + ue->measurements.selected_rx_antennas[eNB][1], + ue->measurements.selected_rx_antennas[eNB][2], + ue->measurements.selected_rx_antennas[eNB][3], + ue->measurements.selected_rx_antennas[eNB][4], + ue->measurements.selected_rx_antennas[eNB][5]); - len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&phy_vars_ue->PHY_measurements,eNB,6))); + len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&ue->measurements,eNB,6))); len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (both): %jx,%jx\n",eNB, - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,0,6)), - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,1,6))); + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,0,6)), + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,1,6))); break; case 25: len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][6]); + ue->measurements.subband_cqi_dB[eNB][0][0], + ue->measurements.subband_cqi_dB[eNB][0][1], + ue->measurements.subband_cqi_dB[eNB][0][2], + ue->measurements.subband_cqi_dB[eNB][0][3], + ue->measurements.subband_cqi_dB[eNB][0][4], + ue->measurements.subband_cqi_dB[eNB][0][5], + ue->measurements.subband_cqi_dB[eNB][0][6]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][6]); + ue->measurements.subband_cqi_dB[eNB][1][0], + ue->measurements.subband_cqi_dB[eNB][1][1], + ue->measurements.subband_cqi_dB[eNB][1][2], + ue->measurements.subband_cqi_dB[eNB][1][3], + ue->measurements.subband_cqi_dB[eNB][1][4], + ue->measurements.subband_cqi_dB[eNB][1][5], + ue->measurements.subband_cqi_dB[eNB][1][6]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][0]); + ue->measurements.subband_pmi_re[eNB][0][0], + ue->measurements.subband_pmi_im[eNB][0][0], + ue->measurements.subband_pmi_re[eNB][1][0], + ue->measurements.subband_pmi_im[eNB][1][0], + ue->measurements.subband_pmi_re[eNB][2][0], + ue->measurements.subband_pmi_im[eNB][2][0], + ue->measurements.subband_pmi_re[eNB][3][0], + ue->measurements.subband_pmi_im[eNB][3][0], + ue->measurements.subband_pmi_re[eNB][4][0], + ue->measurements.subband_pmi_im[eNB][4][0], + ue->measurements.subband_pmi_re[eNB][5][0], + ue->measurements.subband_pmi_im[eNB][5][0], + ue->measurements.subband_pmi_re[eNB][6][0], + ue->measurements.subband_pmi_im[eNB][6][0]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][1]); + ue->measurements.subband_pmi_re[eNB][0][1], + ue->measurements.subband_pmi_im[eNB][0][1], + ue->measurements.subband_pmi_re[eNB][1][1], + ue->measurements.subband_pmi_im[eNB][1][1], + ue->measurements.subband_pmi_re[eNB][2][1], + ue->measurements.subband_pmi_im[eNB][2][1], + ue->measurements.subband_pmi_re[eNB][3][1], + ue->measurements.subband_pmi_im[eNB][3][1], + ue->measurements.subband_pmi_re[eNB][4][1], + ue->measurements.subband_pmi_im[eNB][4][1], + ue->measurements.subband_pmi_re[eNB][5][1], + ue->measurements.subband_pmi_im[eNB][5][1], + ue->measurements.subband_pmi_re[eNB][6][1], + ue->measurements.subband_pmi_im[eNB][6][1]); len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d %d]\n", eNB, - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][0], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][1], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][2], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][3], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][4], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][5], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][6]); + ue->measurements.selected_rx_antennas[eNB][0], + ue->measurements.selected_rx_antennas[eNB][1], + ue->measurements.selected_rx_antennas[eNB][2], + ue->measurements.selected_rx_antennas[eNB][3], + ue->measurements.selected_rx_antennas[eNB][4], + ue->measurements.selected_rx_antennas[eNB][5], + ue->measurements.selected_rx_antennas[eNB][6]); - len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&phy_vars_ue->PHY_measurements,eNB,7))); + len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&ue->measurements,eNB,7))); len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (both): %jx,%jx\n",eNB, - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,0,7)), - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,1,7))); + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,0,7)), + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,1,7))); break; case 50: len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][6], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][7], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][8]); + ue->measurements.subband_cqi_dB[eNB][0][0], + ue->measurements.subband_cqi_dB[eNB][0][1], + ue->measurements.subband_cqi_dB[eNB][0][2], + ue->measurements.subband_cqi_dB[eNB][0][3], + ue->measurements.subband_cqi_dB[eNB][0][4], + ue->measurements.subband_cqi_dB[eNB][0][5], + ue->measurements.subband_cqi_dB[eNB][0][6], + ue->measurements.subband_cqi_dB[eNB][0][7], + ue->measurements.subband_cqi_dB[eNB][0][8]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][6], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][7], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][8]); + ue->measurements.subband_cqi_dB[eNB][1][0], + ue->measurements.subband_cqi_dB[eNB][1][1], + ue->measurements.subband_cqi_dB[eNB][1][2], + ue->measurements.subband_cqi_dB[eNB][1][3], + ue->measurements.subband_cqi_dB[eNB][1][4], + ue->measurements.subband_cqi_dB[eNB][1][5], + ue->measurements.subband_cqi_dB[eNB][1][6], + ue->measurements.subband_cqi_dB[eNB][1][7], + ue->measurements.subband_cqi_dB[eNB][1][8]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][7][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][7][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][8][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][8][0]); + ue->measurements.subband_pmi_re[eNB][0][0], + ue->measurements.subband_pmi_im[eNB][0][0], + ue->measurements.subband_pmi_re[eNB][1][0], + ue->measurements.subband_pmi_im[eNB][1][0], + ue->measurements.subband_pmi_re[eNB][2][0], + ue->measurements.subband_pmi_im[eNB][2][0], + ue->measurements.subband_pmi_re[eNB][3][0], + ue->measurements.subband_pmi_im[eNB][3][0], + ue->measurements.subband_pmi_re[eNB][4][0], + ue->measurements.subband_pmi_im[eNB][4][0], + ue->measurements.subband_pmi_re[eNB][5][0], + ue->measurements.subband_pmi_im[eNB][5][0], + ue->measurements.subband_pmi_re[eNB][6][0], + ue->measurements.subband_pmi_im[eNB][6][0], + ue->measurements.subband_pmi_re[eNB][7][0], + ue->measurements.subband_pmi_im[eNB][7][0], + ue->measurements.subband_pmi_re[eNB][8][0], + ue->measurements.subband_pmi_im[eNB][8][0]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][7][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][7][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][8][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][8][1]); + ue->measurements.subband_pmi_re[eNB][0][1], + ue->measurements.subband_pmi_im[eNB][0][1], + ue->measurements.subband_pmi_re[eNB][1][1], + ue->measurements.subband_pmi_im[eNB][1][1], + ue->measurements.subband_pmi_re[eNB][2][1], + ue->measurements.subband_pmi_im[eNB][2][1], + ue->measurements.subband_pmi_re[eNB][3][1], + ue->measurements.subband_pmi_im[eNB][3][1], + ue->measurements.subband_pmi_re[eNB][4][1], + ue->measurements.subband_pmi_im[eNB][4][1], + ue->measurements.subband_pmi_re[eNB][5][1], + ue->measurements.subband_pmi_im[eNB][5][1], + ue->measurements.subband_pmi_re[eNB][6][1], + ue->measurements.subband_pmi_im[eNB][6][1], + ue->measurements.subband_pmi_re[eNB][7][1], + ue->measurements.subband_pmi_im[eNB][7][1], + ue->measurements.subband_pmi_re[eNB][8][1], + ue->measurements.subband_pmi_im[eNB][8][1]); len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d %d %d %d]\n", eNB, - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][0], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][1], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][2], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][3], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][4], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][5], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][6], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][7], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][8]); + ue->measurements.selected_rx_antennas[eNB][0], + ue->measurements.selected_rx_antennas[eNB][1], + ue->measurements.selected_rx_antennas[eNB][2], + ue->measurements.selected_rx_antennas[eNB][3], + ue->measurements.selected_rx_antennas[eNB][4], + ue->measurements.selected_rx_antennas[eNB][5], + ue->measurements.selected_rx_antennas[eNB][6], + ue->measurements.selected_rx_antennas[eNB][7], + ue->measurements.selected_rx_antennas[eNB][8]); - len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&phy_vars_ue->PHY_measurements,eNB,9))); + len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&ue->measurements,eNB,9))); len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (both): %jx,%jx\n",eNB, - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,0,9)), - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,1,9))); + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,0,9)), + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,1,9))); break; case 100: len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d %d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][6], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][7], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][8], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][9], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][10], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][11], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][12]); + ue->measurements.subband_cqi_dB[eNB][0][0], + ue->measurements.subband_cqi_dB[eNB][0][1], + ue->measurements.subband_cqi_dB[eNB][0][2], + ue->measurements.subband_cqi_dB[eNB][0][3], + ue->measurements.subband_cqi_dB[eNB][0][4], + ue->measurements.subband_cqi_dB[eNB][0][5], + ue->measurements.subband_cqi_dB[eNB][0][6], + ue->measurements.subband_cqi_dB[eNB][0][7], + ue->measurements.subband_cqi_dB[eNB][0][8], + ue->measurements.subband_cqi_dB[eNB][0][9], + ue->measurements.subband_cqi_dB[eNB][0][10], + ue->measurements.subband_cqi_dB[eNB][0][11], + ue->measurements.subband_cqi_dB[eNB][0][12]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d %d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][6], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][7], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][8], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][9], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][10], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][11], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][12]); + ue->measurements.subband_cqi_dB[eNB][1][0], + ue->measurements.subband_cqi_dB[eNB][1][1], + ue->measurements.subband_cqi_dB[eNB][1][2], + ue->measurements.subband_cqi_dB[eNB][1][3], + ue->measurements.subband_cqi_dB[eNB][1][4], + ue->measurements.subband_cqi_dB[eNB][1][5], + ue->measurements.subband_cqi_dB[eNB][1][6], + ue->measurements.subband_cqi_dB[eNB][1][7], + ue->measurements.subband_cqi_dB[eNB][1][8], + ue->measurements.subband_cqi_dB[eNB][1][9], + ue->measurements.subband_cqi_dB[eNB][1][10], + ue->measurements.subband_cqi_dB[eNB][1][11], + ue->measurements.subband_cqi_dB[eNB][1][12]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][7][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][7][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][8][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][8][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][9][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][9][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][10][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][10][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][11][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][11][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][12][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][12][0]); + ue->measurements.subband_pmi_re[eNB][0][0], + ue->measurements.subband_pmi_im[eNB][0][0], + ue->measurements.subband_pmi_re[eNB][1][0], + ue->measurements.subband_pmi_im[eNB][1][0], + ue->measurements.subband_pmi_re[eNB][2][0], + ue->measurements.subband_pmi_im[eNB][2][0], + ue->measurements.subband_pmi_re[eNB][3][0], + ue->measurements.subband_pmi_im[eNB][3][0], + ue->measurements.subband_pmi_re[eNB][4][0], + ue->measurements.subband_pmi_im[eNB][4][0], + ue->measurements.subband_pmi_re[eNB][5][0], + ue->measurements.subband_pmi_im[eNB][5][0], + ue->measurements.subband_pmi_re[eNB][6][0], + ue->measurements.subband_pmi_im[eNB][6][0], + ue->measurements.subband_pmi_re[eNB][7][0], + ue->measurements.subband_pmi_im[eNB][7][0], + ue->measurements.subband_pmi_re[eNB][8][0], + ue->measurements.subband_pmi_im[eNB][8][0], + ue->measurements.subband_pmi_re[eNB][9][0], + ue->measurements.subband_pmi_im[eNB][9][0], + ue->measurements.subband_pmi_re[eNB][10][0], + ue->measurements.subband_pmi_im[eNB][10][0], + ue->measurements.subband_pmi_re[eNB][11][0], + ue->measurements.subband_pmi_im[eNB][11][0], + ue->measurements.subband_pmi_re[eNB][12][0], + ue->measurements.subband_pmi_im[eNB][12][0]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][7][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][7][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][8][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][8][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][9][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][9][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][10][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][10][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][11][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][11][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][12][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][12][1]); + ue->measurements.subband_pmi_re[eNB][0][1], + ue->measurements.subband_pmi_im[eNB][0][1], + ue->measurements.subband_pmi_re[eNB][1][1], + ue->measurements.subband_pmi_im[eNB][1][1], + ue->measurements.subband_pmi_re[eNB][2][1], + ue->measurements.subband_pmi_im[eNB][2][1], + ue->measurements.subband_pmi_re[eNB][3][1], + ue->measurements.subband_pmi_im[eNB][3][1], + ue->measurements.subband_pmi_re[eNB][4][1], + ue->measurements.subband_pmi_im[eNB][4][1], + ue->measurements.subband_pmi_re[eNB][5][1], + ue->measurements.subband_pmi_im[eNB][5][1], + ue->measurements.subband_pmi_re[eNB][6][1], + ue->measurements.subband_pmi_im[eNB][6][1], + ue->measurements.subband_pmi_re[eNB][7][1], + ue->measurements.subband_pmi_im[eNB][7][1], + ue->measurements.subband_pmi_re[eNB][8][1], + ue->measurements.subband_pmi_im[eNB][8][1], + ue->measurements.subband_pmi_re[eNB][9][1], + ue->measurements.subband_pmi_im[eNB][9][1], + ue->measurements.subband_pmi_re[eNB][10][1], + ue->measurements.subband_pmi_im[eNB][10][1], + ue->measurements.subband_pmi_re[eNB][11][1], + ue->measurements.subband_pmi_im[eNB][11][1], + ue->measurements.subband_pmi_re[eNB][12][1], + ue->measurements.subband_pmi_im[eNB][12][1]); len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d %d %d %d %d %d %d %d]\n", eNB, - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][0], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][1], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][2], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][3], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][4], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][5], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][6], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][7], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][8], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][9], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][10], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][11], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][12]); + ue->measurements.selected_rx_antennas[eNB][0], + ue->measurements.selected_rx_antennas[eNB][1], + ue->measurements.selected_rx_antennas[eNB][2], + ue->measurements.selected_rx_antennas[eNB][3], + ue->measurements.selected_rx_antennas[eNB][4], + ue->measurements.selected_rx_antennas[eNB][5], + ue->measurements.selected_rx_antennas[eNB][6], + ue->measurements.selected_rx_antennas[eNB][7], + ue->measurements.selected_rx_antennas[eNB][8], + ue->measurements.selected_rx_antennas[eNB][9], + ue->measurements.selected_rx_antennas[eNB][10], + ue->measurements.selected_rx_antennas[eNB][11], + ue->measurements.selected_rx_antennas[eNB][12]); - len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&phy_vars_ue->PHY_measurements,eNB,13))); + len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&ue->measurements,eNB,13))); len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (both): %jx,%jx\n",eNB, - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,0,13)), - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,1,13))); + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,0,13)), + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,1,13))); break; } #ifdef OPENAIR2 - RRC_status = mac_UE_get_rrc_status(phy_vars_ue->Mod_id, 0); + RRC_status = mac_UE_get_rrc_status(ue->Mod_id, 0); len += sprintf(&buffer[len],"[UE PROC] RRC status = %d\n",RRC_status); #endif - len += sprintf(&buffer[len], "[UE PROC] Transmission Mode %d (mode1_flag %d)\n",phy_vars_ue->transmission_mode[eNB],phy_vars_ue->lte_frame_parms.mode1_flag); + len += sprintf(&buffer[len], "[UE PROC] Transmission Mode %d (mode1_flag %d)\n",ue->transmission_mode[eNB],ue->frame_parms.mode1_flag); len += sprintf(&buffer[len], "[UE PROC] PBCH err conseq %d, PBCH error total %d, PBCH FER %d\n", - phy_vars_ue->lte_ue_pbch_vars[eNB]->pdu_errors_conseq, - phy_vars_ue->lte_ue_pbch_vars[eNB]->pdu_errors, - phy_vars_ue->lte_ue_pbch_vars[eNB]->pdu_fer); + ue->pbch_vars[eNB]->pdu_errors_conseq, + ue->pbch_vars[eNB]->pdu_errors, + ue->pbch_vars[eNB]->pdu_fer); - if (phy_vars_ue->transmission_mode[eNB] == 6) - len += sprintf(&buffer[len], "[UE PROC] Mode 6 Wideband CQI eNB %d : %d dB\n",eNB,phy_vars_ue->PHY_measurements.precoded_cqi_dB[eNB][0]); + if (ue->transmission_mode[eNB] == 6) + len += sprintf(&buffer[len], "[UE PROC] Mode 6 Wideband CQI eNB %d : %d dB\n",eNB,ue->measurements.precoded_cqi_dB[eNB][0]); for (harq_pid=0;harq_pid<8;harq_pid++) { - len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 0 harq_pid %d, mcs %d:",eNB,harq_pid,phy_vars_ue->dlsch_ue[0][0]->harq_processes[harq_pid]->mcs); + len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 0 harq_pid %d, mcs %d:",eNB,harq_pid,ue->dlsch[0][0]->harq_processes[harq_pid]->mcs); for (round=0;round<8;round++) len+=sprintf(&buffer[len],"%d/%d ", - phy_vars_ue->dlsch_ue[0][0]->harq_processes[harq_pid]->errors[round], - phy_vars_ue->dlsch_ue[0][0]->harq_processes[harq_pid]->trials[round]); + ue->dlsch[0][0]->harq_processes[harq_pid]->errors[round], + ue->dlsch[0][0]->harq_processes[harq_pid]->trials[round]); len+=sprintf(&buffer[len],"\n"); } - if (phy_vars_ue->dlsch_ue[0] && phy_vars_ue->dlsch_ue[0][0] && phy_vars_ue->dlsch_ue[0][1]) { - len += sprintf(&buffer[len], "[UE PROC] Saved PMI for DLSCH eNB %d : %jx (%p)\n",eNB,pmi2hex_2Ar1(phy_vars_ue->dlsch_ue[0][0]->pmi_alloc),phy_vars_ue->dlsch_ue[0][0]); + if (ue->dlsch[0] && ue->dlsch[0][0] && ue->dlsch[0][1]) { + len += sprintf(&buffer[len], "[UE PROC] Saved PMI for DLSCH eNB %d : %jx (%p)\n",eNB,pmi2hex_2Ar1(ue->dlsch[0][0]->pmi_alloc),ue->dlsch[0][0]); - len += sprintf(&buffer[len], "[UE PROC] eNB %d: dl_power_off = %d\n",eNB,phy_vars_ue->dlsch_ue[0][0]->harq_processes[0]->dl_power_off); + len += sprintf(&buffer[len], "[UE PROC] eNB %d: dl_power_off = %d\n",eNB,ue->dlsch[0][0]->harq_processes[0]->dl_power_off); for (harq_pid=0;harq_pid<8;harq_pid++) { - len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 1 harq_pid %d, mcs %d:",eNB,harq_pid,phy_vars_ue->dlsch_ue[0][1]->harq_processes[0]->mcs); + len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 1 harq_pid %d, mcs %d:",eNB,harq_pid,ue->dlsch[0][1]->harq_processes[0]->mcs); for (round=0;round<8;round++) len+=sprintf(&buffer[len],"%d/%d ", - phy_vars_ue->dlsch_ue[0][1]->harq_processes[harq_pid]->errors[round], - phy_vars_ue->dlsch_ue[0][1]->harq_processes[harq_pid]->trials[round]); + ue->dlsch[0][1]->harq_processes[harq_pid]->errors[round], + ue->dlsch[0][1]->harq_processes[harq_pid]->trials[round]); len+=sprintf(&buffer[len],"\n"); } } - len += sprintf(&buffer[len], "[UE PROC] DLSCH Total %d, Error %d, FER %d\n",phy_vars_ue->dlsch_received[0],phy_vars_ue->dlsch_errors[0],phy_vars_ue->dlsch_fer[0]); - len += sprintf(&buffer[len], "[UE PROC] DLSCH (SI) Total %d, Error %d\n",phy_vars_ue->dlsch_SI_received[0],phy_vars_ue->dlsch_SI_errors[0]); - len += sprintf(&buffer[len], "[UE PROC] DLSCH (RA) Total %d, Error %d\n",phy_vars_ue->dlsch_ra_received[0],phy_vars_ue->dlsch_ra_errors[0]); + len += sprintf(&buffer[len], "[UE PROC] DLSCH Total %d, Error %d, FER %d\n",ue->dlsch_received[0],ue->dlsch_errors[0],ue->dlsch_fer[0]); + len += sprintf(&buffer[len], "[UE PROC] DLSCH (SI) Total %d, Error %d\n",ue->dlsch_SI_received[0],ue->dlsch_SI_errors[0]); + len += sprintf(&buffer[len], "[UE PROC] DLSCH (RA) Total %d, Error %d\n",ue->dlsch_ra_received[0],ue->dlsch_ra_errors[0]); #ifdef Rel10 int i=0; - //len += sprintf(&buffer[len], "[UE PROC] MCH Total %d\n", phy_vars_ue->dlsch_mch_received[0]); - for(i=0; i lte_frame_parms.num_MBSFN_config; i++ ) { + //len += sprintf(&buffer[len], "[UE PROC] MCH Total %d\n", ue->dlsch_mch_received[0]); + for(i=0; i frame_parms.num_MBSFN_config; i++ ) { len += sprintf(&buffer[len], "[UE PROC] MCH (MCCH MBSFN %d) Total %d, Error %d, Trials %d\n", - i, phy_vars_ue->dlsch_mcch_received[i][0],phy_vars_ue->dlsch_mcch_errors[i][0],phy_vars_ue->dlsch_mcch_trials[i][0]); + i, ue->dlsch_mcch_received[i][0],ue->dlsch_mcch_errors[i][0],ue->dlsch_mcch_trials[i][0]); len += sprintf(&buffer[len], "[UE PROC] MCH (MTCH MBSFN %d) Total %d, Error %d, Trials %d\n", - i, phy_vars_ue->dlsch_mtch_received[i][0],phy_vars_ue->dlsch_mtch_errors[i][0],phy_vars_ue->dlsch_mtch_trials[i][0]); + i, ue->dlsch_mtch_received[i][0],ue->dlsch_mtch_errors[i][0],ue->dlsch_mtch_trials[i][0]); } #endif - len += sprintf(&buffer[len], "[UE PROC] DLSCH Bitrate %dkbps\n",(phy_vars_ue->bitrate[0]/1000)); - len += sprintf(&buffer[len], "[UE PROC] Total Received Bits %dkbits\n",(phy_vars_ue->total_received_bits[0]/1000)); - len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",phy_vars_ue->use_ia_receiver); + len += sprintf(&buffer[len], "[UE PROC] DLSCH Bitrate %dkbps\n",(ue->bitrate[0]/1000)); + len += sprintf(&buffer[len], "[UE PROC] Total Received Bits %dkbits\n",(ue->total_received_bits[0]/1000)); + len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",ue->use_ia_receiver); } } else { len += sprintf(&buffer[len], "[UE PROC] Frame count: %d, RSSI %3.2f dB (%d dB, %d dB), N0 %3.2f dB (%d dB, %d dB)\n", - phy_vars_ue->frame_rx, - 10*log10(phy_vars_ue->PHY_measurements.rssi), - phy_vars_ue->PHY_measurements.rx_power_dB[0][0], - phy_vars_ue->PHY_measurements.rx_power_dB[0][1], - 10*log10(phy_vars_ue->PHY_measurements.n0_power_tot), - phy_vars_ue->PHY_measurements.n0_power_dB[0], - phy_vars_ue->PHY_measurements.n0_power_dB[1]); + ue->frame_rx, + 10*log10(ue->measurements.rssi), + ue->measurements.rx_power_dB[0][0], + ue->measurements.rx_power_dB[0][1], + 10*log10(ue->measurements.n0_power_tot), + ue->measurements.n0_power_dB[0], + ue->measurements.n0_power_dB[1]); #ifdef EXMIMO - phy_vars_ue->rx_total_gain_dB = ((int)(10*log10(phy_vars_ue->PHY_measurements.rssi)))-input_level_dBm; + ue->rx_total_gain_dB = ((int)(10*log10(ue->measurements.rssi)))-input_level_dBm; len += sprintf(&buffer[len], "[UE PROC] rxg_mode %d, input level (set by user) %d dBm, VGA gain %d dB ==> total gain %3.2f dB, noise figure %3.2f dB\n", openair0_cfg[0].rxg_mode[0], input_level_dBm, (int)openair0_cfg[0].rx_gain[0], - 10*log10(phy_vars_ue->PHY_measurements.rssi)-input_level_dBm, - 10*log10(phy_vars_ue->PHY_measurements.n0_power_tot)-phy_vars_ue->rx_total_gain_dB+105); + 10*log10(ue->measurements.rssi)-input_level_dBm, + 10*log10(ue->measurements.n0_power_tot)-ue->rx_total_gain_dB+105); #endif } @@ -559,137 +559,137 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t } // is_clusterhead -int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) +int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) { unsigned int success=0; - uint8_t eNB,UE_id,i,j,number_of_cards_l=1; + uint8_t eNB_id,UE_id,i,j,number_of_cards_l=1; uint32_t ulsch_errors=0,dlsch_errors=0; uint32_t ulsch_round_attempts[4]= {0,0,0,0},ulsch_round_errors[4]= {0,0,0,0}; uint32_t dlsch_round_attempts[4]= {0,0,0,0},dlsch_round_errors[4]= {0,0,0,0}; uint32_t UE_id_mac, RRC_status; - if (phy_vars_eNB==NULL) + if (eNB==NULL) return 0; int len = length; - // if(phy_vars_eNB->frame==0){ - phy_vars_eNB->total_dlsch_bitrate = 0;//phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_bitrate + phy_vars_eNB->total_dlsch_bitrate; - phy_vars_eNB->total_transmitted_bits = 0;// phy_vars_eNB->eNB_UE_stats[UE_id].total_transmitted_bits + phy_vars_eNB->total_transmitted_bits; - phy_vars_eNB->total_system_throughput = 0;//phy_vars_eNB->eNB_UE_stats[UE_id].total_transmitted_bits + phy_vars_eNB->total_system_throughput; + // if(eNB->frame==0){ + eNB->total_dlsch_bitrate = 0;//eNB->UE_stats[UE_id].dlsch_bitrate + eNB->total_dlsch_bitrate; + eNB->total_transmitted_bits = 0;// eNB->UE_stats[UE_id].total_transmitted_bits + eNB->total_transmitted_bits; + eNB->total_system_throughput = 0;//eNB->UE_stats[UE_id].total_transmitted_bits + eNB->total_system_throughput; // } - for (eNB=0; eNBproc[0].frame_tx, - phy_vars_eNB->rx_total_gain_eNB_dB, - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_tot_dBm, - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[1]); + eNB_id,number_of_cards_l, + eNB->proc[0].frame_tx, + eNB->rx_total_gain_dB, + eNB->measurements[eNB_id].n0_power_tot_dBm, + eNB->measurements[eNB_id].n0_power_dB[0], + eNB->measurements[eNB_id].n0_power_dB[1]); len += sprintf(&buffer[len],"PRB I0 (%X.%X.%X.%X): ", - phy_vars_eNB->rb_mask_ul[0], - phy_vars_eNB->rb_mask_ul[1],phy_vars_eNB->rb_mask_ul[2],phy_vars_eNB->rb_mask_ul[3]); + eNB->rb_mask_ul[0], + eNB->rb_mask_ul[1],eNB->rb_mask_ul[2],eNB->rb_mask_ul[3]); - for (i=0; ilte_frame_parms.N_RB_UL; i++) { + for (i=0; iframe_parms.N_RB_UL; i++) { len += sprintf(&buffer[len],"%4d ", - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dBm[i]); + eNB->measurements[eNB_id].n0_subband_power_tot_dBm[i]); if ((i>0) && ((i%25) == 0)) len += sprintf(&buffer[len],"\n"); } len += sprintf(&buffer[len],"\n"); len += sprintf(&buffer[len],"\nPERFORMANCE PARAMETERS\n"); /* - len += sprintf(&buffer[len],"[eNB PROC] Total DLSCH Bitrate for the System %dkbps\n",((phy_vars_eNB->eNB_UE_stats[0].dlsch_bitrate + phy_vars_eNB->eNB_UE_stats[1].dlsch_bitrate)/1000)); - len += sprintf(&buffer[len],"[eNB PROC] Total Bits successfully transitted %dKbits in %dframe(s)\n",((phy_vars_eNB->eNB_UE_stats[0].total_transmitted_bits + phy_vars_eNB->eNB_UE_stats[1].total_transmitted_bits)/1000),phy_vars_eNB->frame+1); - len += sprintf(&buffer[len],"[eNB PROC] Average System Throughput %dKbps\n",(phy_vars_eNB->eNB_UE_stats[0].total_transmitted_bits + phy_vars_eNB->eNB_UE_stats[1].total_transmitted_bits)/((phy_vars_eNB->frame+1)*10)); + len += sprintf(&buffer[len],"[eNB PROC] Total DLSCH Bitrate for the System %dkbps\n",((eNB->UE_stats[0].dlsch_bitrate + eNB->UE_stats[1].dlsch_bitrate)/1000)); + len += sprintf(&buffer[len],"[eNB PROC] Total Bits successfully transitted %dKbits in %dframe(s)\n",((eNB->UE_stats[0].total_transmitted_bits + eNB->UE_stats[1].total_transmitted_bits)/1000),eNB->frame+1); + len += sprintf(&buffer[len],"[eNB PROC] Average System Throughput %dKbps\n",(eNB->UE_stats[0].total_transmitted_bits + eNB->UE_stats[1].total_transmitted_bits)/((eNB->frame+1)*10)); */ for (UE_id=0; UE_iddlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (phy_vars_eNB->eNB_UE_stats[UE_id].mode == PUSCH)) { + if ((eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& + (eNB->UE_stats[UE_id].mode == PUSCH)) { - phy_vars_eNB->total_dlsch_bitrate = phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_bitrate + phy_vars_eNB->total_dlsch_bitrate; - phy_vars_eNB->total_transmitted_bits = phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS + phy_vars_eNB->total_transmitted_bits; + eNB->total_dlsch_bitrate = eNB->UE_stats[UE_id].dlsch_bitrate + eNB->total_dlsch_bitrate; + eNB->total_transmitted_bits = eNB->UE_stats[UE_id].total_TBS + eNB->total_transmitted_bits; - //phy_vars_eNB->total_system_throughput = phy_vars_eNB->eNB_UE_stats[UE_id].total_transmitted_bits + phy_vars_eNB->total_system_throughput; + //eNB->total_system_throughput = eNB->UE_stats[UE_id].total_transmitted_bits + eNB->total_system_throughput; for (i=0; i<8; i++) - success = success + (phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][0] - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_l2_errors[i]); + success = success + (eNB->UE_stats[UE_id].dlsch_trials[i][0] - eNB->UE_stats[UE_id].dlsch_l2_errors[i]); - len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(phy_vars_eNB->total_transmitted_bits/1000),phy_vars_eNB->proc[0].frame_tx+1); - len += sprintf(&buffer[len],"Total DLSCH throughput %d kbps ",(phy_vars_eNB->total_dlsch_bitrate/1000)); - len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,phy_vars_eNB->proc[0].frame_tx+1); - //len += sprintf(&buffer[len],"[eNB PROC] FULL MU-MIMO Transmissions/Total Transmissions = %d/%d\n",phy_vars_eNB->FULL_MUMIMO_transmissions,phy_vars_eNB->check_for_total_transmissions); - //len += sprintf(&buffer[len],"[eNB PROC] MU-MIMO Transmissions/Total Transmissions = %d/%d\n",phy_vars_eNB->check_for_MUMIMO_transmissions,phy_vars_eNB->check_for_total_transmissions); - //len += sprintf(&buffer[len],"[eNB PROC] SU-MIMO Transmissions/Total Transmissions = %d/%d\n",phy_vars_eNB->check_for_SUMIMO_transmissions,phy_vars_eNB->check_for_total_transmissions); + len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(eNB->total_transmitted_bits/1000),eNB->proc[0].frame_tx+1); + len += sprintf(&buffer[len],"Total DLSCH throughput %d kbps ",(eNB->total_dlsch_bitrate/1000)); + len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,eNB->proc[0].frame_tx+1); + //len += sprintf(&buffer[len],"[eNB PROC] FULL MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->FULL_MUMIMO_transmissions,eNB->check_for_total_transmissions); + //len += sprintf(&buffer[len],"[eNB PROC] MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_MUMIMO_transmissions,eNB->check_for_total_transmissions); + //len += sprintf(&buffer[len],"[eNB PROC] SU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_SUMIMO_transmissions,eNB->check_for_total_transmissions); len += sprintf(&buffer[len],"UE %d (%x) Power: (%d,%d) dB, Po_PUSCH: (%d,%d) dBm, Po_PUCCH (%d/%d) dBm, Po_PUCCH1 (%d,%d) dBm, PUCCH1 Thres %d dBm \n", UE_id, - phy_vars_eNB->eNB_UE_stats[UE_id].crnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[1], - dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, - phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, - dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, - PUCCH1_THRES+phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm-dB_fixed(phy_vars_eNB->lte_frame_parms.N_RB_UL)); + eNB->UE_stats[UE_id].crnti, + dB_fixed(eNB->pusch_vars[UE_id]->ulsch_power[0]), + dB_fixed(eNB->pusch_vars[UE_id]->ulsch_power[1]), + eNB->UE_stats[UE_id].UL_rssi[0], + eNB->UE_stats[UE_id].UL_rssi[1], + dB_fixed(eNB->UE_stats[UE_id].Po_PUCCH/eNB->frame_parms.N_RB_UL)-eNB->rx_total_gain_dB, + eNB->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + dB_fixed(eNB->UE_stats[UE_id].Po_PUCCH1_below/eNB->frame_parms.N_RB_UL)-eNB->rx_total_gain_dB, + dB_fixed(eNB->UE_stats[UE_id].Po_PUCCH1_above/eNB->frame_parms.N_RB_UL)-eNB->rx_total_gain_dB, + PUCCH1_THRES+eNB->measurements[0].n0_power_tot_dBm-dB_fixed(eNB->frame_parms.N_RB_UL)); len+= sprintf(&buffer[len],"DL mcs %d, UL mcs %d, UL rb %d, delta_TF %d, ", - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[0]->mcs, - phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[0]->mcs, - phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[0]->nb_rb, - phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[0]->delta_TF); + eNB->dlsch[(uint8_t)UE_id][0]->harq_processes[0]->mcs, + eNB->ulsch[(uint8_t)UE_id]->harq_processes[0]->mcs, + eNB->ulsch[(uint8_t)UE_id]->harq_processes[0]->nb_rb, + eNB->ulsch[(uint8_t)UE_id]->harq_processes[0]->delta_TF); len += sprintf(&buffer[len],"Wideband CQI: (%d,%d) dB\n", - phy_vars_eNB->PHY_measurements_eNB[eNB].wideband_cqi_dB[UE_id][0], - phy_vars_eNB->PHY_measurements_eNB[eNB].wideband_cqi_dB[UE_id][1]); + eNB->measurements[eNB_id].wideband_cqi_dB[UE_id][0], + eNB->measurements[eNB_id].wideband_cqi_dB[UE_id][1]); /* len += sprintf(&buffer[len],"[eNB PROC] Subband CQI: "); - for (i=0; ilte_frame_parms.N_RB_DL; i++) + for (i=0; iframe_parms.N_RB_DL; i++) len += sprintf(&buffer[len],"%2d ", - phy_vars_eNB->PHY_measurements_eNB[eNB].subband_cqi_tot_dB[UE_id][i]); + eNB->measurements[eNB_id].subband_cqi_tot_dB[UE_id][i]); len += sprintf(&buffer[len],"\n"); */ len += sprintf(&buffer[len],"DL TM %d, DL_cqi %d, DL_pmi_single %jx ", - phy_vars_eNB->transmission_mode[UE_id], - phy_vars_eNB->eNB_UE_stats[UE_id].DL_cqi[0], - pmi2hex_2Ar1(phy_vars_eNB->eNB_UE_stats[UE_id].DL_pmi_single)); + eNB->transmission_mode[UE_id], + eNB->UE_stats[UE_id].DL_cqi[0], + pmi2hex_2Ar1(eNB->UE_stats[UE_id].DL_pmi_single)); len += sprintf(&buffer[len],"Timing advance %d samples (%d 16Ts), update %d ", - phy_vars_eNB->eNB_UE_stats[UE_id].UE_timing_offset, - phy_vars_eNB->eNB_UE_stats[UE_id].UE_timing_offset>>2, - phy_vars_eNB->eNB_UE_stats[UE_id].timing_advance_update); + eNB->UE_stats[UE_id].UE_timing_offset, + eNB->UE_stats[UE_id].UE_timing_offset>>2, + eNB->UE_stats[UE_id].timing_advance_update); len += sprintf(&buffer[len],"Mode = %s(%d) ", - mode_string[phy_vars_eNB->eNB_UE_stats[UE_id].mode], - phy_vars_eNB->eNB_UE_stats[UE_id].mode); - UE_id_mac = find_UE_id(phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti); + mode_string[eNB->UE_stats[UE_id].mode], + eNB->UE_stats[UE_id].mode); + UE_id_mac = find_UE_id(eNB->Mod_id,eNB->dlsch[(uint8_t)UE_id][0]->rnti); if (UE_id_mac != -1) { - RRC_status = mac_eNB_get_rrc_status(phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti); + RRC_status = mac_eNB_get_rrc_status(eNB->Mod_id,eNB->dlsch[(uint8_t)UE_id][0]->rnti); len += sprintf(&buffer[len],"UE_id_mac = %d, RRC status = %d\n",UE_id_mac,RRC_status); } else len += sprintf(&buffer[len],"UE_id_mac = -1\n"); len += sprintf(&buffer[len],"SR received/total: %d/%d (diff %d)\n", - phy_vars_eNB->eNB_UE_stats[UE_id].sr_received, - phy_vars_eNB->eNB_UE_stats[UE_id].sr_total, - phy_vars_eNB->eNB_UE_stats[UE_id].sr_total-phy_vars_eNB->eNB_UE_stats[UE_id].sr_received); + eNB->UE_stats[UE_id].sr_received, + eNB->UE_stats[UE_id].sr_total, + eNB->UE_stats[UE_id].sr_total-eNB->UE_stats[UE_id].sr_received); len += sprintf(&buffer[len],"DL Subband CQI: "); int nb_sb; - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: nb_sb=0; break; @@ -713,7 +713,7 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) } for (i=0; ieNB_UE_stats[UE_id].DL_subband_cqi[0][i]); + eNB->UE_stats[UE_id].DL_subband_cqi[0][i]); len += sprintf(&buffer[len],"\n"); @@ -730,25 +730,25 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) for (i=0; i<8; i++) { len += sprintf(&buffer[len]," harq %d: %d/%d (fer %d) (%d/%d, %d/%d, %d/%d, %d/%d) ", i, - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_errors[i], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_fer[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][3], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][3]); + eNB->UE_stats[UE_id].ulsch_errors[i], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][0], + eNB->UE_stats[UE_id].ulsch_round_fer[i][0], + eNB->UE_stats[UE_id].ulsch_round_errors[i][0], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][0], + eNB->UE_stats[UE_id].ulsch_round_errors[i][1], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][1], + eNB->UE_stats[UE_id].ulsch_round_errors[i][2], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][2], + eNB->UE_stats[UE_id].ulsch_round_errors[i][3], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][3]); if ((i&1) == 1) len += sprintf(&buffer[len],"\n"); - ulsch_errors+=phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_errors[i]; + ulsch_errors+=eNB->UE_stats[UE_id].ulsch_errors[i]; for (j=0; j<4; j++) { - ulsch_round_attempts[j]+=phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][j]; - ulsch_round_errors[j]+=phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][j]; + ulsch_round_attempts[j]+=eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][j]; + ulsch_round_errors[j]+=eNB->UE_stats[UE_id].ulsch_round_errors[i][j]; } } @@ -772,29 +772,29 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) for (i=0; i<8; i++) { len += sprintf(&buffer[len]," harq %d: %d/%d (%d/%d/%d, %d/%d/%d, %d/%d/%d, %d/%d/%d) ", i, - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_l2_errors[i], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_ACK[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_ACK[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_ACK[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_ACK[i][3], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][3], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][3]); + eNB->UE_stats[UE_id].dlsch_l2_errors[i], + eNB->UE_stats[UE_id].dlsch_trials[i][0], + eNB->UE_stats[UE_id].dlsch_ACK[i][0], + eNB->UE_stats[UE_id].dlsch_NAK[i][0], + eNB->UE_stats[UE_id].dlsch_trials[i][0], + eNB->UE_stats[UE_id].dlsch_ACK[i][1], + eNB->UE_stats[UE_id].dlsch_NAK[i][1], + eNB->UE_stats[UE_id].dlsch_trials[i][1], + eNB->UE_stats[UE_id].dlsch_ACK[i][2], + eNB->UE_stats[UE_id].dlsch_NAK[i][2], + eNB->UE_stats[UE_id].dlsch_trials[i][2], + eNB->UE_stats[UE_id].dlsch_ACK[i][3], + eNB->UE_stats[UE_id].dlsch_NAK[i][3], + eNB->UE_stats[UE_id].dlsch_trials[i][3]); if ((i&1) == 1) len += sprintf(&buffer[len],"\n"); - dlsch_errors+=phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_l2_errors[i]; + dlsch_errors+=eNB->UE_stats[UE_id].dlsch_l2_errors[i]; for (j=0; j<4; j++) { - dlsch_round_attempts[j]+=phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][j]; - dlsch_round_errors[j]+=phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][j]; + dlsch_round_attempts[j]+=eNB->UE_stats[UE_id].dlsch_trials[i][j]; + dlsch_round_errors[j]+=eNB->UE_stats[UE_id].dlsch_NAK[i][j]; } } @@ -806,15 +806,15 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) dlsch_round_errors[3],dlsch_round_attempts[3]); - len += sprintf(&buffer[len],"DLSCH total bits from MAC: %dkbit ",(phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC)/1000); - len += sprintf(&buffer[len],"DLSCH total bits ack'ed: %dkbit ",(phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS)/1000); - len += sprintf(&buffer[len],"DLSCH Average throughput (100 frames): %dkbps\n",(phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_bitrate/1000)); - // len += sprintf(&buffer[len],"[eNB PROC] Transmission Mode %d\n",phy_vars_eNB->transmission_mode[UE_id]); + len += sprintf(&buffer[len],"DLSCH total bits from MAC: %dkbit ",(eNB->UE_stats[UE_id].total_TBS_MAC)/1000); + len += sprintf(&buffer[len],"DLSCH total bits ack'ed: %dkbit ",(eNB->UE_stats[UE_id].total_TBS)/1000); + len += sprintf(&buffer[len],"DLSCH Average throughput (100 frames): %dkbps\n",(eNB->UE_stats[UE_id].dlsch_bitrate/1000)); + // len += sprintf(&buffer[len],"[eNB PROC] Transmission Mode %d\n",eNB->transmission_mode[UE_id]); /* - if(phy_vars_eNB->transmission_mode[UE_id] == 5) { - if(phy_vars_eNB->mu_mimo_mode[UE_id].dl_pow_off == 0) + if(eNB->transmission_mode[UE_id] == 5) { + if(eNB->mu_mimo_mode[UE_id].dl_pow_off == 0) len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is in MU-MIMO mode****\n",UE_id); - else if(phy_vars_eNB->mu_mimo_mode[UE_id].dl_pow_off == 1) + else if(eNB->mu_mimo_mode[UE_id].dl_pow_off == 1) len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is in SU-MIMO mode****\n",UE_id); else len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is not scheduled****\n",UE_id); @@ -823,13 +823,13 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) /* len += sprintf(&buffer[len],"[eNB PROC] RB Allocation on Sub-bands: "); - // for (j=0;j< mac_xface->lte_frame_parms->N_RBGS;j++) + // for (j=0;j< mac_xface->frame_parms->N_RBGS;j++) for (j=0; j<7; j++) len += sprintf(&buffer[len],"%d ", - phy_vars_eNB->mu_mimo_mode[UE_id].rballoc_sub[j]); + eNB->mu_mimo_mode[UE_id].rballoc_sub[j]); len += sprintf(&buffer[len],"\n"); - len += sprintf(&buffer[len],"[eNB PROC] Total Number of Allocated PRBs = %d\n",phy_vars_eNB->mu_mimo_mode[UE_id].pre_nb_available_rbs); + len += sprintf(&buffer[len],"[eNB PROC] Total Number of Allocated PRBs = %d\n",eNB->mu_mimo_mode[UE_id].pre_nb_available_rbs); */ } } diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index e723eb67a4..75ebcdfbfe 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -400,7 +400,7 @@ void generate_pucch(int32_t **txdataF, } -void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue, +void generate_pucch_emul(PHY_VARS_UE *ue, PUCCH_FMT_t format, uint8_t ncs1, uint8_t *pucch_payload, @@ -408,32 +408,32 @@ void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue, uint8_t subframe) { - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_flag = format; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_Ncs1 = ncs1; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_flag = format; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_Ncs1 = ncs1; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.sr = sr; - // the value of phy_vars_ue->pucch_sel[subframe] is set by get_n1_pucch - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_sel = phy_vars_ue->pucch_sel[subframe]; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.sr = sr; + // the value of ue->pucch_sel[subframe] is set by get_n1_pucch + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_sel = ue->pucch_sel[subframe]; - // LOG_I(PHY,"subframe %d emu tx pucch_sel is %d sr is %d \n", subframe, UE_transport_info[phy_vars_ue->Mod_id].cntl.pucch_sel, sr); + // LOG_I(PHY,"subframe %d emu tx pucch_sel is %d sr is %d \n", subframe, UE_transport_info[ue->Mod_id].cntl.pucch_sel, sr); if (format == pucch_format1a) { - phy_vars_ue->pucch_payload[0] = pucch_payload[0]; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_payload = pucch_payload[0]; + ue->pucch_payload[0] = pucch_payload[0]; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0]; } else if (format == pucch_format1b) { - phy_vars_ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1); - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1); + ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1); + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1); } else if (format == pucch_format1) { - LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,sr); + LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,ue->frame_tx,subframe,sr); } - phy_vars_ue->sr[subframe] = sr; + ue->sr[subframe] = sr; } -uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, +uint32_t rx_pucch(PHY_VARS_eNB *eNB, PUCCH_FMT_t fmt, uint8_t UE_id, uint16_t n1_pucch, @@ -446,15 +446,15 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, static int first_call=1; - LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - // PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &phy_vars_eNB->pucch_config_dedicated[UE_id]; - int8_t sigma2_dB = phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dB[0]-10; - uint32_t *Po_PUCCH = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH); - int32_t *Po_PUCCH_dBm = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_dBm); - uint32_t *Po_PUCCH1_below = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below); - uint32_t *Po_PUCCH1_above = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above); - int32_t *Po_PUCCH_update = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_update); + LTE_eNB_COMMON *common_vars = &eNB->common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + // PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &eNB->pucch_config_dedicated[UE_id]; + int8_t sigma2_dB = eNB->measurements[0].n0_subband_power_tot_dB[0]-10; + uint32_t *Po_PUCCH = &(eNB->UE_stats[UE_id].Po_PUCCH); + int32_t *Po_PUCCH_dBm = &(eNB->UE_stats[UE_id].Po_PUCCH_dBm); + uint32_t *Po_PUCCH1_below = &(eNB->UE_stats[UE_id].Po_PUCCH1_below); + uint32_t *Po_PUCCH1_above = &(eNB->UE_stats[UE_id].Po_PUCCH1_above); + int32_t *Po_PUCCH_update = &(eNB->UE_stats[UE_id].Po_PUCCH_update); uint32_t u,v,n,aa; uint32_t z[12*14]; int16_t *zptr; @@ -486,8 +486,8 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, if (first_call == 1) { for (i=0;i<10;i++) { for (j=0;jpucch1_stats_cnt[j][i]=0; - phy_vars_eNB->pucch1ab_stats_cnt[j][i]=0; + eNB->pucch1_stats_cnt[j][i]=0; + eNB->pucch1ab_stats_cnt[j][i]=0; } } first_call=0; @@ -585,7 +585,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, //loop over symbols in slot for (l=0; lncs_cell[ns][l]; + n_cs = eNB->ncs_cell[ns][l]; if (frame_parms->Ncp==0) { // normal CP n_cs = ((uint16_t)n_cs + (nprime*deltaPUCCH_Shift + (n_oc%deltaPUCCH_Shift))%Nprime)%12; @@ -700,7 +700,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, re_offset -= (frame_parms->ofdm_symbol_size); symbol_offset = (unsigned int)frame_parms->ofdm_symbol_size*l; - rxptr = (int16_t *)&eNB_common_vars->rxdataF[0][aa][symbol_offset]; + rxptr = (int16_t *)&common_vars->rxdataF[0][aa][symbol_offset]; for (i=0; i<12; i++,j+=2,re_offset++) { rxcomp[aa][j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[j])>>15) - ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[1+j])>>15); @@ -789,17 +789,17 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, #endif #ifdef DEBUG_PUCCH_RX - LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,phase_max); + LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,phase_max); #endif - phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max; - phy_vars_eNB->pucch1_stats_thres[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres; - phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023; + eNB->pucch1_stats[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max; + eNB->pucch1_stats_thres[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres; + eNB->pucch1_stats_cnt[UE_id][subframe] = (eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023; /* - if (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] == 0) { + if (eNB->pucch1_stats_cnt[UE_id][subframe] == 0) { write_output("pucch_debug.m","pucch_energy", - &phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)], + &eNB->pucch1_stats[UE_id][(subframe<<10)], 1024,1,2); AssertFatal(0,"Exiting for PUCCH 1 debug\n"); @@ -810,13 +810,13 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) { *payload = 1; *Po_PUCCH1_above = ((*Po_PUCCH1_above<<9) + (stat_max<<9)+1024)>>10; - //LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max); + //LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max); } else { *payload = 0; *Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10; } - LOG_D(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above)); + LOG_D(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above)); *Po_PUCCH_update = 1; if (UE_id==0) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_ENERGY,dB_fixed(stat_max)); @@ -910,7 +910,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, stat_im=0; LOG_D(PHY,"PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH); *Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1)); - *Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - phy_vars_eNB->rx_total_gain_eNB_dB; + *Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - eNB->rx_total_gain_dB; *Po_PUCCH_update = 1; LOG_D(PHY,"PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n", @@ -1030,12 +1030,12 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, #ifdef DEBUG_PUCCH_RX LOG_I(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im, - (subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])); + (subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])); #endif - phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re); - phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im); - phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; + eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re); + eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im); + eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; @@ -1045,9 +1045,9 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, *(1+payload) = (stat_im<0) ? 1 : 0; } else { // insufficient energy on PUCCH so NAK *payload = 0; - ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re); - ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im); - phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; + ((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re); + ((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im); + eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; *payload = (stat_re<0) ? 1 : 0; @@ -1063,22 +1063,22 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, } -int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB, +int32_t rx_pucch_emul(PHY_VARS_eNB *eNB, uint8_t UE_index, PUCCH_FMT_t fmt, uint8_t n1_pucch_sel, uint8_t *payload, - uint8_t sched_subframe) + uint8_t thread_id) { uint8_t UE_id; uint16_t rnti; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - uint8_t CC_id = phy_vars_eNB->CC_id; + int subframe = eNB->proc[thread_id].subframe_rx; + uint8_t CC_id = eNB->CC_id; - rnti = phy_vars_eNB->ulsch_eNB[UE_index]->rnti; + rnti = eNB->ulsch[UE_index]->rnti; for (UE_id=0; UE_idlte_ue_pdcch_vars[0]->crnti) + if (rnti == PHY_vars_UE_g[UE_id][CC_id]->pdcch_vars[0]->crnti) break; } @@ -1095,7 +1095,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB, payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0]; payload[1] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[1]; } else - LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",phy_vars_eNB->proc[sched_subframe].frame_rx); + LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",eNB->proc[thread_id].frame_rx); if (PHY_vars_UE_g[UE_id][CC_id]->pucch_sel[subframe] == n1_pucch_sel) return(99); diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c index 40dec0ec6f..dbac1e2280 100644 --- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c @@ -174,27 +174,28 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, int8_t delta_PUSCH_msg2[8] = {-6,-4,-2,0,2,4,6,8}; -int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, +int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue, unsigned char eNB_id ) { // RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu; - uint8_t transmission_mode = phy_vars_ue->transmission_mode[eNB_id]; - unsigned char *rar_pdu = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b; - unsigned char subframe = phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]; - LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - // int current_dlsch_cqi = phy_vars_ue->current_dlsch_cqi[eNB_id]; + uint8_t transmission_mode = ue->transmission_mode[eNB_id]; + unsigned char *rar_pdu = ue->dlsch_ra[eNB_id]->harq_processes[0]->b; + unsigned char subframe = ue->ulsch_Msg3_subframe[eNB_id]; + LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; + PHY_MEASUREMENTS *meas = &ue->measurements; + + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + // int current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id]; uint8_t *rar = (uint8_t *)(rar_pdu+1); - uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_ue->frame_tx,subframe); + uint8_t harq_pid = subframe2harq_pid(frame_parms,ue->frame_tx,subframe); uint16_t rballoc; uint8_t cqireq; uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT; uint16_t RIV_max = 0; - LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",phy_vars_ue->frame_tx,subframe,harq_pid); + LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",ue->frame_tx,subframe,harq_pid); switch (frame_parms->N_RB_DL) { case 6: @@ -269,10 +270,10 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, } ulsch->uci_format = HLC_subband_cqi_nopmi; - fill_CQI(ulsch,meas,eNB_id,0,phy_vars_ue->lte_frame_parms.N_RB_DL,0, transmission_mode,phy_vars_ue->sinr_eff); + fill_CQI(ulsch,meas,eNB_id,0,ue->frame_parms.N_RB_DL,0, transmission_mode,ue->sinr_eff); - if (((phy_vars_ue->frame_tx % 100) == 0) || (phy_vars_ue->frame_tx < 10)) - print_CQI(ulsch->o,ulsch->uci_format,eNB_id,phy_vars_ue->lte_frame_parms.N_RB_DL); + if (((ue->frame_tx % 100) == 0) || (ue->frame_tx < 10)) + print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL); } else { ulsch->O_RI = 0; ulsch->O = 0; @@ -304,10 +305,10 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, // initialize power control based on PRACH power ulsch->f_pusch = delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC] + - mac_xface->get_deltaP_rampup(phy_vars_ue->Mod_id,phy_vars_ue->CC_id); + mac_xface->get_deltaP_rampup(ue->Mod_id,ue->CC_id); LOG_D(PHY,"[UE %d][PUSCH PC] Initializing f_pusch to %d dB, TPC %d (delta_PUSCH_msg2 %d dB), deltaP_rampup %d dB\n", - phy_vars_ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC], - mac_xface->get_deltaP_rampup(phy_vars_ue->Mod_id,phy_vars_ue->CC_id)); + ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC], + mac_xface->get_deltaP_rampup(ue->Mod_id,ue->CC_id)); //#ifdef DEBUG_RAR diff --git a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c index 249fd81ee4..cb5d653909 100644 --- a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c @@ -129,15 +129,15 @@ int compareints (const void * a, const void * b) } -int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue, +int32_t generate_srs_tx(PHY_VARS_UE *ue, uint8_t eNB_id, int16_t amp, uint32_t subframe) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated=&phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id]; - int32_t *txdataF = phy_vars_ue->lte_ue_common_vars.txdataF[0]; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id]; + int32_t *txdataF = ue->common_vars.txdataF[0]; uint16_t msrsb=0,Nb=0,nb,b,msrs0=0,k,Msc_RS,Msc_RS_idx,carrier_pos,symbol_offset; uint16_t *Msc_idx_ptr; int32_t k0; diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c index 34d55daaea..97fe212ac5 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.c +++ b/openair1/PHY/LTE_TRANSPORT/sss.c @@ -90,7 +90,7 @@ int generate_sss(int32_t **txdataF, return(0); } -int pss_ch_est(PHY_VARS_UE *phy_vars_ue, +int pss_ch_est(PHY_VARS_UE *ue, int32_t pss_ext[4][72], int32_t sss_ext[4][72]) { @@ -98,9 +98,9 @@ int pss_ch_est(PHY_VARS_UE *phy_vars_ue, int16_t *pss; int16_t *pss_ext2,*sss_ext2,*sss_ext3,tmp_re,tmp_im,tmp_re2,tmp_im2; uint8_t aarx,i; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; - switch (phy_vars_ue->lte_ue_common_vars.eNb_id) { + switch (ue->common_vars.eNb_id) { case 0: pss = &primary_synch0[10]; @@ -154,7 +154,7 @@ int pss_ch_est(PHY_VARS_UE *phy_vars_ue, } -int pss_sss_extract(PHY_VARS_UE *phy_vars_ue, +int pss_sss_extract(PHY_VARS_UE *ue, int32_t pss_ext[4][72], int32_t sss_ext[4][72]) { @@ -165,12 +165,12 @@ int pss_sss_extract(PHY_VARS_UE *phy_vars_ue, uint8_t i,aarx; int32_t *pss_rxF,*pss_rxF_ext; int32_t *sss_rxF,*sss_rxF_ext; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; int rx_offset = frame_parms->ofdm_symbol_size-3*12; uint8_t pss_symb,sss_symb; - int32_t **rxdataF = phy_vars_ue->lte_ue_common_vars.rxdataF; + int32_t **rxdataF = ue->common_vars.rxdataF; if (frame_parms->frame_type == FDD) { pss_symb = 6-frame_parms->Ncp; @@ -219,74 +219,74 @@ int16_t phase_re[7] = {16383, 25101, 30791, 32767, 30791, 25101, 16383}; int16_t phase_im[7] = {-28378, -21063, -11208, 0, 11207, 21062, 28377}; -int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_t *phase_max) +int rx_sss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *flip_max,uint8_t *phase_max) { uint8_t i; int32_t pss_ext[4][72]; int32_t sss0_ext[4][72],sss5_ext[4][72]; - uint8_t Nid2 = phy_vars_ue->lte_ue_common_vars.eNb_id; + uint8_t Nid2 = ue->common_vars.eNb_id; uint8_t flip,phase; uint16_t Nid1; int16_t *sss0,*sss5; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; int32_t metric; int16_t *d0,*d5; - if (phy_vars_ue->lte_frame_parms.frame_type == FDD) { + if (frame_parms->frame_type == FDD) { #ifdef DEBUG_SSS - if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL) - msg("[PHY][UE%d] Doing SSS for FDD Normal Prefix\n",phy_vars_ue->Mod_id); + if (frame_parms->Ncp == NORMAL) + msg("[PHY][UE%d] Doing SSS for FDD Normal Prefix\n",ue->Mod_id); else - msg("[PHY][UE%d] Doing SSS for FDD Extended Prefix\n",phy_vars_ue->Mod_id); + msg("[PHY][UE%d] Doing SSS for FDD Extended Prefix\n",ue->Mod_id); #endif // Do FFTs for SSS/PSS // SSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti/2)-2, // second to last symbol of 0, // slot 0 - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); // PSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti/2)-1, // last symbol of 0, // slot 0 - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); } else { // TDD #ifdef DEBUG_SSS - if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL) - msg("[PHY][UE%d] Doing SSS for TDD Normal Prefix\n",phy_vars_ue->Mod_id); + if (ue->frame_parms->Ncp == NORMAL) + msg("[PHY][UE%d] Doing SSS for TDD Normal Prefix\n",ue->Mod_id); else - msg("[PHY][UE%d] Doing SSS for TDD Extended Prefix\n",phy_vars_ue->Mod_id); + msg("[PHY][UE%d] Doing SSS for TDD Extended Prefix\n",ue->Mod_id); #endif // SSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti>>1)-1, // last symbol of 1, // slot 1 - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); // PSS - slot_fep(phy_vars_ue, + slot_fep(ue, 2, // symbol 2 of 2, // slot 2 - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); } - pss_sss_extract(phy_vars_ue, + pss_sss_extract(ue, pss_ext, sss0_ext); /* - write_output("rxsig0.m","rxs0",&phy_vars_ue->lte_ue_common_vars.rxdata[0][0],phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); - write_output("rxdataF0.m","rxF0",&phy_vars_ue->lte_ue_common_vars.rxdataF[0][0],2*14*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1); + write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_tti,1,1); + write_output("rxdataF0.m","rxF0",&ue->common_vars.rxdataF[0][0],2*14*ue->frame_parms.ofdm_symbol_size,2,1); write_output("pss_ext0.m","pssext0",pss_ext,72,1,1); write_output("sss0_ext0.m","sss0ext0",sss0_ext,72,1,1); */ @@ -294,44 +294,44 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_ // get conjugated channel estimate from PSS (symbol 6), H* = R* \cdot PSS // and do channel estimation and compensation based on PSS - pss_ch_est(phy_vars_ue, + pss_ch_est(ue, pss_ext, sss0_ext); // write_output("sss0_comp0.m","sss0comp0",sss0_ext,72,1,1); - if (phy_vars_ue->lte_frame_parms.frame_type == FDD) { // FDD + if (ue->frame_parms.frame_type == FDD) { // FDD // SSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti/2)-2, 10, - phy_vars_ue->rx_offset, + ue->rx_offset, 0,1); // PSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti/2)-1, 10, - phy_vars_ue->rx_offset, + ue->rx_offset, 0,1); } else { // TDD // SSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti>>1)-1, 11, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); // PSS - slot_fep(phy_vars_ue, + slot_fep(ue, 2, 12, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); } - pss_sss_extract(phy_vars_ue, + pss_sss_extract(ue, pss_ext, sss5_ext); @@ -339,7 +339,7 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_ // get conjugated channel estimate from PSS (symbol 6), H* = R* \cdot PSS // and do channel estimation and compensation based on PSS - pss_ch_est(phy_vars_ue, + pss_ch_est(ue, pss_ext, sss5_ext); @@ -375,7 +375,7 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_ // if the current metric is better than the last save it if (metric > *tot_metric) { *tot_metric = metric; - phy_vars_ue->lte_frame_parms.Nid_cell = Nid2+(3*Nid1); + ue->frame_parms.Nid_cell = Nid2+(3*Nid1); *phase_max = phase; *flip_max=flip; #ifdef DEBUG_SSS diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 1004cfa192..4e45a856bd 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -205,7 +205,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) uint32_t ulsch_encoding(uint8_t *a, - PHY_VARS_UE *phy_vars_ue, + PHY_VARS_UE *ue, uint8_t harq_pid, uint8_t eNB_id, uint8_t tmode, @@ -213,11 +213,11 @@ uint32_t ulsch_encoding(uint8_t *a, uint8_t Nbundled) { - time_stats_t *seg_stats=&phy_vars_ue->ulsch_segmentation_stats; - time_stats_t *rm_stats=&phy_vars_ue->ulsch_rate_matching_stats; - time_stats_t *te_stats=&phy_vars_ue->ulsch_turbo_encoding_stats; - time_stats_t *i_stats=&phy_vars_ue->ulsch_interleaving_stats; - time_stats_t *m_stats=&phy_vars_ue->ulsch_multiplexing_stats; + time_stats_t *seg_stats=&ue->ulsch_segmentation_stats; + time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats; + time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats; + time_stats_t *i_stats=&ue->ulsch_interleaving_stats; + time_stats_t *m_stats=&ue->ulsch_multiplexing_stats; // uint16_t offset; uint32_t crc=1; @@ -236,10 +236,10 @@ uint32_t ulsch_encoding(uint8_t *a, uint16_t o_RCC; uint8_t o_flip[8]; uint32_t wACK_idx; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - LTE_UE_ULSCH_t *ulsch=phy_vars_ue->ulsch_ue[eNB_id]; - LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[eNB_id]; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + PHY_MEASUREMENTS *meas = &ue->measurements; + LTE_UE_ULSCH_t *ulsch=ue->ulsch[eNB_id]; + LTE_UE_DLSCH_t **dlsch = ue->dlsch[eNB_id]; uint16_t rnti; if (!ulsch) { @@ -266,11 +266,11 @@ uint32_t ulsch_encoding(uint8_t *a, // fill CQI/PMI information if (ulsch->O>0) { - rnti = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti; - fill_CQI(ulsch,meas,0,harq_pid,phy_vars_ue->lte_frame_parms.N_RB_DL,rnti, tmode,phy_vars_ue->sinr_eff); + rnti = ue->pdcch_vars[eNB_id]->crnti; + fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff); LOG_D(PHY,"UE CQI\n"); - print_CQI(ulsch->o,ulsch->uci_format,0,phy_vars_ue->lte_frame_parms.N_RB_DL); + print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL); // save PUSCH pmi for later (transmission modes 4,5,6) if (dlsch[0]) { @@ -324,9 +324,9 @@ uint32_t ulsch_encoding(uint8_t *a, } if ((tmode != 4)) - print_CQI(ulsch->o,wideband_cqi_rank1_2A,0,phy_vars_ue->lte_frame_parms.N_RB_DL); + print_CQI(ulsch->o,wideband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL); else - print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0,phy_vars_ue->lte_frame_parms.N_RB_DL); + print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL); #endif @@ -938,29 +938,29 @@ uint32_t ulsch_encoding(uint8_t *a, #include "LAYER2/MAC/defs.h" #endif int ulsch_encoding_emul(uint8_t *ulsch_buffer, - PHY_VARS_UE *phy_vars_ue, + PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t harq_pid, uint8_t control_only_flag) { - LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; - LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[eNB_id]; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - uint8_t tmode = phy_vars_ue->transmission_mode[eNB_id]; - uint16_t rnti=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti; + LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; + LTE_UE_DLSCH_t **dlsch = ue->dlsch[eNB_id]; + PHY_MEASUREMENTS *meas = &ue->measurements; + uint8_t tmode = ue->transmission_mode[eNB_id]; + uint16_t rnti=ue->pdcch_vars[eNB_id]->crnti; LOG_D(PHY,"EMUL UE ulsch_encoding for eNB %d,mod_id %d, harq_pid %d rnti %x, ACK(%d,%d) \n", - eNB_id,phy_vars_ue->Mod_id, harq_pid, rnti,ulsch->o_ACK[0],ulsch->o_ACK[1]); + eNB_id,ue->Mod_id, harq_pid, rnti,ulsch->o_ACK[0],ulsch->o_ACK[1]); if (ulsch->O>0) { /* if(flag_LA==1) - sinr_eff = sinr_eff_cqi_calc(phy_vars_ue, eNB_id); + sinr_eff = sinr_eff_cqi_calc(ue, eNB_id); else sinr_eff = meas->wideband_cqi_avg[eNB_id]; */ - fill_CQI(ulsch,meas,eNB_id,harq_pid,phy_vars_ue->lte_frame_parms.N_RB_DL,rnti,tmode,phy_vars_ue->sinr_eff); + fill_CQI(ulsch,meas,eNB_id,harq_pid,ue->frame_parms.N_RB_DL,rnti,tmode,ue->sinr_eff); //LOG_D(PHY,"UE CQI\n"); // print_CQI(ulsch->o,ulsch->uci_format,eNB_id); @@ -970,36 +970,36 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer, dlsch[0]->harq_processes[harq_pid]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; } - memcpy(phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->b, + memcpy(ue->ulsch[eNB_id]->harq_processes[harq_pid]->b, ulsch_buffer, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3); + ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3); - //memcpy(&UE_transport_info[phy_vars_ue->Mod_id].transport_blocks[UE_transport_info_TB_index[phy_vars_ue->Mod_id]], - memcpy(&UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].transport_blocks, + //memcpy(&UE_transport_info[ue->Mod_id].transport_blocks[UE_transport_info_TB_index[ue->Mod_id]], + memcpy(&UE_transport_info[ue->Mod_id][ue->CC_id].transport_blocks, ulsch_buffer, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3); - //UE_transport_info_TB_index[phy_vars_ue->Mod_id]+=phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3); + //UE_transport_info_TB_index[ue->Mod_id]+=ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; // navid: currently more than one eNB is not supported in the code - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].num_eNB = 1; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].rnti[0] = phy_vars_ue->lte_ue_pdcch_vars[0]->crnti; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].eNB_id[0] = eNB_id; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].harq_pid[0] = harq_pid; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].tbs[0] = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3 ; - // msg("\nphy_vars_ue->Mod_id%d\n",phy_vars_ue->Mod_id); + UE_transport_info[ue->Mod_id][ue->CC_id].num_eNB = 1; + UE_transport_info[ue->Mod_id][ue->CC_id].rnti[0] = ue->pdcch_vars[0]->crnti; + UE_transport_info[ue->Mod_id][ue->CC_id].eNB_id[0] = eNB_id; + UE_transport_info[ue->Mod_id][ue->CC_id].harq_pid[0] = harq_pid; + UE_transport_info[ue->Mod_id][ue->CC_id].tbs[0] = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3 ; + // msg("\nue->Mod_id%d\n",ue->Mod_id); - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_flag = 1; - //UE_transport_info[phy_vars_ue->Mod_id].cntl.pusch_uci = *(uint32_t *)ulsch->o; - memcpy(UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_uci, + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_flag = 1; + //UE_transport_info[ue->Mod_id].cntl.pusch_uci = *(uint32_t *)ulsch->o; + memcpy(UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_uci, ulsch->o, MAX_CQI_BYTES); // msg("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1); - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.length_uci = ulsch->O; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.uci_format = ulsch->uci_format; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_ri = (ulsch->o_RI[0]&1)+((ulsch->o_RI[1]&1)<<1); - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_ack = (ulsch->o_ACK[0]&1) + ((ulsch->o_ACK[1]&1)<<1); - //msg("ack is %d %d %d\n",UE_transport_info[phy_vars_ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1); + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.length_uci = ulsch->O; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.uci_format = ulsch->uci_format; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ri = (ulsch->o_RI[0]&1)+((ulsch->o_RI[1]&1)<<1); + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ack = (ulsch->o_ACK[0]&1) + ((ulsch->o_ACK[1]&1)<<1); + //msg("ack is %d %d %d\n",UE_transport_info[ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1); return(0); } diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index a0a5602261..4a6bfa5f52 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -218,18 +218,18 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) -unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, +unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, uint8_t UE_id, - uint8_t sched_subframe, + uint8_t thread_id, uint8_t control_only_flag, uint8_t Nbundled, uint8_t llr8_flag) { - int16_t *ulsch_llr = phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->llr; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - LTE_eNB_ULSCH_t *ulsch = phy_vars_eNB->ulsch_eNB[UE_id]; + int16_t *ulsch_llr = eNB->pusch_vars[UE_id]->llr; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; uint8_t harq_pid; unsigned short nb_rb; unsigned int A,E; @@ -260,7 +260,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, int16_t cseq[6*14*1200]; int off; int status[20]; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + int subframe = eNB->proc[thread_id].subframe_rx; LTE_UL_eNB_HARQ_t *ulsch_harq; uint8_t (*tc)(int16_t *y, @@ -279,7 +279,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, time_stats_t *, time_stats_t *); - harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe); + harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,1); @@ -351,7 +351,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, } if (sumKr==0) { - LOG_N(PHY,"[eNB %d] ulsch_decoding.c: FATAL sumKr is 0!\n",phy_vars_eNB->Mod_id); + LOG_N(PHY,"[eNB %d] ulsch_decoding.c: FATAL sumKr is 0!\n",eNB->Mod_id); LOG_D(PHY,"ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", frame_parms->Nid_cell,ulsch->rnti,x2, harq_pid, @@ -453,7 +453,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, // Clear "tag" interleaving matrix to allow for CQI/DATA identification memset(ytag,0,Cmux*Rmux_prime); - start_meas(&phy_vars_eNB->ulsch_demultiplexing_stats); + start_meas(&eNB->ulsch_demultiplexing_stats); i=0; memset(y,LTE_NULL,Q_m*Hpp); @@ -603,7 +603,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, } - stop_meas(&phy_vars_eNB->ulsch_demultiplexing_stats); + stop_meas(&eNB->ulsch_demultiplexing_stats); if (i!=(H+Q_RI)) LOG_D(PHY,"ulsch_decoding.c: Error in input buffer length (j %d, H+Q_RI %d)\n",i,H+Q_RI); @@ -979,7 +979,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, // return(0); // Do PUSCH Decoding - // stop_meas(&phy_vars_eNB->ulsch_demultiplexing_stats); + // stop_meas(&eNB->ulsch_demultiplexing_stats); r_offset = 0; @@ -1026,7 +1026,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, ulsch_harq->Nl); #endif - start_meas(&phy_vars_eNB->ulsch_rate_unmatching_stats); + start_meas(&eNB->ulsch_rate_unmatching_stats); if (lte_rate_matching_turbo_rx(ulsch_harq->RTC[r], G, @@ -1047,14 +1047,14 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, return(-1); } - stop_meas(&phy_vars_eNB->ulsch_rate_unmatching_stats); + stop_meas(&eNB->ulsch_rate_unmatching_stats); r_offset += E; - start_meas(&phy_vars_eNB->ulsch_deinterleaving_stats); + start_meas(&eNB->ulsch_deinterleaving_stats); sub_block_deinterleaving_turbo(4+Kr, &ulsch_harq->d[r][96], ulsch_harq->w[r]); - stop_meas(&phy_vars_eNB->ulsch_deinterleaving_stats); + stop_meas(&eNB->ulsch_deinterleaving_stats); } for (r=0; rC; r++) { @@ -1068,7 +1068,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, else crc_type = CRC24_B; - start_meas(&phy_vars_eNB->ulsch_turbo_decoding_stats); + start_meas(&eNB->ulsch_turbo_decoding_stats); ret = tc(&ulsch_harq->d[r][96], ulsch_harq->c[r], @@ -1078,15 +1078,15 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, crc_type, (r==0) ? ulsch_harq->F : 0, - &phy_vars_eNB->ulsch_tc_init_stats, - &phy_vars_eNB->ulsch_tc_alpha_stats, - &phy_vars_eNB->ulsch_tc_beta_stats, - &phy_vars_eNB->ulsch_tc_gamma_stats, - &phy_vars_eNB->ulsch_tc_ext_stats, - &phy_vars_eNB->ulsch_tc_intl1_stats, - &phy_vars_eNB->ulsch_tc_intl2_stats); + &eNB->ulsch_tc_init_stats, + &eNB->ulsch_tc_alpha_stats, + &eNB->ulsch_tc_beta_stats, + &eNB->ulsch_tc_gamma_stats, + &eNB->ulsch_tc_ext_stats, + &eNB->ulsch_tc_intl1_stats, + &eNB->ulsch_tc_intl2_stats); - stop_meas(&phy_vars_eNB->ulsch_turbo_decoding_stats); + stop_meas(&eNB->ulsch_turbo_decoding_stats); status[r] = ret; @@ -1500,23 +1500,23 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb #endif -uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t sched_subframe, +uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, + uint8_t thread_id, uint8_t UE_index, uint16_t *crnti) { uint8_t UE_id; uint16_t rnti; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + int subframe = eNB->proc[thread_id].subframe_rx; uint8_t harq_pid; - uint8_t CC_id = phy_vars_eNB->CC_id; + uint8_t CC_id = eNB->CC_id; - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe); + harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc[thread_id].frame_rx,subframe); - rnti = phy_vars_eNB->ulsch_eNB[UE_index]->rnti; + rnti = eNB->ulsch[UE_index]->rnti; #ifdef DEBUG_PHY - LOG_D(PHY,"[eNB %d] ulsch_decoding_emul : subframe %d UE_index %d harq_pid %d rnti %x\n",phy_vars_eNB->Mod_id,subframe,UE_index,harq_pid,rnti); + LOG_D(PHY,"[eNB %d] ulsch_decoding_emul : subframe %d UE_index %d harq_pid %d rnti %x\n",eNB->Mod_id,subframe,UE_index,harq_pid,rnti); #endif for (UE_id=0; UE_idMod_id, + eNB->Mod_id, UE_id, PHY_vars_UE_g[UE_id]->lte_ue_pdcch_vars[0]->crnti, NB_UE_INST); @@ -1534,34 +1534,34 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, if (UE_id==NB_UE_INST) { LOG_W(PHY,"[eNB %d] ulsch_decoding_emul: FATAL, didn't find UE with rnti %x (UE index %d)\n", - phy_vars_eNB->Mod_id, rnti, UE_index); - return(1+phy_vars_eNB->ulsch_eNB[UE_id]->max_turbo_iterations); + eNB->Mod_id, rnti, UE_index); + return(1+eNB->ulsch[UE_id]->max_turbo_iterations); } else { - LOG_D(PHY,"[eNB %d] Found UE with rnti %x => UE_id %d\n",phy_vars_eNB->Mod_id, rnti, UE_id); + LOG_D(PHY,"[eNB %d] Found UE with rnti %x => UE_id %d\n",eNB->Mod_id, rnti, UE_id); } - if (PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->harq_processes[harq_pid]->status == CBA_ACTIVE) { + if (PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->harq_processes[harq_pid]->status == CBA_ACTIVE) { *crnti = rnti; - PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->harq_processes[harq_pid]->status=IDLE; + PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->harq_processes[harq_pid]->status=IDLE; } else *crnti = 0x0; // Do abstraction here to determine if packet it in error - /* if (ulsch_abstraction_MIESM(phy_vars_eNB->sinr_dB_eNB,1, phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb, phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb) == 1) + /* if (ulsch_abstraction_MIESM(eNB->sinr_dB_eNB,1, eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, eNB->ulsch[UE_id]->harq_processes[harq_pid]->first_rb) == 1) flag = 1; else flag = 0;*/ /* - //SINRdbPost = phy_vars_eNB->sinr_dB_eNB; - mcsPost = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs, - nrbPost = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb; - frbPost = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb; + //SINRdbPost = eNB->sinr_dB_eNB; + mcsPost = eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs, + nrbPost = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb; + frbPost = eNB->ulsch[UE_id]->harq_processes[harq_pid]->first_rb; if(nrbPost > 0) { - SINRdbPost = phy_vars_eNB->sinr_dB_eNB; + SINRdbPost = eNB->sinr_dB_eNB; ULflag1 = 1; } else @@ -1571,7 +1571,7 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, }*/ // - // write_output("postprocSINR.m","SINReNB",phy_vars_eNB->sinr_dB,301,1,7); + // write_output("postprocSINR.m","SINReNB",eNB->sinr_dB,301,1,7); //Yazdir buraya her frame icin 300 eNb @@ -1580,51 +1580,51 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, // fprintf(csv_fd,"%e+i*(%e),",channelx,channely); - // if (ulsch_abstraction(phy_vars_eNB->sinr_dB,1, phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb, phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb) == 1) { + // if (ulsch_abstraction(eNB->sinr_dB,1, eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, eNB->ulsch[UE_id]->harq_processes[harq_pid]->first_rb) == 1) { if (1) { LOG_D(PHY,"ulsch_decoding_emul abstraction successful\n"); - memcpy(phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->b, - PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->TBS>>3); + memcpy(eNB->ulsch[UE_index]->harq_processes[harq_pid]->b, + PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->harq_processes[harq_pid]->b, + eNB->ulsch[UE_index]->harq_processes[harq_pid]->TBS>>3); // get local ue's ack if ((UE_index >= oai_emulation.info.first_ue_local) ||(UE_index <(oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local))) { - get_ack(&phy_vars_eNB->lte_frame_parms, - PHY_vars_UE_g[UE_id][CC_id]->dlsch_ue[0][0]->harq_ack, + get_ack(&eNB->frame_parms, + PHY_vars_UE_g[UE_id][CC_id]->dlsch[0][0]->harq_ack, subframe, - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK); + eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK); } else { // get remote UEs' ack - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK[0] = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o_ACK[0]; - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK[1] = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o_ACK[1]; + eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK[0] = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o_ACK[0]; + eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK[1] = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o_ACK[1]; } // Do abstraction of PUSCH feedback #ifdef DEBUG_PHY LOG_D(PHY,"[eNB %d][EMUL] ue index %d UE_id %d: subframe %d : o_ACK (%d %d), cqi (val %d, len %d)\n", - phy_vars_eNB->Mod_id,UE_index, UE_id, subframe,phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK[1], - ((HLC_subband_cqi_rank1_2A_5MHz *)PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o)->cqi1, - PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->O); + eNB->Mod_id,UE_index, UE_id, subframe,eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_ACK[1], + ((HLC_subband_cqi_rank1_2A_5MHz *)PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o)->cqi1, + PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->O); #endif - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->Or1 = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->O; - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->Or2 = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->O; + eNB->ulsch[UE_index]->harq_processes[harq_pid]->Or1 = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->O; + eNB->ulsch[UE_index]->harq_processes[harq_pid]->Or2 = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->O; - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->uci_format = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->uci_format; - memcpy(phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o,PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o,MAX_CQI_BYTES); - memcpy(phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_RI,PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o_RI,2); + eNB->ulsch[UE_index]->harq_processes[harq_pid]->uci_format = PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->uci_format; + memcpy(eNB->ulsch[UE_index]->harq_processes[harq_pid]->o,PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o,MAX_CQI_BYTES); + memcpy(eNB->ulsch[UE_index]->harq_processes[harq_pid]->o_RI,PHY_vars_UE_g[UE_id][CC_id]->ulsch[0]->o_RI,2); - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->cqi_crc_status = 1; + eNB->ulsch[UE_index]->harq_processes[harq_pid]->cqi_crc_status = 1; return(1); } else { - LOG_W(PHY,"[eNB %d] ulsch_decoding_emul abstraction failed for UE %d\n",phy_vars_eNB->Mod_id,UE_index); + LOG_W(PHY,"[eNB %d] ulsch_decoding_emul abstraction failed for UE %d\n",eNB->Mod_id,UE_index); - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->cqi_crc_status = 0; + eNB->ulsch[UE_index]->harq_processes[harq_pid]->cqi_crc_status = 0; // retransmission - return(1+phy_vars_eNB->ulsch_eNB[UE_index]->max_turbo_iterations); + return(1+eNB->ulsch[UE_index]->max_turbo_iterations); } } diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index e52cdf9567..87c21b6a6b 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1576,8 +1576,8 @@ void ulsch_channel_level(int32_t **drs_ch_estimates_ext, int32_t avgU[2]; int32_t avgU_0[2],avgU_1[2]; // For the Distributed Alamouti Scheme -void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, - uint32_t sched_subframe, +void rx_ulsch(PHY_VARS_eNB *eNB, + uint32_t thread_id, uint8_t eNB_id, // this is the effective sector id uint8_t UE_id, LTE_eNB_ULSCH_t **ulsch, @@ -1585,9 +1585,9 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, { // flagMag = 0; - LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars; - LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id]; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_eNB_COMMON *common_vars = &eNB->common_vars; + LTE_eNB_PUSCH *pusch_vars = eNB->pusch_vars[UE_id]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t l,i; int32_t avgs; @@ -1603,9 +1603,9 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, uint8_t Qm; uint16_t rx_power_correction; int16_t *llrp; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + int subframe = eNB->proc[thread_id].subframe_rx; - harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe); + harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe); Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs); #ifdef DEBUG_ULSCH msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb, @@ -1625,22 +1625,22 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, msg("rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l, ulsch[UE_id]->harq_processes[harq_pid]->first_rb, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, - eNB_common_vars->rxdataF[eNB_id], - eNB_pusch_vars->rxdataF_ext[eNB_id]); + common_vars->rxdataF[eNB_id], + pusch_vars->rxdataF_ext[eNB_id]); #endif //DEBUG_ULSCH - ulsch_extract_rbs_single(eNB_common_vars->rxdataF[eNB_id], - eNB_pusch_vars->rxdataF_ext[eNB_id], + ulsch_extract_rbs_single(common_vars->rxdataF[eNB_id], + pusch_vars->rxdataF_ext[eNB_id], ulsch[UE_id]->harq_processes[harq_pid]->first_rb, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, l%(frame_parms->symbols_per_tti/2), l/(frame_parms->symbols_per_tti/2), frame_parms); - lte_ul_channel_estimation(phy_vars_eNB, + lte_ul_channel_estimation(eNB, eNB_id, UE_id, - sched_subframe, + thread_id, l%(frame_parms->symbols_per_tti/2), l/(frame_parms->symbols_per_tti/2), cooperation_flag); @@ -1648,36 +1648,36 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, if(cooperation_flag == 2) { for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars->ulsch_power_0[i] = signal_energy(eNB_pusch_vars->drs_ch_estimates_0[eNB_id][i], + pusch_vars->ulsch_power_0[i] = signal_energy(pusch_vars->drs_ch_estimates_0[eNB_id][i], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction; - eNB_pusch_vars->ulsch_power_1[i] = signal_energy(eNB_pusch_vars->drs_ch_estimates_1[eNB_id][i], + pusch_vars->ulsch_power_1[i] = signal_energy(pusch_vars->drs_ch_estimates_1[eNB_id][i], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction; } } else { for (i=0; inb_antennas_rx; i++) { /* - eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i], + pusch_vars->ulsch_power[i] = signal_energy_nodc(pusch_vars->drs_ch_estimates[eNB_id][i], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction; */ - eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i], + pusch_vars->ulsch_power[i] = signal_energy_nodc(pusch_vars->drs_ch_estimates[eNB_id][i], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12); #ifdef LOCALIZATION - eNB_pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t)); - eNB_pusch_vars->active_subcarrier = subcarrier_energy(eNB_pusch_vars->drs_ch_estimates[eNB_id][i], - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, eNB_pusch_vars->subcarrier_power, rx_power_correction); + pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t)); + pusch_vars->active_subcarrier = subcarrier_energy(pusch_vars->drs_ch_estimates[eNB_id][i], + ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, pusch_vars->subcarrier_power, rx_power_correction); #endif } } - //write_output("rxdataF_ext.m","rxF_ext",eNB_pusch_vars->rxdataF_ext[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); - //write_output("ulsch_chest.m","drs_est",eNB_pusch_vars->drs_ch_estimates[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); + //write_output("rxdataF_ext.m","rxF_ext",pusch_vars->rxdataF_ext[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); + //write_output("ulsch_chest.m","drs_est",pusch_vars->drs_ch_estimates[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); if(cooperation_flag == 2) { - ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates_0[eNB_id], + ulsch_channel_level(pusch_vars->drs_ch_estimates_0[eNB_id], frame_parms, avgU_0, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); @@ -1695,7 +1695,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, msg("[ULSCH] log2_maxh_0 = %d (%d,%d)\n",log2_maxh_0,avgU_0[0],avgs_0); #endif - ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates_1[eNB_id], + ulsch_channel_level(pusch_vars->drs_ch_estimates_1[eNB_id], frame_parms, avgU_1, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); @@ -1714,7 +1714,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, #endif log2_maxh = max(log2_maxh_0,log2_maxh_1); } else { - ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates[eNB_id], + ulsch_channel_level(pusch_vars->drs_ch_estimates[eNB_id], frame_parms, avgU, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); @@ -1746,15 +1746,15 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, if(cooperation_flag == 2) { ulsch_channel_compensation_alamouti( - eNB_pusch_vars->rxdataF_ext[eNB_id], - eNB_pusch_vars->drs_ch_estimates_0[eNB_id], - eNB_pusch_vars->drs_ch_estimates_1[eNB_id], - eNB_pusch_vars->ul_ch_mag_0[eNB_id], - eNB_pusch_vars->ul_ch_magb_0[eNB_id], - eNB_pusch_vars->ul_ch_mag_1[eNB_id], - eNB_pusch_vars->ul_ch_magb_1[eNB_id], - eNB_pusch_vars->rxdataF_comp_0[eNB_id], - eNB_pusch_vars->rxdataF_comp_1[eNB_id], + pusch_vars->rxdataF_ext[eNB_id], + pusch_vars->drs_ch_estimates_0[eNB_id], + pusch_vars->drs_ch_estimates_1[eNB_id], + pusch_vars->ul_ch_mag_0[eNB_id], + pusch_vars->ul_ch_magb_0[eNB_id], + pusch_vars->ul_ch_mag_1[eNB_id], + pusch_vars->ul_ch_magb_1[eNB_id], + pusch_vars->rxdataF_comp_0[eNB_id], + pusch_vars->rxdataF_comp_1[eNB_id], frame_parms, l, Qm, @@ -1762,24 +1762,24 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, log2_maxh); ulsch_alamouti(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->rxdataF_comp_0[eNB_id], - eNB_pusch_vars->rxdataF_comp_1[eNB_id], - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], - eNB_pusch_vars->ul_ch_mag_0[eNB_id], - eNB_pusch_vars->ul_ch_magb_0[eNB_id], - eNB_pusch_vars->ul_ch_mag_1[eNB_id], - eNB_pusch_vars->ul_ch_magb_1[eNB_id], + pusch_vars->rxdataF_comp[eNB_id], + pusch_vars->rxdataF_comp_0[eNB_id], + pusch_vars->rxdataF_comp_1[eNB_id], + pusch_vars->ul_ch_mag[eNB_id], + pusch_vars->ul_ch_magb[eNB_id], + pusch_vars->ul_ch_mag_0[eNB_id], + pusch_vars->ul_ch_magb_0[eNB_id], + pusch_vars->ul_ch_mag_1[eNB_id], + pusch_vars->ul_ch_magb_1[eNB_id], l, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); } else { ulsch_channel_compensation( - eNB_pusch_vars->rxdataF_ext[eNB_id], - eNB_pusch_vars->drs_ch_estimates[eNB_id], - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], - eNB_pusch_vars->rxdataF_comp[eNB_id], + pusch_vars->rxdataF_ext[eNB_id], + pusch_vars->drs_ch_estimates[eNB_id], + pusch_vars->ul_ch_mag[eNB_id], + pusch_vars->ul_ch_magb[eNB_id], + pusch_vars->rxdataF_comp[eNB_id], frame_parms, l, Qm, @@ -1794,7 +1794,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, //writing for the first time write_output(namepointer_log2,"xxx",log2_maxh,1,1,12); - write_output(namepointer_chMag,"xxx",eNB_pusch_vars->ul_ch_mag[eNB_id][0],300,1,11); + write_output(namepointer_chMag,"xxx",pusch_vars->ul_ch_mag[eNB_id][0],300,1,11); //namepointer_chMag = NULL; flagMag=1; @@ -1802,20 +1802,20 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, if (frame_parms->nb_antennas_rx > 1) ulsch_detection_mrc(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], + pusch_vars->rxdataF_comp[eNB_id], + pusch_vars->ul_ch_mag[eNB_id], + pusch_vars->ul_ch_magb[eNB_id], l, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); #ifndef OFDMA_ULSCH - if ((phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0]+3)ulsch_power[0]) { + if ((eNB->measurements->n0_power_dB[0]+3)ulsch_power[0]) { freq_equalization(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], + pusch_vars->rxdataF_comp[eNB_id], + pusch_vars->ul_ch_mag[eNB_id], + pusch_vars->ul_ch_magb[eNB_id], l, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, Qm); @@ -1830,7 +1830,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, // Inverse-Transform equalized outputs // msg("Doing IDFTs\n"); lte_idft(frame_parms, - (uint32_t*)eNB_pusch_vars->rxdataF_comp[eNB_id][0], + (uint32_t*)pusch_vars->rxdataF_comp[eNB_id][0], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12); // msg("Done\n"); //#endif //DEBUG_ULSCH @@ -1838,7 +1838,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, #endif - llrp = (int16_t*)&eNB_pusch_vars->llr[0]; + llrp = (int16_t*)&pusch_vars->llr[0]; for (l=0; lsymbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active; l++) { @@ -1850,8 +1850,8 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, switch (Qm) { case 2 : ulsch_qpsk_llr(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->llr, + pusch_vars->rxdataF_comp[eNB_id], + pusch_vars->llr, l, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, &llrp); @@ -1859,19 +1859,19 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, case 4 : ulsch_16qam_llr(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->llr, - eNB_pusch_vars->ul_ch_mag[eNB_id], + pusch_vars->rxdataF_comp[eNB_id], + pusch_vars->llr, + pusch_vars->ul_ch_mag[eNB_id], l,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, &llrp); break; case 6 : ulsch_64qam_llr(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->llr, - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], + pusch_vars->rxdataF_comp[eNB_id], + pusch_vars->llr, + pusch_vars->ul_ch_mag[eNB_id], + pusch_vars->ul_ch_magb[eNB_id], l,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, &llrp); break; @@ -1886,66 +1886,66 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, } -void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB, +void rx_ulsch_emul(PHY_VARS_eNB *eNB, uint8_t subframe, uint8_t sect_id, uint8_t UE_index) { - msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",phy_vars_eNB->Mod_id,subframe,sect_id,UE_index); - phy_vars_eNB->lte_eNB_pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB; - phy_vars_eNB->lte_eNB_pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB; + msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,subframe,sect_id,UE_index); + eNB->pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB; + eNB->pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB; } -void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t sched_subframe, uint8_t UE_id) +void dump_ulsch(PHY_VARS_eNB *eNB,uint8_t thread_id, uint8_t UE_id) { - uint32_t nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12; + uint32_t nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; uint8_t harq_pid; - int subframe = PHY_vars_eNB->proc[sched_subframe].subframe_rx; + int subframe = eNB->proc[thread_id].subframe_rx; - harq_pid = subframe2harq_pid(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->proc[sched_subframe].frame_rx,subframe); + harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc[thread_id].frame_rx,subframe); - printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb, - PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs), - PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Nsymb_pusch); + printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs), + eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch); //#ifndef OAI_EMU - write_output("/tmp/ulsch_d.m","ulsch_dseq",&PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->d[0][96], - PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0); - write_output("/tmp/rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1); + write_output("/tmp/ulsch_d.m","ulsch_dseq",&eNB->ulsch[UE_id]->harq_processes[harq_pid]->d[0][96], + eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0); + write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0][0],eNB->frame_parms.samples_per_tti*10,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsig1.m","rxs1", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][1][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + write_output("/tmp/rxsig1.m","rxs1", &eNB->common_vars.rxdata[0][1][0],eNB->frame_parms.samples_per_tti*10,1,1); - write_output("/tmp/rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("/tmp/rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsigF1.m","rxsF1", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][1][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + write_output("/tmp/rxsigF1.m","rxsF1", &eNB->common_vars.rxdataF[0][1][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1); - write_output("/tmp/rxsigF0_ext.m","rxsF0_ext", &PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_ext[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); + write_output("/tmp/rxsigF0_ext.m","rxsF0_ext", &eNB->pusch_vars[UE_id]->rxdataF_ext[0][0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_ext[1][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &eNB->pusch_vars[UE_id]->rxdataF_ext[1][0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - write_output("/tmp/srs_est0.m","srsest0",PHY_vars_eNB->lte_eNB_srs_vars[UE_id].srs_ch_estimates[0][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + write_output("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0][0],eNB->frame_parms.ofdm_symbol_size,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/srs_est1.m","srsest1",PHY_vars_eNB->lte_eNB_srs_vars[UE_id].srs_ch_estimates[0][1],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + write_output("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[0][1],eNB->frame_parms.ofdm_symbol_size,1,1); - write_output("/tmp/drs_est0.m","drsest0",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); + write_output("/tmp/drs_est0.m","drsest0",eNB->pusch_vars[UE_id]->drs_ch_estimates[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/drs_est1.m","drsest1",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[0][1],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + write_output("/tmp/drs_est1.m","drsest1",eNB->pusch_vars[UE_id]->drs_ch_estimates[0][1],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - write_output("/tmp/ulsch_rxF_comp0.m","ulsch0_rxF_comp0",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); - // write_output("ulsch_rxF_comp1.m","ulsch0_rxF_comp1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); - write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->llr, - PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs) - *PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Nsymb_pusch,1,0); - write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); - // write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); + write_output("/tmp/ulsch_rxF_comp0.m","ulsch0_rxF_comp0",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); + // write_output("ulsch_rxF_comp1.m","ulsch0_rxF_comp1",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); + write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",eNB->pusch_vars[UE_id]->llr, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs) + *eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch,1,0); + write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&eNB->pusch_vars[UE_id]->ul_ch_mag[0][0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); + // write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&eNB->pusch_vars[UE_id]->ul_ch_mag[0][1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); //#endif } diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index 6a63043e9c..eb2296077a 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -33,7 +33,7 @@ #define SOFFSET 0 -int slot_fep(PHY_VARS_UE *phy_vars_ue, +int slot_fep(PHY_VARS_UE *ue, unsigned char l, unsigned char Ns, int sample_offset, @@ -41,8 +41,8 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, int reset_freq_est) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - LTE_UE_COMMON *ue_common_vars = &phy_vars_ue->lte_ue_common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_COMMON *common_vars = &ue->common_vars; uint8_t eNB_id = 0;//ue_common_vars->eNb_id; unsigned char aa; unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame @@ -111,37 +111,37 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, for (aa=0; aanb_antennas_rx; aa++) { - memset(&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); + memset(&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET; // Align with 256 bit // rx_offset = rx_offset&0xfffffff8; #ifdef DEBUG_FEP - // if (phy_vars_ue->frame <100) - printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", phy_vars_ue->frame_rx,Ns, symbol, + // if (ue->frame <100) + printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", ue->frame_rx,Ns, symbol, nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset); #endif if (l==0) { if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) - memcpy((short *)&ue_common_vars->rxdata[aa][frame_length_samples], - (short *)&ue_common_vars->rxdata[aa][0], + memcpy((short *)&common_vars->rxdata[aa][frame_length_samples], + (short *)&common_vars->rxdata[aa][0], frame_parms->ofdm_symbol_size*sizeof(int)); if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs memcpy((void *)tmp_dft_in, - (void *)&ue_common_vars->rxdata[aa][rx_offset % frame_length_samples], + (void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly - start_meas(&phy_vars_ue->rx_dft_stats); + start_meas(&ue->rx_dft_stats); - dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); - stop_meas(&phy_vars_ue->rx_dft_stats); + dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + stop_meas(&ue->rx_dft_stats); } } else { @@ -149,54 +149,54 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, // (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1); #ifdef DEBUG_FEP - // if (phy_vars_ue->frame <100) - printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", phy_vars_ue->frame_rx,Ns, symbol, + // if (ue->frame <100) + printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", ue->frame_rx,Ns, symbol, nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset); #endif if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) - memcpy((void *)&ue_common_vars->rxdata[aa][frame_length_samples], - (void *)&ue_common_vars->rxdata[aa][0], + memcpy((void *)&common_vars->rxdata[aa][frame_length_samples], + (void *)&common_vars->rxdata[aa][0], frame_parms->ofdm_symbol_size*sizeof(int)); - start_meas(&phy_vars_ue->rx_dft_stats); + start_meas(&ue->rx_dft_stats); if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs memcpy((void *)tmp_dft_in, - (void *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + (void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly - dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } - stop_meas(&phy_vars_ue->rx_dft_stats); + stop_meas(&ue->rx_dft_stats); } } - if (phy_vars_ue->perfect_ce == 0) { + if (ue->perfect_ce == 0) { if ((l==0) || (l==(4-frame_parms->Ncp))) { for (aa=0; aanb_antennas_tx_eNB; aa++) { #ifdef DEBUG_FEP printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); #endif - start_meas(&phy_vars_ue->dlsch_channel_estimation_stats); - lte_dl_channel_estimation(phy_vars_ue,eNB_id,0, + start_meas(&ue->dlsch_channel_estimation_stats); + lte_dl_channel_estimation(ue,eNB_id,0, Ns, aa, l, symbol); - stop_meas(&phy_vars_ue->dlsch_channel_estimation_stats); + stop_meas(&ue->dlsch_channel_estimation_stats); - for (i=0; iPHY_measurements.n_adj_cells; i++) { - lte_dl_channel_estimation(phy_vars_ue,eNB_id,i+1, + for (i=0; imeasurements.n_adj_cells; i++) { + lte_dl_channel_estimation(ue,eNB_id,i+1, Ns, aa, l, @@ -212,13 +212,13 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, #endif if (l==(4-frame_parms->Ncp)) { - start_meas(&phy_vars_ue->dlsch_freq_offset_estimation_stats); - lte_est_freq_offset(ue_common_vars->dl_ch_estimates[0], + start_meas(&ue->dlsch_freq_offset_estimation_stats); + lte_est_freq_offset(common_vars->dl_ch_estimates[0], frame_parms, l, - &ue_common_vars->freq_offset, + &common_vars->freq_offset, reset_freq_est); - stop_meas(&phy_vars_ue->dlsch_freq_offset_estimation_stats); + stop_meas(&ue->dlsch_freq_offset_estimation_stats); } } diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index f6ca4aa2f4..f2d2421496 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -32,15 +32,15 @@ #define SOFFSET 0 -int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, +int slot_fep_mbsfn(PHY_VARS_UE *ue, unsigned char l, int subframe, int sample_offset, int no_prefix) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - LTE_UE_COMMON *ue_common_vars = &phy_vars_ue->lte_ue_common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_COMMON *common_vars = &ue->common_vars; uint8_t eNB_id = 0;//ue_common_vars->eNb_id; unsigned char aa; @@ -117,34 +117,34 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, for (aa=0; aanb_antennas_rx; aa++) { - memset(&ue_common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*l],0,2*frame_parms->ofdm_symbol_size*sizeof(int)); + memset(&common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*l],0,2*frame_parms->ofdm_symbol_size*sizeof(int)); if (l==0) { - start_meas(&phy_vars_ue->rx_dft_stats); - dft((int16_t *)&ue_common_vars->rxdata[aa][(sample_offset + + start_meas(&ue->rx_dft_stats); + dft((int16_t *)&common_vars->rxdata[aa][(sample_offset + nb_prefix_samples0 + subframe_offset - SOFFSET) % frame_length_samples], - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); - stop_meas(&phy_vars_ue->rx_dft_stats); + (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); + stop_meas(&ue->rx_dft_stats); } else { if ((sample_offset + (frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) + (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) + subframe_offset- SOFFSET) > (frame_length_samples - frame_parms->ofdm_symbol_size)) - memcpy((short *)&ue_common_vars->rxdata[aa][frame_length_samples], - (short *)&ue_common_vars->rxdata[aa][0], + memcpy((short *)&common_vars->rxdata[aa][frame_length_samples], + (short *)&common_vars->rxdata[aa][0], frame_parms->ofdm_symbol_size*sizeof(int)); - start_meas(&phy_vars_ue->rx_dft_stats); - dft((int16_t *)&ue_common_vars->rxdata[aa][(sample_offset + + start_meas(&ue->rx_dft_stats); + dft((int16_t *)&common_vars->rxdata[aa][(sample_offset + (frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) + (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) + subframe_offset- SOFFSET) % frame_length_samples], - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); - stop_meas(&phy_vars_ue->rx_dft_stats); + (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); + stop_meas(&ue->rx_dft_stats); } } @@ -153,29 +153,29 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, // changed to invoke MBSFN channel estimation in symbols 2,6,10 if ((l==2)||(l==6)||(l==10)) { for (aa=0; aanb_antennas_tx; aa++) { - if (phy_vars_ue->perfect_ce == 0) { + if (ue->perfect_ce == 0) { #ifdef DEBUG_FEP msg("Channel estimation eNB %d, aatx %d, subframe %d, symbol %d\n",eNB_id,aa,subframe,l); #endif - lte_dl_mbsfn_channel_estimation(phy_vars_ue, + lte_dl_mbsfn_channel_estimation(ue, eNB_id, 0, subframe, l); - /* for (i=0;iPHY_measurements.n_adj_cells;i++) { - lte_dl_mbsfn_channel_estimation(phy_vars_ue, + /* for (i=0;iPHY_measurements.n_adj_cells;i++) { + lte_dl_mbsfn_channel_estimation(ue, eNB_id, i+1, subframe, l); - lte_dl_channel_estimation(phy_vars_ue,eNB_id,0, + lte_dl_channel_estimation(ue,eNB_id,0, Ns, aa, l, symbol); - for (i=0;iPHY_measurements.n_adj_cells;i++) { - lte_dl_channel_estimation(phy_vars_ue,eNB_id,i+1, + for (i=0;iPHY_measurements.n_adj_cells;i++) { + lte_dl_channel_estimation(ue,eNB_id,i+1, Ns, aa, l, @@ -189,10 +189,10 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, #endif // if ((l == 0) || (l==(4-frame_parms->Ncp))) /* if ((l==2)||(l==6)||(l==10)) - lte_mbsfn_est_freq_offset(ue_common_vars->dl_ch_estimates[0], + lte_mbsfn_est_freq_offset(common_vars->dl_ch_estimates[0], frame_parms, l, - &ue_common_vars->freq_offset); */ + &common_vars->freq_offset); */ } } } diff --git a/openair1/PHY/MODULATION/ul_7_5_kHz.c b/openair1/PHY/MODULATION/ul_7_5_kHz.c index 4a50ad395e..481e0dd2a0 100755 --- a/openair1/PHY/MODULATION/ul_7_5_kHz.c +++ b/openair1/PHY/MODULATION/ul_7_5_kHz.c @@ -42,7 +42,7 @@ short conjugate75[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ; short conjugate75_2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; short negate[8]__attribute__((aligned(16))) = {-1,-1,-1,-1,-1,-1,-1,-1}; -void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot) +void apply_7_5_kHz(PHY_VARS_UE *ue,int32_t*txdata,uint8_t slot) { @@ -58,7 +58,7 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot) uint32_t slot_offset; // uint8_t aa; uint32_t i; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; switch (frame_parms->N_RB_UL) { @@ -91,10 +91,8 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot) break; } - slot_offset = (uint32_t)slot * phy_vars_ue->lte_frame_parms.samples_per_tti/2; - // if ((slot&1)==1) - // slot_offset += (len/4); - len = phy_vars_ue->lte_frame_parms.samples_per_tti/2; + slot_offset = (uint32_t)slot * frame_parms->samples_per_tti/2; + len = frame_parms->samples_per_tti/2; #if defined(__x86_64__) || defined(__i386__) txptr128 = (__m128i *)&txdata[slot_offset]; @@ -149,12 +147,12 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot) } -void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot) +void remove_7_5_kHz(PHY_VARS_eNB *eNB,uint8_t slot) { - int32_t **rxdata=phy_vars_eNB->lte_eNB_common_vars.rxdata[0]; - int32_t **rxdata_7_5kHz=phy_vars_eNB->lte_eNB_common_vars.rxdata_7_5kHz[0]; + int32_t **rxdata=eNB->common_vars.rxdata[0]; + int32_t **rxdata_7_5kHz=eNB->common_vars.rxdata_7_5kHz[0]; uint16_t len; uint32_t *kHz7_5ptr; #if defined(__x86_64__) || defined(__i386__) @@ -168,9 +166,9 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot) uint32_t slot_offset,slot_offset2; uint8_t aa; uint32_t i; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms; - switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) { + switch (frame_parms->N_RB_UL) { case 6: kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s6n_kHz_7_5 : (uint32_t*)s6e_kHz_7_5; @@ -202,12 +200,12 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot) } - slot_offset = (uint32_t)slot * phy_vars_eNB->lte_frame_parms.samples_per_tti/2-phy_vars_eNB->N_TA_offset; - slot_offset2 = (uint32_t)(slot&1) * phy_vars_eNB->lte_frame_parms.samples_per_tti/2; + slot_offset = (uint32_t)slot * frame_parms->samples_per_tti/2-eNB->N_TA_offset; + slot_offset2 = (uint32_t)(slot&1) * frame_parms->samples_per_tti/2; - len = phy_vars_eNB->lte_frame_parms.samples_per_tti/2; + len = frame_parms->samples_per_tti/2; - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aanb_antennas_rx; aa++) { #if defined(__x86_64__) || defined(__i386__) rxptr128 = (__m128i *)&rxdata[aa][slot_offset]; @@ -270,3 +268,4 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot) } } } + diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 468aae8052..601e2fb199 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -161,7 +161,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, { int eNB_id = 0; int i,i2,arx,atx,ind,k; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->frame_parms; int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti; uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE @@ -190,9 +190,9 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, int mcs = 0; // choose max MCS to compute coded_bits_per_codeword - if (phy_vars_enb->ulsch_eNB[UE_id]!=NULL) { + if (phy_vars_enb->ulsch[UE_id]!=NULL) { for (harq_pid=0; harq_pid<3; harq_pid++) { - mcs = cmax(phy_vars_enb->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,mcs); + mcs = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->mcs,mcs); } } @@ -202,11 +202,11 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero bit = malloc(coded_bits_per_codeword*sizeof(float)); - rxsig_t = (int16_t**) phy_vars_enb->lte_eNB_common_vars.rxdata[eNB_id]; - chest_t = (int16_t**) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id]; - chest_f = (int16_t**) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[eNB_id]; - pusch_llr = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->llr; - pusch_comp = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id][0]; + rxsig_t = (int16_t**) phy_vars_enb->common_vars.rxdata[eNB_id]; + chest_t = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id]; + chest_f = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id]; + pusch_llr = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->llr; + pusch_comp = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0]; pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id]; pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id]; pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id]; @@ -488,7 +488,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, uint8_t subframe) { int i,arx,atx,ind,k; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; int nsymb_ce = frame_parms->ofdm_symbol_size;//*frame_parms->symbols_per_tti; uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; uint8_t nb_antennas_tx = frame_parms->nb_antennas_tx_eNB; @@ -516,32 +516,32 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, unsigned char harq_pid = 0; - if (phy_vars_ue->dlsch_ue[eNB_id][0]!=NULL) { - harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid; + if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) { + harq_pid = phy_vars_ue->dlsch[eNB_id][0]->current_harq_pid; if (harq_pid>=8) return; - mcs = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs; + mcs = phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs; // Button 0 - if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { + if(!phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { // we are in TM5 fl_show_object(form->button_0); } } - if (phy_vars_ue->lte_ue_pdcch_vars[eNB_id]!=NULL) { - num_pdcch_symbols = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; + if (phy_vars_ue->pdcch_vars[eNB_id]!=NULL) { + num_pdcch_symbols = phy_vars_ue->pdcch_vars[eNB_id]->num_pdcch_symbols; } // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); - if (phy_vars_ue->dlsch_ue[eNB_id][0]!=NULL) { + if (phy_vars_ue->dlsch[eNB_id][0]!=NULL) { coded_bits_per_codeword = get_G(frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb, + phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, get_Qm(mcs), - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, + phy_vars_ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, num_pdcch_symbols, frame, subframe); @@ -563,16 +563,16 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, llr_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); - rxsig_t = (int16_t**) phy_vars_ue->lte_ue_common_vars.rxdata; - chest_t = (int16_t**) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id]; - chest_f = (int16_t**) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id]; - pbch_llr = (int8_t*) phy_vars_ue->lte_ue_pbch_vars[eNB_id]->llr; - pbch_comp = (int16_t*) phy_vars_ue->lte_ue_pbch_vars[eNB_id]->rxdataF_comp[0]; - pdcch_llr = (int8_t*) phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->llr; - pdcch_comp = (int16_t*) phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0]; - pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0]; // stream 0 + rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata; + chest_t = (int16_t**) phy_vars_ue->common_vars.dl_ch_estimates_time[eNB_id]; + chest_f = (int16_t**) phy_vars_ue->common_vars.dl_ch_estimates[eNB_id]; + pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr; + pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; + pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[eNB_id]->llr; + pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[eNB_id]->rxdataF_comp[0]; + pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[eNB_id]->llr[0]; // stream 0 // pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0 - pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0]; + pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[eNB_id]->rxdataF_comp0[0]; // Received signal in time domain of receive antenna 0 if (rxsig_t != NULL) { diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index b72c5f648a..dd543bbbf8 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -45,6 +45,8 @@ #include #include #include +#include "common_lib.h" + //#include #include "assertions.h" #ifdef MEX @@ -151,9 +153,14 @@ enum transmission_access_mode { CANCELED_ACCESS, UNKNOWN_ACCESS, SCHEDULED_ACCESS, - CBA_ACCESS -}; + CBA_ACCESS}; +typedef enum { + eNodeB_3GPP=0, // classical eNodeB function + NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) + NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) +} eNB_func_t; + typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals int32_t amp[3][10]; @@ -175,8 +182,12 @@ typedef struct ral_threshold_phy_s { typedef struct { /// Component Carrier index uint8_t CC_id; - /// subframe index - int subframe; + /// thread index + int thread_index; + /// timestamp received from HW + openair0_timestamp timestamp_rx; + /// timestamp transmitted to HW + openair0_timestamp timestamp_tx; /// subframe to act upon for transmission int subframe_tx; /// subframe to act upon for reception @@ -189,25 +200,39 @@ typedef struct { /// \internal This variable is protected by \ref mutex_tx. int instance_cnt_tx; /// \brief Instance count for rx processing thread. - /// \internal This variable is protected by \ref mutex_rx. - int instance_cnt_rx; + /// \internal This variable is protected by \ref mutex_prach. + int instance_cnt_prach; /// pthread structure for tx processing thread pthread_t pthread_tx; /// pthread structure for rx processing thread pthread_t pthread_rx; + /// pthread attributes for tx processing thread + pthread_attr_t attr_tx; + /// pthread attributes for rx processing thread + pthread_attr_t attr_rx; + /// pthread attributes for prach processing thread + pthread_attr_t attr_prach; + /// scheduling parameters for tx thread + struct sched_param sched_param_tx; + /// scheduling parameters for rx thread + struct sched_param sched_param_rx; + /// scheduling parameters for prach thread + struct sched_param sched_param_prach; /// condition variable for tx processing thread + pthread_t pthread_prach; + /// condition variable for prach processing thread pthread_cond_t cond_tx; - /// condition variable for rx processing thread - pthread_cond_t cond_rx; + /// condition variable for rx processing thread; + pthread_cond_t cond_prach; /// mutex for tx processing thread pthread_mutex_t mutex_tx; /// mutex for tx processing thread - pthread_mutex_t mutex_rx; + pthread_mutex_t mutex_prach; } eNB_proc_t; //! \brief Number of eNB TX and RX threads. //! This number must be equal to the number of LTE subframes (10). Each thread is responsible for a single subframe. -#define NUM_ENB_THREADS 10 +#define NUM_ENB_THREADS 1 /// Top-level PHY Data Structure for eNB typedef struct PHY_VARS_eNB_s { @@ -215,25 +240,25 @@ typedef struct PHY_VARS_eNB_s { module_id_t Mod_id; uint8_t CC_id; eNB_proc_t proc[NUM_ENB_THREADS]; + eNB_func_t node_function; uint8_t local_flag; - uint32_t rx_total_gain_eNB_dB; - LTE_DL_FRAME_PARMS lte_frame_parms; - PHY_MEASUREMENTS_eNB PHY_measurements_eNB[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables - LTE_eNB_COMMON lte_eNB_common_vars; - LTE_eNB_SRS lte_eNB_srs_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PBCH lte_eNB_pbch; + uint32_t rx_total_gain_dB; + LTE_DL_FRAME_PARMS frame_parms; + PHY_MEASUREMENTS_eNB measurements[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables + LTE_eNB_COMMON common_vars; + LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_PBCH pbch; /// \brief ?. /// - first index: UE [0..NUMBER_OF_UE_MAX[ (hard coded) /// - second index: UE [0..NUMBER_OF_UE_MAX[ - LTE_eNB_PUSCH *lte_eNB_pusch_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PRACH lte_eNB_prach_vars; - LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams - // old: LTE_eNB_DLSCH_t **dlsch_eNB[2]; // Nusers times two spatial streams - LTE_eNB_ULSCH_t *ulsch_eNB[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA - LTE_eNB_DLSCH_t *dlsch_eNB_SI,*dlsch_eNB_ra; - LTE_eNB_DLSCH_t *dlsch_eNB_MCH; - LTE_eNB_UE_stats eNB_UE_stats[NUMBER_OF_UE_MAX]; - LTE_eNB_UE_stats *eNB_UE_stats_ptr[NUMBER_OF_UE_MAX]; + LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_PRACH prach_vars; + LTE_eNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams + LTE_eNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA + LTE_eNB_DLSCH_t *dlsch_SI,*dlsch_ra; + LTE_eNB_DLSCH_t *dlsch_MCH; + LTE_eNB_UE_stats UE_stats[NUMBER_OF_UE_MAX]; + LTE_eNB_UE_stats *UE_stats_ptr[NUMBER_OF_UE_MAX]; /// cell-specific reference symbols uint32_t lte_gold_table[20][2][14]; @@ -497,26 +522,24 @@ typedef struct { /// \brief indicator that Handover procedure has been triggered uint8_t ho_triggered; /// \brief Measurement variables. - PHY_MEASUREMENTS PHY_measurements; - LTE_DL_FRAME_PARMS lte_frame_parms; + PHY_MEASUREMENTS measurements; + LTE_DL_FRAME_PARMS frame_parms; /// \brief Frame parame before ho used to recover if ho fails. - LTE_DL_FRAME_PARMS lte_frame_parms_before_ho; - LTE_UE_COMMON lte_ue_common_vars; + LTE_DL_FRAME_PARMS frame_parms_before_ho; + LTE_UE_COMMON common_vars; - LTE_UE_PDSCH *lte_ue_pdsch_vars[NUMBER_OF_CONNECTED_eNB_MAX+1]; - LTE_UE_PDSCH_FLP *lte_ue_pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1]; - LTE_UE_PDSCH *lte_ue_pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1]; - LTE_UE_PDSCH *lte_ue_pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1]; - LTE_UE_PDSCH *lte_ue_pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_PBCH *lte_ue_pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_PDCCH *lte_ue_pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_PRACH *lte_ue_prach_vars[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_ue[NUMBER_OF_CONNECTED_eNB_MAX][2]; - LTE_UE_ULSCH_t *ulsch_ue[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_ue_col[NUMBER_OF_CONNECTED_eNB_MAX][2]; - LTE_UE_DLSCH_t *ulsch_ue_col[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_ue_SI[NUMBER_OF_CONNECTED_eNB_MAX],*dlsch_ue_ra[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_ue_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_PDSCH *pdsch_vars[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_PDCCH *pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch[NUMBER_OF_CONNECTED_eNB_MAX][2]; + LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX],*dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; // This is for SIC in the UE, to store the reencoded data LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX]; @@ -544,11 +567,9 @@ typedef struct { char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX]; - unsigned char ulsch_ue_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX]; - uint32_t ulsch_ue_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX]; - unsigned char ulsch_ue_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX]; - // unsigned char Msg3_timer[NUMBER_OF_CONNECTED_eNB_MAX]; - //unsigned char *Msg3_ptr[NUMBER_OF_CONNECTED_eNB_MAX]; + unsigned char ulsch_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX]; + uint32_t ulsch_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX]; + unsigned char ulsch_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX]; PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_eNB_MAX]; int turbo_iterations, turbo_cntl_iterations; /// \brief ?. diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 23e44d6692..fa6239d930 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -215,37 +215,52 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for UE RX procedures in TDD S-subframes. - @param last_slot Index of last slot (0-19) + @param thread_index Thread index in proc vector @param phy_vars_ue Pointer to UE variables on which to act @param eNB_id Local id of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_UE_S_RX(uint8_t last_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type); +void phy_procedures_UE_S_RX(uint8_t thread_index,PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type); /*! \brief Scheduling for eNB TX procedures in normal subframes. - @param next_slot Index of next slot (0-19) + @param thread_index Index of thread in proc vector @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param phy_vars_rn pointer to the RN variables */ -void phy_procedures_eNB_TX(uint8_t next_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +void phy_procedures_eNB_TX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); -/*! \brief Scheduling for eNB RX procedures in normal subframes. - @param last_slot Index of last slot (0-19) +/*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes. + @param thread_index Thread index in proc vector @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_RX(uint8_t last_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_uespec_RX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for eNB TX procedures in TDD S-subframes. - @param next_slot Index of next slot (0-19) + @param thread_index Index of thread in proc vector @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ + +/*! \brief Scheduling for eNB RX common procedures in normal subframes. + @param thread_index Thread index in proc vector + @param phy_vars_eNB Pointer to eNB variables on which to act + @param abstraction_flag Indicator of PHY abstraction +*/ +void phy_procedures_eNB_common_RX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag); + +/*! \brief Scheduling for eNB TX procedures in TDD S-subframes. + @param thread_index Index of thread in proc vector + @param phy_vars_eNB Pointer to eNB variables on which to act + @param abstraction_flag Indicator of PHY abstraction + @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying +*/ + void phy_procedures_eNB_S_TX(uint8_t next_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for eNB RX procedures in TDD S-subframes. @@ -261,6 +276,14 @@ void phy_procedures_eNB_S_RX(uint8_t last_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_ @param subframe Subframe index @returns Subframe type (DL,UL,S) */ + +/*! \brief Scheduling for eNB PRACH RX procedures + @param phy_vars_eNB Pointer to eNB variables on which to act + @param thread_id Index of thread in proc vector + @param abstraction_flag Indicator of PHY abstraction +*/ +void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_flag); + lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe); /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index. Same as subframe_select, except that it uses the Mod_id and is provided as a service to the MAC scheduler. @@ -420,14 +443,14 @@ subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch TDD, this routine computes the complex procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2) @param phy_vars_ue Pointer to UE variables @param eNB_id Index of eNB -@param sched_subframe Index of subframe where procedures were scheduled +@param thread_id Index of thread where procedures are executed @param b Pointer to PUCCH payload (b[0],b[1]) @param SR 1 means there's a positive SR in parallel to ACK/NAK @returns n1_pucch */ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, - uint8_t sched_subframe, + uint8_t thread_id, uint8_t *b, uint8_t SR); @@ -508,7 +531,7 @@ int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id, uint8_t eNB_index); */ double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE_id, frame_t frameP, sub_frame_t subframeP, int32_t UE_tx_power_dB); #endif -LTE_eNB_UE_stats* get_eNB_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti); +LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti); LTE_DL_FRAME_PARMS *get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id); diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 78c035de37..0b4fffe3d3 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -48,18 +48,18 @@ #include "SCHED/phy_procedures_emos.h" #endif -void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB) +void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) { - int i; - //uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; - uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; + + //uint8_t cooperation_flag = eNB->cooperation_flag; + uint8_t transmission_mode = eNB->transmission_mode[0]; uint32_t rballoc = 0x7FFF; //uint32_t rballoc2 = 0x000F; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + int subframe = eNB->proc[thread_id].subframe_tx; - LTE_eNB_DLSCH_t *DLSCH_ptr = phy_vars_eNB->dlsch_eNB[0][0]; + LTE_eNB_DLSCH_t *DLSCH_ptr = eNB->dlsch[0][0]; /* uint32_t rand = taus(); @@ -82,14 +82,14 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc[0].format = format1A; DCI_pdu->dci_alloc[0].ra_flag = 0; - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_FDD_t; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -100,7 +100,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -112,12 +112,12 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e case 25: default: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -128,7 +128,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -139,12 +139,12 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; case 50: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -155,7 +155,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; @@ -166,12 +166,12 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; case 100: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_FDD_t; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -182,7 +182,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -226,17 +226,17 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e if (transmission_mode<3) { //user 1 - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 25: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -252,8 +252,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -265,9 +265,9 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; - //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -283,8 +283,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -295,15 +295,15 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e case 50: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_FDD_t; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); @@ -319,8 +319,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; + //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); @@ -332,9 +332,9 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; - //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); @@ -350,8 +350,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; + //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); @@ -361,15 +361,15 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; case 100: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -385,8 +385,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -398,9 +398,9 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; - //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t)); @@ -416,8 +416,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = phy_vars_eNB->target_ue_dl_mcs; + //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -437,15 +437,15 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = phy_vars_eNB->target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = eNB->proc[thread_id].frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = phy_vars_eNB->target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = eNB->proc[thread_id].frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = phy_vars_eNB->ue_dl_rb_alloc; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = eNB->ue_dl_rb_alloc; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0; } else if (transmission_mode==5) { @@ -459,16 +459,16 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]]; + DLSCH_alloc_pdu1E.ndi = eNB->proc[thread_id].frame_tx&1; + //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[eNB->eNB_UE_stats->DL_cqi[0]]; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - DLSCH_alloc_pdu1E.mcs = phy_vars_eNB->target_ue_dl_mcs; - //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; + DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + eNB->UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; DLSCH_alloc_pdu1E.harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; DLSCH_alloc_pdu1E.dai = 0; DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = phy_vars_eNB->ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rballoc = eNB->ue_dl_rb_alloc; DLSCH_alloc_pdu1E.rah = 0; DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); @@ -479,16 +479,16 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DCI_pdu->dci_alloc[1].rnti = 0x1236; DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; DCI_pdu->dci_alloc[1].ra_flag = 0; - //DLSCH_alloc_pdu1E.mcs = phy_vars_eNB->target_ue_dl_mcs; + //DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28); - phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((eNB->frame%1024)%28); + DLSCH_alloc_pdu1E.mcs = (unsigned char) (((eNB->proc[thread_id].frame_tx%1024)/3)%28); + eNB->UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); // set the precoder of the second UE orthogonal to the first - phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); + eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); } break; //subframe switch @@ -519,7 +519,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DCI_pdu->Num_ue_spec_dci = 1; //user 1 - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) + if (eNB->frame_parms.frame_type == FDD) DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_FDD_t ; else DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; @@ -531,9 +531,9 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,2,phy_vars_eNB->ue_ul_nb_rb); - UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; - UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + UL_alloc_pdu.rballoc = computeRIV(25,2,eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; + UL_alloc_pdu.ndi = eNB->proc[thread_id].frame_tx&1; UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cshift = 0; UL_alloc_pdu.dai = 0; @@ -551,11 +551,11 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+phy_vars_eNB->ue_ul_nb_rb,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.rballoc = computeRIV(25,2+eNB->ue_ul_nb_rb,eNB->ue_ul_nb_rb); else - UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); - UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; - UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; + UL_alloc_pdu.ndi = eNB->proc[thread_id].frame_tx&1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) UL_alloc_pdu.cshift = 0; @@ -580,12 +580,12 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e */ } -void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) +void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *eNB) { - int i; - //uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; - uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; + + //uint8_t cooperation_flag = eNB->cooperation_flag; + uint8_t transmission_mode = eNB->transmission_mode[0]; //uint32_t rballoc = 0x00F0; //uint32_t rballoc2 = 0x000F; @@ -612,11 +612,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN DCI_pdu->dci_alloc[0].format = format1; DCI_pdu->dci_alloc[0].ra_flag = 0; - DLSCH_alloc_pdu.rballoc = phy_vars_eNB->ue_dl_rb_alloc; + DLSCH_alloc_pdu.rballoc = eNB->ue_dl_rb_alloc; DLSCH_alloc_pdu.TPC = 0; DLSCH_alloc_pdu.dai = 0; DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = phy_vars_eNB->target_ue_dl_mcs; + DLSCH_alloc_pdu.mcs = eNB->target_ue_dl_mcs; DLSCH_alloc_pdu.ndi = 1; DLSCH_alloc_pdu.rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -633,7 +633,7 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN DLSCH_alloc_pdu.TPC = 0; DLSCH_alloc_pdu.dai = 0; DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = phy_vars_eNB->target_ue_dl_mcs; + DLSCH_alloc_pdu.mcs = eNB->target_ue_dl_mcs; DLSCH_alloc_pdu.ndi = 1; DLSCH_alloc_pdu.rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -650,11 +650,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback DLSCH_alloc_pdu1E.rv = 0; DLSCH_alloc_pdu1E.ndi = 1; - DLSCH_alloc_pdu1E.mcs = phy_vars_eNB->target_ue_dl_mcs; + DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; DLSCH_alloc_pdu1E.harq_pid = 1; DLSCH_alloc_pdu1E.dai = 0; DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = phy_vars_eNB->ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rballoc = eNB->ue_dl_rb_alloc; DLSCH_alloc_pdu1E.rah = 0; DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); @@ -669,7 +669,7 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); // set the precoder of the second UE orthogonal to the first - phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); + eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); } break; @@ -706,8 +706,8 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); - UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = 1; UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cshift = 0; @@ -726,10 +726,10 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+phy_vars_eNB->ue_ul_nb_rb,phy_vars_eNB->ue_ul_nb_rb); + UL_alloc_pdu.rballoc = computeRIV(25,2+eNB->ue_ul_nb_rb,eNB->ue_ul_nb_rb); else - UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb); - UL_alloc_pdu.mcs = phy_vars_eNB->target_ue_ul_mcs; + UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; UL_alloc_pdu.ndi = 1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c index e56606e262..860cf9d4a0 100755 --- a/openair1/SCHED/phy_procedures_lte_common.c +++ b/openair1/SCHED/phy_procedures_lte_common.c @@ -529,7 +529,7 @@ lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub lte_subframe_t get_subframe_direction(uint8_t Mod_id,uint8_t CC_id,uint8_t subframe) { - return(subframe_select(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe)); + return(subframe_select(&PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms,subframe)); } @@ -595,20 +595,20 @@ double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE struct timeval ts; double sys_bw = 0; uint8_t N_RB_DL; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; - Mod_id = phy_vars_eNB->Mod_id; - CC_id = phy_vars_eNB->CC_id; - ref_timestamp_ms = phy_vars_eNB->ulsch_eNB[UE_id+1]->reference_timestamp_ms; + Mod_id = eNB->Mod_id; + CC_id = eNB->CC_id; + ref_timestamp_ms = eNB->ulsch[UE_id+1]->reference_timestamp_ms; for (i=0; i<13; i++) { - len += sprintf(&cqis[len]," %d ", phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_subband_cqi[0][i]); + len += sprintf(&cqis[len]," %d ", eNB->UE_stats[(uint32_t)UE_id].DL_subband_cqi[0][i]); } len = 0; - for (i=0; ilte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier; i++) { - len += sprintf(&sub_powers[len]," %d ", phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]); + for (i=0; ilte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier; i++) { + len += sprintf(&sub_powers[len]," %d ", eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]); } gettimeofday(&ts, NULL); @@ -629,23 +629,23 @@ double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE "Wideband CQI (%d,%d), " "DL Subband CQI[13] %s \n", // "timestamp %d, (%d active subcarrier) %s \n" - phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms, + eNB->dlsch[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms, frame,subframe, UE_tx_power_dB, - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[1], - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]), - phy_vars_eNB->rx_total_gain_eNB_dB, - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset, // raw timing advance 1/sampling rate - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update, - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_cqi[0],phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_cqi[1], - phy_vars_eNB->PHY_measurements_eNB[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][0], - phy_vars_eNB->PHY_measurements_eNB[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][1], + eNB->UE_stats[(uint32_t)UE_id].UL_rssi[0], + eNB->UE_stats[(uint32_t)UE_id].UL_rssi[1], + dB_fixed(eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]), + dB_fixed(eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]), + eNB->rx_total_gain_eNB_dB, + eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset, // raw timing advance 1/sampling rate + eNB->UE_stats[(uint32_t)UE_id].timing_advance_update, + eNB->UE_stats[(uint32_t)UE_id].DL_cqi[0],eNB->UE_stats[(uint32_t)UE_id].DL_cqi[1], + eNB->measurements[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][0], + eNB->measurements[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][1], cqis); LOG_D(LOCALIZE, " PHY: timestamp %d, (%d active subcarrier) %s \n", current_timestamp_ms, - phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier, + eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier, sub_powers); N_RB_DL = frame_parms->N_RB_DL; @@ -668,75 +668,75 @@ double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE break; } - if ((current_timestamp_ms - ref_timestamp_ms > phy_vars_eNB->ulsch_eNB[UE_id+1]->aggregation_period_ms)) { + if ((current_timestamp_ms - ref_timestamp_ms > eNB->ulsch[UE_id+1]->aggregation_period_ms)) { // check the size of one list to be sure there was a message transmitted during the defined aggregation period // make the reference timestamp == current timestamp - phy_vars_eNB->ulsch_eNB[UE_id+1]->reference_timestamp_ms = current_timestamp_ms; + eNB->ulsch[UE_id+1]->reference_timestamp_ms = current_timestamp_ms; int i; for (i=0; i<10; i++) { - median_power = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list[i]); - median_rssi = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list[i]); - median_subcarrier_rss = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list[i]); - median_TA = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list[i]); - median_TA_update = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list[i]); + median_power = calculate_median(&eNB->ulsch[UE_id+1]->loc_rss_list[i]); + del(&eNB->ulsch[UE_id+1]->loc_rss_list[i]); + median_rssi = calculate_median(&eNB->ulsch[UE_id+1]->loc_rssi_list[i]); + del(&eNB->ulsch[UE_id+1]->loc_rssi_list[i]); + median_subcarrier_rss = calculate_median(&eNB->ulsch[UE_id+1]->loc_subcarrier_rss_list[i]); + del(&eNB->ulsch[UE_id+1]->loc_subcarrier_rss_list[i]); + median_TA = calculate_median(&eNB->ulsch[UE_id+1]->loc_timing_advance_list[i]); + del(&eNB->ulsch[UE_id+1]->loc_timing_advance_list[i]); + median_TA_update = calculate_median(&eNB->ulsch[UE_id+1]->loc_timing_update_list[i]); + del(&eNB->ulsch[UE_id+1]->loc_timing_update_list[i]); if (median_power != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rss_list,median_power); + push_front(&eNB->ulsch[UE_id+1]->tot_loc_rss_list,median_power); if (median_rssi != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rssi_list,median_rssi); + push_front(&eNB->ulsch[UE_id+1]->tot_loc_rssi_list,median_rssi); if (median_subcarrier_rss != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_subcarrier_rss_list,median_subcarrier_rss); + push_front(&eNB->ulsch[UE_id+1]->tot_loc_subcarrier_rss_list,median_subcarrier_rss); if (median_TA != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_advance_list,median_TA); + push_front(&eNB->ulsch[UE_id+1]->tot_loc_timing_advance_list,median_TA); if (median_TA_update != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_update_list,median_TA_update); + push_front(&eNB->ulsch[UE_id+1]->tot_loc_timing_update_list,median_TA_update); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list[i]); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list[i]); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list[i]); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list[i]); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list[i]); + initialize(&eNB->ulsch[UE_id+1]->loc_rss_list[i]); + initialize(&eNB->ulsch[UE_id+1]->loc_subcarrier_rss_list[i]); + initialize(&eNB->ulsch[UE_id+1]->loc_rssi_list[i]); + initialize(&eNB->ulsch[UE_id+1]->loc_timing_advance_list[i]); + initialize(&eNB->ulsch[UE_id+1]->loc_timing_update_list[i]); } - median_power = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rss_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rss_list); - median_rssi = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rssi_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rssi_list); - median_subcarrier_rss = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_subcarrier_rss_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_subcarrier_rss_list); - median_TA = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_advance_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_advance_list); - median_TA_update = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_update_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_update_list); + median_power = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_rss_list); + del(&eNB->ulsch[UE_id+1]->tot_loc_rss_list); + median_rssi = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_rssi_list); + del(&eNB->ulsch[UE_id+1]->tot_loc_rssi_list); + median_subcarrier_rss = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_subcarrier_rss_list); + del(&eNB->ulsch[UE_id+1]->tot_loc_subcarrier_rss_list); + median_TA = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_timing_advance_list); + del(&eNB->ulsch[UE_id+1]->tot_loc_timing_advance_list); + median_TA_update = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_timing_update_list); + del(&eNB->ulsch[UE_id+1]->tot_loc_timing_update_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rss_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_subcarrier_rss_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rssi_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_advance_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_update_list); + initialize(&eNB->ulsch[UE_id+1]->tot_loc_rss_list); + initialize(&eNB->ulsch[UE_id+1]->tot_loc_subcarrier_rss_list); + initialize(&eNB->ulsch[UE_id+1]->tot_loc_rssi_list); + initialize(&eNB->ulsch[UE_id+1]->tot_loc_timing_advance_list); + initialize(&eNB->ulsch[UE_id+1]->tot_loc_timing_update_list); double alpha = 2, power_distance, time_distance; // distance = 10^((Ptx - Prx - A)/10alpha), A is a constance experimentally evaluated - // A includes the rx gain (phy_vars_eNB->rx_total_gain_eNB_dB) and hardware calibration - power_distance = pow(10, ((UE_tx_power_dB - median_power - phy_vars_eNB->rx_total_gain_eNB_dB + 133)/(10.0*alpha))); + // A includes the rx gain (eNB->rx_total_gain_eNB_dB) and hardware calibration + power_distance = pow(10, ((UE_tx_power_dB - median_power - eNB->rx_total_gain_eNB_dB + 133)/(10.0*alpha))); /* current measurements shows constant UE_timing_offset = 18 and timing_advance_update = 11 at 1m. at 5m, timing_advance_update = 12*/ - //time_distance = (double) 299792458*(phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update)/(sys_bw*1000000); - time_distance = (double) abs(phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update - 11) * 4.89;// (3 x 108 x 1 / (15000 x 2048)) / 2 = 4.89 m + //time_distance = (double) 299792458*(eNB->UE_stats[(uint32_t)UE_id].timing_advance_update)/(sys_bw*1000000); + time_distance = (double) abs(eNB->UE_stats[(uint32_t)UE_id].timing_advance_update - 11) * 4.89;// (3 x 108 x 1 / (15000 x 2048)) / 2 = 4.89 m - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].distance.time_based = time_distance; - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].distance.power_based = power_distance; + eNB->UE_stats[(uint32_t)UE_id].distance.time_based = time_distance; + eNB->UE_stats[(uint32_t)UE_id].distance.power_based = power_distance; LOG_D(LOCALIZE, " PHY agg [UE %x/%d -> eNB %d], timestamp %d, " "frame %d, subframe %d " @@ -747,61 +747,61 @@ double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE "power estimated r = %0.3f, " " TA %d, update %d " "TA estimated r = %0.3f\n" - ,phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms, + ,eNB->dlsch[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms, frame, subframe, UE_tx_power_dB, median_rssi, median_power, - phy_vars_eNB->rx_total_gain_eNB_dB, + eNB->rx_total_gain_eNB_dB, power_distance, - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset, median_TA_update, + eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset, median_TA_update, time_distance); return 0; } else { - avg_power = (dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]) + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]))/2; - avg_rssi = (phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[0] + phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[1])/2; + avg_power = (dB_fixed(eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]) + dB_fixed(eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]))/2; + avg_rssi = (eNB->UE_stats[(uint32_t)UE_id].UL_rssi[0] + eNB->UE_stats[(uint32_t)UE_id].UL_rssi[1])/2; - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list[subframe],avg_power); - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list[subframe],avg_rssi); + push_front(&eNB->ulsch[UE_id+1]->loc_rss_list[subframe],avg_power); + push_front(&eNB->ulsch[UE_id+1]->loc_rssi_list[subframe],avg_rssi); - for (i=0; ilte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier; i++) { - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list[subframe], phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]); + for (i=0; ilte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier; i++) { + push_front(&eNB->ulsch[UE_id+1]->loc_subcarrier_rss_list[subframe], eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]); } - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list[subframe], phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset); - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list[subframe], phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update); + push_front(&eNB->ulsch[UE_id+1]->loc_timing_advance_list[subframe], eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset); + push_front(&eNB->ulsch[UE_id+1]->loc_timing_update_list[subframe], eNB->UE_stats[(uint32_t)UE_id].timing_advance_update); return -1; } } #endif -LTE_eNB_UE_stats* get_eNB_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti) +LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti) { int8_t UE_id; if ((PHY_vars_eNB_g == NULL) || (PHY_vars_eNB_g[Mod_id] == NULL) || (PHY_vars_eNB_g[Mod_id][CC_id]==NULL)) { - LOG_E(PHY,"get_eNB_UE_stats: No phy_vars_eNB found (or not allocated) for Mod_id %d,CC_id %d\n",Mod_id,CC_id); + LOG_E(PHY,"get_UE_stats: No eNB found (or not allocated) for Mod_id %d,CC_id %d\n",Mod_id,CC_id); return NULL; } UE_id = find_ue(rnti, PHY_vars_eNB_g[Mod_id][CC_id]); if (UE_id == -1) { - // LOG_E(PHY,"get_eNB_UE_stats: UE with rnti %x not found\n",rnti); + // LOG_E(PHY,"get_UE_stats: UE with rnti %x not found\n",rnti); return NULL; } - return(&PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[(uint32_t)UE_id]); + return(&PHY_vars_eNB_g[Mod_id][CC_id]->UE_stats[(uint32_t)UE_id]); } -int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB) +int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *eNB) { uint8_t i; for (i=0; idlsch_eNB[i]) && - (phy_vars_eNB->dlsch_eNB[i][0]) && - (phy_vars_eNB->dlsch_eNB[i][0]->rnti==rnti)) { + if ((eNB->dlsch[i]) && + (eNB->dlsch[i][0]) && + (eNB->dlsch[i][0]->rnti==rnti)) { return(i); } } @@ -809,9 +809,9 @@ int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB) #ifdef CBA for (i=0; iulsch_eNB[i]) && // ue J is the representative of group j - (phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups) && - (phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i]== rnti)) + if ((eNB->ulsch[i]) && // ue J is the representative of group j + (eNB->ulsch[i]->num_active_cba_groups) && + (eNB->ulsch[i]->cba_rnti[i]== rnti)) return(i); } @@ -823,7 +823,7 @@ int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB) LTE_DL_FRAME_PARMS* get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id) { - return(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms); + return(&PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms); } diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 619ef6578d..d26980b0f8 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -61,9 +61,6 @@ #if defined(ENABLE_ITTI) # include "intertask_interface.h" -# if ENABLE_RAL -# include "timer.h" -# endif #endif //#define DIAG_PHY @@ -72,8 +69,11 @@ #define PUCCH 1 +void exit_fun(const char* s); + extern int exit_openair; +extern openair0_device openair0; unsigned char dlsch_input_buffer[2700] __attribute__ ((aligned(32))); int eNB_sync_buffer0[640*6] __attribute__ ((aligned(32))); @@ -101,30 +101,31 @@ extern uint8_t smbv_frame_cnt; extern int rx_sig_fifo; #endif -uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe) +uint8_t is_SR_subframe(PHY_VARS_eNB *eNB,uint8_t UE_id,uint8_t thread_id) { - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + eNB_proc_t *proc = &eNB->proc[thread_id]; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking for SR TXOp(sr_ConfigIndex %d)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe, - phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex); + eNB->Mod_id,eNB->ulsch[UE_id]->rnti,frame,subframe, + eNB->scheduling_request_config[UE_id].sr_ConfigIndex); - if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 4) { // 5 ms SR period - if ((subframe%5) == phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex) + if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 4) { // 5 ms SR period + if ((subframe%5) == eNB->scheduling_request_config[UE_id].sr_ConfigIndex) return(1); - } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 14) { // 10 ms SR period - if (subframe==(phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5)) + } else if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 14) { // 10 ms SR period + if (subframe==(eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5)) return(1); - } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 34) { // 20 ms SR period - if ((10*(frame&1)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15)) + } else if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 34) { // 20 ms SR period + if ((10*(frame&1)+subframe) == (eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15)) return(1); - } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 74) { // 40 ms SR period - if ((10*(frame&3)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35)) + } else if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 74) { // 40 ms SR period + if ((10*(frame&3)+subframe) == (eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35)) return(1); - } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 154) { // 80 ms SR period - if ((10*(frame&7)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75)) + } else if (eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 154) { // 80 ms SR period + if ((10*(frame&7)+subframe) == (eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75)) return(1); } @@ -155,37 +156,37 @@ void remove_harq_pid_from_freelist(LTE_eNB_DLSCH_t *DLSCH_ptr, int harq_pid) DLSCH_ptr->head_freelist = (DLSCH_ptr->head_freelist + 1) % 10; } -int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB) +int32_t add_ue(int16_t rnti, PHY_VARS_eNB *eNB) { uint8_t i; #ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d/%d] Adding UE with rnti %x\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, + eNB->Mod_id, + eNB->CC_id, (uint16_t)rnti); #endif for (i=0; idlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { + if ((eNB->dlsch[i]==NULL) || (eNB->ulsch[i]==NULL)) { MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed add ue %"PRIx16" (ENOMEM)", rnti); LOG_E(PHY,"Can't add UE, not enough memory allocated\n"); return(-1); } else { - if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) { + if (eNB->UE_stats[i].crnti==0) { MSC_LOG_EVENT(MSC_PHY_ENB, "0 Add ue %"PRIx16" ", rnti); LOG_D(PHY,"UE_id %d associated with rnti %x\n",i, (uint16_t)rnti); - phy_vars_eNB->dlsch_eNB[i][0]->rnti = rnti; - phy_vars_eNB->ulsch_eNB[i]->rnti = rnti; - phy_vars_eNB->eNB_UE_stats[i].crnti = rnti; + eNB->dlsch[i][0]->rnti = rnti; + eNB->ulsch[i]->rnti = rnti; + eNB->UE_stats[i].crnti = rnti; - phy_vars_eNB->eNB_UE_stats[i].Po_PUCCH1_below = 0; - phy_vars_eNB->eNB_UE_stats[i].Po_PUCCH1_above = (int32_t)pow(10.0,.1*(phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+phy_vars_eNB->rx_total_gain_eNB_dB)); - phy_vars_eNB->eNB_UE_stats[i].Po_PUCCH = (int32_t)pow(10.0,.1*(phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+phy_vars_eNB->rx_total_gain_eNB_dB)); + eNB->UE_stats[i].Po_PUCCH1_below = 0; + eNB->UE_stats[i].Po_PUCCH1_above = (int32_t)pow(10.0,.1*(eNB->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+eNB->rx_total_gain_dB)); + eNB->UE_stats[i].Po_PUCCH = (int32_t)pow(10.0,.1*(eNB->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+eNB->rx_total_gain_dB)); LOG_D(PHY,"Initializing Po_PUCCH: p0_NominalPUCCH %d, gain %d => %d\n", - phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - phy_vars_eNB->rx_total_gain_eNB_dB, - phy_vars_eNB->eNB_UE_stats[i].Po_PUCCH); + eNB->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + eNB->rx_total_gain_dB, + eNB->UE_stats[i].Po_PUCCH); return(i); } @@ -197,33 +198,33 @@ int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB) int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { uint8_t i; int j,CC_id; - PHY_VARS_eNB *phy_vars_eNB; + PHY_VARS_eNB *eNB; for (CC_id=0;CC_iddlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { + if ((eNB->dlsch[i]==NULL) || (eNB->ulsch[i]==NULL)) { MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (ENOMEM)", rnti); LOG_E(PHY,"Can't remove UE, not enough memory allocated\n"); return(-1); } else { - if (phy_vars_eNB->eNB_UE_stats[i].crnti==rntiP) { + if (eNB->UE_stats[i].crnti==rntiP) { MSC_LOG_EVENT(MSC_PHY_ENB, "0 Removed ue %"PRIx16" ", rntiP); #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",phy_vars_eNB->Mod_id,i,rnti); + LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",eNB->Mod_id,i,rnti); #endif //LOG_D(PHY,("[PHY] UE_id %d\n",i); - clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]); - clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]); - //phy_vars_eNB->eNB_UE_stats[i].crnti = 0; - memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats)); + clean_eNb_dlsch(eNB->dlsch[i][0]); + clean_eNb_ulsch(eNB->ulsch[i]); + //eNB->UE_stats[i].crnti = 0; + memset(&eNB->UE_stats[i],0,sizeof(LTE_eNB_UE_stats)); // mac_exit_wrapper("Removing UE"); /* clear the harq pid freelist */ - phy_vars_eNB->dlsch_eNB[i][0]->head_freelist = 0; - phy_vars_eNB->dlsch_eNB[i][0]->tail_freelist = 0; + eNB->dlsch[i][0]->head_freelist = 0; + eNB->dlsch[i][0]->tail_freelist = 0; for (j = 0; j < 8; j++) - put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[i][0], j); + put_harq_pid_in_freelist(eNB->dlsch[i][0], j); return(i); } @@ -234,15 +235,15 @@ int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { return(-1); } -int8_t find_next_ue_index(PHY_VARS_eNB *phy_vars_eNB) +int8_t find_next_ue_index(PHY_VARS_eNB *eNB) { uint8_t i; for (i=0; ieNB_UE_stats[i].crnti==0) { - /*if ((phy_vars_eNB->dlsch_eNB[i]) && - (phy_vars_eNB->dlsch_eNB[i][0]) && - (phy_vars_eNB->dlsch_eNB[i][0]->rnti==0))*/ + if (eNB->UE_stats[i].crnti==0) { + /*if ((eNB->dlsch[i]) && + (eNB->dlsch[i][0]) && + (eNB->dlsch[i][0]->rnti==0))*/ LOG_D(PHY,"Next free UE id is %d\n",i); return(i); } @@ -267,7 +268,7 @@ int get_ue_active_harq_pid(const uint8_t Mod_id,const uint8_t CC_id,const uint16 } if (ul_flag == 0) {// this is a DL request - DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->dlsch_eNB[(uint32_t)UE_id][0]; + DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->dlsch[(uint32_t)UE_id][0]; // set to no available process first *harq_pid = -1; @@ -305,11 +306,11 @@ int get_ue_active_harq_pid(const uint8_t Mod_id,const uint8_t CC_id,const uint16 frame,subframe,*harq_pid); } else { // This is a UL request - ULSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[(uint32_t)UE_id]; - ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe); - ulsch_frame = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,frame,subframe); + ULSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->ulsch[(uint32_t)UE_id]; + ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms,subframe); + ulsch_frame = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms,frame,subframe); // Note this is for TDD configuration 3,4,5 only - *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms, + *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms, ulsch_frame, ulsch_subframe); *round = ULSCH_ptr->harq_processes[*harq_pid]->round; @@ -321,18 +322,16 @@ int get_ue_active_harq_pid(const uint8_t Mod_id,const uint8_t CC_id,const uint16 int16_t get_target_pusch_rx_power(const module_id_t module_idP, const uint8_t CC_id) { - //return PHY_vars_eNB_g[module_idP][CC_id]->PHY_measurements_eNB[0].n0_power_tot_dBm; - return PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH; + return PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.ul_power_control_config_common.p0_NominalPUSCH; } int16_t get_target_pucch_rx_power(const module_id_t module_idP, const uint8_t CC_id) { - //return PHY_vars_eNB_g[module_idP][CC_id]->PHY_measurements_eNB[0].n0_power_tot_dBm; - return PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH; + return PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.ul_power_control_config_common.p0_NominalPUCCH; } #ifdef EMOS -void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *phy_vars_eNB) +void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *eNB) { } @@ -340,27 +339,27 @@ void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *phy_vars_e -void phy_procedures_eNB_S_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) +void phy_procedures_eNB_S_RX(unsigned char thread_id,PHY_VARS_eNB *eNB,uint8_t abstraction_flag,relaying_type_t r_type) { UNUSED(r_type); - - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + eNB_proc_t *proc = &eNB->proc[thread_id]; + int subframe = proc->subframe_rx; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_S_RX(%d)\n", phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_rx, subframe); + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_S_RX(%d)\n", eNB->Mod_id,proc->frame_rx, subframe); #endif if (abstraction_flag == 0) { - lte_eNB_I0_measurements(phy_vars_eNB, + lte_eNB_I0_measurements(eNB, subframe, 0, - phy_vars_eNB->first_run_I0_measurements); + eNB->first_run_I0_measurements); } #ifdef PHY_ABSTRACTION else { - lte_eNB_I0_measurements_emul(phy_vars_eNB, + lte_eNB_I0_measurements_emul(eNB, 0); } @@ -372,12 +371,12 @@ void phy_procedures_eNB_S_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars #ifdef EMOS -void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB) +void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *eNB) { uint8_t aa; uint16_t last_subframe_emos; - uint16_t pilot_pos1 = 3 - phy_vars_eNB->lte_frame_parms.Ncp, pilot_pos2 = 10 - 2*phy_vars_eNB->lte_frame_parms.Ncp; + uint16_t pilot_pos1 = 3 - eNB->frame_parms.Ncp, pilot_pos2 = 10 - 2*eNB->frame_parms.Ncp; uint32_t bytes; last_subframe_emos=0; @@ -389,37 +388,37 @@ void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eN //if (last_slot%2==1) // this is for all UL subframes if (subframe==3) - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { - memcpy(&emos_dump_eNB.channel[aa][last_subframe_emos*2*phy_vars_eNB->lte_frame_parms.N_RB_UL*12], - &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos1], - phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int)); - memcpy(&emos_dump_eNB.channel[aa][(last_subframe_emos*2+1)*phy_vars_eNB->lte_frame_parms.N_RB_UL*12], - &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos2], - phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int)); + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { + memcpy(&emos_dump_eNB.channel[aa][last_subframe_emos*2*eNB->frame_parms.N_RB_UL*12], + &eNB->pusch_vars[0]->drs_ch_estimates[0][aa][eNB->frame_parms.N_RB_UL*12*pilot_pos1], + eNB->frame_parms.N_RB_UL*12*sizeof(int)); + memcpy(&emos_dump_eNB.channel[aa][(last_subframe_emos*2+1)*eNB->frame_parms.N_RB_UL*12], + &eNB->pusch_vars[0]->drs_ch_estimates[0][aa][eNB->frame_parms.N_RB_UL*12*pilot_pos2], + eNB->frame_parms.N_RB_UL*12*sizeof(int)); } #endif if (subframe==4) { emos_dump_eNB.timestamp = rt_get_time_ns(); - emos_dump_eNB.frame_tx = phy_vars_eNB->proc[subframe].frame_rx; - emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB; - emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0]; - memcpy(&emos_dump_eNB.PHY_measurements_eNB, - &phy_vars_eNB->PHY_measurements_eNB[0], + emos_dump_eNB.frame_tx = eNB->proc[subframe].frame_rx; + emos_dump_eNB.rx_total_gain_dB = eNB->rx_total_gain_dB; + emos_dump_eNB.mimo_mode = eNB->transmission_mode[0]; + memcpy(&emos_dump_eNB.measurements, + &eNB->measurements[0], sizeof(PHY_MEASUREMENTS_eNB)); - memcpy(&emos_dump_eNB.eNB_UE_stats[0],&phy_vars_eNB->eNB_UE_stats[0],NUMBER_OF_UE_MAX*sizeof(LTE_eNB_UE_stats)); + memcpy(&emos_dump_eNB.UE_stats[0],&eNB->UE_stats[0],NUMBER_OF_UE_MAX*sizeof(LTE_eNB_UE_stats)); bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_eNB, sizeof(fifo_dump_emos_eNB)); //bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test")); if (bytes!=sizeof(fifo_dump_emos_eNB)) { LOG_W(PHY,"[eNB %d] Frame %d, subframe %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[(subframe+1)%10].frame_rx, subframe,bytes,sizeof(fifo_dump_emos_eNB)); + eNB->Mod_id,eNB->proc[(subframe+1)%10].frame_rx, subframe,bytes,sizeof(fifo_dump_emos_eNB)); } else { - if (phy_vars_eNB->proc[(subframe+1)%10].frame_tx%100==0) { + if (eNB->proc[(subframe+1)%10].frame_tx%100==0) { LOG_I(PHY,"[eNB %d] Frame %d (%d), subframe %d, Writing %d bytes EMOS data to FIFO\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[(subframe+1)%10].frame_rx, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, subframe, bytes); + eNB->Mod_id,eNB->proc[(subframe+1)%10].frame_rx, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, subframe, bytes); } } } @@ -433,148 +432,22 @@ int QPSK[4]= {AMP_OVER_SQRT2|(AMP_OVER_SQRT2<<16),AMP_OVER_SQRT2|((65536-AMP_OVE int QPSK2[4]= {AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),((65536-AMP_OVER_2)<<16)|AMP_OVER_2,((65536-AMP_OVER_2)<<16)|(65536-AMP_OVER_2)}; -#if defined(ENABLE_ITTI) -# if ENABLE_RAL -extern PHY_MEASUREMENTS PHY_measurements; - -void phy_eNB_lte_measurement_thresholds_test_and_report(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP, uint16_t valP) -{ - MessageDef *message_p = NULL; - - if ( - ( - ((threshold_phy_pP->threshold.threshold_val < valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) || - ((threshold_phy_pP->threshold.threshold_val > valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD)) - ) || - (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD) - ) { - message_p = itti_alloc_new_message(TASK_PHY_ENB , PHY_MEAS_REPORT_IND); - memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p))); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold, - &threshold_phy_pP->threshold, - sizeof(PHY_MEAS_REPORT_IND (message_p).threshold)); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param, - &threshold_phy_pP->link_param, - sizeof(PHY_MEAS_REPORT_IND (message_p).link_param)); - \ - - switch (threshold_phy_pP->link_param.choice) { - case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL: - PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP; - break; - - case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL: - //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val. - AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n"); - break; - } - - itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p); - } -} - -void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) -{ - unsigned int mod_id; - - mod_id = instanceP; - - switch (threshold_phy_pP->link_param.link_param_type.choice) { - - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_GEN_DATA_RATE: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_SINR: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_THROUGHPUT: - break; - - case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE: - break; - - default: - ; - } - - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_LTE_UE_RSRP: - break; - - case RAL_LINK_PARAM_LTE_UE_RSRQ: - break; - - case RAL_LINK_PARAM_LTE_UE_CQI: - break; - - case RAL_LINK_PARAM_LTE_AVAILABLE_BW: - break; - - case RAL_LINK_PARAM_LTE_PACKET_DELAY: - break; - - case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: - break; - - case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: - break; - - case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: - break; - - case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: - break; - - case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: - break; - - case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: - break; - - case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: - break; - - default: - ; - } - - break; - - default: - ; - } -} -# endif -#endif - unsigned int taus(void); -void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int sched_subframe,int abstraction_flag,relaying_type_t r_type) { +void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int thread_id,int abstraction_flag,relaying_type_t r_type) { #ifdef Rel10 MCH_PDU *mch_pduP; MCH_PDU mch_pdu; // uint8_t sync_area=255; #endif + eNB_proc_t *proc = &eNB->proc[thread_id]; if (abstraction_flag==0) { // This is DL-Cell spec pilots in Control region generate_pilots_slot(eNB, - eNB->lte_eNB_common_vars.txdataF[0], + eNB->common_vars.txdataF[0], AMP, subframe<<1,1); } @@ -584,18 +457,18 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int sched_s // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing mch_pduP = mac_xface->get_mch_sdu(eNB->Mod_id, eNB->CC_id, - eNB->proc[sched_subframe].frame_tx, + proc->frame_tx, subframe); switch (r_type) { case no_relay: if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n", - eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs, - eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); + eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->mcs, + eNB->dlsch_MCH->harq_processes[0]->TBS>>3); else { LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n", - eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->sync_area, + eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->sync_area, (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment"); mch_pduP = NULL; } @@ -626,7 +499,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int sched_s default: LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n", - eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,r_type); + eNB->Mod_id,proc->frame_tx,subframe,r_type); mch_pduP=NULL; break; }// switch @@ -634,19 +507,20 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int sched_s if (mch_pduP) { fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag); // Generate PMCH - generate_mch(eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag); + generate_mch(eNB,thread_id,(uint8_t*)mch_pduP->payload,abstraction_flag); } else { - LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",eNB->proc[sched_subframe].frame_tx,subframe); + LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",proc->frame_tx,subframe); } #endif } -void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB,int abstraction_flag) { +void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int abstraction_flag) { - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; - int **txdataF = eNB->lte_eNB_common_vars.txdataF[0]; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int **txdataF = eNB->common_vars.txdataF[0]; uint8_t *pbch_pdu=&eNB->pbch_pdu[0]; + eNB_proc_t *proc = &eNB->proc[thread_id]; // generate Cell-Specific Reference Signals for both slots if (abstraction_flag==0) { @@ -683,7 +557,7 @@ void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB } // generate PBCH (Physical Broadcast CHannel) info - if ((eNB->proc[sched_subframe].frame_tx&3) == 0) { + if ((proc->frame_tx&3) == 0) { pbch_pdu[2] = 0; // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators @@ -743,8 +617,8 @@ void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB break; } - pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((eNB->proc[sched_subframe].frame_tx>>8)&0x3); - pbch_pdu[1] = eNB->proc[sched_subframe].frame_tx&0xfc; + pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((proc->frame_tx>>8)&0x3); + pbch_pdu[1] = proc->frame_tx&0xfc; pbch_pdu[0] = 0; } @@ -761,12 +635,12 @@ void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB /// generate PBCH if (abstraction_flag==0) { - generate_pbch(&eNB->lte_eNB_pbch, + generate_pbch(&eNB->pbch, txdataF, AMP, fp, pbch_pdu, - eNB->proc[sched_subframe].frame_tx&3); + proc->frame_tx&3); } #ifdef PHY_ABSTRACTION else { @@ -791,12 +665,12 @@ void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB (abstraction_flag==0)) { generate_pss(txdataF, AMP, - &eNB->lte_frame_parms, + &eNB->frame_parms, (fp->Ncp==NORMAL) ? 6 : 5, 10); generate_sss(txdataF, AMP, - &eNB->lte_frame_parms, + &eNB->frame_parms, (fp->Ncp==NORMAL) ? 5 : 4, 10); @@ -826,9 +700,10 @@ void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB } -void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subframe,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { +void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc[thread_id]; // if we have SI_RNTI, configure dlsch parameters and CCE index if (dci_alloc->rnti == SI_RNTI) { @@ -838,25 +713,25 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subf &dci_alloc->dci_pdu[0], dci_alloc->rnti, dci_alloc->format, - &eNB->dlsch_eNB_SI, + &eNB->dlsch_SI, fp, eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - eNB->eNB_UE_stats[0].DL_pmi_single); + eNB->UE_stats[0].DL_pmi_single); - eNB->dlsch_eNB_SI->nCCE[subframe] = dci_alloc->firstCCE; + eNB->dlsch_SI->nCCE[subframe] = dci_alloc->firstCCE; - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, - eNB->dlsch_eNB_SI->nCCE[subframe]); + LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"\n",eNB->Mod_id,proc->frame_tx,subframe, + eNB->dlsch_SI->nCCE[subframe]); #if defined(SMBV) // configure SI DCI - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i); smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", dci_alloc, i); } @@ -871,24 +746,24 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subf &dci_alloc->dci_pdu[0], dci_alloc->rnti, dci_alloc->format, - &eNB->dlsch_eNB_ra, + &eNB->dlsch_ra, fp, eNB->pdsch_config_dedicated, SI_RNTI, dci_alloc->rnti, P_RNTI, - eNB->eNB_UE_stats[0].DL_pmi_single); + eNB->UE_stats[0].DL_pmi_single); - eNB->dlsch_eNB_ra->nCCE[subframe] = dci_alloc->firstCCE; + eNB->dlsch_ra->nCCE[subframe] = dci_alloc->firstCCE; - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, - eNB->dlsch_eNB_ra->nCCE[subframe]); + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"\n",eNB->Mod_id,proc->frame_tx,subframe, + eNB->dlsch_ra->nCCE[subframe]); #if defined(SMBV) // configure RA DCI - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i); smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", dci_alloc, i); } @@ -906,8 +781,8 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subf if (UE_id>=0) { #if defined(SMBV) // Configure this user - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",proc->frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, dci_alloc->rnti,eNB->transmission_mode[(uint8_t)UE_id]); smbv_configure_user(smbv_fname,UE_id+1,eNB->transmission_mode[(uint8_t)UE_id],dci_alloc->rnti); } @@ -920,27 +795,27 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subf &dci_alloc->dci_pdu[0], dci_alloc->rnti, dci_alloc->format, - eNB->dlsch_eNB[(uint8_t)UE_id], + eNB->dlsch[(uint8_t)UE_id], fp, eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - eNB->eNB_UE_stats[(uint8_t)UE_id].DL_pmi_single); + eNB->UE_stats[(uint8_t)UE_id].DL_pmi_single); LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n", - eNB->Mod_id,dci_alloc->rnti,eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,eNB->proc[sched_subframe].frame_tx,subframe); + eNB->Mod_id,dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->current_harq_pid,proc->frame_tx,subframe); - eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE; + eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE; - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, - dci_alloc->rnti,eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe]); + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,proc->frame_tx,subframe, + dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe]); #if defined(SMBV) // configure UE-spec DCI - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i); smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1,dci_alloc, i); } @@ -948,31 +823,32 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subf LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n", eNB->Mod_id, dci_alloc->rnti, - eNB->proc[sched_subframe].frame_tx, subframe,UE_id, + proc->frame_tx, subframe,UE_id, dci_alloc->format, 1<L); } else { LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n", - eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,dci_alloc->rnti); + eNB->Mod_id,proc->frame_tx,dci_alloc->rnti); } } } -void generate_eNB_ulsch_params(const int frame,const int subframe,int sched_subframe,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { +void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { int harq_pid; - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc[thread_id]; LOG_D(PHY, "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n", eNB->Mod_id, subframe2harq_pid(fp, - pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe), pdcch_alloc2ul_subframe(fp,subframe)), - eNB->proc[sched_subframe].frame_tx, + proc->frame_tx, subframe, - pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe), pdcch_alloc2ul_subframe(fp,subframe), dci_alloc->rnti, dci_alloc->dci_pdu[0], @@ -980,7 +856,7 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int sched_subf generate_eNB_ulsch_params_from_dci(&dci_alloc->dci_pdu[0], dci_alloc->rnti, - sched_subframe, + thread_id, format0, UE_id, eNB, @@ -991,14 +867,14 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int sched_subf 0); // do_srs LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d\n", - eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,dci_alloc->rnti, + eNB->Mod_id,proc->frame_tx,subframe,dci_alloc->rnti, dci_alloc->firstCCE); #if defined(SMBV) // configure UE-spec DCI for UL Grant - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i); + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",proc->frame_tx,subframe,i); smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); } @@ -1007,27 +883,28 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int sched_subf // get the hard_pid for this subframe harq_pid = subframe2harq_pid(fp, - pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe), + pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe), pdcch_alloc2ul_subframe(fp,subframe)); if (harq_pid==255) { // should not happen, log an error and exit, this is a fatal error - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx); + LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,proc->frame_tx); mac_xface->macphy_exit("FATAL\n"); } if ((dci_alloc->rnti >= CBA_RNTI) && (dci_alloc->rnti < P_RNTI)) - eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; + eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; else - eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; } -void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int subframe,int sched_subframe,int num_pdcch_symbols,int abstraction_flag) { +void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int subframe,int thread_id,int num_pdcch_symbols,int abstraction_flag) { + eNB_proc_t *proc = &eNB->proc[thread_id]; int harq_pid = dlsch->current_harq_pid; LTE_DL_eNB_HARQ_t *dlsch_harq=dlsch->harq_processes[harq_pid]; int input_buffer_length = dlsch_harq->TBS/8; - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint8_t *DLSCH_pdu=NULL; uint8_t DLSCH_pdu_tmp[768*8]; uint8_t DLSCH_pdu_rar[256]; @@ -1036,13 +913,13 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t LOG_D(PHY, "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", eNB->Mod_id, dlsch->rnti,harq_pid, - eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length, + proc->frame_tx, subframe, input_buffer_length, get_G(fp, dlsch_harq->nb_rb, dlsch_harq->rb_alloc, get_Qm(dlsch_harq->mcs), dlsch_harq->Nl, - num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + num_pdcch_symbols,proc->frame_tx,subframe), dlsch_harq->nb_rb, dlsch_harq->mcs, pmi2hex_2Ar1(dlsch_harq->pmi_alloc), @@ -1054,14 +931,14 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t MSC_PHY_ENB,MSC_PHY_UE, NULL,0, "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")", - eNB->proc[sched_subframe].frame_tx, subframe, + proc->frame_tx, subframe, input_buffer_length, get_G(fp, dlsch_harq->nb_rb, dlsch_harq->rb_alloc, get_Qm(dlsch_harq->mcs), dlsch_harq->Nl, - num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + num_pdcch_symbols,proc->frame_tx,subframe), dlsch_harq->nb_rb, dlsch_harq->mcs, pmi2hex_2Ar1(dlsch_harq->pmi_alloc), @@ -1080,14 +957,14 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t if (ra_flag == 0) { DLSCH_pdu = mac_xface->get_dlsch_sdu(eNB->Mod_id, eNB->CC_id, - eNB->proc[sched_subframe].frame_tx, + proc->frame_tx, dlsch->rnti, 0); } else { int16_t crnti = mac_xface->fill_rar(eNB->Mod_id, eNB->CC_id, - eNB->proc[sched_subframe].frame_tx, + proc->frame_tx, DLSCH_pdu_rar, fp->N_RB_UL, input_buffer_length); @@ -1104,32 +981,32 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t LOG_W(PHY,"[eNB] Max user count reached.\n"); mac_xface->cancel_ra_proc(eNB->Mod_id, eNB->CC_id, - eNB->proc[sched_subframe].frame_tx, + proc->frame_tx, crnti); } else { - eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE; + eNB->UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE; // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged) eNB->first_sr[(uint32_t)UE_id] = 1; generate_eNB_ulsch_params_from_rar(DLSCH_pdu, - eNB->proc[sched_subframe].frame_tx, + proc->frame_tx, (subframe), - eNB->ulsch_eNB[(uint32_t)UE_id], + eNB->ulsch[(uint32_t)UE_id], fp); - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1; + eNB->ulsch[(uint32_t)UE_id]->Msg3_active = 1; get_Msg3_alloc(fp, subframe, - eNB->proc[sched_subframe].frame_tx, - &eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - &eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + proc->frame_tx, + &eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, + &eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe); LOG_D(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %"PRId8" in frame %"PRIu32", subframe %"PRIu8"\n", - eNB->proc[sched_subframe].frame_tx, + proc->frame_tx, subframe, UE_id, - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, + eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe); } if (ue_stats) ue_stats->total_TBS_MAC += dlsch_harq->TBS; } @@ -1144,9 +1021,9 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t #if defined(SMBV) // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); - smbv_configure_datalist_for_user(smbv_fname, find_ue(dlsch->rnti,eNB)+1, DLSCH_pdu, input_buffer_length); + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + // smbv_configure_datalist_for_user(smbv_fname, find_ue(dlsch->rnti,eNB)+1, DLSCH_pdu, input_buffer_length); } #endif @@ -1180,7 +1057,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t fp, num_pdcch_symbols, dlsch, - eNB->proc[sched_subframe].frame_tx,subframe, + proc->frame_tx,subframe, &eNB->dlsch_rate_matching_stats, &eNB->dlsch_turbo_encoding_stats, &eNB->dlsch_interleaving_stats); @@ -1195,14 +1072,14 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t dlsch_harq->rb_alloc, get_Qm(dlsch_harq->mcs), dlsch_harq->Nl, - num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe), + num_pdcch_symbols,proc->frame_tx,subframe), 0, subframe<<1); stop_meas(&eNB->dlsch_scrambling_stats); start_meas(&eNB->dlsch_modulation_stats); - dlsch_modulation(eNB->lte_eNB_common_vars.txdataF[0], + dlsch_modulation(eNB->common_vars.txdataF[0], AMP, subframe, fp, @@ -1226,23 +1103,24 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t dlsch->active = 0; } -void phy_procedures_eNB_TX(unsigned char sched_subframe, +void phy_procedures_eNB_TX(unsigned char thread_id, PHY_VARS_eNB *eNB, uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *rn) { UNUSED(rn); - uint16_t input_buffer_length; + eNB_proc_t *proc = &eNB->proc[thread_id]; + // uint16_t input_buffer_length; uint32_t i,aa; uint8_t harq_pid; DCI_PDU *DCI_pdu; DCI_PDU DCI_pdu_tmp; - int8_t UE_id; + int8_t UE_id=0; uint8_t num_pdcch_symbols=0; uint8_t ul_subframe; uint32_t ul_frame; - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; DCI_ALLOC_t *dci_alloc=(DCI_ALLOC_t *)NULL; #if defined(SMBV) @@ -1250,8 +1128,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, // there is at least one allocation for PDCCH uint8_t smbv_alloc_cnt = 1; #endif - int frame = eNB->proc[sched_subframe].frame_tx; - int subframe = eNB->proc[sched_subframe].subframe_tx; + int frame = proc->frame_tx; + int subframe = proc->subframe_tx; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); start_meas(&eNB->phy_proc_tx); @@ -1259,14 +1137,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, for (i=0; ieNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) { + if (eNB->UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) { LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n", - eNB->Mod_id,eNB->CC_id,frame,subframe, i, eNB->eNB_UE_stats[i].ulsch_consecutive_errors); - eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + eNB->Mod_id,eNB->CC_id,frame,subframe, i, eNB->UE_stats[i].ulsch_consecutive_errors); + eNB->UE_stats[i].ulsch_consecutive_errors=0; mac_xface->UL_failure_indication(eNB->Mod_id, eNB->CC_id, frame, - eNB->eNB_UE_stats[i].crnti, + eNB->UE_stats[i].crnti, subframe); } @@ -1279,30 +1157,30 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, // This is called only for the CC_id = 0 and triggers scheduling for all CC_id's if (eNB->mac_enabled==1) { if (eNB->CC_id == 0) { - mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,eNB->proc[sched_subframe].frame_tx,subframe);//,1); + mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,proc->frame_tx,subframe);//,1); } } // clear the transmit data array for the current subframe if (abstraction_flag==0) { for (aa=0; aanb_antennas_tx_eNB; aa++) { - memset(&eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], + memset(&eNB->common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); } } - if (is_pmch_subframe(eNB->proc[sched_subframe].frame_tx,subframe,fp)) { - pmch_procedures(eNB,rn,subframe,sched_subframe,abstraction_flag,r_type); + if (is_pmch_subframe(proc->frame_tx,subframe,fp)) { + pmch_procedures(eNB,rn,subframe,thread_id,abstraction_flag,r_type); } else { // this is not a pmch subframe, so generate PSS/SSS/PBCH - common_signal_procedures(subframe,sched_subframe,eNB,abstraction_flag); + common_signal_procedures(subframe,thread_id,eNB,abstraction_flag); } #if defined(SMBV) // PBCH takes one allocation - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { if (subframe==0) smbv_alloc_cnt++; } @@ -1314,21 +1192,21 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); DCI_pdu = mac_xface->get_dci_sdu(eNB->Mod_id, eNB->CC_id, - eNB->proc[sched_subframe].frame_tx, + proc->frame_tx, subframe); } else { DCI_pdu = &DCI_pdu_tmp; #ifdef EMOS_CHANNEL - fill_dci_emos(DCI_pdu,sched_subframe,eNB); + fill_dci_emos(DCI_pdu,thread_id,eNB); #else - fill_dci(DCI_pdu,sched_subframe,eNB); + fill_dci(DCI_pdu,thread_id,eNB); #endif } // clear existing ulsch dci allocations before applying info from MAC (this is table ul_subframe = pdcch_alloc2ul_subframe(fp,subframe); - ul_frame = pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe); + ul_frame = pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe); if ((subframe_select(fp,ul_subframe)==SF_UL) || (fp->frame_type == FDD)) { @@ -1336,15 +1214,15 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, // clear DCI allocation maps for new subframe for (i=0; iulsch_eNB[i]) { - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0; - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0; + if (eNB->ulsch[i]) { + eNB->ulsch[i]->harq_processes[harq_pid]->dci_alloc=0; + eNB->ulsch[i]->harq_processes[harq_pid]->rar_alloc=0; } } // clear previous allocation information for all UEs for (i=0; idlsch_eNB[i][0]->subframe_tx[subframe] = 0; + eNB->dlsch[i][0]->subframe_tx[subframe] = 0; } @@ -1354,8 +1232,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, #if defined(SMBV) // Sets up PDCCH and DCI table - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { - LOG_D(PHY,"[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",proc->frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); dump_dci(fp,&DCI_pdu->dci_alloc[0]); smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (subframe),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); } @@ -1380,7 +1258,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, } else UE_id=0; - generate_eNB_dlsch_params(frame,subframe,sched_subframe,eNB,dci_alloc,UE_id); + generate_eNB_dlsch_params(frame,subframe,thread_id,eNB,dci_alloc,UE_id); } @@ -1399,10 +1277,10 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, UE_id = i; if (UE_id<0) { // should not happen, log an error and exit, this is a fatal error - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,dci_alloc->rnti); + LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,proc->frame_tx,dci_alloc->rnti); mac_xface->macphy_exit("FATAL\n"); } - generate_eNB_ulsch_params(frame,subframe,sched_subframe,eNB,dci_alloc,UE_id); + generate_eNB_ulsch_params(frame,subframe,thread_id,eNB,dci_alloc,UE_id); } } @@ -1422,7 +1300,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, if (abstraction_flag == 0) { if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx, subframe, + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,proc->frame_tx, subframe, DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci, @@ -1431,14 +1309,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, 0, AMP, fp, - eNB->lte_eNB_common_vars.txdataF[0], + eNB->common_vars.txdataF[0], subframe); } #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious else { - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx, subframe); + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,proc->frame_tx, subframe); num_pdcch_symbols = generate_dci_top_emul(eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe); } @@ -1448,15 +1326,15 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, // Check for SI activity - if (eNB->dlsch_eNB_SI->active == 1) { + if (eNB->dlsch_SI->active == 1) { - pdsch_procedures(eNB,eNB->dlsch_eNB_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,subframe,thread_id,num_pdcch_symbols,abstraction_flag); #if defined(SMBV) // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length); } @@ -1464,49 +1342,49 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, } // Check for RA activity - if (eNB->dlsch_eNB_ra->active == 1) { + if (eNB->dlsch_ra->active == 1) { #if defined(SMBV) // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length); } #endif - LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", + LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA),Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", eNB->Mod_id, - eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length, - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); + proc->frame_tx, subframe, + eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, + eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe); - pdsch_procedures(eNB,eNB->dlsch_eNB_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,subframe,thread_id,num_pdcch_symbols,abstraction_flag); - eNB->dlsch_eNB_ra->active = 0; + eNB->dlsch_ra->active = 0; } // Now scan UE specific DLSCH for (UE_id=0; UE_iddlsch_eNB[(uint8_t)UE_id][0])&& - (eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) { + if ((eNB->dlsch[(uint8_t)UE_id][0])&& + (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& + (eNB->dlsch[(uint8_t)UE_id][0]->active == 1)) { - pdsch_procedures(eNB,eNB->dlsch_eNB[(uint8_t)UE_id][0],eNB->dlsch_eNB[(uint8_t)UE_id][1],&eNB->eNB_UE_stats[(uint32_t)UE_id],0,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,subframe,thread_id,num_pdcch_symbols,abstraction_flag); } - else if ((eNB->dlsch_eNB[(uint8_t)UE_id][0])&& - (eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 0)) { + else if ((eNB->dlsch[(uint8_t)UE_id][0])&& + (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& + (eNB->dlsch[(uint8_t)UE_id][0]->active == 0)) { // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) - eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0; + eNB->dlsch[(uint8_t)UE_id][0]->subframe_tx[subframe]=0; } } @@ -1517,7 +1395,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, if (is_phich_subframe(fp,subframe)) { generate_phich_top(eNB, - sched_subframe, + thread_id, AMP, 0, abstraction_flag); @@ -1534,13 +1412,13 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, if (abstraction_flag==0) { start_meas(&eNB->ofdm_mod_stats); - do_OFDM_mod(eNB->lte_eNB_common_vars.txdataF[0], - eNB->lte_eNB_common_vars.txdata[0], - eNB->proc[sched_subframe].frame_tx,subframe<<1, + do_OFDM_mod(eNB->common_vars.txdataF[0], + eNB->common_vars.txdata[0], + proc->frame_tx,subframe<<1, fp); - do_OFDM_mod(eNB->lte_eNB_common_vars.txdataF[0], - eNB->lte_eNB_common_vars.txdata[0], - eNB->proc[sched_subframe].frame_tx,1+(subframe<<1), + do_OFDM_mod(eNB->common_vars.txdataF[0], + eNB->common_vars.txdata[0], + proc->frame_tx,1+(subframe<<1), fp); stop_meas(&eNB->ofdm_mod_stats); } @@ -1553,30 +1431,30 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe, } -void process_Msg3(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid) +void process_Msg3(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t UE_id, uint8_t harq_pid) { // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 - - int subframe = eNB->proc[sched_subframe].subframe_rx; - int frame = eNB->proc[sched_subframe].frame_rx; + eNB_proc_t *proc = &eNB->proc[thread_id]; + int subframe = proc->subframe_rx; + int frame = proc->frame_rx; LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n", eNB->Mod_id, frame,subframe, - UE_id,eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active, - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe, - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame); - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0; + UE_id,eNB->ulsch[(uint32_t)UE_id]->Msg3_active, + eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe, + eNB->ulsch[(uint32_t)UE_id]->Msg3_frame); + eNB->ulsch[(uint32_t)UE_id]->Msg3_flag = 0; - if ((eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && - (eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) && - (eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame)) { + if ((eNB->ulsch[(uint32_t)UE_id]->Msg3_active == 1) && + (eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe == subframe) && + (eNB->ulsch[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame)) { // harq_pid = 0; - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0; - eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1; - eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; + eNB->ulsch[(uint32_t)UE_id]->Msg3_active = 0; + eNB->ulsch[(uint32_t)UE_id]->Msg3_flag = 1; + eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n", eNB->Mod_id, frame,subframe,UE_id); @@ -1590,7 +1468,7 @@ void process_Msg3(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_ // rate-adaptation based on the error statistics derived from the ACK/NAK process void process_HARQ_feedback(uint8_t UE_id, - uint8_t sched_subframe, + uint8_t thread_id, PHY_VARS_eNB *eNB, uint8_t pusch_flag, uint8_t *pucch_payload, @@ -1598,16 +1476,17 @@ void process_HARQ_feedback(uint8_t UE_id, uint8_t SR_payload) { - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + eNB_proc_t *proc = &eNB->proc[thread_id]; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe; - LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_eNB[(uint32_t)UE_id][0]; - LTE_eNB_UE_stats *ue_stats = &eNB->eNB_UE_stats[(uint32_t)UE_id]; + LTE_eNB_DLSCH_t *dlsch = eNB->dlsch[(uint32_t)UE_id][0]; + LTE_eNB_UE_stats *ue_stats = &eNB->UE_stats[(uint32_t)UE_id]; LTE_DL_eNB_HARQ_t *dlsch_harq_proc; uint8_t subframe_m4,M,m; int mp; int all_ACKed=1,nb_alloc=0,nb_ACK=0; - int frame = eNB->proc[sched_subframe].frame_rx; - int subframe = eNB->proc[sched_subframe].subframe_rx; + int frame = proc->frame_rx; + int subframe = proc->subframe_rx; int harq_pid = subframe2harq_pid( fp,frame,subframe); @@ -1618,7 +1497,7 @@ void process_HARQ_feedback(uint8_t UE_id, M=1; if (pusch_flag == 1) { - dlsch_ACK[0] = eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; + dlsch_ACK[0] = eNB->ulsch[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; if (dlsch->subframe_tx[subframe_m4]==1) LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",eNB->Mod_id, frame,dlsch_ACK[0],subframe_m4); @@ -1660,9 +1539,9 @@ void process_HARQ_feedback(uint8_t UE_id, // otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this, // but we have to adapt the code below. For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used - dlsch_ACK[0] = eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; + dlsch_ACK[0] = eNB->ulsch[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; dlsch_ACK[1] = (eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling) - ?eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1]; + ?eNB->ulsch[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:eNB->ulsch[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1]; } else { // PUCCH ACK/NAK @@ -1814,10 +1693,10 @@ void process_HARQ_feedback(uint8_t UE_id, dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; ue_stats->total_TBS = ue_stats->total_TBS + - eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; + eNB->dlsch[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; /* ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits + - eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; + eNB->dlsch[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; */ } @@ -1862,24 +1741,25 @@ void process_HARQ_feedback(uint8_t UE_id, void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, uint8_t UE_id, - uint8_t sched_subframe, + uint8_t thread_id, int16_t *n1_pucch0, int16_t *n1_pucch1, int16_t *n1_pucch2, int16_t *n1_pucch3) { - LTE_DL_FRAME_PARMS *frame_parms=&eNB->lte_frame_parms; + eNB_proc_t *proc = &eNB->proc[thread_id]; + LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms; uint8_t nCCE0,nCCE1; int sf; - int frame = eNB->proc[sched_subframe].frame_rx; - int subframe = eNB->proc[sched_subframe].subframe_rx; + int frame = proc->frame_rx; + int subframe = proc->subframe_rx; if (frame_parms->frame_type == FDD ) { sf = (subframe<4) ? (subframe+6) : (subframe-4); - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) { - *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[sf]>0) { + *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + eNB->dlsch[(uint32_t)UE_id][0]->nCCE[sf]; *n1_pucch1 = -1; } else { *n1_pucch0 = -1; @@ -1890,15 +1770,15 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, switch (frame_parms->tdd_config) { case 1: // DL:S:UL:UL:DL:DL:S:UL:UL:DL if (subframe == 2) { // ACK subframes 5 and 6 - /* if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; + /* if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[6]>0) { + nCCE1 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[6]; *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch1 = -1;*/ - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[5]>0) { + nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[5]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -1906,8 +1786,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, *n1_pucch1 = -1; } else if (subframe == 3) { // ACK subframe 9 - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[9]>0) { + nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[9]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -1917,8 +1797,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, } else if (subframe == 7) { // ACK subframes 0 and 1 //harq_ack[0].nCCE; //harq_ack[1].nCCE; - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { - nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[0]>0) { + nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[0]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -1926,8 +1806,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, *n1_pucch1 = -1; } else if (subframe == 8) { // ACK subframes 4 //harq_ack[4].nCCE; - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) { - nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[4]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[4]>0) { + nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[4]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -1945,43 +1825,43 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, case 3: // DL:S:UL:UL:UL:DL:DL:DL:DL:DL if (subframe == 2) { // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe) - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[6]>0) { + nCCE1 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[6]; *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch1 = -1; - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[5]>0) { + nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[5]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; } else if (subframe == 3) { // ACK subframes 7 and 8 LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n", - eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7],eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]); + eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[7],eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[8]); - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) { - nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[8]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[8]>0) { + nCCE1 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[8]; *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1); } else *n1_pucch1 = -1; - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7]>0) { - nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[7]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[7]>0) { + nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[7]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0); } else *n1_pucch0 = -1; } else if (subframe == 4) { // ACK subframes 9 and 0 - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { - nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[0]>0) { + nCCE1 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[0]; *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch1 = -1; - if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; + if (eNB->dlsch[(uint32_t)UE_id][0]->subframe_tx[9]>0) { + nCCE0 = eNB->dlsch[(uint32_t)UE_id][0]->nCCE[9]; *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; } else *n1_pucch0 = -1; @@ -2000,16 +1880,17 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, } } -void prach_procedures(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t abstraction_flag) +void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_flag) { - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint16_t preamble_energy_list[64],preamble_delay_list[64]; uint16_t preamble_max,preamble_energy_max; uint16_t i; int8_t UE_id; - int subframe = eNB->proc[sched_subframe].subframe_rx; - int frame = eNB->proc[sched_subframe].frame_rx; + eNB_proc_t *proc = &eNB->proc[thread_id]; + int subframe = proc->subframe_rx; + int frame = proc->frame_rx; uint8_t CC_id = eNB->CC_id; memset(&preamble_energy_list[0],0,64*sizeof(uint16_t)); @@ -2017,7 +1898,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t abstracti if (abstraction_flag == 0) { LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",eNB->Mod_id, - frame,subframe,dB_fixed(signal_energy(&eNB->lte_eNB_common_vars.rxdata[0][0][subframe*fp->samples_per_tti],512)) - eNB->rx_total_gain_eNB_dB); + frame,subframe,dB_fixed(signal_energy(&eNB->common_vars.rxdata[0][0][subframe*fp->samples_per_tti],512)) - eNB->rx_total_gain_dB); rx_prach(eNB, @@ -2031,12 +1912,12 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t abstracti LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n", UE_id,PHY_vars_UE_g[UE_id][CC_id],PHY_vars_UE_g[UE_id][CC_id]->generate_prach, - PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex, + PHY_vars_UE_g[UE_id][CC_id]->frame_parms.prach_config_common.rootSequenceIndex, fp->prach_config_common.rootSequenceIndex, PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex); if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach==1) && - (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex == + (PHY_vars_UE_g[UE_id][CC_id]->frame_parms.prach_config_common.rootSequenceIndex == fp->prach_config_common.rootSequenceIndex) ) { preamble_energy_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 800; preamble_delay_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 5; @@ -2067,9 +1948,9 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t abstracti UE_id = find_next_ue_index(eNB); if (UE_id>=0) { - eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits + eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits - eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0; + eNB->UE_stats[(uint32_t)UE_id].sector = 0; LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, @@ -2128,9 +2009,9 @@ void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_ } -void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3; uint8_t do_SR = 0; @@ -2138,30 +2019,30 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int U int32_t metric0=0,metric1=0,metric0_SR=0; ANFBmode_t bundling_flag; PUCCH_FMT_t format; + eNB_proc_t *proc = &eNB->proc[thread_id]; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; - const int subframe = eNB->proc[sched_subframe].subframe_rx; - const int frame = eNB->proc[sched_subframe].frame_rx; - - if ((eNB->dlsch_eNB[UE_id][0]) && - (eNB->dlsch_eNB[UE_id][0]->rnti>0) && - (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { + if ((eNB->dlsch[UE_id][0]) && + (eNB->dlsch[UE_id][0]->rnti>0) && + (eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { // check SR availability - do_SR = is_SR_subframe(eNB,UE_id,sched_subframe); + do_SR = is_SR_subframe(eNB,UE_id,thread_id); // do_SR = 0; // Now ACK/NAK // First check subframe_tx flag for earlier subframes get_n1_pucch_eNB(eNB, UE_id, - sched_subframe, + thread_id, &n1_pucch0, &n1_pucch1, &n1_pucch2, &n1_pucch3); LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", - eNB->Mod_id,eNB->dlsch_eNB[UE_id][0]->rnti, + eNB->Mod_id,eNB->dlsch[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); @@ -2198,7 +2079,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int U } if (do_SR == 1) { - eNB->eNB_UE_stats[UE_id].sr_total++; + eNB->UE_stats[UE_id].sr_total++; if (abstraction_flag == 0) metric0_SR = rx_pucch(eNB, @@ -2218,35 +2099,35 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int U pucch_format1, 0, &SR_payload, - sched_subframe); + thread_id); LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id, - eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); + eNB->ulsch[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); } #endif if (SR_payload == 1) { LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id, - eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); - eNB->eNB_UE_stats[UE_id].sr_received++; + eNB->ulsch[UE_id]->rnti,frame,subframe); + eNB->UE_stats[UE_id].sr_received++; if (eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 /* is this test necessary? */ - if (eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE) - put_harq_pid_in_freelist(eNB->dlsch_eNB[UE_id][0], 0); + if (eNB->dlsch[UE_id][0]->harq_processes[0]->status != SCH_IDLE) + put_harq_pid_in_freelist(eNB->dlsch[UE_id][0], 0); eNB->first_sr[UE_id] = 0; - eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0; - eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE; + eNB->dlsch[UE_id][0]->harq_processes[0]->round=0; + eNB->dlsch[UE_id][0]->harq_processes[0]->status=SCH_IDLE; LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", eNB->Mod_id, - eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); + eNB->ulsch[UE_id]->rnti,frame,subframe); } if (eNB->mac_enabled==1) { mac_xface->SR_indication(eNB->Mod_id, eNB->CC_id, frame, - eNB->dlsch_eNB[UE_id][0]->rnti,subframe); + eNB->dlsch[UE_id][0]->rnti,subframe); } } }// do_SR==1 @@ -2296,12 +2177,12 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int U #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", eNB->Mod_id, - eNB->dlsch_eNB[UE_id][0]->rnti, + eNB->dlsch[UE_id][0]->rnti, frame,subframe, pucch_payload0[0],metric0); #endif - process_HARQ_feedback(UE_id,sched_subframe,eNB, + process_HARQ_feedback(UE_id,thread_id,eNB, 0,// pusch_flag pucch_payload0, 2, @@ -2326,7 +2207,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int U if (SR_payload==1) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",eNB->Mod_id, - eNB->dlsch_eNB[UE_id][0]->rnti, + eNB->dlsch[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif @@ -2353,7 +2234,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int U } else { //using n1_pucch0/n1_pucch1 resources #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",eNB->Mod_id, - eNB->dlsch_eNB[UE_id][0]->rnti, + eNB->dlsch[UE_id][0]->rnti, frame,subframe, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif @@ -2428,11 +2309,11 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int U #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",eNB->Mod_id, - eNB->dlsch_eNB[UE_id][0]->rnti, + eNB->dlsch[UE_id][0]->rnti, frame,subframe, metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); #endif - process_HARQ_feedback(UE_id,sched_subframe,eNB, + process_HARQ_feedback(UE_id,thread_id,eNB, 0,// pusch_flag pucch_payload, pucch_sel, @@ -2443,37 +2324,38 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int U } } -void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { + eNB_proc_t *proc = &eNB->proc[thread_id]; uint8_t access_mode; int num_active_cba_groups; - const int subframe = eNB->proc[sched_subframe].subframe_rx; - const int frame = eNB->proc[sched_subframe].frame_rx; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; uint16_t rnti=0; int ret=0; - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - num_active_cba_groups = eNB->ulsch_eNB[UE_id]->num_active_cba_groups; + num_active_cba_groups = eNB->ulsch[UE_id]->num_active_cba_groups; - if ((eNB->ulsch_eNB[UE_id]) && + if ((eNB->ulsch[UE_id]) && (num_active_cba_groups > 0) && - (eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && - (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { + (eNB->ulsch[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && + (eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { rnti=0; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n", eNB->Mod_id,harq_pid, frame,subframe, - UE_id, (uint16_t)eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[eNB->eNB_UE_stats[UE_id].mode]); + UE_id, (uint16_t)eNB->ulsch[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[eNB->UE_stats[UE_id].mode]); #endif if (abstraction_flag==0) { rx_ulsch(eNB, - sched_subframe, - eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id + thread_id, + eNB->UE_stats[UE_id].sector, // this is the effective sector id UE_id, - eNB->ulsch_eNB, + eNB->ulsch, 0); } @@ -2481,7 +2363,7 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_ else { rx_ulsch_emul(eNB, subframe, - eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id + eNB->UE_stats[UE_id].sector, // this is the effective sector id UE_id); } @@ -2490,76 +2372,76 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_ if (abstraction_flag == 0) { ret = ulsch_decoding(eNB, UE_id, - sched_subframe, + thread_id, 0, // control_only_flag - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI, - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); + eNB->ulsch[UE_id]->harq_processes[harq_pid]->V_UL_DAI, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); } #ifdef PHY_ABSTRACTION else { ret = ulsch_decoding_emul(eNB, - sched_subframe, + thread_id, UE_id, &rnti); } #endif - if (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) { + if (eNB->ulsch[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - print_CQI(eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); + print_CQI(eNB->ulsch[UE_id]->harq_processes[harq_pid]->o,eNB->ulsch[UE_id]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); #endif access_mode = UNKNOWN_ACCESS; - extract_CQI(eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o, - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format, - &eNB->eNB_UE_stats[UE_id], + extract_CQI(eNB->ulsch[UE_id]->harq_processes[harq_pid]->o, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->uci_format, + &eNB->UE_stats[UE_id], fp->N_RB_DL, &rnti, &access_mode); - eNB->eNB_UE_stats[UE_id].rank = eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0]; + eNB->UE_stats[UE_id].rank = eNB->ulsch[UE_id]->harq_processes[harq_pid]->o_RI[0]; } - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE; + eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; + eNB->ulsch[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE; if ((num_active_cba_groups > 0) && (UE_id + num_active_cba_groups < NUMBER_OF_UE_MAX) && - (eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) && - (eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) { + (eNB->ulsch[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) && + (eNB->ulsch[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n", eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid, - UE_id+num_active_cba_groups, UE_id%eNB->ulsch_eNB[UE_id]->num_active_cba_groups); + UE_id+num_active_cba_groups, UE_id%eNB->ulsch[UE_id]->num_active_cba_groups); #endif - eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; - eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; - eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS; + eNB->ulsch[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; + eNB->ulsch[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; + eNB->ulsch[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS; } if (ret == (1+MAX_TURBO_ITERATIONS)) { - eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++; - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0; - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; + eNB->UE_stats[UE_id].ulsch_round_errors[harq_pid][eNB->ulsch[UE_id]->harq_processes[harq_pid]->round]++; + eNB->ulsch[UE_id]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK = 0; + eNB->ulsch[UE_id]->harq_processes[harq_pid]->round++; } // ulsch in error else { LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", eNB->Mod_id,harq_pid, frame,subframe); - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1; - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0; - eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0; + eNB->ulsch[UE_id]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK = 1; + eNB->ulsch[UE_id]->harq_processes[harq_pid]->round = 0; + eNB->UE_stats[UE_id].ulsch_consecutive_errors = 0; #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:", frame,subframe, - harq_pid,eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3); + harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS>>3); - for (j=0; julsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]); + for (j=0; julsch[UE_id]->harq_processes[harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",eNB->ulsch[UE_id]->harq_processes[harq_pid]->b[j]); LOG_T(PHY,"\n"); #endif @@ -2568,17 +2450,17 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_ if (access_mode > UNKNOWN_ACCESS) { LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", eNB->Mod_id, frame,subframe, - UE_id, eNB->ulsch_eNB[UE_id]->rnti, - UE_id % eNB->ulsch_eNB[UE_id]->num_active_cba_groups, eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); + UE_id, eNB->ulsch[UE_id]->rnti, + UE_id % eNB->ulsch[UE_id]->num_active_cba_groups, eNB->ulsch[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); // detect if there is a CBA collision if (eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) { mac_xface->rx_sdu(eNB->Mod_id, eNB->CC_id, frame,subframe, - eNB->ulsch_eNB[UE_id]->rnti, - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b, - eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3, + eNB->ulsch[UE_id]->rnti, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->b, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS>>3, harq_pid, NULL); @@ -2597,7 +2479,7 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_ mac_xface->SR_indication(eNB->Mod_id, eNB->CC_id, frame, - eNB->dlsch_eNB[UE_id][0]->rnti,subframe); + eNB->dlsch[UE_id][0]->rnti,subframe); } } // UNKNOWN_ACCESS } // ULSCH CBA not in error @@ -2605,22 +2487,173 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_ } -void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) + + +void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) { + + eNB_proc_t *proc = &eNB->proc[thread_id]; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; + int i,l; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + void *rxp[fp->nb_antennas_rx]; + unsigned int rxs; + + AssertFatal(thread_id < NUM_ENB_THREADS, "Bad thread_id %d", thread_id); + + // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_COMMON_RX,1); + start_meas(&eNB->phy_proc_rx); +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); +#endif + + if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) + + for (i=0; inb_antennas_rx; i++) + if ((eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF and front-end processing + rxp[i] = (void*)&eNB->common_vars.rxdata[i][subframe*fp->samples_per_tti]; + rxs = openair0.trx_read_func(&openair0, + &proc->timestamp_rx, + rxp, + fp->samples_per_tti>>1, + fp->nb_antennas_rx); + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + if (frame > 20){ + if (rxs != fp->samples_per_tti>>1) + exit_fun( "problem receiving samples" ); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + + remove_7_5_kHz(eNB,subframe<<1); + for (l=0; lsymbols_per_tti/2; l++) + slot_fep_ul(fp, + &eNB->common_vars, + l, + subframe<<1, + 0, + 0 + ); + + if (eNB->node_function == NGFI_RRU_IF4) { + //send_IF4(eNB,subframe<<1); + } + + remove_7_5_kHz(eNB,(subframe<<1)+1); + for (l=0; lsymbols_per_tti/2; l++) + slot_fep_ul(fp, + &eNB->common_vars, + l, + (subframe<<1)+1, + 0, + 0 + ); + if (eNB->node_function == NGFI_RRU_IF4) { + //send_IF4(eNB,(subframe<<1)+1); + } + + } + else if (eNB->node_function == NGFI_RCC_IF4) { // => acquisition from RRU (IF4) + // get frame/subframe information from IF4 interface + + //recv_IF4(eNB,subframe<<1); + //recv_IF4(eNB,1+(subframe<<1)); + + } + else { // should not get here + AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); + } + + + // check if we have to detect PRACH first + if (is_prach_subframe(fp,frame,subframe)>0) { + // wake up thread for PRACH RX + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", thread_id, proc->instance_cnt_prach ); + exit_fun( "error locking mutex_prach" ); + return; + } + + int cnt_prach = ++proc->instance_cnt_prach; + + pthread_mutex_unlock( &proc->mutex_prach ); + + if (cnt_prach == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", proc->frame_tx); + exit_fun( "PRACH thread busy" ); + return; + } + + + } + + // wake up TX thread + // lock the TX mutex and make sure the thread is ready + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", thread_id, proc->instance_cnt_tx ); + exit_fun( "error locking mutex_tx" ); + return; + } + + int cnt_tx = ++proc->instance_cnt_tx; + // We have just received and processed the common part of an entire subframe, say n. + // TX_rx is the last received timestamp (start of 2nd slot), TX_tx is the desired + // transmitted timestamp of the next TX slot (first). + // The last (TS_rx mod samples_per_frame) was (n+.5)*samples_per_tti, + // we want to generate subframe (n+3), so TS_tx = TX_rx+2.5*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+3 + proc->timestamp_tx = proc->timestamp_rx + (fp->samples_per_tti<<1) + (fp->samples_per_tti>>1); + proc->frame_tx = (proc->subframe_rx > 6) ? (proc->frame_rx+1) : proc->frame_rx; + proc->subframe_rx = (proc->subframe_rx + 3)%10; + + pthread_mutex_unlock( &proc->mutex_tx ); + + if (cnt_tx == 0){ + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc->cond_tx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n", thread_id); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, eNB TX thread %d busy!! (cnt_tx %i)\n", proc->frame_tx, thread_id, cnt_tx ); + exit_fun( "TX thread busy" ); + return; + } + + } + + else { // grab transport channel information from network interface + + } +} + +void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) { - //RX processing + //RX processing for ue-specific resources (i UNUSED(r_type); + eNB_proc_t *proc = &eNB->proc[thread_id]; uint32_t l, ret=0,i,j,k; uint32_t harq_pid, harq_idx, round; uint8_t nPRS; int sync_pos; uint16_t rnti=0; uint8_t access_mode; - LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - const int subframe = eNB->proc[sched_subframe].subframe_rx; - const int frame = eNB->proc[sched_subframe].frame_rx; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; - AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe); + AssertFatal(thread_id < NUM_ENB_THREADS, "Bad thread_id %d", thread_id); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); start_meas(&eNB->phy_proc_rx); @@ -2634,17 +2667,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, eNB->rb_mask_ul[2]=0; eNB->rb_mask_ul[3]=0; - if (abstraction_flag == 0) { - remove_7_5_kHz(eNB,subframe<<1); - remove_7_5_kHz(eNB,(subframe<<1)+1); - } - // check if we have to detect PRACH first - if (is_prach_subframe(fp,frame,subframe)>0) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(eNB,sched_subframe,abstraction_flag); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); - } if (abstraction_flag == 0) { start_meas(&eNB->ofdm_demod_stats); @@ -2652,14 +2675,14 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, for (l=0; lsymbols_per_tti/2; l++) { slot_fep_ul(fp, - &eNB->lte_eNB_common_vars, + &eNB->common_vars, l, subframe<<1, 0, 0 ); slot_fep_ul(fp, - &eNB->lte_eNB_common_vars, + &eNB->common_vars, l, (subframe<<1)+1, 0, @@ -2682,15 +2705,15 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, // Do PUCCH processing first for (i=0; imac_enabled==1) { - if (eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { - process_Msg3(eNB,sched_subframe,i,harq_pid); + if (eNB->UE_stats[i].mode == RA_RESPONSE) { + process_Msg3(eNB,thread_id,i,harq_pid); } } @@ -2699,30 +2722,30 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, eNB->pusch_stats_round[i][(frame*10)+subframe] = 0; eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63; - if ((eNB->ulsch_eNB[i]) && - (eNB->ulsch_eNB[i]->rnti>0) && - (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { + if ((eNB->ulsch[i]) && + (eNB->ulsch[i]->rnti>0) && + (eNB->ulsch[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { // UE is has ULSCH scheduling - round = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; + round = eNB->ulsch[i]->harq_processes[harq_pid]->round; for (int rb=0; - rb<=eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; + rb<=eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb; rb++) { - int rb2 = rb+eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb; + int rb2 = rb+eNB->ulsch[i]->harq_processes[harq_pid]->first_rb; eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n", eNB->Mod_id,harq_pid, - frame,subframe,eNB->ulsch_eNB[i]->rnti,i); + frame,subframe,eNB->ulsch[i]->rnti,i); #endif - if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", eNB->Mod_id, frame, subframe, - eNB->eNB_UE_stats[i].sector); + eNB->UE_stats[i].sector); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,1); } else { LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n", @@ -2730,52 +2753,52 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, frame, subframe, i, - mode_string[eNB->eNB_UE_stats[i].mode]); + mode_string[eNB->UE_stats[i].mode]); } nPRS = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]; - eNB->ulsch_eNB[i]->cyclicShift = (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + + eNB->ulsch[i]->cyclicShift = (eNB->ulsch[i]->harq_processes[harq_pid]->n_DMRS2 + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + nPRS)%12; if (fp->frame_type == FDD ) { int sf = (subframe<4) ? (subframe+6) : (subframe-4); - if (eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1; + if (eNB->dlsch[i][0]->subframe_tx[sf]>0) { // we have downlink transmission + eNB->ulsch[i]->harq_processes[harq_pid]->O_ACK = 1; } else { - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; + eNB->ulsch[i]->harq_processes[harq_pid]->O_ACK = 0; } } LOG_D(PHY, "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n", eNB->Mod_id,harq_pid,frame,subframe, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, - eNB->ulsch_eNB[i]->cyclicShift, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, + eNB->ulsch[i]->harq_processes[harq_pid]->dci_alloc, + eNB->ulsch[i]->harq_processes[harq_pid]->rar_alloc, + eNB->ulsch[i]->harq_processes[harq_pid]->round, + eNB->ulsch[i]->harq_processes[harq_pid]->first_rb, + eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb, + eNB->ulsch[i]->harq_processes[harq_pid]->mcs, + eNB->ulsch[i]->harq_processes[harq_pid]->TBS, + eNB->ulsch[i]->harq_processes[harq_pid]->rvidx, + eNB->ulsch[i]->cyclicShift, + eNB->ulsch[i]->harq_processes[harq_pid]->n_DMRS2, fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, nPRS, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); - eNB->pusch_stats_rb[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; - eNB->pusch_stats_round[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; - eNB->pusch_stats_mcs[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs; + eNB->ulsch[i]->harq_processes[harq_pid]->O_ACK); + eNB->pusch_stats_rb[i][(frame*10)+subframe] = eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb; + eNB->pusch_stats_round[i][(frame*10)+subframe] = eNB->ulsch[i]->harq_processes[harq_pid]->round; + eNB->pusch_stats_mcs[i][(frame*10)+subframe] = eNB->ulsch[i]->harq_processes[harq_pid]->mcs; start_meas(&eNB->ulsch_demodulation_stats); if (abstraction_flag==0) { rx_ulsch(eNB, - sched_subframe, - eNB->eNB_UE_stats[i].sector, // this is the effective sector id + thread_id, + eNB->UE_stats[i].sector, // this is the effective sector id i, - eNB->ulsch_eNB, + eNB->ulsch, 0); } @@ -2783,7 +2806,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, else { rx_ulsch_emul(eNB, subframe, - eNB->eNB_UE_stats[i].sector, // this is the effective sector id + eNB->UE_stats[i].sector, // this is the effective sector id i); } @@ -2796,16 +2819,16 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, if (abstraction_flag == 0) { ret = ulsch_decoding(eNB, i, - sched_subframe, + thread_id, 0, // control_only_flag - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); + eNB->ulsch[i]->harq_processes[harq_pid]->V_UL_DAI, + eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); } #ifdef PHY_ABSTRACTION else { ret = ulsch_decoding_emul(eNB, - sched_subframe, + thread_id, i, &rnti); } @@ -2816,104 +2839,104 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", eNB->Mod_id,harq_pid, frame,subframe, - eNB->ulsch_eNB[i]->rnti, - dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - eNB->eNB_UE_stats[i].UL_rssi[0], - eNB->eNB_UE_stats[i].UL_rssi[1], - eNB->PHY_measurements_eNB->n0_power_dB[0], - eNB->PHY_measurements_eNB->n0_power_dB[1], - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch[i]->rnti, + dB_fixed(eNB->pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->pusch_vars[i]->ulsch_power[1]), + eNB->UE_stats[i].UL_rssi[0], + eNB->UE_stats[i].UL_rssi[1], + eNB->measurements->n0_power_dB[0], + eNB->measurements->n0_power_dB[1], + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[1], ret); //compute the expected ULSCH RX power (for the stats) - eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = + eNB->ulsch[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0); // 0 means bw_factor is not considered - //dump_ulsch(eNB, sched_subframe, i); + //dump_ulsch(eNB, thread_id, i); - eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + eNB->UE_stats[i].ulsch_decoding_attempts[harq_pid][eNB->ulsch[i]->harq_processes[harq_pid]->round]++; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid); #endif - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; + eNB->ulsch[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; - if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { + if (eNB->ulsch[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - //if (((eNB->proc[sched_subframe].frame_tx%10) == 0) || (eNB->proc[sched_subframe].frame_tx < 50)) - print_CQI(eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); + //if (((proc->frame_tx%10) == 0) || (proc->frame_tx < 50)) + print_CQI(eNB->ulsch[i]->harq_processes[harq_pid]->o,eNB->ulsch[i]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); #endif - extract_CQI(eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, - &eNB->eNB_UE_stats[i], + extract_CQI(eNB->ulsch[i]->harq_processes[harq_pid]->o, + eNB->ulsch[i]->harq_processes[harq_pid]->uci_format, + &eNB->UE_stats[i], fp->N_RB_DL, &rnti, &access_mode); - eNB->eNB_UE_stats[i].rank = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; + eNB->UE_stats[i].rank = eNB->ulsch[i]->harq_processes[harq_pid]->o_RI[0]; } - if (eNB->ulsch_eNB[i]->Msg3_flag == 1) + if (eNB->ulsch[i]->Msg3_flag == 1) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,0); if (ret == (1+MAX_TURBO_ITERATIONS)) { - eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; + eNB->UE_stats[i].ulsch_round_errors[harq_pid][eNB->ulsch[i]->harq_processes[harq_pid]->round]++; + eNB->ulsch[i]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch[i]->harq_processes[harq_pid]->phich_ACK = 0; + eNB->ulsch[i]->harq_processes[harq_pid]->round++; - LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); + LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,eNB->ulsch[i]->harq_processes[harq_pid]->round); - if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", eNB->Mod_id, eNB->CC_id, frame,subframe, i, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + eNB->ulsch[i]->harq_processes[harq_pid]->round-1, fp->maxHARQ_Msg3Tx-1); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", eNB->Mod_id,harq_pid, frame,subframe, - eNB->ulsch_eNB[i]->rnti, - dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - eNB->eNB_UE_stats[i].UL_rssi[0], - eNB->eNB_UE_stats[i].UL_rssi[1], - eNB->PHY_measurements_eNB->n0_power_dB[0], - eNB->PHY_measurements_eNB->n0_power_dB[1], - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch[i]->rnti, + dB_fixed(eNB->pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->pusch_vars[i]->ulsch_power[1]), + eNB->UE_stats[i].UL_rssi[0], + eNB->UE_stats[i].UL_rssi[1], + eNB->measurements->n0_power_dB[0], + eNB->measurements->n0_power_dB[1], + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[1], ret); - if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == + if (eNB->ulsch[i]->harq_processes[harq_pid]->round == fp->maxHARQ_Msg3Tx) { LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n", eNB->Mod_id, i); - eNB->eNB_UE_stats[i].mode = PRACH; + eNB->UE_stats[i].mode = PRACH; if (eNB->mac_enabled==1) { mac_xface->cancel_ra_proc(eNB->Mod_id, eNB->CC_id, frame, - eNB->eNB_UE_stats[i].crnti); + eNB->UE_stats[i].crnti); } - mac_phy_remove_ue(eNB->Mod_id,eNB->eNB_UE_stats[i].crnti); + mac_phy_remove_ue(eNB->Mod_id,eNB->UE_stats[i].crnti); - eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; - //eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; + eNB->ulsch[(uint32_t)i]->Msg3_active = 0; + //eNB->ulsch[i]->harq_processes[harq_pid]->phich_active = 0; } else { // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI) - eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1; + eNB->ulsch[(uint32_t)i]->Msg3_active = 1; get_Msg3_alloc_ret(fp, subframe, frame, - &eNB->ulsch_eNB[i]->Msg3_frame, - &eNB->ulsch_eNB[i]->Msg3_subframe); + &eNB->ulsch[i]->Msg3_frame, + &eNB->ulsch[i]->Msg3_subframe); } LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i); } // This is Msg3 error @@ -2922,10 +2945,10 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", eNB->Mod_id,harq_pid, frame,subframe, i, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - eNB->ulsch_eNB[i]->Mlimit, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]); + eNB->ulsch[i]->harq_processes[harq_pid]->round-1, + eNB->ulsch[i]->Mlimit, + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[1]); #if defined(MESSAGE_CHART_GENERATOR_PHY) MSC_LOG_RX_DISCARDED_MESSAGE( @@ -2933,51 +2956,51 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, NULL,0, "%05u:%02u ULSCH received rnti %x harq id %u round %d", frame,subframe, - eNB->ulsch_eNB[i]->rnti,harq_pid, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1 + eNB->ulsch[i]->rnti,harq_pid, + eNB->ulsch[i]->harq_processes[harq_pid]->round-1 ); #endif - if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== eNB->ulsch_eNB[i]->Mlimit) { + if (eNB->ulsch[i]->harq_processes[harq_pid]->round== eNB->ulsch[i]->Mlimit) { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n", eNB->Mod_id,harq_pid, frame,subframe, i, - eNB->ulsch_eNB[i]->Mlimit); + eNB->ulsch[i]->Mlimit); - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; - eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; - eNB->eNB_UE_stats[i].ulsch_consecutive_errors++; + eNB->ulsch[i]->harq_processes[harq_pid]->round=0; + eNB->ulsch[i]->harq_processes[harq_pid]->phich_active=0; + eNB->UE_stats[i].ulsch_errors[harq_pid]++; + eNB->UE_stats[i].ulsch_consecutive_errors++; // indicate error to MAC mac_xface->rx_sdu(eNB->Mod_id, eNB->CC_id, frame,subframe, - eNB->ulsch_eNB[i]->rnti, + eNB->ulsch[i]->rnti, NULL, 0, harq_pid, - &eNB->ulsch_eNB[i]->Msg3_flag); + &eNB->ulsch[i]->Msg3_flag); } } } // ulsch in error else { - if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", eNB->Mod_id,harq_pid, frame,subframe); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", eNB->Mod_id,harq_pid, frame,subframe, - eNB->ulsch_eNB[i]->rnti, - dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - eNB->eNB_UE_stats[i].UL_rssi[0], - eNB->eNB_UE_stats[i].UL_rssi[1], - eNB->PHY_measurements_eNB->n0_power_dB[0], - eNB->PHY_measurements_eNB->n0_power_dB[1], - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->ulsch[i]->rnti, + dB_fixed(eNB->pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->pusch_vars[i]->ulsch_power[1]), + eNB->UE_stats[i].UL_rssi[0], + eNB->UE_stats[i].UL_rssi[1], + eNB->measurements->n0_power_dB[0], + eNB->measurements->n0_power_dB[1], + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[1], ret); } #if defined(MESSAGE_CHART_GENERATOR_PHY) @@ -2986,26 +3009,26 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, NULL,0, "%05u:%02u ULSCH received rnti %x harq id %u", frame,subframe, - eNB->ulsch_eNB[i]->rnti,harq_pid + eNB->ulsch[i]->rnti,harq_pid ); #endif for (j=0; jnb_antennas_rx; j++) //this is the RSSI per RB - eNB->eNB_UE_stats[i].UL_rssi[j] = + eNB->UE_stats[i].UL_rssi[j] = - dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]* - (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/ + dB_fixed(eNB->pusch_vars[i]->ulsch_power[j]* + (eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb*12)/ fp->ofdm_symbol_size) - - eNB->rx_total_gain_eNB_dB - - hundred_times_log10_NPRB[eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - + eNB->rx_total_gain_dB - + hundred_times_log10_NPRB[eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb-1]/100 - get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0)/100; - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; - eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; + eNB->ulsch[i]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch[i]->harq_processes[harq_pid]->phich_ACK = 1; + eNB->ulsch[i]->harq_processes[harq_pid]->round = 0; + eNB->UE_stats[i].ulsch_consecutive_errors = 0; - if (eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (eNB->ulsch[i]->Msg3_flag == 1) { if (eNB->mac_enabled==1) { LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", @@ -3015,62 +3038,62 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, mac_xface->rx_sdu(eNB->Mod_id, eNB->CC_id, frame,subframe, - eNB->ulsch_eNB[i]->rnti, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, + eNB->ulsch[i]->rnti, + eNB->ulsch[i]->harq_processes[harq_pid]->b, + eNB->ulsch[i]->harq_processes[harq_pid]->TBS>>3, harq_pid, - &eNB->ulsch_eNB[i]->Msg3_flag); + &eNB->ulsch[i]->Msg3_flag); // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI) - if (eNB->ulsch_eNB[i]->Msg3_flag == 0 ) { - eNB->eNB_UE_stats[i].mode = PRACH; + if (eNB->ulsch[i]->Msg3_flag == 0 ) { + eNB->UE_stats[i].mode = PRACH; mac_xface->cancel_ra_proc(eNB->Mod_id, eNB->CC_id, frame, - eNB->eNB_UE_stats[i].crnti); - mac_phy_remove_ue(eNB->Mod_id,eNB->eNB_UE_stats[i].crnti); - eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; + eNB->UE_stats[i].crnti); + mac_phy_remove_ue(eNB->Mod_id,eNB->UE_stats[i].crnti); + eNB->ulsch[(uint32_t)i]->Msg3_active = 0; } // Msg3_flag == 0 } // mac_enabled==1 - eNB->eNB_UE_stats[i].mode = PUSCH; - eNB->ulsch_eNB[i]->Msg3_flag = 0; + eNB->UE_stats[i].mode = PUSCH; + eNB->ulsch[i]->Msg3_flag = 0; LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",eNB->Mod_id,frame,subframe,i); for (k=0; k<8; k++) { //harq_processes - for (j=0; jdlsch_eNB[i][0]->Mlimit; j++) { - eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; - eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; - eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; + for (j=0; jdlsch[i][0]->Mlimit; j++) { + eNB->UE_stats[i].dlsch_NAK[k][j]=0; + eNB->UE_stats[i].dlsch_ACK[k][j]=0; + eNB->UE_stats[i].dlsch_trials[k][j]=0; } - eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; - eNB->eNB_UE_stats[i].ulsch_errors[k]=0; - eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + eNB->UE_stats[i].dlsch_l2_errors[k]=0; + eNB->UE_stats[i].ulsch_errors[k]=0; + eNB->UE_stats[i].ulsch_consecutive_errors=0; - for (j=0; julsch_eNB[i]->Mlimit; j++) { - eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; - eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; - eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; - eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; + for (j=0; julsch[i]->Mlimit; j++) { + eNB->UE_stats[i].ulsch_decoding_attempts[k][j]=0; + eNB->UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; + eNB->UE_stats[i].ulsch_round_errors[k][j]=0; + eNB->UE_stats[i].ulsch_round_fer[k][j]=0; } } - eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; - eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; - eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; + eNB->UE_stats[i].dlsch_sliding_cnt=0; + eNB->UE_stats[i].dlsch_NAK_round0=0; + eNB->UE_stats[i].dlsch_mcs_offset=0; } // Msg3_flag==1 else { // Msg3_flag == 0 #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe, - harq_pid,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + harq_pid,eNB->ulsch[i]->harq_processes[harq_pid]->TBS>>3); - for (j=0; julsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); + for (j=0; julsch[i]->harq_processes[harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",eNB->ulsch[i]->harq_processes[harq_pid]->b[j]); LOG_T(PHY,"\n"); #endif @@ -3081,9 +3104,9 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, mac_xface->rx_sdu(eNB->Mod_id, eNB->CC_id, frame,subframe, - eNB->ulsch_eNB[i]->rnti, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, + eNB->ulsch[i]->rnti, + eNB->ulsch[i]->harq_processes[harq_pid]->b, + eNB->ulsch[i]->harq_processes[harq_pid]->TBS>>3, harq_pid, NULL); @@ -3102,8 +3125,8 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, // estimate timing advance for MAC if (abstraction_flag == 0) { - sync_pos = lte_est_timing_advance_pusch(eNB,i,sched_subframe); - eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check + sync_pos = lte_est_timing_advance_pusch(eNB,i,thread_id); + eNB->UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check } #ifdef DEBUG_PHY_PROC @@ -3111,7 +3134,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, eNB->Mod_id, frame, subframe, i, - eNB->eNB_UE_stats[i].timing_advance_update); + eNB->UE_stats[i].timing_advance_update); #endif @@ -3120,12 +3143,12 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, // process HARQ feedback #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",eNB->Mod_id, - eNB->dlsch_eNB[i][0]->rnti, + eNB->dlsch[i][0]->rnti, frame,subframe, i); #endif process_HARQ_feedback(i, - sched_subframe, + thread_id, eNB, 1, // pusch_flag 0, @@ -3135,15 +3158,15 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", eNB->Mod_id,frame,subframe, - eNB->eNB_UE_stats[i].sector, + eNB->UE_stats[i].sector, harq_pid, i, ret, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], - eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); + eNB->ulsch[i]->harq_processes[harq_pid]->cqi_crc_status, + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[0], + eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[1], + eNB->UE_stats[i].ulsch_errors[harq_pid], + eNB->UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); #endif // dump stats to VCD @@ -3151,45 +3174,45 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB, VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,eNB->pusch_stats_mcs[0][(frame*10)+subframe]); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,eNB->pusch_stats_rb[0][(frame*10)+subframe]); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,eNB->pusch_stats_round[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(eNB->lte_eNB_pusch_vars[0]->ulsch_power[0])); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(eNB->pusch_vars[0]->ulsch_power[0])); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0+harq_pid,ret); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0+harq_pid,(frame*10)+subframe); } - } // ulsch_eNB[0] && ulsch_eNB[0]->rnti>0 && ulsch_eNB[0]->subframe_scheduling_flag == 1 + } // ulsch[0] && ulsch[0]->rnti>0 && ulsch[0]->subframe_scheduling_flag == 1 // update ULSCH statistics for tracing if ((frame % 100 == 0) && (subframe == 4)) { for (harq_idx=0; harq_idx<8; harq_idx++) { - for (round=0; roundulsch_eNB[i]->Mlimit; round++) { - if ((eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - - eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) { - eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = - (100*(eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] - - eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/ - (eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - - eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]); + for (round=0; roundulsch[i]->Mlimit; round++) { + if ((eNB->UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - + eNB->UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) { + eNB->UE_stats[i].ulsch_round_fer[harq_idx][round] = + (100*(eNB->UE_stats[i].ulsch_round_errors[harq_idx][round] - + eNB->UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/ + (eNB->UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - + eNB->UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]); } else { - eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0; + eNB->UE_stats[i].ulsch_round_fer[harq_idx][round] = 0; } - eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] = - eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round]; - eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] = - eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round]; + eNB->UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] = + eNB->UE_stats[i].ulsch_decoding_attempts[harq_idx][round]; + eNB->UE_stats[i].ulsch_round_errors_last[harq_idx][round] = + eNB->UE_stats[i].ulsch_round_errors[harq_idx][round]; } } } if ((frame % 100 == 0) && (subframe==4)) { - eNB->eNB_UE_stats[i].dlsch_bitrate = (eNB->eNB_UE_stats[i].total_TBS - - eNB->eNB_UE_stats[i].total_TBS_last); + eNB->UE_stats[i].dlsch_bitrate = (eNB->UE_stats[i].total_TBS - + eNB->UE_stats[i].total_TBS_last); - eNB->eNB_UE_stats[i].total_TBS_last = eNB->eNB_UE_stats[i].total_TBS; + eNB->UE_stats[i].total_TBS_last = eNB->UE_stats[i].total_TBS; } // CBA (non-LTE) - cba_procedures(sched_subframe,eNB,i,harq_pid,abstraction_flag); + cba_procedures(thread_id,eNB,i,harq_pid,abstraction_flag); } // loop i=0 ... NUMBER_OF_UE_MAX-1 if (abstraction_flag == 0) { @@ -3250,6 +3273,7 @@ int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, r return do_proc; } #endif +/* void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *rn) { @@ -3264,10 +3288,7 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t ab int CC_id=0; - /* - if (eNB->proc[sched_subframe].frame_tx >= 1000) - mac_xface->macphy_exit("Exiting after 1000 Frames\n"); - */ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, eNB[0]->proc[subframe].frame_tx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1); start_meas(&eNB[0]->phy_proc); @@ -3284,122 +3305,11 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t ab Mod_id = instance; switch (ITTI_MSG_ID(msg_p)) { -# if ENABLE_RAL - case TIMER_HAS_EXPIRED: - // check if it is a measurement timer - { - hashtable_rc_t hashtable_rc; - - hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id)); - - if (hashtable_rc == HASH_TABLE_OK) { - phy_eNB_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg); - } - } - break; - - - case PHY_MEAS_THRESHOLD_REQ: -#warning "TO DO LIST OF THRESHOLDS" - LOG_D(PHY, "[ENB %d] Received %s\n", Mod_id, msg_name); - { - ral_threshold_phy_t* threshold_phy_p = NULL; - int index, res; - long timer_id; - hashtable_rc_t hashtable_rc; - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) { - - case RAL_TH_ACTION_CANCEL_THRESHOLD: - break; - - case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: - case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: - for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) { - threshold_phy_p = calloc(1, sizeof(ral_threshold_phy_t)); - threshold_phy_p->th_action = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action; - memcpy(&threshold_phy_p->link_param.link_param_type, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type, - sizeof(ral_link_param_type_t)); - - memcpy(&threshold_phy_p->threshold, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index], - sizeof(ral_threshold_t)); - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) { - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL: - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) { - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - SLIST_INSERT_HEAD( - &PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen], - threshold_phy_p, - ral_thresholds); - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - SLIST_INSERT_HEAD( - &PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte], - threshold_phy_p, - ral_thresholds); - break; - - default: - LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name); - } - - break; - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER: - res = timer_setup( - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t interval_sec, - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t interval_us, - TASK_PHY_ENB, - instance, - TIMER_PERIODIC, - threshold_phy_p, - &timer_id); - - if (res == 0) { - hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p); - - if (hashtable_rc == HASH_TABLE_OK) { - threshold_phy_p->timer_id = timer_id; - } else { - LOG_E(PHY, "[ENB %d] %s: Error in hashtable. Could not configure threshold index %d \n", - Mod_id, msg_name, index); - } - - } else { - LOG_E(PHY, "[ENB %d] %s: Could not configure threshold index %d because of timer initialization failure\n", - Mod_id, msg_name, index); - } - - break; - - default: // already checked in RRC, should not happen here - LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.union_choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name); - } - } - - break; - - default: - LOG_E(PHY, "[ENB %d] BAD PARAMETER th_action value %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name); - } - - } - break; -# endif - - /* Messages from eNB app */ + // Messages from eNB app case PHY_CONFIGURATION_REQ: LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name); - /* TODO */ + // TODO break; @@ -3417,23 +3327,23 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t ab for (CC_id=0; CC_idlte_frame_parms.frame_type == TDD)&& - (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))|| - (eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { + if ((((eNB[CC_id]->frame_parms.frame_type == TDD)&& + (subframe_select(&eNB[CC_id]->frame_parms,eNB[CC_id]->proc[0].subframe_tx)==SF_DL))|| + (eNB[CC_id]->frame_parms.frame_type == FDD))) { #ifdef Rel10 - if (phy_procedures_RN_eNB_TX(eNB[CC_id]->proc[subframe].subframe_rx, eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 ) + if (phy_procedures_RN_eNB_TX(eNB[CC_id]->proc[0].subframe_rx, eNB[CC_id]->proc[0].subframe_tx, r_type) != 0 ) #endif phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn); } - if ((((eNB[CC_id]->lte_frame_parms.frame_type == TDD )&& - (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) || - (eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { + if ((((eNB[CC_id]->frame_parms.frame_type == TDD )&& + (subframe_select(&eNB[CC_id]->frame_parms,eNB[CC_id]->proc[0].subframe_rx)==SF_UL)) || + (eNB[CC_id]->frame_parms.frame_type == FDD))) { phy_procedures_eNB_RX(subframe,eNB[CC_id],abstraction_flag,r_type); } - if (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) { + if (subframe_select(&eNB[CC_id]->frame_parms,eNB[CC_id]->proc[0].subframe_tx)==SF_S) { #ifdef Rel10 if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 ) @@ -3441,21 +3351,21 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t ab phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn); } - if ((subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)) { + if ((subframe_select(&eNB[CC_id]->frame_parms,eNB[CC_id]->proc[0].subframe_rx)==SF_S)) { phy_procedures_eNB_S_RX(subframe,eNB[CC_id],abstraction_flag,r_type); } - eNB[CC_id]->proc[subframe].frame_tx++; - eNB[CC_id]->proc[subframe].frame_rx++; + eNB[CC_id]->proc[0].frame_tx++; + eNB[CC_id]->proc[0].frame_rx++; - if (eNB[CC_id]->proc[subframe].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h - eNB[CC_id]->proc[subframe].frame_tx-=MAX_FRAME_NUMBER; + if (eNB[CC_id]->proc[0].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h + eNB[CC_id]->proc[0].frame_tx-=MAX_FRAME_NUMBER; - if (eNB[CC_id]->proc[subframe].frame_rx>=MAX_FRAME_NUMBER) - eNB[CC_id]->proc[subframe].frame_rx-=MAX_FRAME_NUMBER; + if (eNB[CC_id]->proc[0].frame_rx>=MAX_FRAME_NUMBER) + eNB[CC_id]->proc[0].frame_rx-=MAX_FRAME_NUMBER; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0); stop_meas(&eNB[0]->phy_proc); } - +*/ diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 084173248f..c80fdd0e40 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -117,73 +117,73 @@ extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; -void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) +void dump_dlsch(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) { unsigned int coded_bits_per_codeword; - uint8_t nsymb = (phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12; + uint8_t nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12; - coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - phy_vars_ue->frame_rx,subframe); + coded_bits_per_codeword = get_G(&ue->frame_parms, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->frame_rx,subframe); - write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1); - write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_ext[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,2,1); + write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); /* - write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); + write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + write_output("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_comp0[0],300*12,1,1); - write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars[0]->llr[0],coded_bits_per_codeword,1,0); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars[0]->rxdataF_comp0[0],300*12,1,1); + write_output("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars[0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_mag0,300*12,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_magb0,300*12,1,1); + write_output("dlsch_mag1.m","dlschmag1",ue->pdsch_vars[0]->dl_ch_mag0,300*12,1,1); + write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars[0]->dl_ch_magb0,300*12,1,1); } -void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) +void dump_dlsch_SI(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) { unsigned int coded_bits_per_codeword; - uint8_t nsymb = ((phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12); + uint8_t nsymb = ((ue->frame_parms.Ncp == 0) ? 14 : 12); - coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even, + coded_bits_per_codeword = get_G(&ue->frame_parms, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, 2, 1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - phy_vars_ue->frame_rx,subframe); + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->frame_rx,subframe); LOG_D(PHY,"[UE %d] Dumping dlsch_SI : ofdm_symbol_size %d, nsymb %d, nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", - phy_vars_ue->Mod_id, - phy_vars_ue->lte_frame_parms.ofdm_symbol_size, + ue->Mod_id, + ue->frame_parms.ofdm_symbol_size, nsymb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, coded_bits_per_codeword); - write_output("rxsig0.m","rxs0", &phy_vars_ue->lte_ue_common_vars.rxdata[0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti],phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + write_output("rxsig0.m","rxs0", &ue->common_vars.rxdata[0][subframe*ue->frame_parms.samples_per_tti],ue->frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_ext[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_estimates_ext[0],phy_vars_ue->lte_frame_parms.N_RB_DL*12*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_SI[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_SI[0]->dl_ch_estimates_ext[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); /* - write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); + write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + write_output("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_comp0[0],phy_vars_ue->lte_frame_parms.N_RB_DL*12*nsymb,1,1); - write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars_SI[0]->rxdataF_comp0[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); + write_output("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1); + write_output("dlsch_mag1.m","dlschmag1",ue->pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1); + write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1); exit(-1); } @@ -251,40 +251,40 @@ unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb #endif -void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) +void dump_dlsch_ra(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) { unsigned int coded_bits_per_codeword; - uint8_t nsymb = ((phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12); + uint8_t nsymb = ((ue->frame_parms.Ncp == 0) ? 14 : 12); - coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even, + coded_bits_per_codeword = get_G(&ue->frame_parms, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even, 2, 1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - phy_vars_ue->frame_rx,subframe); + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->frame_rx,subframe); LOG_D(PHY,"[UE %d] Dumping dlsch_ra : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->Mod_id, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_ra[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, coded_bits_per_codeword); - write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],2*12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1); - write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_ext[0],2*12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],2*12*ue->frame_parms.ofdm_symbol_size,2,1); + write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_ra[0]->rxdataF_ext[0],2*12*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_ra[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); /* - write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); + write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + write_output("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1); - write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1); + write_output("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); + write_output("dlsch_mag1.m","dlschmag1",ue->pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); + write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); } @@ -295,31 +295,31 @@ void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) // for more flexibility uint8_t i,j,k; - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; //[NUMBER_OF_CONNECTED_eNB_MAX][2]; for(i=0; idlsch_ue[i][j]) { - for(k=0; kdlsch_ue[i][j]->harq_processes[k]; k++) { - phy_vars_ue->dlsch_ue[i][j]->harq_processes[k]->status = SCH_IDLE; + if(ue->dlsch[i][j]) { + for(k=0; kdlsch[i][j]->harq_processes[k]; k++) { + ue->dlsch[i][j]->harq_processes[k]->status = SCH_IDLE; } } } //UL HARQ - if(phy_vars_ue->ulsch_ue[i]) { - for(k=0; kulsch_ue[i]->harq_processes[k]; k++) { - phy_vars_ue->ulsch_ue[i]->harq_processes[k]->status = SCH_IDLE; + if(ue->ulsch[i]) { + for(k=0; kulsch[i]->harq_processes[k]; k++) { + ue->ulsch[i]->harq_processes[k]->status = SCH_IDLE; //Set NDIs for all UL HARQs to 0 - // phy_vars_ue->ulsch_ue[i]->harq_processes[k]->Ndi = 0; + // ue->ulsch[i]->harq_processes[k]->Ndi = 0; } } // flush Msg3 buffer - phy_vars_ue->ulsch_ue_Msg3_active[i] = 0; + ue->ulsch_Msg3_active[i] = 0; } } @@ -340,13 +340,13 @@ void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) LOG_I(PHY,"[UE %d][RAPROC] Frame %d Random-access procedure succeeded\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx); - PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue_Msg3_active[eNB_index] = 0; + PHY_vars_UE_g[Mod_id][CC_id]->ulsch_Msg3_active[eNB_index] = 0; PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PUSCH; for (i=0; i<8; i++) { - if (PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_index]->harq_processes[i]) { - PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_index]->harq_processes[i]->status=IDLE; - PHY_vars_UE_g[Mod_id][CC_id]->dlsch_ue[eNB_index][0]->harq_processes[i]->round=0; + if (PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]) { + PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]->status=IDLE; + PHY_vars_UE_g[Mod_id][CC_id]->dlsch[eNB_index][0]->harq_processes[i]->round=0; } } @@ -359,7 +359,7 @@ UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) return(PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index]); } -void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance) +void process_timing_advance_rar(PHY_VARS_UE *ue,uint16_t timing_advance) { /* @@ -367,11 +367,11 @@ void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance timing_advance = timing_advance - (1<<11); */ - phy_vars_ue->timing_advance = timing_advance*4; + ue->timing_advance = timing_advance*4; #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance); + LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,ue->frame_rx, ue->timing_advance); #endif } @@ -392,41 +392,41 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance) } -uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) +uint8_t is_SR_TXOp(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) { LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for SR TXOp (sr_ConfigIndex %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame_tx,subframe, - phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex); + ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,ue->frame_tx,subframe, + ue->scheduling_request_config[eNB_id].sr_ConfigIndex); - if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 4) { // 5 ms SR period - if ((subframe%5) == phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex) + if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 4) { // 5 ms SR period + if ((subframe%5) == ue->scheduling_request_config[eNB_id].sr_ConfigIndex) return(1); - } else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 14) { // 10 ms SR period - if (subframe==(phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-5)) + } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 14) { // 10 ms SR period + if (subframe==(ue->scheduling_request_config[eNB_id].sr_ConfigIndex-5)) return(1); - } else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 34) { // 20 ms SR period - if ((10*(phy_vars_ue->frame_tx&1)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15)) + } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 34) { // 20 ms SR period + if ((10*(ue->frame_tx&1)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15)) return(1); - } else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 74) { // 40 ms SR period - if ((10*(phy_vars_ue->frame_tx&3)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35)) + } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 74) { // 40 ms SR period + if ((10*(ue->frame_tx&3)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35)) return(1); - } else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 154) { // 80 ms SR period - if ((10*(phy_vars_ue->frame_tx&7)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75)) + } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 154) { // 80 ms SR period + if ((10*(ue->frame_tx&7)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75)) return(1); } return(0); } -uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, +uint16_t get_n1_pucch(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint8_t *b, uint8_t SR) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; uint8_t nCCE0,nCCE1,harq_ack1,harq_ack0; ANFBmode_t bundling_flag; uint16_t n1_pucch0=0,n1_pucch1=0; @@ -435,27 +435,27 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, int M; // clear this, important for case where n1_pucch selection is not used - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; if (frame_parms->frame_type == FDD ) { // FDD sf = (subframe<4)? subframe+6 : subframe-4; - LOG_D(PHY,"n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]); + LOG_D(PHY,"n1_pucch_UE: subframe %d, nCCE %d\n",sf,ue->pdcch_vars[eNB_id]->nCCE[sf]); if (SR == 0) - return(frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]); + return(frame_parms->pucch_config_common.n1PUCCH_AN + ue->pdcch_vars[eNB_id]->nCCE[sf]); else - return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } else { - bundling_flag = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; + bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; #ifdef DEBUG_PHY_PROC if (bundling_flag==bundling) { - LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,SR, - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",ue->Mod_id,ue->frame_tx,subframe,SR, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } else { - LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,SR, - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",ue->Mod_id,ue->frame_tx,subframe,SR, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } #endif @@ -479,29 +479,29 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, subframe_offset = 4; } else { LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,frame_parms->tdd_config); + ue->Mod_id,ue->frame_tx,subframe,frame_parms->tdd_config); return(0); } // i=0 - nCCE0 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[subframe_offset]; + nCCE0 = ue->pdcch_vars[eNB_id]->nCCE[subframe_offset]; n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; // set ACK/NAK to values if not DTX - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_offset].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed - harq_ack0 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_offset].ack; + if (ue->dlsch[eNB_id][0]->harq_ack[subframe_offset].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed + harq_ack0 = ue->dlsch[eNB_id][0]->harq_ack[subframe_offset].ack; if (harq_ack0!=2) { // DTX if (SR == 0) { // last paragraph pg 68 from 36.213 (v8.6), m=0 b[0]=(M==2) ? 1-harq_ack0 : harq_ack0; b[1]=harq_ack0; // in case we use pucch format 1b (subframes 2,7) - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; return(n1_pucch0); } else { // SR and only 0 or 1 ACKs (first 2 entries in Table 7.3-1 of 36.213) b[0]=harq_ack0; - return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } } @@ -517,18 +517,18 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, // This is the offset for a particular subframe (2,3,4) => (0,2,4) subframe_offset = (subframe-2)<<1; // i=0 - nCCE0 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[5+subframe_offset]; + nCCE0 = ue->pdcch_vars[eNB_id]->nCCE[5+subframe_offset]; n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; // i=1 - nCCE1 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[(6+subframe_offset)%10]; + nCCE1 = ue->pdcch_vars[eNB_id]->nCCE[(6+subframe_offset)%10]; n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; // set ACK/NAK to values if not DTX - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[(6+subframe_offset)%10].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed - harq_ack1 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[(6+subframe_offset)%10].ack; + if (ue->dlsch[eNB_id][0]->harq_ack[(6+subframe_offset)%10].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed + harq_ack1 = ue->dlsch[eNB_id][0]->harq_ack[(6+subframe_offset)%10].ack; - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[5+subframe_offset].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed - harq_ack0 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[5+subframe_offset].ack; + if (ue->dlsch[eNB_id][0]->harq_ack[5+subframe_offset].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed + harq_ack0 = ue->dlsch[eNB_id][0]->harq_ack[5+subframe_offset].ack; if (harq_ack1!=2) { // n-6 // subframe 6,8,0 and maybe 5,7,9 is to be ACK/NAKed @@ -541,7 +541,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, if (harq_ack0!=2) b[0]=b[0]&harq_ack0; - phy_vars_ue->pucch_sel[subframe] = 1; + ue->pucch_sel[subframe] = 1; return(n1_pucch1); } else if ((bundling_flag==multiplexing)&&(SR==0)) { // Table 10.1 @@ -552,10 +552,10 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, b[0] = (harq_ack0!=harq_ack1)?0:1; if ((harq_ack0 == 1) && (harq_ack1 == 0)) { - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; return(n1_pucch0); } else { - phy_vars_ue->pucch_sel[subframe] = 1; + ue->pucch_sel[subframe] = 1; return(n1_pucch1); } } else if (SR==1) { // SR and 0,1,or 2 ACKS, (first 3 entries in Table 7.3-1 of 36.213) @@ -565,22 +565,22 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, b[0]= harq_ack1 | harq_ack0; b[1]= harq_ack1 ^ harq_ack0; - return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } } else if (harq_ack0!=2) { // n-7 // subframe 5,7,9 only is to be ACK/NAKed if ((bundling_flag==bundling)&&(SR == 0)) { // last paragraph pg 68 from 36.213 (v8.6), m=0 b[0]=harq_ack0; - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; return(n1_pucch0); } else if ((bundling_flag==multiplexing)&&(SR==0)) { // Table 10.1 with i=1 set to DTX b[0] = harq_ack0; b[1] = 1-b[0]; - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; return(n1_pucch0); } else if (SR==1) { // SR and only 0 or 1 ACKs (first 2 entries in Table 7.3-1 of 36.213) b[0]=harq_ack0; b[1]=b[0]; - return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } } @@ -589,7 +589,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, } // switch tdd_config } - LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",phy_vars_ue->frame_tx); + LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",ue->frame_tx); return(-1); } @@ -602,21 +602,21 @@ void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) { if (next_slot%2==0) { // get harq_pid from subframe relationship - harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms,phy_vars_ue->frame,(next_slot>>1)); + harq_pid = subframe2harq_pid(&ue->frame_parms,ue->frame,(next_slot>>1)); if (harq_pid==255) { LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n", - 0,phy_vars_ue->frame); + 0,ue->frame); return; } - if (ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { + if (ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { emos_dump_UE.uci_cnt[next_slot>>1] = 1; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch_ue[eNB_id]->o,MAX_CQI_BITS*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch_ue[eNB_id]->O; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch_ue[eNB_id]->o_RI,2*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch_ue[eNB_id]->O_RI; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch_ue[eNB_id]->o_ACK,4*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK; + memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch[eNB_id]->o,MAX_CQI_BITS*sizeof(char)); + emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch[eNB_id]->O; + memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch[eNB_id]->o_RI,2*sizeof(char)); + emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch[eNB_id]->O_RI; + memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch[eNB_id]->o_ACK,4*sizeof(char)); + emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK; } else { emos_dump_UE.uci_cnt[next_slot>>1] = 0; @@ -629,7 +629,7 @@ void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) { int dummy_tx_buffer[3840*4] __attribute__((aligned(16))); PRACH_RESOURCES_t prach_resources_local; -void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) +void phy_procedures_UE_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) { int i; @@ -645,7 +645,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra uint8_t SR_payload; int32_t prach_power; uint8_t nsymb; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; uint8_t generate_ul_signal = 0; uint8_t ack_status=0; int8_t Po_PUCCH; @@ -654,69 +654,69 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra int overflow=0; int k,l; #endif - int slot_tx = phy_vars_ue->slot_tx; - int subframe_tx = phy_vars_ue->slot_tx>>1; - int frame_tx = phy_vars_ue->frame_tx; - int Mod_id = phy_vars_ue->Mod_id; - int CC_id = phy_vars_ue->CC_id; + int slot_tx = ue->slot_tx; + int subframe_tx = ue->slot_tx>>1; + int frame_tx = ue->frame_tx; + int Mod_id = ue->Mod_id; + int CC_id = ue->CC_id; int tx_amp; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN); - start_meas(&phy_vars_ue->phy_proc_tx); + start_meas(&ue->phy_proc_tx); #ifdef EMOS //phy_procedures_emos_UE_TX(next_slot); #endif if ((slot_tx%2)==0) { - phy_vars_ue->tx_power_dBm=-127; + ue->tx_power_dBm=-127; if (abstraction_flag==0) { for (aa=0; aanb_antennas_tx; aa++) { - memset(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti], + memset(&ue->common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti], 0, frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t)); } } - if (phy_vars_ue->UE_mode[eNB_id] != PRACH) { + if (ue->UE_mode[eNB_id] != PRACH) { /* #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: Generating SRS\n",Mod_id,phy_vars_ue->frame,slot_tx); + LOG_D(PHY,"[UE %d] Frame %d, slot %d: Generating SRS\n",Mod_id,ue->frame,slot_tx); #endif if (abstraction_flag == 0) { #ifdef OFDMA_ULSCH - generate_srs_tx(phy_vars_ue,eNB_id,AMP,subframe_tx); + generate_srs_tx(ue,eNB_id,AMP,subframe_tx); #else - generate_srs_tx(phy_vars_ue,eNB_id,AMP,subframe_tx); + generate_srs_tx(ue,eNB_id,AMP,subframe_tx); #endif } #ifdef PHY_ABSTRACTION else { - generate_srs_tx_emul(phy_vars_ue,subframe_tx); + generate_srs_tx_emul(ue,subframe_tx); } #endif */ // get harq_pid from subframe relationship - harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms, + harq_pid = subframe2harq_pid(&ue->frame_parms, frame_tx, subframe_tx); - if (phy_vars_ue->mac_enabled == 1) { - if ((phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) && - (phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id] == frame_tx) && - (phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3 + if (ue->mac_enabled == 1) { + if ((ue->ulsch_Msg3_active[eNB_id] == 1) && + (ue->ulsch_Msg3_frame[eNB_id] == frame_tx) && + (ue->ulsch_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3 - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) - generate_ue_ulsch_params_from_rar(phy_vars_ue, + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) + generate_ue_ulsch_params_from_rar(ue, eNB_id); - phy_vars_ue->ulsch_ue[eNB_id]->power_offset = 14; + ue->ulsch[eNB_id]->power_offset = 14; LOG_D(PHY,"[UE %d][RAPROC] Frame %d: Setting Msg3_flag in subframe %d, for harq_pid %d\n", Mod_id, frame_tx, @@ -730,7 +730,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra Mod_id,frame_tx); mac_xface->macphy_exit("Error in ulsch_decoding"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_tx); + stop_meas(&ue->phy_proc_tx); return; } @@ -738,20 +738,20 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } } - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { generate_ul_signal = 1; // deactivate service request - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; - ack_status = get_ack(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack, + ack_status = get_ack(&ue->frame_parms, + ue->dlsch[eNB_id][0]->harq_ack, subframe_tx, - phy_vars_ue->ulsch_ue[eNB_id]->o_ACK); + ue->ulsch[eNB_id]->o_ACK); - first_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb; - nb_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb; + first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb; + nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; //frame_parms->pusch_config_c ommon.ul_ReferenceSignalsPUSCH.cyclicShift = 0; @@ -765,26 +765,26 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra "[UE %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n", Mod_id,harq_pid,frame_tx,subframe_tx, first_rb,nb_rb, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->mcs, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->rvidx, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx, (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+ - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2+ + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2+ frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx])%12, frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2, frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx], - phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[0],phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[1], - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK); + ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); #endif if (ack_status > 0) { LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating ACK (%d,%d) for %d bits on PUSCH\n", Mod_id, - phy_vars_ue->ulsch_ue[eNB_id]->rnti, + ue->ulsch[eNB_id]->rnti, frame_tx,subframe_tx, - phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[0],phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[1], - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK); + ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); } @@ -792,50 +792,50 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra //#ifdef DEBUG_PHY_PROC - // debug_LOG_D(PHY,"[UE %d] Frame %d, Subframe %d ulsch harq_pid %d : O %d, O_ACK %d, O_RI %d, TBS %d\n",Mod_id,phy_vars_ue->frame,subframe_tx,harq_pid,phy_vars_ue->ulsch_ue[eNB_id]->O,phy_vars_ue->ulsch_ue[eNB_id]->O_ACK,phy_vars_ue->ulsch_ue[eNB_id]->O_RI,phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS); + // debug_LOG_D(PHY,"[UE %d] Frame %d, Subframe %d ulsch harq_pid %d : O %d, O_ACK %d, O_RI %d, TBS %d\n",Mod_id,ue->frame,subframe_tx,harq_pid,ue->ulsch[eNB_id]->O,ue->ulsch[eNB_id]->O_ACK,ue->ulsch[eNB_id]->O_RI,ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS); //#endif if (Msg3_flag == 1) { LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d next slot %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",Mod_id,frame_tx, subframe_tx, slot_tx, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->prach_resources[eNB_id]->Msg3[0], - phy_vars_ue->prach_resources[eNB_id]->Msg3[1], - phy_vars_ue->prach_resources[eNB_id]->Msg3[2], - phy_vars_ue->prach_resources[eNB_id]->Msg3[3], - phy_vars_ue->prach_resources[eNB_id]->Msg3[4], - phy_vars_ue->prach_resources[eNB_id]->Msg3[5], - phy_vars_ue->prach_resources[eNB_id]->Msg3[6], - phy_vars_ue->prach_resources[eNB_id]->Msg3[7], - phy_vars_ue->prach_resources[eNB_id]->Msg3[8]); + ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx, + ue->prach_resources[eNB_id]->Msg3[0], + ue->prach_resources[eNB_id]->Msg3[1], + ue->prach_resources[eNB_id]->Msg3[2], + ue->prach_resources[eNB_id]->Msg3[3], + ue->prach_resources[eNB_id]->Msg3[4], + ue->prach_resources[eNB_id]->Msg3[5], + ue->prach_resources[eNB_id]->Msg3[6], + ue->prach_resources[eNB_id]->Msg3[7], + ue->prach_resources[eNB_id]->Msg3[8]); - start_meas(&phy_vars_ue->ulsch_encoding_stats); + start_meas(&ue->ulsch_encoding_stats); if (abstraction_flag==0) { - if (ulsch_encoding(phy_vars_ue->prach_resources[eNB_id]->Msg3, - phy_vars_ue, + if (ulsch_encoding(ue->prach_resources[eNB_id]->Msg3, + ue, harq_pid, eNB_id, - phy_vars_ue->transmission_mode[eNB_id],0,0)!=0) { + ue->transmission_mode[eNB_id],0,0)!=0) { LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); mac_xface->macphy_exit("Error in ulsch_coding"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_tx); + stop_meas(&ue->phy_proc_tx); return; } } #ifdef PHY_ABSTRACTION else { - ulsch_encoding_emul(phy_vars_ue->prach_resources[eNB_id]->Msg3,phy_vars_ue,eNB_id,harq_pid,0); + ulsch_encoding_emul(ue->prach_resources[eNB_id]->Msg3,ue,eNB_id,harq_pid,0); } #endif - stop_meas(&phy_vars_ue->ulsch_encoding_stats); + stop_meas(&ue->ulsch_encoding_stats); - if (phy_vars_ue->mac_enabled == 1) { + if (ue->mac_enabled == 1) { // signal MAC that Msg3 was sent mac_xface->Msg3_transmitted(Mod_id, CC_id, @@ -843,12 +843,12 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra eNB_id); } } else { - input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8; + input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8; - if (phy_vars_ue->mac_enabled==1) { + if (ue->mac_enabled==1) { // LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id); - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) { - //if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) { + //if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { access_mode=SCHEDULED_ACCESS; mac_xface->ue_get_sdu(Mod_id, CC_id, @@ -864,7 +864,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra else { // Get calibration information from TDD procedures LOG_D(PHY,"[UE %d] Frame %d, subframe %d : ULSCH: Getting TDD Auto-Calibration information\n", - Mod_id,phy_vars_ue->frame,subframe_tx); + Mod_id,ue->frame,subframe_tx); for (i=0;iulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3); + LOG_D(PHY,"[UE] Frame %d, subframe %d : ULSCH SDU (TX harq_pid %d) (%d bytes) : \n",frame_tx,subframe_tx,harq_pid, ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3); - for (i=0; iulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++) + for (i=0; iulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++) LOG_T(PHY,"%x.",ulsch_input_buffer[i]); LOG_T(PHY,"\n"); @@ -886,7 +886,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra else { // the following lines were necessary for the calibration in CROWN /* - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { for (i=0;iulsch_ue[eNB_id]->o ,0,MAX_CQI_BYTES*sizeof(uint8_t)); - memset(phy_vars_ue->ulsch_ue[eNB_id]->o_RI ,0,2*sizeof(uint8_t)); - memset(phy_vars_ue->ulsch_ue[eNB_id]->o_ACK,0,4*sizeof(uint8_t)); + memset(ue->ulsch[eNB_id]->o ,0,MAX_CQI_BYTES*sizeof(uint8_t)); + memset(ue->ulsch[eNB_id]->o_RI ,0,2*sizeof(uint8_t)); + memset(ue->ulsch[eNB_id]->o_ACK,0,4*sizeof(uint8_t)); for (i=0;iulsch_encoding_stats); + start_meas(&ue->ulsch_encoding_stats); if (abstraction_flag==0) { /* - if (phy_vars_ue->frame%100==0) { + if (ue->frame%100==0) { LOG_I(PHY,"Encoding ulsch\n"); } */ if (ulsch_encoding(ulsch_input_buffer, - phy_vars_ue, + ue, harq_pid, eNB_id, - phy_vars_ue->transmission_mode[eNB_id],0, + ue->transmission_mode[eNB_id],0, 0)!=0) { // Nbundled, to be updated!!!! LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_tx); + stop_meas(&ue->phy_proc_tx); return; } } #ifdef PHY_ABSTRACTION else { - ulsch_encoding_emul(ulsch_input_buffer,phy_vars_ue,eNB_id,harq_pid,0); + ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0); } #endif - stop_meas(&phy_vars_ue->ulsch_encoding_stats); + stop_meas(&ue->ulsch_encoding_stats); } if (abstraction_flag == 0) { - if (phy_vars_ue->mac_enabled==1) { - pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag); - phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH; + if (ue->mac_enabled==1) { + pusch_power_cntl(ue,subframe_tx,eNB_id,1, abstraction_flag); + ue->tx_power_dBm = ue->ulsch[eNB_id]->Po_PUSCH; } else { - phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm; + ue->tx_power_dBm = ue->tx_power_max_dBm; } - phy_vars_ue->tx_total_RE = nb_rb*12; + ue->tx_total_RE = nb_rb*12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(phy_vars_ue->tx_power_dBm, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.N_RB_UL, + tx_amp = get_tx_amp(ue->tx_power_dBm, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, nb_rb); #else tx_amp = AMP; #endif LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n", - Mod_id,harq_pid,frame_tx,subframe_tx,phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm, tx_amp); - start_meas(&phy_vars_ue->ulsch_modulation_stats); - ulsch_modulation(phy_vars_ue->lte_ue_common_vars.txdataF, + Mod_id,harq_pid,frame_tx,subframe_tx,ue->tx_power_dBm,ue->tx_power_max_dBm, tx_amp); + start_meas(&ue->ulsch_modulation_stats); + ulsch_modulation(ue->common_vars.txdataF, tx_amp, frame_tx, subframe_tx, - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->ulsch_ue[eNB_id]); + &ue->frame_parms, + ue->ulsch[eNB_id]); for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) - generate_drs_pusch(phy_vars_ue, + generate_drs_pusch(ue, eNB_id, tx_amp, subframe_tx, @@ -976,19 +976,19 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra nb_rb, aa); - stop_meas(&phy_vars_ue->ulsch_modulation_stats); + stop_meas(&ue->ulsch_modulation_stats); } if (abstraction_flag==1) { // clear SR - phy_vars_ue->sr[subframe_tx]=0; + ue->sr[subframe_tx]=0; } } // ULSCH is active #ifdef PUCCH - else if (phy_vars_ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b + else if (ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b // debug_LOG_D(PHY,"[UE%d] Frame %d, subframe %d: Checking for PUCCH 1a/1b\n",Mod_id,frame_tx,subframe_tx); - bundling_flag = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; + bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; if ((frame_parms->frame_type==FDD) || (bundling_flag==bundling) || @@ -1001,16 +1001,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } // Check for SR and do ACK/NACK accordingly - if (is_SR_TXOp(phy_vars_ue,eNB_id,subframe_tx)==1) { + if (is_SR_TXOp(ue,eNB_id,subframe_tx)==1) { LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n", - Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx); + Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx); - if (phy_vars_ue->mac_enabled==1) { + if (ue->mac_enabled==1) { SR_payload = mac_xface->ue_get_SR(Mod_id, CC_id, frame_tx, eNB_id, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + ue->pdcch_vars[eNB_id]->crnti, subframe_tx); // subframe used for meas gap } else { @@ -1020,40 +1020,40 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra if (SR_payload>0) { generate_ul_signal = 1; LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n", - Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx,SR_payload); + Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx,SR_payload); } else { - phy_vars_ue->sr[subframe_tx]=0; + ue->sr[subframe_tx]=0; } } else { SR_payload=0; } - if (get_ack(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack, + if (get_ack(&ue->frame_parms, + ue->dlsch[eNB_id][0]->harq_ack, subframe_tx,pucch_ack_payload) > 0) { // we need to transmit ACK/NAK in this subframe generate_ul_signal = 1; - n1_pucch = get_n1_pucch(phy_vars_ue, + n1_pucch = get_n1_pucch(ue, eNB_id, subframe_tx, pucch_ack_payload, SR_payload); - if (phy_vars_ue->mac_enabled == 1) { - Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format); + if (ue->mac_enabled == 1) { + Po_PUCCH = pucch_power_cntl(ue,subframe_tx,eNB_id,format); } else { - Po_PUCCH = phy_vars_ue->tx_power_max_dBm; + Po_PUCCH = ue->tx_power_max_dBm; } - phy_vars_ue->tx_power_dBm = Po_PUCCH; - phy_vars_ue->tx_total_RE = 12; + ue->tx_power_dBm = Po_PUCCH; + ue->tx_total_RE = 12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) tx_amp = get_tx_amp(Po_PUCCH, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.N_RB_UL, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, 1); #else tx_amp = AMP; @@ -1062,16 +1062,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra if (SR_payload>0) { LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b payload %d,%d (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n", Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, + ue->dlsch[eNB_id][0]->rnti, frame_tx, subframe_tx, pucch_ack_payload[0],pucch_ack_payload[1], - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, Po_PUCCH, tx_amp); } else { LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating PUCCH 1a/1b, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, + ue->dlsch[eNB_id][0]->rnti, frame_tx, subframe_tx, n1_pucch,pucch_ack_payload[0],pucch_ack_payload[1],SR_payload, Po_PUCCH, @@ -1080,11 +1080,11 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra if (abstraction_flag == 0) { - generate_pucch(phy_vars_ue->lte_ue_common_vars.txdataF, - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->ncs_cell, + generate_pucch(ue->common_vars.txdataF, + &ue->frame_parms, + ue->ncs_cell, format, - &phy_vars_ue->pucch_config_dedicated[eNB_id], + &ue->pucch_config_dedicated[eNB_id], n1_pucch, 0, // n2_pucch 1, // shortened format @@ -1095,9 +1095,9 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } else { #ifdef PHY_ABSTRACTION LOG_D(PHY,"Calling generate_pucch_emul ... (ACK %d %d, SR %d)\n",pucch_ack_payload[0],pucch_ack_payload[1],SR_payload); - generate_pucch_emul(phy_vars_ue, + generate_pucch_emul(ue, format, - phy_vars_ue->lte_frame_parms.pucch_config_common.nCS_AN, + ue->frame_parms.pucch_config_common.nCS_AN, pucch_ack_payload, SR_payload, subframe_tx); @@ -1105,38 +1105,38 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC - if (phy_vars_ue->mac_enabled == 1) { - Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1); + if (ue->mac_enabled == 1) { + Po_PUCCH = pucch_power_cntl(ue,subframe_tx,eNB_id,pucch_format1); } else { - Po_PUCCH = phy_vars_ue->tx_power_max_dBm; + Po_PUCCH = ue->tx_power_max_dBm; } - phy_vars_ue->tx_power_dBm = Po_PUCCH; - phy_vars_ue->tx_total_RE = 12; + ue->tx_power_dBm = Po_PUCCH; + ue->tx_total_RE = 12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) tx_amp = get_tx_amp(Po_PUCCH, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.N_RB_UL, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, 1); #else tx_amp = AMP; #endif LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n", Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, + ue->dlsch[eNB_id][0]->rnti, frame_tx, subframe_tx, - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, Po_PUCCH); if (abstraction_flag == 0) { - generate_pucch(phy_vars_ue->lte_ue_common_vars.txdataF, - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->ncs_cell, + generate_pucch(ue->common_vars.txdataF, + &ue->frame_parms, + ue->ncs_cell, pucch_format1, - &phy_vars_ue->pucch_config_dedicated[eNB_id], - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, + &ue->pucch_config_dedicated[eNB_id], + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, 0, // n2_pucch 1, // shortened format pucch_ack_payload, // this is ignored anyway, we just need a pointer @@ -1144,9 +1144,9 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra subframe_tx); } else { LOG_D(PHY,"Calling generate_pucch_emul ...\n"); - generate_pucch_emul(phy_vars_ue, + generate_pucch_emul(ue, pucch_format1, - phy_vars_ue->lte_frame_parms.pucch_config_common.nCS_AN, + ue->frame_parms.pucch_config_common.nCS_AN, pucch_ack_payload, SR_payload, subframe_tx); @@ -1158,19 +1158,19 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #ifdef CBA - if ((phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag >= 1) && - (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status == CBA_ACTIVE)) { - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag=0; //-=1 - // phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status= IDLE; - first_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb; - nb_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb; - //cba_mcs=phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->mcs; - input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8; + if ((ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag >= 1) && + (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == CBA_ACTIVE)) { + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag=0; //-=1 + // ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE; + first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb; + nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; + //cba_mcs=ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs; + input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8; access_mode=CBA_ACCESS; LOG_D(PHY,"[UE %d] Frame %d, subframe %d: CBA num dci %d\n", Mod_id,frame_tx,subframe_tx, - phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[subframe_tx]); + ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]); mac_xface->ue_get_sdu(Mod_id, CC_id, @@ -1181,16 +1181,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra input_buffer_length, &access_mode); - phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[subframe_tx]=0; + ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]=0; if (access_mode > UNKNOWN_ACCESS) { if (abstraction_flag==0) { if (ulsch_encoding(ulsch_input_buffer, - phy_vars_ue, + ue, harq_pid, eNB_id, - phy_vars_ue->transmission_mode[eNB_id],0, + ue->transmission_mode[eNB_id],0, 0)!=0) { // Nbundled, to be updated!!!! LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); return; @@ -1199,13 +1199,13 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra #ifdef PHY_ABSTRACTION else { - ulsch_encoding_emul(ulsch_input_buffer,phy_vars_ue,eNB_id,harq_pid,0); + ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0); } #endif } else { - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status= IDLE; - //reset_cba_uci(phy_vars_ue->ulsch_ue[eNB_id]->o); + ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE; + //reset_cba_uci(ue->ulsch[eNB_id]->o); LOG_N(PHY,"[UE %d] Frame %d, subframe %d: CBA transmission cancelled or postponed\n", Mod_id, frame_tx,subframe_tx); } @@ -1217,75 +1217,75 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra nsymb = (frame_parms->Ncp == 0) ? 14 : 12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case - ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- - phy_vars_ue->hw_timing_advance- - phy_vars_ue->timing_advance- - phy_vars_ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); + ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- + ue->hw_timing_advance- + ue->timing_advance- + ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); #else //this is the normal case - ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-phy_vars_ue->N_TA_offset; //-phy_vars_ue->timing_advance; + ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance; #endif //else EXMIMO if ((frame_tx%100) == 0) LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n", Mod_id,frame_tx,subframe_tx, ulsch_start, - phy_vars_ue->rx_offset, - phy_vars_ue->hw_timing_advance, - phy_vars_ue->timing_advance, - phy_vars_ue->N_TA_offset); + ue->rx_offset, + ue->hw_timing_advance, + ue->timing_advance, + ue->N_TA_offset); if (generate_ul_signal == 1 ) { - start_meas(&phy_vars_ue->ofdm_mod_stats); + start_meas(&ue->ofdm_mod_stats); for (aa=0; aanb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], + PHY_ofdm_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) dummy_tx_buffer, #else - &phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start], + &ue->common_vars.txdata[aa][ulsch_start], #endif frame_parms->ofdm_symbol_size, nsymb, frame_parms->nb_prefix_samples, CYCLIC_PREFIX); else - normal_prefix_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], + normal_prefix_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) dummy_tx_buffer, #else - &phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start], + &ue->common_vars.txdata[aa][ulsch_start], #endif nsymb, - &phy_vars_ue->lte_frame_parms); + &ue->frame_parms); /* if (subframe_tx == 8) { printf("Symbol 0 %p (offset %d) base %p\n", - &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe], + &ue->common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe], nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe, - phy_vars_ue->lte_ue_common_vars.txdataF[0]); - write_output("txsigF8.m","txsF8", &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe], - phy_vars_ue->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); - write_output("txsig8.m","txs8", &phy_vars_ue->lte_ue_common_vars.txdata[0][phy_vars_ue->lte_frame_parms.samples_per_tti*subframe], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + ue->common_vars.txdataF[0]); + write_output("txsigF8.m","txsF8", &ue->common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe], + ue->frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("txsig8.m","txs8", &ue->common_vars.txdata[0][ue->frame_parms.samples_per_tti*subframe], + ue->frame_parms.samples_per_tti,1,1); } */ #ifndef OFDMA_ULSCH #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,0); - apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,1); + apply_7_5_kHz(ue,dummy_tx_buffer,0); + apply_7_5_kHz(ue,dummy_tx_buffer,1); #else - apply_7_5_kHz(phy_vars_ue,&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],0); - apply_7_5_kHz(phy_vars_ue,&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],1); + apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],0); + apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],1); #endif /* if (subframe_tx == 8) { - write_output("txsig8_mod.m","txs8_mod", &phy_vars_ue->lte_ue_common_vars.txdata[0][phy_vars_ue->lte_frame_parms.samples_per_tti*subframe], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + write_output("txsig8_mod.m","txs8_mod", &ue->common_vars.txdata[0][ue->frame_parms.samples_per_tti*subframe], + ue->frame_parms.samples_per_tti,1,1); } */ #endif @@ -1295,34 +1295,34 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra //if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow); for (k=ulsch_start,l=0; ksamples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) { - ((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; - ((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; + ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; + ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; } for (k=0; klte_ue_common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; - ((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; + ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; + ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; } #if defined(EXMIMO) // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on for (k=ulsch_start - (frame_parms->samples_per_tti>>1) ; klte_ue_common_vars.txdata[aa][k+frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + ue->common_vars.txdata[aa][k+frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; else if (k>(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) - phy_vars_ue->lte_ue_common_vars.txdata[aa][k-frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + ue->common_vars.txdata[aa][k-frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; else - phy_vars_ue->lte_ue_common_vars.txdata[aa][k] &= 0xFFFEFFFE; + ue->common_vars.txdata[aa][k] &= 0xFFFEFFFE; } #endif #endif } //nb_antennas_tx - stop_meas(&phy_vars_ue->ofdm_mod_stats); + stop_meas(&ue->ofdm_mod_stats); } // generate_ul_signal == 1 else { // no uplink so clear signal buffer instead for (aa=0; aanb_antennas_tx; aa++) { - memset(&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2); + memset(&ue->common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2); } } } @@ -1331,33 +1331,33 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra // }// slot_tx is even // else { // slot_tx is odd, do the PRACH here - if ((phy_vars_ue->UE_mode[eNB_id] == PRACH) && (phy_vars_ue->lte_frame_parms.prach_config_common.prach_Config_enabled==1)) { + if ((ue->UE_mode[eNB_id] == PRACH) && (ue->frame_parms.prach_config_common.prach_Config_enabled==1)) { // check if we have PRACH opportunity - if (is_prach_subframe(&phy_vars_ue->lte_frame_parms,frame_tx,subframe_tx)) { - phy_vars_ue->generate_prach=0; + if (is_prach_subframe(&ue->frame_parms,frame_tx,subframe_tx)) { + ue->generate_prach=0; - if (phy_vars_ue->mac_enabled==1){ + if (ue->mac_enabled==1){ // ask L2 for RACH transport if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { - phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id, + ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id, CC_id, frame_tx, eNB_id, subframe_tx); - // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); + // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); } } - if (phy_vars_ue->prach_resources[eNB_id]!=NULL) { + if (ue->prach_resources[eNB_id]!=NULL) { - phy_vars_ue->generate_prach=1; - phy_vars_ue->prach_cnt=0; + ue->generate_prach=1; + ue->prach_cnt=0; #ifdef SMBV - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; + ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; #endif #ifdef OAI_EMU - phy_vars_ue->prach_PreambleIndex=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; + ue->prach_PreambleIndex=ue->prach_resources[eNB_id]->ra_PreambleIndex; #endif if (abstraction_flag == 0) { @@ -1365,49 +1365,49 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra Mod_id, frame_tx, subframe_tx, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex, - phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, - phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index, - phy_vars_ue->prach_resources[eNB_id]->ra_RNTI); + ue->prach_resources[eNB_id]->ra_PreambleIndex, + ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, + ue->prach_resources[eNB_id]->ra_TDD_map_index, + ue->prach_resources[eNB_id]->ra_RNTI); - if ((phy_vars_ue->mac_enabled==1) && (mode != calib_prach_tx)) { - phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id); + if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) { + ue->tx_power_dBm = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id); } else { - phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm; - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; + ue->tx_power_dBm = ue->tx_power_max_dBm; + ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; } - phy_vars_ue->tx_total_RE = 96; + ue->tx_total_RE = 96; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.N_RB_UL, + ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, 6); #else - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = AMP; + ue->prach_vars[eNB_id]->amp = AMP; #endif - if ((mode == calib_prach_tx) && (((phy_vars_ue->frame_tx&0xfffe)%100)==0)) - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_tx>>1,phy_vars_ue->tx_power_dBm, - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp); + if ((mode == calib_prach_tx) && (((ue->frame_tx&0xfffe)%100)==0)) + LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,ue->frame_rx,ue->slot_tx>>1,ue->tx_power_dBm, + ue->prach_vars[eNB_id]->amp); - // start_meas(&phy_vars_ue->tx_prach); + // start_meas(&ue->tx_prach); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN); - prach_power = generate_prach(phy_vars_ue,eNB_id,subframe_tx,frame_tx); + prach_power = generate_prach(ue,eNB_id,subframe_tx,frame_tx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT); - // stop_meas(&phy_vars_ue->tx_prach); + // stop_meas(&ue->tx_prach); LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n", Mod_id, get_PL(Mod_id,CC_id,eNB_id), - phy_vars_ue->tx_power_dBm, + ue->tx_power_dBm, dB_fixed(prach_power), - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp); + ue->prach_vars[eNB_id]->amp); } else { UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1; - UE_transport_info[Mod_id][CC_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; - if (phy_vars_ue->mac_enabled==1){ + UE_transport_info[Mod_id][CC_id].cntl.prach_id=ue->prach_resources[eNB_id]->ra_PreambleIndex; + if (ue->mac_enabled==1){ mac_xface->Msg1_transmitted(Mod_id, CC_id, frame_tx, @@ -1417,8 +1417,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n", Mod_id,frame_tx,subframe_tx,eNB_id, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex, - phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id), + ue->prach_resources[eNB_id]->ra_PreambleIndex, + ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id), get_PL(Mod_id,CC_id,eNB_id)); } @@ -1426,29 +1426,29 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra } // if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue if (mode == calib_prach_tx) - phy_vars_ue->prach_resources[eNB_id]=NULL; + ue->prach_resources[eNB_id]=NULL; LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n", - Mod_id,frame_tx,subframe_tx,phy_vars_ue->generate_prach,phy_vars_ue->prach_cnt); + Mod_id,frame_tx,subframe_tx,ue->generate_prach,ue->prach_cnt); - phy_vars_ue->prach_cnt++; + ue->prach_cnt++; - if (phy_vars_ue->prach_cnt==3) - phy_vars_ue->generate_prach=0; + if (ue->prach_cnt==3) + ue->generate_prach=0; } // mode is PRACH else { - phy_vars_ue->generate_prach=0; + ue->generate_prach=0; } } // slot_tx is even VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_tx); + stop_meas(&ue->phy_proc_tx); } -void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type) +void phy_procedures_UE_S_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type) { int aa;//i,aa; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; if (abstraction_flag==0) { @@ -1457,10 +1457,10 @@ void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abst int i; // set the whole tx buffer to RX for (i=0; isamples_per_tti; i++) - phy_vars_ue->lte_ue_common_vars.txdata[aa][i] = 0x00010001; + ue->common_vars.txdata[aa][i] = 0x00010001; #else //this is the normal case - memset(&phy_vars_ue->lte_ue_common_vars.txdata[aa][0],0, + memset(&ue->common_vars.txdata[aa][0],0, (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)*sizeof(int32_t)); #endif //else EXMIMO @@ -1468,17 +1468,17 @@ void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abst } } -void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) +void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; // int aa; #if defined(EXMIMO) && defined(DRIVER2013) // exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr; // int aa; #endif - int slot_rx = phy_vars_ue->slot_rx; + int slot_rx = ue->slot_rx; int subframe_rx = slot_rx>>1; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN); @@ -1486,32 +1486,32 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t if (l==0) { // UE measurements on symbol 0 if (abstraction_flag==0) { - LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,phy_vars_ue->lte_ue_common_vars.rxdata); + LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,ue->common_vars.rxdata); - lte_ue_measurements(phy_vars_ue, - (subframe_rx*frame_parms->samples_per_tti+phy_vars_ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME), + lte_ue_measurements(ue, + (subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME), (slot_rx == 2) ? 1 : 0, 0); } else { - lte_ue_measurements(phy_vars_ue, + lte_ue_measurements(ue, 0, 0, 1); } } - if (l==(6-phy_vars_ue->lte_frame_parms.Ncp)) { + if (l==(6-ue->frame_parms.Ncp)) { // make sure we have signal from PSS/SSS for N0 measurement VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_IN); - ue_rrc_measurements(phy_vars_ue, + ue_rrc_measurements(ue, slot_rx, abstraction_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_OUT); if (abstraction_flag==1) - phy_vars_ue->sinr_eff = sinr_eff_cqi_calc(phy_vars_ue, 0); + ue->sinr_eff = sinr_eff_cqi_calc(ue, 0); } @@ -1524,7 +1524,7 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t #ifndef OAI_USRP #ifndef OAI_BLADERF #ifndef OAI_LMSSDR - phy_adjust_gain (phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); + phy_adjust_gain (ue,dB_fixed(ue->measurements.rssi),0); #endif #endif #endif @@ -1534,8 +1534,8 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id = 0; if (abstraction_flag == 0) - lte_adjust_synch(&phy_vars_ue->lte_frame_parms, - phy_vars_ue, + lte_adjust_synch(&ue->frame_parms, + ue, eNB_id, 0, 16384); @@ -1548,13 +1548,13 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t } #ifdef EMOS -void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_t eNB_id) +void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id) { uint8_t i,j; //uint16_t last_slot_emos; uint32_t bytes; - int Mod_id = phy_vars_ue->Mod_id; + int Mod_id = ue->Mod_id; /* if (last_slot<2) @@ -1570,16 +1570,16 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_ #ifdef EMOS_CHANNEL if ((last_slot==10) || (last_slot==11)) { - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) - for (j=0; jlte_frame_parms.nb_antennas_tx; j++) { + for (i=0; iframe_parms.nb_antennas_rx; i++) + for (j=0; jframe_parms.nb_antennas_tx; j++) { // first OFDM symbol with pilots - memcpy(&emos_dump_UE.channel[i][j][(last_slot%2)*2*phy_vars_ue->lte_frame_parms.ofdm_symbol_size], - &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][0], - phy_vars_ue->lte_frame_parms.ofdm_symbol_size*sizeof(int)); + memcpy(&emos_dump_UE.channel[i][j][(last_slot%2)*2*ue->frame_parms.ofdm_symbol_size], + &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][0], + ue->frame_parms.ofdm_symbol_size*sizeof(int)); // second OFDM symbol with pilots - memcpy(&emos_dump_UE.channel[i][j][((last_slot%2)*2+1)*phy_vars_ue->lte_frame_parms.ofdm_symbol_size], - &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][(phy_vars_ue->lte_frame_parms.Ncp == 0 ? 4 : 3)*phy_vars_ue->lte_frame_parms.ofdm_symbol_size], - phy_vars_ue->lte_frame_parms.ofdm_symbol_size*sizeof(int)); + memcpy(&emos_dump_UE.channel[i][j][((last_slot%2)*2+1)*ue->frame_parms.ofdm_symbol_size], + &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][(ue->frame_parms.Ncp == 0 ? 4 : 3)*ue->frame_parms.ofdm_symbol_size], + ue->frame_parms.ofdm_symbol_size*sizeof(int)); } } @@ -1587,47 +1587,47 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_ if (last_slot==0) { emos_dump_UE.timestamp = rt_get_time_ns(); - emos_dump_UE.frame_rx = phy_vars_ue->frame_rx; - emos_dump_UE.UE_mode = phy_vars_ue->UE_mode[eNB_id]; - emos_dump_UE.mimo_mode = phy_vars_ue->transmission_mode[eNB_id]; - emos_dump_UE.freq_offset = phy_vars_ue->lte_ue_common_vars.freq_offset; - emos_dump_UE.timing_advance = phy_vars_ue->timing_advance; - emos_dump_UE.timing_offset = phy_vars_ue->rx_offset; - emos_dump_UE.rx_total_gain_dB = phy_vars_ue->rx_total_gain_dB; + emos_dump_UE.frame_rx = ue->frame_rx; + emos_dump_UE.UE_mode = ue->UE_mode[eNB_id]; + emos_dump_UE.mimo_mode = ue->transmission_mode[eNB_id]; + emos_dump_UE.freq_offset = ue->common_vars.freq_offset; + emos_dump_UE.timing_advance = ue->timing_advance; + emos_dump_UE.timing_offset = ue->rx_offset; + emos_dump_UE.rx_total_gain_dB = ue->rx_total_gain_dB; emos_dump_UE.eNb_id = eNB_id; - memcpy(&emos_dump_UE.PHY_measurements,&phy_vars_ue->PHY_measurements,sizeof(PHY_MEASUREMENTS)); + memcpy(&emos_dump_UE.PHY_measurements,&measurements,sizeof(PHY_MEASUREMENTS)); } if (last_slot==1) { - emos_dump_UE.pbch_errors = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors; - emos_dump_UE.pbch_errors_last = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last; - emos_dump_UE.pbch_errors_conseq = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq; - emos_dump_UE.pbch_fer = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_fer; + emos_dump_UE.pbch_errors = ue->pbch_vars[eNB_id]->pdu_errors; + emos_dump_UE.pbch_errors_last = ue->pbch_vars[eNB_id]->pdu_errors_last; + emos_dump_UE.pbch_errors_conseq = ue->pbch_vars[eNB_id]->pdu_errors_conseq; + emos_dump_UE.pbch_fer = ue->pbch_vars[eNB_id]->pdu_fer; } if (last_slot==19) { - emos_dump_UE.dlsch_errors = phy_vars_ue->dlsch_errors[eNB_id]; - emos_dump_UE.dlsch_errors_last = phy_vars_ue->dlsch_errors_last[eNB_id]; - emos_dump_UE.dlsch_received = phy_vars_ue->dlsch_received[eNB_id]; - emos_dump_UE.dlsch_received_last = phy_vars_ue->dlsch_received_last[eNB_id]; - emos_dump_UE.dlsch_fer = phy_vars_ue->dlsch_fer[eNB_id]; - emos_dump_UE.dlsch_cntl_errors = phy_vars_ue->dlsch_SI_errors[eNB_id]; - emos_dump_UE.dlsch_ra_errors = phy_vars_ue->dlsch_ra_errors[eNB_id]; - emos_dump_UE.total_TBS = phy_vars_ue->total_TBS[eNB_id]; - emos_dump_UE.total_TBS_last = phy_vars_ue->total_TBS_last[eNB_id]; - emos_dump_UE.bitrate = phy_vars_ue->bitrate[eNB_id]; - emos_dump_UE.total_received_bits = phy_vars_ue->total_received_bits[eNB_id]; - emos_dump_UE.pmi_saved = phy_vars_ue->dlsch_ue[eNB_id][0]->pmi_alloc; - emos_dump_UE.mcs = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs; + emos_dump_UE.dlsch_errors = ue->dlsch_errors[eNB_id]; + emos_dump_UE.dlsch_errors_last = ue->dlsch_errors_last[eNB_id]; + emos_dump_UE.dlsch_received = ue->dlsch_received[eNB_id]; + emos_dump_UE.dlsch_received_last = ue->dlsch_received_last[eNB_id]; + emos_dump_UE.dlsch_fer = ue->dlsch_fer[eNB_id]; + emos_dump_UE.dlsch_cntl_errors = ue->dlsch_SI_errors[eNB_id]; + emos_dump_UE.dlsch_ra_errors = ue->dlsch_ra_errors[eNB_id]; + emos_dump_UE.total_TBS = ue->total_TBS[eNB_id]; + emos_dump_UE.total_TBS_last = ue->total_TBS_last[eNB_id]; + emos_dump_UE.bitrate = ue->bitrate[eNB_id]; + emos_dump_UE.total_received_bits = ue->total_received_bits[eNB_id]; + emos_dump_UE.pmi_saved = ue->dlsch[eNB_id][0]->pmi_alloc; + emos_dump_UE.mcs = ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs; emos_dump_UE.use_ia_receiver = openair_daq_vars.use_ia_receiver; bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE)); if (bytes!=sizeof(fifo_dump_emos_UE)) { - LOG_W(PHY,"[UE %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame_rx, last_slot); + LOG_W(PHY,"[UE %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,ue->frame_rx, last_slot); } else { - if (phy_vars_ue->frame_rx%100==0) { - LOG_I(PHY,"[UE %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame_rx, last_slot, bytes); + if (ue->frame_rx%100==0) { + LOG_I(PHY,"[UE %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,ue->frame_rx, last_slot, bytes); } } } @@ -1636,65 +1636,65 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_ #endif -void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag) +void restart_phy(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag) { // uint8_t last_slot; uint8_t i; - LOG_I(PHY,"[UE %d] frame %d, slot %d, restarting PHY!\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_rx); + LOG_I(PHY,"[UE %d] frame %d, slot %d, restarting PHY!\n",ue->Mod_id,ue->frame_rx,ue->slot_rx); mac_xface->macphy_exit("restart_phy called"); // first_run = 1; if (abstraction_flag ==0 ) { - phy_vars_ue->UE_mode[eNB_id] = NOT_SYNCHED; + ue->UE_mode[eNB_id] = NOT_SYNCHED; } else { - phy_vars_ue->UE_mode[eNB_id] = PRACH; - phy_vars_ue->prach_resources[eNB_id]=NULL; + ue->UE_mode[eNB_id] = PRACH; + ue->prach_resources[eNB_id]=NULL; } - phy_vars_ue->frame_rx = -1; - phy_vars_ue->frame_tx = -1; - // phy_vars_ue->synch_wait_cnt=0; - // phy_vars_ue->sched_cnt=-1; + ue->frame_rx = -1; + ue->frame_tx = -1; + // ue->synch_wait_cnt=0; + // ue->sched_cnt=-1; - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq=0; - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors=0; + ue->pbch_vars[eNB_id]->pdu_errors_conseq=0; + ue->pbch_vars[eNB_id]->pdu_errors=0; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors = 0; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed = 0; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false = 0; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received = 0; + ue->pdcch_vars[eNB_id]->dci_errors = 0; + ue->pdcch_vars[eNB_id]->dci_missed = 0; + ue->pdcch_vars[eNB_id]->dci_false = 0; + ue->pdcch_vars[eNB_id]->dci_received = 0; - phy_vars_ue->dlsch_errors[eNB_id] = 0; - phy_vars_ue->dlsch_errors_last[eNB_id] = 0; - phy_vars_ue->dlsch_received[eNB_id] = 0; - phy_vars_ue->dlsch_received_last[eNB_id] = 0; - phy_vars_ue->dlsch_fer[eNB_id] = 0; - phy_vars_ue->dlsch_SI_received[eNB_id] = 0; - phy_vars_ue->dlsch_ra_received[eNB_id] = 0; - phy_vars_ue->dlsch_SI_errors[eNB_id] = 0; - phy_vars_ue->dlsch_ra_errors[eNB_id] = 0; + ue->dlsch_errors[eNB_id] = 0; + ue->dlsch_errors_last[eNB_id] = 0; + ue->dlsch_received[eNB_id] = 0; + ue->dlsch_received_last[eNB_id] = 0; + ue->dlsch_fer[eNB_id] = 0; + ue->dlsch_SI_received[eNB_id] = 0; + ue->dlsch_ra_received[eNB_id] = 0; + ue->dlsch_SI_errors[eNB_id] = 0; + ue->dlsch_ra_errors[eNB_id] = 0; - phy_vars_ue->dlsch_mch_received[eNB_id] = 0; + ue->dlsch_mch_received[eNB_id] = 0; for (i=0; i < MAX_MBSFN_AREA ; i ++) { - phy_vars_ue->dlsch_mch_received_sf[i][eNB_id] = 0; - phy_vars_ue->dlsch_mcch_received[i][eNB_id] = 0; - phy_vars_ue->dlsch_mtch_received[i][eNB_id] = 0; - phy_vars_ue->dlsch_mcch_errors[i][eNB_id] = 0; - phy_vars_ue->dlsch_mtch_errors[i][eNB_id] = 0; - phy_vars_ue->dlsch_mcch_trials[i][eNB_id] = 0; - phy_vars_ue->dlsch_mtch_trials[i][eNB_id] = 0; + ue->dlsch_mch_received_sf[i][eNB_id] = 0; + ue->dlsch_mcch_received[i][eNB_id] = 0; + ue->dlsch_mtch_received[i][eNB_id] = 0; + ue->dlsch_mcch_errors[i][eNB_id] = 0; + ue->dlsch_mtch_errors[i][eNB_id] = 0; + ue->dlsch_mcch_trials[i][eNB_id] = 0; + ue->dlsch_mtch_trials[i][eNB_id] = 0; } - //phy_vars_ue->total_TBS[eNB_id] = 0; - //phy_vars_ue->total_TBS_last[eNB_id] = 0; - //phy_vars_ue->bitrate[eNB_id] = 0; - //phy_vars_ue->total_received_bits[eNB_id] = 0; + //ue->total_TBS[eNB_id] = 0; + //ue->total_TBS_last[eNB_id] = 0; + //ue->bitrate[eNB_id] = 0; + //ue->total_received_bits[eNB_id] = 0; } -void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abstraction_flag) +void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) { // int i; @@ -1704,9 +1704,9 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst static uint8_t first_run = 1; uint8_t pbch_trials = 0; - DevAssert(phy_vars_ue); - int slot_rx = phy_vars_ue->slot_rx; - int frame_rx = phy_vars_ue->frame_rx; + DevAssert(ue); + int slot_rx = ue->slot_rx; + int frame_rx = ue->frame_rx; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN); @@ -1717,14 +1717,14 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst for (pbch_trials=0; pbch_trials<4; pbch_trials++) { //for (pbch_phase=0;pbch_phase<4;pbch_phase++) { - //LOG_I(PHY,"[UE %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",phy_vars_ue->Mod_id,frame_rx,pbch_phase,phy_vars_ue->lte_frame_parms.Nid_cell,eNB_id); + //LOG_I(PHY,"[UE %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",ue->Mod_id,frame_rx,pbch_phase,ue->frame_parms.Nid_cell,eNB_id); if (abstraction_flag == 0) { - pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars, - phy_vars_ue->lte_ue_pbch_vars[eNB_id], - &phy_vars_ue->lte_frame_parms, + pbch_tx_ant = rx_pbch(&ue->common_vars, + ue->pbch_vars[eNB_id], + &ue->frame_parms, eNB_id, - phy_vars_ue->lte_frame_parms.mode1_flag==1?SISO:ALAMOUTI, - phy_vars_ue->high_speed_flag, + ue->frame_parms.mode1_flag==1?SISO:ALAMOUTI, + ue->high_speed_flag, pbch_phase); @@ -1733,7 +1733,7 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst #ifdef PHY_ABSTRACTION else { - pbch_tx_ant = rx_pbch_emul(phy_vars_ue, + pbch_tx_ant = rx_pbch_emul(ue, eNB_id, pbch_phase); } @@ -1761,85 +1761,85 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq = 0; - frame_tx = (((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[2]&0x03))<<8); - frame_tx += ((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]&0xfc)); + ue->pbch_vars[eNB_id]->pdu_errors_conseq = 0; + frame_tx = (((int)(ue->pbch_vars[eNB_id]->decoded_output[2]&0x03))<<8); + frame_tx += ((int)(ue->pbch_vars[eNB_id]->decoded_output[1]&0xfc)); frame_tx += pbch_phase; - if (phy_vars_ue->mac_enabled==1) { - mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id, - phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0); + if (ue->mac_enabled==1) { + mac_xface->dl_phy_sync_success(ue->Mod_id,frame_rx,eNB_id, + ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0); } #ifdef EMOS //emos_dump_UE.frame_tx = frame_tx; - //emos_dump_UE.mimo_mode = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]; + //emos_dump_UE.mimo_mode = ue->pbch_vars[eNB_id]->decoded_output[1]; #endif if (first_run) { first_run = 0; LOG_I(PHY,"[UE %d] frame %d, slot %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d).\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx, slot_rx, pbch_tx_ant, frame_tx, pbch_phase); - phy_vars_ue->frame_rx = (phy_vars_ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - phy_vars_ue->frame_tx = phy_vars_ue->frame_rx; - frame_rx = phy_vars_ue->frame_rx; - } else if (((frame_tx & 0x03FF) != (phy_vars_ue->frame_rx & 0x03FF))) { - //(pbch_tx_ant != phy_vars_ue->lte_frame_parms.nb_antennas_tx)) { + ue->frame_rx = (ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); + ue->frame_tx = ue->frame_rx; + frame_rx = ue->frame_rx; + } else if (((frame_tx & 0x03FF) != (ue->frame_rx & 0x03FF))) { + //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) { LOG_D(PHY,"[UE %d] frame %d, slot %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%1024=%d, phase %d).\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx, + ue->Mod_id, + ue->frame_rx, slot_rx, pbch_tx_ant, frame_tx, frame_rx & 0x03FF, pbch_phase); - phy_vars_ue->frame_rx = (phy_vars_ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - phy_vars_ue->frame_tx = phy_vars_ue->frame_rx; - frame_rx = phy_vars_ue->frame_rx; + ue->frame_rx = (ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); + ue->frame_tx = ue->frame_rx; + frame_rx = ue->frame_rx; /* LOG_D(PHY,"[UE %d] frame %d, slot %d: PBCH PDU does not match, ignoring it (PBCH ant_tx=%d, frame_tx=%d).\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame, + ue->Mod_id, + ue->frame, slot_rx, pbch_tx_ant, frame_tx); */ - //phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq = 21; // this will make it go out of sync - //phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq += 1; // this will make it go out of sync + //ue->pbch_vars[eNB_id]->pdu_errors_conseq = 21; // this will make it go out of sync + //ue->pbch_vars[eNB_id]->pdu_errors_conseq += 1; // this will make it go out of sync } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] frame %d, slot %d, Received PBCH (MIB): mode1_flag %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx, slot_rx, - phy_vars_ue->lte_frame_parms.mode1_flag, + ue->frame_parms.mode1_flag, pbch_tx_ant, frame_tx, - phy_vars_ue->lte_frame_parms.N_RB_DL, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource); + ue->frame_parms.N_RB_DL, + ue->frame_parms.phich_config_common.phich_duration, + ue->frame_parms.phich_config_common.phich_resource); /* if (frame_rx%100 == 0) { LOG_I(PHY,"[UE %d] frame %d, slot %d, PBCH: mode1_flag %d, tx_ant %d, frame_tx %d, phase %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6,Frequency offset %d Hz (%d)\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx, slot_rx, - phy_vars_ue->lte_frame_parms.mode1_flag, + ue->frame_parms.mode1_flag, pbch_tx_ant, frame_tx, pbch_phase, - phy_vars_ue->lte_frame_parms.N_RB_DL, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource, - phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset); - //dump_frame_parms(&phy_vars_ue->lte_frame_parms); + ue->frame_parms.N_RB_DL, + ue->frame_parms.phich_config_common.phich_duration, + ue->frame_parms.phich_config_common.phich_resource, + ue->common_vars.freq_offset,openair_daq_vars.freq_offset); + //dump_frame_parms(&ue->frame_parms); } */ @@ -1847,14 +1847,14 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } else { LOG_E(PHY,"[UE %d] frame %d, slot %d, Error decoding PBCH!\n", - phy_vars_ue->Mod_id,frame_rx, slot_rx); - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq++; - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors++; - if (phy_vars_ue->mac_enabled == 1) { - mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id); + ue->Mod_id,frame_rx, slot_rx); + ue->pbch_vars[eNB_id]->pdu_errors_conseq++; + ue->pbch_vars[eNB_id]->pdu_errors++; + if (ue->mac_enabled == 1) { + mac_xface->out_of_sync_ind(ue->Mod_id,frame_rx,eNB_id); } else{ - if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) { + if (ue->pbch_vars[eNB_id]->pdu_errors_conseq>=100) { LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); mac_xface->macphy_exit("More that 100 consecutive PBCH errors!"); } @@ -1862,20 +1862,20 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } if (frame_rx % 100 == 0) { - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_fer = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last; - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors; + ue->pbch_vars[eNB_id]->pdu_fer = ue->pbch_vars[eNB_id]->pdu_errors - ue->pbch_vars[eNB_id]->pdu_errors_last; + ue->pbch_vars[eNB_id]->pdu_errors_last = ue->pbch_vars[eNB_id]->pdu_errors; } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!\n", - phy_vars_ue->Mod_id,frame_rx, slot_rx, - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors, - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq); + ue->Mod_id,frame_rx, slot_rx, + ue->pbch_vars[eNB_id]->pdu_errors, + ue->pbch_vars[eNB_id]->pdu_errors_conseq); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT); } -int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abstraction_flag) +int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) { unsigned int dci_cnt=0, i; @@ -1883,8 +1883,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst //uint16_t ra_RNTI; - int frame_rx = phy_vars_ue->frame_rx; - int slot_rx = phy_vars_ue->slot_rx; + int frame_rx = ue->frame_rx; + int slot_rx = ue->slot_rx; int subframe_rx = slot_rx>>1; @@ -1901,29 +1901,29 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst if (abstraction_flag == 0) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN); - rx_pdcch(&phy_vars_ue->lte_ue_common_vars, - phy_vars_ue->lte_ue_pdcch_vars, - &phy_vars_ue->lte_frame_parms, + rx_pdcch(&ue->common_vars, + ue->pdcch_vars, + &ue->frame_parms, subframe_rx, eNB_id, - (phy_vars_ue->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - phy_vars_ue->high_speed_flag, - phy_vars_ue->is_secondary_ue); + (ue->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + ue->high_speed_flag, + ue->is_secondary_ue); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN); - dci_cnt = dci_decoding_procedure(phy_vars_ue, + dci_cnt = dci_decoding_procedure(ue, dci_alloc_rx, - (phy_vars_ue->UE_mode[eNB_id] < PUSCH)? 1 : 0, // if we're in PUSCH don't listen to common search space, + (ue->UE_mode[eNB_id] < PUSCH)? 1 : 0, // if we're in PUSCH don't listen to common search space, // later when we need paging or RA during connection, update this ... eNB_id,subframe_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT); - //LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d PHICH RX\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); + //LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d PHICH RX\n",ue->Mod_id,frame_rx,subframe_rx); - if (is_phich_subframe(&phy_vars_ue->lte_frame_parms,subframe_rx)) { + if (is_phich_subframe(&ue->frame_parms,subframe_rx)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_IN); - rx_phich(phy_vars_ue, + rx_phich(ue, subframe_rx,eNB_id); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_OUT); } @@ -1933,7 +1933,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst else { for (i=0; ilte_frame_parms.Nid_cell == phy_vars_ue->lte_frame_parms.Nid_cell) + if (PHY_vars_eNB_g[i][CC_id]->frame_parms.Nid_cell == ue->frame_parms.Nid_cell) break; if (CC_id < MAX_NUM_CCs) @@ -1941,48 +1941,48 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } if (i==NB_eNB_INST) { - LOG_E(PHY,"[UE %d] phy_procedures_lte_ue.c: FATAL : Could not find attached eNB for DCI emulation (Nid_cell %d)!!!!\n",phy_vars_ue->Mod_id,phy_vars_ue->lte_frame_parms.Nid_cell); + LOG_E(PHY,"[UE %d] phy_procedures_lte_ue.c: FATAL : Could not find attached eNB for DCI emulation (Nid_cell %d)!!!!\n",ue->Mod_id,ue->frame_parms.Nid_cell); mac_xface->macphy_exit("Could not find attached eNB for DCI emulation"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(-1); } LOG_D(PHY,"Calling dci_decoding_proc_emul ...\n"); - dci_cnt = dci_decoding_procedure_emul(phy_vars_ue->lte_ue_pdcch_vars, + dci_cnt = dci_decoding_procedure_emul(ue->pdcch_vars, PHY_vars_eNB_g[i][CC_id]->num_ue_spec_dci[subframe_rx&1], PHY_vars_eNB_g[i][CC_id]->num_common_dci[subframe_rx&1], PHY_vars_eNB_g[i][CC_id]->dci_alloc[subframe_rx&1], dci_alloc_rx, eNB_id); // printf("DCI: dci_cnt %d\n",dci_cnt); - UE_id = (uint32_t)find_ue((int16_t)phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,PHY_vars_eNB_g[i][CC_id]); + UE_id = (uint32_t)find_ue((int16_t)ue->pdcch_vars[eNB_id]->crnti,PHY_vars_eNB_g[i][CC_id]); if (UE_id>=0) { // msg("Checking PHICH for UE %d (eNB %d)\n",UE_id,i); - if (is_phich_subframe(&phy_vars_ue->lte_frame_parms,subframe_rx)) { - harq_pid = phich_subframe_to_harq_pid(&phy_vars_ue->lte_frame_parms,frame_rx,subframe_rx); + if (is_phich_subframe(&ue->frame_parms,subframe_rx)) { + harq_pid = phich_subframe_to_harq_pid(&ue->frame_parms,frame_rx,subframe_rx); - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) { - // phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->phich_ACK=1; - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status = IDLE; - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round = 0; + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) { + // ue->ulsch[eNB_id]->harq_processes[harq_pid]->phich_ACK=1; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->status = IDLE; + ue->ulsch_Msg3_active[eNB_id] = 0; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; LOG_D(PHY,"Msg3 inactive\n"); /* Phich is not abstracted for the moment if (PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->phich_ACK==0) { // NAK - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) { + if (ue->ulsch_Msg3_active[eNB_id] == 1) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received NAK\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx, subframe_rx); #endif - get_Msg3_alloc_ret(&phy_vars_ue->lte_frame_parms, + get_Msg3_alloc_ret(&ue->frame_parms, subframe_rx, frame_rx, - &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); + &ue->ulsch_Msg3_frame[eNB_id], + &ue->ulsch_Msg3_subframe[eNB_id]); } // PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; // PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Ndi = 0; @@ -1990,16 +1990,16 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } else { #ifdef DEBUG_PHY_PROC - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) + if (ue->ulsch_Msg3_active[eNB_id] == 1) LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received ACK\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx, subframe_rx); #endif PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status = IDLE; // inform MAC? - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; + ue->ulsch_Msg3_active[eNB_id] = 0; } //phich_ACK */ } // harq_pid is ACTIVE } // This is a PHICH subframe @@ -2009,19 +2009,19 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst #endif //#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d, Mode %s: DCI found %i\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,mode_string[phy_vars_ue->UE_mode[eNB_id]],dci_cnt); + LOG_D(PHY,"[UE %d] Frame %d, slot %d, Mode %s: DCI found %i\n",ue->Mod_id,frame_rx,slot_rx,mode_string[ue->UE_mode[eNB_id]],dci_cnt); //#endif - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received += dci_cnt; + ue->pdcch_vars[eNB_id]->dci_received += dci_cnt; /* #ifdef DEBUG_PHY_PROC if (slot_rx==18) debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: PDCCH: DCI errors %d, DCI received %d, DCI missed %d, DCI False Detection %d \n", - phy_vars_ue->Mod_id,frame_rx,slot_rx, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false); + ue->Mod_id,frame_rx,slot_rx, + ue->pdcch_vars[eNB_id]->dci_errors, + ue->pdcch_vars[eNB_id]->dci_received, + ue->pdcch_vars[eNB_id]->dci_missed, + ue->pdcch_vars[eNB_id]->dci_false); #endif */ #ifdef EMOS @@ -2030,46 +2030,46 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst /* #ifdef DIAG_PHY - //if (phy_vars_ue->UE_mode[eNB_id] == PUSCH) + //if (ue->UE_mode[eNB_id] == PUSCH) if (dci_cnt > 1) { - LOG_D(PHY,"[UE %d][DIAG] frame %d, subframe %d: received %d>1 DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_cnt); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; + LOG_D(PHY,"[UE %d][DIAG] frame %d, subframe %d: received %d>1 DCI!\n",ue->Mod_id,frame_rx,subframe_rx,dci_cnt); + ue->pdcch_vars[eNB_id]->dci_false++; } else if (dci_cnt==0) { - LOG_D(PHY,"[UE %d][DIAG] frame %d, subframe %d: received %d DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_cnt); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed++; + LOG_D(PHY,"[UE %d][DIAG] frame %d, subframe %d: received %d DCI!\n",ue->Mod_id,frame_rx,subframe_rx,dci_cnt); + ue->pdcch_vars[eNB_id]->dci_missed++; } #endif */ // dci_cnt = 0; - // ra_RNTI = (phy_vars_ue->prach_resources[eNB_id]) ? phy_vars_ue->prach_resources[eNB_id]->ra_RNTI : 0; + // ra_RNTI = (ue->prach_resources[eNB_id]) ? ue->prach_resources[eNB_id]->ra_RNTI : 0; for (i=0; ilte_ue_pdcch_vars[eNB_id]->crnti,i,dci_cnt); - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + LOG_D(PHY,"frame %d, subframe %d, rnti %x: dci %d/%d\n",frame_rx,subframe_rx,ue->pdcch_vars[eNB_id]->crnti,i,dci_cnt); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); } #endif - //if ((phy_vars_ue->UE_mode[eNB_id] != PRACH) && + //if ((ue->UE_mode[eNB_id] != PRACH) && // (dci_alloc_rx[i].rnti != 0x1234) && - if ((phy_vars_ue->UE_mode[eNB_id]>PRACH) && - (dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) && + if ((ue->UE_mode[eNB_id]>PRACH) && + (dci_alloc_rx[i].rnti == ue->pdcch_vars[eNB_id]->crnti) && (dci_alloc_rx[i].format != format0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][DCI][PDSCH %x] frame %d, subframe %d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d\n", - phy_vars_ue->Mod_id,dci_alloc_rx[i].rnti, + ue->Mod_id,dci_alloc_rx[i].rnti, frame_rx,subframe_rx, dci_alloc_rx[i].format, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[subframe_rx], - get_nCCE(3,&phy_vars_ue->lte_frame_parms,get_mi(&phy_vars_ue->lte_frame_parms,0))); + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->pdcch_vars[eNB_id]->nCCE[subframe_rx], + get_nCCE(3,&ue->frame_parms,get_mi(&ue->frame_parms,0))); #endif @@ -2077,60 +2077,60 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst if (!(((subframe_rx == 7) && (dci_alloc_rx[i].format == format1E_2A_M10PRB)) || ((subframe_rx == 7) && (dci_alloc_rx[i].format == format1)))) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; + LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format); + ue->pdcch_vars[eNB_id]->dci_errors++; + ue->pdcch_vars[eNB_id]->dci_false++; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(-1); } #endif - // dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) && + // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + if ((ue->UE_mode[eNB_id] > PRACH) && (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, (void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + ue->pdcch_vars[eNB_id]->crnti, dci_alloc_rx[i].format, - phy_vars_ue->dlsch_ue[eNB_id], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->pdsch_config_dedicated, + ue->dlsch[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI)==0)) { #ifdef DIAG_PHY - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs != (((frame_rx%1024)%28))) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: wrong mcs!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs); - dump_dci(&phy_vars_ue->lte_frame_parms,(void *)&dci_alloc_rx[i]); + if (ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs != (((frame_rx%1024)%28))) { + LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: wrong mcs!\n",ue->Mod_id,frame_rx,subframe_rx, + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs); + dump_dci(&ue->frame_parms,(void *)&dci_alloc_rx[i]); } #endif - phy_vars_ue->dlsch_received[eNB_id]++; + ue->dlsch_received[eNB_id]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",phy_vars_ue->Mod_id,dci_alloc_rx[i].format); - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,phy_vars_ue->dlsch_ue[eNB_id][0]->active); + LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",ue->Mod_id,subframe_rx,slot_rx,ue->dlsch[eNB_id][0]->active); #endif // we received a CRNTI, so we're in PUSCH - if (phy_vars_ue->UE_mode[eNB_id] != PUSCH) { + if (ue->UE_mode[eNB_id] != PUSCH) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti); + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",ue->Mod_id,frame_rx,subframe_rx,ue->pdcch_vars[eNB_id]->crnti); #endif - //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - phy_vars_ue->UE_mode[eNB_id] = PUSCH; + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + ue->UE_mode[eNB_id] = PUSCH; //mac_xface->macphy_exit("Connected. Exiting\n"); } } else { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Problem in DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Problem in DCI!\n",ue->Mod_id,frame_rx,subframe_rx); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); } } @@ -2138,18 +2138,18 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); + LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); /* if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); */ #endif #ifdef DIAG_PHY if ((subframe_rx != 5)) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received SI_RNTI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; + LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received SI_RNTI!\n",ue->Mod_id,frame_rx,subframe_rx); + ue->pdcch_vars[eNB_id]->dci_errors++; + ue->pdcch_vars[eNB_id]->dci_false++; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(-1); } @@ -2161,39 +2161,39 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst (void *)&dci_alloc_rx[i].dci_pdu, SI_RNTI, dci_alloc_rx[i].format, - &phy_vars_ue->dlsch_ue_SI[eNB_id], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->pdsch_config_dedicated, + &ue->dlsch_SI[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI)==0) { - phy_vars_ue->dlsch_SI_received[eNB_id]++; + ue->dlsch_SI_received[eNB_id]++; - LOG_D(PHY,"[UE %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C"); - //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + LOG_D(PHY,"[UE %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C"); + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); } } - else if ((phy_vars_ue->prach_resources[eNB_id]) && - (dci_alloc_rx[i].rnti == phy_vars_ue->prach_resources[eNB_id]->ra_RNTI) && + else if ((ue->prach_resources[eNB_id]) && + (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) && (dci_alloc_rx[i].format == format1A)) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i); + LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i); //if (((frame_rx%100) == 0) || (frame_rx < 20)) - //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); //mac_xface->macphy_exit("so far so good...\n"); #endif #ifdef DIAG_PHY if (subframe_rx != 9) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received RA_RNTI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; + LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received RA_RNTI!\n",ue->Mod_id,frame_rx,subframe_rx); + ue->pdcch_vars[eNB_id]->dci_errors++; + ue->pdcch_vars[eNB_id]->dci_false++; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(-1); } @@ -2203,53 +2203,53 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst if (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->prach_resources[eNB_id]->ra_RNTI, + ue->prach_resources[eNB_id]->ra_RNTI, format1A, - &phy_vars_ue->dlsch_ue_ra[eNB_id], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->pdsch_config_dedicated, + &ue->dlsch_ra[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, SI_RNTI, - phy_vars_ue->prach_resources[eNB_id]->ra_RNTI, + ue->prach_resources[eNB_id]->ra_RNTI, P_RNTI)==0) { - phy_vars_ue->dlsch_ra_received[eNB_id]++; + ue->dlsch_ra_received[eNB_id]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ue_ra[eNB_id] %p\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],phy_vars_ue->dlsch_ue_ra[eNB_id]); + LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n", + ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]); #endif } - } else if( (dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) && + } else if( (dci_alloc_rx[i].rnti == ue->pdcch_vars[eNB_id]->crnti) && (dci_alloc_rx[i].format == format0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n", - phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); + ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); /* if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); */ #endif #ifdef DIAG_PHY if (subframe_rx != 9) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format 0!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; + LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format 0!\n",ue->Mod_id,frame_rx,subframe_rx); + ue->pdcch_vars[eNB_id]->dci_errors++; + ue->pdcch_vars[eNB_id]->dci_false++; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(-1); } #endif - phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0; - //dump_dci(&phy_vars_ue->lte_frame_parms,&dci_alloc_rx[i]); + ue->ulsch_no_allocation_counter[eNB_id] = 0; + //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); - if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) && + if ((ue->UE_mode[eNB_id] > PRACH) && (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + ue->pdcch_vars[eNB_id]->crnti, subframe_rx, format0, - phy_vars_ue, + ue, SI_RNTI, 0, P_RNTI, @@ -2258,44 +2258,44 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst 0)==0)) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",phy_vars_ue->Mod_id,subframe_rx); + LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); #endif } - } else if( (dci_alloc_rx[i].rnti == phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0]) && + } else if( (dci_alloc_rx[i].rnti == ue->ulsch[eNB_id]->cba_rnti[0]) && (dci_alloc_rx[i].format == format0)) { // UE could belong to more than one CBA group - // phy_vars_ue->Mod_id%phy_vars_ue->ulsch_ue[eNB_id]->num_active_cba_groups] + // ue->Mod_id%ue->ulsch[eNB_id]->num_active_cba_groups] #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found cba rnti %x, format 0, dci_cnt %d\n", - phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); + ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); /* if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); */ #endif /* #ifdef DIAG_PHY if (subframe_rx != 8) { LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received CBA RNTI Format 0!\n", - phy_vars_ue->Mod_id,frame_rx,subframe_rx); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; + ue->Mod_id,frame_rx,subframe_rx); + ue->pdcch_vars[eNB_id]->dci_errors++; + ue->pdcch_vars[eNB_id]->dci_false++; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(-1); } #endif */ - phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0; - //dump_dci(&phy_vars_ue->lte_frame_parms,&dci_alloc_rx[i]); + ue->ulsch_no_allocation_counter[eNB_id] = 0; + //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); - if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) && + if ((ue->UE_mode[eNB_id] > PRACH) && (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0], + ue->ulsch[eNB_id]->cba_rnti[0], subframe_rx, format0, - phy_vars_ue, + ue, SI_RNTI, 0, P_RNTI, @@ -2304,23 +2304,23 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst 0)==0)) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",phy_vars_ue->Mod_id,subframe_rx); + LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); #endif - phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++; + ue->ulsch[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++; } } else { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0], + LOG_D(PHY,"[UE %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti, + ue->pdcch_vars[eNB_id]->crnti, + ue->ulsch[eNB_id]->cba_rnti[0], dci_alloc_rx[i].format); - // dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); #endif #ifdef DIAG_PHY - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; + ue->pdcch_vars[eNB_id]->dci_errors++; + ue->pdcch_vars[eNB_id]->dci_false++; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(-1); #endif @@ -2329,13 +2329,13 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } /* if ((frame_rx > 1000) && ((frame_rx&1)==0) && (subframe_rx == 5)) { - write_output("rxsig0.m","rxs0", phy_vars_ue->lte_ue_common_vars.rxdata[0],10*phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],phy_vars_ue->lte_frame_parms.ofdm_symbol_size*2*((phy_vars_ue->lte_frame_parms.Ncp==0)?14:12),2,1); - write_output("H00.m","h00",&(phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((phy_vars_ue->lte_frame_parms.Ncp==0)?7:6)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("rxsig0.m","rxs0", ue->common_vars.rxdata[0],10*ue->frame_parms.samples_per_tti,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],ue->frame_parms.ofdm_symbol_size*2*((ue->frame_parms.Ncp==0)?14:12),2,1); + write_output("H00.m","h00",&(ue->common_vars.dl_ch_estimates[0][0][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1); - write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],3*12*phy_vars_ue->lte_frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*12*phy_vars_ue->lte_frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_llr.m","pdcch_llr",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->llr,2400,1,4); + write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",ue->pdcch_vars[eNB_id]->rxdataF_ext[0],3*12*ue->frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",ue->pdcch_vars[eNB_id]->rxdataF_comp[0],4*12*ue->frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",ue->pdcch_vars[eNB_id]->llr,2400,1,4); mac_xface->macphy_exit("debug exit"); } */ @@ -2344,7 +2344,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } -int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, +int phy_procedures_UE_RX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) { @@ -2364,20 +2364,20 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac uint8_t sync_area=255; int pmch_mcs=-1; uint8_t mcch_active=0; - int frame_rx = phy_vars_ue->frame_rx; - int slot_rx = phy_vars_ue->slot_rx; + int frame_rx = ue->frame_rx; + int slot_rx = ue->slot_rx; int subframe_rx = slot_rx>>1; int subframe_prev = (subframe_rx+9)%10; - int CC_id = phy_vars_ue->CC_id; + int CC_id = ue->CC_id; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN); - start_meas(&phy_vars_ue->phy_proc_rx); + start_meas(&ue->phy_proc_rx); #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX(%d)\n", (r_type == multicast_relay) ? "RN/UE" : "UE", - phy_vars_ue->Mod_id,frame_rx, subframe_rx, slot_rx); + ue->Mod_id,frame_rx, subframe_rx, slot_rx); #endif #ifdef EMOS @@ -2390,13 +2390,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac LOG_D(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n", frame_rx, openair_daq_vars.use_ia_receiver, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs, - phy_vars_ue->bitrate[eNB_id]); + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs, + ue->bitrate[eNB_id]); } #endif - if (phy_vars_ue->lte_frame_parms.Ncp == 0) { // normal prefix + if (ue->frame_parms.Ncp == 0) { // normal prefix pilot1 = 4; pilot2 = 7; pilot3 = 11; @@ -2407,14 +2407,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - if (subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx) == SF_S) { + if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { if ((slot_rx%2)==0) n_symb = 5;//3; else n_symb = 0; } else { /* - if (is_pmch_subframe(frame_rx,subframe_rx,&phy_vars_ue->lte_frame_parms)) { + if (is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms)) { if ((slot_rx%2)==0) { n_symb=2; pmch_flag=1; @@ -2423,7 +2423,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac n_symb=0; } else*/ - n_symb = phy_vars_ue->lte_frame_parms.symbols_per_tti/2; + n_symb = ue->frame_parms.symbols_per_tti/2; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -2434,62 +2434,62 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac for (l=0; lofdm_demod_stats); + start_meas(&ue->ofdm_demod_stats); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); - slot_fep(phy_vars_ue, + slot_fep(ue, l, slot_rx, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->ofdm_demod_stats); + stop_meas(&ue->ofdm_demod_stats); } - //if (subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx) == SF_DL) - lte_ue_measurement_procedures(l,phy_vars_ue,eNB_id,abstraction_flag,mode); + //if (subframe_select(&ue->frame_parms,subframe_rx) == SF_DL) + ue_measurement_procedures(l,ue,eNB_id,abstraction_flag,mode); - if ((slot_rx==1) && (l==4-phy_vars_ue->lte_frame_parms.Ncp)) { + if ((slot_rx==1) && (l==4-ue->frame_parms.Ncp)) { /* - phy_vars_ue->ulsch_no_allocation_counter[eNB_id]++; + ue->ulsch_no_allocation_counter[eNB_id]++; - if (phy_vars_ue->ulsch_no_allocation_counter[eNB_id] == 10) { + if (ue->ulsch_no_allocation_counter[eNB_id] == 10) { #ifdef DEBUG_PHY_PROC - msg("[UE %d] no_allocation : setting mode to PRACH\n",phy_vars_ue->Mod_id); + msg("[UE %d] no_allocation : setting mode to PRACH\n",ue->Mod_id); #endif - phy_vars_ue->UE_mode[eNB_id] = PRACH; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti = 0x1234; + ue->UE_mode[eNB_id] = PRACH; + ue->pdcch_vars[eNB_id]->crnti = 0x1234; } */ - lte_ue_pbch_procedures(eNB_id,phy_vars_ue,abstraction_flag); + ue_pbch_procedures(eNB_id,ue,abstraction_flag); /* - if (phy_vars_ue->UE_mode[eNB_id] == RA_RESPONSE) { - phy_vars_ue->Msg3_timer[eNB_id]--; - msg("[UE RAR] frame %d: Msg3_timer %d\n",frame_rx,phy_vars_ue->Msg3_timer); + if (ue->UE_mode[eNB_id] == RA_RESPONSE) { + ue->Msg3_timer[eNB_id]--; + msg("[UE RAR] frame %d: Msg3_timer %d\n",frame_rx,ue->Msg3_timer); - if (phy_vars_ue->Msg3_timer[eNB_id] == 0) { - LOG_D(PHY,"[UE %d] Frame %d: Msg3_timer = 0 : setting mode to PRACH\n",phy_vars_ue->Mod_id,frame_rx); + if (ue->Msg3_timer[eNB_id] == 0) { + LOG_D(PHY,"[UE %d] Frame %d: Msg3_timer = 0 : setting mode to PRACH\n",ue->Mod_id,frame_rx); // I guess here we also need to tell the RRC - phy_vars_ue->UE_mode[eNB_id] = PRACH; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti = 0x1234; + ue->UE_mode[eNB_id] = PRACH; + ue->pdcch_vars[eNB_id]->crnti = 0x1234; } } */ } #ifdef DLSCH_THREAD - if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) { + if (ue->dlsch[eNB_id][0]->active == 1) { // activate thread since Chest is now done for slot before slot_rx if (l==0) { - LOG_I(PHY,"frame %d, slot_rx %d: Calling rx_pdsch_thread for harq_pid %d\n",frame_rx,slot_rx, phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); + LOG_I(PHY,"frame %d, slot_rx %d: Calling rx_pdsch_thread for harq_pid %d\n",frame_rx,slot_rx, ue->dlsch[eNB_id][0]->current_harq_pid); if (pthread_mutex_lock (&rx_pdsch_mutex) != 0) { // Signal MAC_PHY Scheduler - LOG_E(PHY,"[UE %d] ERROR pthread_mutex_lock\n",phy_vars_ue->Mod_id); // lock before accessing shared resource + LOG_E(PHY,"[UE %d] ERROR pthread_mutex_lock\n",ue->Mod_id); // lock before accessing shared resource VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); } else { rx_pdsch_instance_cnt++; @@ -2498,18 +2498,18 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac if (rx_pdsch_instance_cnt == 0) { if (pthread_cond_signal(&rx_pdsch_cond) != 0) { - LOG_E(PHY,"[UE %d] ERROR pthread_cond_signal for rx_pdsch_cond\n",phy_vars_ue->Mod_id); + LOG_E(PHY,"[UE %d] ERROR pthread_cond_signal for rx_pdsch_cond\n",ue->Mod_id); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); } } else { - LOG_W(PHY,"[UE %d] Frame=%d, Slot=%d, RX_PDSCH thread for rx_pdsch_thread busy!!!\n",phy_vars_ue->Mod_id,frame_rx,slot_rx); + LOG_W(PHY,"[UE %d] Frame=%d, Slot=%d, RX_PDSCH thread for rx_pdsch_thread busy!!!\n",ue->Mod_id,frame_rx,slot_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); } } // trigger DLSCH decoding thread if ((slot_rx%2)==1) // odd slots - phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0; + ue->dlsch[eNB_id][0]->active = 0; } } @@ -2518,19 +2518,19 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac // process last DLSCH symbols + invoke decoding if (((slot_rx%2)==0) && (l==0)) { // Regular PDSCH - LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",phy_vars_ue->Mod_id,subframe_prev,phy_vars_ue->dlsch_ue[eNB_id][0]->active); + LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",ue->Mod_id,subframe_prev,ue->dlsch[eNB_id][0]->active); - if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) { + if (ue->dlsch[eNB_id][0]->active == 1) { #ifndef DLSCH_THREAD //USER_MODE - harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid; - LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",phy_vars_ue->Mod_id,subframe_prev,harq_pid); + harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; + LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",ue->Mod_id,subframe_prev,harq_pid); - if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && - (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (phy_vars_ue->use_ia_receiver ==1)) { + if ((ue->transmission_mode[eNB_id] == 5) && + (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && + (ue->use_ia_receiver ==1)) { dual_stream_UE = 1; - eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; + eNB_id_i = ue->n_connected_eNB; + i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; if (frame_rx%100==0) { LOG_I(PHY,"using IA receiver\n"); @@ -2544,11 +2544,11 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac // process symbols 10,11,12 and trigger DLSCH decoding if (abstraction_flag == 0) { - start_meas(&phy_vars_ue->dlsch_llr_stats); + start_meas(&ue->dlsch_llr_stats); - for (m=pilot3; mlte_frame_parms.symbols_per_tti; m++) { + for (m=pilot3; mframe_parms.symbols_per_tti; m++) { - rx_pdsch(phy_vars_ue, + rx_pdsch(ue, PDSCH, eNB_id, eNB_id_i, @@ -2557,157 +2557,157 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac 0, // first_symbol_flag dual_stream_UE, i_mod, - phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); + ue->dlsch[eNB_id][0]->current_harq_pid); } - stop_meas(&phy_vars_ue->dlsch_llr_stats); + stop_meas(&ue->dlsch_llr_stats); } - phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0; + ue->dlsch[eNB_id][0]->active = 0; //#ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, + ue->Mod_id, + ue->dlsch[eNB_id][0]->rnti, harq_pid, (subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev); //#endif - if (phy_vars_ue->dlsch_ue[eNB_id][0]) { + if (ue->dlsch[eNB_id][0]) { if (abstraction_flag == 0) { - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, frame_rx,subframe_prev); - start_meas(&phy_vars_ue->dlsch_unscrambling_stats); - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, + start_meas(&ue->dlsch_unscrambling_stats); + dlsch_unscrambling(&ue->frame_parms, 0, - phy_vars_ue->dlsch_ue[0][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], + ue->dlsch[0][0], + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G, + ue->pdsch_vars[eNB_id]->llr[0], 0, subframe_prev<<1); - stop_meas(&phy_vars_ue->dlsch_unscrambling_stats); + stop_meas(&ue->dlsch_unscrambling_stats); - start_meas(&phy_vars_ue->dlsch_decoding_stats); - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid], + start_meas(&ue->dlsch_decoding_stats); + ret = dlsch_decoding(ue, + ue->pdsch_vars[eNB_id]->llr[0], + &ue->frame_parms, + ue->dlsch[eNB_id][0], + ue->dlsch[eNB_id][0]->harq_processes[harq_pid], subframe_prev, harq_pid, - 1,phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb>10 ? 1 : 0); - stop_meas(&phy_vars_ue->dlsch_decoding_stats); + 1,ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb>10 ? 1 : 0); + stop_meas(&ue->dlsch_decoding_stats); } else { LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); #ifdef PHY_ABSTRACTION - ret = dlsch_decoding_emul(phy_vars_ue, + ret = dlsch_decoding_emul(ue, subframe_prev, 2, eNB_id); #endif } - if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) { - phy_vars_ue->dlsch_errors[eNB_id]++; + if (ret == (1+ue->dlsch[eNB_id][0]->max_turbo_iterations)) { + ue->dlsch_errors[eNB_id]++; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, + ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, harq_pid,frame_rx,subframe_prev, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); /* if (abstraction_flag ==0 ) - dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); + dump_dlsch(ue,eNB_id,subframe_prev,harq_pid); mac_xface->macphy_exit(""); */ #endif } else { LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, + ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, harq_pid,frame_rx,subframe_prev,slot_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); #ifdef DEBUG_PHY_PROC #ifdef DEBUG_DLSCH int j; - LOG_D(PHY,"dlsch harq_pid %d (rx): \n",phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); + LOG_D(PHY,"dlsch harq_pid %d (rx): \n",ue->dlsch[eNB_id][0]->current_harq_pid); - for (j=0; jdlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b[j]); + for (j=0; jdlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b[j]); LOG_T(PHY,"\n"); #endif #endif - if (phy_vars_ue->mac_enabled == 1) { - mac_xface->ue_send_sdu(phy_vars_ue->Mod_id, + if (ue->mac_enabled == 1) { + mac_xface->ue_send_sdu(ue->Mod_id, CC_id, frame_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3, + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b, + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3, eNB_id); } - phy_vars_ue->total_TBS[eNB_id] = phy_vars_ue->total_TBS[eNB_id] + - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS; - phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_TBS[eNB_id] + - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS; + ue->total_TBS[eNB_id] = ue->total_TBS[eNB_id] + + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS; + ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] + + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS; } } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid, + ue->Mod_id, + ue->dlsch[eNB_id][0]->rnti,harq_pid, frame_rx,subframe_prev,ret, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); if (frame_rx%100==0) { LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, + ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, frame_rx,subframe_prev, - phy_vars_ue->dlsch_errors[eNB_id], - phy_vars_ue->dlsch_received[eNB_id], - phy_vars_ue->dlsch_fer[eNB_id], - phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id]); + ue->dlsch_errors[eNB_id], + ue->dlsch_received[eNB_id], + ue->dlsch_fer[eNB_id], + ue->measurements.wideband_cqi_tot[eNB_id]); } #endif #endif //DLSCH_THREAD } else { // printf("PDSCH inactive in subframe %d\n",subframe_rx-1); - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_prev].send_harq_status = 0; + ue->dlsch[eNB_id][0]->harq_ack[subframe_prev].send_harq_status = 0; } // SI_DLSCH - if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) { + if (ue->dlsch_SI[eNB_id]->active == 1) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev); #endif // process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding if (abstraction_flag==0) { - start_meas(&phy_vars_ue->dlsch_llr_stats); + start_meas(&ue->dlsch_llr_stats); - for (m=pilot3; mlte_frame_parms.symbols_per_tti; m++) { + for (m=pilot3; mframe_parms.symbols_per_tti; m++) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] Frame %d, slot %d: DLSCH (SI) demod between pilot 3 and 4 (2nd slot), m %d\n", - phy_vars_ue->Mod_id,frame_rx,slot_rx,m); + ue->Mod_id,frame_rx,slot_rx,m); #endif - rx_pdsch(phy_vars_ue, + rx_pdsch(ue, SI_PDSCH, eNB_id, eNB_id+1, @@ -2715,64 +2715,64 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac m, 0, 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid); + ue->is_secondary_ue, + ue->dlsch_SI[eNB_id]->current_harq_pid); } - stop_meas(&phy_vars_ue->dlsch_llr_stats); + stop_meas(&ue->dlsch_llr_stats); } - // write_output("dlsch_ra_llr.m","llr",lte_ue_pdsch_vars_ra[eNB_id]->llr[0],40,1,0); + // write_output("dlsch_ra_llr.m","llr",pdsch_vars_ra[eNB_id]->llr[0],40,1,0); - phy_vars_ue->dlsch_ue_SI[eNB_id]->active = 0; + ue->dlsch_SI[eNB_id]->active = 0; - if (frame_rx < phy_vars_ue->dlsch_SI_errors[eNB_id]) - phy_vars_ue->dlsch_SI_errors[eNB_id]=0; + if (frame_rx < ue->dlsch_SI_errors[eNB_id]) + ue->dlsch_SI_errors[eNB_id]=0; - if (phy_vars_ue->dlsch_ue_SI[eNB_id]) { + if (ue->dlsch_SI[eNB_id]) { if (abstraction_flag==0) { - // dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G = - get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even, + // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + ue->dlsch_SI[eNB_id]->harq_processes[0]->G = + get_G(&ue->frame_parms, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, 2, 1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, frame_rx,subframe_prev); #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols); + LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->G, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols); #endif - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, + dlsch_unscrambling(&ue->frame_parms, 0, - phy_vars_ue->dlsch_ue_SI[eNB_id], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G, - phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0], + ue->dlsch_SI[eNB_id], + ue->dlsch_SI[eNB_id]->harq_processes[0]->G, + ue->pdsch_vars_SI[eNB_id]->llr[0], 0, subframe_prev<<1); - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_SI[eNB_id], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0], + ret = dlsch_decoding(ue, + ue->pdsch_vars_SI[eNB_id]->llr[0], + &ue->frame_parms, + ue->dlsch_SI[eNB_id], + ue->dlsch_SI[eNB_id]->harq_processes[0], subframe_prev, - phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid, + ue->dlsch_SI[eNB_id]->current_harq_pid, 0,0); #ifdef DEBUG_PHY_PROC for (int i=0; i<11; i++) - LOG_D(PHY,"dlsch_output_buffer[%d]=%x\n",i,phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->c[0][i]); + LOG_D(PHY,"dlsch_output_buffer[%d]=%x\n",i,ue->dlsch_SI[eNB_id]->harq_processes[0]->c[0][i]); #endif @@ -2781,7 +2781,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac #ifdef PHY_ABSTRACTION else { LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); - ret = dlsch_decoding_emul(phy_vars_ue, + ret = dlsch_decoding_emul(ue, subframe_prev, 0, eNB_id); @@ -2789,25 +2789,25 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac #endif - if (ret == (1+phy_vars_ue->dlsch_ue_SI[eNB_id]->max_turbo_iterations)) { - phy_vars_ue->dlsch_SI_errors[eNB_id]++; + if (ret == (1+ue->dlsch_SI[eNB_id]->max_turbo_iterations)) { + ue->dlsch_SI_errors[eNB_id]++; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx, subframe_prev, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rvidx, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, + ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); #endif - // dump_dlsch_SI(phy_vars_ue,eNB_id,subframe_prev); + // dump_dlsch_SI(ue,eNB_id,subframe_prev); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_rx); + stop_meas(&ue->phy_proc_rx); return(-1); } else { @@ -2815,29 +2815,29 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac #ifdef DEBUG_PHY_PROC //if ((frame_rx % 100) == 0) LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", - phy_vars_ue->Mod_id,frame_rx,subframe_prev, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rvidx, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); + ue->Mod_id,frame_rx,subframe_prev, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, + ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); #endif - if (phy_vars_ue->mac_enabled == 1) { + if (ue->mac_enabled == 1) { /* printf("\n\n"); - for (i=0;idlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++) - printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]); + for (i=0;idlsch_SI[eNB_id]->harq_processes[0]->TBS>>3;i++) + printf("%02x ",ue->dlsch_SI[eNB_id]->harq_processes[0]->b[i]); printf("\n"); */ - mac_xface->ue_decode_si(phy_vars_ue->Mod_id, + mac_xface->ue_decode_si(ue->Mod_id, CC_id, frame_rx, eNB_id, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3); + ue->dlsch_SI[eNB_id]->harq_processes[0]->b, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); } } } @@ -2845,23 +2845,23 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac /* #ifdef DEBUG_PHY_PROC debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: dlsch_decoding (SI) ret %d (%d errors)\n", - phy_vars_ue->Mod_id,frame_rx,slot_rx,ret,phy_vars_ue->dlsch_SI_errors[eNB_id]); + ue->Mod_id,frame_rx,slot_rx,ret,ue->dlsch_SI_errors[eNB_id]); #endif */ } - if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1) { + if (ue->dlsch_ra[eNB_id]->active == 1) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: DLSCH (RA) demod symbols 10,11,12\n",phy_vars_ue->Mod_id,frame_rx,slot_rx); + LOG_D(PHY,"[UE %d] Frame %d, slot %d: DLSCH (RA) demod symbols 10,11,12\n",ue->Mod_id,frame_rx,slot_rx); #endif // process symbols 10,11,12 and trigger DLSCH decoding if (abstraction_flag==0) { - start_meas(&phy_vars_ue->dlsch_llr_stats); + start_meas(&ue->dlsch_llr_stats); - for (m=pilot3; mlte_frame_parms.symbols_per_tti; m++) - rx_pdsch(phy_vars_ue, + for (m=pilot3; mframe_parms.symbols_per_tti; m++) + rx_pdsch(ue, RA_PDSCH, eNB_id, eNB_id+1, @@ -2869,65 +2869,65 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac m, // symbol 0, // first_symbol_flag 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid); + ue->is_secondary_ue, + ue->dlsch_ra[eNB_id]->current_harq_pid); } - stop_meas(&phy_vars_ue->dlsch_llr_stats); + stop_meas(&ue->dlsch_llr_stats); - phy_vars_ue->dlsch_ue_ra[eNB_id]->active = 0; + ue->dlsch_ra[eNB_id]->active = 0; - if (frame_rx < phy_vars_ue->dlsch_ra_errors[eNB_id]) - phy_vars_ue->dlsch_ra_errors[eNB_id]=0; + if (frame_rx < ue->dlsch_ra_errors[eNB_id]) + ue->dlsch_ra_errors[eNB_id]=0; - if (phy_vars_ue->prach_resources[eNB_id]!=NULL) - phy_vars_ue->dlsch_ue_ra[eNB_id]->rnti = phy_vars_ue->prach_resources[eNB_id]->ra_RNTI; + if (ue->prach_resources[eNB_id]!=NULL) + ue->dlsch_ra[eNB_id]->rnti = ue->prach_resources[eNB_id]->ra_RNTI; else { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev); + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",ue->Mod_id,frame_rx,subframe_prev); mac_xface->macphy_exit("prach_resources is NULL"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_rx); + stop_meas(&ue->phy_proc_rx); return 0; } if (abstraction_flag==0) { - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even, + ue->dlsch_ra[eNB_id]->harq_processes[0]->G = get_G(&ue->frame_parms, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even, 2, 1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, frame_rx, subframe_prev); #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE] decoding RA (subframe %d): G %d,rnti %x\n" ,subframe_prev, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G, - phy_vars_ue->dlsch_ue_ra[eNB_id]->rnti); + ue->dlsch_ra[eNB_id]->harq_processes[0]->G, + ue->dlsch_ra[eNB_id]->rnti); #endif - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, + dlsch_unscrambling(&ue->frame_parms, 0, - phy_vars_ue->dlsch_ue_ra[eNB_id], - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G, - phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]->llr[0], + ue->dlsch_ra[eNB_id], + ue->dlsch_ra[eNB_id]->harq_processes[0]->G, + ue->pdsch_vars_ra[eNB_id]->llr[0], 0, subframe_prev<<1); - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_ra[eNB_id], - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0], + ret = dlsch_decoding(ue, + ue->pdsch_vars_ra[eNB_id]->llr[0], + &ue->frame_parms, + ue->dlsch_ra[eNB_id], + ue->dlsch_ra[eNB_id]->harq_processes[0], subframe_prev, // subframe - phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid, + ue->dlsch_ra[eNB_id]->current_harq_pid, 0,0); } #ifdef PHY_ABSTRACTION else { LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); - ret = dlsch_decoding_emul(phy_vars_ue, + ret = dlsch_decoding_emul(ue, subframe_prev, 1, eNB_id); @@ -2935,98 +2935,98 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac #endif - if (ret == (1+phy_vars_ue->dlsch_ue_ra[eNB_id]->max_turbo_iterations)) { - phy_vars_ue->dlsch_ra_errors[eNB_id]++; - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received RA in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev); + if (ret == (1+ue->dlsch_ra[eNB_id]->max_turbo_iterations)) { + ue->dlsch_ra_errors[eNB_id]++; + LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received RA in error\n",ue->Mod_id,frame_rx,subframe_prev); - // dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev); exit(-1); + // dump_dlsch_ra(ue,eNB_id,subframe_prev); exit(-1); // oai_exit=1; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_rx); + stop_meas(&ue->phy_proc_rx); return(-1); } else { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Received RAR mode %d\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx, - subframe_prev, phy_vars_ue->UE_mode[eNB_id]); + subframe_prev, ue->UE_mode[eNB_id]); #endif - if (phy_vars_ue->mac_enabled == 1) { - if ((phy_vars_ue->UE_mode[eNB_id] != PUSCH) && (phy_vars_ue->prach_resources[eNB_id]->Msg3!=NULL)) { + if (ue->mac_enabled == 1) { + if ((ue->UE_mode[eNB_id] != PUSCH) && (ue->prach_resources[eNB_id]->Msg3!=NULL)) { LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n", - phy_vars_ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0), + ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0), subframe_prev, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex); + ue->prach_resources[eNB_id]->ra_PreambleIndex); - timing_advance = mac_xface->ue_process_rar(phy_vars_ue->Mod_id, + timing_advance = mac_xface->ue_process_rar(ue->Mod_id, CC_id, frame_rx-((subframe_prev==0) ? 1 : 0), - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b, - &phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex); + ue->dlsch_ra[eNB_id]->harq_processes[0]->b, + &ue->pdcch_vars[eNB_id]->crnti, + ue->prach_resources[eNB_id]->ra_PreambleIndex); if (timing_advance!=0xffff) { LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Got rnti %x and timing advance %d from RAR\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx-((subframe_prev==9) ? 1 : 0), subframe_prev, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + ue->pdcch_vars[eNB_id]->crnti, timing_advance); //timing_advance = 0; - process_timing_advance_rar(phy_vars_ue,timing_advance); + process_timing_advance_rar(ue,timing_advance); if (mode!=debug_prach) { - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id]=1; - get_Msg3_alloc(&phy_vars_ue->lte_frame_parms, + ue->ulsch_Msg3_active[eNB_id]=1; + get_Msg3_alloc(&ue->frame_parms, subframe_prev, frame_rx-((subframe_prev==9) ? 1 : 0), - &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); + &ue->ulsch_Msg3_frame[eNB_id], + &ue->ulsch_Msg3_subframe[eNB_id]); LOG_D(PHY,"[UE %d][RAPROC] Got Msg3_alloc Frame %d subframe %d: Msg3_frame %d, Msg3_subframe %d\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx-((subframe_prev==9) ? 1 : 0), subframe_prev, - phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); - harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round = 0; + ue->ulsch_Msg3_frame[eNB_id], + ue->ulsch_Msg3_subframe[eNB_id]); + harq_pid = subframe2harq_pid(&ue->frame_parms, + ue->ulsch_Msg3_frame[eNB_id], + ue->ulsch_Msg3_subframe[eNB_id]); + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; - phy_vars_ue->UE_mode[eNB_id] = RA_RESPONSE; - // phy_vars_ue->Msg3_timer[eNB_id] = 10; - phy_vars_ue->ulsch_ue[eNB_id]->power_offset = 6; - phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0; + ue->UE_mode[eNB_id] = RA_RESPONSE; + // ue->Msg3_timer[eNB_id] = 10; + ue->ulsch[eNB_id]->power_offset = 6; + ue->ulsch_no_allocation_counter[eNB_id] = 0; } } else { // PRACH preamble doesn't match RAR LOG_W(PHY,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n", - phy_vars_ue->Mod_id, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex); + ue->Mod_id, + ue->prach_resources[eNB_id]->ra_PreambleIndex); } } // mode != PUSCH } else { - rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1; + rar = ue->dlsch_ra[eNB_id]->harq_processes[0]->b+1; timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); - //timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0]; - process_timing_advance_rar(phy_vars_ue,timing_advance); + //timing_advance = ue->dlsch_ra[eNB_id]->harq_processes[0]->b[0]; + process_timing_advance_rar(ue,timing_advance); } } //ret <= MAX_ITERATIONS /* #ifdef DEBUG_PHY_PROC debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: dlsch_decoding (RA) ret %d (%d errors)\n", - phy_vars_ue->Mod_id,frame_rx,slot_rx,ret,phy_vars_ue->dlsch_ra_errors[eNB_id]); + ue->Mod_id,frame_rx,slot_rx,ret,ue->dlsch_ra_errors[eNB_id]); #endif */ - } // dlsch_ue_ra[eNB_id]->active == 1 + } // dlsch_ra[eNB_id]->active == 1 } @@ -3035,13 +3035,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac ((pmch_flag==1)&&(l==1))) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: Calling pdcch procedures (eNB %d)\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,eNB_id); + LOG_D(PHY,"[UE %d] Frame %d, slot %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,slot_rx,eNB_id); #endif // rt_printk("[PDCCH] Frame %d, slot %d, start %llu\n",frame_rx,slot_rx,rt_get_time_ns()); - if (lte_ue_pdcch_procedures(eNB_id,phy_vars_ue,abstraction_flag) == -1) { + if (ue_pdcch_procedures(eNB_id,ue,abstraction_flag) == -1) { #ifdef DEBUG_PHY_PROC - LOG_E(PHY,"[UE %d] Frame %d, slot %d: Error in pdcch procedures\n",phy_vars_ue->Mod_id,frame_rx,slot_rx); + LOG_E(PHY,"[UE %d] Frame %d, slot %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,slot_rx); #endif return(-1); } @@ -3049,31 +3049,31 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac // rt_printk("[PDCCH] Frame %d, slot %d, stop %llu\n",frame_rx,slot_rx,rt_get_time_ns()); #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"num_pdcch_symbols %d\n",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols); + LOG_D(PHY,"num_pdcch_symbols %d\n",ue->pdcch_vars[eNB_id]->num_pdcch_symbols); #endif } if (abstraction_flag==0) { if (((slot_rx%2)==1) && (l==0)) { - start_meas(&phy_vars_ue->dlsch_llr_stats); + start_meas(&ue->dlsch_llr_stats); - for (m=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; + for (m=ue->pdcch_vars[eNB_id]->num_pdcch_symbols; mdlsch_ue[eNB_id][0]->active == 1) { - harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid; - LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,harq_pid); + if (ue->dlsch[eNB_id][0]->active == 1) { + harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; + LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",ue->Mod_id,subframe_rx,slot_rx,harq_pid); - if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && - (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (phy_vars_ue->use_ia_receiver ==1)) { + if ((ue->transmission_mode[eNB_id] == 5) && + (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && + (ue->use_ia_receiver ==1)) { dual_stream_UE = 1; - eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; + eNB_id_i = ue->n_connected_eNB; + i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; } else { dual_stream_UE = 0; eNB_id_i = eNB_id+1; @@ -3082,74 +3082,74 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac // process DLSCH received in first slot - rx_pdsch(phy_vars_ue, + rx_pdsch(ue, PDSCH, eNB_id, eNB_id_i, subframe_rx, // subframe, m, - (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag + (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag dual_stream_UE, i_mod, - phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); + ue->dlsch[eNB_id][0]->current_harq_pid); } // CRNTI active #endif - if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) { + if (ue->dlsch_SI[eNB_id]->active == 1) { // process SI DLSCH in first slot - rx_pdsch(phy_vars_ue, + rx_pdsch(ue, SI_PDSCH, eNB_id, eNB_id+1, subframe_rx, // subframe, m, - (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag + (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid); + ue->is_secondary_ue, + ue->dlsch_SI[eNB_id]->current_harq_pid); } // SI active - if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1) { - rx_pdsch(phy_vars_ue, + if (ue->dlsch_ra[eNB_id]->active == 1) { + rx_pdsch(ue, RA_PDSCH, eNB_id, eNB_id+1, subframe_rx, // subframe, m, - (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, + (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid); + ue->is_secondary_ue, + ue->dlsch_ra[eNB_id]->current_harq_pid); } // RA active } // loop from first dlsch symbol to end of slot - stop_meas(&phy_vars_ue->dlsch_llr_stats); + stop_meas(&ue->dlsch_llr_stats); } // 2nd quarter if (((slot_rx%2)==1) && (l==pilot1)) { - start_meas(&phy_vars_ue->dlsch_llr_stats); + start_meas(&ue->dlsch_llr_stats); for (m=pilot2; mdlsch_ue[eNB_id][0]->active == 1) { - harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid; + if (ue->dlsch[eNB_id][0]->active == 1) { + harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; - if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && - (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (phy_vars_ue->use_ia_receiver ==1)) { + if ((ue->transmission_mode[eNB_id] == 5) && + (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && + (ue->use_ia_receiver ==1)) { dual_stream_UE = 1; - eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; + eNB_id_i = ue->n_connected_eNB; + i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; } else { dual_stream_UE = 0; eNB_id_i = eNB_id+1; i_mod = 0; } - rx_pdsch(phy_vars_ue, + rx_pdsch(ue, PDSCH, eNB_id, eNB_id_i, @@ -3158,13 +3158,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac 0, dual_stream_UE, i_mod, - phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); + ue->dlsch[eNB_id][0]->current_harq_pid); } // CRNTI active #endif - if(phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) { - rx_pdsch(phy_vars_ue, + if(ue->dlsch_SI[eNB_id]->active == 1) { + rx_pdsch(ue, SI_PDSCH, eNB_id, eNB_id+1, @@ -3172,12 +3172,12 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac m, 0, // first_symbol_flag 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid); + ue->is_secondary_ue, + ue->dlsch_SI[eNB_id]->current_harq_pid); } // SI active - if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1) { - rx_pdsch(phy_vars_ue, + if (ue->dlsch_ra[eNB_id]->active == 1) { + rx_pdsch(ue, RA_PDSCH, eNB_id, eNB_id+1, @@ -3185,13 +3185,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac m, 0, // first_symbol_flag 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid); + ue->is_secondary_ue, + ue->dlsch_ra[eNB_id]->current_harq_pid); } // RA active } // loop over 3rd quarter - stop_meas(&phy_vars_ue->dlsch_llr_stats); + stop_meas(&ue->dlsch_llr_stats); } // 3rd quarter of subframe } // abstraction_flag==0 }// l loop @@ -3199,33 +3199,33 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac // calculate some statistics if (slot_rx==19) { if (frame_rx % 10 == 0) { - if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0) - phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]); + if ((ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]) != 0) + ue->dlsch_fer[eNB_id] = (100*(ue->dlsch_errors[eNB_id] - ue->dlsch_errors_last[eNB_id]))/(ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]); - phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id]; - phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id]; + ue->dlsch_errors_last[eNB_id] = ue->dlsch_errors[eNB_id]; + ue->dlsch_received_last[eNB_id] = ue->dlsch_received[eNB_id]; } - phy_vars_ue->bitrate[eNB_id] = (phy_vars_ue->total_TBS[eNB_id] - phy_vars_ue->total_TBS_last[eNB_id])*100; - phy_vars_ue->total_TBS_last[eNB_id] = phy_vars_ue->total_TBS[eNB_id]; + ue->bitrate[eNB_id] = (ue->total_TBS[eNB_id] - ue->total_TBS_last[eNB_id])*100; + ue->total_TBS_last[eNB_id] = ue->total_TBS[eNB_id]; LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n", - phy_vars_ue->Mod_id,frame_rx,phy_vars_ue->total_TBS[eNB_id], - phy_vars_ue->total_TBS_last[eNB_id],(float) phy_vars_ue->bitrate[eNB_id]/1000.0); + ue->Mod_id,frame_rx,ue->total_TBS[eNB_id], + ue->total_TBS_last[eNB_id],(float) ue->bitrate[eNB_id]/1000.0); /* if ((frame_rx % 100 == 0)) { - LOG_I(PHY,"Throughput %5.1f kbps\n",(float) phy_vars_ue->bitrate[eNB_id]/1000.0); + LOG_I(PHY,"Throughput %5.1f kbps\n",(float) ue->bitrate[eNB_id]/1000.0); } */ } - if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&phy_vars_ue->lte_frame_parms)) { + if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&ue->frame_parms)) { LOG_D(PHY,"ue calling pmch subframe ..\n "); if ((slot_rx%2)==1) { LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n", - phy_vars_ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,slot_rx); + ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,slot_rx); #ifdef Rel10 - pmch_mcs = mac_xface->ue_query_mch(phy_vars_ue->Mod_id, + pmch_mcs = mac_xface->ue_query_mch(ue->Mod_id, CC_id, (subframe_rx==9?-1:0)+frame_rx, subframe_rx, @@ -3241,20 +3241,20 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac #endif if (pmch_mcs>=0) { - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",phy_vars_ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,pmch_mcs); - fill_UE_dlsch_MCH(phy_vars_ue,pmch_mcs,1,0,0); + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,pmch_mcs); + fill_UE_dlsch_MCH(ue,pmch_mcs,1,0,0); if (abstraction_flag == 0 ) { for (l=2; l<12; l++) { - slot_fep_mbsfn(phy_vars_ue, + slot_fep_mbsfn(ue, l, subframe_rx, - 0,0);//phy_vars_ue->rx_offset,0); + 0,0);//ue->rx_offset,0); } for (l=2; l<12; l++) { - rx_pmch(phy_vars_ue, + rx_pmch(ue, 0, subframe_rx, l); @@ -3265,31 +3265,31 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac /* printf("PMCH decoding, Frame %d, subframe %d, G %d\n", (subframe_rx==9?-1:0)+frame_rx, subframe_rx, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G); + ue->dlsch_MCH[0]->harq_processes[0]->G); */ - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc_even, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->Qm, + ue->dlsch_MCH[0]->harq_processes[0]->G = get_G(&ue->frame_parms, + ue->dlsch_MCH[0]->harq_processes[0]->nb_rb, + ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, + ue->dlsch_MCH[0]->harq_processes[0]->Qm, 1, 2, (subframe_rx==9?-1:0)+frame_rx,subframe_rx); - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,1,phy_vars_ue->dlsch_ue_MCH[0], - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G, - phy_vars_ue->lte_ue_pdsch_vars_MCH[0]->llr[0],0,subframe_prev<<1); + dlsch_unscrambling(&ue->frame_parms,1,ue->dlsch_MCH[0], + ue->dlsch_MCH[0]->harq_processes[0]->G, + ue->pdsch_vars_MCH[0]->llr[0],0,subframe_prev<<1); - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars_MCH[0]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_MCH[0], - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0], + ret = dlsch_decoding(ue, + ue->pdsch_vars_MCH[0]->llr[0], + &ue->frame_parms, + ue->dlsch_MCH[0], + ue->dlsch_MCH[0]->harq_processes[0], subframe_prev, 0, 0,1); } else { // abstraction #ifdef PHY_ABSTRACTION - ret = dlsch_decoding_emul(phy_vars_ue, + ret = dlsch_decoding_emul(ue, subframe_rx, 5, // PMCH eNB_id); @@ -3297,29 +3297,29 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac } if (mcch_active == 1) - phy_vars_ue->dlsch_mcch_trials[sync_area][0]++; + ue->dlsch_mcch_trials[sync_area][0]++; else - phy_vars_ue->dlsch_mtch_trials[sync_area][0]++; + ue->dlsch_mtch_trials[sync_area][0]++; - if (ret == (1+phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations)) { + if (ret == (1+ue->dlsch_MCH[0]->max_turbo_iterations)) { if (mcch_active == 1) - phy_vars_ue->dlsch_mcch_errors[sync_area][0]++; + ue->dlsch_mcch_errors[sync_area][0]++; else - phy_vars_ue->dlsch_mtch_errors[sync_area][0]++; + ue->dlsch_mtch_errors[sync_area][0]++; LOG_D(PHY,"[%s %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n", - (r_type == no_relay)? "UE": "RN/UE", phy_vars_ue->Mod_id, + (r_type == no_relay)? "UE": "RN/UE", ue->Mod_id, (subframe_rx==9?-1:0)+frame_rx,subframe_rx, - phy_vars_ue->dlsch_mcch_errors[sync_area][0], - phy_vars_ue->dlsch_mtch_errors[sync_area][0], - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3, - phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G); - dump_mch(phy_vars_ue,0,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G,subframe_rx); + ue->dlsch_mcch_errors[sync_area][0], + ue->dlsch_mtch_errors[sync_area][0], + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, + ue->dlsch_MCH[0]->max_turbo_iterations, + ue->dlsch_MCH[0]->harq_processes[0]->G); + dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx); #ifdef DEBUG_DLSCH - for (int i=0; idlsch_ue_MCH[0]->harq_processes[0]->TBS>>3; i++) { - LOG_T(PHY,"%02x.",phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->c[0][i]); + for (int i=0; idlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) { + LOG_T(PHY,"%02x.",ue->dlsch_MCH[0]->harq_processes[0]->c[0][i]); } LOG_T(PHY,"\n"); @@ -3331,44 +3331,44 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac #ifdef Rel10 if ((r_type == no_relay) || (mcch_active == 1)) { - mac_xface->ue_send_mch_sdu(phy_vars_ue->Mod_id, + mac_xface->ue_send_mch_sdu(ue->Mod_id, CC_id, frame_rx, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3, + ue->dlsch_MCH[0]->harq_processes[0]->b, + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, eNB_id,// not relevant in eMBMS context sync_area); - /* for (i=0;idlsch_ue_MCH[0]->harq_processes[0]->TBS>>3;i++) - msg("%2x.",phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b[i]); + /* for (i=0;idlsch_MCH[0]->harq_processes[0]->TBS>>3;i++) + msg("%2x.",ue->dlsch_MCH[0]->harq_processes[0]->b[i]); msg("\n"); */ if (mcch_active == 1) - phy_vars_ue->dlsch_mcch_received[sync_area][0]++; + ue->dlsch_mcch_received[sync_area][0]++; else - phy_vars_ue->dlsch_mtch_received[sync_area][0]++; + ue->dlsch_mtch_received[sync_area][0]++; - if (phy_vars_ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) { - phy_vars_ue->dlsch_mch_received_sf[subframe_rx%5][0]=0; + if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) { + ue->dlsch_mch_received_sf[subframe_rx%5][0]=0; } else { - phy_vars_ue->dlsch_mch_received[0]+=1; - phy_vars_ue->dlsch_mch_received_sf[subframe_rx][0]=1; + ue->dlsch_mch_received[0]+=1; + ue->dlsch_mch_received_sf[subframe_rx][0]=1; } } else if (r_type == multicast_relay) { // mcch is not active here // only 1 harq process exists // Fix me: this could be a pointer copy memcpy (phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3); + ue->dlsch_MCH[0]->harq_processes[0]->b, + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3); // keep the tbs phy_vars_rn->mch_avtive[subframe_rx] = 1; phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS; - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->mcs; + phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = ue->dlsch_MCH[0]->harq_processes[0]->TBS; + phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = ue->dlsch_MCH[0]->harq_processes[0]->mcs; LOG_D(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n", - phy_vars_ue->Mod_id, frame_rx,subframe_rx,sync_area, + ue->Mod_id, frame_rx,subframe_rx,sync_area, phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs, phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3); #ifdef DEBUG_PHY @@ -3379,7 +3379,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac msg("\n"); #endif } else - LOG_W(PHY,"[UE %d] Frame %d: not supported option\n",phy_vars_ue->Mod_id, frame_rx); + LOG_W(PHY,"[UE %d] Frame %d: not supported option\n",ue->Mod_id, frame_rx); #endif } @@ -3388,11 +3388,11 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac } #ifdef EMOS - phy_procedures_emos_UE_RX(phy_vars_ue,slot_rx,eNB_id); + phy_procedures_emos_UE_RX(ue,slot_rx,eNB_id); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_rx); + stop_meas(&ue->phy_proc_rx); return (0); } @@ -3426,136 +3426,7 @@ int phy_procedures_RN_UE_RX(uint8_t slot_rx, uint8_t next_slot, relaying_type_t #endif -#if defined(ENABLE_ITTI) -# if ENABLE_RAL -extern PHY_MEASUREMENTS PHY_measurements; - -void phy_UE_lte_measurement_thresholds_test_and_report(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP, uint16_t valP) -{ - MessageDef *message_p = NULL; - - if ( - ( - (((short) threshold_phy_pP->threshold.threshold_val < (short) valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) || - (((short)threshold_phy_pP->threshold.threshold_val > (short)valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD)) - ) || - (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD) - ) { - message_p = itti_alloc_new_message(TASK_PHY_UE , PHY_MEAS_REPORT_IND); - memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p))); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold, - &threshold_phy_pP->threshold, - sizeof(PHY_MEAS_REPORT_IND (message_p).threshold)); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param, - &threshold_phy_pP->link_param, - sizeof(PHY_MEAS_REPORT_IND (message_p).link_param)); - - switch (threshold_phy_pP->link_param.choice) { - case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL: - PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP; - break; - - case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL: - //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val. - AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n"); - break; - } - - //LOG_I(PHY,"[XXX] Sending link parameters report msg message to RRC\n"); - itti_send_msg_to_task(TASK_RRC_UE, instanceP, message_p); - } -} - -void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) -{ - unsigned int mod_id; - int CC_id = 0; // this should become the function argument, requested by the upper layers. - - mod_id = instanceP - NB_eNB_INST; - - switch (threshold_phy_pP->link_param.link_param_type.choice) { - - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_GEN_DATA_RATE: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_SINR: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_THROUGHPUT: - break; - - default: - ; - } - - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_LTE_UE_RSRP: - // phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id]->PHY_measurements.rx_rssi_dBm[0]); - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.rsrp[0]); - break; - - case RAL_LINK_PARAM_LTE_UE_RSRQ: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.rsrq[0]); - break; - - case RAL_LINK_PARAM_LTE_UE_CQI: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.wideband_cqi_avg[0]); - break; - - case RAL_LINK_PARAM_LTE_AVAILABLE_BW: - break; - - case RAL_LINK_PARAM_LTE_PACKET_DELAY: - break; - - case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: - break; - - case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: - break; - - case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: - break; - - case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: - break; - - case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: - break; - - case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: - break; - - case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: - break; - - default: - LOG_W(PHY,"unknown message %d\n", threshold_phy_pP->link_param.link_param_type._union.link_param_gen); - } - - break; - - default: - LOG_W(PHY,"unknown message %d\n", threshold_phy_pP->link_param.link_param_type.choice); - } -} -# endif -#endif - -void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, +void phy_procedures_UE_lte(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) { #if defined(ENABLE_ITTI) @@ -3568,19 +3439,19 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr # if ENABLE_RAL int CC_id =0; #endif - int frame_rx = phy_vars_ue->frame_rx; - int frame_tx = phy_vars_ue->frame_tx; - int slot_rx = phy_vars_ue->slot_rx; - int slot_tx = phy_vars_ue->slot_tx; + int frame_rx = ue->frame_rx; + int frame_tx = ue->frame_tx; + int slot_rx = ue->slot_rx; + int slot_tx = ue->slot_tx; int subframe_tx = slot_tx>>1; int subframe_rx = slot_rx>>1; #undef DEBUG_PHY_PROC UE_L2_STATE_t ret; - if (phy_vars_ue->mac_enabled == 0) { - phy_vars_ue->UE_mode[eNB_id]=PUSCH; - phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local; + if (ue->mac_enabled == 0) { + ue->UE_mode[eNB_id]=PUSCH; + ue->prach_resources[eNB_id] = &prach_resources_local; prach_resources_local.ra_RNTI = 0xbeef; prach_resources_local.ra_PreambleIndex = 0; } @@ -3592,7 +3463,7 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[0].rxcnt_ptr[0])); #endif #endif - start_meas(&phy_vars_ue->phy_proc); + start_meas(&ue->phy_proc); #if defined(ENABLE_ITTI) do { @@ -3634,7 +3505,7 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr // check if it is a measurement timer { hashtable_rc_t hashtable_rc; - hashtable_rc = hashtable_is_key_exists(PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id)); + hashtable_rc = hashtable_is_key_exists(ue_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id)); LOG_I(PHY, "[UE %d] Received TIMER HAS EXPIRED: (hash_rc %d, HASH_TABLE_OK %d)\n", Mod_id, hashtable_rc, HASH_TABLE_OK); if (hashtable_rc == HASH_TABLE_OK) { @@ -3677,14 +3548,14 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) { case RAL_LINK_PARAM_TYPE_CHOICE_GEN: SLIST_INSERT_HEAD( - &PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen], + &ue_g[Mod_id][CC_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen], threshold_phy_p, ral_thresholds); break; case RAL_LINK_PARAM_TYPE_CHOICE_LTE: SLIST_INSERT_HEAD( - &PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte], + &ue_g[Mod_id][CC_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte], threshold_phy_p, ral_thresholds); //LOG_E(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER NULL - type LTE in %s\n", Mod_id, msg_name); @@ -3708,7 +3579,7 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr &timer_id); if (res == 0) { - hashtable_rc = hashtable_insert(PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p); + hashtable_rc = hashtable_insert(ue_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p); if (hashtable_rc == HASH_TABLE_OK) { threshold_phy_p->timer_id = timer_id; @@ -3754,62 +3625,62 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr #endif - if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_UL)|| - (phy_vars_ue->lte_frame_parms.frame_type == FDD)) { - phy_procedures_UE_TX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type); + if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)|| + (ue->frame_parms.frame_type == FDD)) { + phy_procedures_UE_TX(ue,eNB_id,abstraction_flag,mode,r_type); } - if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx)==SF_DL) || - (phy_vars_ue->lte_frame_parms.frame_type == FDD)) { + if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_DL) || + (ue->frame_parms.frame_type == FDD)) { #ifdef Rel10 if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 ) #endif - phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); + phy_procedures_UE_RX(ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); } - if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_S) && + if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_S) && ((slot_tx&1)==1)) { - phy_procedures_UE_S_TX(phy_vars_ue,eNB_id,abstraction_flag,r_type); + phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag,r_type); } - if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx)==SF_S) && + if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_S) && ((slot_rx&1)==0)) { #ifdef Rel10 if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 ) #endif - phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); + phy_procedures_UE_RX(ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); } - if (phy_vars_ue->mac_enabled==1) { + if (ue->mac_enabled==1) { if (slot_rx%2==0) { - ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id, + ret = mac_xface->ue_scheduler(ue->Mod_id, frame_tx, subframe_rx, - subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx), + subframe_select(&ue->frame_parms,subframe_tx), eNB_id, 0/*FIXME CC_id*/); if (ret == CONNECTION_LOST) { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",phy_vars_ue->Mod_id, + LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",ue->Mod_id, frame_rx,subframe_tx); - phy_vars_ue->UE_mode[eNB_id] = PRACH; + ue->UE_mode[eNB_id] = PRACH; // mac_xface->macphy_exit("Connection lost"); } else if (ret == PHY_RESYNCH) { LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n", - phy_vars_ue->Mod_id, + ue->Mod_id, frame_rx,subframe_tx); - phy_vars_ue->UE_mode[eNB_id] = RESYNCH; + ue->UE_mode[eNB_id] = RESYNCH; // mac_xface->macphy_exit("Connection lost"); } else if (ret == PHY_HO_PRACH) { LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n", - phy_vars_ue->Mod_id,frame_rx,subframe_tx); - phy_vars_ue->UE_mode[eNB_id] = PRACH; + ue->Mod_id,frame_rx,subframe_tx); + ue->UE_mode[eNB_id] = PRACH; } } } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0); - stop_meas(&phy_vars_ue->phy_proc); + stop_meas(&ue->phy_proc); } diff --git a/openair1/SCHED/pucch_pc.c b/openair1/SCHED/pucch_pc.c index afcf4bd5b3..229ae3f1a3 100644 --- a/openair1/SCHED/pucch_pc.c +++ b/openair1/SCHED/pucch_pc.c @@ -42,7 +42,7 @@ #include "PHY/LTE_TRANSPORT/proto.h" #include "PHY/extern.h" -int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt) +int8_t pucch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt) { int8_t Po_PUCCH; @@ -52,29 +52,29 @@ int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id // //if ((pucch_fmt == pucch_format1a) || // (pucch_fmt == pucch_format1b)) { // Update g_pucch based on TPC/delta_PUCCH received in PDCCH for this process - //harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe].harq_id; + //harq_pid = ue->dlsch[eNB_id][0]->harq_ack[subframe].harq_id; //this is now done in dci_tools - //phy_vars_ue->g_pucch[eNB_id] += phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->delta_PUCCH; + //ue->g_pucch[eNB_id] += ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->delta_PUCCH; //} - Po_PUCCH = get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,eNB_id)+ - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ - phy_vars_ue->dlsch_ue[eNB_id][0]->g_pucch; + Po_PUCCH = get_PL(ue->Mod_id,ue->CC_id,eNB_id)+ + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ + ue->dlsch[eNB_id][0]->g_pucch; switch (pucch_fmt) { case pucch_format1: case pucch_format2a: case pucch_format2b: - Po_PUCCH += (-2+(phy_vars_ue->lte_frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format1<<1)); + Po_PUCCH += (-2+(ue->frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format1<<1)); break; case pucch_format1a: case pucch_format1b: - Po_PUCCH += (1+(phy_vars_ue->lte_frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format1b<<1)); + Po_PUCCH += (1+(ue->frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format1b<<1)); break; case pucch_format2: - switch (phy_vars_ue->lte_frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format2a) { + switch (ue->frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format2a) { case 0: Po_PUCCH -= 2; break; @@ -97,20 +97,20 @@ int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id if (pucch_fmt!=pucch_format1) { LOG_I(PHY,"[UE %d][PDSCH %x] frame %d, subframe %d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB, g_pucch %d dB\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,phy_vars_ue->frame_tx,subframe, + ue->Mod_id, + ue->dlsch[eNB_id][0]->rnti,ue->frame_tx,subframe, Po_PUCCH, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,eNB_id), - phy_vars_ue->dlsch_ue[eNB_id][0]->g_pucch); + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + get_PL(ue->Mod_id,ue->CC_id,eNB_id), + ue->dlsch[eNB_id][0]->g_pucch); } else { LOG_I(PHY,"[UE %d][SR %x] frame %d, subframe %d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB g_pucch %d dB\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,phy_vars_ue->frame_tx,subframe, + ue->Mod_id, + ue->dlsch[eNB_id][0]->rnti,ue->frame_tx,subframe, Po_PUCCH, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,eNB_id), - phy_vars_ue->dlsch_ue[eNB_id][0]->g_pucch); + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + get_PL(ue->Mod_id,ue->CC_id,eNB_id), + ue->dlsch[eNB_id][0]->g_pucch); } return(Po_PUCCH); diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c index 5fb1f7449c..074cd507ef 100644 --- a/openair1/SCHED/pusch_pc.c +++ b/openair1/SCHED/pusch_pc.c @@ -47,7 +47,7 @@ int16_t hundred_times_delta_TF[100] = {-32768,-1268,-956,-768,-631,-523,-431,-352,-282,-219,-161,-107,-57,-9,36,79,120,159,197,234,269,304,337,370,402,434,465,495,525,555,583,612,640,668,696,723,750,777,803,829,856,881,907,933,958,983,1008,1033,1058,1083,1108,1132,1157,1181,1205,1229,1254,1278,1302,1325,1349,1373,1397,1421,1444,1468,1491,1515,1538,1562,1585,1609,1632,1655,1679,1702,1725,1748,1772,1795,1818,1841,1864,1887,1910,1933,1956,1980,2003,2026,2049,2072,2095,2118,2141,2164,2186,2209,2232,2255}; uint16_t hundred_times_log10_NPRB[100] = {0,301,477,602,698,778,845,903,954,1000,1041,1079,1113,1146,1176,1204,1230,1255,1278,1301,1322,1342,1361,1380,1397,1414,1431,1447,1462,1477,1491,1505,1518,1531,1544,1556,1568,1579,1591,1602,1612,1623,1633,1643,1653,1662,1672,1681,1690,1698,1707,1716,1724,1732,1740,1748,1755,1763,1770,1778,1785,1792,1799,1806,1812,1819,1826,1832,1838,1845,1851,1857,1863,1869,1875,1880,1886,1892,1897,1903,1908,1913,1919,1924,1929,1934,1939,1944,1949,1954,1959,1963,1968,1973,1977,1982,1986,1991,1995,2000}; -int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor) +int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor) { uint32_t Nre,sumKr,MPR_x100,Kr,r; @@ -56,16 +56,16 @@ int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id, DevAssert( UE_id < NUMBER_OF_UE_MAX+1 ); DevAssert( harq_pid < 8 ); - Nre = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Nsymb_initial * - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb*12; + Nre = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_initial * + eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12; sumKr = 0; - for (r=0; rulsch_eNB[UE_id]->harq_processes[harq_pid]->C; r++) { - if (rulsch_eNB[UE_id]->harq_processes[harq_pid]->Cminus) - Kr = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kminus; + for (r=0; rulsch[UE_id]->harq_processes[harq_pid]->C; r++) { + if (rulsch[UE_id]->harq_processes[harq_pid]->Cminus) + Kr = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kminus; else - Kr = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kplus; + Kr = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus; sumKr += Kr; } @@ -78,16 +78,16 @@ int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id, // FK 20140908 sumKr is only set after the ulsch_encoding beta_offset_pusch = 8; - //(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->control_only == 1) ? phy_vars_eNB->ulsch_eNB[UE_id]->beta_offset_cqi_times8:8; + //(eNB->ulsch[UE_id]->harq_processes[harq_pid]->control_only == 1) ? eNB->ulsch[UE_id]->beta_offset_cqi_times8:8; DevAssert( UE_id < NUMBER_OF_UE_MAX ); //#warning "This condition happens sometimes. Need more investigation" // navid //DevAssert( MPR_x100/6 < 100 ); - if (phy_vars_eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled == 1) { + if (eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled == 1) { // This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch) if (bw_factor == 1) { - uint8_t nb_rb = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb; + uint8_t nb_rb = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb; return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)) + hundred_times_log10_NPRB[nb_rb-1]; } else return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)); @@ -108,23 +108,23 @@ int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rn return get_hundred_times_delta_IF_eNB( PHY_vars_eNB_g[module_idP][CC_id], UE_id, harq_pid, 0 ); } -int16_t get_hundred_times_delta_IF(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t harq_pid) +int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_pid) { - uint32_t Nre = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->Nsymb_initial * - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb*12; + uint32_t Nre = ue->ulsch[eNB_id]->harq_processes[harq_pid]->Nsymb_initial * + ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb*12; if (Nre==0) return(0); - uint32_t MPR_x100 = 100*phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->sumKr/Nre; + uint32_t MPR_x100 = 100*ue->ulsch[eNB_id]->harq_processes[harq_pid]->sumKr/Nre; // Note: MPR=is the effective spectral efficiency of the PUSCH // FK 20140908 sumKr is only set after the ulsch_encoding - uint16_t beta_offset_pusch = (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? - phy_vars_ue->ulsch_ue[eNB_id]->beta_offset_cqi_times8:8; + uint16_t beta_offset_pusch = (ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? + ue->ulsch[eNB_id]->beta_offset_cqi_times8:8; - if (phy_vars_ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled == 1) { + if (ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled == 1) { // This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch) return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)); } else { @@ -136,15 +136,15 @@ int16_t get_hundred_times_delta_IF(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8 uint8_t alpha_lut[8] = {0,40,50,60,70,80,90,100}; -void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag) +void pusch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag) { - uint8_t harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->frame_tx, + uint8_t harq_pid = subframe2harq_pid(&ue->frame_parms, + ue->frame_tx, subframe); - uint8_t nb_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb; + uint8_t nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; int8_t PL; @@ -153,46 +153,46 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,u // P_opusch(0) = P_oPTR + deltaP_Msg3 if PUSCH is transporting Msg3 // else // P_opusch(0) = PO_NOMINAL_PUSCH(j) + P_O_UE_PUSCH(j) - PL = get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,eNB_id); + PL = get_PL(ue->Mod_id,ue->CC_id,eNB_id); - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH = (hundred_times_log10_NPRB[nb_rb-1]+ - get_hundred_times_delta_IF(phy_vars_ue,eNB_id,harq_pid) + - 100*phy_vars_ue->ulsch_ue[eNB_id]->f_pusch)/100; + ue->ulsch[eNB_id]->Po_PUSCH = (hundred_times_log10_NPRB[nb_rb-1]+ + get_hundred_times_delta_IF(ue,eNB_id,harq_pid) + + 100*ue->ulsch[eNB_id]->f_pusch)/100; - if( phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) { // Msg3 PUSCH + if(ue->ulsch_Msg3_active[eNB_id] == 1) { // Msg3 PUSCH - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH += (mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0) + PL); + ue->ulsch[eNB_id]->Po_PUSCH += (mac_xface->get_Po_NOMINAL_PUSCH(ue->Mod_id,0) + PL); LOG_I(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,100*PL=%d,%d,%d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, - 100*mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0), + ue->Mod_id,ue->frame_tx,subframe,ue->ulsch[eNB_id]->Po_PUSCH, + 100*mac_xface->get_Po_NOMINAL_PUSCH(ue->Mod_id,0), hundred_times_log10_NPRB[nb_rb-1], 100*PL, - get_hundred_times_delta_IF(phy_vars_ue,eNB_id,harq_pid), - 100*phy_vars_ue->ulsch_ue[eNB_id]->f_pusch); + get_hundred_times_delta_IF(ue,eNB_id,harq_pid), + 100*ue->ulsch[eNB_id]->f_pusch); } else if (j==0) { // SPS PUSCH } else if (j==1) { // Normal PUSCH - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH += ((alpha_lut[phy_vars_ue->lte_frame_parms.ul_power_control_config_common.alpha]*PL)/100); - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH += phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH; - phy_vars_ue->ulsch_ue[eNB_id]->PHR = phy_vars_ue->tx_power_max_dBm-phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH; + ue->ulsch[eNB_id]->Po_PUSCH += ((alpha_lut[ue->frame_parms.ul_power_control_config_common.alpha]*PL)/100); + ue->ulsch[eNB_id]->Po_PUSCH += ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH; + ue->ulsch[eNB_id]->PHR = ue->tx_power_max_dBm-ue->ulsch[eNB_id]->Po_PUSCH; - if (phy_vars_ue->ulsch_ue[eNB_id]->PHR < -23) - phy_vars_ue->ulsch_ue[eNB_id]->PHR = -23; - else if (phy_vars_ue->ulsch_ue[eNB_id]->PHR > 40) - phy_vars_ue->ulsch_ue[eNB_id]->PHR = 40; + if (ue->ulsch[eNB_id]->PHR < -23) + ue->ulsch[eNB_id]->PHR = -23; + else if (ue->ulsch[eNB_id]->PHR > 40) + ue->ulsch[eNB_id]->PHR = 40; LOG_D(PHY,"[UE %d][PUSCH %d] frame %d, subframe %d: Po_PUSCH %d dBm : tx power %d, Po_NOMINAL_PUSCH %d,log10(NPRB) %f,PHR %d, PL %d, alpha*PL %f,delta_IF %f,f_pusch %d\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_tx,subframe, - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH, + ue->Mod_id,harq_pid,ue->frame_tx,subframe, + ue->ulsch[eNB_id]->Po_PUSCH, + ue->tx_power_max_dBm, + ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH, hundred_times_log10_NPRB[nb_rb-1]/100.0, - phy_vars_ue->ulsch_ue[eNB_id]->PHR, + ue->ulsch[eNB_id]->PHR, PL, - alpha_lut[phy_vars_ue->lte_frame_parms.ul_power_control_config_common.alpha]*PL/100.0, - get_hundred_times_delta_IF(phy_vars_ue,eNB_id,harq_pid)/100.0, - phy_vars_ue->ulsch_ue[eNB_id]->f_pusch); + alpha_lut[ue->frame_parms.ul_power_control_config_common.alpha]*PL/100.0, + get_hundred_times_delta_IF(ue,eNB_id,harq_pid)/100.0, + ue->ulsch[eNB_id]->f_pusch); } } @@ -200,7 +200,7 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,u int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id,uint8_t eNB_index) { - return PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_index]->PHR; + return PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->PHR; } // uint8_t eNB_id,uint8_t harq_pid, uint8_t UE_id, @@ -260,7 +260,7 @@ int16_t estimate_ue_tx_power(uint32_t tbs, uint32_t nb_rb, uint8_t control_only, if (control_only == 1 ) beta_offset_pusch_x8=8; // fixme - //(beta_offset_pusch_x8=phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? phy_vars_ue->ulsch_ue[eNB_id]->beta_offset_cqi_times8:8; + //(beta_offset_pusch_x8=ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? ue->ulsch[eNB_id]->beta_offset_cqi_times8:8; // if deltamcs_enabledm delta_mcs = ((hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch_x8)>>3))/100.0); diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index a6c4eaeb16..65098e975f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -146,8 +146,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, LOG_D(MAC,"UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer); DLSCH_dci = (void *)UE_list->UE_template[CC_id][i].DLSCH_DCI[0]; *(uint32_t*)DLSCH_dci = 0; - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { + switch (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 31; @@ -175,7 +175,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, } } else { // FDD - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + switch (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->type = 1; ((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31; @@ -361,11 +361,11 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, schedule_RA(module_idP,frameP,subframeP,2); - if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD + if (mac_xface->frame_parms->frame_type == FDD) { //FDD schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag); - } else if ((mac_xface->lte_frame_parms->tdd_config == TDD) || //TDD - (mac_xface->lte_frame_parms->tdd_config == 3) || - (mac_xface->lte_frame_parms->tdd_config == 6)) { + } else if ((mac_xface->frame_parms->tdd_config == TDD) || //TDD + (mac_xface->frame_parms->tdd_config == 3) || + (mac_xface->frame_parms->tdd_config == 6)) { //schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag); } @@ -378,8 +378,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // TDD, schedule UL for subframeP 7 (TDD config 0,1) / subframeP 8 (TDD Config 6) // FDD, schedule normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { + if (mac_xface->frame_parms->frame_type == TDD) { // TDD + switch (mac_xface->frame_parms->tdd_config) { case 0: case 1: schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7); @@ -406,7 +406,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // TDD, nothing // FDD, normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD + if (mac_xface->frame_parms->frame_type == FDD) { //FDD schedule_ulsch(module_idP,frameP,cooperation_flag,2,6); schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); @@ -419,8 +419,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // TDD Config 2, ULSCH for subframeP 7 // TDD Config 2/5 normal DLSCH // FDD, normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->tdd_config) { + if (mac_xface->frame_parms->frame_type == TDD) { + switch (mac_xface->frame_parms->tdd_config) { case 2: schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7); @@ -447,8 +447,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // TDD Config 1, ULSCH for subframeP 8 // TDD Config 1/2/4/5 DLSCH // FDD UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == 1) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { + if (mac_xface->frame_parms->frame_type == 1) { // TDD + switch (mac_xface->frame_parms->tdd_config) { case 1: // schedule_RA(module_idP,frameP,subframeP); schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8); @@ -470,7 +470,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, break; } } else { - if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD + if (mac_xface->frame_parms->frame_type == FDD) { //FDD schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8); schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status); @@ -488,13 +488,13 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, schedule_SI(module_idP,frameP,subframeP); //schedule_RA(module_idP,frameP,subframeP,5); - if (mac_xface->lte_frame_parms->frame_type == FDD) { + if (mac_xface->frame_parms->frame_type == FDD) { schedule_RA(module_idP,frameP,subframeP,1); schedule_ulsch(module_idP,frameP,cooperation_flag,5,9); schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status); fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0 - (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6 + } else if ((mac_xface->frame_parms->tdd_config == 0) || // TDD Config 0 + (mac_xface->frame_parms->tdd_config == 6)) { // TDD Config 6 //schedule_ulsch(module_idP,cooperation_flag,subframeP); fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); } else { @@ -509,8 +509,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // TDD Config 0,1,6 ULSCH for subframes 2,3 // TDD Config 3,4,5 Normal DLSCH // FDD normal ULSCH/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { + if (mac_xface->frame_parms->frame_type == TDD) { // TDD + switch (mac_xface->frame_parms->tdd_config) { case 0: break; @@ -553,8 +553,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // TDD Config 3,4,5 Normal DLSCH // FDD Normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { + if (mac_xface->frame_parms->frame_type == TDD) { // TDD + switch (mac_xface->frame_parms->tdd_config) { case 3: case 4: schedule_RA(module_idP,frameP,subframeP,3); // 3 = Msg3 subframeP, not @@ -583,8 +583,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, // TDD Config 2,3,4,5 ULSCH for subframeP 2 // // FDD Normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { + if (mac_xface->frame_parms->frame_type == TDD) { // TDD + switch (mac_xface->frame_parms->tdd_config) { case 2: case 3: case 4: @@ -610,8 +610,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, case 9: // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4 - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->tdd_config) { + if (mac_xface->frame_parms->frame_type == TDD) { + switch (mac_xface->frame_parms->tdd_config) { case 1: schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3); schedule_RA(module_idP,frameP,subframeP,7); // 7 = Msg3 subframeP, not diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 3f9872a590..e673a33371 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -115,8 +115,8 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { + switch(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1; ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; @@ -126,7 +126,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; @@ -140,7 +140,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; @@ -154,7 +154,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; @@ -168,7 +168,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; @@ -182,13 +182,13 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; } } else { - switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + switch(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1; ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; @@ -198,7 +198,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; @@ -212,7 +212,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4); + ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_UL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; @@ -226,7 +226,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; @@ -240,7 +240,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); break; @@ -307,7 +307,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un /* // randomize frequency allocation for RA while (1) { - first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4)); + first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL-4)); if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) break; @@ -324,9 +324,9 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un // Compute MCS for 3 PRB msg4_header = 1+6+1; // CR header, CR CE, SDU header - if (mac_xface->lte_frame_parms->frame_type == TDD) { + if (mac_xface->frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { + switch (mac_xface->frame_parms->N_RB_DL) { case 6: ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; @@ -355,7 +355,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); @@ -391,7 +391,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); break; @@ -425,7 +425,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); @@ -460,13 +460,13 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); break; } } else { // FDD DCI - switch (mac_xface->lte_frame_parms->N_RB_DL) { + switch (mac_xface->frame_parms->N_RB_DL) { case 6: ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; @@ -496,7 +496,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); break; @@ -530,7 +530,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); break; @@ -564,7 +564,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); break; @@ -597,7 +597,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); break; @@ -668,7 +668,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un if (round>0) { //RA_template->wait_ack_Msg4++; // we have to schedule a retransmission - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; } else { ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; @@ -677,7 +677,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un /* // randomize frequency allocation for RA while (1) { - first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4)); + first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL-4)); if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) break; @@ -689,12 +689,12 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un vrb_map[first_rb+2] = 1; vrb_map[first_rb+3] = 1; - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4); + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { + ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_UL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); } else { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4); + ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_UL,first_rb,4); rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_bch.c b/openair2/LAYER2/MAC/eNB_scheduler_bch.c index f3774777a1..e24ac2f729 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_bch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_bch.c @@ -113,7 +113,7 @@ schedule_SI( // Allocate 4 PRBs in a random location /* while (1) { - first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4)); + first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL-4)); if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+1] != 1) && (vrb_map[first_rb+2] != 1) && @@ -121,7 +121,7 @@ schedule_SI( break; } */ - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + switch (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: first_rb = 0; break; @@ -167,11 +167,11 @@ schedule_SI( - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { + switch (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; @@ -186,7 +186,7 @@ schedule_SI( case 25: ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; @@ -201,7 +201,7 @@ schedule_SI( case 50: ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; @@ -216,7 +216,7 @@ schedule_SI( case 100: ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; @@ -231,10 +231,10 @@ schedule_SI( } } else { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + switch (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; @@ -250,7 +250,7 @@ schedule_SI( case 25: ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; @@ -266,7 +266,7 @@ schedule_SI( case 50: ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; @@ -282,7 +282,7 @@ schedule_SI( case 100: ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL,first_rb,4); ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; @@ -325,7 +325,7 @@ schedule_SI( LOG_D(OPT,"[eNB %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", module_idP, frameP, CC_id, 0xffff, bcch_sdu_length); } - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (TDD) for CC_id %d SI %d bytes (mcs %d, rb 3, TBS %d)\n", frameP, CC_id, diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 62422bf9ae..c5415b1d26 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -1527,7 +1527,7 @@ fill_DLSCH_dci( /// Synchronizing rballoc with rballoc_sub - for(i=0; ilte_frame_parms.N_RBG; i++) { + for(i=0; iframe_parms.N_RBG; i++) { rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i]; } @@ -1539,8 +1539,8 @@ fill_DLSCH_dci( case 2: LOG_D(MAC,"[eNB %d] CC_id %d Adding UE %d spec DCI for %d PRBS \n",module_idP, CC_id, UE_id, nb_rb); - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { + switch (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; @@ -1579,7 +1579,7 @@ fill_DLSCH_dci( } else { - switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + switch(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; @@ -1632,8 +1632,8 @@ fill_DLSCH_dci( LOG_D(MAC,"[eNB %d] CC_id %d Adding Format 2A UE %d spec DCI for %d PRBS (rb alloc: %x) \n", module_idP, CC_id, UE_id, nb_rb); - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { + switch (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->rah = 0; @@ -1672,7 +1672,7 @@ fill_DLSCH_dci( } else { - switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + switch(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->rah = 0; @@ -1834,7 +1834,7 @@ update_ul_dci( int i; DCI0_5MHz_TDD_1_6_t *ULSCH_dci = NULL;; - if (mac_xface->lte_frame_parms->frame_type == TDD) { + if (mac_xface->frame_parms->frame_type == TDD) { for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) { ULSCH_dci = (DCI0_5MHz_TDD_1_6_t *)DCI_pdu->dci_alloc[i].dci_pdu; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index a6926e15ad..d13c42362c 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -159,7 +159,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra // Check if the subframeP is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 switch (subframeP) { case 1: - if (mac_xface->lte_frame_parms->frame_type == FDD) { + if (mac_xface->frame_parms->frame_type == FDD) { if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { if (msi_pos == 1) { msi_flag = 1; @@ -177,7 +177,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra break; case 2: - if (mac_xface->lte_frame_parms->frame_type == FDD) { + if (mac_xface->frame_parms->frame_type == FDD) { if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { if (msi_pos == 2) { msi_flag = 1; @@ -195,7 +195,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra break; case 3: - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD + if (mac_xface->frame_parms->frame_type == TDD) { // TDD if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { if (msi_pos == 1) { msi_flag = 1; @@ -226,7 +226,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra break; case 4: - if (mac_xface->lte_frame_parms->frame_type == TDD) { + if (mac_xface->frame_parms->frame_type == TDD) { if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { if (msi_pos == 2) { msi_flag = 1; @@ -244,7 +244,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra break; case 6: - if (mac_xface->lte_frame_parms->frame_type == FDD) { + if (mac_xface->frame_parms->frame_type == FDD) { if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { if (msi_pos == 4) { msi_flag = 1; @@ -262,7 +262,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra break; case 7: - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD + if (mac_xface->frame_parms->frame_type == TDD) { // TDD if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { if (msi_pos == 3) { msi_flag = 1; @@ -293,7 +293,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra break; case 8: - if (mac_xface->lte_frame_parms->frame_type == TDD) { //TDD + if (mac_xface->frame_parms->frame_type == TDD) { //TDD if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { if (msi_pos == 4) { msi_flag = 1; @@ -324,7 +324,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra break; case 9: - if (mac_xface->lte_frame_parms->frame_type == TDD) { + if (mac_xface->frame_parms->frame_type == TDD) { if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { if (msi_pos == 5) { msi_flag = 1; @@ -441,7 +441,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra header_len_mcch = 2; - if (mac_xface->lte_frame_parms->frame_type == TDD) { + if (mac_xface->frame_parms->frame_type == TDD) { LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d: Scheduling MCCH->MCH (TDD) for MCCH message %d bytes (mcs %d )\n", module_idP, CC_id, frameP,subframeP, @@ -473,7 +473,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra } } - TBS = mac_xface->get_TBS_DL(eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcs, mac_xface->lte_frame_parms->N_RB_DL); + TBS = mac_xface->get_TBS_DL(eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcs, mac_xface->frame_parms->N_RB_DL); #ifdef Rel10 // do not let mcch and mtch multiplexing when relaying is active // for sync area 1, so not transmit data @@ -484,10 +484,10 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra if (mtch_flag == 1) { // Calculate TBS /* if ((msi_flag==1) || (mcch_flag==1)) { - TBS = mac_xface->get_TBS(mcch_mcs, mac_xface->lte_frame_parms->N_RB_DL); + TBS = mac_xface->get_TBS(mcch_mcs, mac_xface->frame_parms->N_RB_DL); } else { // only MTCH in this subframeP - TBS = mac_xface->get_TBS(eNB_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9, mac_xface->lte_frame_parms->N_RB_DL); + TBS = mac_xface->get_TBS(eNB_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9, mac_xface->frame_parms->N_RB_DL); } // get MTCH data from RLC (like for DTCH) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index ece06a5e09..25663bafdb 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -731,7 +731,7 @@ uint32_t allocate_prbs(int UE_id,unsigned char nb_rb, uint32_t *rballoc) uint32_t rballoc_dci=0; unsigned char nb_rb_alloc=0; - for (i=0; i<(mac_xface->lte_frame_parms->N_RB_DL-2); i+=2) { + for (i=0; i<(mac_xface->frame_parms->N_RB_DL-2); i+=2) { if (((*rballoc>>i)&3)==0) { *rballoc |= (3<>1)); @@ -743,10 +743,10 @@ uint32_t allocate_prbs(int UE_id,unsigned char nb_rb, uint32_t *rballoc) } } - if ((mac_xface->lte_frame_parms->N_RB_DL&1)==1) { - if ((*rballoc>>(mac_xface->lte_frame_parms->N_RB_DL-1)&1)==0) { - *rballoc |= (1<<(mac_xface->lte_frame_parms->N_RB_DL-1)); - rballoc_dci |= 1;//(1<<(mac_xface->lte_frame_parms->N_RB_DL>>1)); + if ((mac_xface->frame_parms->N_RB_DL&1)==1) { + if ((*rballoc>>(mac_xface->frame_parms->N_RB_DL-1)&1)==0) { + *rballoc |= (1<<(mac_xface->frame_parms->N_RB_DL-1)); + rballoc_dci |= 1;//(1<<(mac_xface->frame_parms->N_RB_DL>>1)); } } @@ -793,20 +793,20 @@ uint32_t allocate_prbs_sub(int nb_rb, uint8_t *rballoc) //uint8_t number_of_subbands=13; LOG_T(MAC,"*****Check1RBALLOC****: %d%d%d%d (nb_rb %d,N_RBG %d)\n", - rballoc[3],rballoc[2],rballoc[1],rballoc[0],nb_rb,mac_xface->lte_frame_parms->N_RBG); + rballoc[3],rballoc[2],rballoc[1],rballoc[0],nb_rb,mac_xface->frame_parms->N_RBG); - while((nb_rb >0) && (check < mac_xface->lte_frame_parms->N_RBG)) { + while((nb_rb >0) && (check < mac_xface->frame_parms->N_RBG)) { //printf("rballoc[%d] %d\n",check,rballoc[check]); if(rballoc[check] == 1) { - rballoc_dci |= (1<<((mac_xface->lte_frame_parms->N_RBG-1)-check)); + rballoc_dci |= (1<<((mac_xface->frame_parms->N_RBG-1)-check)); - switch (mac_xface->lte_frame_parms->N_RB_DL) { + switch (mac_xface->frame_parms->N_RB_DL) { case 6: nb_rb--; break; case 25: - if ((check == mac_xface->lte_frame_parms->N_RBG-1)) { + if ((check == mac_xface->frame_parms->N_RBG-1)) { nb_rb--; } else { nb_rb-=2; @@ -815,7 +815,7 @@ uint32_t allocate_prbs_sub(int nb_rb, uint8_t *rballoc) break; case 50: - if ((check == mac_xface->lte_frame_parms->N_RBG-1)) { + if ((check == mac_xface->frame_parms->N_RBG-1)) { nb_rb-=2; } else { nb_rb-=3; @@ -846,7 +846,7 @@ int get_nb_subband(void) int nb_sb=0; - switch (mac_xface->lte_frame_parms->N_RB_DL) { + switch (mac_xface->frame_parms->N_RB_DL) { case 6: nb_sb=0; break; diff --git a/openair2/LAYER2/MAC/lte_transport_init.c b/openair2/LAYER2/MAC/lte_transport_init.c index fa446a4aee..43343ad8ee 100755 --- a/openair2/LAYER2/MAC/lte_transport_init.c +++ b/openair2/LAYER2/MAC/lte_transport_init.c @@ -27,9 +27,9 @@ *******************************************************************************/ -#define UL_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,24) -#define BCCH_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,4) -#define RA_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,4) +#define UL_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,24) +#define BCCH_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,4) +#define RA_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,4) #define DLSCH_RB_ALLOC 0x1fff #include "extern.h" diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index d5a445744d..7480babd24 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -224,8 +224,8 @@ int mac_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, ui RA_template = (RA_TEMPLATE *)&eNB_mac_inst[i].common_channels[CC_id].RA_template[0]; for (j=0; jlte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { + if (mac_xface->frame_parms->frame_type == TDD) { + switch (mac_xface->frame_parms->N_RB_DL) { case 6: size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); @@ -263,7 +263,7 @@ int mac_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, ui } } else { - switch (mac_xface->lte_frame_parms->N_RB_DL) { + switch (mac_xface->frame_parms->N_RB_DL) { case 6: size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); @@ -326,7 +326,7 @@ int mac_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, ui //ICIC init param #ifdef ICIC uint8_t SB_size; - SB_size=mac_xface->get_SB_size(mac_xface->lte_frame_parms->N_RB_DL); + SB_size=mac_xface->get_SB_size(mac_xface->frame_parms->N_RB_DL); srand (time(NULL)); @@ -465,7 +465,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui mac_xface->UL_failure_indication = UL_failure_indication; mac_xface->rx_sdu = rx_sdu; mac_xface->get_dlsch_sdu = get_dlsch_sdu; - mac_xface->get_eNB_UE_stats = get_eNB_UE_stats; + mac_xface->get_eNB_UE_stats = get_UE_stats; mac_xface->get_transmission_mode = get_transmission_mode; mac_xface->get_rballoc = get_rballoc; mac_xface->get_nb_rb = conv_nprb; @@ -494,7 +494,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui LOG_I(MAC,"[MAIN] PHY Frame configuration \n"); - mac_xface->lte_frame_parms = frame_parms; + mac_xface->frame_parms = frame_parms; mac_xface->get_ue_active_harq_pid = get_ue_active_harq_pid; mac_xface->get_PL = get_PL; diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index d28614699b..a3e2b2699b 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -198,7 +198,7 @@ void assign_rbs_required (module_id_t Mod_id, /* if ((mac_get_rrc_status(Mod_id,1,UE_id) < RRC_RECONFIGURED)){ // If we still don't have a default radio bearer - nb_rbs_required[pCCid][UE_id] = PHY_vars_eNB_g[Mod_id][pCCid]->lte_frame_parms.N_RB_DL; + nb_rbs_required[pCCid][UE_id] = PHY_vars_eNB_g[Mod_id][pCCid]->frame_parms.N_RB_DL; continue; } */ @@ -649,8 +649,8 @@ void dlsch_scheduler_pre_processor (module_id_t Mod_id, if ((j == N_RBG[CC_id]-1) && - ((PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL == 25) || - (PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL == 50))) { + ((PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms.N_RB_DL == 25) || + (PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms.N_RB_DL == 50))) { nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit[CC_id]+1; ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit[CC_id]-1; @@ -759,7 +759,7 @@ void dlsch_scheduler_pre_processor_reset (int module_idP, UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; rnti_t rnti = UE_RNTI(module_idP,UE_id); uint8_t *vrb_map = eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map; - int RBGsize = PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL/N_RBG; + int RBGsize = PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL/N_RBG; #ifdef SF05_LIMIT //int subframe05_limit=0; int sf05_upper=-1,sf05_lower=-1; @@ -776,7 +776,7 @@ void dlsch_scheduler_pre_processor_reset (int module_idP, // WE SHOULD PROTECT the eNB_UE_stats with a mutex here ... ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { + switch (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { case 6: ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update; break; diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index 669077bf4f..7c9c96f01e 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -252,13 +252,13 @@ void get_prach_resources(module_id_t module_idP, // choose random PRACH resource in TDD if (UE_mac_inst[module_idP].tdd_Config) { - num_prach = mac_xface->get_num_prach_tdd(mac_xface->lte_frame_parms); + num_prach = mac_xface->get_num_prach_tdd(mac_xface->frame_parms); if ((num_prach>0) && (num_prach<6)) { UE_mac_inst[module_idP].RA_prach_resources.ra_TDD_map_index = (taus()%num_prach); } - f_id = mac_xface->get_fid_prach_tdd(mac_xface->lte_frame_parms, + f_id = mac_xface->get_fid_prach_tdd(mac_xface->frame_parms, UE_mac_inst[module_idP].RA_prach_resources.ra_TDD_map_index); } diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index ee6340cb43..1d7e49070b 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -728,7 +728,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 switch (subframe) { case 1: - if (mac_xface->lte_frame_parms->frame_type == FDD) { + if (mac_xface->frame_parms->frame_type == FDD) { if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { if (msi_pos == 1) { msi_flag = 1; @@ -746,7 +746,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ break; case 2: - if (mac_xface->lte_frame_parms->frame_type == FDD) { + if (mac_xface->frame_parms->frame_type == FDD) { if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { if (msi_pos == 2) { msi_flag = 1; @@ -764,7 +764,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ break; case 3: - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD + if (mac_xface->frame_parms->frame_type == TDD) { // TDD if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { if (msi_pos == 1) { msi_flag = 1; @@ -795,7 +795,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ break; case 4: - if (mac_xface->lte_frame_parms->frame_type == TDD) { + if (mac_xface->frame_parms->frame_type == TDD) { if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { if (msi_pos == 2) { msi_flag = 1; @@ -813,7 +813,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ break; case 6: - if (mac_xface->lte_frame_parms->frame_type == FDD) { + if (mac_xface->frame_parms->frame_type == FDD) { if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { if (msi_pos == 4) { msi_flag = 1; @@ -831,7 +831,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ break; case 7: - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD + if (mac_xface->frame_parms->frame_type == TDD) { // TDD if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { if (msi_pos == 3) { msi_flag = 1; @@ -862,7 +862,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ break; case 8: - if (mac_xface->lte_frame_parms->frame_type == TDD) { //TDD + if (mac_xface->frame_parms->frame_type == TDD) { //TDD if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { if (msi_pos == 4) { msi_flag = 1; @@ -893,7 +893,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_ break; case 9: - if (mac_xface->lte_frame_parms->frame_type == TDD) { + if (mac_xface->frame_parms->frame_type == TDD) { if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { if (msi_pos == 5) { msi_flag = 1; diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h index a85c2b15f2..5d933094f3 100755 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -332,7 +332,7 @@ typedef struct { unsigned char cluster_head_index; /// PHY Frame Configuration - LTE_DL_FRAME_PARMS *lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms; uint8_t (*get_prach_prb_offset)(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapindex, uint16_t Nf); diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 01c1ee6ca9..c72c106e0f 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -3467,7 +3467,7 @@ void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ UE_rrc_inst[ctxt_pP->module_id].rsrp_db[eNB_offset] = (dB_fixed_times10(mac_xface->get_RSRP(ctxt_pP->module_id,0,eNB_offset))/10.0) - mac_xface->get_rx_total_gain_dB(ctxt_pP->module_id,0) - - dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12); + dB_fixed(mac_xface->frame_parms->N_RB_DL*12); UE_rrc_inst[ctxt_pP->module_id].rsrp_db_filtered[eNB_offset] = (1.0-a)*UE_rrc_inst[ctxt_pP->module_id].rsrp_db_filtered[eNB_offset] + a*UE_rrc_inst[ctxt_pP->module_id].rsrp_db[eNB_offset]; @@ -3478,7 +3478,7 @@ void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ LOG_D(RRC,"RSRP_dBm: %3.2f \n",(dB_fixed_times10(mac_xface->get_RSRP(ctxt_pP->module_id,0,eNB_offset))/10.0)); LOG_D(RRC,"gain_loss_dB: %d \n",mac_xface->get_rx_total_gain_dB(ctxt_pP->module_id,0)); - LOG_D(RRC,"gain_fixed_dB: %d \n",dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12)); + LOG_D(RRC,"gain_fixed_dB: %d \n",dB_fixed(mac_xface->frame_parms->N_RB_DL*12)); LOG_D(PHY,"[UE %d] Frame %d, RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB)\n", ctxt_pP->module_id, ctxt_pP->frame, @@ -3736,7 +3736,7 @@ static uint8_t check_trigger_meas_event( TimeToTrigger_t ttt ) { uint8_t eNB_offset; - uint8_t currentCellIndex = mac_xface->lte_frame_parms->Nid_cell; + uint8_t currentCellIndex = mac_xface->frame_parms->Nid_cell; uint8_t tmp_offset; LOG_I(RRC,"[UE %d] ofn(%d) ocn(%d) hys(%d) ofs(%d) ocs(%d) a3_offset(%d) ttt(%d) rssi %3.1f\n", @@ -3769,9 +3769,9 @@ static uint8_t check_trigger_meas_event( LOG_D(RRC,"[UE %d] Frame %d eNB %d: Handover triggered: targetCellId: %d currentCellId: %d eNB_offset: %d rsrp source: %3.1f rsrp target: %3.1f\n", \ ue_mod_idP, frameP, eNB_index, UE_rrc_inst->HandoverInfoUe.targetCellId,ue_cnx_index,eNB_offset, - (dB_fixed_times10(UE_rrc_inst[ue_mod_idP].rsrp_db[0])/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12), + (dB_fixed_times10(UE_rrc_inst[ue_mod_idP].rsrp_db[0])/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->frame_parms->N_RB_DL*12), (dB_fixed_times10(UE_rrc_inst[ue_mod_idP].rsrp_db[eNB_offset])/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP, - 0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12)); + 0)-dB_fixed(mac_xface->frame_parms->N_RB_DL*12)); UE_rrc_inst->Info[0].handoverTarget = eNB_offset; //LOG_D(RRC,"PHY_ID: %d \n",UE_rrc_inst->HandoverInfoUe.targetCellId); return 1; diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 0d7c8f915e..dcc3264828 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -194,7 +194,7 @@ init_SI( eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB1 = do_SIB1( ctxt_pP->module_id, CC_id, - mac_xface->lte_frame_parms, + mac_xface->frame_parms, (uint8_t*)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB1, &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].siblock1, &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib1 @@ -224,7 +224,7 @@ init_SI( eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB23 = do_SIB23( ctxt_pP->module_id, CC_id, - mac_xface->lte_frame_parms, + mac_xface->frame_parms, eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB23, &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].systemInformation, &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2, @@ -390,7 +390,7 @@ init_MCCH( mac_xface->macphy_exit("[RRC][init_MCCH] not enough memory\n"); } else { eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = do_MBSFNAreaConfig(enb_mod_idP, - mac_xface->lte_frame_parms, + mac_xface->frame_parms, sync_area, (uint8_t *)eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area], &eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch, @@ -571,7 +571,7 @@ rrc_eNB_ue_context_stmsi_exist( m_tmsiP, mme_codeP, ue_context_p, ue_context_p->ue_context.rnti); if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) { - printf("S-TMSI %x, MME %x\n", + printf("=> S-TMSI %x, MME %x\n", ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code); if (ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi == m_tmsiP) @@ -2322,11 +2322,11 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( physicalConfigDedicated2->schedulingRequestConfig->present = SchedulingRequestConfig_PR_setup; physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = ue_context_pP->local_uid; - if (mac_xface->lte_frame_parms->frame_type == 0) { // FDD + if (mac_xface->frame_parms->frame_type == 0) { // FDD physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 5 + (ue_context_pP->local_uid % 10); // Isr = 5 (every 10 subframes, offset=2+UE_id mod3) } else { - switch (mac_xface->lte_frame_parms->tdd_config) { + switch (mac_xface->frame_parms->tdd_config) { case 1: physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 7 + (ue_context_pP->local_uid & 1) + (( ue_context_pP->local_uid & 3) >> 1) * 5; // Isr = 5 (every 10 subframes, offset=2 for UE0, 3 for UE1, 7 for UE2, 8 for UE3 , 2 for UE4 etc..) @@ -3299,9 +3299,9 @@ rrc_eNB_generate_RRCConnectionSetup( do_RRCConnectionSetup(ctxt_pP, ue_context_pP, (uint8_t*) eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Payload, - (mac_xface->lte_frame_parms->nb_antennas_tx==2)?2:1, + (mac_xface->frame_parms->nb_antennas_tx==2)?2:1, rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), - mac_xface->lte_frame_parms, + mac_xface->frame_parms, SRB_configList, &ue_context_pP->ue_context.physicalConfigDedicated); @@ -3742,7 +3742,7 @@ rrc_eNB_decode_ccch( if ((ue_context_p = rrc_eNB_ue_context_stmsi_exist(ctxt_pP, mme_code, m_tmsi))) { //#warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)" - LOG_I(RRC," S-TMSI exists, ue_context_p %p\n",ue_context_p); + LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti); stmsi_received=1; ue_context_p->ue_context.rnti = ctxt_pP->rnti; // AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)"); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 7234cf4f08..582610c5c2 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -135,19 +135,7 @@ extern pthread_cond_t sync_cond; extern pthread_mutex_t sync_mutex; extern int sync_var; -pthread_attr_t attr_eNB_proc_tx[MAX_NUM_CCs][NUM_ENB_THREADS]; -pthread_attr_t attr_eNB_proc_rx[MAX_NUM_CCs][NUM_ENB_THREADS]; - -#ifndef LOWLATENCY -struct sched_param sched_param_eNB_proc_tx[MAX_NUM_CCs][NUM_ENB_THREADS]; -struct sched_param sched_param_eNB_proc_rx[MAX_NUM_CCs][NUM_ENB_THREADS]; -#endif - -pthread_t main_eNB_thread; -pthread_attr_t attr_dlsch_threads; -#ifndef LOWLATENCY -struct sched_param sched_param_dlsch; -#endif +//pthread_t main_eNB_thread; time_stats_t softmodem_stats_mt; // main thread time_stats_t softmodem_stats_hw; // hw acquisition @@ -171,7 +159,7 @@ static struct { void exit_fun(const char* s); -void init_eNB(void); +void init_eNB(eNB_func_t node_function); void stop_eNB(void); void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) @@ -180,51 +168,51 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) unsigned int aa,slot_offset, slot_offset_F; int dummy_tx_b[7680*4] __attribute__((aligned(32))); int i, tx_offset; - int slot_sizeF = (phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)* - ((phy_vars_eNB->lte_frame_parms.Ncp==1) ? 6 : 7); + int slot_sizeF = (phy_vars_eNB->frame_parms.ofdm_symbol_size)* + ((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7); int len; slot_offset_F = (subframe<<1)*slot_sizeF; - slot_offset = subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti; + slot_offset = subframe*phy_vars_eNB->frame_parms.samples_per_tti; - if ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_DL)|| - ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_S))) { + if ((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_DL)|| + ((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_S))) { // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - if (phy_vars_eNB->lte_frame_parms.Ncp == EXTENDED) { - PHY_ofdm_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F], + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + if (phy_vars_eNB->frame_parms.Ncp == EXTENDED) { + PHY_ofdm_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F], dummy_tx_b, - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size, + phy_vars_eNB->frame_parms.ofdm_symbol_size, 6, - phy_vars_eNB->lte_frame_parms.nb_prefix_samples, + phy_vars_eNB->frame_parms.nb_prefix_samples, CYCLIC_PREFIX); - PHY_ofdm_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], - dummy_tx_b+(phy_vars_eNB->lte_frame_parms.samples_per_tti>>1), - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size, + PHY_ofdm_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], + dummy_tx_b+(phy_vars_eNB->frame_parms.samples_per_tti>>1), + phy_vars_eNB->frame_parms.ofdm_symbol_size, 6, - phy_vars_eNB->lte_frame_parms.nb_prefix_samples, + phy_vars_eNB->frame_parms.nb_prefix_samples, CYCLIC_PREFIX); } else { - normal_prefix_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F], + normal_prefix_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F], dummy_tx_b, 7, - &(phy_vars_eNB->lte_frame_parms)); + &(phy_vars_eNB->frame_parms)); // if S-subframe generate first slot only - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_DL) - normal_prefix_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], - dummy_tx_b+(phy_vars_eNB->lte_frame_parms.samples_per_tti>>1), + if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL) + normal_prefix_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], + dummy_tx_b+(phy_vars_eNB->frame_parms.samples_per_tti>>1), 7, - &(phy_vars_eNB->lte_frame_parms)); + &(phy_vars_eNB->frame_parms)); } // if S-subframe generate first slot only - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_S) - len = phy_vars_eNB->lte_frame_parms.samples_per_tti>>1; + if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) + len = phy_vars_eNB->frame_parms.samples_per_tti>>1; else - len = phy_vars_eNB->lte_frame_parms.samples_per_tti; + len = phy_vars_eNB->frame_parms.samples_per_tti; /* for (i=0;ilte_frame_parms.samples_per_tti; + tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; - if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti)) - tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; + if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) + tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; - ((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[0] = ((short*)dummy_tx_b)[2*i]<common_vars.txdata[0][aa][tx_offset])[0] = ((short*)dummy_tx_b)[2*i]<lte_eNB_common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<lte_frame_parms,subframe) == SF_S) { + if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) { for (i=0; ilte_eNB_common_vars.txdata[0][aa][tx_offset++] = 0x00010001; + phy_vars_eNB->common_vars.txdata[0][aa][tx_offset++] = 0x00010001; } } - if ((((phy_vars_eNB->lte_frame_parms.tdd_config==0) || - (phy_vars_eNB->lte_frame_parms.tdd_config==1) || - (phy_vars_eNB->lte_frame_parms.tdd_config==2) || - (phy_vars_eNB->lte_frame_parms.tdd_config==6)) && + if ((((phy_vars_eNB->frame_parms.tdd_config==0) || + (phy_vars_eNB->frame_parms.tdd_config==1) || + (phy_vars_eNB->frame_parms.tdd_config==2) || + (phy_vars_eNB->frame_parms.tdd_config==6)) && (subframe==0)) || (subframe==5)) { // turn on tx switch N_TA_offset before //LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,phy_vars_eNB->N_TA_offset,slot_offset); for (i=0; iN_TA_offset; i++) { tx_offset = (int)slot_offset+time_offset[aa]+i-phy_vars_eNB->N_TA_offset/2; if (tx_offset<0) - tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; + tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; - if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti)) - tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; + if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) + tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; - phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset] = 0x00000000; + phy_vars_eNB->common_vars.txdata[0][aa][tx_offset] = 0x00000000; } } } @@ -290,11 +278,11 @@ static void* eNB_thread_tx( void* param ) char tx_time_name[101]; if (opp_enabled == 1) { - snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->subframe); + snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->thread_index); tx_time_file = fopen(tx_time_name,"w"); } // set default return value - eNB_thread_tx_status[proc->subframe] = 0; + eNB_thread_tx_status[proc->thread_index] = 0; MSC_START_USE(); @@ -317,10 +305,10 @@ static void* eNB_thread_tx( void* param ) if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - return &eNB_thread_tx_status[proc->subframe]; + return &eNB_thread_tx_status[proc->thread_index]; } - LOG_I( HW, "[SCHED] eNB TX deadline thread %d(TID %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB TX deadline thread %d(TID %ld) started on CPU %d\n", proc->thread_index, gettid(), sched_getcpu() ); #else //LOW_LATENCY int policy, s, j; @@ -383,7 +371,7 @@ static void* eNB_thread_tx( void* param ) } - LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", proc->subframe, sched_getcpu(),gettid(), + LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", proc->thread_index, sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -396,12 +384,13 @@ static void* eNB_thread_tx( void* param ) mlockall(MCL_CURRENT | MCL_FUTURE); + while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 0 ); if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe ); + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->thread_index ); exit_fun("nothing to add"); break; } @@ -413,66 +402,68 @@ static void* eNB_thread_tx( void* param ) } if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->thread_index); exit_fun("nothing to add"); break; } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 1 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); - start_meas( &softmodem_stats_tx_sf[proc->subframe] ); - + start_meas( &softmodem_stats_tx_sf[proc->thread_index] ); + if (oai_exit) break; - if (((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD) && - ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_DL) || - (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_S))) || - (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD)) { + if (((PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.frame_type == TDD) && + ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->frame_parms,proc->subframe_tx) == SF_DL) || + (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->frame_parms,proc->subframe_tx) == SF_S))) || + (PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.frame_type == FDD)) { /* run PHY TX procedures the one after the other for all CCs to avoid race conditions * (may be relaxed in the future for performance reasons) */ - if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe); + if (pthread_mutex_lock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->thread_index); exit_fun("nothing to add"); break; } /* wait for our turn or oai_exit */ - while (sync_phy_proc[proc->subframe].phy_proc_CC_id != proc->CC_id && !oai_exit) { - pthread_cond_wait(&sync_phy_proc[proc->subframe].cond_phy_proc_tx, - &sync_phy_proc[proc->subframe].mutex_phy_proc_tx); + while (sync_phy_proc[proc->thread_index].phy_proc_CC_id != proc->CC_id && !oai_exit) { + pthread_cond_wait(&sync_phy_proc[proc->thread_index].cond_phy_proc_tx, + &sync_phy_proc[proc->thread_index].mutex_phy_proc_tx); } - if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->subframe); + if (pthread_mutex_unlock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->thread_index); exit_fun("nothing to add"); } if (oai_exit) break; - - phy_procedures_eNB_TX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL ); - - /* we're done, let the next one proceed */ - if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - break; - } - sync_phy_proc[proc->subframe].phy_proc_CC_id++; - sync_phy_proc[proc->subframe].phy_proc_CC_id %= MAX_NUM_CCs; - pthread_cond_broadcast(&sync_phy_proc[proc->subframe].cond_phy_proc_tx); - if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - break; + if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { + phy_procedures_eNB_TX( proc->thread_index, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL ); + + /* we're done, let the next one proceed */ + if (pthread_mutex_lock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->thread_index); + exit_fun("nothing to add"); + break; + } + sync_phy_proc[proc->thread_index].phy_proc_CC_id++; + sync_phy_proc[proc->thread_index].phy_proc_CC_id %= MAX_NUM_CCs; + pthread_cond_broadcast(&sync_phy_proc[proc->thread_index].cond_phy_proc_tx); + if (pthread_mutex_unlock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->thread_index); + exit_fun("nothing to add"); + break; + } } } - do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); + if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) { + do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); /* - short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->lte_eNB_common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.samples_per_tti]; - int i; - for (i=0;iCC_id]->lte_frame_parms.samples_per_tti*2;i+=8) { + short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.samples_per_tti]; + int i; + for (i=0;iCC_id]->frame_parms.samples_per_tti*2;i+=8) { txdata[i] = 2047; txdata[i+1] = 0; txdata[i+2] = 0; @@ -481,10 +472,12 @@ static void* eNB_thread_tx( void* param ) txdata[i+5] = 0; txdata[i+6] = 0; txdata[i+7] = -2047; - } + } */ + } + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe ); + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->thread_index ); exit_fun("nothing to add"); break; } @@ -492,39 +485,56 @@ static void* eNB_thread_tx( void* param ) proc->instance_cnt_tx--; if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n", proc->subframe ); + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n", proc->thread_index ); exit_fun("nothing to add"); break; } - proc->frame_tx++; - - if (proc->frame_tx==1024) - proc->frame_tx=0; - stop_meas( &softmodem_stats_tx_sf[proc->subframe] ); + stop_meas( &softmodem_stats_tx_sf[proc->thread_index] ); #ifdef LOWLATENCY if (opp_enabled){ - if(softmodem_stats_tx_sf[proc->subframe].diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf[proc->subframe].diff_now/cpuf - attr.sched_runtime)/1000000.0); + if(softmodem_stats_tx_sf[proc->thread_index].diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf[proc->thread_index].diff_now/cpuf - attr.sched_runtime)/1000000.0); } } #endif - print_meas_now(&softmodem_stats_tx_sf[proc->subframe],"eNB_TX_SF",proc->subframe, tx_time_file); + print_meas_now(&softmodem_stats_tx_sf[proc->thread_index],"eNB_TX_SF",proc->thread_index, tx_time_file); } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 0 ); #ifdef DEBUG_THREADS - printf( "Exiting eNB thread TX %d\n", proc->subframe ); + printf( "Exiting eNB thread TX %d\n", proc->thread_index ); #endif - eNB_thread_tx_status[proc->subframe] = 0; - return &eNB_thread_tx_status[proc->subframe]; + eNB_thread_tx_status[proc->thread_index] = 0; + return &eNB_thread_tx_status[proc->thread_index]; } +#if defined(ENABLE_ITTI) +static void wait_system_ready (char *message, volatile int *start_flag) +{ + /* Wait for eNB application initialization to be complete (eNB registration to MME) */ + { + static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", + " ....", " ...", " ..", " .", " " + }; + int i = 0; + + while ((!oai_exit) && (*start_flag == 0)) { + LOG_N(EMU, message, indicator[i]); + fflush(stdout); + i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); + usleep(200000); + } + + LOG_D(EMU,"\n"); + } +} +#endif /*! * \brief The receive thread of eNB. @@ -537,17 +547,19 @@ static void* eNB_thread_rx( void* param ) static int eNB_thread_rx_status[NUM_ENB_THREADS]; eNB_proc_t *proc = (eNB_proc_t*)param; + PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; FILE *rx_time_file = NULL; char rx_time_name[101]; //int i; if (opp_enabled == 1){ - snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf_%d", "eNB", proc->subframe); + snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf_%d", "eNB", proc->thread_index); rx_time_file = fopen(rx_time_name,"w"); } // set default return value - eNB_thread_rx_status[proc->subframe] = 0; + eNB_thread_rx_status[proc->thread_index] = 0; MSC_START_USE(); @@ -570,10 +582,10 @@ static void* eNB_thread_rx( void* param ) if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB RX sched_setattr failed\n"); - return &eNB_thread_rx_status[proc->subframe]; + return &eNB_thread_rx_status[proc->thread_index]; } - LOG_I( HW, "[SCHED] eNB RX deadline thread %d(TID %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB RX deadline thread %d(TID %ld) started on CPU %d\n", proc->thread_index, gettid(), sched_getcpu() ); #else // LOW_LATENCY int policy, s, j; struct sched_param sparam; @@ -640,7 +652,193 @@ static void* eNB_thread_rx( void* param ) } - LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->subframe, sched_getcpu(),gettid(), + LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->thread_index, sched_getcpu(),gettid(), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, cpu_affinity); + + +#endif // LOWLATENCY + + mlockall(MCL_CURRENT | MCL_FUTURE); + + + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads + printf( "waiting for sync (eNB_thread_rx %d)\n",proc->thread_index); + pthread_mutex_lock( &sync_mutex ); + + while (sync_var<0) + pthread_cond_wait( &sync_cond, &sync_mutex ); + + pthread_mutex_unlock(&sync_mutex); + + printf( "got sync (eNB_thread)\n" ); + +#if defined(ENABLE_ITTI) + wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); +#endif + + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices + while (!oai_exit) { + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 1 ); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + start_meas( &softmodem_stats_rx_sf[proc->thread_index] ); + + if (oai_exit) break; + + if ((((fp->frame_type == TDD )&&(subframe_select(fp,proc->subframe_rx)==SF_UL)) || + (fp->frame_type == FDD))) { + // this spawns the prach and TX threads inside and updates the frame and subframe counters + phy_procedures_eNB_common_RX(proc->thread_index, eNB, 0); + if (eNB->node_function != NGFI_RRU_IF4) + // this is the ue-specific processing for the subframe and can be multi-threaded later + phy_procedures_eNB_uespec_RX(proc->thread_index, eNB, 0, no_relay ); + } + + if ((subframe_select(fp,proc->subframe_rx) == SF_S)) { + phy_procedures_eNB_S_RX(proc->thread_index, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); + } + + stop_meas( &softmodem_stats_rx_sf[proc->thread_index] ); +#ifdef LOWLATENCY + if (opp_enabled){ + if(softmodem_stats_rx_sf[proc->thread_index].diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf[proc->thread_index].diff_now/cpuf - attr.sched_runtime)/1000000.0); + } + } +#endif // LOWLATENCY + print_meas_now(&softmodem_stats_rx_sf[proc->thread_index],"eNB_RX_SF",proc->thread_index, rx_time_file); + } + + //stop_meas( &softmodem_stats_rx_sf[proc->thread_index] ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 ); + + +#ifdef DEBUG_THREADS + printf( "Exiting eNB thread RX %d\n", proc->thread_index ); +#endif + + eNB_thread_rx_status[proc->thread_index] = 0; + return &eNB_thread_rx_status[proc->thread_index]; +} + + + +/*! + * \brief The prach receive thread of eNB. + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread_prach( void* param ) +{ + static int eNB_thread_prach_status; + + eNB_proc_t *proc = (eNB_proc_t*)param; + PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id]; + // set default return value + eNB_thread_prach_status = 0; + + MSC_START_USE(); + + AssertFatal(proc->thread_index!=0,"Invalid thread index %d for PRACH thread\n",proc->thread_index); + +#ifdef LOWLATENCY + struct sched_attr attr; + unsigned int flags = 0; + uint64_t runtime = 870000 ; + uint64_t deadline = 1 * 1000000; + uint64_t period = 1 * 10000000; // each prach thread has a period of 10ms from the starting point + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = runtime; + attr.sched_deadline = deadline; + attr.sched_period = period; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] eNB PRACH sched_setattr failed\n"); + return &eNB_thread_prach_status; + } + + LOG_I( HW, "[SCHED] eNB PRACH deadline thread (TID %ld) started on CPU %d\n", 0, gettid(), sched_getcpu() ); +#else // LOW_LATENCY + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD */ + /* CPU 1 is reserved for all TX threads */ + /* CPU 2..MAX_CPUS is reserved for all RX threads */ + /* Set CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); +#ifdef CPU_AFFINITY + if (get_nprocs() >2) + { + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun (" Error setting processor affinity :"); + } + } +#endif //CPU_AFFINITY + /* Check the actual affinity mask assigned to the thread */ + + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror ("pthread_getaffinity_np"); + exit_fun (" Error getting processor affinity :"); + } + memset(cpu_affinity,0, sizeof(cpu_affinity)); + + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) + { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + + memset(&sparam, 0 , sizeof (sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; + + policy = SCHED_FIFO ; + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) + { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + + memset(&sparam, 0 , sizeof (sparam)); + + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) + { + perror("pthread_getschedparam"); + exit_fun("Error getting thread priority"); + } + + + LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->thread_index, sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -654,83 +852,53 @@ static void* eNB_thread_rx( void* param ) while (!oai_exit) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 0 ); - - if (pthread_mutex_lock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error locking mutex" ); - break; - } - - while (proc->instance_cnt_rx < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_rx is -1 - pthread_cond_wait( &proc->cond_rx, &proc->mutex_rx ); // this unlocks mutex_rx while waiting and then locks it again - } - - if (pthread_mutex_unlock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error unlocking mutex" ); - break; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - start_meas( &softmodem_stats_rx_sf[proc->subframe] ); + if (oai_exit) break; - - if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD )&&(subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx)==SF_UL)) || - (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { - - phy_procedures_eNB_RX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); - } - - if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx) == SF_S)) { - phy_procedures_eNB_S_RX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); - } - - if (pthread_mutex_lock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RX proc %d\n", proc->subframe ); + + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n", proc->thread_index ); exit_fun( "error locking mutex" ); break; } - - proc->instance_cnt_rx--; - - if (pthread_mutex_unlock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->subframe ); + + while (proc->instance_cnt_prach < 0) { + // most of the time the thread is waiting here + // proc->instance_cnt_tx is -1 + pthread_cond_wait( &proc->cond_prach, &proc->mutex_prach ); // this unlocks mutex_tx while waiting and then locks it again + } + + if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB PRACH proc %d\n", proc->thread_index ); exit_fun( "error unlocking mutex" ); break; } - proc->frame_rx++; - - if (proc->frame_rx==1024) - proc->frame_rx=0; - - stop_meas( &softmodem_stats_rx_sf[proc->subframe] ); -#ifdef LOWLATENCY - if (opp_enabled){ - if(softmodem_stats_rx_sf[proc->subframe].diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf[proc->subframe].diff_now/cpuf - attr.sched_runtime)/1000000.0); - } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); + prach_procedures(eNB,proc->thread_index,0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); + + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n", proc->thread_index ); + exit_fun( "error locking mutex" ); + break; } -#endif // LOWLATENCY - print_meas_now(&softmodem_stats_rx_sf[proc->subframe],"eNB_RX_SF",proc->subframe, rx_time_file); - } - - //stop_meas( &softmodem_stats_rx_sf[proc->subframe] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 0 ); - + + proc->instance_cnt_prach--; + + if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->thread_index ); + exit_fun( "error unlocking mutex" ); + break; + } + } #ifdef DEBUG_THREADS - printf( "Exiting eNB thread RX %d\n", proc->subframe ); + printf( "Exiting eNB thread PRACH\n"); #endif - eNB_thread_rx_status[proc->subframe] = 0; - return &eNB_thread_rx_status[proc->subframe]; + eNB_thread_prach_status = 0; + return &eNB_thread_prach_status; } @@ -740,9 +908,14 @@ void init_eNB_proc(void) { int i; int CC_id; + PHY_VARS_eNB *eNB; + eNB_proc_t *proc; for (CC_id=0; CC_idproc[i]; // set the stack size @@ -757,48 +930,41 @@ void init_eNB_proc(void) perror("[ENB_PROC_RX] setting thread stack size failed\n"); */ // set the kernel scheduling policy and priority - sched_param_eNB_proc_tx[CC_id][i].sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_eNB_proc_tx[CC_id][i], &sched_param_eNB_proc_tx[CC_id][i]); - pthread_attr_setschedpolicy (&attr_eNB_proc_tx[CC_id][i], SCHED_FIFO); - sched_param_eNB_proc_rx[CC_id][i].sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_eNB_proc_rx[CC_id][i], &sched_param_eNB_proc_rx[CC_id][i]); - pthread_attr_setschedpolicy (&attr_eNB_proc_rx[CC_id][i], SCHED_FIFO); + proc->sched_param_tx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_tx, &proc->sched_param_tx); + pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO); + + proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_rx, &proc->sched_param_rx); + pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO); + + proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); + pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO); + printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); #endif - PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_tx = -1; - PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx = -1; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe = i; - PHY_vars_eNB_g[0][CC_id]->proc[i].CC_id = CC_id; - pthread_mutex_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx, NULL); - pthread_mutex_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx, NULL); - pthread_cond_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx, NULL); - pthread_cond_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx, NULL); + proc->instance_cnt_tx = -1; + proc->instance_cnt_prach = -1; + proc->CC_id = CC_id; + pthread_mutex_init( &proc->mutex_tx, NULL); + pthread_cond_init( &proc->cond_tx, NULL); + pthread_cond_init( &proc->cond_prach, NULL); #ifndef LOWLATENCY - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, &attr_eNB_proc_tx[CC_id][i], eNB_thread_tx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, &attr_eNB_proc_rx[CC_id][i], eNB_thread_rx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); + pthread_create( &proc->pthread_tx, &proc->attr_tx, eNB_thread_tx, &eNB->proc[i] ); + pthread_create( &proc->pthread_rx, &proc->attr_rx, eNB_thread_rx, &eNB->proc[i] ); + pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc[i] ); #else - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, NULL, eNB_thread_tx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, NULL, eNB_thread_rx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); + pthread_create( &proc->pthread_tx, NULL, eNB_thread_tx, &eNB->proc[i] ); + pthread_create( &proc->pthread_rx, NULL, eNB_thread_rx, &eNB->proc[i] ); + pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc[i] ); #endif char name[16]; snprintf( name, sizeof(name), "TX %d", i ); - pthread_setname_np( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, name ); + pthread_setname_np( proc->pthread_tx, name ); snprintf( name, sizeof(name), "RX %d", i ); - pthread_setname_np( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, name ); - PHY_vars_eNB_g[0][CC_id]->proc[i].frame_tx = 0; - PHY_vars_eNB_g[0][CC_id]->proc[i].frame_rx = 0; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_rx = i; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_tx = (i+2)%10; + pthread_setname_np( proc->pthread_rx, name ); } - - - - // TX processes subframe +2, RX subframe - // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 8,9 and 0 have to start with frame 1 - // PHY_vars_eNB_g[0][CC_id]->proc[7].frame_tx = 1; - PHY_vars_eNB_g[0][CC_id]->proc[8].frame_tx = 1; - PHY_vars_eNB_g[0][CC_id]->proc[9].frame_tx = 1; - // PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1; } /* setup PHY proc TX sync mechanism */ @@ -815,22 +981,25 @@ void init_eNB_proc(void) void kill_eNB_proc(void) { int *status; - - for (int CC_id=0; CC_idproc[i]; + #ifdef DEBUG_THREADS printf( "Killing TX CC_id %d thread %d\n", CC_id, i ); #endif - PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_tx = 0; // FIXME data race! - pthread_cond_signal( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx ); + proc->instance_cnt_tx = 0; // FIXME data race! + pthread_cond_signal( &proc->cond_tx ); pthread_cond_broadcast(&sync_phy_proc[i].cond_phy_proc_tx); #ifdef DEBUG_THREADS printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i ); #endif - int result = pthread_join( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, (void**)&status ); + int result = pthread_join( proc->pthread_tx, (void**)&status ); #ifdef DEBUG_THREADS @@ -852,13 +1021,10 @@ void kill_eNB_proc(void) printf( "Killing RX CC_id %d thread %d\n", CC_id, i ); #endif - PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx = 0; // FIXME data race! - pthread_cond_signal( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx ); - #ifdef DEBUG_THREADS printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i ); #endif - result = pthread_join( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, (void**)&status ); + result = pthread_join( proc->pthread_rx, (void**)&status ); #ifdef DEBUG_THREADS @@ -876,14 +1042,12 @@ void kill_eNB_proc(void) UNUSED(result) #endif - pthread_mutex_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx ); - pthread_mutex_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx ); - pthread_cond_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx ); - pthread_cond_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx ); + pthread_mutex_destroy( &proc->mutex_tx ); + pthread_cond_destroy( &proc->cond_tx ); } + } } - /* this function maps the phy_vars_eNB tx and rx buffers to the available rf chains. Each rf chain is is addressed by the card number and the chain on the card. The rf_map specifies for each CC, on which rf chain the mapping should start. Multiple @@ -902,7 +1066,7 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c for (CC_id=0; CC_idlte_frame_parms); + frame_parms = &(phy_vars_eNB[CC_id]->frame_parms); printf("setup_eNB_buffers: frame_parms = %p\n",frame_parms); } else { printf("phy_vars_eNB[%d] not initialized\n", CC_id); @@ -929,8 +1093,8 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c for (i=0; inb_antennas_rx; i++) { printf("Mapping eNB CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i]; + free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i]; if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) { printf("Error with rf_map! A channel has already been allocated!\n"); @@ -941,18 +1105,18 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c openair0_cfg[rf_map[CC_id].card].rx_num_channels++; } - printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); + printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); for (j=0; j<16; j++) { - printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j] = 16-j; + printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j]); + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j] = 16-j; } } for (i=0; inb_antennas_tx; i++) { printf("Mapping eNB CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; + free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); + phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) { printf("Error with rf_map! A channel has already been allocated!\n"); @@ -963,11 +1127,11 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c openair0_cfg[rf_map[CC_id].card].tx_num_channels++; } - printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); + printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); for (j=0; j<16; j++) { - printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j] = 16-j; + printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.txdata[0][i][j]); + phy_vars_eNB[CC_id]->common_vars.txdata[0][i][j] = 16-j; } } @@ -976,20 +1140,20 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c txdata = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); for (i=0; inb_antennas_rx; i++) { - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); + free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory memset(rxdata[i], 0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i],rxdata[i],N_TA_offset); + printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->common_vars.rxdata[0][i],rxdata[i],N_TA_offset); } for (i=0; inb_antennas_tx; i++) { - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); + free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = txdata[i]; + phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = txdata[i]; memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); + printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); } @@ -1000,33 +1164,14 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c } -#if defined(ENABLE_ITTI) -static void wait_system_ready (char *message, volatile int *start_flag) -{ - /* Wait for eNB application initialization to be complete (eNB registration to MME) */ - { - static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", - " ....", " ...", " ..", " .", " " - }; - int i = 0; - while ((!oai_exit) && (*start_flag == 0)) { - LOG_N(EMU, message, indicator[i]); - fflush(stdout); - i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); - usleep(200000); - } - - LOG_D(EMU,"\n"); - } -} -#endif /*! * \brief This is the main eNB thread. * \param arg unused * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ +/* static void* eNB_thread( void* arg ) { UNUSED(arg); @@ -1035,13 +1180,14 @@ static void* eNB_thread( void* arg ) unsigned char slot; // the USRP implementation operates on subframes, not slots // one subframe consists of one even and one odd slot + slot = 1; int spp; int tx_launched = 0; int card=0; - void *rxp[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_rx - void *txp[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_tx + void *rxp[2]; // FIXME hard coded array size; indexed by frame_parms.nb_antennas_rx + void *txp[2]; // FIXME hard coded array size; indexed by frame_parms.nb_antennas_tx int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9 @@ -1051,7 +1197,7 @@ static void* eNB_thread( void* arg ) int CC_id=0; struct timespec trx_time0, trx_time1, trx_time2; - /* avoid gcc warnings */ + //avoid gcc warnings (void)trx_time0; (void)trx_time1; (void)trx_time2; @@ -1065,7 +1211,7 @@ static void* eNB_thread( void* arg ) attr.sched_nice = 0; attr.sched_priority = 0; - /* This creates a .2 ms reservation */ + //This creates a .2 ms reservation attr.sched_policy = SCHED_DEADLINE; attr.sched_runtime = (0.3 * 100) * 10000; attr.sched_deadline = (0.9 * 100) * 10000; @@ -1086,8 +1232,8 @@ static void* eNB_thread( void* arg ) char cpu_affinity[1024]; cpu_set_t cpuset; - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ + //Set affinity mask to include CPUs 1 to MAX_CPUS + //CPU 0 is reserved for UHD threads CPU_ZERO(&cpuset); #ifdef CPU_AFFINITY if (get_nprocs() >2) @@ -1104,7 +1250,7 @@ static void* eNB_thread( void* arg ) } #endif // CPU_AFFINITY - /* Check the actual affinity mask assigned to the thread */ + //Check the actual affinity mask assigned to the thread s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); if (s != 0) @@ -1192,7 +1338,7 @@ static void* eNB_thread( void* arg ) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); tx_launched = 0; - while (rx_pos < ((1+hw_subframe)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti)) { + while (rx_pos < ((1+hw_subframe)*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti)) { unsigned int rxs; #ifndef USRP_DEBUG @@ -1202,12 +1348,12 @@ static void* eNB_thread( void* arg ) clock_gettime( CLOCK_MONOTONIC, &trx_time0 ); - start_meas( &softmodem_stats_hw ); + start_meas( &softmodem_stats_hw ); openair0_timestamp timestamp; int i=0; // prepare rx buffer pointers - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) + for (i=0; iframe_parms.nb_antennas_rx; i++) rxp[i] = (void*)&rxdata[i][rx_pos]; // check if nsymb_read == spp // map antenna port i to the cc_id. Now use the 1:1 mapping @@ -1215,7 +1361,7 @@ static void* eNB_thread( void* arg ) ×tamp, rxp, spp, - PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx); + PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx); stop_meas( &softmodem_stats_hw ); if (frame > 50) { @@ -1232,7 +1378,7 @@ static void* eNB_thread( void* arg ) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers - for (i=0; ilte_frame_parms.nb_antennas_tx; i++) + for (i=0; iframe_parms.nb_antennas_tx; i++) txp[i] = (void*)&txdata[i][tx_pos]; // if symb_written < spp ==> error if (frame > 50) { @@ -1240,7 +1386,7 @@ static void* eNB_thread( void* arg ) (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance), txp, spp, - PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx, + PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, 1); } @@ -1259,16 +1405,11 @@ static void* eNB_thread( void* arg ) // USRP_DEBUG is active rt_sleep_ns(1000000); #endif - /* FT configurable tx lauch delay (in slots): txlaunch_wait, txlaunch_wait_slotcount is device specific and - set in the corresponding library (with txlaunch_wait=1 and txlaunch_wait_slotcount=1 the check is as it previously was) */ - /* old check: - if ((frame>50) && - (tx_launched == 0) && - (rx_pos >= (((2*hw_subframe)+1)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))) {*/ + if ( (frame>50) && (tx_launched == 0) && ((openair0_cfg[card].txlaunch_wait == 0) || ((openair0_cfg[card].txlaunch_wait == 1) && - (rx_pos >= (((2*hw_subframe)+openair0_cfg[card].txlaunch_wait_slotcount)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))))) { + (rx_pos >= (((2*hw_subframe)+openair0_cfg[card].txlaunch_wait_slotcount)*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti>>1))))) { tx_launched = 1; @@ -1339,7 +1480,7 @@ static void* eNB_thread( void* arg ) exit_fun( "error locking mutex_rx" ); break; } - + int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx; pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx ); @@ -1390,6 +1531,7 @@ eNB_thread_cleanup: return &eNB_thread_status; } +*/ void reset_opp_meas(void) { int sfn; @@ -1415,25 +1557,19 @@ void print_opp_meas(void) { } -void init_eNB() { +void init_eNB(eNB_func_t node_function) { - int error_code; - pthread_attr_init (&attr_dlsch_threads); - pthread_attr_setstacksize(&attr_dlsch_threads,4*PTHREAD_STACK_MIN); + int CC_id; -#ifndef LOWLATENCY - sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_dlsch_threads, &sched_param_dlsch); - pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); - printf("Setting eNB_thread FIFO scheduling policy with priority %d \n", sched_param_dlsch.sched_priority); -#endif + for (CC_id=0;CC_idnode_function = node_function; init_eNB_proc(); sleep(1); LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); - + /* printf("Creating main eNB_thread \n"); error_code = pthread_create( &main_eNB_thread, &attr_dlsch_threads, eNB_thread, NULL ); @@ -1443,16 +1579,19 @@ void init_eNB() { LOG_D( HW, "[lte-softmodem.c] Allocate eNB_thread successful\n" ); pthread_setname_np( main_eNB_thread, "main eNB" ); } + */ } void stop_eNB() { + /* #ifdef DEBUG_THREADS printf("Joining eNB_thread ..."); #endif - int *eNB_thread_status_p; - int result = pthread_join( main_eNB_thread, (void**)&eNB_thread_status_p ); + int *eNB_thread_status_p; + int result = pthread_join( main_eNB_thread, (void**)&eNB_thread_status_p ); + #ifdef DEBUG_THREADS if (result != 0) { @@ -1468,6 +1607,7 @@ void stop_eNB() { #else UNUSED(result); #endif // DEBUG_THREADS + */ printf("Killing eNB processing threads\n"); kill_eNB_proc(); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index e903fd0c9a..26c4a9ae88 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -115,7 +115,7 @@ unsigned short config_frames[4] = {2,9,11,13}; // In lte-enb.c extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); -extern void init_eNB(void); +extern void init_eNB(eNB_func_t); extern void stop_eNB(void); extern void kill_eNB_proc(void); @@ -427,27 +427,27 @@ void reset_stats(FL_OBJECT *button, long arg) for (i=0; idlsch_eNB[i][0]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; + for (j=0; jdlsch[i][0]->Mlimit; j++) { + phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0; + phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0; + phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0; } - phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + phy_vars_eNB->UE_stats[i].dlsch_l2_errors[k]=0; + phy_vars_eNB->UE_stats[i].ulsch_errors[k]=0; + phy_vars_eNB->UE_stats[i].ulsch_consecutive_errors=0; - for (j=0; julsch_eNB[i]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; + for (j=0; julsch[i]->Mlimit; j++) { + phy_vars_eNB->UE_stats[i].ulsch_decoding_attempts[k][j]=0; + phy_vars_eNB->UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; + phy_vars_eNB->UE_stats[i].ulsch_round_errors[k][j]=0; + phy_vars_eNB->UE_stats[i].ulsch_round_fer[k][j]=0; } } - phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; + phy_vars_eNB->UE_stats[i].dlsch_sliding_cnt=0; + phy_vars_eNB->UE_stats[i].dlsch_NAK_round0=0; + phy_vars_eNB->UE_stats[i].dlsch_mcs_offset=0; } } @@ -507,7 +507,7 @@ static void *scope_thread(void *arg) ue_cnt=0; for(UE_id=0; UE_iddlsch_eNB[UE_id][0]->rnti>0) && (ue_cntdlsch[UE_id][0]->rnti>0) && (ue_cntUE_scan_carrier = UE_scan_carrier; UE[CC_id]->mode = mode; - compute_prach_seq(&UE[CC_id]->lte_frame_parms.prach_config_common, - UE[CC_id]->lte_frame_parms.frame_type, + compute_prach_seq(&UE[CC_id]->frame_parms.prach_config_common, + UE[CC_id]->frame_parms.frame_type, UE[CC_id]->X_u); if (UE[CC_id]->mac_enabled == 1) - UE[CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1234; + UE[CC_id]->pdcch_vars[0]->crnti = 0x1234; else - UE[CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235; + UE[CC_id]->pdcch_vars[0]->crnti = 0x1235; UE[CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0]; UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id]; @@ -1398,11 +1399,11 @@ int main( int argc, char **argv ) } } - compute_prach_seq(&PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.prach_config_common, - PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.frame_type, + compute_prach_seq(&PHY_vars_eNB_g[0][CC_id]->frame_parms.prach_config_common, + PHY_vars_eNB_g[0][CC_id]->frame_parms.frame_type, PHY_vars_eNB_g[0][CC_id]->X_u); - PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = (int)rx_gain[CC_id][0]; + PHY_vars_eNB_g[0][CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0]; PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; @@ -1466,8 +1467,8 @@ int main( int argc, char **argv ) } printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, - ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx), - ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx)); + ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx), + ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); openair0_cfg[card].Mod_id = 0; #ifdef ETHERNET @@ -1484,8 +1485,8 @@ int main( int argc, char **argv ) // since the USRP only supports one CC (for the moment), we initialize all the cards with first CC. // in the case of EXMIMO2, these values are overwirtten in the function setup_eNB/UE_buffer - openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx)); - openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx)); + openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx)); + openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); for (i=0; i<4; i++) { @@ -1500,7 +1501,7 @@ int main( int argc, char **argv ) openair0_cfg[card].autocal[i] = 1; openair0_cfg[card].tx_gain[i] = tx_gain[0][i]; if (UE_flag == 0) { - openair0_cfg[card].rx_gain[i] = PHY_vars_eNB_g[0][0]->rx_total_gain_eNB_dB; + openair0_cfg[card].rx_gain[i] = PHY_vars_eNB_g[0][0]->rx_total_gain_dB; } else { openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB; @@ -1650,12 +1651,12 @@ int main( int argc, char **argv ) for (CC_id=0; CC_idsamples_per_tti*10; i++) for (aa=0; aanb_antennas_tx; aa++) - UE[CC_id]->lte_ue_common_vars.txdata[aa][i] = 0x00010001; + UE[CC_id]->common_vars.txdata[aa][i] = 0x00010001; } if (input_fd) { printf("Reading in from file to antenna buffer %d\n",0); - if (fread(UE[0]->lte_ue_common_vars.rxdata[0], + if (fread(UE[0]->common_vars.rxdata[0], sizeof(int32_t), frame_parms[0]->samples_per_tti*10, input_fd) != frame_parms[0]->samples_per_tti*10) @@ -1678,7 +1679,7 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0][CC_id]->hw_timing_advance = 0; for (i=0; isamples_per_tti*10; i++) for (aa=0; aanb_antennas_tx; aa++) - PHY_vars_eNB_g[0][CC_id]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001; + PHY_vars_eNB_g[0][CC_id]->common_vars.txdata[0][aa][i] = 0x00010001; } } @@ -1751,7 +1752,7 @@ int main( int argc, char **argv ) // start the main thread if (UE_flag == 1) init_UE(); - else init_eNB(); + else init_eNB(node_function); // Sleep to allow all threads to setup sleep(1); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 865f257135..1fc3088598 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -361,7 +361,7 @@ static void *UE_thread_synch(void *arg) openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; #if 0 // UHD 3.8 - switch(UE->lte_frame_parms.N_RB_DL) { + switch(UE->frame_parms.N_RB_DL) { case 6: openair0_cfg[card].rx_gain[i] -= 12; break; @@ -379,7 +379,7 @@ static void *UE_thread_synch(void *arg) break; default: - printf( "Unknown number of RBs %d\n", UE->lte_frame_parms.N_RB_DL ); + printf( "Unknown number of RBs %d\n", UE->frame_parms.N_RB_DL ); break; } #endif @@ -440,7 +440,7 @@ static void *UE_thread_synch(void *arg) openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; // 65 calibrated for USRP B210 @ 2.6 GHz #if 0 // UHD 3.8 - switch(UE->lte_frame_parms.N_RB_DL) { + switch(UE->frame_parms.N_RB_DL) { case 6: openair0_cfg[card].rx_gain[i] -= 12; break; @@ -458,7 +458,7 @@ static void *UE_thread_synch(void *arg) break; default: - printf("Unknown number of RBs %d\n",UE->lte_frame_parms.N_RB_DL); + printf("Unknown number of RBs %d\n",UE->frame_parms.N_RB_DL); break; } #endif @@ -485,7 +485,7 @@ static void *UE_thread_synch(void *arg) LOG_I(PHY,"[UE thread Synch] Running Initial Synch\n"); if (initial_sync( UE, UE->mode ) == 0) { - hw_slot_offset = (UE->rx_offset<<1) / UE->lte_frame_parms.samples_per_tti; + hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_tti; LOG_I( HW, "Got synch: hw_slot_offset %d\n", hw_slot_offset ); if (UE->UE_scan_carrier == 1) { @@ -493,14 +493,14 @@ static void *UE_thread_synch(void *arg) // rerun with new cell parameters and frequency-offset for (i=0;irx_total_gain_dB;//-USRP_GAIN_OFFSET; - openair0_cfg[0].rx_freq[i] -= UE->lte_ue_common_vars.freq_offset; + openair0_cfg[0].rx_freq[i] -= UE->common_vars.freq_offset; openair0_cfg[0].tx_freq[i] = openair0_cfg[0].rx_freq[i]+uplink_frequency_offset[0][i]; downlink_frequency[0][i] = openair0_cfg[0].rx_freq[i]; freq_offset=0; } // reconfigure for potentially different bandwidth - switch(UE->lte_frame_parms.N_RB_DL) { + switch(UE->frame_parms.N_RB_DL) { case 6: openair0_cfg[0].sample_rate =1.92e6; openair0_cfg[0].rx_bw =.96e6; @@ -531,7 +531,7 @@ static void *UE_thread_synch(void *arg) //openair0.trx_set_gains_func(&openair0,&openair0_cfg[0]); //openair0.trx_stop_func(0); sleep(1); - init_frame_parms(&UE->lte_frame_parms,1); + init_frame_parms(&UE->frame_parms,1); } else { UE->is_synchronized = 1; @@ -540,9 +540,9 @@ static void *UE_thread_synch(void *arg) FILE *fd; if ((UE->frame_rx&1) == 0) { // this guarantees SIB1 is present if ((fd = fopen("rxsig_frame0.dat","w")) != NULL) { - fwrite((void*)&UE->lte_ue_common_vars.rxdata[0][0], + fwrite((void*)&UE->common_vars.rxdata[0][0], sizeof(int32_t), - 10*UE->lte_frame_parms.samples_per_tti, + 10*UE->frame_parms.samples_per_tti, fd); LOG_I(PHY,"Dummping Frame ... bye bye \n"); fclose(fd); @@ -578,9 +578,9 @@ static void *UE_thread_synch(void *arg) LOG_I( PHY, "[initial_sync] No cell synchronization found, abandoning\n" ); FILE *fd; if ((fd = fopen("rxsig_frame0.dat","w"))!=NULL) { - fwrite((void*)&UE->lte_ue_common_vars.rxdata[0][0], + fwrite((void*)&UE->common_vars.rxdata[0][0], sizeof(int32_t), - 10*UE->lte_frame_parms.samples_per_tti, + 10*UE->frame_parms.samples_per_tti, fd); LOG_I(PHY,"Dummping Frame ... bye bye \n"); fclose(fd); @@ -793,12 +793,12 @@ static void *UE_thread_tx(void *arg) } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_TX, 1 ); - if ((subframe_select( &UE->lte_frame_parms, UE->slot_tx>>1 ) == SF_UL) || - (UE->lte_frame_parms.frame_type == FDD)) { + if ((subframe_select( &UE->frame_parms, UE->slot_tx>>1 ) == SF_UL) || + (UE->frame_parms.frame_type == FDD)) { phy_procedures_UE_TX( UE, 0, 0, UE->mode, no_relay ); } - if ((subframe_select( &UE->lte_frame_parms, UE->slot_tx>>1 ) == SF_S) && + if ((subframe_select( &UE->frame_parms, UE->slot_tx>>1 ) == SF_S) && ((UE->slot_tx&1) == 1)) { phy_procedures_UE_S_TX( UE, 0, 0, no_relay ); } @@ -999,14 +999,14 @@ static void *UE_thread_rx(void *arg) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 1 ); for (i=0; i<2; i++) { - if ((subframe_select( &UE->lte_frame_parms, UE->slot_rx>>1 ) == SF_DL) || - (UE->lte_frame_parms.frame_type == FDD)) { + if ((subframe_select( &UE->frame_parms, UE->slot_rx>>1 ) == SF_DL) || + (UE->frame_parms.frame_type == FDD)) { /* #ifdef OAI_USRP // this does the adjustments of RX signal amplitude to bring into least 12 significant bits - int slot_length = UE->lte_frame_parms.samples_per_tti>>1; + int slot_length = UE->frame_parms.samples_per_tti>>1; int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset; - int frame_length = UE->lte_frame_parms.samples_per_tti*10; + int frame_length = UE->frame_parms.samples_per_tti*10; int aa; if (rx_offset > frame_length) rx_offset-=frame_length; @@ -1014,24 +1014,24 @@ static void *UE_thread_rx(void *arg) if (rx_offset >= 0) { if (rx_offset + slot_length < frame_length) - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++) - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], + for (aa=0;aaframe_parms.nb_antennas_rx;aa++) + rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)], slot_length); else { int diff = rx_offset + slot_length - frame_length; - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], + for (aa=0;aaframe_parms.nb_antennas_rx;aa++){ + rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)], slot_length-diff); - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], + rescale((int16_t*)&UE->common_vars.rxdata[aa][0], diff); } } } else { - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], + for (aa=0;aaframe_parms.nb_antennas_rx;aa++){ + rescale((int16_t*)&UE->common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], -rx_offset); - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], + rescale((int16_t*)&UE->common_vars.rxdata[aa][0], slot_length+rx_offset); } } @@ -1040,38 +1040,38 @@ static void *UE_thread_rx(void *arg) phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL ); } - if ((subframe_select( &UE->lte_frame_parms, UE->slot_rx>>1 ) == SF_S) && + if ((subframe_select( &UE->frame_parms, UE->slot_rx>>1 ) == SF_S) && ((UE->slot_rx&1) == 0)) { /* #ifdef OAI_USRP // this does the adjustments of RX signal amplitude to bring into least 12 significant bits - int slot_length = UE->lte_frame_parms.samples_per_tti>>1; + int slot_length = UE->frame_parms.samples_per_tti>>1; int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset; - int frame_length = UE->lte_frame_parms.samples_per_tti*10; + int frame_length = UE->frame_parms.samples_per_tti*10; if (rx_offset > frame_length) rx_offset-=frame_length; int aa; if (rx_offset >= 0) { if (rx_offset + slot_length < frame_length) - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++) - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], + for (aa=0;aaframe_parms.nb_antennas_rx;aa++) + rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)], slot_length); else { int diff = rx_offset + slot_length - frame_length; - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], + for (aa=0;aaframe_parms.nb_antennas_rx;aa++){ + rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)], slot_length-diff); - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], + rescale((int16_t*)&UE->common_vars.rxdata[aa][0], diff); } } } else { - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], + for (aa=0;aaframe_parms.nb_antennas_rx;aa++){ + rescale((int16_t*)&UE->common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], -rx_offset); - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], + rescale((int16_t*)&UE->common_vars.rxdata[aa][0], slot_length+rx_offset); } } @@ -1084,7 +1084,7 @@ static void *UE_thread_rx(void *arg) ret = mac_xface->ue_scheduler(UE->Mod_id, UE->frame_tx, UE->slot_rx>>1, - subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1), + subframe_select(&UE->frame_parms,UE->slot_tx>>1), 0, 0/*FIXME CC_id*/); @@ -1238,15 +1238,15 @@ void *UE_thread(void *arg) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, dummy_dump ); - while (rxpos < (1+hw_subframe)*UE->lte_frame_parms.samples_per_tti) { + while (rxpos < (1+hw_subframe)*UE->frame_parms.samples_per_tti) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); #ifndef USRP_DEBUG - DevAssert( UE->lte_frame_parms.nb_antennas_rx <= 2 ); + DevAssert( UE->frame_parms.nb_antennas_rx <= 2 ); void* rxp[2]; - for (int i=0; ilte_frame_parms.nb_antennas_rx; i++) + for (int i=0; iframe_parms.nb_antennas_rx; i++) rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i]; /* if (dummy_dump == 0) @@ -1257,7 +1257,7 @@ void *UE_thread(void *arg) ×tamp, rxp, spp - ((first_rx==1) ? rx_off_diff : 0), - UE->lte_frame_parms.nb_antennas_rx); + UE->frame_parms.nb_antennas_rx); if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) { printf("rx error: asked %d got %d ",spp - ((first_rx==1) ? rx_off_diff : 0),rxs); @@ -1277,17 +1277,17 @@ void *UE_thread(void *arg) if ((tx_enabled==1) && (UE->mode!=loop_through_memory)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - DevAssert( UE->lte_frame_parms.nb_antennas_tx <= 2 ); + DevAssert( UE->frame_parms.nb_antennas_tx <= 2 ); void* txp[2]; - for (int i=0; ilte_frame_parms.nb_antennas_tx; i++) + for (int i=0; iframe_parms.nb_antennas_tx; i++) txp[i] = (void*)&txdata[i][txpos]; openair0.trx_write_func(&openair0, (timestamp+openair0_cfg[0].tx_scheduling_advance-openair0_cfg[0].tx_sample_advance), txp, spp - ((first_rx==1) ? rx_off_diff : 0), - UE->lte_frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_tx, 1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); @@ -1305,12 +1305,12 @@ void *UE_thread(void *arg) rxpos += spp; txpos += spp; - if (txpos >= 10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti) - txpos -= 10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti; + if (txpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti) + txpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti; } - if (rxpos >= 10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti) - rxpos -= 10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti; + if (rxpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti) + rxpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti; if (UE->is_synchronized == 1) { LOG_D( HW, "UE_thread: hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); @@ -1353,14 +1353,14 @@ void *UE_thread(void *arg) if (frame == 10) { LOG_D(PHY, "[SCHED][UE] Found cell with N_RB_DL %"PRIu8", PHICH CONFIG (%d,%d), Nid_cell %"PRIu16", NB_ANTENNAS_TX %"PRIu8", frequency offset "PRIi32" Hz, RSSI (digital) %hu dB, measured Gain %d dB, total_rx_gain %"PRIu32" dB, USRP rx gain %f dB\n", - UE->lte_frame_parms.N_RB_DL, - UE->lte_frame_parms.phich_config_common.phich_duration, - UE->lte_frame_parms.phich_config_common.phich_resource, - UE->lte_frame_parms.Nid_cell, - UE->lte_frame_parms.nb_antennas_tx_eNB, - UE->lte_ue_common_vars.freq_offset, - UE->PHY_measurements.rx_power_avg_dB[0], - UE->PHY_measurements.rx_power_avg_dB[0] - rx_input_level_dBm, + UE->frame_parms.N_RB_DL, + UE->frame_parms.phich_config_common.phich_duration, + UE->frame_parms.phich_config_common.phich_resource, + UE->frame_parms.Nid_cell, + UE->frame_parms.nb_antennas_tx_eNB, + UE->common_vars.freq_offset, + UE->measurements.rx_power_avg_dB[0], + UE->measurements.rx_power_avg_dB[0] - rx_input_level_dBm, UE->rx_total_gain_dB, openair0_cfg[0].rx_gain[0] ); @@ -1471,7 +1471,7 @@ void *UE_thread(void *arg) // the UE_thread_synch is ready if (UE->is_synchronized == 1) { rx_off_diff = 0; - LTE_DL_FRAME_PARMS *frame_parms = &UE->lte_frame_parms; // for macro FRAME_LENGTH_COMPLEX_SAMPLES + LTE_DL_FRAME_PARMS *frame_parms = &UE->frame_parms; // for macro FRAME_LENGTH_COMPLEX_SAMPLES // LOG_I(PHY,"UE->rx_offset %d\n",UE->rx_offset); if ((UE->rx_offset > RX_OFF_MAX) && (start_rx_stream == 0)) { @@ -1486,7 +1486,7 @@ void *UE_thread(void *arg) ×tamp, (void**)rxdata, UE->rx_offset, - UE->lte_frame_parms.nb_antennas_rx); + UE->frame_parms.nb_antennas_rx); if (rxs != UE->rx_offset) { exit_fun("problem in rx"); return &UE_thread_retval; @@ -1616,7 +1616,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, for (CC_id=0; CC_idlte_frame_parms); + frame_parms = &(phy_vars_ue[CC_id]->frame_parms); } else { printf("phy_vars_UE[%d] not initialized\n", CC_id); return(-1); @@ -1639,20 +1639,20 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, for (i=0; inb_antennas_rx; i++) { printf( "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); - free( phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] ); + free( phy_vars_ue[CC_id]->common_vars.rxdata[i] ); rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); - phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD + phy_vars_ue[CC_id]->common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD } for (i=0; inb_antennas_tx; i++) { printf( "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); - free( phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] ); + free( phy_vars_ue[CC_id]->common_vars.txdata[i] ); txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); - phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = txdata[i]; + phy_vars_ue[CC_id]->common_vars.txdata[i] = txdata[i]; } - // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[x] - // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[x] + // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.rxdata[x] + // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.txdata[x] // be careful when releasing memory! // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes) diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index 861bfa6cbf..583891f1ac 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -59,9 +59,9 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, memset(PHY_vars_eNB,0,sizeof(PHY_VARS_eNB)); PHY_vars_eNB->Mod_id=eNB_id; PHY_vars_eNB->cooperation_flag=cooperation_flag; - memcpy(&(PHY_vars_eNB->lte_frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); - PHY_vars_eNB->lte_frame_parms.Nid_cell = ((Nid_cell/3)*3)+((eNB_id+Nid_cell)%3); - PHY_vars_eNB->lte_frame_parms.nushift = PHY_vars_eNB->lte_frame_parms.Nid_cell%6; + memcpy(&(PHY_vars_eNB->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); + PHY_vars_eNB->frame_parms.Nid_cell = ((Nid_cell/3)*3)+((eNB_id+Nid_cell)%3); + PHY_vars_eNB->frame_parms.nushift = PHY_vars_eNB->frame_parms.Nid_cell%6; phy_init_lte_eNB(PHY_vars_eNB,0,cooperation_flag,abstraction_flag); LOG_I(PHY,"init eNB: Nid_cell %d\n", frame_parms->Nid_cell); @@ -73,20 +73,20 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, for (i=0; idlsch_eNB[i][j] = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL,abstraction_flag); + PHY_vars_eNB->dlsch[i][j] = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL,abstraction_flag); - if (!PHY_vars_eNB->dlsch_eNB[i][j]) { + if (!PHY_vars_eNB->dlsch[i][j]) { LOG_E(PHY,"Can't get eNB dlsch structures for UE %d \n", i); exit(-1); } else { - LOG_D(PHY,"dlsch_eNB[%d][%d] => %p\n",i,j,PHY_vars_eNB->dlsch_eNB[i][j]); - PHY_vars_eNB->dlsch_eNB[i][j]->rnti=0; + LOG_D(PHY,"dlsch[%d][%d] => %p\n",i,j,PHY_vars_eNB->dlsch[i][j]); + PHY_vars_eNB->dlsch[i][j]->rnti=0; } } - PHY_vars_eNB->ulsch_eNB[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,frame_parms->N_RB_UL, abstraction_flag); + PHY_vars_eNB->ulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,frame_parms->N_RB_UL, abstraction_flag); - if (!PHY_vars_eNB->ulsch_eNB[1+i]) { + if (!PHY_vars_eNB->ulsch[1+i]) { LOG_E(PHY,"Can't get eNB ulsch structures\n"); exit(-1); } @@ -95,45 +95,45 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, // this will be overwritten with the real transmission mode by the RRC once the UE is connected PHY_vars_eNB->transmission_mode[i] = transmission_mode; #ifdef LOCALIZATION - PHY_vars_eNB->ulsch_eNB[1+i]->aggregation_period_ms = 5000; // 5000 milliseconds // could be given as an argument (TBD)) + PHY_vars_eNB->ulsch[1+i]->aggregation_period_ms = 5000; // 5000 milliseconds // could be given as an argument (TBD)) struct timeval ts; gettimeofday(&ts, NULL); - PHY_vars_eNB->ulsch_eNB[1+i]->reference_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; + PHY_vars_eNB->ulsch[1+i]->reference_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; int j; for (j=0; j<10; j++) { - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_rss_list[j]); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_rssi_list[j]); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_subcarrier_rss_list[j]); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_timing_advance_list[j]); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_timing_update_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_rss_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_rssi_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_subcarrier_rss_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_timing_advance_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_timing_update_list[j]); } - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_rss_list); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_rssi_list); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_subcarrier_rss_list); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_timing_advance_list); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_timing_update_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_rss_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_rssi_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_subcarrier_rss_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_timing_advance_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_timing_update_list); #endif } // ULSCH for RA - PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS, frame_parms->N_RB_UL, abstraction_flag); + PHY_vars_eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS, frame_parms->N_RB_UL, abstraction_flag); - if (!PHY_vars_eNB->ulsch_eNB[0]) { + if (!PHY_vars_eNB->ulsch[0]) { LOG_E(PHY,"Can't get eNB ulsch structures\n"); exit(-1); } - PHY_vars_eNB->dlsch_eNB_SI = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag); - LOG_D(PHY,"eNB %d : SI %p\n",eNB_id,PHY_vars_eNB->dlsch_eNB_SI); - PHY_vars_eNB->dlsch_eNB_ra = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag); - LOG_D(PHY,"eNB %d : RA %p\n",eNB_id,PHY_vars_eNB->dlsch_eNB_ra); - PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, 0); - LOG_D(PHY,"eNB %d : MCH %p\n",eNB_id,PHY_vars_eNB->dlsch_eNB_MCH); + PHY_vars_eNB->dlsch_SI = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag); + LOG_D(PHY,"eNB %d : SI %p\n",eNB_id,PHY_vars_eNB->dlsch_SI); + PHY_vars_eNB->dlsch_ra = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag); + LOG_D(PHY,"eNB %d : RA %p\n",eNB_id,PHY_vars_eNB->dlsch_ra); + PHY_vars_eNB->dlsch_MCH = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, 0); + LOG_D(PHY,"eNB %d : MCH %p\n",eNB_id,PHY_vars_eNB->dlsch_MCH); - PHY_vars_eNB->rx_total_gain_eNB_dB=130; + PHY_vars_eNB->rx_total_gain_dB=130; for(i=0; imu_mimo_mode[i].dl_pow_off = 2; @@ -146,7 +146,7 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, PHY_vars_eNB->check_for_SUMIMO_transmissions = 0; - PHY_vars_eNB->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; + PHY_vars_eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; return (PHY_vars_eNB); } @@ -161,38 +161,38 @@ PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms, PHY_VARS_UE* PHY_vars_UE = malloc(sizeof(PHY_VARS_UE)); memset(PHY_vars_UE,0,sizeof(PHY_VARS_UE)); PHY_vars_UE->Mod_id=UE_id; - memcpy(&(PHY_vars_UE->lte_frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); + memcpy(&(PHY_vars_UE->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); phy_init_lte_ue(PHY_vars_UE,1,abstraction_flag); for (i=0; idlsch_ue[i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); + PHY_vars_UE->dlsch[i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); - if (!PHY_vars_UE->dlsch_ue[i][j]) { + if (!PHY_vars_UE->dlsch[i][j]) { LOG_E(PHY,"Can't get ue dlsch structures\n"); exit(-1); } else - LOG_D(PHY,"dlsch_ue[%d][%d] => %p\n",UE_id,i,PHY_vars_UE->dlsch_ue[i][j]); + LOG_D(PHY,"dlsch[%d][%d] => %p\n",UE_id,i,PHY_vars_UE->dlsch[i][j]); } - PHY_vars_UE->ulsch_ue[i] = new_ue_ulsch(frame_parms->N_RB_UL, abstraction_flag); + PHY_vars_UE->ulsch[i] = new_ue_ulsch(frame_parms->N_RB_UL, abstraction_flag); - if (!PHY_vars_UE->ulsch_ue[i]) { + if (!PHY_vars_UE->ulsch[i]) { LOG_E(PHY,"Can't get ue ulsch structures\n"); exit(-1); } - PHY_vars_UE->dlsch_ue_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); - PHY_vars_UE->dlsch_ue_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); + PHY_vars_UE->dlsch_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); + PHY_vars_UE->dlsch_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); PHY_vars_UE->transmission_mode[i] = transmission_mode; } - PHY_vars_UE->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; + PHY_vars_UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; - PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS_MBSFN,frame_parms->N_RB_DL,0); + PHY_vars_UE->dlsch_MCH[0] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS_MBSFN,frame_parms->N_RB_DL,0); return (PHY_vars_UE); } From 2b6c7a52a071d8cc21302724281a02ac14566a5d Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 27 May 2016 13:33:19 +0200 Subject: [PATCH 021/340] intermediate save to switch machines --- openair1/SCHED/phy_procedures_lte_eNb.c | 32 ++++++++++---- openair2/UTIL/LOG/vcd_signal_dumper.c | 4 ++ openair2/UTIL/LOG/vcd_signal_dumper.h | 4 ++ targets/RT/USER/eNB_usrp.gtkw | 44 ++++++-------------- targets/RT/USER/lte-enb.c | 55 +++++++++++++++++++------ 5 files changed, 87 insertions(+), 52 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index d26980b0f8..9dd3d98e00 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2492,8 +2492,6 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) { eNB_proc_t *proc = &eNB->proc[thread_id]; - const int subframe = proc->subframe_rx; - const int frame = proc->frame_rx; int i,l; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; void *rxp[fp->nb_antennas_rx]; @@ -2504,15 +2502,18 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_COMMON_RX,1); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,proc->frame_rx, proc->subframe_rx); #endif if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) - for (i=0; inb_antennas_rx; i++) + if ((eNB->node_function == NGFI_RRU_IF4) || (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF and front-end processing - rxp[i] = (void*)&eNB->common_vars.rxdata[i][subframe*fp->samples_per_tti]; + for (i=0; inb_antennas_rx; i++) + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][proc->subframe*fp->samples_per_tti]; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); rxs = openair0.trx_read_func(&openair0, &proc->timestamp_rx, rxp, @@ -2520,7 +2521,10 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN fp->nb_antennas_rx); proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); + if (frame > 20){ if (rxs != fp->samples_per_tti>>1) exit_fun( "problem receiving samples" ); @@ -2541,6 +2545,17 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN //send_IF4(eNB,subframe<<1); } + for (i=0; inb_antennas_rx; i++) + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][(fp->samples_per_tti>>1)+(subframe*fp->samples_per_tti)]; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + rxs = openair0.trx_read_func(&openair0, + &proc->timestamp_rx, + rxp, + fp->samples_per_tti>>1, + fp->nb_antennas_rx); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); remove_7_5_kHz(eNB,(subframe<<1)+1); for (l=0; lsymbols_per_tti/2; l++) slot_fep_ul(fp, @@ -2568,7 +2583,7 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN // check if we have to detect PRACH first - if (is_prach_subframe(fp,frame,subframe)>0) { + if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) { // wake up thread for PRACH RX if (pthread_mutex_lock(&proc->mutex_prach) != 0) { LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", thread_id, proc->instance_cnt_prach ); @@ -2613,7 +2628,7 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN // and proc->subframe_tx = proc->subframe_rx+3 proc->timestamp_tx = proc->timestamp_rx + (fp->samples_per_tti<<1) + (fp->samples_per_tti>>1); proc->frame_tx = (proc->subframe_rx > 6) ? (proc->frame_rx+1) : proc->frame_rx; - proc->subframe_rx = (proc->subframe_rx + 3)%10; + proc->subframe_tx = (proc->subframe_rx + 3)%10; pthread_mutex_unlock( &proc->mutex_tx ); @@ -2850,7 +2865,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN eNB->ulsch[i]->harq_processes[harq_pid]->o_ACK[1], ret); - //compute the expected ULSCH RX power (for the stats) eNB->ulsch[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0); // 0 means bw_factor is not considered diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 78e481f3d6..1972993a94 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -77,6 +77,8 @@ struct vcd_module_s { const char* eurecomVariablesNames[] = { "frame_number_TX_eNB", "frame_number_RX_eNB", + "subframe_number_TX_eNB", + "subframe_number_RX_eNB", "runtime_TX_eNB", "runtime_RX_eNB", "frame_number_TX_UE", @@ -226,6 +228,8 @@ const char* eurecomFunctionsNames[] = { "lte_ue_pbch_procedures", "phy_procedures_eNb_tx", "phy_procedures_eNb_rx", + "phy_procedures_eNb_rx_common", + "phy_procedures_eNb_rx_uespec", "phy_procedures_ue_tx", "phy_procedures_ue_rx", "phy_procedures_eNB_lte", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index a9e4339368..f0a3e70274 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -49,6 +49,8 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB = 0, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_UE, @@ -200,6 +202,8 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE, diff --git a/targets/RT/USER/eNB_usrp.gtkw b/targets/RT/USER/eNB_usrp.gtkw index 935bf68b2e..677e214f31 100644 --- a/targets/RT/USER/eNB_usrp.gtkw +++ b/targets/RT/USER/eNB_usrp.gtkw @@ -1,54 +1,36 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Sun Apr 10 20:34:38 2016 +[*] Fri May 27 01:34:58 2016 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Sun Apr 10 20:26:57 2016" -[dumpfile_size] 181182776 +[dumpfile_mtime] "Fri May 27 01:33:50 2016" +[dumpfile_size] 12743642 [savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw" -[timestart] 19787100000 -[size] 1535 876 +[timestart] 10801070000 +[size] 1535 845 [pos] -1 -1 -*-21.793451 19795882832 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +*-21.793451 10817350000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [sst_width] 284 -[signals_width] 238 +[signals_width] 254 [sst_expanded] 1 [sst_vpaned_height] 294 -@24 -variables.hw_frame[63:0] -variables.hw_subframe[63:0] @28 functions.trx_read functions.trx_write @24 -variables.txcnt[63:0] -variables.rxcnt[63:0] variables.trx_ts[63:0] variables.trx_tst[63:0] variables.frame_number_TX_eNB[63:0] variables.frame_number_RX_eNB[63:0] +variables.subframe_number_TX_eNB[63:0] +variables.subframe_number_RX_eNB[63:0] @28 functions.eNB_thread_rx0 functions.eNB_thread_tx0 -functions.eNB_thread_rx1 -functions.eNB_thread_tx1 -functions.eNB_thread_rx2 -functions.eNB_thread_tx2 -functions.eNB_thread_rx3 -functions.eNB_thread_tx3 -functions.eNB_thread_rx4 -functions.eNB_thread_tx4 -functions.eNB_thread_rx5 -functions.eNB_thread_tx5 -functions.eNB_thread_rx6 -functions.eNB_thread_tx6 -functions.eNB_thread_rx7 -functions.eNB_thread_tx7 -functions.eNB_thread_rx8 -functions.eNB_thread_tx8 -functions.eNB_thread_rx9 -functions.eNB_thread_tx9 functions.phy_procedures_eNb_tx +@29 +functions.phy_enb_sfgen +@28 functions.phy_procedures_eNb_rx @24 variables.dci_info[63:0] @@ -64,7 +46,7 @@ functions.macxface_SR_indication @420 variables.ue0_SR_ENERGY[63:0] variables.ue0_SR_THRES[63:0] -@25 +@24 variables.dci_info[63:0] @28 functions.phy_enb_ulsch_decoding0 diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 582610c5c2..1f7d08c13d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -276,6 +276,7 @@ static void* eNB_thread_tx( void* param ) eNB_proc_t *proc = (eNB_proc_t*)param; FILE *tx_time_file = NULL; char tx_time_name[101]; + void *txp[PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx]; if (opp_enabled == 1) { snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->thread_index); @@ -408,7 +409,6 @@ static void* eNB_thread_tx( void* param ) } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); start_meas( &softmodem_stats_tx_sf[proc->thread_index] ); if (oai_exit) break; @@ -436,6 +436,9 @@ static void* eNB_thread_tx( void* param ) exit_fun("nothing to add"); } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_ENB, proc->subframe_tx ); if (oai_exit) break; if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { @@ -459,7 +462,9 @@ static void* eNB_thread_tx( void* param ) } if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); /* short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.samples_per_tti]; int i; @@ -471,9 +476,30 @@ static void* eNB_thread_tx( void* param ) txdata[i+4] = -2047; txdata[i+5] = 0; txdata[i+6] = 0; - txdata[i+7] = -2047; - } + txdata[i+7] = -2047; } */ + + + // Transmit TX buffer based on timestamp from RX + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + int i; + for (i=0; iframe_parms.nb_antennas_tx; i++) + txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; + // if symb_written < spp ==> error + if (proc->frame_tx > 50) { + openair0.trx_write_func(&openair0, + (proc->timestamp_tx+openair0_cfg[0].tx_sample_advance), + txp, + PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, + PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, + 1); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + } if (pthread_mutex_lock(&proc->mutex_tx) != 0) { @@ -683,23 +709,25 @@ static void* eNB_thread_rx( void* param ) // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 1 ); - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); start_meas( &softmodem_stats_rx_sf[proc->thread_index] ); if (oai_exit) break; if ((((fp->frame_type == TDD )&&(subframe_select(fp,proc->subframe_rx)==SF_UL)) || (fp->frame_type == FDD))) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); // this spawns the prach and TX threads inside and updates the frame and subframe counters phy_procedures_eNB_common_RX(proc->thread_index, eNB, 0); - if (eNB->node_function != NGFI_RRU_IF4) + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); + if (eNB->node_function != NGFI_RRU_IF4) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); // this is the ue-specific processing for the subframe and can be multi-threaded later phy_procedures_eNB_uespec_RX(proc->thread_index, eNB, 0, no_relay ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); + } } if ((subframe_select(fp,proc->subframe_rx) == SF_S)) { @@ -714,8 +742,11 @@ static void* eNB_thread_rx( void* param ) } } #endif // LOWLATENCY - print_meas_now(&softmodem_stats_rx_sf[proc->thread_index],"eNB_RX_SF",proc->thread_index, rx_time_file); - } + print_meas_now(&softmodem_stats_rx_sf[proc->thread_index],"eNB_RX_SF",proc->thread_index, rx_time_file); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 ); + + + } //stop_meas( &softmodem_stats_rx_sf[proc->thread_index] ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 ); @@ -747,7 +778,7 @@ static void* eNB_thread_prach( void* param ) MSC_START_USE(); - AssertFatal(proc->thread_index!=0,"Invalid thread index %d for PRACH thread\n",proc->thread_index); + AssertFatal(proc->thread_index==0,"Invalid thread index %d for PRACH thread\n",proc->thread_index); #ifdef LOWLATENCY struct sched_attr attr; From e198a7423f2c91fe5e0d3a16b8369a6e41f89b3b Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 27 May 2016 10:21:23 -0700 Subject: [PATCH 022/340] updated unitary simulations and corrected bugs in threading and scheduling of L1 procedures. --- openair1/PHY/INIT/defs.h | 31 +- openair1/PHY/INIT/lte_init.c | 10 +- openair1/PHY/INIT/lte_param_init.c | 50 +- openair1/PHY/LTE_ESTIMATION/defs.h | 3 +- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 4 +- .../lte_ul_channel_estimation.c | 5 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 14 +- openair1/PHY/LTE_TRANSPORT/phich.c | 15 +- openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c | 6 +- openair1/PHY/LTE_TRANSPORT/pmch.c | 12 +- openair1/PHY/LTE_TRANSPORT/prach.c | 3 +- openair1/PHY/LTE_TRANSPORT/print_stats.c | 6 +- openair1/PHY/LTE_TRANSPORT/proto.h | 39 +- openair1/PHY/LTE_TRANSPORT/pucch.c | 8 +- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 48 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 10 +- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 15 +- openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c | 60 +- openair1/PHY/TOOLS/lte_phy_scope.c | 2 +- openair1/PHY/TOOLS/time_meas.c | 2 +- openair1/PHY/TOOLS/time_meas.h | 2 +- openair1/PHY/defs.h | 7 +- openair1/SCHED/defs.h | 45 +- openair1/SCHED/phy_mac_stub.c | 44 +- openair1/SCHED/phy_procedures_lte_eNb.c | 299 +++-- openair1/SIMULATION/LTE_PHY/dlsim.c | 1138 ++++++++--------- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 275 ++-- openair1/SIMULATION/LTE_PHY/prachsim.c | 90 +- openair1/SIMULATION/LTE_PHY/pucchsim.c | 118 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 688 +++++----- openair2/LAYER2/MAC/proto.h | 2 +- targets/RT/USER/lte-enb.c | 717 +++-------- 32 files changed, 1660 insertions(+), 2108 deletions(-) diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/defs.h index f08ca678db..f21ea458dd 100644 --- a/openair1/PHY/INIT/defs.h +++ b/openair1/PHY/INIT/defs.h @@ -31,7 +31,7 @@ #include "PHY/defs.h" -#ifdef OPENAIR_LTE + #include "SystemInformationBlockType2.h" //#include "RadioResourceConfigCommonSIB.h" #include "RadioResourceConfigDedicated.h" @@ -41,18 +41,6 @@ #ifdef Rel10 #include "SCellToAddMod-r10.h" #endif -#else - -/** -\fn int phy_init(unsigned char nb_antennas_tx) -\brief Allocate and Initialize the PHY variables after receiving static configuration -@param nb_antennas_tx Number of TX antennas -*/ -int phy_init(unsigned char nb_antennas_tx); -#endif - -#ifdef OPENAIR_LTE - /** @addtogroup _PHY_STRUCTURES_ * @{ */ @@ -325,17 +313,28 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, int CC_id); #endif -#endif + /*! !\fn void phy_cleanup(void) \brief Cleanup the PHY variables*/ void phy_cleanup(void); -#ifdef OPENAIR_LTE + int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf); void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms); -#endif + +void lte_param_init(unsigned char N_tx, + unsigned char N_rx, + unsigned char transmission_mode, + uint8_t extended_prefix_flag, + frame_t frame_type, + uint16_t Nid_cell, + uint8_t tdd_config, + uint8_t N_RB_DL, + uint8_t threequarter_fs, + uint8_t osf, + uint32_t perfect_ce); /** @} */ #endif diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 9787c476a6..5c8a5ec436 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -121,7 +121,7 @@ void phy_config_sib2_eNB(uint8_t Mod_id, //int32_t rx_total_gain_eNB_dB = PHY_vars_eNB_g[Mod_id][CC_id]->rx_total_gain_eNB_dB; int i; - LOG_D(PHY,"[eNB%d] CCid %d Frame %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[0].frame_tx); + LOG_D(PHY,"[eNB%d] CCid %d Frame %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc.frame_tx); frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",frame_parms->prach_config_common.rootSequenceIndex ); @@ -388,7 +388,7 @@ void phy_config_sib13_eNB(uint8_t Mod_id,int CC_id,int mbsfn_Area_idx, LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; - LOG_I(PHY,"[eNB%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[0].frame_tx,mbsfn_AreaId_r9,mbsfn_Area_idx); + LOG_I(PHY,"[eNB%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc.frame_tx,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; @@ -409,7 +409,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB) physicalConfigDedicated = eNB->physicalConfigDedicated[UE_id]; if (physicalConfigDedicated != NULL) { - LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id, eNB->proc[0].frame_tx,physicalConfigDedicated,UE_id); + LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id, eNB->proc.frame_tx,physicalConfigDedicated,UE_id); LOG_D(PHY,"------------------------------------------------------------------------\n"); if (physicalConfigDedicated->pdsch_ConfigDedicated) { @@ -644,7 +644,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id, int8_t UE_id = find_ue(rnti,eNB); if (UE_id == -1) { - LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id, eNB->proc[0].frame_tx ); + LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id, eNB->proc.frame_tx ); return; } @@ -653,7 +653,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id, eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated; LOG_I(PHY,"phy_config_dedicated_eNB: physicalConfigDedicated=%p\n",physicalConfigDedicated); } else { - LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, eNB->proc[0].frame_tx,UE_id); + LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, eNB->proc.frame_tx,UE_id); return; } diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c index d13b624cfd..0e18537965 100644 --- a/openair1/PHY/INIT/lte_param_init.c +++ b/openair1/PHY/INIT/lte_param_init.c @@ -9,8 +9,8 @@ #include "PHY/defs.h" #include "PHY/extern.h" -extern PHY_VARS_eNB *PHY_vars_eNB; -extern PHY_VARS_UE *PHY_vars_UE; +extern PHY_VARS_eNB *eNB; +extern PHY_VARS_UE *UE; void lte_param_init(unsigned char N_tx, unsigned char N_rx, @@ -30,8 +30,8 @@ void lte_param_init(unsigned char N_tx, printf("Start lte_param_init\n"); - PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB)); - PHY_vars_UE = malloc(sizeof(PHY_VARS_UE)); + eNB = malloc(sizeof(PHY_VARS_eNB)); + UE = malloc(sizeof(PHY_VARS_UE)); //PHY_config = malloc(sizeof(PHY_CONFIG)); mac_xface = malloc(sizeof(MAC_xface)); @@ -39,7 +39,7 @@ void lte_param_init(unsigned char N_tx, randominit(0); set_taus_seed(0); - frame_parms = &(PHY_vars_eNB->frame_parms); + frame_parms = &(eNB->frame_parms); frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz frame_parms->N_RB_UL = N_RB_DL; @@ -66,40 +66,40 @@ void lte_param_init(unsigned char N_tx, // phy_init_top(frame_parms); //allocation - PHY_vars_UE->is_secondary_ue = 0; - PHY_vars_UE->frame_parms = *frame_parms; - PHY_vars_eNB->frame_parms = *frame_parms; + UE->is_secondary_ue = 0; + UE->frame_parms = *frame_parms; + eNB->frame_parms = *frame_parms; phy_init_lte_top(frame_parms); dump_frame_parms(frame_parms); - PHY_vars_UE->measurements.n_adj_cells=0; - PHY_vars_UE->measurements.adj_cell_id[0] = Nid_cell+1; - PHY_vars_UE->measurements.adj_cell_id[1] = Nid_cell+2; + UE->measurements.n_adj_cells=0; + UE->measurements.adj_cell_id[0] = Nid_cell+1; + UE->measurements.adj_cell_id[1] = Nid_cell+2; for (i=0; i<3; i++) - lte_gold(frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i); + lte_gold(frame_parms,UE->lte_gold_table[i],Nid_cell+i); - phy_init_lte_ue(PHY_vars_UE,1,0); - phy_init_lte_eNB(PHY_vars_eNB,0,0,0); + phy_init_lte_ue(UE,1,0); + phy_init_lte_eNB(eNB,0,0,0); - generate_pcfich_reg_mapping(&PHY_vars_UE->frame_parms); - generate_phich_reg_mapping(&PHY_vars_UE->frame_parms); + generate_pcfich_reg_mapping(&UE->frame_parms); + generate_phich_reg_mapping(&UE->frame_parms); // DL power control init if (transmission_mode == 1) { - PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_eNB->frame_parms).pdsch_config_common).p_b = 0; - PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_UE->frame_parms).pdsch_config_common).p_b = 0; + eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((eNB->frame_parms).pdsch_config_common).p_b = 0; + UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((UE->frame_parms).pdsch_config_common).p_b = 0; } else { // rho_a = rhob - PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_eNB->frame_parms).pdsch_config_common).p_b = 1; - PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_UE->frame_parms).pdsch_config_common).p_b = 1; + eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((eNB->frame_parms).pdsch_config_common).p_b = 1; + UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((UE->frame_parms).pdsch_config_common).p_b = 1; } - PHY_vars_UE->perfect_ce = perfect_ce; + UE->perfect_ce = perfect_ce; printf("Done lte_param_init\n"); diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index c20d24e34f..ebba52670d 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -219,7 +219,6 @@ void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, module_id_t eNB_id, module_id_t UE_id, - uint8_t subframe, uint8_t l, uint8_t Ns, uint8_t cooperation_flag); @@ -242,7 +241,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, unsigned char number_of_cards, short coef); -int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id,uint8_t subframe); +int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id); void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, int subframe, diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 7467dd38a5..6980ca358c 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -195,7 +195,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, } -int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id,uint8_t thread_id) +int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id) { static int first_run=1; static int max_pos_fil2=0; @@ -236,7 +236,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id,uint8_t thread_ max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15; #ifdef DEBUG_PHY - LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc[thread_id].frame_rx,max_pos,max_pos_fil2,sync_pos); + LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,max_pos_fil2,sync_pos); #endif //DEBUG_PHY return(max_pos_fil2-sync_pos); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index 723b143d26..84975c1deb 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -55,7 +55,6 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32 int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB, uint8_t eNB_id, uint8_t UE_id, - uint8_t thread_id, unsigned char l, unsigned char Ns, uint8_t cooperation_flag) @@ -68,8 +67,8 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB, int32_t **ul_ch_estimates_0= pusch_vars->drs_ch_estimates_0[eNB_id]; int32_t **ul_ch_estimates_1= pusch_vars->drs_ch_estimates_1[eNB_id]; int32_t **rxdataF_ext= pusch_vars->rxdataF_ext[eNB_id]; - int subframe = eNB->proc[thread_id].subframe_rx; - uint8_t harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe); + int subframe = eNB->proc.subframe_rx; + uint8_t harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe); int16_t delta_phase = 0; int16_t *ru1 = ru_90; int16_t *ru2 = ru_90; diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 90c67ed70f..4538deee13 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -2,7 +2,7 @@ OpenAirInterface Copyright(c) 1999 - 2014 Eurecom - OpenAirInterface is free software: you can redistribute it and/or modify + OpenAirInterface is free software: you can redistrirbute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. @@ -7077,12 +7077,11 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, } -int generate_eNB_ulsch_params_from_dci(void *dci_pdu, +int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, + void *dci_pdu, uint16_t rnti, - uint8_t thread_id, DCI_format_t dci_format, uint8_t UE_id, - PHY_VARS_eNB *eNB, uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, @@ -7096,7 +7095,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, ANFBmode_t AckNackFBMode = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id]; LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; - int subframe = eNB->proc[thread_id].subframe_tx; + int subframe = eNB->proc.subframe_tx; uint32_t cqi_req = 0; uint32_t dai = 0; @@ -7117,11 +7116,10 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, harq_pid = subframe2harq_pid(frame_parms, pdcch_alloc2ul_frame(frame_parms, - eNB->proc[thread_id].frame_tx, + eNB->proc.frame_tx, subframe), pdcch_alloc2ul_subframe(frame_parms,subframe)); - // printf("eNB: thread_id %d, subframe %d, frame_tx %d\n",thread_id,subframe,eNB->proc[thread_id].frame_tx); switch (frame_parms->N_RB_DL) { case 6: @@ -7639,7 +7637,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d)\n", - eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift); + eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift); diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index e46fb1756a..54564637d6 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1416,7 +1416,6 @@ void rx_phich(PHY_VARS_UE *ue, } void generate_phich_top(PHY_VARS_eNB *eNB, - unsigned char thread_id, int16_t amp, uint8_t sect_id, uint8_t abstraction_flag) @@ -1432,7 +1431,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, uint8_t pusch_subframe; uint8_t UE_id; uint32_t pusch_frame; - int subframe = eNB->proc[thread_id].subframe_tx; + int subframe = eNB->proc.subframe_tx; // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211 @@ -1444,7 +1443,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, if (frame_parms->Ncp == 1) NSF_PHICH = 2; - pusch_frame = phich_frame2_pusch_frame(frame_parms,eNB->proc[thread_id].frame_tx,subframe); + pusch_frame = phich_frame2_pusch_frame(frame_parms,eNB->proc.frame_tx,subframe); pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe); harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe); @@ -1453,7 +1452,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, if (ulsch[UE_id]->harq_processes[harq_pid]->phich_active == 1) { LOG_D(PHY,"[eNB][PUSCH %d/%x] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n", - harq_pid,ulsch[UE_id]->rnti,eNB->proc[thread_id].frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active); + harq_pid,ulsch[UE_id]->rnti,eNB->proc.frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active); ngroup_PHICH = (ulsch[UE_id]->harq_processes[harq_pid]->first_rb + ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH; @@ -1467,7 +1466,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, nseq_PHICH = ((ulsch[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) + ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH); LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n", - eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx, + eNB->Mod_id,harq_pid,eNB->proc.frame_tx, subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH, ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK, ulsch[UE_id]->harq_processes[harq_pid]->first_rb, @@ -1475,7 +1474,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, if (ulsch[UE_id]->Msg3_active == 1) { LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n", - eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe, + eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe, UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK, ulsch[UE_id]->harq_processes[harq_pid]->first_rb); } @@ -1505,7 +1504,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, (ulsch[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) { if (ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n", - eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe); + eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe); ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; ulsch[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch[UE_id]->harq_processes[harq_pid]->round&3]; ulsch[UE_id]->harq_processes[harq_pid]->O_RI = 0; @@ -1515,7 +1514,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, } else { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d PHICH ACK (no format0 DCI) Clearing subframe_scheduling_flag, setting round to 0\n", - eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe); + eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe); ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; ulsch[UE_id]->harq_processes[harq_pid]->round=0; } diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c index 4e0d6bba02..b32d56f5be 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c @@ -43,13 +43,13 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *eNB, int32_t **txdataF, - int16_t amp, - uint16_t subframe) + int16_t amp) + { LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t subframe_offset,Nsymb,samples_per_symbol; - + int subframe = eNB->proc.subframe_tx; if (subframe<0 || subframe>= 10) { diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 56a01b940e..084b2b1793 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -286,11 +286,11 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id) } } -void generate_mch(PHY_VARS_eNB *eNB,int thread_id,uint8_t *a,int abstraction_flag) +void generate_mch(PHY_VARS_eNB *eNB,uint8_t *a,int abstraction_flag) { int G; - int subframe = eNB->proc[thread_id].subframe_tx; + int subframe = eNB->proc.subframe_tx; if (abstraction_flag != 0) { if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0) @@ -312,18 +312,18 @@ void generate_mch(PHY_VARS_eNB *eNB,int thread_id,uint8_t *a,int abstraction_fla eNB->frame_parms.N_RB_DL, eNB->dlsch_MCH->harq_processes[0]->rb_alloc, get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1, - 2,eNB->proc[thread_id].frame_tx,subframe); + 2,eNB->proc.frame_tx,subframe); generate_mbsfn_pilot(eNB, eNB->common_vars.txdataF[0], - AMP, - subframe); + AMP); + if (dlsch_encoding(a, &eNB->frame_parms, 1, eNB->dlsch_MCH, - eNB->proc[thread_id].frame_tx, + eNB->proc.frame_tx, subframe, &eNB->dlsch_rate_matching_stats, &eNB->dlsch_turbo_encoding_stats, diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index c18982f170..15c7bda045 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1056,7 +1056,6 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 //__m128i mmtmpX0,mmtmpX1,mmtmpX2,mmtmpX3; void rx_prach(PHY_VARS_eNB *eNB, - uint8_t subframe, uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, @@ -1065,7 +1064,7 @@ void rx_prach(PHY_VARS_eNB *eNB, int i; lte_frame_type_t frame_type = eNB->frame_parms.frame_type; - + int subframe = eNB->proc.subframe_rx; uint16_t rootSequenceIndex = eNB->frame_parms.prach_config_common.rootSequenceIndex; uint8_t prach_ConfigIndex = eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; uint8_t Ncs_config = eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 9297d91376..829b05530e 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -583,7 +583,7 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) for (eNB_id=0; eNB_idproc[0].frame_tx, + eNB->proc.frame_tx, eNB->rx_total_gain_dB, eNB->measurements[eNB_id].n0_power_tot_dBm, eNB->measurements[eNB_id].n0_power_dB[0], @@ -621,9 +621,9 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) - len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(eNB->total_transmitted_bits/1000),eNB->proc[0].frame_tx+1); + len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(eNB->total_transmitted_bits/1000),eNB->proc.frame_tx+1); len += sprintf(&buffer[len],"Total DLSCH throughput %d kbps ",(eNB->total_dlsch_bitrate/1000)); - len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,eNB->proc[0].frame_tx+1); + len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,eNB->proc.frame_tx+1); //len += sprintf(&buffer[len],"[eNB PROC] FULL MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->FULL_MUMIMO_transmissions,eNB->check_for_total_transmissions); //len += sprintf(&buffer[len],"[eNB PROC] MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_MUMIMO_transmissions,eNB->check_for_total_transmissions); //len += sprintf(&buffer[len],"[eNB PROC] SU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_SUMIMO_transmissions,eNB->check_for_total_transmissions); diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 6b10a115df..fc9e800760 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -228,12 +228,11 @@ int mch_modulation(int32_t **txdataF, /** \brief Top-level generation function for eNB TX of MBSFN @param phy_vars_eNB Pointer to eNB variables - @param subframe Subframe for PMCH @param a Pointer to transport block @param abstraction_flag */ -void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int subframe,uint8_t *a,int abstraction_flag); +void generate_mch(PHY_VARS_eNB *phy_vars_eNB,uint8_t *a,int abstraction_flag); /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals) @param phy_vars_eNB Pointer to eNB variables @@ -301,8 +300,7 @@ int32_t generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, int32_t **txdataF, - int16_t amp, - uint16_t subframe); + int16_t amp); int32_t generate_pss(int32_t **txdataF, int16_t amp, @@ -1409,27 +1407,26 @@ int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id); double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id); -int generate_eNB_ulsch_params_from_dci(void *dci_pdu, +int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB, + void *dci_pdu, rnti_t rnti, - uint8_t subframe, - DCI_format_t dci_format, + DCI_format_t dci_format, uint8_t UE_id, - PHY_VARS_eNB *PHY_vars_eNB, - uint16_t si_rnti, + uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, uint16_t cba_rnti, uint8_t use_srs); -#ifdef USER_MODE -void dump_ulsch(PHY_VARS_eNB *phy_vars_eNb,uint8_t subframe, uint8_t UE_id); + +void dump_ulsch(PHY_VARS_eNB *phy_vars_eNb,uint8_t UE_id); void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round); -#endif + int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci); @@ -1477,14 +1474,12 @@ void generate_RIV_tables(void); int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode); void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, - uint32_t subframe, uint8_t eNB_id, // this is the effective sector id uint8_t UE_id, LTE_eNB_ULSCH_t **ulsch, uint8_t cooperation_flag); void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t subframe, uint8_t sect_id, uint8_t UE_index); @@ -1532,18 +1527,15 @@ int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer, */ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, uint8_t UE_id, - uint8_t subframe, uint8_t control_only_flag, uint8_t Nbundled, uint8_t llr8_flag); uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t subframe, uint8_t UE_index, uint16_t *crnti); void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, - uint8_t subframe, int16_t amp, uint8_t sect_id, uint8_t abstraction_flag); @@ -1671,11 +1663,11 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, uint8_t pucch1_thres); int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t UE_index, - PUCCH_FMT_t fmt, - uint8_t n1_pucch_sel, - uint8_t *payload, - uint8_t subframe); + uint8_t UE_index, + PUCCH_FMT_t fmt, + uint8_t n1_pucch_sel, + uint8_t *payload); + /*! @@ -1702,7 +1694,6 @@ int32_t generate_prach(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, /*! \brief Process PRACH waveform @param phy_vars_eNB Pointer to eNB top-level descriptor - @param subframe subframe index to operate on @param preamble_energy_list List of energies for each candidate preamble @param preamble_delay_list List of delays for each candidate preamble @param Nf System frame number @@ -1710,7 +1701,7 @@ int32_t generate_prach(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, @returns 0 on success */ -void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex); +void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex); /*! \brief Helper for MAC, returns number of available PRACH in TDD for a particular configuration index diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 75ebcdfbfe..547a0f2217 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -1067,12 +1067,12 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *eNB, uint8_t UE_index, PUCCH_FMT_t fmt, uint8_t n1_pucch_sel, - uint8_t *payload, - uint8_t thread_id) + uint8_t *payload) + { uint8_t UE_id; uint16_t rnti; - int subframe = eNB->proc[thread_id].subframe_rx; + int subframe = eNB->proc.subframe_rx; uint8_t CC_id = eNB->CC_id; rnti = eNB->ulsch[UE_index]->rnti; @@ -1095,7 +1095,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *eNB, payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0]; payload[1] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[1]; } else - LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",eNB->proc[thread_id].frame_rx); + LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",eNB->proc.frame_rx); if (PHY_vars_UE_g[UE_id][CC_id]->pucch_sel[subframe] == n1_pucch_sel) return(99); diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 4e45a856bd..035b3bce61 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -70,35 +70,35 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) if (ulsch) { #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch %p\n",ulsch); + printf("Freeing ulsch %p\n",ulsch); #endif for (i=0; i<8; i++) { #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch process %d\n",i); + printf("Freeing ulsch process %d\n",i); #endif if (ulsch->harq_processes[i]) { #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch process %d (%p)\n",i,ulsch->harq_processes[i]); + printf("Freeing ulsch process %d (%p)\n",i,ulsch->harq_processes[i]); #endif if (ulsch->harq_processes[i]->b) { free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES); ulsch->harq_processes[i]->b = NULL; #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b); + printf("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b); #endif } #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch process %d c (%p)\n",i,ulsch->harq_processes[i]->c); + printf("Freeing ulsch process %d c (%p)\n",i,ulsch->harq_processes[i]->c); #endif for (r=0; rharq_processes[i]->c[r]); + printf("Freeing ulsch process %d c[%d] (%p)\n",i,r,ulsch->harq_processes[i]->c[r]); #endif if (ulsch->harq_processes[i]->c[r]) { @@ -302,7 +302,7 @@ uint32_t ulsch_encoding(uint8_t *a, ulsch->harq_processes[harq_pid]->control_only = 0; #ifdef DEBUG_ULSCH_CODING - msg("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n", + printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n", ulsch->harq_processes[harq_pid]->TBS, Q_m, ulsch->harq_processes[harq_pid]->mcs, @@ -311,16 +311,16 @@ uint32_t ulsch_encoding(uint8_t *a, ulsch->harq_processes[harq_pid]->rvidx); for (i=0; iharq_processes[harq_pid]->O_ACK; i++) - msg("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]); + printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]); for (i=0; iO_RI; i++) - msg("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]); + printf("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]); - msg("ulsch_coding: O=%d\n",ulsch->O); + printf("ulsch_coding: O=%d\n",ulsch->O); for (i=0; i<1+((8+ulsch->O)/8); i++) { // ulsch->o[i] = i; - msg("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]); + printf("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]); } if ((tmode != 4)) @@ -380,20 +380,20 @@ uint32_t ulsch_encoding(uint8_t *a, #ifdef DEBUG_ULSCH_CODING - msg("Generating Code Segment %d (%d bits)\n",r,Kr); + printf("Generating Code Segment %d (%d bits)\n",r,Kr); // generate codewords - msg("bits_per_codeword (Kr)= %d\n",Kr); - msg("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("Ncp %d\n",frame_parms->Ncp); - msg("Qm %d\n",Q_m); + printf("bits_per_codeword (Kr)= %d\n",Kr); + printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb); + printf("Ncp %d\n",frame_parms->Ncp); + printf("Qm %d\n",Q_m); #endif // offset=0; #ifdef DEBUG_ULSCH_CODING - msg("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]); + printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]); #endif start_meas(te_stats); threegpplte_turbo_encoder(ulsch->harq_processes[harq_pid]->c[r], @@ -526,7 +526,7 @@ uint32_t ulsch_encoding(uint8_t *a, for (r=0; rharq_processes[harq_pid]->C; r++) { #ifdef DEBUG_ULSCH_CODING - msg("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", + printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", r, G, Kr*3, @@ -633,7 +633,7 @@ uint32_t ulsch_encoding(uint8_t *a, // Do ACK coding, Section 5.2.2.6 36.213 (p.23-24 in v8.6) wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3); #ifdef DEBUG_ULSCH_CODING - msg("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n", + printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n", ulsch->bundling,Nbundled,wACK_idx); #endif @@ -865,7 +865,7 @@ uint32_t ulsch_encoding(uint8_t *a, for (q=0; qq_ACK[(q+(Q_m*i))%len_ACK]; #ifdef DEBUG_ULSCH_CODING - msg("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i), + printf("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i), q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK], i,r*Cmux,columnset[j]); #endif @@ -965,7 +965,7 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer, // print_CQI(ulsch->o,ulsch->uci_format,eNB_id); // save PUSCH pmi for later (transmission modes 4,5,6) - // msg("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); + // printf("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); // if (ulsch->uci_format != HLC_subband_cqi_mcs_CBA) dlsch[0]->harq_processes[harq_pid]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; } @@ -986,20 +986,20 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer, UE_transport_info[ue->Mod_id][ue->CC_id].eNB_id[0] = eNB_id; UE_transport_info[ue->Mod_id][ue->CC_id].harq_pid[0] = harq_pid; UE_transport_info[ue->Mod_id][ue->CC_id].tbs[0] = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3 ; - // msg("\nue->Mod_id%d\n",ue->Mod_id); + // printf("\nue->Mod_id%d\n",ue->Mod_id); UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_flag = 1; //UE_transport_info[ue->Mod_id].cntl.pusch_uci = *(uint32_t *)ulsch->o; memcpy(UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_uci, ulsch->o, MAX_CQI_BYTES); - // msg("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1); + // printf("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1); UE_transport_info[ue->Mod_id][ue->CC_id].cntl.length_uci = ulsch->O; UE_transport_info[ue->Mod_id][ue->CC_id].cntl.uci_format = ulsch->uci_format; UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ri = (ulsch->o_RI[0]&1)+((ulsch->o_RI[1]&1)<<1); UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ack = (ulsch->o_ACK[0]&1) + ((ulsch->o_ACK[1]&1)<<1); - //msg("ack is %d %d %d\n",UE_transport_info[ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1); + //printf("ack is %d %d %d\n",UE_transport_info[ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1); return(0); } diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 4a6bfa5f52..0850836b36 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -220,7 +220,6 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, uint8_t UE_id, - uint8_t thread_id, uint8_t control_only_flag, uint8_t Nbundled, uint8_t llr8_flag) @@ -260,7 +259,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, int16_t cseq[6*14*1200]; int off; int status[20]; - int subframe = eNB->proc[thread_id].subframe_rx; + int subframe = eNB->proc.subframe_rx; LTE_UL_eNB_HARQ_t *ulsch_harq; uint8_t (*tc)(int16_t *y, @@ -279,7 +278,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, time_stats_t *, time_stats_t *); - harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe); + harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,1); @@ -1501,18 +1500,17 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb #endif uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, - uint8_t thread_id, uint8_t UE_index, uint16_t *crnti) { uint8_t UE_id; uint16_t rnti; - int subframe = eNB->proc[thread_id].subframe_rx; + int subframe = eNB->proc.subframe_rx; uint8_t harq_pid; uint8_t CC_id = eNB->CC_id; - harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc[thread_id].frame_rx,subframe); + harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc.frame_rx,subframe); rnti = eNB->ulsch[UE_index]->rnti; #ifdef DEBUG_PHY diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 87c21b6a6b..53cab326f1 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1577,7 +1577,6 @@ int32_t avgU[2]; int32_t avgU_0[2],avgU_1[2]; // For the Distributed Alamouti Scheme void rx_ulsch(PHY_VARS_eNB *eNB, - uint32_t thread_id, uint8_t eNB_id, // this is the effective sector id uint8_t UE_id, LTE_eNB_ULSCH_t **ulsch, @@ -1603,9 +1602,9 @@ void rx_ulsch(PHY_VARS_eNB *eNB, uint8_t Qm; uint16_t rx_power_correction; int16_t *llrp; - int subframe = eNB->proc[thread_id].subframe_rx; + int subframe = eNB->proc.subframe_rx; - harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe); + harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe); Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs); #ifdef DEBUG_ULSCH msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb, @@ -1640,7 +1639,6 @@ void rx_ulsch(PHY_VARS_eNB *eNB, lte_ul_channel_estimation(eNB, eNB_id, UE_id, - thread_id, l%(frame_parms->symbols_per_tti/2), l/(frame_parms->symbols_per_tti/2), cooperation_flag); @@ -1887,25 +1885,24 @@ void rx_ulsch(PHY_VARS_eNB *eNB, } void rx_ulsch_emul(PHY_VARS_eNB *eNB, - uint8_t subframe, uint8_t sect_id, uint8_t UE_index) { - msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,subframe,sect_id,UE_index); + msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,eNB->proc.subframe_rx,sect_id,UE_index); eNB->pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB; eNB->pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB; } -void dump_ulsch(PHY_VARS_eNB *eNB,uint8_t thread_id, uint8_t UE_id) +void dump_ulsch(PHY_VARS_eNB *eNB,uint8_t UE_id) { uint32_t nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; uint8_t harq_pid; - int subframe = eNB->proc[thread_id].subframe_rx; + int subframe = eNB->proc.subframe_rx; - harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc[thread_id].frame_rx,subframe); + harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc.frame_rx,subframe); printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs), diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c index b4f7f02480..32d3f3e34d 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c @@ -45,7 +45,7 @@ #include "defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" -//#define OFDMA_ULSCH + //#define DEBUG_ULSCH_MODULATION @@ -72,7 +72,7 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb) #elif defined(__arm__) int16x8_t norm128; #endif - // msg("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH); + // printf("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH); d0 = (uint32_t *)d; d1 = d0+Msc_PUSCH; @@ -87,7 +87,7 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb) d10 = d9+Msc_PUSCH; d11 = d10+Msc_PUSCH; - // msg("symbol 0 (d0 %p, d %p)\n",d0,d); + // printf("symbol 0 (d0 %p, d %p)\n",d0,d); for (i=0,ip=0; irnti<<14) + (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1 if (harq_pid > 7) { - msg("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid); + printf("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid); return; } @@ -419,12 +419,12 @@ void ulsch_modulation(int32_t **txdataF, nb_rb = ulsch->harq_processes[harq_pid]->nb_rb; if (nb_rb == 0) { - msg("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb); + printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb); return; } if (first_rb >25 ) { - msg("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb); + printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb); return; } @@ -439,12 +439,12 @@ void ulsch_modulation(int32_t **txdataF, Msc_PUSCH = ulsch->harq_processes[harq_pid]->nb_rb*12; #ifdef DEBUG_ULSCH_MODULATION - msg("ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n", + printf("ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n", ulsch->rnti,x2,G,harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,Q_m, ulsch->Nsymb_pusch,nsymb,subframe); #endif // scrambling (Note the placeholding bits are handled in ulsch_coding.c directly!) - //msg("ulsch bits: "); + //printf("ulsch bits: "); s = lte_gold_generic(&x1, &x2, 1); k=0; @@ -454,14 +454,14 @@ void ulsch_modulation(int32_t **txdataF, c = (uint8_t)((s>>j)&1); if (ulsch->h[k] == PUSCH_x) { - // msg("i %d: PUSCH_x\n",i); + // printf("i %d: PUSCH_x\n",i); ulsch->b_tilde[k] = 1; } else if (ulsch->h[k] == PUSCH_y) { - // msg("i %d: PUSCH_y\n",i); + // printf("i %d: PUSCH_y\n",i); ulsch->b_tilde[k] = ulsch->b_tilde[k-1]; } else { ulsch->b_tilde[k] = (ulsch->h[k]+c)&1; - // msg("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c); + // printf("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c); } } @@ -469,7 +469,7 @@ void ulsch_modulation(int32_t **txdataF, s = lte_gold_generic(&x1, &x2, 0); } - //msg("\n"); + //printf("\n"); gain_lin_QPSK = (short)((amp*ONE_OVER_SQRT2_Q15)>>15); @@ -493,7 +493,7 @@ void ulsch_modulation(int32_t **txdataF, ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (gain_lin_QPSK) : -gain_lin_QPSK; ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK; // if (id[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); + // printf("input %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); // UE1, x0* ((int16_t*)&ulsch->d[i+1])[0] = (ulsch->b_tilde[j-2] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK; @@ -626,7 +626,7 @@ void ulsch_modulation(int32_t **txdataF, ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK; ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK; // if (id[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); + // printf("input %d/%d Msc_PUSCH %d (%p): %d,%d\n", i,Msymb,Msc_PUSCH,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); break; @@ -650,7 +650,7 @@ void ulsch_modulation(int32_t **txdataF, ((int16_t*)&ulsch->d[i])[0]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); ((int16_t*)&ulsch->d[i])[1]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - // msg("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); + // printf("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); break; case 6: @@ -710,14 +710,14 @@ void ulsch_modulation(int32_t **txdataF, // re_offset0++; } - // msg("re_offset0 %d\n",re_offset0); + // printf("re_offset0 %d\n",re_offset0); for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) { re_offset = re_offset0; symbol_offset = (int)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb)); #ifdef DEBUG_ULSCH_MODULATION - msg("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); + printf("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); #endif txptr = &txdataF[0][symbol_offset]; @@ -727,10 +727,10 @@ void ulsch_modulation(int32_t **txdataF, // Skip reference symbols else { - // msg("copying %d REs\n",Msc_PUSCH); + // printf("copying %d REs\n",Msc_PUSCH); for (i=0; iz[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]); + printf("re_offset %d (%p): %d,%d\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]); #endif txptr[re_offset++] = ulsch->z[j]; @@ -748,13 +748,13 @@ void ulsch_modulation(int32_t **txdataF, // re_offset0++; } - // msg("re_offset0 %d\n",re_offset0); + // printf("re_offset0 %d\n",re_offset0); // printf("txdataF %p\n",&txdataF[0][0]); for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) { re_offset = re_offset0; symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb)); #ifdef DEBUG_ULSCH_MODULATION - msg("ulsch_mod (OFDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); + printf("ulsch_mod (OFDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); #endif txptr = &txdataF[0][symbol_offset]; @@ -763,11 +763,11 @@ void ulsch_modulation(int32_t **txdataF, } // Skip reference symbols else { - // msg("copying %d REs\n",Msc_PUSCH); + // printf("copying %d REs\n",Msc_PUSCH); for (i=0; i %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]); + printf("re_offset %d (%p): %d,%d => %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]); #endif //DEBUG_ULSCH_MODULATION txptr[re_offset++] = ulsch->z[j]; diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 601e2fb199..28c407b088 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -183,7 +183,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, float time[FRAME_LENGTH_COMPLEX_SAMPLES]; float time2[2048]; float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; - int frame = phy_vars_enb->proc[0].frame_tx; + int frame = phy_vars_enb->proc.frame_tx; uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate; int coded_bits_per_codeword = 0; uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2 diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c index ba1014e9a0..d7328f20cc 100644 --- a/openair1/PHY/TOOLS/time_meas.c +++ b/openair1/PHY/TOOLS/time_meas.c @@ -48,7 +48,7 @@ double get_cpu_freq_GHz(void) { return cpu_freq_GHz; } -void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name){ +void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name){ if (opp_enabled) { diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index 3e621ac281..a0f674113b 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -69,7 +69,7 @@ static inline void start_meas(time_stats_t *ts) __attribute__((always_inline)); static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline)); -void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name); +void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name); void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time); double get_time_meas_us(time_stats_t *ts); double get_cpu_freq_GHz(void); diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index dd543bbbf8..c483035abc 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -192,10 +192,14 @@ typedef struct { int subframe_tx; /// subframe to act upon for reception int subframe_rx; + /// subframe to act upon for PRACH + int subframe_prach; /// frame to act upon for transmission int frame_tx; /// frame to act upon for reception int frame_rx; + /// frame to act upon for PRACH + int frame_prach; /// \brief Instance count for tx processing thread. /// \internal This variable is protected by \ref mutex_tx. int instance_cnt_tx; @@ -232,14 +236,13 @@ typedef struct { //! \brief Number of eNB TX and RX threads. //! This number must be equal to the number of LTE subframes (10). Each thread is responsible for a single subframe. -#define NUM_ENB_THREADS 1 /// Top-level PHY Data Structure for eNB typedef struct PHY_VARS_eNB_s { /// Module ID indicator for this instance module_id_t Mod_id; uint8_t CC_id; - eNB_proc_t proc[NUM_ENB_THREADS]; + eNB_proc_t proc; eNB_func_t node_function; uint8_t local_flag; uint32_t rx_total_gain_dB; diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index fa6239d930..2174684126 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -161,8 +161,6 @@ void cleanup_dlsch_threads(void); void phy_procedures_eNB_lte(uint8_t subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn); /*! \brief Top-level entry routine for UE procedures. Called every slot by process scheduler. In even slots, it performs RX functions from previous subframe (if required). On odd slots, it generate TX waveform for the following subframe. - @param last_slot Index of last slot (0-19) - @param next_slot Index of next_slot (0-19) @param phy_vars_ue Pointer to UE variables on which to act @param eNB_id ID of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @@ -215,61 +213,60 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for UE RX procedures in TDD S-subframes. - @param thread_index Thread index in proc vector @param phy_vars_ue Pointer to UE variables on which to act @param eNB_id Local id of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_UE_S_RX(uint8_t thread_index,PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type); +void phy_procedures_UE_S_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type); /*! \brief Scheduling for eNB TX procedures in normal subframes. - @param thread_index Index of thread in proc vector @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param phy_vars_rn pointer to the RN variables */ -void phy_procedures_eNB_TX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); /*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes. - @param thread_index Thread index in proc vector @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_uespec_RX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for eNB TX procedures in TDD S-subframes. - @param thread_index Index of thread in proc vector @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ /*! \brief Scheduling for eNB RX common procedures in normal subframes. - @param thread_index Thread index in proc vector @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction */ -void phy_procedures_eNB_common_RX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag); +void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag); /*! \brief Scheduling for eNB TX procedures in TDD S-subframes. - @param thread_index Index of thread in proc vector @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_S_TX(uint8_t next_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for eNB RX procedures in TDD S-subframes. - @param last_slot Index of next slot (0-19) @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_S_RX(uint8_t last_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); + +/*! \brief Scheduling for eNB PRACH RX procedures + @param phy_vars_eNB Pointer to eNB variables on which to act + @param abstraction_flag Indicator of PHY abstraction +*/ +void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag); /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index. @param frame_parms Pointer to DL frame parameter descriptor @@ -277,12 +274,6 @@ void phy_procedures_eNB_S_RX(uint8_t last_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_ @returns Subframe type (DL,UL,S) */ -/*! \brief Scheduling for eNB PRACH RX procedures - @param phy_vars_eNB Pointer to eNB variables on which to act - @param thread_id Index of thread in proc vector - @param abstraction_flag Indicator of PHY abstraction -*/ -void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_flag); lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe); @@ -400,10 +391,9 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); /*! \brief Indicates the SR TXOp in current subframe for eNB and particular UE index. Implements Table 10.1-5 from 36.213. @param phy_vars_eNB Pointer to eNB variables @param UE_id ID of UE which may be issuing the SR - @param subframe index of last subframe @returns 1 if TXOp is active. */ -uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t subframe); +uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id); /*! \brief Gives the UL subframe corresponding to a PDDCH order in subframe n @param frame_parms Pointer to DL frame parameters @@ -443,14 +433,14 @@ subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch TDD, this routine computes the complex procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2) @param phy_vars_ue Pointer to UE variables @param eNB_id Index of eNB -@param thread_id Index of thread where procedures are executed +@param subframe subframe on which to act @param b Pointer to PUCCH payload (b[0],b[1]) @param SR 1 means there's a positive SR in parallel to ACK/NAK @returns n1_pucch */ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, - uint8_t thread_id, + uint8_t subframe, uint8_t *b, uint8_t SR); @@ -468,7 +458,6 @@ TDD, this routine computes the procedure described in Section 10.1 of 36.213 (th */ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, uint8_t UE_id, - uint8_t subframe, int16_t *n1_pucch0, int16_t *n1_pucch1, int16_t *n1_pucch2, @@ -477,7 +466,6 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, /*! \brief This function retrieves the harq_pid of the corresponding DLSCH process and updates the error statistics of the DLSCH based on the received ACK info from UE along with the round index. It also performs the fine-grain rate-adaptation based on the error statistics derived from the ACK/NAK process. @param UE_id Local UE index on which to act - @param subframe Index of subframe @param phy_vars_eNB Pointer to eNB variables on which to act @param pusch_flag Indication that feedback came from PUSCH @param pucch_payload Resulting payload from pucch @@ -485,7 +473,6 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, @param SR_payload Indication of SR presence (TDD specific) */ void process_HARQ_feedback(uint8_t UE_id, - uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB, uint8_t pusch_flag, uint8_t *pucch_payload, @@ -548,8 +535,6 @@ int16_t get_target_pucch_rx_power(module_id_t module_idP, uint8_t CC_id); int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag); -void ulsch_decoding_procedures(unsigned char last_slot, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag); - void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 0b4fffe3d3..564a7951c6 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -48,7 +48,7 @@ #include "SCHED/phy_procedures_emos.h" #endif -void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) +void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) { @@ -57,7 +57,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) uint32_t rballoc = 0x7FFF; //uint32_t rballoc2 = 0x000F; - int subframe = eNB->proc[thread_id].subframe_tx; + int subframe = eNB->proc.subframe_tx; LTE_eNB_DLSCH_t *DLSCH_ptr = eNB->dlsch[0][0]; @@ -89,7 +89,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -100,7 +100,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -117,7 +117,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -128,7 +128,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -144,7 +144,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -155,7 +155,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; @@ -171,7 +171,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -182,7 +182,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -236,7 +236,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -267,7 +267,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -303,7 +303,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); @@ -334,7 +334,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); @@ -369,7 +369,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -400,7 +400,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc[thread_id].frame_tx&1; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t)); @@ -437,10 +437,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = eNB->proc[thread_id].frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = eNB->proc.frame_tx&1; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = eNB->proc[thread_id].frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = eNB->proc.frame_tx&1; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; @@ -459,7 +459,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = eNB->proc[thread_id].frame_tx&1; + DLSCH_alloc_pdu1E.ndi = eNB->proc.frame_tx&1; //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[eNB->eNB_UE_stats->DL_cqi[0]]; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; @@ -482,7 +482,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) //DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((eNB->frame%1024)%28); - DLSCH_alloc_pdu1E.mcs = (unsigned char) (((eNB->proc[thread_id].frame_tx%1024)/3)%28); + DLSCH_alloc_pdu1E.mcs = (unsigned char) (((eNB->proc.frame_tx%1024)/3)%28); eNB->UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); @@ -533,7 +533,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) UL_alloc_pdu.hopping = 0; UL_alloc_pdu.rballoc = computeRIV(25,2,eNB->ue_ul_nb_rb); UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; - UL_alloc_pdu.ndi = eNB->proc[thread_id].frame_tx&1; + UL_alloc_pdu.ndi = eNB->proc.frame_tx&1; UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cshift = 0; UL_alloc_pdu.dai = 0; @@ -555,7 +555,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB) else UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb); UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; - UL_alloc_pdu.ndi = eNB->proc[thread_id].frame_tx&1; + UL_alloc_pdu.ndi = eNB->proc.frame_tx&1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) UL_alloc_pdu.cshift = 0; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 9dd3d98e00..c2dc89c2c5 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -101,10 +101,10 @@ extern uint8_t smbv_frame_cnt; extern int rx_sig_fifo; #endif -uint8_t is_SR_subframe(PHY_VARS_eNB *eNB,uint8_t UE_id,uint8_t thread_id) +uint8_t is_SR_subframe(PHY_VARS_eNB *eNB,uint8_t UE_id) { - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; @@ -339,10 +339,10 @@ void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *eNB) -void phy_procedures_eNB_S_RX(unsigned char thread_id,PHY_VARS_eNB *eNB,uint8_t abstraction_flag,relaying_type_t r_type) +void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,uint8_t abstraction_flag,relaying_type_t r_type) { UNUSED(r_type); - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; #ifdef DEBUG_PHY_PROC @@ -435,14 +435,15 @@ int QPSK2[4]= {AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),( unsigned int taus(void); -void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int thread_id,int abstraction_flag,relaying_type_t r_type) { +void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int abstraction_flag,relaying_type_t r_type) { #ifdef Rel10 MCH_PDU *mch_pduP; MCH_PDU mch_pdu; // uint8_t sync_area=255; #endif - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; + int subframe = proc->subframe_tx; if (abstraction_flag==0) { // This is DL-Cell spec pilots in Control region @@ -507,7 +508,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int thread_ if (mch_pduP) { fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag); // Generate PMCH - generate_mch(eNB,thread_id,(uint8_t*)mch_pduP->payload,abstraction_flag); + generate_mch(eNB,(uint8_t*)mch_pduP->payload,abstraction_flag); } else { LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",proc->frame_tx,subframe); } @@ -515,12 +516,14 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int thread_ #endif } -void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int abstraction_flag) { +void common_signal_procedures (PHY_VARS_eNB *eNB,int abstraction_flag) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; int **txdataF = eNB->common_vars.txdataF[0]; uint8_t *pbch_pdu=&eNB->pbch_pdu[0]; - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; + int subframe = proc->subframe_tx; + int frame = proc->frame_tx; // generate Cell-Specific Reference Signals for both slots if (abstraction_flag==0) { @@ -557,7 +560,7 @@ void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int } // generate PBCH (Physical Broadcast CHannel) info - if ((proc->frame_tx&3) == 0) { + if ((frame&3) == 0) { pbch_pdu[2] = 0; // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators @@ -617,8 +620,8 @@ void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int break; } - pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((proc->frame_tx>>8)&0x3); - pbch_pdu[1] = proc->frame_tx&0xfc; + pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((frame>>8)&0x3); + pbch_pdu[1] = frame&0xfc; pbch_pdu[0] = 0; } @@ -640,7 +643,7 @@ void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int AMP, fp, pbch_pdu, - proc->frame_tx&3); + frame&3); } #ifdef PHY_ABSTRACTION else { @@ -700,10 +703,12 @@ void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int } -void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { +void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; + int frame = proc->frame_tx; + int subframe = proc->subframe_tx; // if we have SI_RNTI, configure dlsch parameters and CCE index if (dci_alloc->rnti == SI_RNTI) { @@ -724,14 +729,14 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id, eNB->dlsch_SI->nCCE[subframe] = dci_alloc->firstCCE; - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"\n",eNB->Mod_id,proc->frame_tx,subframe, + LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"\n",eNB->Mod_id,frame,subframe, eNB->dlsch_SI->nCCE[subframe]); #if defined(SMBV) // configure SI DCI - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i); + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",frame,subframe,i); smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", dci_alloc, i); } @@ -757,13 +762,13 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id, eNB->dlsch_ra->nCCE[subframe] = dci_alloc->firstCCE; - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"\n",eNB->Mod_id,proc->frame_tx,subframe, + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"\n",eNB->Mod_id,frame,subframe, eNB->dlsch_ra->nCCE[subframe]); #if defined(SMBV) // configure RA DCI - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i); + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",frame,subframe,i); smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", dci_alloc, i); } @@ -781,8 +786,8 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id, if (UE_id>=0) { #if defined(SMBV) // Configure this user - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",proc->frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",frame,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, dci_alloc->rnti,eNB->transmission_mode[(uint8_t)UE_id]); smbv_configure_user(smbv_fname,UE_id+1,eNB->transmission_mode[(uint8_t)UE_id],dci_alloc->rnti); } @@ -803,19 +808,19 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id, P_RNTI, eNB->UE_stats[(uint8_t)UE_id].DL_pmi_single); LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n", - eNB->Mod_id,dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->current_harq_pid,proc->frame_tx,subframe); + eNB->Mod_id,dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->current_harq_pid,frame,subframe); eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE; - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,proc->frame_tx,subframe, + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,frame,subframe, dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe]); #if defined(SMBV) // configure UE-spec DCI - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i); + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",frame,subframe,i); smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1,dci_alloc, i); } @@ -823,43 +828,44 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id, LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n", eNB->Mod_id, dci_alloc->rnti, - proc->frame_tx, subframe,UE_id, + frame, subframe,UE_id, dci_alloc->format, 1<L); } else { LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n", - eNB->Mod_id,proc->frame_tx,dci_alloc->rnti); + eNB->Mod_id,frame,dci_alloc->rnti); } } } -void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { +void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { int harq_pid; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - eNB_proc_t *proc = &eNB->proc[thread_id]; - + eNB_proc_t *proc = &eNB->proc; + int frame = proc->frame_tx; + int subframe = proc->frame_rx; + LOG_D(PHY, "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n", eNB->Mod_id, subframe2harq_pid(fp, - pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe), + pdcch_alloc2ul_frame(fp,frame,subframe), pdcch_alloc2ul_subframe(fp,subframe)), - proc->frame_tx, + frame, subframe, - pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe), + pdcch_alloc2ul_frame(fp,frame,subframe), pdcch_alloc2ul_subframe(fp,subframe), dci_alloc->rnti, dci_alloc->dci_pdu[0], 1<L); - generate_eNB_ulsch_params_from_dci(&dci_alloc->dci_pdu[0], + generate_eNB_ulsch_params_from_dci(eNB, + &dci_alloc->dci_pdu[0], dci_alloc->rnti, - thread_id, format0, UE_id, - eNB, SI_RNTI, 0, P_RNTI, @@ -867,14 +873,14 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id, 0); // do_srs LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d\n", - eNB->Mod_id,proc->frame_tx,subframe,dci_alloc->rnti, + eNB->Mod_id,frame,subframe,dci_alloc->rnti, dci_alloc->firstCCE); #if defined(SMBV) // configure UE-spec DCI for UL Grant - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",proc->frame_tx,subframe,i); + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",frame,subframe,i); smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); } @@ -883,11 +889,11 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id, // get the hard_pid for this subframe harq_pid = subframe2harq_pid(fp, - pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe), + pdcch_alloc2ul_frame(fp,frame,subframe), pdcch_alloc2ul_subframe(fp,subframe)); if (harq_pid==255) { // should not happen, log an error and exit, this is a fatal error - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,proc->frame_tx); + LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,frame); mac_xface->macphy_exit("FATAL\n"); } @@ -898,9 +904,11 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id, } -void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int subframe,int thread_id,int num_pdcch_symbols,int abstraction_flag) { +void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols,int abstraction_flag) { - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; + int frame=proc->frame_tx; + int subframe=proc->subframe_tx; int harq_pid = dlsch->current_harq_pid; LTE_DL_eNB_HARQ_t *dlsch_harq=dlsch->harq_processes[harq_pid]; int input_buffer_length = dlsch_harq->TBS/8; @@ -913,13 +921,13 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t LOG_D(PHY, "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", eNB->Mod_id, dlsch->rnti,harq_pid, - proc->frame_tx, subframe, input_buffer_length, + frame, subframe, input_buffer_length, get_G(fp, dlsch_harq->nb_rb, dlsch_harq->rb_alloc, get_Qm(dlsch_harq->mcs), dlsch_harq->Nl, - num_pdcch_symbols,proc->frame_tx,subframe), + num_pdcch_symbols,frame,subframe), dlsch_harq->nb_rb, dlsch_harq->mcs, pmi2hex_2Ar1(dlsch_harq->pmi_alloc), @@ -931,14 +939,14 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t MSC_PHY_ENB,MSC_PHY_UE, NULL,0, "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")", - proc->frame_tx, subframe, + frame, subframe, input_buffer_length, get_G(fp, dlsch_harq->nb_rb, dlsch_harq->rb_alloc, get_Qm(dlsch_harq->mcs), dlsch_harq->Nl, - num_pdcch_symbols,proc->frame_tx,subframe), + num_pdcch_symbols,frame,subframe), dlsch_harq->nb_rb, dlsch_harq->mcs, pmi2hex_2Ar1(dlsch_harq->pmi_alloc), @@ -957,14 +965,14 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t if (ra_flag == 0) { DLSCH_pdu = mac_xface->get_dlsch_sdu(eNB->Mod_id, eNB->CC_id, - proc->frame_tx, + frame, dlsch->rnti, 0); } else { int16_t crnti = mac_xface->fill_rar(eNB->Mod_id, eNB->CC_id, - proc->frame_tx, + frame, DLSCH_pdu_rar, fp->N_RB_UL, input_buffer_length); @@ -981,7 +989,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t LOG_W(PHY,"[eNB] Max user count reached.\n"); mac_xface->cancel_ra_proc(eNB->Mod_id, eNB->CC_id, - proc->frame_tx, + frame, crnti); } else { eNB->UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE; @@ -989,7 +997,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t eNB->first_sr[(uint32_t)UE_id] = 1; generate_eNB_ulsch_params_from_rar(DLSCH_pdu, - proc->frame_tx, + frame, (subframe), eNB->ulsch[(uint32_t)UE_id], fp); @@ -998,11 +1006,11 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t get_Msg3_alloc(fp, subframe, - proc->frame_tx, + frame, &eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, &eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe); LOG_D(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %"PRId8" in frame %"PRIu32", subframe %"PRIu8"\n", - proc->frame_tx, + frame, subframe, UE_id, eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, @@ -1021,8 +1029,8 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t #if defined(SMBV) // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",frame,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); // smbv_configure_datalist_for_user(smbv_fname, find_ue(dlsch->rnti,eNB)+1, DLSCH_pdu, input_buffer_length); } @@ -1057,7 +1065,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t fp, num_pdcch_symbols, dlsch, - proc->frame_tx,subframe, + frame,subframe, &eNB->dlsch_rate_matching_stats, &eNB->dlsch_turbo_encoding_stats, &eNB->dlsch_interleaving_stats); @@ -1072,7 +1080,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t dlsch_harq->rb_alloc, get_Qm(dlsch_harq->mcs), dlsch_harq->Nl, - num_pdcch_symbols,proc->frame_tx,subframe), + num_pdcch_symbols,frame,subframe), 0, subframe<<1); stop_meas(&eNB->dlsch_scrambling_stats); @@ -1103,14 +1111,15 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t dlsch->active = 0; } -void phy_procedures_eNB_TX(unsigned char thread_id, - PHY_VARS_eNB *eNB, +void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *rn) { UNUSED(rn); - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; + int frame=proc->frame_tx; + int subframe=proc->subframe_tx; // uint16_t input_buffer_length; uint32_t i,aa; uint8_t harq_pid; @@ -1128,8 +1137,6 @@ void phy_procedures_eNB_TX(unsigned char thread_id, // there is at least one allocation for PDCCH uint8_t smbv_alloc_cnt = 1; #endif - int frame = proc->frame_tx; - int subframe = proc->subframe_tx; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); start_meas(&eNB->phy_proc_tx); @@ -1157,7 +1164,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id, // This is called only for the CC_id = 0 and triggers scheduling for all CC_id's if (eNB->mac_enabled==1) { if (eNB->CC_id == 0) { - mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,proc->frame_tx,subframe);//,1); + mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,frame,subframe);//,1); } } @@ -1169,18 +1176,18 @@ void phy_procedures_eNB_TX(unsigned char thread_id, } } - if (is_pmch_subframe(proc->frame_tx,subframe,fp)) { - pmch_procedures(eNB,rn,subframe,thread_id,abstraction_flag,r_type); + if (is_pmch_subframe(frame,subframe,fp)) { + pmch_procedures(eNB,rn,abstraction_flag,r_type); } else { // this is not a pmch subframe, so generate PSS/SSS/PBCH - common_signal_procedures(subframe,thread_id,eNB,abstraction_flag); + common_signal_procedures(eNB,abstraction_flag); } #if defined(SMBV) // PBCH takes one allocation - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { if (subframe==0) smbv_alloc_cnt++; } @@ -1192,21 +1199,21 @@ void phy_procedures_eNB_TX(unsigned char thread_id, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); DCI_pdu = mac_xface->get_dci_sdu(eNB->Mod_id, eNB->CC_id, - proc->frame_tx, + frame, subframe); } else { DCI_pdu = &DCI_pdu_tmp; #ifdef EMOS_CHANNEL - fill_dci_emos(DCI_pdu,thread_id,eNB); + fill_dci_emos(DCI_pdu,eNB); #else - fill_dci(DCI_pdu,thread_id,eNB); + fill_dci(DCI_pdu,eNB); #endif } // clear existing ulsch dci allocations before applying info from MAC (this is table ul_subframe = pdcch_alloc2ul_subframe(fp,subframe); - ul_frame = pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe); + ul_frame = pdcch_alloc2ul_frame(fp,frame,subframe); if ((subframe_select(fp,ul_subframe)==SF_UL) || (fp->frame_type == FDD)) { @@ -1232,8 +1239,8 @@ void phy_procedures_eNB_TX(unsigned char thread_id, #if defined(SMBV) // Sets up PDCCH and DCI table - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { - LOG_D(PHY,"[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",proc->frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { + LOG_D(PHY,"[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",frame,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); dump_dci(fp,&DCI_pdu->dci_alloc[0]); smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (subframe),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); } @@ -1258,7 +1265,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id, } else UE_id=0; - generate_eNB_dlsch_params(frame,subframe,thread_id,eNB,dci_alloc,UE_id); + generate_eNB_dlsch_params(eNB,dci_alloc,UE_id); } @@ -1277,10 +1284,10 @@ void phy_procedures_eNB_TX(unsigned char thread_id, UE_id = i; if (UE_id<0) { // should not happen, log an error and exit, this is a fatal error - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,proc->frame_tx,dci_alloc->rnti); + LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,frame,dci_alloc->rnti); mac_xface->macphy_exit("FATAL\n"); } - generate_eNB_ulsch_params(frame,subframe,thread_id,eNB,dci_alloc,UE_id); + generate_eNB_ulsch_params(eNB,dci_alloc,UE_id); } } @@ -1300,7 +1307,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id, if (abstraction_flag == 0) { if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,proc->frame_tx, subframe, + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,frame, subframe, DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci, @@ -1316,7 +1323,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id, #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious else { - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,proc->frame_tx, subframe); + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,frame, subframe); num_pdcch_symbols = generate_dci_top_emul(eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe); } @@ -1328,13 +1335,13 @@ void phy_procedures_eNB_TX(unsigned char thread_id, if (eNB->dlsch_SI->active == 1) { - pdsch_procedures(eNB,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,subframe,thread_id,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,num_pdcch_symbols,abstraction_flag); #if defined(SMBV) // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",frame,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length); } @@ -1347,8 +1354,8 @@ void phy_procedures_eNB_TX(unsigned char thread_id, #if defined(SMBV) // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) { - LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); + if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) { + LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",frame,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length); } @@ -1357,11 +1364,11 @@ void phy_procedures_eNB_TX(unsigned char thread_id, LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA),Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", eNB->Mod_id, - proc->frame_tx, subframe, + frame, subframe, eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe); - pdsch_procedures(eNB,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,subframe,thread_id,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,num_pdcch_symbols,abstraction_flag); eNB->dlsch_ra->active = 0; @@ -1374,7 +1381,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id, (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& (eNB->dlsch[(uint8_t)UE_id][0]->active == 1)) { - pdsch_procedures(eNB,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,subframe,thread_id,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,num_pdcch_symbols,abstraction_flag); } @@ -1395,7 +1402,6 @@ void phy_procedures_eNB_TX(unsigned char thread_id, if (is_phich_subframe(fp,subframe)) { generate_phich_top(eNB, - thread_id, AMP, 0, abstraction_flag); @@ -1414,11 +1420,11 @@ void phy_procedures_eNB_TX(unsigned char thread_id, start_meas(&eNB->ofdm_mod_stats); do_OFDM_mod(eNB->common_vars.txdataF[0], eNB->common_vars.txdata[0], - proc->frame_tx,subframe<<1, + frame,subframe<<1, fp); do_OFDM_mod(eNB->common_vars.txdataF[0], eNB->common_vars.txdata[0], - proc->frame_tx,1+(subframe<<1), + frame,1+(subframe<<1), fp); stop_meas(&eNB->ofdm_mod_stats); } @@ -1431,10 +1437,10 @@ void phy_procedures_eNB_TX(unsigned char thread_id, } -void process_Msg3(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t UE_id, uint8_t harq_pid) +void process_Msg3(PHY_VARS_eNB *eNB,uint8_t UE_id, uint8_t harq_pid) { // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; int frame = proc->frame_rx; @@ -1468,7 +1474,6 @@ void process_Msg3(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t UE_id, uint8_t har // rate-adaptation based on the error statistics derived from the ACK/NAK process void process_HARQ_feedback(uint8_t UE_id, - uint8_t thread_id, PHY_VARS_eNB *eNB, uint8_t pusch_flag, uint8_t *pucch_payload, @@ -1476,7 +1481,7 @@ void process_HARQ_feedback(uint8_t UE_id, uint8_t SR_payload) { - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe; LTE_eNB_DLSCH_t *dlsch = eNB->dlsch[(uint32_t)UE_id][0]; @@ -1741,14 +1746,13 @@ void process_HARQ_feedback(uint8_t UE_id, void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, uint8_t UE_id, - uint8_t thread_id, int16_t *n1_pucch0, int16_t *n1_pucch1, int16_t *n1_pucch2, int16_t *n1_pucch3) { - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms; uint8_t nCCE0,nCCE1; int sf; @@ -1880,7 +1884,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, } } -void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_flag) +void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; @@ -1888,7 +1892,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_fl uint16_t preamble_max,preamble_energy_max; uint16_t i; int8_t UE_id; - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; int frame = proc->frame_rx; uint8_t CC_id = eNB->CC_id; @@ -1902,7 +1906,6 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_fl rx_prach(eNB, - subframe, preamble_energy_list, preamble_delay_list, frame, @@ -1999,17 +2002,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_fl } } -void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *eNB, unsigned char abstraction_flag) -{ - UNUSED(subframe); - UNUSED(i); - UNUSED(eNB); - UNUSED(abstraction_flag); - LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called"); -} - - -void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void pucch_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; @@ -2019,7 +2012,7 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id, int32_t metric0=0,metric1=0,metric0_SR=0; ANFBmode_t bundling_flag; PUCCH_FMT_t format; - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; @@ -2028,14 +2021,13 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id, (eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { // check SR availability - do_SR = is_SR_subframe(eNB,UE_id,thread_id); + do_SR = is_SR_subframe(eNB,UE_id); // do_SR = 0; // Now ACK/NAK // First check subframe_tx flag for earlier subframes get_n1_pucch_eNB(eNB, UE_id, - thread_id, &n1_pucch0, &n1_pucch1, &n1_pucch2, @@ -2098,8 +2090,7 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id, UE_id, pucch_format1, 0, - &SR_payload, - thread_id); + &SR_payload); LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id, eNB->ulsch[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); } @@ -2182,7 +2173,7 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id, pucch_payload0[0],metric0); #endif - process_HARQ_feedback(UE_id,thread_id,eNB, + process_HARQ_feedback(UE_id,eNB, 0,// pusch_flag pucch_payload0, 2, @@ -2313,7 +2304,7 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id, frame,subframe, metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); #endif - process_HARQ_feedback(UE_id,thread_id,eNB, + process_HARQ_feedback(UE_id,eNB, 0,// pusch_flag pucch_payload, pucch_sel, @@ -2324,9 +2315,9 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id, } } -void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void cba_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; uint8_t access_mode; int num_active_cba_groups; const int subframe = proc->subframe_rx; @@ -2352,7 +2343,6 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in if (abstraction_flag==0) { rx_ulsch(eNB, - thread_id, eNB->UE_stats[UE_id].sector, // this is the effective sector id UE_id, eNB->ulsch, @@ -2372,7 +2362,6 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in if (abstraction_flag == 0) { ret = ulsch_decoding(eNB, UE_id, - thread_id, 0, // control_only_flag eNB->ulsch[UE_id]->harq_processes[harq_pid]->V_UL_DAI, eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); @@ -2381,7 +2370,6 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in #ifdef PHY_ABSTRACTION else { ret = ulsch_decoding_emul(eNB, - thread_id, UE_id, &rnti); } @@ -2489,20 +2477,26 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in -void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) { +void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) { - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; int i,l; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; void *rxp[fp->nb_antennas_rx]; unsigned int rxs; - - AssertFatal(thread_id < NUM_ENB_THREADS, "Bad thread_id %d", thread_id); + int subframe = proc->subframe_rx; + int frame = proc->frame_rx; + + if (subframe==9) { + subframe=0; + frame++; + } + else subframe++; // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_COMMON_RX,1); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,proc->frame_rx, proc->subframe_rx); + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); #endif if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) @@ -2511,7 +2505,7 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN if ((eNB->node_function == NGFI_RRU_IF4) || (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF and front-end processing for (i=0; inb_antennas_rx; i++) - rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][proc->subframe*fp->samples_per_tti]; + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); rxs = openair0.trx_read_func(&openair0, @@ -2521,9 +2515,11 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN fp->nb_antennas_rx); proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is"); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, subframe ); if (frame > 20){ if (rxs != fp->samples_per_tti>>1) @@ -2583,15 +2579,18 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN // check if we have to detect PRACH first - if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) { + if (is_prach_subframe(fp,frame,subframe)>0) { // wake up thread for PRACH RX if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", thread_id, proc->instance_cnt_prach ); + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); exit_fun( "error locking mutex_prach" ); return; } int cnt_prach = ++proc->instance_cnt_prach; + // set timing for prach thread + proc->frame_prach = frame; + proc->subframe_prach = subframe; pthread_mutex_unlock( &proc->mutex_prach ); @@ -2603,7 +2602,7 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN return; } } else { - LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", proc->frame_tx); + LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", frame); exit_fun( "PRACH thread busy" ); return; } @@ -2614,7 +2613,7 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN // wake up TX thread // lock the TX mutex and make sure the thread is ready if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", thread_id, proc->instance_cnt_tx ); + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx ); exit_fun( "error locking mutex_tx" ); return; } @@ -2627,20 +2626,20 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN // we want to generate subframe (n+3), so TS_tx = TX_rx+2.5*samples_per_tti, // and proc->subframe_tx = proc->subframe_rx+3 proc->timestamp_tx = proc->timestamp_rx + (fp->samples_per_tti<<1) + (fp->samples_per_tti>>1); - proc->frame_tx = (proc->subframe_rx > 6) ? (proc->frame_rx+1) : proc->frame_rx; - proc->subframe_tx = (proc->subframe_rx + 3)%10; + proc->frame_tx = (subframe > 6) ? (frame+1) : frame; + proc->subframe_tx = (subframe + 3)%10; pthread_mutex_unlock( &proc->mutex_tx ); if (cnt_tx == 0){ // the thread was presumably waiting where it should and can now be woken up if (pthread_cond_signal(&proc->cond_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n", thread_id); + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n"); exit_fun( "ERROR pthread_cond_signal" ); return; } } else { - LOG_W( PHY,"[eNB] Frame %d, eNB TX thread %d busy!! (cnt_tx %i)\n", proc->frame_tx, thread_id, cnt_tx ); + LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", frame, cnt_tx ); exit_fun( "TX thread busy" ); return; } @@ -2652,11 +2651,11 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN } } -void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) +void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) { //RX processing for ue-specific resources (i UNUSED(r_type); - eNB_proc_t *proc = &eNB->proc[thread_id]; + eNB_proc_t *proc = &eNB->proc; uint32_t l, ret=0,i,j,k; uint32_t harq_pid, harq_idx, round; uint8_t nPRS; @@ -2668,8 +2667,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - AssertFatal(thread_id < NUM_ENB_THREADS, "Bad thread_id %d", thread_id); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC @@ -2720,7 +2717,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN // Do PUCCH processing first for (i=0; imac_enabled==1) { if (eNB->UE_stats[i].mode == RA_RESPONSE) { - process_Msg3(eNB,thread_id,i,harq_pid); + process_Msg3(eNB,i,harq_pid); } } @@ -2810,7 +2807,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN if (abstraction_flag==0) { rx_ulsch(eNB, - thread_id, eNB->UE_stats[i].sector, // this is the effective sector id i, eNB->ulsch, @@ -2834,7 +2830,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN if (abstraction_flag == 0) { ret = ulsch_decoding(eNB, i, - thread_id, 0, // control_only_flag eNB->ulsch[i]->harq_processes[harq_pid]->V_UL_DAI, eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); @@ -2843,7 +2838,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN #ifdef PHY_ABSTRACTION else { ret = ulsch_decoding_emul(eNB, - thread_id, i, &rnti); } @@ -2869,8 +2863,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN eNB->ulsch[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0); // 0 means bw_factor is not considered - //dump_ulsch(eNB, thread_id, i); - eNB->UE_stats[i].ulsch_decoding_attempts[harq_pid][eNB->ulsch[i]->harq_processes[harq_pid]->round]++; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", @@ -2880,7 +2872,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN if (eNB->ulsch[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - //if (((proc->frame_tx%10) == 0) || (proc->frame_tx < 50)) + //if (((frame%10) == 0) || (frame < 50)) print_CQI(eNB->ulsch[i]->harq_processes[harq_pid]->o,eNB->ulsch[i]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL); #endif extract_CQI(eNB->ulsch[i]->harq_processes[harq_pid]->o, @@ -3139,7 +3131,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN // estimate timing advance for MAC if (abstraction_flag == 0) { - sync_pos = lte_est_timing_advance_pusch(eNB,i,thread_id); + sync_pos = lte_est_timing_advance_pusch(eNB,i); eNB->UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check } @@ -3162,7 +3154,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN i); #endif process_HARQ_feedback(i, - thread_id, eNB, 1, // pusch_flag 0, @@ -3226,7 +3217,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN } // CBA (non-LTE) - cba_procedures(thread_id,eNB,i,harq_pid,abstraction_flag); + cba_procedures(eNB,i,harq_pid,abstraction_flag); } // loop i=0 ... NUMBER_OF_UE_MAX-1 if (abstraction_flag == 0) { diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index b055544449..d757a7573c 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -57,13 +57,13 @@ #include "UTIL/LOG/log.h" #include "UTIL/LISTS/list.h" -extern unsigned int dlsch_tbs25[27][25],TBStable[27][110]; -extern unsigned char offset_mumimo_llr_drange_fix; +#include "unitary_defs.h" + #include "PHY/TOOLS/lte_phy_scope.h" -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; int otg_enabled=0; /*the following parameters are used to control the processing times calculations*/ @@ -96,7 +96,7 @@ DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2]; uint64_t DLSCH_alloc_pdu_1[2]; #define UL_RB_ALLOC 0x1ff; -#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2) +#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) //#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 //#define DLSCH_RB_ALLOC 0x0001 void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms) @@ -485,7 +485,7 @@ int main(int argc, char **argv) case 'u': dual_stream_UE=1; - openair_daq_vars.use_ia_receiver = 1; + UE->use_ia_receiver = 1; if ((n_tx!=2) || (transmission_mode!=5)) { msg("IA receiver only supported for TM5!"); @@ -627,7 +627,7 @@ int main(int argc, char **argv) fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); if (!dual_stream_UE==0) { - openair_daq_vars.use_ia_receiver = 1; + UE->use_ia_receiver = 1; fl_set_button(form_ue->button_0,1); fl_set_object_label(form_ue->button_0, "IA Receiver ON"); fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN); @@ -653,7 +653,7 @@ int main(int argc, char **argv) - eNB_id_i = PHY_vars_UE->n_connected_eNB; + eNB_id_i = UE->n_connected_eNB; printf("Setting mcs1 = %d\n",mcs1); printf("Setting mcs2 = %d\n",mcs2); @@ -674,7 +674,7 @@ int main(int argc, char **argv) txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); */ - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; s_re = malloc(2*sizeof(double*)); s_im = malloc(2*sizeof(double*)); @@ -683,7 +683,7 @@ int main(int argc, char **argv) // r_re0 = malloc(2*sizeof(double*)); // r_im0 = malloc(2*sizeof(double*)); - nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12; + nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model); printf("SCM-A=%d, SCM-B=%d, SCM-C=%d, SCM-D=%d, EPA=%d, EVA=%d, ETU=%d, Rayleigh8=%d, Rayleigh1=%d, Rayleigh1_corr=%d, Rayleigh1_anticorr=%d, Rice1=%d, Rice8=%d\n", @@ -838,7 +838,7 @@ int main(int argc, char **argv) } - PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti; + UE->pdcch_vars[0]->crnti = n_rnti; // Fill in UL_alloc UL_alloc_pdu.type = 0; @@ -882,22 +882,22 @@ int main(int argc, char **argv) DLSCH_alloc_pdu2_1E[1].tpmi = (transmission_mode>=5 ? 5 : 0) ; // precoding DLSCH_alloc_pdu2_1E[1].dl_power_off = (transmission_mode==5 ? 0 : 1); - eNB2UE[0] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE[0] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, 0); if(num_rounds>1) { for(n=1; n<4; n++) - eNB2UE[n] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE[n] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, 0); @@ -933,42 +933,42 @@ int main(int argc, char **argv) for (k=0; kdlsch_eNB[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0); + eNB->dlsch[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0); - if (!PHY_vars_eNB->dlsch_eNB[k][i]) { + if (!eNB->dlsch[k][i]) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - PHY_vars_eNB->dlsch_eNB[k][i]->rnti = n_rnti+k; + eNB->dlsch[k][i]->rnti = n_rnti+k; } } for (i=0; i<2; i++) { - PHY_vars_UE->dlsch_ue[0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); + UE->dlsch[0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); - if (!PHY_vars_UE->dlsch_ue[0][i]) { + if (!UE->dlsch[0][i]) { printf("Can't get ue dlsch structures\n"); exit(-1); } - PHY_vars_UE->dlsch_ue[0][i]->rnti = n_rnti; + UE->dlsch[0][i]->rnti = n_rnti; } // structure for SIC at UE - PHY_vars_UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0); + UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0); if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff); + eNB->UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff); if (n_users>1) - PHY_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI + eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI } else { - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single = 0; + eNB->UE_stats[0].DL_pmi_single = 0; if (n_users>1) - PHY_vars_eNB->eNB_UE_stats[1].DL_pmi_single = 0; + eNB->UE_stats[1].DL_pmi_single = 0; } @@ -992,9 +992,9 @@ int main(int argc, char **argv) case 2: if (common_flag == 0) { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI1_1_5MHz_TDD_t; dci_length_bytes = sizeof(DCI1_1_5MHz_TDD_t); @@ -1048,7 +1048,7 @@ int main(int argc, char **argv) break; } } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI1_1_5MHz_FDD_t; dci_length_bytes = sizeof(DCI1_1_5MHz_FDD_t); @@ -1104,7 +1104,7 @@ int main(int argc, char **argv) dci_alloc[num_dci].L = 1; dci_alloc[num_dci].rnti = n_rnti+k; dci_alloc[num_dci].format = format1; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); printf("Generating dlsch params for user %d\n",k); generate_eNB_dlsch_params_from_dci(0, @@ -1112,26 +1112,26 @@ int main(int argc, char **argv) &DLSCH_alloc_pdu_1[0], n_rnti+k, format1, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + eNB->UE_stats[0].DL_pmi_single); num_dci++; num_ue_spec_dci++; } else { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1145,7 +1145,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1159,7 +1159,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1171,7 +1171,7 @@ int main(int argc, char **argv) case 100: ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1183,13 +1183,13 @@ int main(int argc, char **argv) break; } } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI1A_1_5MHz_FDD_t; dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1202,7 +1202,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1215,7 +1215,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1228,7 +1228,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1244,7 +1244,7 @@ int main(int argc, char **argv) dci_alloc[num_dci].rnti = SI_RNTI; dci_alloc[num_dci].format = format1A; dci_alloc[num_dci].firstCCE = 0; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); printf("Generating dlsch params for user %d\n",k); generate_eNB_dlsch_params_from_dci(0, @@ -1252,13 +1252,13 @@ int main(int argc, char **argv) &DLSCH_alloc_pdu_1[0], SI_RNTI, format1A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + eNB->UE_stats[0].DL_pmi_single); num_common_dci++; num_dci++; @@ -1270,11 +1270,11 @@ int main(int argc, char **argv) case 3: if (common_flag == 0) { - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 2) { + if (eNB->frame_parms.nb_antennas_tx == 2) { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t; dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); @@ -1341,7 +1341,7 @@ int main(int argc, char **argv) } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t; dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t); @@ -1402,7 +1402,7 @@ int main(int argc, char **argv) break; } } - } else if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 4) { + } else if (eNB->frame_parms.nb_antennas_tx == 4) { } @@ -1411,7 +1411,7 @@ int main(int argc, char **argv) dci_alloc[num_dci].L = 1; dci_alloc[num_dci].rnti = n_rnti+k; dci_alloc[num_dci].format = format2A; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A); generate_eNB_dlsch_params_from_dci(0, @@ -1419,26 +1419,26 @@ int main(int argc, char **argv) &DLSCH_alloc_pdu_1[0], n_rnti+k, format2A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + eNB->UE_stats[0].DL_pmi_single); num_dci++; num_ue_spec_dci++; } else { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1452,7 +1452,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1466,7 +1466,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1478,7 +1478,7 @@ int main(int argc, char **argv) case 100: ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1490,13 +1490,13 @@ int main(int argc, char **argv) break; } } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI1A_1_5MHz_FDD_t; dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1509,7 +1509,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1522,7 +1522,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1535,7 +1535,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1551,7 +1551,7 @@ int main(int argc, char **argv) dci_alloc[num_dci].rnti = SI_RNTI; dci_alloc[num_dci].format = format1A; dci_alloc[num_dci].firstCCE = 0; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); printf("Generating dlsch params for user %d\n",k); generate_eNB_dlsch_params_from_dci(0, @@ -1559,13 +1559,13 @@ int main(int argc, char **argv) &DLSCH_alloc_pdu_1[0], SI_RNTI, format1A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + eNB->UE_stats[0].DL_pmi_single); num_common_dci++; num_dci++; @@ -1578,11 +1578,11 @@ int main(int argc, char **argv) case 4: if (common_flag == 0) { - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 2) { + if (eNB->frame_parms.nb_antennas_tx == 2) { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI2_1_5MHz_2A_TDD_t; dci_length_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t); @@ -1649,7 +1649,7 @@ int main(int argc, char **argv) } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI2_1_5MHz_2A_FDD_t; dci_length_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t); @@ -1710,7 +1710,7 @@ int main(int argc, char **argv) break; } } - } else if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 4) { + } else if (eNB->frame_parms.nb_antennas_tx == 4) { } @@ -1719,7 +1719,7 @@ int main(int argc, char **argv) dci_alloc[num_dci].L = 1; dci_alloc[num_dci].rnti = n_rnti+k; dci_alloc[num_dci].format = format2; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); printf("Generating dlsch params for user %d\n",k); generate_eNB_dlsch_params_from_dci(0, @@ -1727,26 +1727,26 @@ int main(int argc, char **argv) &DLSCH_alloc_pdu_1[0], n_rnti+k, format2, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + eNB->UE_stats[0].DL_pmi_single); num_dci++; num_ue_spec_dci++; } else { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1760,7 +1760,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1774,7 +1774,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1786,7 +1786,7 @@ int main(int argc, char **argv) case 100: ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; @@ -1798,13 +1798,13 @@ int main(int argc, char **argv) break; } } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: dci_length = sizeof_DCI1A_1_5MHz_FDD_t; dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1817,7 +1817,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1830,7 +1830,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1843,7 +1843,7 @@ int main(int argc, char **argv) dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; @@ -1859,7 +1859,7 @@ int main(int argc, char **argv) dci_alloc[num_dci].rnti = SI_RNTI; dci_alloc[num_dci].format = format1A; dci_alloc[num_dci].firstCCE = 0; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); printf("Generating dlsch params for user %d\n",k); generate_eNB_dlsch_params_from_dci(0, @@ -1867,13 +1867,13 @@ int main(int argc, char **argv) &DLSCH_alloc_pdu_1[0], SI_RNTI, format1A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); + eNB->UE_stats[0].DL_pmi_single); num_common_dci++; num_dci++; @@ -1896,15 +1896,15 @@ int main(int argc, char **argv) &DLSCH_alloc_pdu2_1E[k], n_rnti+k, format1E_2A_M10PRB, - PHY_vars_eNB->dlsch_eNB[k], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, + eNB->dlsch[k], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI, - PHY_vars_eNB->eNB_UE_stats[k].DL_pmi_single); + eNB->UE_stats[k].DL_pmi_single); - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); num_ue_spec_dci++; num_dci++; @@ -1929,7 +1929,7 @@ int main(int argc, char **argv) if (n_frames==1) printf("num_pdcch_symbols %d, numCCE %d => ",num_pdcch_symbols,numCCE); - numCCE = get_nCCE(num_pdcch_symbols,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,subframe)); + numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe)); if (n_frames==1) printf("%d\n",numCCE); @@ -1952,10 +1952,10 @@ int main(int argc, char **argv) for (k=0; kdlsch_eNB[k][0]->harq_processes[0]->TBS/8; + input_buffer_length0 = eNB->dlsch[k][0]->harq_processes[0]->TBS/8; input_buffer0[k] = (unsigned char *)malloc(input_buffer_length0+4); memset(input_buffer0[k],0,input_buffer_length0+4); - input_buffer_length1 = PHY_vars_eNB->dlsch_eNB[k][1]->harq_processes[0]->TBS/8; + input_buffer_length1 = eNB->dlsch[k][1]->harq_processes[0]->TBS/8; input_buffer1[k] = (unsigned char *)malloc(input_buffer_length1+4); memset(input_buffer1[k],0,input_buffer_length1+4); @@ -1994,11 +1994,11 @@ int main(int argc, char **argv) } // this is for user 0 only - coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->nb_rb, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rb_alloc, - get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs), - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Nl, + coded_bits_per_codeword = get_G(&eNB->frame_parms, + eNB->dlsch[0][0]->harq_processes[0]->nb_rb, + eNB->dlsch[0][0]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs), + eNB->dlsch[0][0]->harq_processes[0]->Nl, num_pdcch_symbols, 0,subframe); @@ -2006,8 +2006,8 @@ int main(int argc, char **argv) printf("uncoded_ber_bit=%p\n",uncoded_ber_bit); snr_step = input_snr_step; - PHY_vars_UE->high_speed_flag = 1; - PHY_vars_UE->ch_est_alpha=0; + UE->high_speed_flag = 1; + UE->ch_est_alpha=0; for (ch_realization=0; ch_realizationframe_rx=0; + UE->frame_rx=0; errs[0]=0; errs[1]=0; errs[2]=0; @@ -2035,32 +2035,32 @@ int main(int argc, char **argv) round=0; avg_iter = 0; iter_trials=0; - reset_meas(&PHY_vars_eNB->phy_proc_tx); // total eNB tx - reset_meas(&PHY_vars_eNB->dlsch_scrambling_stats); - reset_meas(&PHY_vars_UE->dlsch_unscrambling_stats); - reset_meas(&PHY_vars_eNB->ofdm_mod_stats); - reset_meas(&PHY_vars_eNB->dlsch_modulation_stats); - reset_meas(&PHY_vars_eNB->dlsch_encoding_stats); - reset_meas(&PHY_vars_eNB->dlsch_interleaving_stats); - reset_meas(&PHY_vars_eNB->dlsch_rate_matching_stats); - reset_meas(&PHY_vars_eNB->dlsch_turbo_encoding_stats); + reset_meas(&eNB->phy_proc_tx); // total eNB tx + reset_meas(&eNB->dlsch_scrambling_stats); + reset_meas(&UE->dlsch_unscrambling_stats); + reset_meas(&eNB->ofdm_mod_stats); + reset_meas(&eNB->dlsch_modulation_stats); + reset_meas(&eNB->dlsch_encoding_stats); + reset_meas(&eNB->dlsch_interleaving_stats); + reset_meas(&eNB->dlsch_rate_matching_stats); + reset_meas(&eNB->dlsch_turbo_encoding_stats); - reset_meas(&PHY_vars_UE->phy_proc_rx); // total UE rx - reset_meas(&PHY_vars_UE->ofdm_demod_stats); - reset_meas(&PHY_vars_UE->dlsch_channel_estimation_stats); - reset_meas(&PHY_vars_UE->dlsch_freq_offset_estimation_stats); - reset_meas(&PHY_vars_UE->rx_dft_stats); - reset_meas(&PHY_vars_UE->dlsch_decoding_stats); - reset_meas(&PHY_vars_UE->dlsch_turbo_decoding_stats); - reset_meas(&PHY_vars_UE->dlsch_deinterleaving_stats); - reset_meas(&PHY_vars_UE->dlsch_rate_unmatching_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_init_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_alpha_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_beta_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_gamma_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_ext_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_intl1_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_intl2_stats); + reset_meas(&UE->phy_proc_rx); // total UE rx + reset_meas(&UE->ofdm_demod_stats); + reset_meas(&UE->dlsch_channel_estimation_stats); + reset_meas(&UE->dlsch_freq_offset_estimation_stats); + reset_meas(&UE->rx_dft_stats); + reset_meas(&UE->dlsch_decoding_stats); + reset_meas(&UE->dlsch_turbo_decoding_stats); + reset_meas(&UE->dlsch_deinterleaving_stats); + reset_meas(&UE->dlsch_rate_unmatching_stats); + reset_meas(&UE->dlsch_tc_init_stats); + reset_meas(&UE->dlsch_tc_alpha_stats); + reset_meas(&UE->dlsch_tc_beta_stats); + reset_meas(&UE->dlsch_tc_gamma_stats); + reset_meas(&UE->dlsch_tc_ext_stats); + reset_meas(&UE->dlsch_tc_intl1_stats); + reset_meas(&UE->dlsch_tc_intl2_stats); // initialization struct list time_vector_tx; initialize(&time_vector_tx); @@ -2088,9 +2088,9 @@ int main(int argc, char **argv) //if (trials%100==0) eNB2UE[0]->first_run = 1; - ret = PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations+1; + ret = UE->dlsch[0][0]->max_turbo_iterations+1; - while ((round < num_rounds) && (ret > PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations)) { + while ((round < num_rounds) && (ret > UE->dlsch[0][0]->max_turbo_iterations)) { // printf("Trial %d, round %d\n",trials,round); round_trials[round]++; @@ -2110,13 +2110,13 @@ int main(int argc, char **argv) PMI_FEEDBACK: // printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback); - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + memset(&eNB->common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); } if (input_fd==NULL) { - start_meas(&PHY_vars_eNB->phy_proc_tx); + start_meas(&eNB->phy_proc_tx); // Simulate HARQ procedures!!! if (common_flag == 0) { @@ -2124,14 +2124,14 @@ PMI_FEEDBACK: if (round == 0) { // First round TB0_active = 1; - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3; + eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3; - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { switch (transmission_mode) { case 1: case 2: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; @@ -2160,7 +2160,7 @@ PMI_FEEDBACK: break; case 3: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; @@ -2206,7 +2206,7 @@ PMI_FEEDBACK: switch (transmission_mode) { case 1: case 2: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; @@ -2235,7 +2235,7 @@ PMI_FEEDBACK: break; case 3: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; @@ -2280,15 +2280,15 @@ PMI_FEEDBACK: } } else { - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3; + eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3; - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { switch (transmission_mode) { case 1: case 2: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;; @@ -2317,7 +2317,7 @@ PMI_FEEDBACK: break; case 3: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: if (TB0_active==1) { ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; @@ -2395,7 +2395,7 @@ PMI_FEEDBACK: switch (transmission_mode) { case 1: case 2: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;; @@ -2424,7 +2424,7 @@ PMI_FEEDBACK: break; case 3: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: if (TB0_active==1) { ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; @@ -2507,8 +2507,8 @@ PMI_FEEDBACK: dci_alloc, 0, AMP, - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], + &eNB->frame_parms, + eNB->common_vars.txdataF[eNB_id], subframe); if (num_pdcch_symbols_2 > num_pdcch_symbols) { @@ -2518,115 +2518,115 @@ PMI_FEEDBACK: for (k=0; klte_frame_parms, - PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->nb_rb, - PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->rb_alloc, - get_Qm(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs), - PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Nl, + coded_bits_per_codeword = get_G(&eNB->frame_parms, + eNB->dlsch[k][cw]->harq_processes[0]->nb_rb, + eNB->dlsch[k][cw]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[k][cw]->harq_processes[0]->mcs), + eNB->dlsch[k][cw]->harq_processes[0]->Nl, num_pdcch_symbols, 0,subframe); #ifdef TBS_FIX // This is for MESH operation!!! - tbs = (double)3*TBStable[get_I_TBS(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs)][PHY_vars_eNB->dlsch_eNB[k][cw]->nb_rb-1]/4; + tbs = (double)3*TBStable[get_I_TBS(eNB->dlsch[k][cw]->harq_processes[0]->mcs)][eNB->dlsch[k][cw]->nb_rb-1]/4; #else - tbs = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->TBS; + tbs = eNB->dlsch[k][cw]->harq_processes[0]->TBS; #endif rate = (double)tbs/(double)coded_bits_per_codeword; if ((SNR==snr0) && (trials==0) && (round==0)) printf("User %d, cw %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n", - k,cw,rate,rate*get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs), + k,cw,rate,rate*get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs), coded_bits_per_codeword, tbs, - get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs), + get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs), num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->round); + eNB->dlsch[0][0]->harq_processes[0]->round); // use the PMI from previous trial if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL); - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL); + eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); + UE->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); if (n_users>1) - PHY_vars_eNB->dlsch_eNB[1][0]->harq_processes[0]->pmi_alloc = (PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); + eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); /* if ((trials<10) && (round==0)) { - printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc),pmi_feedback); + printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(eNB->dlsch[0][0]->pmi_alloc),pmi_feedback); if (transmission_mode ==5) - printf("tx PMI UE1 %x\n",pmi2hex_2Ar1(PHY_vars_eNB->dlsch_eNB[1][0]->pmi_alloc)); + printf("tx PMI UE1 %x\n",pmi2hex_2Ar1(eNB->dlsch[1][0]->pmi_alloc)); } */ } - start_meas(&PHY_vars_eNB->dlsch_encoding_stats); + start_meas(&eNB->dlsch_encoding_stats); if (dlsch_encoding(((cw==0) ? input_buffer0[k] : input_buffer1[k]), - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[k][cw], + eNB->dlsch[k][cw], 0,subframe, - &PHY_vars_eNB->dlsch_rate_matching_stats, - &PHY_vars_eNB->dlsch_turbo_encoding_stats, - &PHY_vars_eNB->dlsch_interleaving_stats + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats )<0) exit(-1); /* if (transmission_mode == 3) { if (dlsch_encoding(input_buffer1[k], - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[k][1], + eNB->dlsch[k][1], 0,subframe, - &PHY_vars_eNB->dlsch_rate_matching_stats, - &PHY_vars_eNB->dlsch_turbo_encoding_stats, - &PHY_vars_eNB->dlsch_interleaving_stats + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats )<0) exit(-1); } */ - stop_meas(&PHY_vars_eNB->dlsch_encoding_stats); + stop_meas(&eNB->dlsch_encoding_stats); - PHY_vars_eNB->dlsch_eNB[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI; - start_meas(&PHY_vars_eNB->dlsch_scrambling_stats); - dlsch_scrambling(&PHY_vars_eNB->lte_frame_parms, + eNB->dlsch[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI; + start_meas(&eNB->dlsch_scrambling_stats); + dlsch_scrambling(&eNB->frame_parms, 0, - PHY_vars_eNB->dlsch_eNB[k][cw], + eNB->dlsch[k][cw], coded_bits_per_codeword, 0, subframe<<1); - stop_meas(&PHY_vars_eNB->dlsch_scrambling_stats); + stop_meas(&eNB->dlsch_scrambling_stats); if (n_frames==1) { - for (s=0; sdlsch_eNB[k][cw]->harq_processes[0]->C; s++) { - if (sdlsch_eNB[k][cw]->harq_processes[0]->Cminus) - Kr = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Kminus; + for (s=0; sdlsch[k][cw]->harq_processes[0]->C; s++) { + if (sdlsch[k][cw]->harq_processes[0]->Cminus) + Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kminus; else - Kr = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Kplus; + Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kplus; Kr_bytes = Kr>>3; for (i=0; idlsch_eNB[k][cw]->harq_processes[0]->c[s][i]); + printf("%d : (%x)\n",i,eNB->dlsch[k][cw]->harq_processes[0]->c[s][i]); } } } - start_meas(&PHY_vars_eNB->dlsch_modulation_stats); + start_meas(&eNB->dlsch_modulation_stats); - re_allocated = dlsch_modulation(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], + re_allocated = dlsch_modulation(eNB->common_vars.txdataF[eNB_id], AMP, subframe, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[k][0], - (transmission_mode==3)||(transmission_mode==4) ? PHY_vars_eNB->dlsch_eNB[k][1] : NULL); + eNB->dlsch[k][0], + (transmission_mode==3)||(transmission_mode==4) ? eNB->dlsch[k][1] : NULL); /* avoid gcc warnings */ (void)re_allocated; - stop_meas(&PHY_vars_eNB->dlsch_modulation_stats); + stop_meas(&eNB->dlsch_modulation_stats); /* if (trials==0 && round==0) printf("RE count %d\n",re_allocated); @@ -2634,54 +2634,54 @@ PMI_FEEDBACK: } //n_users - generate_pilots(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], + generate_pilots(eNB, + eNB->common_vars.txdataF[eNB_id], AMP, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - start_meas(&PHY_vars_eNB->ofdm_mod_stats); + start_meas(&eNB->ofdm_mod_stats); - do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id], + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], (subframe*2), - &PHY_vars_eNB->lte_frame_parms); + &eNB->frame_parms); - do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id], + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], (subframe*2)+1, - &PHY_vars_eNB->lte_frame_parms); + &eNB->frame_parms); - stop_meas(&PHY_vars_eNB->ofdm_mod_stats); - stop_meas(&PHY_vars_eNB->phy_proc_tx); + stop_meas(&eNB->ofdm_mod_stats); + stop_meas(&eNB->phy_proc_tx); - do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id], + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], (subframe*2)+2, - &PHY_vars_eNB->lte_frame_parms); + &eNB->frame_parms); if (n_frames==1) { - write_output("txsigF0.m","txsF0", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][0][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - write_output("txsigF1.m","txsF1", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); } tx_lev = 0; - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - tx_lev += signal_energy(&PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa] - [subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], - PHY_vars_eNB->lte_frame_parms.samples_per_tti); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa] + [subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.samples_per_tti); } tx_lev_dB = (unsigned int) dB_fixed(tx_lev); if (n_frames==1) { printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); - write_output("txsig0.m","txs0", &PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][0][subframe* PHY_vars_eNB->lte_frame_parms.samples_per_tti], + write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe* eNB->frame_parms.samples_per_tti], - PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); + eNB->frame_parms.samples_per_tti,1,1); } } @@ -2710,20 +2710,20 @@ PMI_FEEDBACK: } */ - // printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,awgn_flag); + // printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,eNB->frame_parms.nb_antennas_tx,awgn_flag); for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (awgn_flag == 0) { - s_re[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - s_im[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]); + s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); } else { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { if (aa==0) { - r_re[aarx][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)]); - r_im[aarx][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]); + r_re[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]); + r_im[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); } else { - r_re[aarx][i] += ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)]); - r_im[aarx][i] += ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]); + r_re[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]); + r_im[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); } } @@ -2744,12 +2744,12 @@ PMI_FEEDBACK: random_channel(eNB2UE[3],0); } - if (PHY_vars_UE->perfect_ce==1) { + if (UE->perfect_ce==1) { // fill in perfect channel estimates - freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); + freq_channel(eNB2UE[round],UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); /* write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8); - write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1,1,8); + write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*UE->frame_parms.N_RB_DL + 1,1,8); */ } } @@ -2813,24 +2813,24 @@ PMI_FEEDBACK: //AWGN // This is the SNR on the PDSCH for OFDM symbols without pilots -> rho_A - sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(NB_RB*12)) - SNR - get_pa_dB(PHY_vars_eNB->pdsch_config_dedicated); + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(NB_RB*12)) - SNR - get_pa_dB(eNB->pdsch_config_dedicated); sigma2 = pow(10,sigma2_dB/10); if (n_frames==1) - printf("Sigma2 %f (sigma2_dB %f,%f,%f )\n",sigma2,sigma2_dB,10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(NB_RB*12)),get_pa_dB(PHY_vars_eNB->pdsch_config_dedicated)); + printf("Sigma2 %f (sigma2_dB %f,%f,%f )\n",sigma2,sigma2_dB,10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(NB_RB*12)),get_pa_dB(eNB->pdsch_config_dedicated)); for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i] = + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] = (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i+1] = + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] = (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); } } - // lte_sync_time_init(PHY_vars_eNB->lte_frame_parms,lte_ue_common_vars); - // lte_sync_time(lte_ue_common_vars->rxdata, PHY_vars_eNB->lte_frame_parms); + // lte_sync_time_init(eNB->frame_parms,common_vars); + // lte_sync_time(common_vars->rxdata, eNB->frame_parms); // lte_sync_time_free(); /* @@ -2850,13 +2850,13 @@ PMI_FEEDBACK: */ if (n_frames==1) { - printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); - printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); + printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); + printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); printf("rx_level Null symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); printf("rx_level data symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); } - if (PHY_vars_eNB->lte_frame_parms.Ncp == 0) { // normal prefix + if (eNB->frame_parms.Ncp == 0) { // normal prefix pilot1 = 4; pilot2 = 7; pilot3 = 11; @@ -2866,7 +2866,7 @@ PMI_FEEDBACK: pilot3 = 9; } - start_meas(&PHY_vars_UE->phy_proc_rx); + start_meas(&UE->phy_proc_rx); // Inner receiver scheduling for 3 slots for (Ns=(2*subframe); Ns<((2*subframe)+3); Ns++) { @@ -2887,24 +2887,24 @@ PMI_FEEDBACK: */ - start_meas(&PHY_vars_UE->ofdm_demod_stats); - slot_fep(PHY_vars_UE, + start_meas(&UE->ofdm_demod_stats); + slot_fep(UE, l, Ns%20, 0, 0, 0); - stop_meas(&PHY_vars_UE->ofdm_demod_stats); + stop_meas(&UE->ofdm_demod_stats); - if (PHY_vars_UE->perfect_ce==1) { + if (UE->perfect_ce==1) { if (awgn_flag==0) { for(k=0; knb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } } @@ -2914,8 +2914,8 @@ PMI_FEEDBACK: for(aa=0; aanb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; + ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; } } } @@ -2924,31 +2924,31 @@ PMI_FEEDBACK: if ((Ns==((2*subframe))) && (l==0)) { - lte_ue_measurements(PHY_vars_UE, - subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti, + lte_ue_measurements(UE, + subframe*UE->frame_parms.samples_per_tti, 1, 0); /* debug_msg("RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n", - PHY_vars_UE->PHY_measurements.rx_rssi_dBm[0] - ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx==2) ? 3 : 0), - PHY_vars_UE->PHY_measurements.wideband_cqi_dB[0][0], - PHY_vars_UE->PHY_measurements.wideband_cqi_dB[0][1], - PHY_vars_UE->PHY_measurements.wideband_cqi[0][0], - PHY_vars_UE->PHY_measurements.wideband_cqi[0][1], - PHY_vars_UE->PHY_measurements.rx_power_avg_dB[0], - PHY_vars_UE->PHY_measurements.rx_power_avg[0], - PHY_vars_UE->rx_total_gain_dB); + UE->measurements.rx_rssi_dBm[0] - ((UE->frame_parms.nb_antennas_rx==2) ? 3 : 0), + UE->measurements.wideband_cqi_dB[0][0], + UE->measurements.wideband_cqi_dB[0][1], + UE->measurements.wideband_cqi[0][0], + UE->measurements.wideband_cqi[0][1], + UE->measurements.rx_power_avg_dB[0], + UE->measurements.rx_power_avg[0], + UE->rx_total_gain_dB); debug_msg("N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n", - PHY_vars_UE->PHY_measurements.n0_power_tot_dBm, - PHY_vars_UE->PHY_measurements.n0_power_dB[0], - PHY_vars_UE->PHY_measurements.n0_power_dB[1], - PHY_vars_UE->PHY_measurements.n0_power[0], - PHY_vars_UE->PHY_measurements.n0_power[1], - PHY_vars_UE->PHY_measurements.n0_power_avg_dB, - PHY_vars_UE->PHY_measurements.n0_power_avg); + UE->measurements.n0_power_tot_dBm, + UE->measurements.n0_power_dB[0], + UE->measurements.n0_power_dB[1], + UE->measurements.n0_power[0], + UE->measurements.n0_power[1], + UE->measurements.n0_power_avg_dB, + UE->measurements.n0_power_avg); debug_msg("Wideband CQI tot %d dB, wideband cqi avg %d dB\n", - PHY_vars_UE->PHY_measurements.wideband_cqi_tot[0], - PHY_vars_UE->PHY_measurements.wideband_cqi_avg[0]); + UE->measurements.wideband_cqi_tot[0], + UE->measurements.wideband_cqi_avg[0]); */ if (transmission_mode==5 || transmission_mode==6) { @@ -2965,21 +2965,21 @@ PMI_FEEDBACK: if ((Ns==(2*subframe)) && (l==pilot1)) {// process symbols 0,1,2 if (dci_flag == 1) { - PHY_vars_UE->UE_mode[0] = PUSCH; - start_meas(&PHY_vars_UE->dlsch_rx_pdcch_stats); - rx_pdcch(&PHY_vars_UE->lte_ue_common_vars, - PHY_vars_UE->lte_ue_pdcch_vars, - &PHY_vars_UE->lte_frame_parms, + UE->UE_mode[0] = PUSCH; + start_meas(&UE->dlsch_rx_pdcch_stats); + rx_pdcch(&UE->common_vars, + UE->pdcch_vars, + &UE->frame_parms, subframe, 0, - (PHY_vars_UE->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - PHY_vars_UE->high_speed_flag, + (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + UE->high_speed_flag, 0); - stop_meas(&PHY_vars_UE->dlsch_rx_pdcch_stats); + stop_meas(&UE->dlsch_rx_pdcch_stats); // overwrite number of pdcch symbols - PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; + UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; - dci_cnt = dci_decoding_procedure(PHY_vars_UE, + dci_cnt = dci_decoding_procedure(UE, dci_alloc_rx,1, eNB_id, subframe); @@ -3005,7 +3005,7 @@ PMI_FEEDBACK: for (i=0; idlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->first_tx=1; + if (round == 0) UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->first_tx=1; if ((dci_alloc_rx[i].rnti == n_rnti) && (generate_ue_dlsch_params_from_dci(0, @@ -3013,26 +3013,26 @@ PMI_FEEDBACK: dci_alloc_rx[i].dci_pdu, dci_alloc_rx[i].rnti, dci_alloc_rx[i].format, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, + UE->dlsch[0], + &UE->frame_parms, + UE->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI)==0)) { - //dump_dci(&PHY_vars_UE->lte_frame_parms,&dci_alloc_rx[i]); - coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms, - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->nb_rb, - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->rb_alloc_even, - get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs), - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->Nl, - PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, + //dump_dci(&UE->frame_parms,&dci_alloc_rx[i]); + coded_bits_per_codeword = get_G(&eNB->frame_parms, + UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb, + UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even, + get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), + UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl, + UE->pdcch_vars[0]->num_pdcch_symbols, 0,subframe); /* - rate = (double)dlsch_tbs25[get_I_TBS(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs)][PHY_vars_UE->dlsch_ue[0][0]->nb_rb-1]/(coded_bits_per_codeword); - rate*=get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs); + rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs)][UE->dlsch[0][0]->nb_rb-1]/(coded_bits_per_codeword); + rate*=get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs); */ - printf("num_pdcch_symbols %d, G %d, TBS %d\n",PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword, - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->TBS); + printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword, + UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->TBS); dlsch_active = 1; } else { @@ -3057,10 +3057,10 @@ PMI_FEEDBACK: } // if dci_flag==1 else { //dci_flag == 0 - PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti; - PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; + UE->pdcch_vars[0]->crnti = n_rnti; + UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; - if (round == 0) PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx=1; + if (round == 0) UE->dlsch[0][0]->harq_processes[0]->first_tx=1; switch (transmission_mode) { case 1: @@ -3070,28 +3070,28 @@ PMI_FEEDBACK: &DLSCH_alloc_pdu_1[0], (common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? format1 : format1A, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, + UE->dlsch[0], + &UE->frame_parms, + UE->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI); break; case 3: - // printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx); + // printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx); generate_ue_dlsch_params_from_dci(0, subframe, &DLSCH_alloc_pdu_1[0], (common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? format2A : format1A, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, + UE->dlsch[0], + &UE->frame_parms, + UE->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI); - // printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx); + // printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx); break; case 4: @@ -3100,9 +3100,9 @@ PMI_FEEDBACK: &DLSCH_alloc_pdu_1[0], (common_flag==0)? C_RNTI : SI_RNTI, (common_flag==0)? format2 : format1A, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, + UE->dlsch[0], + &UE->frame_parms, + UE->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI); @@ -3115,9 +3115,9 @@ PMI_FEEDBACK: &DLSCH_alloc_pdu2_1E[0], C_RNTI, format1E_2A_M10PRB, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, + UE->dlsch[0], + &UE->frame_parms, + UE->pdsch_config_dedicated, SI_RNTI, 0, P_RNTI); @@ -3133,45 +3133,45 @@ PMI_FEEDBACK: if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix) if ((transmission_mode == 5) && - (PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { + (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->dl_power_off==0) && + (UE->use_ia_receiver ==1)) { dual_stream_UE = 1; } else { dual_stream_UE = 0; } - start_meas(&PHY_vars_UE->dlsch_llr_stats); + start_meas(&UE->dlsch_llr_stats); - for (m=PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols; + for (m=UE->pdcch_vars[0]->num_pdcch_symbols; mlte_ue_pdcch_vars[0]->num_pdcch_symbols)?1:0, + (m==UE->pdcch_vars[0]->num_pdcch_symbols)?1:0, dual_stream_UE, i_mod, - PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid)==-1) { + UE->dlsch[0][0]->current_harq_pid)==-1) { dlsch_active = 0; break; } } - stop_meas(&PHY_vars_UE->dlsch_llr_stats); + stop_meas(&UE->dlsch_llr_stats); } if ((Ns==(1+(2*subframe))) && (l==pilot1)) { // process symbols (6 Extended Prefix),7,8,9 - start_meas(&PHY_vars_UE->dlsch_llr_stats); + start_meas(&UE->dlsch_llr_stats); for (m=pilot2; mdlsch_ue[0][0]->current_harq_pid)==-1) { + UE->dlsch[0][0]->current_harq_pid)==-1) { dlsch_active=0; break; } } - stop_meas(&PHY_vars_UE->dlsch_llr_stats); + stop_meas(&UE->dlsch_llr_stats); } if ((Ns==(2+(2*subframe))) && (l==0)) { // process symbols 10,11,(12,13 Normal Prefix) do deinterleaving for TTI - start_meas(&PHY_vars_UE->dlsch_llr_stats); + start_meas(&UE->dlsch_llr_stats); for (m=pilot3; - mlte_frame_parms.symbols_per_tti; + mframe_parms.symbols_per_tti; m++) { - if (rx_pdsch(PHY_vars_UE, + if (rx_pdsch(UE, PDSCH, eNB_id, eNB_id_i, @@ -3204,61 +3204,61 @@ PMI_FEEDBACK: 0, dual_stream_UE, i_mod, - PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid)==-1) { + UE->dlsch[0][0]->current_harq_pid)==-1) { dlsch_active=0; break; } } - stop_meas(&PHY_vars_UE->dlsch_llr_stats); + stop_meas(&UE->dlsch_llr_stats); } if (test_perf ==0 ) { if ((n_frames==1) && (Ns==(2+(2*subframe))) && (l==0)) { write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - write_output("ch1.m","ch1",eNB2UE[0]->ch[PHY_vars_eNB->lte_frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8); + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("ch1.m","ch1",eNB2UE[0]->ch[eNB->frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8); //common vars - write_output("rxsig0.m","rxs0", &PHY_vars_UE->lte_ue_common_vars.rxdata[0][0],10*PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); + write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) { - write_output("rxsig1.m","rxs1", PHY_vars_UE->lte_ue_common_vars.rxdata[1],PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1); - write_output("rxsigF1.m","rxsF1", PHY_vars_UE->lte_ue_common_vars.rxdataF[1],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + if (UE->frame_parms.nb_antennas_rx>1) { + write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); + write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); } write_output("dlsch00_r0.m","dl00_r0", - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) + if (UE->frame_parms.nb_antennas_rx>1) write_output("dlsch01_r0.m","dl01_r0", - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][1][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) + if (eNB->frame_parms.nb_antennas_tx>1) write_output("dlsch10_r0.m","dl10_r0", - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][2][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - if ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) && (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)) + if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) write_output("dlsch11_r0.m","dl11_r0", - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][3][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1); + &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); //pdsch_vars - dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword,round); - //dump_dlsch2(PHY_vars_UE,eNB_id_i,coded_bits_per_codeword); - write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); + dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round); + //dump_dlsch2(UE,eNB_id_i,coded_bits_per_codeword); + write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); //pdcch_vars - write_output("pdcchF0_ext.m","pdcchF_ext", PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); + write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); + write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); - write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->llr,2400,1,4); + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4); } } @@ -3271,30 +3271,30 @@ PMI_FEEDBACK: if(abstx) { if (trials==0 && round==0 && transmission_mode>=5) { for (iii=0; iiilte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii])); - fprintf(csv_fd,"%x,%x,",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii])); - printf("%x ",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii])); + //fprintf(csv_fd, "%d, %d", (UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii])); + fprintf(csv_fd,"%x,%x,",(UE->pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); + printf("%x ",(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); } } } for (int cw=Kmimo-1; cw>=0; cw--) { - PHY_vars_UE->dlsch_ue[0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; - coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->nb_rb, - PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->rb_alloc, - get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->mcs), - PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->Nl, + UE->dlsch[0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; + coded_bits_per_codeword = get_G(&eNB->frame_parms, + eNB->dlsch[0][cw]->harq_processes[0]->nb_rb, + eNB->dlsch[0][cw]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[0][cw]->harq_processes[0]->mcs), + eNB->dlsch[0][cw]->harq_processes[0]->Nl, num_pdcch_symbols, 0,subframe); - PHY_vars_UE->dlsch_ue[0][cw]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid]->G = coded_bits_per_codeword; + UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid]->G = coded_bits_per_codeword; // calculate uncoded BLER uncoded_ber=0; for (i=0;idlsch_eNB[0][0]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[0][i]<0)) { + if (eNB->dlsch[0][0]->harq_processes[0]->e[i] != (UE->pdsch_vars[0]->llr[0][i]<0)) { uncoded_ber_bit[i] = 1; uncoded_ber++; } @@ -3308,29 +3308,29 @@ PMI_FEEDBACK: write_output("uncoded_ber_bit.m","uncoded_ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); - start_meas(&PHY_vars_UE->dlsch_unscrambling_stats); - dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms, + start_meas(&UE->dlsch_unscrambling_stats); + dlsch_unscrambling(&UE->frame_parms, 0, - PHY_vars_UE->dlsch_ue[0][cw], + UE->dlsch[0][cw], coded_bits_per_codeword, - PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw], + UE->pdsch_vars[eNB_id]->llr[cw], 0, subframe<<1); - stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats); + stop_meas(&UE->dlsch_unscrambling_stats); - start_meas(&PHY_vars_UE->dlsch_decoding_stats); - ret = dlsch_decoding(PHY_vars_UE, - PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->dlsch_ue[0][cw], - PHY_vars_UE->dlsch_ue[0][cw]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid], + start_meas(&UE->dlsch_decoding_stats); + ret = dlsch_decoding(UE, + UE->pdsch_vars[eNB_id]->llr[cw], + &UE->frame_parms, + UE->dlsch[0][cw], + UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid], subframe, - PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid, + UE->dlsch[0][cw]->current_harq_pid, 1,llr8_flag); - stop_meas(&PHY_vars_UE->dlsch_decoding_stats); + stop_meas(&UE->dlsch_decoding_stats); if (cw==1) { - if (ret <= PHY_vars_UE->dlsch_ue[0][cw]->max_turbo_iterations) { + if (ret <= UE->dlsch[0][cw]->max_turbo_iterations) { } else { errs2[round]++; } @@ -3338,10 +3338,10 @@ PMI_FEEDBACK: } - stop_meas(&PHY_vars_UE->phy_proc_rx); + stop_meas(&UE->phy_proc_rx); - if (ret <= PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations) { + if (ret <= UE->dlsch[0][0]->max_turbo_iterations) { avg_iter += ret; iter_trials++; @@ -3349,15 +3349,15 @@ PMI_FEEDBACK: if (n_frames==1) printf("No DLSCH errors found (round %d),uncoded ber %f\n",round,uncoded_ber); - PHY_vars_UE->total_TBS[eNB_id] = PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS; + UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->TBS; TB0_active = 0; - if (PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC + if (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC /* - for (round = 0 ; round < PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->round ; round++) { + for (round = 0 ; round < UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->round ; round++) { // re-encoding of first stream - dlsch0_ue_harq = PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]; - dlsch0_eNB_harq = PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]; + dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; + dlsch0_eNB_harq = UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; dlsch0_eNB_harq->mimo_mode = LARGE_CDD; dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0]; dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb; @@ -3369,17 +3369,17 @@ PMI_FEEDBACK: dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off; dlsch0_eNB_harq->status = dlsch0_ue_harq->status; - PHY_vars_UE->dlsch_eNB[eNB_id]->active = PHY_vars_UE->dlsch_ue[eNB_id][0]->active; - PHY_vars_UE->dlsch_eNB[eNB_id]->rnti = PHY_vars_UE->dlsch_ue[eNB_id][0]->rnti; + UE->dlsch[eNB_id]->active = UE->dlsch[eNB_id][0]->active; + UE->dlsch[eNB_id]->rnti = UE->dlsch[eNB_id][0]->rnti; - dlsch_encoding(PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b, - &PHY_vars_UE->lte_frame_parms, + dlsch_encoding(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->b, + &UE->frame_parms, num_pdcch_symbols, - PHY_vars_UE->dlsch_eNB[0], + UE->dlsch[0], 0,subframe, - &PHY_vars_UE->dlsch_rate_matching_stats, - &PHY_vars_UE->dlsch_turbo_encoding_stats, - &PHY_vars_UE->dlsch_interleaving_stats + &UE->dlsch_rate_matching_stats, + &UE->dlsch_turbo_encoding_stats, + &UE->dlsch_interleaving_stats ); //scrambling @@ -3402,73 +3402,73 @@ PMI_FEEDBACK: //if ((n_frames==1) || (SNR>=30)) { printf("DLSCH errors found (round %d), uncoded ber %f\n",round,uncoded_ber); - for (s=0; sdlsch_ue[0][0]->harq_processes[0]->C; s++) { - if (sdlsch_ue[0][0]->harq_processes[0]->Cminus) - Kr = PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kminus; + for (s=0; sdlsch[0][0]->harq_processes[0]->C; s++) { + if (sdlsch[0][0]->harq_processes[0]->Cminus) + Kr = UE->dlsch[0][0]->harq_processes[0]->Kminus; else - Kr = PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kplus; + Kr = UE->dlsch[0][0]->harq_processes[0]->Kplus; Kr_bytes = Kr>>3; printf("Decoded_output (Segment %d):\n",s); for (i=0; idlsch_ue[0][0]->harq_processes[0]->c[s][i],PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->c[s][i]); + printf("%d : %x (%x)\n",i,UE->dlsch[0][0]->harq_processes[0]->c[s][i],UE->dlsch[0][0]->harq_processes[0]->c[s][i]^eNB->dlsch[0][0]->harq_processes[0]->c[s][i]); } sprintf(fname,"rxsig0_r%d.m",round); sprintf(vname,"rxs0_r%d",round); - write_output(fname,vname, &PHY_vars_UE->lte_ue_common_vars.rxdata[0][0],10*PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1); + write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); sprintf(fname,"rxsigF0_r%d.m",round); sprintf(vname,"rxs0F_r%d",round); - write_output(fname,vname, &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],2*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,2,1); + write_output(fname,vname, &UE->common_vars.rxdataF[0][0],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) { + if (UE->frame_parms.nb_antennas_rx>1) { sprintf(fname,"rxsig1_r%d.m",round); sprintf(vname,"rxs1_r%d.m",round); - write_output(fname,vname, PHY_vars_UE->lte_ue_common_vars.rxdata[1],PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1); + write_output(fname,vname, UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); sprintf(fname,"rxsig1F_r%d.m",round); sprintf(vname,"rxs1F_r%d.m",round); - write_output(fname,vname, PHY_vars_UE->lte_ue_common_vars.rxdataF[1],2*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,2,1); + write_output(fname,vname, UE->common_vars.rxdataF[1],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); } sprintf(fname,"dlsch00_r%d.m",round); sprintf(vname,"dl00_r%d",round); write_output(fname,vname, - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) { + if (UE->frame_parms.nb_antennas_rx>1) { sprintf(fname,"dlsch01_r%d.m",round); sprintf(vname,"dl01_r%d",round); write_output(fname,vname, - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][1][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1); + &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) { + if (eNB->frame_parms.nb_antennas_tx>1) { sprintf(fname,"dlsch10_r%d.m",round); sprintf(vname,"dl10_r%d",round); write_output(fname,vname, - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][2][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1); + &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } - if ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) && (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)) { + if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) { sprintf(fname,"dlsch11_r%d.m",round); sprintf(vname,"dl11_r%d",round); write_output(fname,vname, - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][3][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1); + &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } //pdsch_vars - dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword,round); + dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round); /* - write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); + write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); - write_output("dlsch_eNB_w.m","w",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); - write_output("dlsch_UE_w.m","w",PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); + write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); + write_output("dlsch_w.m","w",UE->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); */ if (round == 3) exit(-1); @@ -3477,12 +3477,12 @@ PMI_FEEDBACK: // printf("round %d errors %d/%d\n",round,errs[round],trials); round++; - // PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round++; + // UE->dlsch[0][0]->harq_processes[0]->round++; } if (xforms==1) { phy_scope_UE(form_ue, - PHY_vars_UE, + UE, eNB_id, 0,// UE_id subframe); @@ -3498,29 +3498,29 @@ PMI_FEEDBACK: //len = chbch_stats_read(stats_buffer,NULL,0,4096); //printf("%s\n\n",stats_buffer); - if (PHY_vars_UE->frame_rx % 10 == 0) { - PHY_vars_UE->bitrate[eNB_id] = (PHY_vars_UE->total_TBS[eNB_id] - PHY_vars_UE->total_TBS_last[eNB_id])*10; - LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",PHY_vars_UE->Mod_id,PHY_vars_UE->total_TBS[eNB_id],PHY_vars_UE->total_TBS_last[eNB_id], - PHY_vars_UE->bitrate[eNB_id]/1000); - PHY_vars_UE->total_TBS_last[eNB_id] = PHY_vars_UE->total_TBS[eNB_id]; + if (UE->frame_rx % 10 == 0) { + UE->bitrate[eNB_id] = (UE->total_TBS[eNB_id] - UE->total_TBS_last[eNB_id])*10; + LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",UE->Mod_id,UE->total_TBS[eNB_id],UE->total_TBS_last[eNB_id], + UE->bitrate[eNB_id]/1000); + UE->total_TBS_last[eNB_id] = UE->total_TBS[eNB_id]; } - PHY_vars_UE->frame_rx++; + UE->frame_rx++; /* calculate the total processing time for each packet, * get the max, min, and number of packets that exceed t>2000us */ - double t_tx = (double)PHY_vars_eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; - double t_tx_ifft = (double)PHY_vars_eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; - double t_tx_mod = (double)PHY_vars_eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; - double t_tx_enc = (double)PHY_vars_eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx = (double)eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; + double t_tx_ifft = (double)eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_mod = (double)eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx = (double)PHY_vars_UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; - double t_rx_fft = (double)PHY_vars_UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx_demod = (double)PHY_vars_UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx_dec = (double)PHY_vars_UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx = (double)UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; + double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; if (t_tx > t_tx_max) t_tx_max = t_tx; @@ -3644,7 +3644,7 @@ PMI_FEEDBACK: printf("\n**********************SNR = %f dB (tx_lev %f, sigma2_dB %f)**************************\n", SNR, - (double)tx_lev_dB+10*log10(PHY_vars_UE->lte_frame_parms.ofdm_symbol_size/(NB_RB*12)), + (double)tx_lev_dB+10*log10(UE->frame_parms.ofdm_symbol_size/(NB_RB*12)), sigma2_dB); printf("Errors (%d(%d)/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e), dci_errors %d/%d, Pe = %e => effective rate %f (%2.1f%%,%f, %f), normalized delay %f (%f)\n", @@ -3667,119 +3667,119 @@ PMI_FEEDBACK: rate*effective_rate, 100*effective_rate, rate, - rate*get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs), + rate*get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); if (print_perf==1) { printf("eNB TX function statistics (per 1ms subframe)\n\n"); - std_phy_proc_tx = sqrt((double)PHY_vars_eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->phy_proc_tx.trials - pow((double)PHY_vars_eNB->phy_proc_tx.diff/PHY_vars_eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc tx :%f us (%d trials)\n",(double)PHY_vars_eNB->phy_proc_tx.diff/PHY_vars_eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->phy_proc_tx.trials); + std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials); printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped); - std_phy_proc_tx_ifft = sqrt((double)PHY_vars_eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->ofdm_mod_stats.trials - pow((double)PHY_vars_eNB->ofdm_mod_stats.diff/PHY_vars_eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); - printf("OFDM_mod time :%f us (%d trials)\n",(double)PHY_vars_eNB->ofdm_mod_stats.diff/PHY_vars_eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ofdm_mod_stats.trials); + std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); + printf("OFDM_mod time :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); - std_phy_proc_tx_mod = sqrt((double)PHY_vars_eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->dlsch_modulation_stats.trials - pow((double)PHY_vars_eNB->dlsch_modulation_stats.diff/PHY_vars_eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); - printf("DLSCH modulation time :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_modulation_stats.diff/PHY_vars_eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->dlsch_modulation_stats.trials); + std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH modulation time :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_modulation_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3); - printf("DLSCH scrambling time :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_scrambling_stats.diff/PHY_vars_eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->dlsch_scrambling_stats.trials); - std_phy_proc_tx_enc = sqrt((double)PHY_vars_eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->dlsch_encoding_stats.trials - pow((double)PHY_vars_eNB->dlsch_encoding_stats.diff/PHY_vars_eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); - printf("DLSCH encoding time :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_encoding_stats.diff/PHY_vars_eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->dlsch_modulation_stats.trials); + printf("DLSCH scrambling time :%f us (%d trials)\n",(double)eNB->dlsch_scrambling_stats.diff/eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_scrambling_stats.trials); + std_phy_proc_tx_enc = sqrt((double)eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->dlsch_encoding_stats.trials - pow((double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH encoding time :%f us (%d trials)\n",(double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_modulation_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3); printf("|__ DLSCH turbo encoding time :%f us (%d trials)\n", - ((double)PHY_vars_eNB->dlsch_turbo_encoding_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double) - PHY_vars_eNB->dlsch_turbo_encoding_stats.diff/PHY_vars_eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_turbo_encoding_stats.trials); + ((double)eNB->dlsch_turbo_encoding_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_turbo_encoding_stats.diff/eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_turbo_encoding_stats.trials); printf("|__ DLSCH rate-matching time :%f us (%d trials)\n", - ((double)PHY_vars_eNB->dlsch_rate_matching_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double) - PHY_vars_eNB->dlsch_rate_matching_stats.diff/PHY_vars_eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_rate_matching_stats.trials); + ((double)eNB->dlsch_rate_matching_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_rate_matching_stats.diff/eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_rate_matching_stats.trials); printf("|__ DLSCH sub-block interleaving time :%f us (%d trials)\n", - ((double)PHY_vars_eNB->dlsch_interleaving_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double) - PHY_vars_eNB->dlsch_interleaving_stats.diff/PHY_vars_eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_interleaving_stats.trials); + ((double)eNB->dlsch_interleaving_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials); printf("\n\nUE RX function statistics (per 1ms subframe)\n\n"); - std_phy_proc_rx = sqrt((double)PHY_vars_UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->phy_proc_rx.trials - pow((double)PHY_vars_UE->phy_proc_rx.diff/PHY_vars_UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc rx :%f us (%d trials)\n",(double)PHY_vars_UE->phy_proc_rx.diff/PHY_vars_UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->phy_proc_rx.trials*2/3); + std_phy_proc_rx = sqrt((double)UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->phy_proc_rx.trials - pow((double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0, + UE->phy_proc_rx.trials*2/3); printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, rx_q1, rx_q3, n_rx_dropped); - std_phy_proc_rx_fft = sqrt((double)PHY_vars_UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->ofdm_demod_stats.trials - pow((double)PHY_vars_UE->ofdm_demod_stats.diff/PHY_vars_UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); - printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)PHY_vars_UE->ofdm_demod_stats.diff/PHY_vars_UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->ofdm_demod_stats.trials*2/3); + std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ofdm_demod_stats.trials - pow((double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, + UE->ofdm_demod_stats.trials*2/3); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3); printf("|__ DLSCH rx dft :%f us (%d trials)\n", - (nsymb*PHY_vars_UE->lte_frame_parms.nb_antennas_rx)*(double)PHY_vars_UE->rx_dft_stats.diff/PHY_vars_UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->rx_dft_stats.trials*2/3); + (nsymb*UE->frame_parms.nb_antennas_rx)*(double)UE->rx_dft_stats.diff/UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,UE->rx_dft_stats.trials*2/3); printf("|__ DLSCH channel estimation time :%f us (%d trials)\n", - (4.0)*(double)PHY_vars_UE->dlsch_channel_estimation_stats.diff/PHY_vars_UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_channel_estimation_stats.trials*2/3); + (4.0)*(double)UE->dlsch_channel_estimation_stats.diff/UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_channel_estimation_stats.trials*2/3); printf("|__ DLSCH frequency offset estimation time :%f us (%d trials)\n", - (4.0)*(double)PHY_vars_UE->dlsch_freq_offset_estimation_stats.diff/PHY_vars_UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->dlsch_freq_offset_estimation_stats.trials*2/3); - printf("DLSCH rx pdcch :%f us (%d trials)\n",(double)PHY_vars_UE->dlsch_rx_pdcch_stats.diff/PHY_vars_UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->dlsch_rx_pdcch_stats.trials); - std_phy_proc_rx_demod = sqrt((double)PHY_vars_UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->dlsch_llr_stats.trials - pow((double)PHY_vars_UE->dlsch_llr_stats.diff/PHY_vars_UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2)); - printf("DLSCH Channel Compensation and LLR generation time :%f us (%d trials)\n",(3)*(double)PHY_vars_UE->dlsch_llr_stats.diff/PHY_vars_UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->dlsch_llr_stats.trials/3); + (4.0)*(double)UE->dlsch_freq_offset_estimation_stats.diff/UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_freq_offset_estimation_stats.trials*2/3); + printf("DLSCH rx pdcch :%f us (%d trials)\n",(double)UE->dlsch_rx_pdcch_stats.diff/UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_rx_pdcch_stats.trials); + std_phy_proc_rx_demod = sqrt((double)UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->dlsch_llr_stats.trials - pow((double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH Channel Compensation and LLR generation time :%f us (%d trials)\n",(3)*(double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_llr_stats.trials/3); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3); - printf("DLSCH unscrambling time :%f us (%d trials)\n",(double)PHY_vars_UE->dlsch_unscrambling_stats.diff/PHY_vars_UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->dlsch_unscrambling_stats.trials); - std_phy_proc_rx_dec = sqrt((double)PHY_vars_UE->dlsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->dlsch_decoding_stats.trials - pow((double)PHY_vars_UE->dlsch_decoding_stats.diff/PHY_vars_UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH unscrambling time :%f us (%d trials)\n",(double)UE->dlsch_unscrambling_stats.diff/UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_unscrambling_stats.trials); + std_phy_proc_rx_dec = sqrt((double)UE->dlsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->dlsch_decoding_stats.trials - pow((double)UE->dlsch_decoding_stats.diff/UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000,2)); printf("DLSCH Decoding time (%02.2f Mbit/s, avg iter %1.2f) :%f us (%d trials, max %f)\n", - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter/iter_trials, - (double)PHY_vars_UE->dlsch_decoding_stats.diff/PHY_vars_UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_decoding_stats.trials, - (double)PHY_vars_UE->dlsch_decoding_stats.max/cpu_freq_GHz/1000.0); + eNB->dlsch[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter/iter_trials, + (double)UE->dlsch_decoding_stats.diff/UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_decoding_stats.trials, + (double)UE->dlsch_decoding_stats.max/cpu_freq_GHz/1000.0); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3); printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n", - (double)PHY_vars_UE->dlsch_rate_unmatching_stats.diff/PHY_vars_UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_rate_unmatching_stats.trials); + (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials); printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n", - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Cminus ? PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kminus : PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kplus, - (double)PHY_vars_UE->dlsch_turbo_decoding_stats.diff/PHY_vars_UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_turbo_decoding_stats.trials); + UE->dlsch[0][0]->harq_processes[0]->Cminus ? UE->dlsch[0][0]->harq_processes[0]->Kminus : UE->dlsch[0][0]->harq_processes[0]->Kplus, + (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials); printf(" |__ init %f us (cycles/iter %f, %d trials)\n", - (double)PHY_vars_UE->dlsch_tc_init_stats.diff/PHY_vars_UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_init_stats.diff/PHY_vars_UE->dlsch_tc_init_stats.trials/((double)avg_iter/iter_trials), - PHY_vars_UE->dlsch_tc_init_stats.trials); + (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/((double)avg_iter/iter_trials), + UE->dlsch_tc_init_stats.trials); printf(" |__ alpha %f us (cycles/iter %f, %d trials)\n", - (double)PHY_vars_UE->dlsch_tc_alpha_stats.diff/PHY_vars_UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_alpha_stats.diff/PHY_vars_UE->dlsch_tc_alpha_stats.trials*2, - PHY_vars_UE->dlsch_tc_alpha_stats.trials); + (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials*2, + UE->dlsch_tc_alpha_stats.trials); printf(" |__ beta %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_beta_stats.diff/PHY_vars_UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_beta_stats.diff/PHY_vars_UE->dlsch_tc_beta_stats.trials*2, - PHY_vars_UE->dlsch_tc_beta_stats.trials); + (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials*2, + UE->dlsch_tc_beta_stats.trials); printf(" |__ gamma %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_gamma_stats.diff/PHY_vars_UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_gamma_stats.diff/PHY_vars_UE->dlsch_tc_gamma_stats.trials*2, - PHY_vars_UE->dlsch_tc_gamma_stats.trials); + (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials*2, + UE->dlsch_tc_gamma_stats.trials); printf(" |__ ext %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_ext_stats.diff/PHY_vars_UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_ext_stats.diff/PHY_vars_UE->dlsch_tc_ext_stats.trials*2, - PHY_vars_UE->dlsch_tc_ext_stats.trials); + (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials*2, + UE->dlsch_tc_ext_stats.trials); printf(" |__ intl1 %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_intl1_stats.diff/PHY_vars_UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_intl1_stats.diff/PHY_vars_UE->dlsch_tc_intl1_stats.trials, - PHY_vars_UE->dlsch_tc_intl1_stats.trials); + (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials, + UE->dlsch_tc_intl1_stats.trials); printf(" |__ intl2+HD+CRC %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_intl2_stats.diff/PHY_vars_UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_intl2_stats.diff/PHY_vars_UE->dlsch_tc_intl2_stats.trials, - PHY_vars_UE->dlsch_tc_intl2_stats.trials); + (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials, + UE->dlsch_tc_intl2_stats.trials); } if ((transmission_mode != 3) && (transmission_mode != 4)) { fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", SNR, mcs1, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, rate, errs[0], round_trials[0], @@ -3794,8 +3794,8 @@ PMI_FEEDBACK: fprintf(bler_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", SNR, mcs1,mcs2, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, rate, errs[0], round_trials[0], @@ -3828,7 +3828,7 @@ PMI_FEEDBACK: fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;", SNR, mcs1, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, rate, errs[0], round_trials[0], @@ -3844,7 +3844,7 @@ PMI_FEEDBACK: fprintf(time_meas_fd,"%f;%d;%d;%f; %2.1f%%;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;", SNR, mcs1, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, rate*effective_rate, 100*effective_rate, rate, @@ -3865,14 +3865,14 @@ PMI_FEEDBACK: round_trials[0], (double)dci_errors/(round_trials[0]), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); } else { fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;", SNR, mcs1,mcs2, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, rate, errs[0], round_trials[0], @@ -3888,8 +3888,8 @@ PMI_FEEDBACK: fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%2.1f;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;", SNR, mcs1,mcs2, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, rate*effective_rate, 100*effective_rate, rate, @@ -3910,36 +3910,36 @@ PMI_FEEDBACK: round_trials[0], (double)dci_errors/(round_trials[0]), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); } //fprintf(time_meas_fd,"eNB_PROC_TX(%d); OFDM_MOD(%d); DL_MOD(%d); DL_SCR(%d); DL_ENC(%d); UE_PROC_RX(%d); OFDM_DEMOD_CH_EST(%d); RX_PDCCH(%d); CH_COMP_LLR(%d); DL_USCR(%d); DL_DECOD(%d);\n", fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d; %d; %d; %d;", - PHY_vars_eNB->phy_proc_tx.trials, - PHY_vars_eNB->ofdm_mod_stats.trials, - PHY_vars_eNB->dlsch_modulation_stats.trials, - PHY_vars_eNB->dlsch_scrambling_stats.trials, - PHY_vars_eNB->dlsch_encoding_stats.trials, - PHY_vars_UE->phy_proc_rx.trials, - PHY_vars_UE->ofdm_demod_stats.trials, - PHY_vars_UE->dlsch_rx_pdcch_stats.trials, - PHY_vars_UE->dlsch_llr_stats.trials, - PHY_vars_UE->dlsch_unscrambling_stats.trials, - PHY_vars_UE->dlsch_decoding_stats.trials + eNB->phy_proc_tx.trials, + eNB->ofdm_mod_stats.trials, + eNB->dlsch_modulation_stats.trials, + eNB->dlsch_scrambling_stats.trials, + eNB->dlsch_encoding_stats.trials, + UE->phy_proc_rx.trials, + UE->ofdm_demod_stats.trials, + UE->dlsch_rx_pdcch_stats.trials, + UE->dlsch_llr_stats.trials, + UE->dlsch_unscrambling_stats.trials, + UE->dlsch_decoding_stats.trials ); fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;", - get_time_meas_us(&PHY_vars_eNB->phy_proc_tx), - get_time_meas_us(&PHY_vars_eNB->ofdm_mod_stats), - get_time_meas_us(&PHY_vars_eNB->dlsch_modulation_stats), - get_time_meas_us(&PHY_vars_eNB->dlsch_scrambling_stats), - get_time_meas_us(&PHY_vars_eNB->dlsch_encoding_stats), - get_time_meas_us(&PHY_vars_UE->phy_proc_rx), - nsymb*get_time_meas_us(&PHY_vars_UE->ofdm_demod_stats), - get_time_meas_us(&PHY_vars_UE->dlsch_rx_pdcch_stats), - 3*get_time_meas_us(&PHY_vars_UE->dlsch_llr_stats), - get_time_meas_us(&PHY_vars_UE->dlsch_unscrambling_stats), - get_time_meas_us(&PHY_vars_UE->dlsch_decoding_stats) + get_time_meas_us(&eNB->phy_proc_tx), + get_time_meas_us(&eNB->ofdm_mod_stats), + get_time_meas_us(&eNB->dlsch_modulation_stats), + get_time_meas_us(&eNB->dlsch_scrambling_stats), + get_time_meas_us(&eNB->dlsch_encoding_stats), + get_time_meas_us(&UE->phy_proc_rx), + nsymb*get_time_meas_us(&UE->ofdm_demod_stats), + get_time_meas_us(&UE->dlsch_rx_pdcch_stats), + 3*get_time_meas_us(&UE->dlsch_llr_stats), + get_time_meas_us(&UE->dlsch_unscrambling_stats), + get_time_meas_us(&UE->dlsch_decoding_stats) ); //fprintf(time_meas_fd,"eNB_PROC_TX_STD;eNB_PROC_TX_MAX;eNB_PROC_TX_MIN;eNB_PROC_TX_MED;eNB_PROC_TX_Q1;eNB_PROC_TX_Q3;eNB_PROC_TX_DROPPED;\n"); fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped); @@ -3969,17 +3969,17 @@ PMI_FEEDBACK: /* fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;", - PHY_vars_eNB->phy_proc_tx.trials, - PHY_vars_eNB->ofdm_mod_stats.trials, - PHY_vars_eNB->dlsch_modulation_stats.trials, - PHY_vars_eNB->dlsch_scrambling_stats.trials, - PHY_vars_eNB->dlsch_encoding_stats.trials, - PHY_vars_UE->phy_proc_rx.trials, - PHY_vars_UE->ofdm_demod_stats.trials, - PHY_vars_UE->dlsch_rx_pdcch_stats.trials, - PHY_vars_UE->dlsch_llr_stats.trials, - PHY_vars_UE->dlsch_unscrambling_stats.trials, - PHY_vars_UE->dlsch_decoding_stats.trials); + eNB->phy_proc_tx.trials, + eNB->ofdm_mod_stats.trials, + eNB->dlsch_modulation_stats.trials, + eNB->dlsch_scrambling_stats.trials, + eNB->dlsch_encoding_stats.trials, + UE->phy_proc_rx.trials, + UE->ofdm_demod_stats.trials, + UE->dlsch_rx_pdcch_stats.trials, + UE->dlsch_llr_stats.trials, + UE->dlsch_unscrambling_stats.trials, + UE->dlsch_decoding_stats.trials); */ printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate ); break; @@ -4030,9 +4030,9 @@ PMI_FEEDBACK: for (i=0; i<2; i++) { printf("eNB %d\n",i); - free_eNB_dlsch(PHY_vars_eNB->dlsch_eNB[0][i]); + free_eNB_dlsch(eNB->dlsch[0][i]); printf("UE %d\n",i); - free_ue_dlsch(PHY_vars_UE->dlsch_ue[0][i]); + free_ue_dlsch(UE->dlsch[0][i]); } diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 78bb09c552..73da52085f 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -48,13 +48,14 @@ #include "PHY/TOOLS/lte_phy_scope.h" #endif +#include "unitary_defs.h" #define N_TRIALS 100 -PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB,*eNB1,*eNB2; +PHY_VARS_UE *UE; #define UL_RB_ALLOC 0x1ff; -#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2) +#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) #define DLSCH_RB_ALLOC ((uint16_t)0x1fbf) // igore DC component,RB13 DCI_PDU DCI_pdu; @@ -459,17 +460,7 @@ int main(int argc, char **argv) int CCE_table[800]; number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ while ((c = getopt (argc, argv, "hapFg:R:c:n:s:x:y:z:L:M:N:I:f:i:S:P:Y")) != -1) { switch (c) { case 'a': @@ -719,7 +710,7 @@ int main(int argc, char **argv) mac_xface->computeRIV = computeRIV; - mac_xface->lte_frame_parms = &PHY_vars_eNB->lte_frame_parms; + mac_xface->frame_parms = &eNB->frame_parms; // init_transport_channels(transmission_mode); if (n_frames==1) @@ -729,27 +720,27 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; get_dci(frame_parms, log2L, log2Lcommon, format_selector, n_rnti); - txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[eNb_id]; + txdata = eNB->common_vars.txdata[eNb_id]; s_re = malloc(2*sizeof(double*)); s_im = malloc(2*sizeof(double*)); r_re = malloc(2*sizeof(double*)); r_im = malloc(2*sizeof(double*)); - nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12; + nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; printf("Subframe %d, FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n", subframe,NUMBER_OF_OFDM_CARRIERS, - PHY_vars_eNB->lte_frame_parms.Ncp,PHY_vars_eNB->lte_frame_parms.samples_per_tti,nsymb); + eNB->frame_parms.Ncp,eNB->frame_parms.samples_per_tti,nsymb); - eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx_eNB, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, 0); @@ -769,12 +760,12 @@ int main(int argc, char **argv) - PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0); - PHY_vars_UE->ulsch_ue[0] = new_ue_ulsch(N_RB_DL,0); + eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0); + UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); - PHY_vars_eNB->proc[subframe].frame_tx = 0; - PHY_vars_eNB->proc[subframe].subframe_tx = subframe; + eNB->proc.frame_tx = 0; + eNB->proc.subframe_tx = subframe; if (input_fd==NULL) { msg("No input file, so starting TX\n"); @@ -812,9 +803,9 @@ int main(int argc, char **argv) } - PHY_vars_UE->UE_mode[0] = PUSCH; + UE->UE_mode[0] = PUSCH; - // nCCE_max = get_nCCE(3,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,0)); + // nCCE_max = get_nCCE(3,&eNB->frame_parms,get_mi(&eNB->frame_parms,0)); //printf("nCCE_max %d\n",nCCE_max); //printf("num_phich interferers %d\n",num_phich_interf); @@ -832,31 +823,31 @@ int main(int argc, char **argv) for (trial=0; triallte_eNB_common_vars.txdataF[eNb_id][aa][512*14*subframe],&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0]); - for (aa=0; aalte_frame_parms.nb_antennas_tx_eNB; aa++) { - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + // printf("DCI (SF %d): txdataF %p (0 %p)\n",subframe,&eNB->common_vars.txdataF[eNb_id][aa][512*14*subframe],&eNB->common_vars.txdataF[eNb_id][aa][0]); + for (aa=0; aaframe_parms.nb_antennas_tx_eNB; aa++) { + memset(&eNB->common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); /* - re_offset = PHY_vars_eNB->lte_frame_parms.first_carrier_offset; - txptr = (uint32_t*)&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti]; - for (i=0;ilte_frame_parms.N_RB_DL*6;i++) { - txptr[re_offset++] = PHY_vars_eNB->lte_frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3]; + re_offset = eNB->frame_parms.first_carrier_offset; + txptr = (uint32_t*)&eNB->common_vars.txdataF[eNb_id][aa][subframe*eNB->frame_parms.samples_per_tti]; + for (i=0;iframe_parms.N_RB_DL*6;i++) { + txptr[re_offset++] = eNB->frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3]; //printf("%i => %d,%d\n",re_offset-1,*(int16_t*)&txptr[re_offset-1],*(1+(int16_t*)&txptr[re_offset-1])); } re_offset=1; //skip DC - for (i=0;ilte_frame_parms.N_RB_DL*6;i++) - txptr[re_offset++] = PHY_vars_eNB->lte_frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3]; + for (i=0;iframe_parms.N_RB_DL*6;i++) + txptr[re_offset++] = eNB->frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3]; */ } - generate_pilots_slot(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], + generate_pilots_slot(eNB, + eNB->common_vars.txdataF[eNb_id], AMP, //1024, (subframe*2), 0); - generate_pilots_slot(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], + generate_pilots_slot(eNB, + eNB->common_vars.txdataF[eNb_id], AMP, //1024, (subframe*2)+1, 0); @@ -866,18 +857,18 @@ int main(int argc, char **argv) numCCE=0; n_trials_common++; common_active = 1; - if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 50) { + if (eNB->frame_parms.N_RB_DL >= 50) { n_trials_ul++; ul_active = 1; } - if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 25) { + if (eNB->frame_parms.N_RB_DL >= 25) { n_trials_dl++; dl_active = 1; } num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci, DCI_pdu.dci_alloc, frame_parms, subframe); - numCCE = get_nCCE(num_pdcch_symbols,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,subframe)); + numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe)); if (n_frames==1) { printf("num_dci %d, num_pddch_symbols %d, nCCE %d\n", @@ -930,91 +921,83 @@ int main(int argc, char **argv) DCI_pdu.dci_alloc, 0, AMP, - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], + &eNB->frame_parms, + eNB->common_vars.txdataF[eNb_id], subframe); if (n_frames==1) printf("num_pdcch_symbols at TX %d\n",num_pdcch_symbols); - if (is_phich_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)) { + if (is_phich_subframe(&eNB->frame_parms,subframe)) { if (n_frames==1) printf("generating PHICH\n"); - harq_pid = phich_subframe_to_harq_pid(&PHY_vars_eNB->lte_frame_parms, PHY_vars_eNB->proc[subframe].frame_tx, subframe); + harq_pid = phich_subframe_to_harq_pid(&eNB->frame_parms, eNB->proc.frame_tx, subframe); phich_ACK = taus()&1; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->phich_active = 1; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 0; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS = 0; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->phich_ACK = phich_ACK; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->dci_alloc = 1; + eNB->ulsch[0]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; + eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 0; + eNB->ulsch[0]->harq_processes[harq_pid]->phich_ACK = phich_ACK; + eNB->ulsch[0]->harq_processes[harq_pid]->dci_alloc = 1; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->first_rb = 0; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->n_DMRS = 0; + UE->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; + UE->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 0; - generate_phich_top(PHY_vars_eNB, - subframe,AMP,0,0); + generate_phich_top(eNB,AMP,0,0); // generate 3 interfering PHICH if (num_phich_interf>0) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 4; - generate_phich_top(PHY_vars_eNB, - subframe, - 1024, - 0,0); + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 4; + generate_phich_top(eNB,1024,0,0); } if (num_phich_interf>1) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 8; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS = 1; - generate_phich_top(PHY_vars_eNB, - subframe, - 1024,0,0); + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 8; + eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1; + generate_phich_top(eNB,1024,0,0); } if (num_phich_interf>2) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 12; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS = 1; - generate_phich_top(PHY_vars_eNB, - subframe, - 1024,0,0); + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 12; + eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1; + generate_phich_top(eNB,1024,0,0); } - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 0; + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; } - // write_output("pilotsF.m","rsF",txdataF[0],lte_PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + // write_output("pilotsF.m","rsF",txdataF[0],lte_eNB->frame_parms.ofdm_symbol_size,1,1); if (n_frames==1) { - write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][0],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0.m","txsF0", eNB->common_vars.txdataF[eNb_id][0],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB > 1) - write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][1],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); + if (eNB->frame_parms.nb_antennas_tx_eNB > 1) + write_output("txsigF1.m","txsF1", eNB->common_vars.txdataF[eNb_id][1],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); } tx_lev = 0; - for (aa=0; aalte_frame_parms.nb_antennas_tx_eNB; aa++) { - if (PHY_vars_eNB->lte_frame_parms.Ncp == 1) - PHY_ofdm_mod(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], // input, - &txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], // output - PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size, + for (aa=0; aaframe_parms.nb_antennas_tx_eNB; aa++) { + if (eNB->frame_parms.Ncp == 1) + PHY_ofdm_mod(&eNB->common_vars.txdataF[eNb_id][aa][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], // input, + &txdata[aa][subframe*eNB->frame_parms.samples_per_tti], // output + eNB->frame_parms.ofdm_symbol_size, 2*nsymb, // number of symbols - PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples + eNB->frame_parms.nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - &txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], + normal_prefix_mod(&eNB->common_vars.txdataF[eNb_id][aa][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + &txdata[aa][subframe*eNB->frame_parms.samples_per_tti], 2*nsymb, frame_parms); } - tx_lev += signal_energy(&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], - PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size); + tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.ofdm_symbol_size); } tx_lev_dB = (unsigned int) dB_fixed(tx_lev); @@ -1023,18 +1006,18 @@ int main(int argc, char **argv) for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx_eNB; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx_eNB; aa++) { if (awgn_flag == 0) { - s_re[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - s_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + s_re[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } else { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { if (aa==0) { - r_re[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - r_im[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + r_re[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + r_im[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } else { - r_re[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - r_im[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + r_re[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + r_im[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } } } @@ -1054,7 +1037,7 @@ int main(int argc, char **argv) // scale by path_loss = NOW - P_noise //sigma2 = pow(10,sigma2_dB/10); //N0W = -95.87; - sigma2_dB = (double)tx_lev_dB +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*PHY_vars_eNB->lte_frame_parms.N_RB_DL)) - SNR; + sigma2_dB = (double)tx_lev_dB +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(12*eNB->frame_parms.N_RB_DL)) - SNR; if (n_frames==1) printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %d\n",sigma2_dB,SNR,tx_lev_dB); @@ -1064,37 +1047,37 @@ int main(int argc, char **argv) // printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB); for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i] = (short) (.667*(r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1] = (short) (.667*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble( + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i] = (short) (.667*(r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1] = (short) (.667*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble( 0.0,1.0))); /* - ((short*)PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i] = - ((short*)txdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i]; - ((short*)PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1] = - ((short*)txdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1]; + ((short*)UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i] = + ((short*)txdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i]; + ((short*)UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1] = + ((short*)txdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1]; */ } } // UE receiver - for (l=0; llte_frame_parms.symbols_per_tti; l++) { + for (l=0; lframe_parms.symbols_per_tti; l++) { - // subframe_offset = (l/PHY_vars_eNB->lte_frame_parms.symbols_per_tti)*PHY_vars_eNB->lte_frame_parms.samples_per_tti; + // subframe_offset = (l/eNB->frame_parms.symbols_per_tti)*eNB->frame_parms.samples_per_tti; // printf("subframe_offset = %d\n",subframe_offset); - slot_fep(PHY_vars_UE, - l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), - (2*subframe)+(l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2)), + slot_fep(UE, + l%(eNB->frame_parms.symbols_per_tti/2), + (2*subframe)+(l/(eNB->frame_parms.symbols_per_tti/2)), 0, 0, 0); - if (PHY_vars_UE->perfect_ce == 1) { + if (UE->perfect_ce == 1) { if (awgn_flag==0) { // fill in perfect channel estimates - freq_channel(eNB2UE,PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); + freq_channel(eNB2UE,UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8); //write_output("channelF.m","chF",desc1->chF[0],nb_samples,1,8); @@ -1102,9 +1085,9 @@ int main(int argc, char **argv) for(aa=0; aanb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } } @@ -1114,42 +1097,42 @@ int main(int argc, char **argv) for(aa=0; aanb_antennas_tx_eNB; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; + ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; } } } } } - if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?4:3)) { + if (l==((eNB->frame_parms.Ncp==0)?4:3)) { - // write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + // write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); // do PDCCH procedures here - PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti; + UE->pdcch_vars[0]->crnti = n_rnti; // printf("Doing RX : num_pdcch_symbols at TX %d\n",num_pdcch_symbols); - rx_pdcch(&PHY_vars_UE->lte_ue_common_vars, - PHY_vars_UE->lte_ue_pdcch_vars, - &PHY_vars_UE->lte_frame_parms, + rx_pdcch(&UE->common_vars, + UE->pdcch_vars, + &UE->frame_parms, subframe, 0, - (PHY_vars_UE->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - PHY_vars_UE->high_speed_flag, - PHY_vars_UE->is_secondary_ue); + (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + UE->high_speed_flag, + UE->is_secondary_ue); - if (is_phich_subframe(&PHY_vars_UE->lte_frame_parms,subframe)) { - PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->status = ACTIVE; - //PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->Ndi = 1; - rx_phich(PHY_vars_UE, + if (is_phich_subframe(&UE->frame_parms,subframe)) { + UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms,0,subframe)]->status = ACTIVE; + //UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms,0,subframe)]->Ndi = 1; + rx_phich(UE, subframe, 0); } - // if (PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) + // if (UE->pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) // break; - dci_cnt = dci_decoding_procedure(PHY_vars_UE, + dci_cnt = dci_decoding_procedure(UE, dci_alloc_rx,1, 0,subframe); @@ -1158,7 +1141,7 @@ int main(int argc, char **argv) dl_rx=0; if (n_frames==1) { - numCCE = get_nCCE(PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, &PHY_vars_UE->lte_frame_parms, get_mi(&PHY_vars_UE->lte_frame_parms,subframe)); + numCCE = get_nCCE(UE->pdcch_vars[0]->num_pdcch_symbols, &UE->frame_parms, get_mi(&UE->frame_parms,subframe)); for (i = 0; i < dci_cnt; i++) printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i, dci_alloc_rx[i].rnti, dci_alloc_rx[i].format, @@ -1168,21 +1151,21 @@ int main(int argc, char **argv) for (i=0; ilte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); common_rx=1; } if ((dci_alloc_rx[i].rnti == n_rnti) && (dci_alloc_rx[i].format == format0)) { if (n_frames==1) - dump_dci(&PHY_vars_UE->lte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); ul_rx=1; } if ((dci_alloc_rx[i].rnti == n_rnti) && ((dci_alloc_rx[i].format == format1))) { if (n_frames==1) - dump_dci(&PHY_vars_UE->lte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); dl_rx=1; } @@ -1207,12 +1190,12 @@ int main(int argc, char **argv) // exit(-1); } - if (PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) + if (UE->pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) n_errors_cfi++; /* - if (is_phich_subframe(&PHY_vars_UE->lte_frame_parms,subframe)) - if (PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms, PHY_vars_UE->frame, subframe)]->Ndi != phich_ACK) + if (is_phich_subframe(&UE->frame_parms,subframe)) + if (UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms, UE->frame, subframe)]->Ndi != phich_ACK) n_errors_hi++; */ @@ -1230,7 +1213,7 @@ int main(int argc, char **argv) #ifdef XFORMS phy_scope_UE(form_ue, - PHY_vars_UE, + UE, eNb_id,0,subframe); #endif @@ -1250,22 +1233,22 @@ int main(int argc, char **argv) if (n_tx>1) write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("rxsig0.m","rxs0", PHY_vars_UE->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", PHY_vars_UE->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("rxsig0.m","rxs0", UE->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + write_output("rxsigF0.m","rxsF0", UE->common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); if (n_rx>1) { - write_output("rxsig1.m","rxs1", PHY_vars_UE->lte_ue_common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1); - write_output("rxsigF1.m","rxsF1", PHY_vars_UE->lte_ue_common_vars.rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1); + write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); } - write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) - write_output("H10.m","h10",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(UE->common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); - write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->rxdataF_ext[0],3*12*PHY_vars_UE->lte_frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->rxdataF_comp[0],4*12*PHY_vars_UE->lte_frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->llr,2400,1,4); + write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",UE->pdcch_vars[eNb_id]->rxdataF_ext[0],3*12*UE->frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNb_id]->rxdataF_comp[0],4*12*UE->frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNb_id]->llr,2400,1,4); } for (i=0; i<2; i++) { diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c index 37fc3a6a10..58e5428e82 100644 --- a/openair1/SIMULATION/LTE_PHY/prachsim.c +++ b/openair1/SIMULATION/LTE_PHY/prachsim.c @@ -43,10 +43,12 @@ #include "OCG_vars.h" +#include "unitary_defs.h" + int current_dlsch_cqi; //FIXME! -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 @@ -105,17 +107,9 @@ int main(int argc, char **argv) logInit(); number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ + while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:")) != -1) { switch (c) { case 'a': @@ -343,10 +337,10 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; - txdata = PHY_vars_UE->lte_ue_common_vars.txdata; + txdata = UE->common_vars.txdata; printf("txdata %p\n",&txdata[0][subframe*frame_parms->samples_per_tti]); s_re = malloc(2*sizeof(double*)); @@ -361,11 +355,11 @@ int main(int argc, char **argv) msg("[SIM] Using SCM/101\n"); - UE2eNB = new_channel_desc_scm(PHY_vars_UE->lte_frame_parms.nb_antennas_tx, - PHY_vars_eNB->lte_frame_parms.nb_antennas_rx, + UE2eNB = new_channel_desc_scm(UE->frame_parms.nb_antennas_tx, + eNB->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), 0.0, delay, 0); @@ -388,32 +382,35 @@ int main(int argc, char **argv) bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); } - PHY_vars_UE->lte_frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; - PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; - PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; - PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; - PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; + UE->frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; + UE->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; + UE->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; + UE->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; + UE->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; - PHY_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; - PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; - PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; - PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; - PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; + eNB->frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; + eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; + eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; + eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; + eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; + + eNB->node_function = eNodeB_3GPP; + eNB->proc.subframe_rx = subframe; /* N_ZC not used later, so prach_fmt is also useless, don't set */ - //prach_fmt = get_prach_fmt(PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, - // PHY_vars_eNB->lte_frame_parms.frame_type); + //prach_fmt = get_prach_fmt(eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, + // eNB->frame_parms.frame_type); /* N_ZC not used later, no need to set */ //N_ZC = (prach_fmt <4)?839:139; - compute_prach_seq(&PHY_vars_eNB->lte_frame_parms.prach_config_common,PHY_vars_eNB->lte_frame_parms.frame_type,PHY_vars_eNB->X_u); + compute_prach_seq(&eNB->frame_parms.prach_config_common,eNB->frame_parms.frame_type,eNB->X_u); - compute_prach_seq(&PHY_vars_UE->lte_frame_parms.prach_config_common,PHY_vars_UE->lte_frame_parms.frame_type,PHY_vars_UE->X_u); + compute_prach_seq(&UE->frame_parms.prach_config_common,UE->frame_parms.frame_type,UE->X_u); - PHY_vars_UE->lte_ue_prach_vars[0]->amp = AMP; + UE->prach_vars[0]->amp = AMP; - PHY_vars_UE->prach_resources[0] = &prach_resources; + UE->prach_resources[0] = &prach_resources; if (preamble_tx == 99) preamble_tx = (uint16_t)(taus()&0x3f); @@ -421,10 +418,10 @@ int main(int argc, char **argv) if (n_frames == 1) printf("raPreamble %d\n",preamble_tx); - PHY_vars_UE->prach_resources[0]->ra_PreambleIndex = preamble_tx; - PHY_vars_UE->prach_resources[0]->ra_TDD_map_index = 0; + UE->prach_resources[0]->ra_PreambleIndex = preamble_tx; + UE->prach_resources[0]->ra_TDD_map_index = 0; - tx_lev = generate_prach(PHY_vars_UE, + tx_lev = generate_prach(UE, 0, //eNB_id, subframe, 0); //Nf @@ -436,7 +433,7 @@ int main(int argc, char **argv) //write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); // multipath channel - dump_prach_config(&PHY_vars_eNB->lte_frame_parms,subframe); + dump_prach_config(&eNB->frame_parms,subframe); for (i=0; i<2*frame_parms->samples_per_tti; i++) { for (aa=0; aa<1; aa++) { @@ -444,7 +441,7 @@ int main(int argc, char **argv) s_re[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]); s_im[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]); } else { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { if (aa==0) { r_re[aarx][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]); r_im[aarx][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]); @@ -491,15 +488,14 @@ int main(int argc, char **argv) } for (i=0; isamples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } - rx_prach(PHY_vars_eNB, - subframe, + rx_prach(eNB, preamble_energy_list, preamble_delay_list, 0, //Nf @@ -530,12 +526,12 @@ int main(int argc, char **argv) printf("preamble %d : energy %d, delay %d\n",i,preamble_energy_list[i],preamble_delay_list[i]); write_output("prach0.m","prach0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); - write_output("prachF0.m","prachF0", &PHY_vars_eNB->lte_eNB_prach_vars.prachF[0],24576,1,1); + write_output("prachF0.m","prachF0", &eNB->prach_vars.prachF[0],24576,1,1); write_output("rxsig0.m","rxs0", - &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti], + &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti], frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); - write_output("prach_preamble.m","prachp",&PHY_vars_eNB->X_u[0],839,1,1); + write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); + write_output("prach_preamble.m","prachp",&eNB->X_u[0],839,1,1); } } diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index fa96ac5843..d3c3df0754 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -45,10 +45,12 @@ #include "OCG_vars.h" #include "UTIL/LOG/log_extern.h" +#include "unitary_defs.h" + int current_dlsch_cqi; //FIXME! -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 @@ -101,17 +103,6 @@ int main(int argc, char **argv) uint16_t n2_pucch = 0; number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ while ((c = getopt (argc, argv, "har:pf:g:n:s:S:x:y:z:N:F:T:R:")) != -1) { switch (c) { @@ -311,10 +302,11 @@ int main(int argc, char **argv) n_rx, transmission_mode, extended_prefix_flag, - Nid_cell, FDD, + Nid_cell, 3, N_RB_DL, + 0, osf, 0); @@ -328,10 +320,10 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; - txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id]; + txdata = eNB->common_vars.txdata[eNB_id]; s_re = malloc(2*sizeof(double*)); s_im = malloc(2*sizeof(double*)); @@ -345,11 +337,11 @@ int main(int argc, char **argv) printf("[SIM] Using SCM/101\n"); - UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), 0.0, 0, 0); @@ -373,22 +365,22 @@ int main(int argc, char **argv) bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); } - init_ncs_cell(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->ncs_cell); + init_ncs_cell(&eNB->frame_parms,eNB->ncs_cell); - init_ncs_cell(&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->ncs_cell); + init_ncs_cell(&UE->frame_parms,UE->ncs_cell); - PHY_vars_eNB->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; - PHY_vars_eNB->lte_frame_parms.pucch_config_common.nRB_CQI = 0; - PHY_vars_eNB->lte_frame_parms.pucch_config_common.nCS_AN = 0; - PHY_vars_UE->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; - PHY_vars_UE->lte_frame_parms.pucch_config_common.nRB_CQI = 0; - PHY_vars_UE->lte_frame_parms.pucch_config_common.nCS_AN = 0; + eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; + eNB->frame_parms.pucch_config_common.nRB_CQI = 0; + eNB->frame_parms.pucch_config_common.nCS_AN = 0; + UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; + UE->frame_parms.pucch_config_common.nRB_CQI = 0; + UE->frame_parms.pucch_config_common.nCS_AN = 0; pucch_payload = 0; - generate_pucch(PHY_vars_UE->lte_ue_common_vars.txdataF, + generate_pucch(UE->common_vars.txdataF, frame_parms, - PHY_vars_UE->ncs_cell, + UE->ncs_cell, pucch_format, &pucch_config_dedicated, n1_pucch, @@ -397,34 +389,34 @@ int main(int argc, char **argv) &pucch_payload, AMP, //amp, subframe); //subframe - write_output("txsigF0.m","txsF0", &PHY_vars_UE->lte_ue_common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1); + write_output("txsigF0.m","txsF0", &UE->common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1); tx_lev = 0; - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input, - &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], // output + PHY_ofdm_mod(&UE->common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input, + &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], // output frame_parms->ofdm_symbol_size, nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[eNB_id][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], - &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], + normal_prefix_mod(&UE->common_vars.txdataF[eNB_id][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], + &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], nsymb, frame_parms); - //apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],subframe<<1); - //apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],1+(subframe<<1)); - apply_7_5_kHz(PHY_vars_UE,&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],0); - apply_7_5_kHz(PHY_vars_UE,&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],1); + //apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1); + //apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1)); + apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],0); + apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],1); } - tx_lev += signal_energy(&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], + tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); } @@ -436,7 +428,7 @@ int main(int argc, char **argv) // multipath channel for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { s_re[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]); s_im[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]); } @@ -498,17 +490,17 @@ int main(int argc, char **argv) //printf("n_trial %d\n",n_trials); // fill measurement symbol (19) with noise for (i=0; ilte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { if (n_trials==0) { // r_re[aa][i] += (pow(10.0,.05*interf1)*r_re1[aa][i] + pow(10.0,.05*interf2)*r_re2[aa][i]); // r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]); @@ -516,31 +508,31 @@ int main(int argc, char **argv) if (sig==1) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble( + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble( 0.0,1.0))); } else { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } } - remove_7_5_kHz(PHY_vars_eNB,subframe<<1); - remove_7_5_kHz(PHY_vars_eNB,1+(subframe<<1)); + remove_7_5_kHz(eNB,subframe<<1); + remove_7_5_kHz(eNB,1+(subframe<<1)); - for (l=0; llte_frame_parms.symbols_per_tti/2; l++) { + for (l=0; lframe_parms.symbols_per_tti/2; l++) { - slot_fep_ul(&PHY_vars_eNB->lte_frame_parms, - &PHY_vars_eNB->lte_eNB_common_vars, + slot_fep_ul(&eNB->frame_parms, + &eNB->common_vars, l, subframe*2,// slot 0, 0 ); - slot_fep_ul(&PHY_vars_eNB->lte_frame_parms, - &PHY_vars_eNB->lte_eNB_common_vars, + slot_fep_ul(&eNB->frame_parms, + &eNB->common_vars, l, 1+(subframe*2),//slot 0, @@ -553,12 +545,12 @@ int main(int argc, char **argv) // if (sig == 1) // printf("*"); - lte_eNB_I0_measurements(PHY_vars_eNB, + lte_eNB_I0_measurements(eNB, subframe, 0, 1); - PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(12*NB_RB))); - stat = rx_pucch(PHY_vars_eNB, + eNB->measurements[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(eNB->frame_parms.ofdm_symbol_size/(12*NB_RB))); + stat = rx_pucch(eNB, pucch_format, 0, n1_pucch, @@ -593,7 +585,7 @@ int main(int argc, char **argv) } if (pucch_format==pucch_format1) - printf("pucch_trials %d : pucch1_false %d,pucch1_missed %d, N0 %d dB, stat_no_sig %f dB, stat_sig %f dB\n",pucch_tx,pucch1_false,pucch1_missed,PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB, + printf("pucch_trials %d : pucch1_false %d,pucch1_missed %d, N0 %d dB, stat_no_sig %f dB, stat_sig %f dB\n",pucch_tx,pucch1_false,pucch1_missed,eNB->measurements[0].n0_power_tot_dB, 10*log10(stat_no_sig),10*log10(stat_sig)); else if (pucch_format==pucch_format1a) printf("pucch_trials %d : pucch1a_errors %d\n",pucch_tx,pucch1_false); @@ -605,8 +597,8 @@ int main(int argc, char **argv) if (n_frames==1) { //write_output("txsig0.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); write_output("txsig0pucch.m", "txs0", &txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); + write_output("rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); + write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); } diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 56f8eb146a..96c0083f94 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -51,13 +51,15 @@ #include "LAYER2/MAC/vars.h" #include "OCG_vars.h" +#include "unitary_defs.h" + #include "PHY/TOOLS/lte_phy_scope.h" -extern unsigned short dftsizes[33]; -extern short *ul_ref_sigs[30][2][33]; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; + + -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; //#define MCS_COUNT 23//added for PHY abstraction @@ -186,7 +188,6 @@ int main(int argc, char **argv) uint8_t max_turbo_iterations=4; uint8_t llr8_flag=0; int nb_rb_set = 0; - int sf; int threequarter_fs=0; opp_enabled=1; // to enable the time meas @@ -478,9 +479,9 @@ int main(int argc, char **argv) 0); if (nb_rb_set == 0) - nb_rb = PHY_vars_eNB->lte_frame_parms.N_RB_UL; + nb_rb = eNB->frame_parms.N_RB_UL; - printf("1 . rxdataF_comp[0] %p\n",PHY_vars_eNB->lte_eNB_pusch_vars[0]->rxdataF_comp[0][0]); + printf("1 . rxdataF_comp[0] %p\n",eNB->pusch_vars[0]->rxdataF_comp[0][0]); printf("Setting mcs = %d\n",mcs); printf("n_frames = %d\n", n_frames); @@ -497,9 +498,9 @@ int main(int argc, char **argv) txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); */ - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; - txdata = PHY_vars_UE->lte_ue_common_vars.txdata; + txdata = UE->common_vars.txdata; s_re = malloc(2*sizeof(double*)); @@ -509,7 +510,7 @@ int main(int argc, char **argv) // r_re0 = malloc(2*sizeof(double*)); // r_im0 = malloc(2*sizeof(double*)); - nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == NORMAL) ? 14 : 12; + nsymb = (eNB->frame_parms.Ncp == NORMAL) ? 14 : 12; sprintf(bler_fname,"ULbler_mcs%d_nrb%d_ChannelModel%d_nsim%d.csv",mcs,nb_rb,chMod,n_frames); @@ -594,40 +595,40 @@ int main(int argc, char **argv) fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); } - PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = 14; + UE->pdcch_vars[0]->crnti = 14; - PHY_vars_UE->lte_frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2; - PHY_vars_UE->lte_frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7; - PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = 0; - PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = 0; - PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = 0; + UE->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2; + UE->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7; + UE->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = 0; + UE->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = 0; + UE->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = 0; - PHY_vars_eNB->lte_frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2; - PHY_vars_eNB->lte_frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7; + eNB->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2; + eNB->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7; - PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = 1; - PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = 0; - PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = 0; - PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = 0; - PHY_vars_eNB->cooperation_flag = cooperation_flag; - // PHY_vars_eNB->eNB_UE_stats[0].SRS_parameters = PHY_vars_UE->SRS_parameters; + eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = 1; + eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = 0; + eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = 0; + eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = 0; + eNB->cooperation_flag = cooperation_flag; + // eNB->eNB_UE_stats[0].SRS_parameters = UE->SRS_parameters; - PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK; - PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index = beta_RI; - PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI; - PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK; - PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = beta_RI; - PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI; + eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK; + eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index = beta_RI; + eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI; + UE->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK; + UE->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = beta_RI; + UE->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI; - PHY_vars_UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1; + UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1; printf("PUSCH Beta : ACK %f, RI %f, CQI %f\n",(double)beta_ack[beta_ACK]/8,(double)beta_ri[beta_RI]/8,(double)beta_cqi[beta_CQI]/8); - UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), forgetting_factor, delay, 0); @@ -635,39 +636,39 @@ int main(int argc, char **argv) UE2eNB->max_Doppler = maxDoppler; // NN: N_RB_UL has to be defined in ulsim - PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0); - PHY_vars_UE->ulsch_ue[0] = new_ue_ulsch(N_RB_DL,0); + eNB->ulsch[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0); + UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); // Create transport channel structures for 2 transport blocks (MIMO) for (i=0; i<2; i++) { - PHY_vars_eNB->dlsch_eNB[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0); - PHY_vars_UE->dlsch_ue[0][i] = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0); + eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0); + UE->dlsch[0][i] = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0); - if (!PHY_vars_eNB->dlsch_eNB[0][i]) { + if (!eNB->dlsch[0][i]) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - if (!PHY_vars_UE->dlsch_ue[0][i]) { + if (!UE->dlsch[0][i]) { printf("Can't get ue dlsch structures\n"); exit(-1); } - PHY_vars_eNB->dlsch_eNB[0][i]->rnti = 14; - PHY_vars_UE->dlsch_ue[0][i]->rnti = 14; + eNB->dlsch[0][i]->rnti = 14; + UE->dlsch[0][i]->rnti = 14; } - switch (PHY_vars_eNB->lte_frame_parms.N_RB_UL) { + switch (eNB->frame_parms.N_RB_UL) { case 6: break; case 25: - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; @@ -676,8 +677,8 @@ int main(int argc, char **argv) ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; } else { ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; @@ -688,10 +689,10 @@ int main(int argc, char **argv) break; case 50: - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; @@ -700,8 +701,8 @@ int main(int argc, char **argv) ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; } else { ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; @@ -712,10 +713,10 @@ int main(int argc, char **argv) break; case 100: - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { + if (eNB->frame_parms.frame_type == TDD) { ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; @@ -724,8 +725,8 @@ int main(int argc, char **argv) ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; } else { ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; @@ -740,47 +741,45 @@ int main(int argc, char **argv) } - PHY_vars_UE->PHY_measurements.rank[0] = 0; - PHY_vars_UE->transmission_mode[0] = 2; - PHY_vars_UE->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing; - PHY_vars_eNB->transmission_mode[0] = 2; - PHY_vars_eNB->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing; - PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; - PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; - PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; - PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; - PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; - PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; - PHY_vars_UE->frame_tx=1; + UE->measurements.rank[0] = 0; + UE->transmission_mode[0] = 2; + UE->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing; + eNB->transmission_mode[0] = 2; + eNB->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing; + UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; + eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; + UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; + eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; + UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; + eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; - for (sf=0; sf<10; sf++) { - PHY_vars_eNB->proc[sf].frame_tx=1; - PHY_vars_eNB->proc[sf].subframe_tx=sf; - PHY_vars_eNB->proc[sf].frame_rx=1; - PHY_vars_eNB->proc[sf].subframe_rx=sf; - } + + + + eNB->proc.frame_rx=1; + eNB->proc.subframe_rx=subframe; + + eNB->proc.frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe); + eNB->proc.subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe); + + UE->frame_tx = eNB->proc.frame_rx; + UE->frame_rx = eNB->proc.frame_tx; printf("Init UL hopping UE\n"); - init_ul_hopping(&PHY_vars_UE->lte_frame_parms); + init_ul_hopping(&UE->frame_parms); printf("Init UL hopping eNB\n"); - init_ul_hopping(&PHY_vars_eNB->lte_frame_parms); + init_ul_hopping(&eNB->frame_parms); - PHY_vars_eNB->proc[subframe].frame_rx = PHY_vars_UE->frame_tx; - if (ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe) > subframe) // allocation was in previous frame - PHY_vars_eNB->proc[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].frame_tx = (PHY_vars_UE->frame_tx-1)&1023; - - PHY_vars_UE->dlsch_ue[0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].send_harq_status = 1; + UE->dlsch[0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&eNB->frame_parms,subframe)].send_harq_status = 1; - // printf("UE frame %d, eNB frame %d (eNB frame_tx %d)\n",PHY_vars_UE->frame,PHY_vars_eNB->proc[subframe].frame_rx,PHY_vars_eNB->proc[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].frame_tx); - PHY_vars_UE->frame_tx = (PHY_vars_UE->frame_tx-1)&1023; generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu, 14, - ul_subframe2pdcch_alloc_subframe(&PHY_vars_UE->lte_frame_parms,subframe), + eNB->proc.subframe_tx, format0, - PHY_vars_UE, + UE, SI_RNTI, 0, P_RNTI, @@ -790,13 +789,12 @@ int main(int argc, char **argv) // printf("RIV %d\n",UL_alloc_pdu.rballoc); - generate_eNB_ulsch_params_from_dci((void *)&UL_alloc_pdu, + generate_eNB_ulsch_params_from_dci(eNB, + (void *)&UL_alloc_pdu, 14, - ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe), format0, 0, - PHY_vars_eNB, - SI_RNTI, + SI_RNTI, 0, P_RNTI, CBA_RNTI, @@ -804,15 +802,13 @@ int main(int argc, char **argv) coded_bits_per_codeword = nb_rb * (12 * get_Qm_ul(mcs)) * nsymb; - if (cqi_flag == 1) coded_bits_per_codeword-=PHY_vars_UE->ulsch_ue[0]->O; + if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O; rate = (double)dlsch_tbs25[get_I_TBS(mcs)][nb_rb-1]/(coded_bits_per_codeword); printf("Rate = %f (mod %d), coded bits %d\n",rate,get_Qm_ul(mcs),coded_bits_per_codeword); - PHY_vars_UE->frame_tx = (PHY_vars_UE->frame_tx+1)&1023; - for (ch_realization=0; ch_realization5) || (subframe < 4)) - // PHY_vars_UE->frame++; + // UE->frame++; for (SNR=snr0; SNRlte_frame_parms,PHY_vars_UE->frame_tx,subframe); - input_buffer_length = PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/8; + harq_pid = subframe2harq_pid(&UE->frame_parms,UE->frame_tx,subframe); + input_buffer_length = UE->ulsch[0]->harq_processes[harq_pid]->TBS/8; input_buffer = (unsigned char *)malloc(input_buffer_length+4); - // printf("UL frame %d/subframe %d, harq_pid %d\n",PHY_vars_UE->frame,subframe,harq_pid); + // printf("UL frame %d/subframe %d, harq_pid %d\n",UE->frame,subframe,harq_pid); if (input_fdUL == NULL) { @@ -904,33 +900,33 @@ int main(int argc, char **argv) avg_iter = 0; iter_trials=0; - reset_meas(&PHY_vars_UE->phy_proc_tx); - reset_meas(&PHY_vars_UE->ofdm_mod_stats); - reset_meas(&PHY_vars_UE->ulsch_modulation_stats); - reset_meas(&PHY_vars_UE->ulsch_encoding_stats); - reset_meas(&PHY_vars_UE->ulsch_interleaving_stats); - reset_meas(&PHY_vars_UE->ulsch_rate_matching_stats); - reset_meas(&PHY_vars_UE->ulsch_turbo_encoding_stats); - reset_meas(&PHY_vars_UE->ulsch_segmentation_stats); - reset_meas(&PHY_vars_UE->ulsch_multiplexing_stats); + reset_meas(&UE->phy_proc_tx); + reset_meas(&UE->ofdm_mod_stats); + reset_meas(&UE->ulsch_modulation_stats); + reset_meas(&UE->ulsch_encoding_stats); + reset_meas(&UE->ulsch_interleaving_stats); + reset_meas(&UE->ulsch_rate_matching_stats); + reset_meas(&UE->ulsch_turbo_encoding_stats); + reset_meas(&UE->ulsch_segmentation_stats); + reset_meas(&UE->ulsch_multiplexing_stats); - reset_meas(&PHY_vars_eNB->phy_proc_rx); - reset_meas(&PHY_vars_eNB->ofdm_demod_stats); - reset_meas(&PHY_vars_eNB->ulsch_channel_estimation_stats); - reset_meas(&PHY_vars_eNB->ulsch_freq_offset_estimation_stats); - reset_meas(&PHY_vars_eNB->rx_dft_stats); - reset_meas(&PHY_vars_eNB->ulsch_decoding_stats); - reset_meas(&PHY_vars_eNB->ulsch_turbo_decoding_stats); - reset_meas(&PHY_vars_eNB->ulsch_deinterleaving_stats); - reset_meas(&PHY_vars_eNB->ulsch_demultiplexing_stats); - reset_meas(&PHY_vars_eNB->ulsch_rate_unmatching_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_init_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_alpha_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_beta_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_gamma_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_ext_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_intl1_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_intl2_stats); + reset_meas(&eNB->phy_proc_rx); + reset_meas(&eNB->ofdm_demod_stats); + reset_meas(&eNB->ulsch_channel_estimation_stats); + reset_meas(&eNB->ulsch_freq_offset_estimation_stats); + reset_meas(&eNB->rx_dft_stats); + reset_meas(&eNB->ulsch_decoding_stats); + reset_meas(&eNB->ulsch_turbo_decoding_stats); + reset_meas(&eNB->ulsch_deinterleaving_stats); + reset_meas(&eNB->ulsch_demultiplexing_stats); + reset_meas(&eNB->ulsch_rate_unmatching_stats); + reset_meas(&eNB->ulsch_tc_init_stats); + reset_meas(&eNB->ulsch_tc_alpha_stats); + reset_meas(&eNB->ulsch_tc_beta_stats); + reset_meas(&eNB->ulsch_tc_gamma_stats); + reset_meas(&eNB->ulsch_tc_ext_stats); + reset_meas(&eNB->ulsch_tc_intl1_stats); + reset_meas(&eNB->ulsch_tc_intl2_stats); // initialization struct list time_vector_tx; @@ -953,28 +949,28 @@ int main(int argc, char **argv) for (trials = 0; trialsframe++; - // PHY_vars_eNB->frame++; + // UE->frame++; + // eNB->frame++; fflush(stdout); round=0; while (round < 4) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->round=round; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->round=round; + eNB->ulsch[0]->harq_processes[harq_pid]->round=round; + UE->ulsch[0]->harq_processes[harq_pid]->round=round; // printf("Trial %d : Round %d ",trials,round); round_trials[round]++; if (round == 0) { - //PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 1; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->rvidx = round>>1; - //PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 1; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->rvidx = round>>1; + //eNB->ulsch[0]->harq_processes[harq_pid]->Ndi = 1; + eNB->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1; + //UE->ulsch[0]->harq_processes[harq_pid]->Ndi = 1; + UE->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1; } else { - //PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 0; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->rvidx = round>>1; - //PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 0; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->rvidx = round>>1; + //eNB->ulsch[0]->harq_processes[harq_pid]->Ndi = 0; + eNB->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1; + //UE->ulsch[0]->harq_processes[harq_pid]->Ndi = 0; + UE->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1; } @@ -996,39 +992,39 @@ int main(int argc, char **argv) if (input_fdUL == NULL) { - start_meas(&PHY_vars_UE->phy_proc_tx); + start_meas(&UE->phy_proc_tx); #ifdef OFDMA_ULSCH if (srs_flag) - generate_srs_tx(PHY_vars_UE,0,AMP,subframe); + generate_srs_tx(UE,0,AMP,subframe); - generate_drs_pusch(PHY_vars_UE,0,AMP,subframe,first_rb,nb_rb,0); + generate_drs_pusch(UE,0,AMP,subframe,first_rb,nb_rb,0); #else if (srs_flag) - generate_srs_tx(PHY_vars_UE,0,AMP,subframe); + generate_srs_tx(UE,0,AMP,subframe); - generate_drs_pusch(PHY_vars_UE,0, + generate_drs_pusch(UE,0, AMP,subframe, - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->first_rb, - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->nb_rb, + UE->ulsch[0]->harq_processes[harq_pid]->first_rb, + UE->ulsch[0]->harq_processes[harq_pid]->nb_rb, 0); #endif if ((cqi_flag == 1) && (n_frames == 1) ) { - printf("CQI information (O %d) %d %d\n",PHY_vars_UE->ulsch_ue[0]->O, - PHY_vars_UE->ulsch_ue[0]->o[0],PHY_vars_UE->ulsch_ue[0]->o[1]); - print_CQI(PHY_vars_UE->ulsch_ue[0]->o,PHY_vars_UE->ulsch_ue[0]->uci_format,PHY_vars_UE->lte_frame_parms.N_RB_DL,0); + printf("CQI information (O %d) %d %d\n",UE->ulsch[0]->O, + UE->ulsch[0]->o[0],UE->ulsch[0]->o[1]); + print_CQI(UE->ulsch[0]->o,UE->ulsch[0]->uci_format,UE->frame_parms.N_RB_DL,0); } - PHY_vars_UE->ulsch_ue[0]->o_ACK[0] = taus()&1; + UE->ulsch[0]->o_ACK[0] = taus()&1; - start_meas(&PHY_vars_UE->ulsch_encoding_stats); + start_meas(&UE->ulsch_encoding_stats); if (ulsch_encoding(input_buffer, - PHY_vars_UE, + UE, harq_pid, eNB_id, 2, // transmission mode @@ -1039,52 +1035,52 @@ int main(int argc, char **argv) exit(-1); } - stop_meas(&PHY_vars_UE->ulsch_encoding_stats); + stop_meas(&UE->ulsch_encoding_stats); - start_meas(&PHY_vars_UE->ulsch_modulation_stats); + start_meas(&UE->ulsch_modulation_stats); #ifdef OFDMA_ULSCH - ulsch_modulation(PHY_vars_UE->lte_ue_common_vars.txdataF,AMP, - PHY_vars_UE->frame_tx,subframe,&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->ulsch_ue[0]); + ulsch_modulation(UE->common_vars.txdataF,AMP, + UE->frame_tx,subframe,&UE->frame_parms,UE->ulsch[0]); #else // printf("Generating PUSCH in subframe %d with amp %d, nb_rb %d\n",subframe,AMP,nb_rb); - ulsch_modulation(PHY_vars_UE->lte_ue_common_vars.txdataF,AMP, - PHY_vars_UE->frame_tx,subframe,&PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->ulsch_ue[0]); + ulsch_modulation(UE->common_vars.txdataF,AMP, + UE->frame_tx,subframe,&UE->frame_parms, + UE->ulsch[0]); #endif - stop_meas(&PHY_vars_UE->ulsch_modulation_stats); + stop_meas(&UE->ulsch_modulation_stats); if (n_frames==1) { - write_output("txsigF0UL.m","txsF0", &PHY_vars_UE->lte_ue_common_vars.txdataF[0][PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb*subframe],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1, + write_output("txsigF0UL.m","txsF0", &UE->common_vars.txdataF[0][eNB->frame_parms.ofdm_symbol_size*nsymb*subframe],eNB->frame_parms.ofdm_symbol_size*nsymb,1, 1); - //write_output("txsigF1.m","txsF1", PHY_vars_UE->lte_ue_common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + //write_output("txsigF1.m","txsF1", UE->common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); } tx_lev=0; - start_meas(&PHY_vars_UE->ofdm_mod_stats); + start_meas(&UE->ofdm_mod_stats); for (aa=0; aa<1; aa++) { if (frame_parms->Ncp == EXTENDED) - PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input - &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], // output - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size, + PHY_ofdm_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input + &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], // output + UE->frame_parms.ofdm_symbol_size, nsymb, // number of symbols - PHY_vars_UE->lte_frame_parms.nb_prefix_samples, // number of prefix samples + UE->frame_parms.nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else - normal_prefix_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], - &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], + normal_prefix_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], + &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], nsymb, frame_parms); #ifndef OFDMA_ULSCH - apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],subframe<<1); - apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],1+(subframe<<1)); + apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1); + apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1)); #endif - stop_meas(&PHY_vars_UE->ofdm_mod_stats); - stop_meas(&PHY_vars_UE->phy_proc_tx); - tx_lev += signal_energy(&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], - PHY_vars_eNB->lte_frame_parms.samples_per_tti); + stop_meas(&UE->ofdm_mod_stats); + stop_meas(&UE->phy_proc_tx); + tx_lev += signal_energy(&txdata[aa][eNB->frame_parms.samples_per_tti*subframe], + eNB->frame_parms.samples_per_tti); } } // input_fd == NULL @@ -1093,17 +1089,17 @@ int main(int argc, char **argv) tx_lev_dB = (unsigned int) dB_fixed_times10(tx_lev); if (n_frames==1) { - write_output("txsig0UL.m","txs0", &txdata[0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); - // write_output("txsig1UL.m","txs1", &txdata[1][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); + write_output("txsig0UL.m","txs0", &txdata[0][eNB->frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); + // write_output("txsig1UL.m","txs1", &txdata[1][eNB->frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); } //AWGN //Set target wideband RX noise level to N0 - sigma2_dB = N0;//10*log10((double)tx_lev) +10*log10(PHY_vars_UE->lte_frame_parms.ofdm_symbol_size/(PHY_vars_UE->lte_frame_parms.N_RB_DL*12)) - SNR; + sigma2_dB = N0;//10*log10((double)tx_lev) +10*log10(UE->frame_parms.ofdm_symbol_size/(UE->frame_parms.N_RB_DL*12)) - SNR; sigma2 = pow(10,sigma2_dB/10); // compute tx_gain to achieve target SNR (per resource element!) - tx_gain = sqrt(pow(10.0,.1*(N0+SNR))*(nb_rb*12/(double)PHY_vars_UE->lte_frame_parms.ofdm_symbol_size)/(double)tx_lev); + tx_gain = sqrt(pow(10.0,.1*(N0+SNR))*(nb_rb*12/(double)UE->frame_parms.ofdm_symbol_size)/(double)tx_lev); if (n_frames==1) printf("tx_lev = %d (%d.%d dB,%f), gain %f\n",tx_lev,tx_lev_dB/10,tx_lev_dB,10*log10((double)tx_lev),10*log10(tx_gain)); @@ -1111,29 +1107,29 @@ int main(int argc, char **argv) // fill measurement symbol (19) with noise for (i=0; ilte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } // multipath channel - for (i=0; ilte_frame_parms.samples_per_tti; i++) { + for (i=0; iframe_parms.samples_per_tti; i++) { for (aa=0; aa<1; aa++) { - s_re[aa][i] = ((double)(((short *)&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe]))[(i<<1)]); - s_im[aa][i] = ((double)(((short *)&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe]))[(i<<1)+1]); + s_re[aa][i] = ((double)(((short *)&txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)]); + s_im[aa][i] = ((double)(((short *)&txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)+1]); } } if (awgn_flag == 0) { if (UE2eNB->max_Doppler == 0) { multipath_channel(UE2eNB,s_re,s_im,r_re,r_im, - PHY_vars_eNB->lte_frame_parms.samples_per_tti,hold_channel); + eNB->frame_parms.samples_per_tti,hold_channel); } else { multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im, - 2*PHY_vars_eNB->lte_frame_parms.samples_per_tti,hold_channel); + 2*eNB->frame_parms.samples_per_tti,hold_channel); } } @@ -1169,61 +1165,61 @@ int main(int argc, char **argv) if (n_frames==1) printf("Sigma2 %f (sigma2_dB %f), tx_gain %f (%f dB)\n",sigma2,sigma2_dB,tx_gain,20*log10(tx_gain)); - for (i=0; ilte_frame_parms.samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe])[2*i] = (short) ((tx_gain*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe])[2*i+1] = (short) ((tx_gain*r_im[aa][i]) + (iqim*tx_gain*r_re[aa][i]) + sqrt( + for (i=0; iframe_parms.samples_per_tti; i++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { + ((short*) &eNB->common_vars.rxdata[0][aa][eNB->frame_parms.samples_per_tti*subframe])[2*i] = (short) ((tx_gain*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + ((short*) &eNB->common_vars.rxdata[0][aa][eNB->frame_parms.samples_per_tti*subframe])[2*i+1] = (short) ((tx_gain*r_im[aa][i]) + (iqim*tx_gain*r_re[aa][i]) + sqrt( sigma2/2)*gaussdouble(0.0,1.0)); } } if (n_frames==1) { printf("rx_level Null symbol %f\n",10*log10((double)signal_energy((int*) - &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][(PHY_vars_eNB->lte_frame_parms.samples_per_tti<<1) -PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); - printf("rx_level data symbol %f\n",10*log10(signal_energy((int*)&PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][160+(PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe)], + &eNB->common_vars.rxdata[0][0][(eNB->frame_parms.samples_per_tti<<1) -eNB->frame_parms.ofdm_symbol_size],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); + printf("rx_level data symbol %f\n",10*log10(signal_energy((int*)&eNB->common_vars.rxdata[0][0][160+(eNB->frame_parms.samples_per_tti*subframe)], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); } - SNRmeas = 10*log10(((double)signal_energy((int*)&PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][160+(PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe)], + SNRmeas = 10*log10(((double)signal_energy((int*)&eNB->common_vars.rxdata[0][0][160+(eNB->frame_parms.samples_per_tti*subframe)], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))/((double)signal_energy((int*) - &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][(PHY_vars_eNB->lte_frame_parms.samples_per_tti<<1) -PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)) - 1)+10*log10(PHY_vars_eNB->lte_frame_parms.N_RB_UL/nb_rb); + &eNB->common_vars.rxdata[0][0][(eNB->frame_parms.samples_per_tti<<1) -eNB->frame_parms.ofdm_symbol_size], + OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)) - 1)+10*log10(eNB->frame_parms.N_RB_UL/nb_rb); if (n_frames==1) { printf("SNRmeas %f\n",SNRmeas); - // write_output("rxsig0UL.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); - //write_output("rxsig1UL.m","rxs1", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); + // write_output("rxsig0UL.m","rxs0", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); + //write_output("rxsig1UL.m","rxs1", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); } #ifndef OFDMA_ULSCH - remove_7_5_kHz(PHY_vars_eNB,subframe<<1); - remove_7_5_kHz(PHY_vars_eNB,1+(subframe<<1)); - // write_output("rxsig0_75.m","rxs0_75", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); - // write_output("rxsig1_75.m","rxs1_75", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); + remove_7_5_kHz(eNB,subframe<<1); + remove_7_5_kHz(eNB,1+(subframe<<1)); + // write_output("rxsig0_75.m","rxs0_75", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); + // write_output("rxsig1_75.m","rxs1_75", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); #endif - start_meas(&PHY_vars_eNB->phy_proc_rx); - start_meas(&PHY_vars_eNB->ofdm_demod_stats); - lte_eNB_I0_measurements(PHY_vars_eNB, + start_meas(&eNB->phy_proc_rx); + start_meas(&eNB->ofdm_demod_stats); + lte_eNB_I0_measurements(eNB, subframe, 0, 1); - for (l=subframe*PHY_vars_UE->lte_frame_parms.symbols_per_tti; l<((1+subframe)*PHY_vars_UE->lte_frame_parms.symbols_per_tti); l++) { + for (l=subframe*UE->frame_parms.symbols_per_tti; l<((1+subframe)*UE->frame_parms.symbols_per_tti); l++) { - slot_fep_ul(&PHY_vars_eNB->lte_frame_parms, - &PHY_vars_eNB->lte_eNB_common_vars, - l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), - l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), + slot_fep_ul(&eNB->frame_parms, + &eNB->common_vars, + l%(eNB->frame_parms.symbols_per_tti/2), + l/(eNB->frame_parms.symbols_per_tti/2), 0, 0); } - stop_meas(&PHY_vars_eNB->ofdm_demod_stats); + stop_meas(&eNB->ofdm_demod_stats); - PHY_vars_eNB->ulsch_eNB[0]->cyclicShift = cyclic_shift;// cyclic shift for DMRS + eNB->ulsch[0]->cyclicShift = cyclic_shift;// cyclic shift for DMRS /* if(abstx) { @@ -1233,14 +1229,13 @@ int main(int argc, char **argv) } */ - start_meas(&PHY_vars_eNB->ulsch_demodulation_stats); - rx_ulsch(PHY_vars_eNB, - subframe, + start_meas(&eNB->ulsch_demodulation_stats); + rx_ulsch(eNB, 0, // this is the effective sector id 0, // this is the UE_id - PHY_vars_eNB->ulsch_eNB, + eNB->ulsch, cooperation_flag); - stop_meas(&PHY_vars_eNB->ulsch_demodulation_stats); + stop_meas(&eNB->ulsch_demodulation_stats); /* if(abstx) { @@ -1249,31 +1244,30 @@ int main(int argc, char **argv) if(trials==0 && round==0 && SNR==snr0) { char* namepointer ; namepointer = &fperen_name; - write_output(namepointer, "xxx" ,PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300,1,10); + write_output(namepointer, "xxx" ,eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300,1,10); namepointer = NULL ; // flagMag = 1; } } */ - start_meas(&PHY_vars_eNB->ulsch_decoding_stats); + start_meas(&eNB->ulsch_decoding_stats); - ret= ulsch_decoding(PHY_vars_eNB, + ret= ulsch_decoding(eNB, 0, // UE_id - subframe, control_only_flag, 1, // Nbundled llr8_flag); - stop_meas(&PHY_vars_eNB->ulsch_decoding_stats); - stop_meas(&PHY_vars_eNB->phy_proc_rx); + stop_meas(&eNB->ulsch_decoding_stats); + stop_meas(&eNB->phy_proc_rx); if (cqi_flag > 0) { cqi_error = 0; - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Or1 < 32) { + if (eNB->ulsch[0]->harq_processes[harq_pid]->Or1 < 32) { for (i=2; i<4; i++) { - // printf("cqi %d : %d (%d)\n",i,PHY_vars_eNB->ulsch_eNB[0]->o[i],PHY_vars_UE->ulsch_ue[0]->o[i]); - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o[i] != PHY_vars_UE->ulsch_ue[0]->o[i]) + // printf("cqi %d : %d (%d)\n",i,eNB->ulsch[0]->o[i],UE->ulsch[0]->o[i]); + if (eNB->ulsch[0]->harq_processes[harq_pid]->o[i] != UE->ulsch[0]->o[i]) cqi_error = 1; } } else { @@ -1283,33 +1277,33 @@ int main(int argc, char **argv) if (cqi_error == 1) { cqi_errors++; - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status == 1) + if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status == 1) cqi_crc_falsepositives++; } else { - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status == 0) + if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status == 0) cqi_crc_falsenegatives++; } } - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0] != PHY_vars_UE->ulsch_ue[0]->o_ACK[0]) + if (eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0] != UE->ulsch[0]->o_ACK[0]) ack_errors++; // printf("ulsch_coding: O[%d] %d\n",i,o_flip[i]); - if (ret <= PHY_vars_eNB->ulsch_eNB[0]->max_turbo_iterations) { + if (ret <= eNB->ulsch[0]->max_turbo_iterations) { avg_iter += ret; iter_trials++; if (n_frames==1) { - printf("No ULSCH errors found, o_ACK[0]= %d, cqi_crc_status=%d\n",PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0],PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status); + printf("No ULSCH errors found, o_ACK[0]= %d, cqi_crc_status=%d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0],eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status); - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status==1) - print_CQI(PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o, - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->uci_format,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL); + if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status==1) + print_CQI(eNB->ulsch[0]->harq_processes[harq_pid]->o, + eNB->ulsch[0]->harq_processes[harq_pid]->uci_format,0,eNB->frame_parms.N_RB_DL); - dump_ulsch(PHY_vars_eNB,subframe,0); + dump_ulsch(eNB,0); exit(-1); } @@ -1321,24 +1315,24 @@ int main(int argc, char **argv) errs[round]++; if (n_frames==1) { - printf("ULSCH errors found o_ACK[0]= %d\n",PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0]); + printf("ULSCH errors found o_ACK[0]= %d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0]); - for (s=0; sulsch_eNB[0]->harq_processes[harq_pid]->C; s++) { - if (sulsch_eNB[0]->harq_processes[harq_pid]->Cminus) - Kr = PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kminus; + for (s=0; sulsch[0]->harq_processes[harq_pid]->C; s++) { + if (sulsch[0]->harq_processes[harq_pid]->Cminus) + Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus; else - Kr = PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kplus; + Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus; Kr_bytes = Kr>>3; printf("Decoded_output (Segment %d):\n",s); for (i=0; iulsch_eNB[0]->harq_processes[harq_pid]->c[s][i], - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->c[s][i]^PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->c[s][i]); + printf("%d : %x (%x)\n",i,eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i], + eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i]^UE->ulsch[0]->harq_processes[harq_pid]->c[s][i]); } - dump_ulsch(PHY_vars_eNB,subframe,0); + dump_ulsch(eNB,0); exit(-1); } @@ -1356,20 +1350,20 @@ int main(int argc, char **argv) break; if (xforms==1) - phy_scope_eNB(form_enb,PHY_vars_eNB,0); + phy_scope_eNB(form_enb,eNB,0); /*calculate the total processing time for each packet, get the max, min, and number of packets that exceed t>3000us*/ - double t_tx = (double)PHY_vars_UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; - double t_tx_ifft = (double)PHY_vars_UE->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; - double t_tx_mod = (double)PHY_vars_UE->ulsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; - double t_tx_enc = (double)PHY_vars_UE->ulsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx = (double)UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; + double t_tx_ifft = (double)UE->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_mod = (double)UE->ulsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_enc = (double)UE->ulsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx = (double)PHY_vars_eNB->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; - double t_rx_fft = (double)PHY_vars_eNB->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx_demod = (double)PHY_vars_eNB->ulsch_demodulation_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx_dec = (double)PHY_vars_eNB->ulsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx = (double)eNB->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; + double t_rx_fft = (double)eNB->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_demod = (double)eNB->ulsch_demodulation_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_dec = (double)eNB->ulsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; if (t_tx > t_tx_max) t_tx_max = t_tx; @@ -1492,12 +1486,12 @@ int main(int argc, char **argv) tx_lev_dB, 20*log10(tx_gain), (double)N0, - PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB, - get_hundred_times_delta_IF(PHY_vars_UE,eNB_id,harq_pid) , - dB_fixed(PHY_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0]), - dB_fixed(PHY_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[1]), - PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[1]); + eNB->measurements[0].n0_power_tot_dB, + get_hundred_times_delta_IF(UE,eNB_id,harq_pid) , + dB_fixed(eNB->pusch_vars[0]->ulsch_power[0]), + dB_fixed(eNB->pusch_vars[0]->ulsch_power[1]), + eNB->measurements->n0_power_dB[0], + eNB->measurements->n0_power_dB[1]); effective_rate = ((double)(round_trials[0])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3])); @@ -1519,7 +1513,7 @@ int main(int argc, char **argv) rate, rate*get_Qm_ul(mcs), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + (double)eNB->ulsch[0]->harq_processes[harq_pid]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); if (cqi_flag >0) { @@ -1529,7 +1523,7 @@ int main(int argc, char **argv) cqi_crc_falsenegatives,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]); } - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0] > 0) + if (eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0] > 0) printf("ACK/NAK errors %d/%d\n",ack_errors,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]); @@ -1537,7 +1531,7 @@ int main(int argc, char **argv) SNR, mcs, nb_rb, - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + eNB->ulsch[0]->harq_processes[harq_pid]->TBS, rate, errs[0], round_trials[0], @@ -1551,101 +1545,101 @@ int main(int argc, char **argv) if (dump_perf==1) { printf("UE TX function statistics (per 1ms subframe)\n\n"); - std_phy_proc_tx = sqrt((double)PHY_vars_UE->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->phy_proc_tx.trials - pow((double)PHY_vars_UE->phy_proc_tx.diff/PHY_vars_UE->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc tx :%f us (%d trials)\n",(double)PHY_vars_UE->phy_proc_tx.diff/PHY_vars_UE->phy_proc_tx.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->phy_proc_tx.trials); + std_phy_proc_tx = sqrt((double)UE->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->phy_proc_tx.trials - pow((double)UE->phy_proc_tx.diff/UE->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc tx :%f us (%d trials)\n",(double)UE->phy_proc_tx.diff/UE->phy_proc_tx.trials/cpu_freq_GHz/1000.0,UE->phy_proc_tx.trials); printf("|__ Statistics std: %f us max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped); - std_phy_proc_tx_ifft = sqrt((double)PHY_vars_UE->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->ofdm_mod_stats.trials - pow((double)PHY_vars_UE->ofdm_mod_stats.diff/PHY_vars_UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); - printf("OFDM_mod time :%f us (%d trials)\n",(double)PHY_vars_UE->ofdm_mod_stats.diff/PHY_vars_UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ofdm_mod_stats.trials); + std_phy_proc_tx_ifft = sqrt((double)UE->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ofdm_mod_stats.trials - pow((double)UE->ofdm_mod_stats.diff/UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); + printf("OFDM_mod time :%f us (%d trials)\n",(double)UE->ofdm_mod_stats.diff/UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,UE->ofdm_mod_stats.trials); printf("|__ Statistics std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); - std_phy_proc_tx_mod = sqrt((double)PHY_vars_UE->ulsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->ulsch_modulation_stats.trials - pow((double)PHY_vars_UE->ulsch_modulation_stats.diff/PHY_vars_UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); - printf("ULSCH modulation time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_modulation_stats.diff/PHY_vars_UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->ulsch_modulation_stats.trials); + std_phy_proc_tx_mod = sqrt((double)UE->ulsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ulsch_modulation_stats.trials - pow((double)UE->ulsch_modulation_stats.diff/UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); + printf("ULSCH modulation time :%f us (%d trials)\n",(double)UE->ulsch_modulation_stats.diff/UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000.0, + UE->ulsch_modulation_stats.trials); printf("|__ Statistics std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3); - std_phy_proc_tx_enc = sqrt((double)PHY_vars_UE->ulsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->ulsch_encoding_stats.trials - pow((double)PHY_vars_UE->ulsch_encoding_stats.diff/PHY_vars_UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); - printf("ULSCH encoding time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_encoding_stats.diff/PHY_vars_UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->ulsch_encoding_stats.trials); + std_phy_proc_tx_enc = sqrt((double)UE->ulsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ulsch_encoding_stats.trials - pow((double)UE->ulsch_encoding_stats.diff/UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("ULSCH encoding time :%f us (%d trials)\n",(double)UE->ulsch_encoding_stats.diff/UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000.0, + UE->ulsch_encoding_stats.trials); printf("|__ Statistics std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3); - printf("|__ ULSCH segmentation time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_segmentation_stats.diff/PHY_vars_UE->ulsch_segmentation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->ulsch_segmentation_stats.trials); + printf("|__ ULSCH segmentation time :%f us (%d trials)\n",(double)UE->ulsch_segmentation_stats.diff/UE->ulsch_segmentation_stats.trials/cpu_freq_GHz/1000.0, + UE->ulsch_segmentation_stats.trials); printf("|__ ULSCH turbo encoding time :%f us (%d trials)\n", - ((double)PHY_vars_UE->ulsch_turbo_encoding_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double) - PHY_vars_UE->ulsch_turbo_encoding_stats.diff/PHY_vars_UE->ulsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_turbo_encoding_stats.trials); + ((double)UE->ulsch_turbo_encoding_stats.trials/UE->ulsch_encoding_stats.trials)*(double) + UE->ulsch_turbo_encoding_stats.diff/UE->ulsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_turbo_encoding_stats.trials); printf("|__ ULSCH rate-matching time :%f us (%d trials)\n", - ((double)PHY_vars_UE->ulsch_rate_matching_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double) - PHY_vars_UE->ulsch_rate_matching_stats.diff/PHY_vars_UE->ulsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_rate_matching_stats.trials); + ((double)UE->ulsch_rate_matching_stats.trials/UE->ulsch_encoding_stats.trials)*(double) + UE->ulsch_rate_matching_stats.diff/UE->ulsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_rate_matching_stats.trials); printf("|__ ULSCH sub-block interleaving time :%f us (%d trials)\n", - ((double)PHY_vars_UE->ulsch_interleaving_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double) - PHY_vars_UE->ulsch_interleaving_stats.diff/PHY_vars_UE->ulsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_interleaving_stats.trials); + ((double)UE->ulsch_interleaving_stats.trials/UE->ulsch_encoding_stats.trials)*(double) + UE->ulsch_interleaving_stats.diff/UE->ulsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_interleaving_stats.trials); printf("|__ ULSCH multiplexing time :%f us (%d trials)\n", - ((double)PHY_vars_UE->ulsch_multiplexing_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double) - PHY_vars_UE->ulsch_multiplexing_stats.diff/PHY_vars_UE->ulsch_multiplexing_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_multiplexing_stats.trials); + ((double)UE->ulsch_multiplexing_stats.trials/UE->ulsch_encoding_stats.trials)*(double) + UE->ulsch_multiplexing_stats.diff/UE->ulsch_multiplexing_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_multiplexing_stats.trials); printf("\n\neNB RX function statistics (per 1ms subframe)\n\n"); - std_phy_proc_rx = sqrt((double)PHY_vars_eNB->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->phy_proc_rx.trials - pow((double)PHY_vars_eNB->phy_proc_rx.diff/PHY_vars_eNB->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc rx :%f us (%d trials)\n",(double)PHY_vars_eNB->phy_proc_rx.diff/PHY_vars_eNB->phy_proc_rx.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->phy_proc_rx.trials); + std_phy_proc_rx = sqrt((double)eNB->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->phy_proc_rx.trials - pow((double)eNB->phy_proc_rx.diff/eNB->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc rx :%f us (%d trials)\n",(double)eNB->phy_proc_rx.diff/eNB->phy_proc_rx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_rx.trials); printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, rx_q1, rx_q3, n_rx_dropped); - std_phy_proc_rx_fft = sqrt((double)PHY_vars_eNB->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->ofdm_demod_stats.trials - pow((double)PHY_vars_eNB->ofdm_demod_stats.diff/PHY_vars_eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); - printf("OFDM_demod time :%f us (%d trials)\n",(double)PHY_vars_eNB->ofdm_demod_stats.diff/PHY_vars_eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->ofdm_demod_stats.trials); + std_phy_proc_rx_fft = sqrt((double)eNB->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ofdm_demod_stats.trials - pow((double)eNB->ofdm_demod_stats.diff/eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); + printf("OFDM_demod time :%f us (%d trials)\n",(double)eNB->ofdm_demod_stats.diff/eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, + eNB->ofdm_demod_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3); - std_phy_proc_rx_demod = sqrt((double)PHY_vars_eNB->ulsch_demodulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->ulsch_demodulation_stats.trials - pow((double)PHY_vars_eNB->ulsch_demodulation_stats.diff/PHY_vars_eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000,2)); - printf("ULSCH demodulation time :%f us (%d trials)\n",(double)PHY_vars_eNB->ulsch_demodulation_stats.diff/PHY_vars_eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->ulsch_demodulation_stats.trials); + std_phy_proc_rx_demod = sqrt((double)eNB->ulsch_demodulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ulsch_demodulation_stats.trials - pow((double)eNB->ulsch_demodulation_stats.diff/eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000,2)); + printf("ULSCH demodulation time :%f us (%d trials)\n",(double)eNB->ulsch_demodulation_stats.diff/eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000.0, + eNB->ulsch_demodulation_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3); - std_phy_proc_rx_dec = sqrt((double)PHY_vars_eNB->ulsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->ulsch_decoding_stats.trials - pow((double)PHY_vars_eNB->ulsch_decoding_stats.diff/PHY_vars_eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000,2)); + std_phy_proc_rx_dec = sqrt((double)eNB->ulsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ulsch_decoding_stats.trials - pow((double)eNB->ulsch_decoding_stats.diff/eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000,2)); printf("ULSCH Decoding time (%.2f Mbit/s, avg iter %f) :%f us (%d trials, max %f)\n", - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/1000.0,(double)avg_iter/iter_trials, - (double)PHY_vars_eNB->ulsch_decoding_stats.diff/PHY_vars_eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_decoding_stats.trials, - (double)PHY_vars_eNB->ulsch_decoding_stats.max/cpu_freq_GHz/1000.0); + UE->ulsch[0]->harq_processes[harq_pid]->TBS/1000.0,(double)avg_iter/iter_trials, + (double)eNB->ulsch_decoding_stats.diff/eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_decoding_stats.trials, + (double)eNB->ulsch_decoding_stats.max/cpu_freq_GHz/1000.0); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3); printf("|__ sub-block interleaving %f us (%d trials)\n", - (double)PHY_vars_eNB->ulsch_deinterleaving_stats.diff/PHY_vars_eNB->ulsch_deinterleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_deinterleaving_stats.trials); + (double)eNB->ulsch_deinterleaving_stats.diff/eNB->ulsch_deinterleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_deinterleaving_stats.trials); printf("|__ demultiplexing %f us (%d trials)\n", - (double)PHY_vars_eNB->ulsch_demultiplexing_stats.diff/PHY_vars_eNB->ulsch_demultiplexing_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_demultiplexing_stats.trials); + (double)eNB->ulsch_demultiplexing_stats.diff/eNB->ulsch_demultiplexing_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_demultiplexing_stats.trials); printf("|__ rate-matching %f us (%d trials)\n", - (double)PHY_vars_eNB->ulsch_rate_unmatching_stats.diff/PHY_vars_eNB->ulsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_rate_unmatching_stats.trials); + (double)eNB->ulsch_rate_unmatching_stats.diff/eNB->ulsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_rate_unmatching_stats.trials); printf("|__ turbo_decoder(%d bits) %f us (%d cycles, %d trials)\n", - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Cminus ? PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kminus : PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kplus, - (double)PHY_vars_eNB->ulsch_turbo_decoding_stats.diff/PHY_vars_eNB->ulsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0, - (int)((double)PHY_vars_eNB->ulsch_turbo_decoding_stats.diff/PHY_vars_eNB->ulsch_turbo_decoding_stats.trials),PHY_vars_eNB->ulsch_turbo_decoding_stats.trials); + eNB->ulsch[0]->harq_processes[harq_pid]->Cminus ? eNB->ulsch[0]->harq_processes[harq_pid]->Kminus : eNB->ulsch[0]->harq_processes[harq_pid]->Kplus, + (double)eNB->ulsch_turbo_decoding_stats.diff/eNB->ulsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0, + (int)((double)eNB->ulsch_turbo_decoding_stats.diff/eNB->ulsch_turbo_decoding_stats.trials),eNB->ulsch_turbo_decoding_stats.trials); printf(" |__ init %f us (cycles/iter %f, %d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_init_stats.diff/PHY_vars_eNB->ulsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_init_stats.diff/PHY_vars_eNB->ulsch_tc_init_stats.trials/((double)avg_iter/iter_trials), - PHY_vars_eNB->ulsch_tc_init_stats.trials); + (double)eNB->ulsch_tc_init_stats.diff/eNB->ulsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_init_stats.diff/eNB->ulsch_tc_init_stats.trials/((double)avg_iter/iter_trials), + eNB->ulsch_tc_init_stats.trials); printf(" |__ alpha %f us (cycles/iter %f, %d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_alpha_stats.diff/PHY_vars_eNB->ulsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_alpha_stats.diff/PHY_vars_eNB->ulsch_tc_alpha_stats.trials*2, - PHY_vars_eNB->ulsch_tc_alpha_stats.trials); + (double)eNB->ulsch_tc_alpha_stats.diff/eNB->ulsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_alpha_stats.diff/eNB->ulsch_tc_alpha_stats.trials*2, + eNB->ulsch_tc_alpha_stats.trials); printf(" |__ beta %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_beta_stats.diff/PHY_vars_eNB->ulsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_beta_stats.diff/PHY_vars_eNB->ulsch_tc_beta_stats.trials*2, - PHY_vars_eNB->ulsch_tc_beta_stats.trials); + (double)eNB->ulsch_tc_beta_stats.diff/eNB->ulsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_beta_stats.diff/eNB->ulsch_tc_beta_stats.trials*2, + eNB->ulsch_tc_beta_stats.trials); printf(" |__ gamma %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_gamma_stats.diff/PHY_vars_eNB->ulsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_gamma_stats.diff/PHY_vars_eNB->ulsch_tc_gamma_stats.trials*2, - PHY_vars_eNB->ulsch_tc_gamma_stats.trials); + (double)eNB->ulsch_tc_gamma_stats.diff/eNB->ulsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_gamma_stats.diff/eNB->ulsch_tc_gamma_stats.trials*2, + eNB->ulsch_tc_gamma_stats.trials); printf(" |__ ext %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_ext_stats.diff/PHY_vars_eNB->ulsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_ext_stats.diff/PHY_vars_eNB->ulsch_tc_ext_stats.trials*2, - PHY_vars_eNB->ulsch_tc_ext_stats.trials); + (double)eNB->ulsch_tc_ext_stats.diff/eNB->ulsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_ext_stats.diff/eNB->ulsch_tc_ext_stats.trials*2, + eNB->ulsch_tc_ext_stats.trials); printf(" |__ intl1 %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_intl1_stats.diff/PHY_vars_eNB->ulsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_intl1_stats.diff/PHY_vars_eNB->ulsch_tc_intl1_stats.trials, - PHY_vars_eNB->ulsch_tc_intl1_stats.trials); + (double)eNB->ulsch_tc_intl1_stats.diff/eNB->ulsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_intl1_stats.diff/eNB->ulsch_tc_intl1_stats.trials, + eNB->ulsch_tc_intl1_stats.trials); printf(" |__ intl2+HD+CRC %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_intl2_stats.diff/PHY_vars_eNB->ulsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_intl2_stats.diff/PHY_vars_eNB->ulsch_tc_intl2_stats.trials, - PHY_vars_eNB->ulsch_tc_intl2_stats.trials); + (double)eNB->ulsch_tc_intl2_stats.diff/eNB->ulsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_intl2_stats.diff/eNB->ulsch_tc_intl2_stats.trials, + eNB->ulsch_tc_intl2_stats.trials); } if(abstx) { //ABSTRACTION @@ -1673,7 +1667,7 @@ int main(int argc, char **argv) fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;", SNR, mcs, - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + eNB->ulsch[0]->harq_processes[harq_pid]->TBS, rate, errs[0], round_trials[0], @@ -1688,7 +1682,7 @@ int main(int argc, char **argv) fprintf(time_meas_fd,"%f;%d;%d;%f;%2.1f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%f;%f;", SNR, mcs, - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + eNB->ulsch[0]->harq_processes[harq_pid]->TBS, rate*effective_rate, 100*effective_rate, rate, @@ -1705,29 +1699,29 @@ int main(int argc, char **argv) (double)errs[2]/(round_trials[0]), (double)errs[3]/(round_trials[0]), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + (double)eNB->ulsch[0]->harq_processes[harq_pid]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); //fprintf(time_meas_fd,"UE_PROC_TX(%d); OFDM_MOD(%d); UL_MOD(%d); UL_ENC(%d); eNB_PROC_RX(%d); OFDM_DEMOD(%d); UL_DEMOD(%d); UL_DECOD(%d);\n", fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d;", - PHY_vars_UE->phy_proc_tx.trials, - PHY_vars_UE->ofdm_mod_stats.trials, - PHY_vars_UE->ulsch_modulation_stats.trials, - PHY_vars_UE->ulsch_encoding_stats.trials, - PHY_vars_eNB->phy_proc_rx.trials, - PHY_vars_eNB->ofdm_demod_stats.trials, - PHY_vars_eNB->ulsch_demodulation_stats.trials, - PHY_vars_eNB->ulsch_decoding_stats.trials + UE->phy_proc_tx.trials, + UE->ofdm_mod_stats.trials, + UE->ulsch_modulation_stats.trials, + UE->ulsch_encoding_stats.trials, + eNB->phy_proc_rx.trials, + eNB->ofdm_demod_stats.trials, + eNB->ulsch_demodulation_stats.trials, + eNB->ulsch_decoding_stats.trials ); fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;", - get_time_meas_us(&PHY_vars_UE->phy_proc_tx), - get_time_meas_us(&PHY_vars_UE->ofdm_mod_stats), - get_time_meas_us(&PHY_vars_UE->ulsch_modulation_stats), - get_time_meas_us(&PHY_vars_UE->ulsch_encoding_stats), - get_time_meas_us(&PHY_vars_eNB->phy_proc_rx), - get_time_meas_us(&PHY_vars_eNB->ofdm_demod_stats), - get_time_meas_us(&PHY_vars_eNB->ulsch_demodulation_stats), - get_time_meas_us(&PHY_vars_eNB->ulsch_decoding_stats) + get_time_meas_us(&UE->phy_proc_tx), + get_time_meas_us(&UE->ofdm_mod_stats), + get_time_meas_us(&UE->ulsch_modulation_stats), + get_time_meas_us(&UE->ulsch_encoding_stats), + get_time_meas_us(&eNB->phy_proc_rx), + get_time_meas_us(&eNB->ofdm_demod_stats), + get_time_meas_us(&eNB->ulsch_demodulation_stats), + get_time_meas_us(&eNB->ulsch_decoding_stats) ); //fprintf(time_meas_fd,"UE_PROC_TX_STD;UE_PROC_TX_MAX;UE_PROC_TX_MIN;UE_PROC_TX_MED;UE_PROC_TX_Q1;UE_PROC_TX_Q3;UE_PROC_TX_DROPPED;\n"); @@ -1769,8 +1763,8 @@ int main(int argc, char **argv) // - //write_output("chestim_f.m","chestf",PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300*12,2,1); - // write_output("chestim_t.m","chestt",PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates_time[0][0], (frame_parms->ofdm_symbol_size)*2,2,1); + //write_output("chestim_f.m","chestf",eNB->pusch_vars[0]->drs_ch_estimates[0][0],300*12,2,1); + // write_output("chestim_t.m","chestt",eNB->pusch_vars[0]->drs_ch_estimates_time[0][0], (frame_parms->ofdm_symbol_size)*2,2,1); }//ch realization diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index 9a0f60167d..7a2a747741 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -786,7 +786,7 @@ rrc_get_estimated_ue_distance( const int CC_idP, const uint8_t loc_typeP); -void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB); +void fill_dci(DCI_PDU *DCI_pdu, PHY_VARS_eNB *phy_vars_eNB); #endif /** @}*/ diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 1f7d08c13d..a8444edfc9 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -139,8 +139,8 @@ extern int sync_var; time_stats_t softmodem_stats_mt; // main thread time_stats_t softmodem_stats_hw; // hw acquisition -time_stats_t softmodem_stats_tx_sf[10]; // total tx time -time_stats_t softmodem_stats_rx_sf[10]; // total rx time +time_stats_t softmodem_stats_tx_sf; // total tx time +time_stats_t softmodem_stats_rx_sf; // total rx time int32_t **rxdata; int32_t **txdata; @@ -154,7 +154,7 @@ static struct { pthread_mutex_t mutex_phy_proc_tx; pthread_cond_t cond_phy_proc_tx; volatile uint8_t phy_proc_CC_id; -} sync_phy_proc[NUM_ENB_THREADS]; +} sync_phy_proc; void exit_fun(const char* s); @@ -271,7 +271,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) */ static void* eNB_thread_tx( void* param ) { - static int eNB_thread_tx_status[NUM_ENB_THREADS]; + static int eNB_thread_tx_status; eNB_proc_t *proc = (eNB_proc_t*)param; FILE *tx_time_file = NULL; @@ -279,11 +279,11 @@ static void* eNB_thread_tx( void* param ) void *txp[PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx]; if (opp_enabled == 1) { - snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->thread_index); + snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf", "eNB"); tx_time_file = fopen(tx_time_name,"w"); } // set default return value - eNB_thread_tx_status[proc->thread_index] = 0; + eNB_thread_tx_status = 0; MSC_START_USE(); @@ -306,10 +306,10 @@ static void* eNB_thread_tx( void* param ) if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - return &eNB_thread_tx_status[proc->thread_index]; + return &eNB_thread_tx_status; } - LOG_I( HW, "[SCHED] eNB TX deadline thread %d(TID %ld) started on CPU %d\n", proc->thread_index, gettid(), sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB TX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); #else //LOW_LATENCY int policy, s, j; @@ -372,7 +372,7 @@ static void* eNB_thread_tx( void* param ) } - LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", proc->thread_index, sched_getcpu(),gettid(), + LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -388,10 +388,10 @@ static void* eNB_thread_tx( void* param ) while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 0 ); if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->thread_index ); + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX\n"); exit_fun("nothing to add"); break; } @@ -403,13 +403,13 @@ static void* eNB_thread_tx( void* param ) } if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->thread_index); + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX\n"); exit_fun("nothing to add"); break; } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 1 ); - start_meas( &softmodem_stats_tx_sf[proc->thread_index] ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 1 ); + start_meas( &softmodem_stats_tx_sf ); if (oai_exit) break; @@ -420,19 +420,19 @@ static void* eNB_thread_tx( void* param ) /* run PHY TX procedures the one after the other for all CCs to avoid race conditions * (may be relaxed in the future for performance reasons) */ - if (pthread_mutex_lock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->thread_index); + if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n"); exit_fun("nothing to add"); break; } /* wait for our turn or oai_exit */ - while (sync_phy_proc[proc->thread_index].phy_proc_CC_id != proc->CC_id && !oai_exit) { - pthread_cond_wait(&sync_phy_proc[proc->thread_index].cond_phy_proc_tx, - &sync_phy_proc[proc->thread_index].mutex_phy_proc_tx); + while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) { + pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx, + &sync_phy_proc.mutex_phy_proc_tx); } - if (pthread_mutex_unlock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->thread_index); + if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX\n"); exit_fun("nothing to add"); } @@ -442,19 +442,19 @@ static void* eNB_thread_tx( void* param ) if (oai_exit) break; if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { - phy_procedures_eNB_TX( proc->thread_index, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL ); + phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL ); /* we're done, let the next one proceed */ - if (pthread_mutex_lock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->thread_index); + if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc\n"); exit_fun("nothing to add"); break; } - sync_phy_proc[proc->thread_index].phy_proc_CC_id++; - sync_phy_proc[proc->thread_index].phy_proc_CC_id %= MAX_NUM_CCs; - pthread_cond_broadcast(&sync_phy_proc[proc->thread_index].cond_phy_proc_tx); - if (pthread_mutex_unlock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->thread_index); + sync_phy_proc.phy_proc_CC_id++; + sync_phy_proc.phy_proc_CC_id %= MAX_NUM_CCs; + pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); + if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc\n"); exit_fun("nothing to add"); break; } @@ -503,7 +503,7 @@ static void* eNB_thread_tx( void* param ) } if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->thread_index ); + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc\n"); exit_fun("nothing to add"); break; } @@ -511,55 +511,55 @@ static void* eNB_thread_tx( void* param ) proc->instance_cnt_tx--; if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n", proc->thread_index ); + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc\n"); exit_fun("nothing to add"); break; } - stop_meas( &softmodem_stats_tx_sf[proc->thread_index] ); + stop_meas( &softmodem_stats_tx_sf ); #ifdef LOWLATENCY if (opp_enabled){ - if(softmodem_stats_tx_sf[proc->thread_index].diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf[proc->thread_index].diff_now/cpuf - attr.sched_runtime)/1000000.0); + if(softmodem_stats_tx_sf.diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); } } #endif - print_meas_now(&softmodem_stats_tx_sf[proc->thread_index],"eNB_TX_SF",proc->thread_index, tx_time_file); + print_meas_now(&softmodem_stats_tx_sf,"eNB_TX_SF",tx_time_file); } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 0 ); #ifdef DEBUG_THREADS - printf( "Exiting eNB thread TX %d\n", proc->thread_index ); + printf( "Exiting eNB thread TX\n"); #endif - eNB_thread_tx_status[proc->thread_index] = 0; - return &eNB_thread_tx_status[proc->thread_index]; + eNB_thread_tx_status = 0; + return &eNB_thread_tx_status; } #if defined(ENABLE_ITTI) static void wait_system_ready (char *message, volatile int *start_flag) -{ + /* Wait for eNB application initialization to be complete (eNB registration to MME) */ - { - static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", - " ....", " ...", " ..", " .", " " - }; - int i = 0; - - while ((!oai_exit) && (*start_flag == 0)) { - LOG_N(EMU, message, indicator[i]); - fflush(stdout); - i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); - usleep(200000); - } - - LOG_D(EMU,"\n"); +{ + static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", + " ....", " ...", " ..", " .", " " + }; + int i = 0; + + while ((!oai_exit) && (*start_flag == 0)) { + LOG_N(EMU, message, indicator[i]); + fflush(stdout); + i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); + usleep(200000); } + + LOG_D(EMU,"\n"); } + #endif /*! @@ -570,7 +570,7 @@ static void wait_system_ready (char *message, volatile int *start_flag) */ static void* eNB_thread_rx( void* param ) { - static int eNB_thread_rx_status[NUM_ENB_THREADS]; + static int eNB_thread_rx_status; eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; @@ -581,11 +581,11 @@ static void* eNB_thread_rx( void* param ) //int i; if (opp_enabled == 1){ - snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf_%d", "eNB", proc->thread_index); + snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf", "eNB"); rx_time_file = fopen(rx_time_name,"w"); } // set default return value - eNB_thread_rx_status[proc->thread_index] = 0; + eNB_thread_rx_status = 0; MSC_START_USE(); @@ -608,10 +608,10 @@ static void* eNB_thread_rx( void* param ) if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB RX sched_setattr failed\n"); - return &eNB_thread_rx_status[proc->thread_index]; + return &eNB_thread_rx_status; } - LOG_I( HW, "[SCHED] eNB RX deadline thread %d(TID %ld) started on CPU %d\n", proc->thread_index, gettid(), sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB RX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); #else // LOW_LATENCY int policy, s, j; struct sched_param sparam; @@ -678,7 +678,7 @@ static void* eNB_thread_rx( void* param ) } - LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->thread_index, sched_getcpu(),gettid(), + LOG_I( HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -692,7 +692,7 @@ static void* eNB_thread_rx( void* param ) // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads - printf( "waiting for sync (eNB_thread_rx %d)\n",proc->thread_index); + printf( "waiting for sync (eNB_thread_rx)\n"); pthread_mutex_lock( &sync_mutex ); while (sync_var<0) @@ -710,9 +710,9 @@ static void* eNB_thread_rx( void* param ) while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); - start_meas( &softmodem_stats_rx_sf[proc->thread_index] ); + start_meas( &softmodem_stats_rx_sf ); if (oai_exit) break; @@ -720,44 +720,44 @@ static void* eNB_thread_rx( void* param ) (fp->frame_type == FDD))) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); // this spawns the prach and TX threads inside and updates the frame and subframe counters - phy_procedures_eNB_common_RX(proc->thread_index, eNB, 0); + phy_procedures_eNB_common_RX(eNB, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); if (eNB->node_function != NGFI_RRU_IF4) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); // this is the ue-specific processing for the subframe and can be multi-threaded later - phy_procedures_eNB_uespec_RX(proc->thread_index, eNB, 0, no_relay ); + phy_procedures_eNB_uespec_RX(eNB, 0, no_relay ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); } } if ((subframe_select(fp,proc->subframe_rx) == SF_S)) { - phy_procedures_eNB_S_RX(proc->thread_index, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); + phy_procedures_eNB_S_RX(eNB, 0, no_relay ); } - stop_meas( &softmodem_stats_rx_sf[proc->thread_index] ); + stop_meas( &softmodem_stats_rx_sf ); #ifdef LOWLATENCY if (opp_enabled){ - if(softmodem_stats_rx_sf[proc->thread_index].diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf[proc->thread_index].diff_now/cpuf - attr.sched_runtime)/1000000.0); + if(softmodem_stats_rx_sf.diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); } } #endif // LOWLATENCY - print_meas_now(&softmodem_stats_rx_sf[proc->thread_index],"eNB_RX_SF",proc->thread_index, rx_time_file); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 ); + print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); } //stop_meas( &softmodem_stats_rx_sf[proc->thread_index] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); #ifdef DEBUG_THREADS - printf( "Exiting eNB thread RX %d\n", proc->thread_index ); + printf( "Exiting eNB thread RX\n"); #endif - eNB_thread_rx_status[proc->thread_index] = 0; - return &eNB_thread_rx_status[proc->thread_index]; + eNB_thread_rx_status = 0; + return &eNB_thread_rx_status; } @@ -778,7 +778,6 @@ static void* eNB_thread_prach( void* param ) MSC_START_USE(); - AssertFatal(proc->thread_index==0,"Invalid thread index %d for PRACH thread\n",proc->thread_index); #ifdef LOWLATENCY struct sched_attr attr; @@ -869,7 +868,7 @@ static void* eNB_thread_prach( void* param ) } - LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->thread_index, sched_getcpu(),gettid(), + LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -888,7 +887,7 @@ static void* eNB_thread_prach( void* param ) if (oai_exit) break; if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n", proc->thread_index ); + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH\n"); exit_fun( "error locking mutex" ); break; } @@ -900,17 +899,17 @@ static void* eNB_thread_prach( void* param ) } if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB PRACH proc %d\n", proc->thread_index ); + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB PRACH\n"); exit_fun( "error unlocking mutex" ); break; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(eNB,proc->thread_index,0); + prach_procedures(eNB,0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n", proc->thread_index ); + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n"); exit_fun( "error locking mutex" ); break; } @@ -918,7 +917,7 @@ static void* eNB_thread_prach( void* param ) proc->instance_cnt_prach--; if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->thread_index ); + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n"); exit_fun( "error unlocking mutex" ); break; } @@ -945,67 +944,64 @@ void init_eNB_proc(void) for (CC_id=0; CC_idproc[i]; - // set the stack size - + + proc = &eNB->proc; #ifndef LOWLATENCY - /* - pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] ); - if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0) + /* + pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] ); + if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0) perror("[ENB_PROC_TX] setting thread stack size failed\n"); - - pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] ); - if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0) + + pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] ); + if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0) perror("[ENB_PROC_RX] setting thread stack size failed\n"); - */ - // set the kernel scheduling policy and priority - proc->sched_param_tx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_tx, &proc->sched_param_tx); - pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO); - - proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_rx, &proc->sched_param_rx); - pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO); - - proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); - pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO); - - printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); + */ + // set the kernel scheduling policy and priority + proc->sched_param_tx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_tx, &proc->sched_param_tx); + pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO); + + proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_rx, &proc->sched_param_rx); + pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO); + + proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); + pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO); + + printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); #endif - proc->instance_cnt_tx = -1; - proc->instance_cnt_prach = -1; - proc->CC_id = CC_id; - pthread_mutex_init( &proc->mutex_tx, NULL); - pthread_cond_init( &proc->cond_tx, NULL); - pthread_cond_init( &proc->cond_prach, NULL); + proc->instance_cnt_tx = -1; + proc->instance_cnt_prach = -1; + proc->CC_id = CC_id; + pthread_mutex_init( &proc->mutex_tx, NULL); + pthread_cond_init( &proc->cond_tx, NULL); + pthread_cond_init( &proc->cond_prach, NULL); #ifndef LOWLATENCY - pthread_create( &proc->pthread_tx, &proc->attr_tx, eNB_thread_tx, &eNB->proc[i] ); - pthread_create( &proc->pthread_rx, &proc->attr_rx, eNB_thread_rx, &eNB->proc[i] ); - pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc[i] ); + pthread_create( &proc->pthread_tx, &proc->attr_tx, eNB_thread_tx, &eNB->proc ); + pthread_create( &proc->pthread_rx, &proc->attr_rx, eNB_thread_rx, &eNB->proc ); + pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); #else - pthread_create( &proc->pthread_tx, NULL, eNB_thread_tx, &eNB->proc[i] ); - pthread_create( &proc->pthread_rx, NULL, eNB_thread_rx, &eNB->proc[i] ); - pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc[i] ); + pthread_create( &proc->pthread_tx, NULL, eNB_thread_tx, &eNB->proc ); + pthread_create( &proc->pthread_rx, NULL, eNB_thread_rx, &eNB->proc ); + pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); #endif - char name[16]; - snprintf( name, sizeof(name), "TX %d", i ); - pthread_setname_np( proc->pthread_tx, name ); - snprintf( name, sizeof(name), "RX %d", i ); - pthread_setname_np( proc->pthread_rx, name ); - } + char name[16]; + snprintf( name, sizeof(name), "TX %d", i ); + pthread_setname_np( proc->pthread_tx, name ); + snprintf( name, sizeof(name), "RX %d", i ); + pthread_setname_np( proc->pthread_rx, name ); } - + + /* setup PHY proc TX sync mechanism */ - for (i=0; iproc[i]; - + + proc = &eNB->proc; + #ifdef DEBUG_THREADS - printf( "Killing TX CC_id %d thread %d\n", CC_id, i ); + printf( "Killing TX CC_id %d thread %d\n", CC_id, i ); #endif - - proc->instance_cnt_tx = 0; // FIXME data race! - pthread_cond_signal( &proc->cond_tx ); - pthread_cond_broadcast(&sync_phy_proc[i].cond_phy_proc_tx); - + + proc->instance_cnt_tx = 0; // FIXME data race! + pthread_cond_signal( &proc->cond_tx ); + pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); + #ifdef DEBUG_THREADS - printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i ); + printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i ); #endif - int result = pthread_join( proc->pthread_tx, (void**)&status ); - + int result = pthread_join( proc->pthread_tx, (void**)&status ); + #ifdef DEBUG_THREADS - - if (result != 0) { - printf( "Error joining thread.\n" ); + + if (result != 0) { + printf( "Error joining thread.\n" ); + } else { + if (status) { + printf( "status %d\n", *status ); } else { - if (status) { - printf( "status %d\n", *status ); - } else { - printf( "The thread was killed. No status available.\n" ); - } + printf( "The thread was killed. No status available.\n" ); } - + } + #else - UNUSED(result) + UNUSED(result) #endif - + #ifdef DEBUG_THREADS printf( "Killing RX CC_id %d thread %d\n", CC_id, i ); #endif - + #ifdef DEBUG_THREADS - printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i ); + printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i ); #endif - result = pthread_join( proc->pthread_rx, (void**)&status ); - + result = pthread_join( proc->pthread_rx, (void**)&status ); + #ifdef DEBUG_THREADS - - if (result != 0) { - printf( "Error joining thread.\n" ); + + if (result != 0) { + printf( "Error joining thread.\n" ); + } else { + if (status) { + printf( "status %d\n", *status ); } else { - if (status) { - printf( "status %d\n", *status ); - } else { - printf( "The thread was killed. No status available.\n" ); - } + printf( "The thread was killed. No status available.\n" ); } - -#else - UNUSED(result) -#endif - - pthread_mutex_destroy( &proc->mutex_tx ); - pthread_cond_destroy( &proc->cond_tx ); } + +#else + UNUSED(result); +#endif + + pthread_mutex_destroy( &proc->mutex_tx ); + pthread_cond_destroy( &proc->cond_tx ); } } + /* this function maps the phy_vars_eNB tx and rx buffers to the available rf chains. Each rf chain is is addressed by the card number and the chain on the card. The rf_map specifies for each CC, on which rf chain the mapping should start. Multiple @@ -1197,381 +1193,14 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c -/*! - * \brief This is the main eNB thread. - * \param arg unused - * \returns a pointer to an int. The storage is not on the heap and must not be freed. - */ -/* -static void* eNB_thread( void* arg ) -{ - UNUSED(arg); - static int eNB_thread_status; - - unsigned char slot; - // the USRP implementation operates on subframes, not slots - // one subframe consists of one even and one odd slot - - slot = 1; - int spp; - int tx_launched = 0; - int card=0; - - void *rxp[2]; // FIXME hard coded array size; indexed by frame_parms.nb_antennas_rx - void *txp[2]; // FIXME hard coded array size; indexed by frame_parms.nb_antennas_tx - - int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9 - - unsigned int rx_pos = 0; - unsigned int tx_pos = 0; - - int CC_id=0; - struct timespec trx_time0, trx_time1, trx_time2; - - //avoid gcc warnings - (void)trx_time0; - (void)trx_time1; - (void)trx_time2; - -#ifdef LOWLATENCY - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - //This creates a .2 ms reservation - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = (0.3 * 100) * 10000; - attr.sched_deadline = (0.9 * 100) * 10000; - attr.sched_period = 1 * 1000000; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] main eNB thread: sched_setattr failed\n"); - exit_fun("Nothing to add"); - } else { - LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", - gettid(),sched_getcpu()); - } - -#else - - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - //Set affinity mask to include CPUs 1 to MAX_CPUS - //CPU 0 is reserved for UHD threads - CPU_ZERO(&cpuset); -#ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } -#endif // CPU_AFFINITY - - //Check the actual affinity mask assigned to the thread - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity, 0 , sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - - LOG_I( HW, "[SCHED][eNB] Started eNB main thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); - - -#endif //LOWLATENCY - - - // stop early, if an exit is requested - // FIXME really neccessary? - if (oai_exit) - goto eNB_thread_cleanup; - - printf("eNB_thread: mlockall in ...\n"); - mlockall(MCL_CURRENT | MCL_FUTURE); - printf("eNB_thread: mlockall out ...\n"); - - timing_info.time_min = 100000000ULL; - timing_info.time_max = 0; - timing_info.time_avg = 0; - timing_info.n_samples = 0; - - printf( "waiting for sync (eNB_thread)\n" ); - pthread_mutex_lock( &sync_mutex ); - - while (sync_var<0) - pthread_cond_wait( &sync_cond, &sync_mutex ); - - pthread_mutex_unlock(&sync_mutex); - - printf( "got sync (eNB_thread)\n" ); - - int frame = 0; - - - spp = openair0_cfg[0].samples_per_packet; - tx_pos = openair0_cfg[0].tx_scheduling_advance; - -#if defined(ENABLE_ITTI) - wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); -#endif - - while (!oai_exit) { - start_meas( &softmodem_stats_mt ); - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); - tx_launched = 0; - - while (rx_pos < ((1+hw_subframe)*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti)) { - - unsigned int rxs; -#ifndef USRP_DEBUG - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TXCNT, tx_pos ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, rx_pos ); - - clock_gettime( CLOCK_MONOTONIC, &trx_time0 ); - - start_meas( &softmodem_stats_hw ); - - openair0_timestamp timestamp; - int i=0; - // prepare rx buffer pointers - for (i=0; iframe_parms.nb_antennas_rx; i++) - rxp[i] = (void*)&rxdata[i][rx_pos]; - // check if nsymb_read == spp - // map antenna port i to the cc_id. Now use the 1:1 mapping - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - spp, - PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx); - - stop_meas( &softmodem_stats_hw ); - if (frame > 50) { - clock_gettime( CLOCK_MONOTONIC, &trx_time1 ); - } - - if (frame > 20){ - if (rxs != spp) - exit_fun( "problem receiving samples" ); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - - // Transmit TX buffer based on timestamp from RX - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - for (i=0; iframe_parms.nb_antennas_tx; i++) - txp[i] = (void*)&txdata[i][tx_pos]; - // if symb_written < spp ==> error - if (frame > 50) { - openair0.trx_write_func(&openair0, - (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance), - txp, - spp, - PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, - 1); - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, timestamp&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance)&0xffffffff ); - - stop_meas( &softmodem_stats_mt ); - if (frame > 50) { - clock_gettime( CLOCK_MONOTONIC, &trx_time2 ); - //update_difftimes(trx_time1, trx_time2); - } - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0); -#else - // USRP_DEBUG is active - rt_sleep_ns(1000000); -#endif - - if ( (frame>50) && (tx_launched == 0) && - ((openair0_cfg[card].txlaunch_wait == 0) || - ((openair0_cfg[card].txlaunch_wait == 1) && - (rx_pos >= (((2*hw_subframe)+openair0_cfg[card].txlaunch_wait_slotcount)*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti>>1))))) { - - tx_launched = 1; - - for (CC_id=0; CC_idproc[hw_subframe].mutex_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", hw_subframe, PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx ); - exit_fun( "error locking mutex_tx" ); - break; - } - - int cnt_tx = ++PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx; - - pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].mutex_tx ); - - if (cnt_tx == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].cond_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n", hw_subframe ); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB TX thread %d busy!! (rx_cnt %u, cnt_tx %i)\n", PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].frame_tx, hw_subframe, rx_pos, cnt_tx ); - exit_fun( "TX thread busy" ); - break; - } - } - } - - rx_pos += spp; - tx_pos += spp; - - if (tx_pos >= openair0_cfg[card].samples_per_frame) - tx_pos -= openair0_cfg[card].samples_per_frame; - } - - if (rx_pos >= openair0_cfg[card].samples_per_frame) - rx_pos -= openair0_cfg[card].samples_per_frame; - - - - if (oai_exit) break; - - timing_info.time_last = timing_info.time_now; - timing_info.time_now = rt_get_time_ns(); - - if (timing_info.n_samples>0) { - RTIME time_diff = timing_info.time_now - timing_info.time_last; - - if (time_diff < timing_info.time_min) - timing_info.time_min = time_diff; - - if (time_diff > timing_info.time_max) - timing_info.time_max = time_diff; - - timing_info.time_avg += time_diff; - } - - timing_info.n_samples++; - - if ((slot&1) == 1) { - // odd slot - int sf = hw_subframe; - if (frame>50) { - for (int CC_id=0; CC_idproc[sf].mutex_rx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n", sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx ); - exit_fun( "error locking mutex_rx" ); - break; - } - - int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx; - - pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx ); - - if (cnt_rx == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_rx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n", sf ); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY, "[eNB] Frame %d, eNB RX thread %d busy!! instance_cnt %d CC_id %d\n", PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx, sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx, CC_id ); - exit_fun( "RX thread busy" ); - break; - } - } - } - } - - hw_subframe++; - slot += 2; - - if (hw_subframe == NUM_ENB_THREADS) { - // the radio frame is complete, start over - hw_subframe = 0; - frame++; - slot = 1; - } - -#if defined(ENABLE_ITTI) - itti_update_lte_time( frame, slot ); -#endif - } - -eNB_thread_cleanup: -#ifdef DEBUG_THREADS - printf( "eNB_thread: finished, ran %d times.\n", frame ); -#endif - -#ifdef DEBUG_THREADS - printf( "Exiting eNB_thread ..." ); -#endif - - eNB_thread_status = 0; - - // print_difftimes(); - - return &eNB_thread_status; -} -*/ - void reset_opp_meas(void) { int sfn; reset_meas(&softmodem_stats_mt); reset_meas(&softmodem_stats_hw); for (sfn=0; sfn < 10; sfn++) { - reset_meas(&softmodem_stats_tx_sf[sfn]); - reset_meas(&softmodem_stats_rx_sf[sfn]); + reset_meas(&softmodem_stats_tx_sf); + reset_meas(&softmodem_stats_rx_sf); } } @@ -1582,8 +1211,8 @@ void print_opp_meas(void) { print_meas(&softmodem_stats_hw, "HW Acquisation", NULL, NULL); for (sfn=0; sfn < 10; sfn++) { - print_meas(&softmodem_stats_tx_sf[sfn],"[eNB][total_phy_proc_tx]",NULL, NULL); - print_meas(&softmodem_stats_rx_sf[sfn],"[eNB][total_phy_proc_rx]",NULL,NULL); + print_meas(&softmodem_stats_tx_sf,"[eNB][total_phy_proc_tx]",NULL, NULL); + print_meas(&softmodem_stats_rx_sf,"[eNB][total_phy_proc_rx]",NULL,NULL); } } From cbc4160ba4ade33ceeb4d3f7cc28e9ccade501a4 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 29 May 2016 15:42:51 -0700 Subject: [PATCH 023/340] added targets/DOCS/oai_L1_L2_procedures.pdf --- targets/DOCS/oai_L1_L2_procedures.pdf | Bin 0 -> 1696869 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 targets/DOCS/oai_L1_L2_procedures.pdf diff --git a/targets/DOCS/oai_L1_L2_procedures.pdf b/targets/DOCS/oai_L1_L2_procedures.pdf new file mode 100755 index 0000000000000000000000000000000000000000..e14948f5af9195b59e06b4b4aefafa065756d09f GIT binary patch literal 1696869 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

6iO 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%0D-Kd%-JT|s@W=@?eq@|k^nn{s`<$ULj-F%V7 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

mx?Q46WZ@}}7`U#Z(EU$VYh|hA_wyI8~#A3Vh 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 Date: Mon, 30 May 2016 00:36:07 +0200 Subject: [PATCH 024/340] bug fixing for new L1 scheduling, updates to vcd tracing --- openair1/PHY/defs.h | 2 + openair1/SCHED/phy_procedures_lte_eNb.c | 78 ++++++++++++++----------- openair2/UTIL/LOG/vcd_signal_dumper.c | 1 + openair2/UTIL/LOG/vcd_signal_dumper.h | 1 + targets/RT/USER/eNB_usrp.gtkw | 20 +++---- targets/RT/USER/lte-enb.c | 7 ++- 6 files changed, 63 insertions(+), 46 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index c483035abc..e18c0b1d91 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -210,6 +210,8 @@ typedef struct { pthread_t pthread_tx; /// pthread structure for rx processing thread pthread_t pthread_rx; + /// flag to indicate first RX acquisition + int first_rx; /// pthread attributes for tx processing thread pthread_attr_t attr_tx; /// pthread attributes for rx processing thread diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index c2dc89c2c5..a444686758 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2487,6 +2487,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl int subframe = proc->subframe_rx; int frame = proc->frame_rx; + if (subframe==9) { subframe=0; frame++; @@ -2515,7 +2516,10 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl fp->nb_antennas_rx); proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is"); + if (proc->first_rx == 0) + AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is"); + else + proc->first_rx = 0; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame ); @@ -2526,7 +2530,42 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl exit_fun( "problem receiving samples" ); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - + + // wake up TX thread + // lock the TX mutex and make sure the thread is ready + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx ); + exit_fun( "error locking mutex_tx" ); + return; + } + + int cnt_tx = ++proc->instance_cnt_tx; + // We have just received and processed the common part of the first slot of a subframe, say n. + // TX_rx is the last received timestamp (start of 1st slot), TX_tx is the desired + // transmitted timestamp of the next TX slot (first). + // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, + // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+3 + proc->timestamp_tx = proc->timestamp_rx + (3*fp->samples_per_tti); + proc->frame_tx = (subframe > 6) ? (frame+1) : frame; + proc->subframe_tx = (subframe + 3)%10; + + pthread_mutex_unlock( &proc->mutex_tx ); + + if (cnt_tx == 0){ + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc->cond_tx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", frame, cnt_tx ); + exit_fun( "TX thread busy" ); + return; + } + // now do common RX processing for first slot in subframe + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); remove_7_5_kHz(eNB,subframe<<1); for (l=0; lsymbols_per_tti/2; l++) slot_fep_ul(fp, @@ -2540,6 +2579,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (eNB->node_function == NGFI_RRU_IF4) { //send_IF4(eNB,subframe<<1); } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); for (i=0; inb_antennas_rx; i++) rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][(fp->samples_per_tti>>1)+(subframe*fp->samples_per_tti)]; @@ -2552,6 +2592,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl fp->nb_antennas_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); remove_7_5_kHz(eNB,(subframe<<1)+1); for (l=0; lsymbols_per_tti/2; l++) slot_fep_ul(fp, @@ -2561,6 +2602,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl 0, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); if (eNB->node_function == NGFI_RRU_IF4) { //send_IF4(eNB,(subframe<<1)+1); } @@ -2610,39 +2652,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } - // wake up TX thread - // lock the TX mutex and make sure the thread is ready - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx ); - exit_fun( "error locking mutex_tx" ); - return; - } - - int cnt_tx = ++proc->instance_cnt_tx; - // We have just received and processed the common part of an entire subframe, say n. - // TX_rx is the last received timestamp (start of 2nd slot), TX_tx is the desired - // transmitted timestamp of the next TX slot (first). - // The last (TS_rx mod samples_per_frame) was (n+.5)*samples_per_tti, - // we want to generate subframe (n+3), so TS_tx = TX_rx+2.5*samples_per_tti, - // and proc->subframe_tx = proc->subframe_rx+3 - proc->timestamp_tx = proc->timestamp_rx + (fp->samples_per_tti<<1) + (fp->samples_per_tti>>1); - proc->frame_tx = (subframe > 6) ? (frame+1) : frame; - proc->subframe_tx = (subframe + 3)%10; - pthread_mutex_unlock( &proc->mutex_tx ); - - if (cnt_tx == 0){ - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc->cond_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n"); - exit_fun( "ERROR pthread_cond_signal" ); - return; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", frame, cnt_tx ); - exit_fun( "TX thread busy" ); - return; - } } diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 1972993a94..9e855696c4 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -230,6 +230,7 @@ const char* eurecomFunctionsNames[] = { "phy_procedures_eNb_rx", "phy_procedures_eNb_rx_common", "phy_procedures_eNb_rx_uespec", + "phy_eNB_slot_fep", "phy_procedures_ue_tx", "phy_procedures_ue_rx", "phy_procedures_eNB_lte", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index f0a3e70274..192bebd976 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -204,6 +204,7 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, + VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE, diff --git a/targets/RT/USER/eNB_usrp.gtkw b/targets/RT/USER/eNB_usrp.gtkw index 677e214f31..474d2d1cf3 100644 --- a/targets/RT/USER/eNB_usrp.gtkw +++ b/targets/RT/USER/eNB_usrp.gtkw @@ -1,15 +1,15 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Fri May 27 01:34:58 2016 +[*] Sun May 29 20:10:01 2016 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Fri May 27 01:33:50 2016" -[dumpfile_size] 12743642 +[dumpfile_mtime] "Sun May 29 20:07:25 2016" +[dumpfile_size] 16398004 [savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw" -[timestart] 10801070000 -[size] 1535 845 -[pos] -1 -1 -*-21.793451 10817350000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[timestart] 10806270000 +[size] 1535 724 +[pos] 309 0 +*-18.793451 10806918339 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [sst_width] 284 [signals_width] 254 [sst_expanded] 1 @@ -28,10 +28,12 @@ variables.subframe_number_RX_eNB[63:0] functions.eNB_thread_rx0 functions.eNB_thread_tx0 functions.phy_procedures_eNb_tx -@29 functions.phy_enb_sfgen +@29 +functions.phy_eNB_slot_fep @28 functions.phy_procedures_eNb_rx +functions.phy_enb_prach_rx @24 variables.dci_info[63:0] variables.ue0_BO[63:0] @@ -46,8 +48,6 @@ functions.macxface_SR_indication @420 variables.ue0_SR_ENERGY[63:0] variables.ue0_SR_THRES[63:0] -@24 -variables.dci_info[63:0] @28 functions.phy_enb_ulsch_decoding0 @24 diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index a8444edfc9..dcf970e44e 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -372,7 +372,7 @@ static void* eNB_thread_tx( void* param ) } - LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), + LOG_I( HW, "[SCHED][eNB] TX thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -868,7 +868,7 @@ static void* eNB_thread_prach( void* param ) } - LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), + LOG_I( HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -975,6 +975,9 @@ void init_eNB_proc(void) proc->instance_cnt_tx = -1; proc->instance_cnt_prach = -1; proc->CC_id = CC_id; + + proc->first_rx=1; + pthread_mutex_init( &proc->mutex_tx, NULL); pthread_cond_init( &proc->cond_tx, NULL); pthread_cond_init( &proc->cond_prach, NULL); From 7d6746b4b03688bb35ca7f69ebb41c127c4d37d4 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 30 May 2016 09:58:48 +0200 Subject: [PATCH 025/340] added lte-enb to lte-softmodem-noS1 target --- cmake_targets/CMakeLists.txt | 2447 +++++++++++++++++----------------- 1 file changed, 1224 insertions(+), 1223 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 43b7f63e22..5eca2e8d41 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -616,1229 +616,1230 @@ add_boolean_option(NAS_ADDRESS_FIX False "specific to oaisim: for nasmesh driver add_boolean_option(NAS_NETLINK False "???? Must be True to compile nasmesh driver without rtai") add_boolean_option(OAISIM False "specific to oaisim") add_boolean_option(OAI_NW_DRIVER_USE_NETLINK True "????") -add_boolean_option(USE_MME False "this flag is used only one time in lte-softmodem.c") -add_list_string_option(PACKAGE_NAME "NotDefined" "As per attribute name") -add_boolean_option(MESSAGE_CHART_GENERATOR False "For generating sequence diagrams") -add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams") -add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams") - -add_boolean_option(ENB_AGENT True "enable eNB agent to inteface with a SDN contrller") - -######################## -# Include order -########################## -add_boolean_option(ENB_MODE True "Swap the include directories between openair2 and openair3" ) - -########################## -# Emulation options -########################## -add_boolean_option(ENABLE_PGM_TRANSPORT False "specific to oaisim, emulation through ethernet, reliable multicast") -add_boolean_option(ADDR_CONF False "specific to oaisim, IP autoconf of user-plane IP interface") -add_boolean_option(OPENAIR_EMU False "specific to oaisim") -add_boolean_option(OAI_EMU False "specific to oaisim") -add_boolean_option(PHY_ABSTRACTION False "specific to oaisim") - -########################## -# SCHEDULING/REAL-TIME/PERF options -########################## -add_boolean_option(ENABLE_USE_CPU_EXECUTION_TIME True "Add data in vcd traces: disable it if perf issues") -add_boolean_option(ENABLE_VCD True "always true now, time measurements of proc calls and var displays") -add_boolean_option(ENABLE_VCD_FIFO True "time measurements of proc calls and var displays sent to FIFO (one more thread)") -add_boolean_option(HARD_RT False "???") -add_boolean_option(LINUX False "used in weird memcpy() in pdcp.c ???") -add_boolean_option(LINUX_LIST False "used only in lists.c: either use OAI implementation of lists or Linux one (should be True, but it is False") -add_boolean_option(LOG_NO_THREAD True "Disable thread for log, seems always set to true") -add_boolean_option(OPENAIR_LTE True "Seems legacy: keep it to true") - -########################## -# PHY options -########################## -add_boolean_option(DRIVER2013 True "only relevant for EXMIMO") -add_boolean_option(ENABLE_FXP True "????") -add_boolean_option(ENABLE_NEW_MULTICAST False "specific to oaisim") -add_boolean_option(EXMIMO_IOT True "????") -add_boolean_option(LARGE_SCALE False "specific to oaisim: defines max eNB=2 and max UE=120") -add_boolean_option(LOCALIZATION False "???") -add_integer_option(MAX_NUM_CCs 1 "????") -add_boolean_option(MU_RECEIVER False "????") -add_boolean_option(NEW_FFT True "????") -add_boolean_option(OPENAIR1 True "????") -add_boolean_option(PBS_SIM False "????") -add_boolean_option(PC_DSP True "????") -add_boolean_option(PC_TARGET True "????") -add_boolean_option(PERFECT_CE False "????") -add_boolean_option(PHYSIM True "for L1 simulators (dlsim, ulsim, ...)") -add_boolean_option(PHY_CONTEXT True "not clear: must remain False for dlsim") -add_boolean_option(PHY_EMUL False "not clear: must remain False for dlsim") -add_boolean_option(PUCCH True "????") -add_boolean_option(RANDOM_BF False "????") -add_boolean_option(SMBV False "Rohde&Schwarz SMBV100A vector signal generator") -add_boolean_option(DEBUG_PHY False "Enable PHY layer debugging options") -add_boolean_option(DEBUG_PHY_PROC False "Enable debugging of PHY layer procedures") -add_boolean_option(DEBUG_DLSCH False "Enable debugging of DLSCH physical layer channel") - -########################## -# 802.21 options -########################## -add_boolean_option(ENABLE_RAL False "ENABLE 802.21 INTERFACE") -add_boolean_option(USE_3GPP_ADDR_AS_LINK_ADDR False "As per attribute name") - -########################## -# NAS LAYER OPTIONS -########################## -add_boolean_option(ENABLE_NAS_UE_LOGGING True "????") -add_boolean_option(NAS_BUILT_IN_UE True "UE NAS layer present in this executable") -add_boolean_option(NAS_UE True "NAS UE INSTANCE (<> NAS_MME)") - - -########################## -# ACCESS STRATUM LAYER2 OPTIONS -########################## -add_boolean_option(MAC_CONTEXT True "specific to oaisim") -add_boolean_option(JUMBO_FRAME True "ENABLE LARGE SDU in ACCESS STRATUM (larger than common MTU)") - -########################## -# RLC LAYER OPTIONS -########################## -add_boolean_option(OPENAIR2 True "Access Stratum layer 2 built in executable") -add_boolean_option(TRACE_RLC_PAYLOAD False "Fatal assert in this case") -add_boolean_option(RLC_STOP_ON_LOST_PDU False "Fatal assert in this case") - -add_boolean_option(TRACE_RLC_MUTEX True "TRACE for RLC, possible problem in thread scheduling") -add_boolean_option(TRACE_RLC_AM_BO False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_FREE_SDU False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_HOLE False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_PDU False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_RESEGMENT False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_RX False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_RX_DECODE False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_TX False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_TX_STATUS False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_AM_STATUS_CREATION False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") - -add_boolean_option(STOP_ON_IP_TRAFFIC_OVERLOAD False "") -add_boolean_option(TRACE_RLC_UM_DAR False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_UM_DISPLAY_ASCII_DATA False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_UM_PDU False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_UM_RX False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_UM_SEGMENT False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") -add_boolean_option(TRACE_RLC_UM_TX_STATUS False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") - - -########################## -# PDCP LAYER OPTIONS -########################## -add_boolean_option(PDCP_USE_NETLINK False "For eNB, PDCP communicate with a NETLINK socket if connected to network driver, else could use a RT-FIFO") -add_boolean_option(PDCP_USE_NETLINK_QUEUES False "When PDCP_USE_NETLINK is true, incoming IP packets are stored in queues") -add_boolean_option(LINK_ENB_PDCP_TO_IP_DRIVER False "For eNB, PDCP communicate with a IP driver") -add_boolean_option(LINK_ENB_PDCP_TO_GTPV1U True "For eNB, PDCP communicate with GTP-U protocol (eNB<->S-GW)") - -########################## -# RRC LAYER OPTIONS -########################## -add_boolean_option(RRC_DEFAULT_RAB_IS_AM False "Otherwise it is UM, configure params are actually set in rrc_eNB.c:rrc_eNB_generate_defaultRRCConnectionReconfiguration(...)") - - -########################## -# S1AP LAYER OPTIONS -########################## -# none - -########################## -# PROJECTS (IST, FRENCH COLL., etc) -# SPECIFIC OPTIONS -########################## -add_boolean_option(SPECTRA False "???") -add_boolean_option(MIH_C_MEDIEVAL_EXTENSIONS False "EXTENSIONS TO MIH 802.21 IN CONTEXT OF IST PROJECT CALLED MEDIEVAL") - - - -add_boolean_option(EMOS False "????") -if(${EMOS}) - add_definitions("-D_FILE_OFFSET_BITS=64") - set(EMOS_LIB gps) -endif(${EMOS}) - - - # add the binary tree to the search path for include files -####################################################### -# We will find ConfigOAI.h after generation in target directory -include_directories("${OPENAIR_BIN_DIR}") -# add directories to find all include files -# the internal rule is to use generic names such as defs.h -# but to make it uniq name as adding the relative path in the include directtive -# example: #include "RRC/LITE/defs.h" -#find_path (include_dirs_all *.h ${OPENAIR_DIR}) -#find_path (include_dirs_all *.h PATHS /usr/include NO_CMAKE_PATH) -#include_directories("${include_dirs_all}") - -# Legacy exact order -if(ENB_MODE) - include_directories("${OPENAIR2_DIR}/COMMON") - include_directories("${OPENAIR2_DIR}/UTIL") - include_directories("${OPENAIR2_DIR}/UTIL/LOG") - include_directories("${OPENAIR3_DIR}/COMMON") - include_directories("${OPENAIR3_DIR}/UTILS") -else() - include_directories("${OPENAIR3_DIR}/COMMON") - include_directories("${OPENAIR3_DIR}/UTILS") - include_directories("${OPENAIR2_DIR}/COMMON") - include_directories("${OPENAIR2_DIR}/UTIL") - include_directories("${OPENAIR2_DIR}/UTIL/LOG") -endif() -include_directories("${OPENAIR1_DIR}") -include_directories("${OPENAIR2_DIR}/NAS") -include_directories("${OPENAIR2_DIR}") -include_directories("${OPENAIR2_DIR}/LAYER2/RLC") -include_directories("${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0") -include_directories("${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0") -include_directories("${OPENAIR2_DIR}/LAYER2/RLC/TM_v9.3.0") -include_directories("${OPENAIR2_DIR}/LAYER2/PDCP_v10.1.0") -include_directories("${OPENAIR2_DIR}/RRC/LITE/MESSAGES") -include_directories("${OPENAIR2_DIR}/RRC/LITE") -include_directories("${OPENAIR3_DIR}/RAL-LTE/INTERFACE-802.21/INCLUDE") -include_directories("${OPENAIR3_DIR}/RAL-LTE/LTE_RAL_ENB/INCLUDE") -include_directories("${OPENAIR3_DIR}/RAL-LTE/LTE_RAL_UE/INCLUDE") -include_directories("${OPENAIR_DIR}/common/utils") -include_directories("${OPENAIR_DIR}/common/utils/itti") -include_directories("${OPENAIR3_DIR}/NAS/COMMON") -include_directories("${OPENAIR3_DIR}/NAS/COMMON/API/NETWORK") -include_directories("${OPENAIR3_DIR}/NAS/COMMON/EMM/MSG") -include_directories("${OPENAIR3_DIR}/NAS/COMMON/ESM/MSG") -include_directories("${OPENAIR3_DIR}/NAS/COMMON/IES") -include_directories("${OPENAIR3_DIR}/NAS/COMMON/UTIL") -include_directories("${OPENAIR3_DIR}/SECU") -include_directories("${OPENAIR3_DIR}/SCTP") -include_directories("${OPENAIR3_DIR}/S1AP") -include_directories("${OPENAIR2_DIR}/X2AP") -include_directories("${OPENAIR3_DIR}/UDP") -include_directories("${OPENAIR3_DIR}/GTPV1-U") -include_directories("${OPENAIR_DIR}/targets/COMMON") -include_directories("${OPENAIR_DIR}/targets/ARCH/COMMON") -include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/USERSPACE/LIB/") -include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/DEFS") -include_directories("${OPENAIR2_DIR}/ENB_APP") -include_directories("${OPENAIR2_DIR}/UTIL/OSA") -include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/inc") -include_directories("${OPENAIR2_DIR}/UTIL/MEM") -include_directories("${OPENAIR2_DIR}/UTIL/LISTS") -include_directories("${OPENAIR2_DIR}/UTIL/FIFO") -include_directories("${OPENAIR2_DIR}/UTIL/OCG") -include_directories("${OPENAIR2_DIR}/UTIL/MATH") -include_directories("${OPENAIR2_DIR}/UTIL/TIMER") -include_directories("${OPENAIR2_DIR}/UTIL/OMG") -include_directories("${OPENAIR2_DIR}/UTIL/OTG") -include_directories("${OPENAIR2_DIR}/UTIL/CLI") -include_directories("${OPENAIR2_DIR}/UTIL/OPT") -include_directories("${OPENAIR2_DIR}/UTIL/OMV") -include_directories("${OPENAIR2_DIR}/RRC/LITE/MESSAGES") -include_directories("${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/shared") -include_directories("${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/include") -include_directories("${OPENAIR_DIR}") - -# Utilities Library -################ -add_library(HASHTABLE - ${OPENAIR_DIR}/common/utils/collection/hashtable/hashtable.c - ${OPENAIR_DIR}/common/utils/collection/hashtable/obj_hashtable.c -) -include_directories(${OPENAIR_DIR}/common/utils/collection/hashtable) - -if (MESSAGE_CHART_GENERATOR) - add_library(MSC - ${OPENAIR_DIR}/common/utils/msc/msc.c - ) - set(MSC_LIB MSC) -endif() -include_directories(${OPENAIR_DIR}/common/utils/msc) - -set(UTIL_SRC - ${OPENAIR2_DIR}/UTIL/CLI/cli.c - ${OPENAIR2_DIR}/UTIL/CLI/cli_cmd.c - ${OPENAIR2_DIR}/UTIL/CLI/cli_server.c - ${OPENAIR2_DIR}/UTIL/FIFO/pad_list.c - ${OPENAIR2_DIR}/UTIL/LISTS/list.c - ${OPENAIR2_DIR}/UTIL/LISTS/list2.c - ${OPENAIR2_DIR}/UTIL/LOG/log.c - ${OPENAIR2_DIR}/UTIL/LOG/vcd_signal_dumper.c - ${OPENAIR2_DIR}/UTIL/MATH/oml.c - ${OPENAIR2_DIR}/UTIL/MEM/mem_block.c - ${OPENAIR2_DIR}/UTIL/OCG/OCG.c - ${OPENAIR2_DIR}/UTIL/OCG/OCG_create_dir.c - ${OPENAIR2_DIR}/UTIL/OCG/OCG_detect_file.c - ${OPENAIR2_DIR}/UTIL/OCG/OCG_generate_report.c - ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c - ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c - ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c - ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c - ${OPENAIR2_DIR}/UTIL/OMG/common.c - ${OPENAIR2_DIR}/UTIL/OMG/grid.c - ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c - ${OPENAIR2_DIR}/UTIL/OMG/job.c - ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c - ${OPENAIR2_DIR}/UTIL/OMG/omg.c - ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c - ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c - ${OPENAIR2_DIR}/UTIL/OMG/rwp.c - ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c - ${OPENAIR2_DIR}/UTIL/OMG/static.c - ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c - ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c - ${OPENAIR2_DIR}/UTIL/OMG/trace.c - ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c - ${OPENAIR2_DIR}/UTIL/OPT/probe.c - ${OPENAIR2_DIR}/UTIL/OTG/otg_tx.c - ${OPENAIR2_DIR}/UTIL/OTG/otg.c - ${OPENAIR2_DIR}/UTIL/OTG/otg_kpi.c - ${OPENAIR2_DIR}/UTIL/OTG/otg_models.c - ${OPENAIR2_DIR}/UTIL/OTG/otg_form.c - ${OPENAIR2_DIR}/UTIL/OTG/otg_rx.c - ) -add_library(UTIL ${UTIL_SRC}) - -set(SECU_OSA_SRC - ${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c - ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c - ${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c - ${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eea.c - ${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c - ) -add_library(SECU_OSA ${SECU_OSA_SRC}) - -set(SECU_CN_SRC - ${OPENAIR3_DIR}/SECU/kdf.c - ${OPENAIR3_DIR}/SECU/rijndael.c - ${OPENAIR3_DIR}/SECU/snow3g.c - ${OPENAIR3_DIR}/SECU/key_nas_deriver.c - ${OPENAIR3_DIR}/SECU/nas_stream_eea1.c - ${OPENAIR3_DIR}/SECU/nas_stream_eia1.c - ${OPENAIR3_DIR}/SECU/nas_stream_eea2.c - ${OPENAIR3_DIR}/SECU/nas_stream_eia2.c - ) -add_library(SECU_CN ${SECU_CN_SRC}) - -# Scheduler -################################" -file(GLOB SCHED_SRC ${OPENAIR1_DIR}/SCHED/*.c) -add_library(SCHED_LIB ${SCHED_SRC}) - -# Layer 1 -############################# -set(PHY_SRC - # depend on code generation from asn1c - ${RRC_FULL_DIR}/asn1_constants.h - # actual source - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_demodulation.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_llr_computation.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/power_control.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_decoding.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_scrambling.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/uci_tools.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/srs_modulation.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/drs_modulation.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_modulation.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_coding.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_decoding.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/print_stats.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/initial_sync.c - ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c - ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c - ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c - ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c - ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_timefreq.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_eNB_measurements.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/adjust_gain.c - ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_cell_spec.c - ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_uespec.c - ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold.c - ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold_mbsfn.c - ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_mbsfn.c - ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_ul_ref.c - ${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c - ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c - ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c - ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c - ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c - ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c - ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c - ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c - ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c - ${OPENAIR1_DIR}/PHY/CODING/rate_matching.c - ${OPENAIR1_DIR}/PHY/CODING/viterbi.c - ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c - ${OPENAIR1_DIR}/PHY/INIT/lte_init.c - ${OPENAIR1_DIR}/PHY/INIT/lte_parms.c - ${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c - ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c - ${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c - ${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c - ${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c - ${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c - ${OPENAIR1_DIR}/PHY/TOOLS/cdot_prod.c - ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c - ${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c - ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c - ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c - ${OPENAIR1_DIR}/PHY/TOOLS/lut.c - ) -if (${SMBV}) - set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c") -endif (${SMBV}) -add_library(PHY ${PHY_SRC}) - -#Layer 2 library -##################### -set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC) -set(RLC_DIR ${OPENAIR2_DIR}/LAYER2/RLC) -set(RLC_UM_DIR ${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0) -set(RLC_AM_DIR ${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0) -set(RLC_TM_DIR ${OPENAIR2_DIR}/LAYER2/RLC/TM_v9.3.0) -set(RRC_DIR ${OPENAIR2_DIR}/RRC/LITE) -set(PDCP_DIR ${OPENAIR2_DIR}/LAYER2/PDCP_v10.1.0) -set(L2_SRC - ${OPENAIR2_DIR}/LAYER2/openair2_proc.c - ${PDCP_DIR}/pdcp.c - ${PDCP_DIR}/pdcp_fifo.c - ${PDCP_DIR}/pdcp_sequence_manager.c - ${PDCP_DIR}/pdcp_primitives.c - ${PDCP_DIR}/pdcp_util.c - ${PDCP_DIR}/pdcp_security.c - ${PDCP_DIR}/pdcp_netlink.c - ${RLC_AM_DIR}/rlc_am.c - ${RLC_AM_DIR}/rlc_am_init.c - ${RLC_AM_DIR}/rlc_am_timer_poll_retransmit.c - ${RLC_AM_DIR}/rlc_am_timer_reordering.c - ${RLC_AM_DIR}/rlc_am_timer_status_prohibit.c - ${RLC_AM_DIR}/rlc_am_segment.c - ${RLC_AM_DIR}/rlc_am_segments_holes.c - ${RLC_AM_DIR}/rlc_am_in_sdu.c - ${RLC_AM_DIR}/rlc_am_receiver.c - ${RLC_AM_DIR}/rlc_am_retransmit.c - ${RLC_AM_DIR}/rlc_am_windows.c - ${RLC_AM_DIR}/rlc_am_rx_list.c - ${RLC_AM_DIR}/rlc_am_reassembly.c - ${RLC_AM_DIR}/rlc_am_status_report.c - ${RLC_TM_DIR}/rlc_tm.c - ${RLC_TM_DIR}/rlc_tm_init.c - ${RLC_UM_DIR}/rlc_um.c - ${RLC_UM_DIR}/rlc_um_fsm.c - ${RLC_UM_DIR}/rlc_um_control_primitives.c - ${RLC_UM_DIR}/rlc_um_segment.c - ${RLC_UM_DIR}/rlc_um_reassembly.c - ${RLC_UM_DIR}/rlc_um_receiver.c - ${RLC_UM_DIR}/rlc_um_dar.c - ${RLC_DIR}/rlc_mac.c - ${RLC_DIR}/rlc.c - ${RLC_DIR}/rlc_rrc.c - ${RLC_DIR}/rlc_mpls.c - ${RRC_DIR}/rrc_UE.c - ${RRC_DIR}/rrc_eNB.c - ${RRC_DIR}/rrc_eNB_S1AP.c - ${RRC_DIR}/rrc_eNB_UE_context.c - ${RRC_DIR}/rrc_common.c - ${RRC_DIR}/L2_interface.c - ) -set (MAC_SRC - ${MAC_DIR}/lte_transport_init.c - ${MAC_DIR}/main.c - ${MAC_DIR}/ue_procedures.c - ${MAC_DIR}/ra_procedures.c - ${MAC_DIR}/l1_helpers.c - ${MAC_DIR}/rar_tools.c - ${MAC_DIR}/eNB_scheduler.c - ${MAC_DIR}/eNB_scheduler_dlsch.c - ${MAC_DIR}/eNB_scheduler_ulsch.c - ${MAC_DIR}/eNB_scheduler_mch.c - ${MAC_DIR}/eNB_scheduler_bch.c - ${MAC_DIR}/eNB_scheduler_primitives.c - ${MAC_DIR}/eNB_scheduler_RA.c - ${MAC_DIR}/pre_processor.c - ${MAC_DIR}/config.c - ) - -set (ENB_APP_SRC - ${OPENAIR2_DIR}/ENB_APP/enb_app.c - ${OPENAIR2_DIR}/ENB_APP/enb_config.c - ) - -add_library(L2 - ${L2_SRC} - ${MAC_SRC} - ${ENB_APP_SRC}) -# ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c) - -# L3 Libs -########################## - -set(RAL_LTE_DIR ${OPENAIR3_DIR}/RAL-LTE/) -if (${ENABLE_RAL}) - set(RAL_LTE_SRC - ${RRC_DIR}/rrc_UE_ral.c - ${RRC_DIR}/rrc_eNB_ral.c - ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_action.c - ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_main.c - ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_mih_msg.c - ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_parameters.c - ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_process.c - ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_rrc_msg.c - ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_subscribe.c - ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_thresholds.c - ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_action.c - ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_main.c - ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_mih_msg.c - ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_parameters.c - ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_process.c - ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_rrc_msg.c - ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_subscribe.c - ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_thresholds.c - ) - add_library(RAL ${RAL_LTE_SRC}) - set(RAL_LIB RAL) -endif() - -if(${MIH_C_MEDIEVAL_EXTENSIONS}) - set(MIH_SRC - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_header_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_msg_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_primitive_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F1_basic_data_types_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F2_general_data_types_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F3_data_types_for_address_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F4_data_types_for_links_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F9_data_types_for_qos_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F13_data_types_for_information_elements_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_L2_type_values_for_tlv_encoding.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_Medieval_extensions.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_bit_buffer.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C.c - ) - add_library(MIH ${MIH_SRC}) - set(MIH_LIB MIH) -endif() - -# CN libs -########################## - -add_library(CN_UTILS - ${OPENAIR3_DIR}/UTILS/conversions.c - ${OPENAIR3_DIR}/UTILS/enum_string.c - ${OPENAIR3_DIR}/UTILS/log.c - ${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c - ) - -set(GTPV1U_DIR ${OPENAIR3_DIR}/GTPV1-U) -set (GTPV1U_SRC - ${RRC_DIR}/rrc_eNB_GTPV1U.c - ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c - ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTrxn.c - ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uMsg.c - ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1u.c - ${GTPV1U_DIR}/gtpv1u_teid_pool.c -) -add_library(GTPV1U ${GTPV1U_SRC}) - -set(SCTP_SRC - ${OPENAIR3_DIR}/SCTP/sctp_common.c - ${OPENAIR3_DIR}/SCTP/sctp_eNB_task.c - ${OPENAIR3_DIR}/SCTP/sctp_eNB_itti_messaging.c -) -add_library(SCTP_CLIENT ${SCTP_SRC}) - -add_library(UDP ${OPENAIR3_DIR}/UDP/udp_eNB_task.c) - - -set(NAS_SRC ${OPENAIR3_DIR}/NAS/) -set(libnas_api_OBJS - ${NAS_SRC}COMMON/API/NETWORK/as_message.c - ${NAS_SRC}COMMON/API/NETWORK/nas_message.c - ${NAS_SRC}COMMON/API/NETWORK/network_api.c - ) - -set(libnas_emm_msg_OBJS - ${NAS_SRC}COMMON/EMM/MSG/AttachAccept.c - ${NAS_SRC}COMMON/EMM/MSG/AttachComplete.c - ${NAS_SRC}COMMON/EMM/MSG/AttachReject.c - ${NAS_SRC}COMMON/EMM/MSG/AttachRequest.c - ${NAS_SRC}COMMON/EMM/MSG/AuthenticationFailure.c - ${NAS_SRC}COMMON/EMM/MSG/AuthenticationReject.c - ${NAS_SRC}COMMON/EMM/MSG/AuthenticationRequest.c - ${NAS_SRC}COMMON/EMM/MSG/AuthenticationResponse.c - ${NAS_SRC}COMMON/EMM/MSG/CsServiceNotification.c - ${NAS_SRC}COMMON/EMM/MSG/DetachAccept.c - ${NAS_SRC}COMMON/EMM/MSG/DetachRequest.c - ${NAS_SRC}COMMON/EMM/MSG/DownlinkNasTransport.c - ${NAS_SRC}COMMON/EMM/MSG/EmmInformation.c - ${NAS_SRC}COMMON/EMM/MSG/emm_msg.c - ${NAS_SRC}COMMON/EMM/MSG/EmmStatus.c - ${NAS_SRC}COMMON/EMM/MSG/ExtendedServiceRequest.c - ${NAS_SRC}COMMON/EMM/MSG/GutiReallocationCommand.c - ${NAS_SRC}COMMON/EMM/MSG/GutiReallocationComplete.c - ${NAS_SRC}COMMON/EMM/MSG/IdentityRequest.c - ${NAS_SRC}COMMON/EMM/MSG/IdentityResponse.c - ${NAS_SRC}COMMON/EMM/MSG/SecurityModeCommand.c - ${NAS_SRC}COMMON/EMM/MSG/SecurityModeComplete.c - ${NAS_SRC}COMMON/EMM/MSG/SecurityModeReject.c - ${NAS_SRC}COMMON/EMM/MSG/ServiceReject.c - ${NAS_SRC}COMMON/EMM/MSG/ServiceRequest.c - ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateAccept.c - ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateComplete.c - ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateReject.c - ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateRequest.c - ${NAS_SRC}COMMON/EMM/MSG/UplinkNasTransport.c -) - -set(libnas_esm_msg_OBJS - ${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c - ${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c - ${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c - ${NAS_SRC}COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c - ${NAS_SRC}COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c - ${NAS_SRC}COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c - ${NAS_SRC}COMMON/ESM/MSG/BearerResourceAllocationReject.c - ${NAS_SRC}COMMON/ESM/MSG/BearerResourceAllocationRequest.c - ${NAS_SRC}COMMON/ESM/MSG/BearerResourceModificationReject.c - ${NAS_SRC}COMMON/ESM/MSG/BearerResourceModificationRequest.c - ${NAS_SRC}COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c - ${NAS_SRC}COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c - ${NAS_SRC}COMMON/ESM/MSG/EsmInformationRequest.c - ${NAS_SRC}COMMON/ESM/MSG/EsmInformationResponse.c - ${NAS_SRC}COMMON/ESM/MSG/esm_msg.c - ${NAS_SRC}COMMON/ESM/MSG/EsmStatus.c - ${NAS_SRC}COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c - ${NAS_SRC}COMMON/ESM/MSG/ModifyEpsBearerContextReject.c - ${NAS_SRC}COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c - ${NAS_SRC}COMMON/ESM/MSG/PdnConnectivityReject.c - ${NAS_SRC}COMMON/ESM/MSG/PdnConnectivityRequest.c - ${NAS_SRC}COMMON/ESM/MSG/PdnDisconnectReject.c - ${NAS_SRC}COMMON/ESM/MSG/PdnDisconnectRequest.c -) - -set(libnas_ies_OBJS - ${NAS_SRC}COMMON/IES/AccessPointName.c - ${NAS_SRC}COMMON/IES/AdditionalUpdateResult.c - ${NAS_SRC}COMMON/IES/AdditionalUpdateType.c - ${NAS_SRC}COMMON/IES/ApnAggregateMaximumBitRate.c - ${NAS_SRC}COMMON/IES/AuthenticationFailureParameter.c - ${NAS_SRC}COMMON/IES/AuthenticationParameterAutn.c - ${NAS_SRC}COMMON/IES/AuthenticationParameterRand.c - ${NAS_SRC}COMMON/IES/AuthenticationResponseParameter.c - ${NAS_SRC}COMMON/IES/CipheringKeySequenceNumber.c - ${NAS_SRC}COMMON/IES/Cli.c - ${NAS_SRC}COMMON/IES/CsfbResponse.c - ${NAS_SRC}COMMON/IES/DaylightSavingTime.c - ${NAS_SRC}COMMON/IES/DetachType.c - ${NAS_SRC}COMMON/IES/DrxParameter.c - ${NAS_SRC}COMMON/IES/EmergencyNumberList.c - ${NAS_SRC}COMMON/IES/EmmCause.c - ${NAS_SRC}COMMON/IES/EpsAttachResult.c - ${NAS_SRC}COMMON/IES/EpsAttachType.c - ${NAS_SRC}COMMON/IES/EpsBearerContextStatus.c - ${NAS_SRC}COMMON/IES/EpsBearerIdentity.c - ${NAS_SRC}COMMON/IES/EpsMobileIdentity.c - ${NAS_SRC}COMMON/IES/EpsNetworkFeatureSupport.c - ${NAS_SRC}COMMON/IES/EpsQualityOfService.c - ${NAS_SRC}COMMON/IES/EpsUpdateResult.c - ${NAS_SRC}COMMON/IES/EpsUpdateType.c - ${NAS_SRC}COMMON/IES/EsmCause.c - ${NAS_SRC}COMMON/IES/EsmInformationTransferFlag.c - ${NAS_SRC}COMMON/IES/EsmMessageContainer.c - ${NAS_SRC}COMMON/IES/GprsTimer.c - ${NAS_SRC}COMMON/IES/GutiType.c - ${NAS_SRC}COMMON/IES/IdentityType2.c - ${NAS_SRC}COMMON/IES/ImeisvRequest.c - ${NAS_SRC}COMMON/IES/KsiAndSequenceNumber.c - ${NAS_SRC}COMMON/IES/LcsClientIdentity.c - ${NAS_SRC}COMMON/IES/LcsIndicator.c - ${NAS_SRC}COMMON/IES/LinkedEpsBearerIdentity.c - ${NAS_SRC}COMMON/IES/LlcServiceAccessPointIdentifier.c - ${NAS_SRC}COMMON/IES/LocationAreaIdentification.c - ${NAS_SRC}COMMON/IES/MessageType.c - ${NAS_SRC}COMMON/IES/MobileIdentity.c - ${NAS_SRC}COMMON/IES/MobileStationClassmark2.c - ${NAS_SRC}COMMON/IES/MobileStationClassmark3.c - ${NAS_SRC}COMMON/IES/MsNetworkCapability.c - ${NAS_SRC}COMMON/IES/MsNetworkFeatureSupport.c - ${NAS_SRC}COMMON/IES/NasKeySetIdentifier.c - ${NAS_SRC}COMMON/IES/NasMessageContainer.c - ${NAS_SRC}COMMON/IES/NasRequestType.c - ${NAS_SRC}COMMON/IES/NasSecurityAlgorithms.c - ${NAS_SRC}COMMON/IES/NetworkName.c - ${NAS_SRC}COMMON/IES/Nonce.c - ${NAS_SRC}COMMON/IES/PacketFlowIdentifier.c - ${NAS_SRC}COMMON/IES/PagingIdentity.c - ${NAS_SRC}COMMON/IES/PdnAddress.c - ${NAS_SRC}COMMON/IES/PdnType.c - ${NAS_SRC}COMMON/IES/PlmnList.c - ${NAS_SRC}COMMON/IES/ProcedureTransactionIdentity.c - ${NAS_SRC}COMMON/IES/ProtocolConfigurationOptions.c - ${NAS_SRC}COMMON/IES/ProtocolDiscriminator.c - ${NAS_SRC}COMMON/IES/PTmsiSignature.c - ${NAS_SRC}COMMON/IES/QualityOfService.c - ${NAS_SRC}COMMON/IES/RadioPriority.c - ${NAS_SRC}COMMON/IES/SecurityHeaderType.c - ${NAS_SRC}COMMON/IES/ServiceType.c - ${NAS_SRC}COMMON/IES/ShortMac.c - ${NAS_SRC}COMMON/IES/SsCode.c - ${NAS_SRC}COMMON/IES/SupportedCodecList.c - ${NAS_SRC}COMMON/IES/TimeZoneAndTime.c - ${NAS_SRC}COMMON/IES/TimeZone.c - ${NAS_SRC}COMMON/IES/TmsiStatus.c - ${NAS_SRC}COMMON/IES/TrackingAreaIdentity.c - ${NAS_SRC}COMMON/IES/TrackingAreaIdentityList.c - ${NAS_SRC}COMMON/IES/TrafficFlowAggregateDescription.c - ${NAS_SRC}COMMON/IES/TrafficFlowTemplate.c - ${NAS_SRC}COMMON/IES/TransactionIdentifier.c - ${NAS_SRC}COMMON/IES/UeNetworkCapability.c - ${NAS_SRC}COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c - ${NAS_SRC}COMMON/IES/UeSecurityCapability.c - ${NAS_SRC}COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c -) - -set (libnas_utils_OBJS - ${NAS_SRC}COMMON/UTIL/device.c - ${NAS_SRC}COMMON/UTIL/memory.c - ${NAS_SRC}COMMON/UTIL/nas_log.c - ${NAS_SRC}COMMON/UTIL/nas_timer.c - ${NAS_SRC}COMMON/UTIL/socket.c - ${NAS_SRC}COMMON/UTIL/stty.c - ${NAS_SRC}COMMON/UTIL/TLVEncoder.c - ${NAS_SRC}COMMON/UTIL/TLVDecoder.c - ${NAS_SRC}COMMON/UTIL/OctetString.c -) - -if(NAS_UE) - set(libnas_ue_api_OBJS - ${NAS_SRC}UE/API/USER/at_command.c - ${NAS_SRC}UE/API/USER/at_error.c - ${NAS_SRC}UE/API/USER/at_response.c - ${NAS_SRC}UE/API/USER/user_api.c - ${NAS_SRC}UE/API/USER/user_indication.c - ${NAS_SRC}UE/API/USIM/aka_functions.c - ${NAS_SRC}UE/API/USIM/usim_api.c - ) - set(libnas_ue_emm_OBJS - ${NAS_SRC}UE/EMM/Attach.c - ${NAS_SRC}UE/EMM/Authentication.c - ${NAS_SRC}UE/EMM/Detach.c - ${NAS_SRC}UE/EMM/emm_main.c - ${NAS_SRC}UE/EMM/EmmStatusHdl.c - ${NAS_SRC}UE/EMM/Identification.c - ${NAS_SRC}UE/EMM/IdleMode.c - ${NAS_SRC}UE/EMM/LowerLayer.c - ${NAS_SRC}UE/EMM/SecurityModeControl.c - ${NAS_SRC}UE/EMM/ServiceRequestHdl.c - ${NAS_SRC}UE/EMM/TrackingAreaUpdate.c - ) - set(libnas_ue_emm_sap_OBJS - ${NAS_SRC}UE/EMM/SAP/emm_as.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttachNeeded.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregistered.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredInitiated.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredLimitedService.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoImsi.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNormalService.c - ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredPlmnSearch.c - ${NAS_SRC}UE/EMM/SAP/emm_esm.c - ${NAS_SRC}UE/EMM/SAP/emm_fsm.c - ${NAS_SRC}UE/EMM/SAP/EmmNull.c - ${NAS_SRC}UE/EMM/SAP/emm_recv.c - ${NAS_SRC}UE/EMM/SAP/emm_reg.c - ${NAS_SRC}UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c - ${NAS_SRC}UE/EMM/SAP/EmmRegistered.c - ${NAS_SRC}UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c - ${NAS_SRC}UE/EMM/SAP/EmmRegisteredInitiated.c - ${NAS_SRC}UE/EMM/SAP/EmmRegisteredLimitedService.c - ${NAS_SRC}UE/EMM/SAP/EmmRegisteredNoCellAvailable.c - ${NAS_SRC}UE/EMM/SAP/EmmRegisteredNormalService.c - ${NAS_SRC}UE/EMM/SAP/EmmRegisteredPlmnSearch.c - ${NAS_SRC}UE/EMM/SAP/EmmRegisteredUpdateNeeded.c - ${NAS_SRC}UE/EMM/SAP/emm_sap.c - ${NAS_SRC}UE/EMM/SAP/emm_send.c - ${NAS_SRC}UE/EMM/SAP/EmmServiceRequestInitiated.c - ${NAS_SRC}UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c - ) - set (libnas_ue_esm_OBJS - ${NAS_SRC}UE/ESM/DedicatedEpsBearerContextActivation.c - ${NAS_SRC}UE/ESM/DefaultEpsBearerContextActivation.c - ${NAS_SRC}UE/ESM/EpsBearerContextDeactivation.c - ${NAS_SRC}UE/ESM/esm_ebr.c - ${NAS_SRC}UE/ESM/esm_ebr_context.c - ${NAS_SRC}UE/ESM/esm_ip.c - ${NAS_SRC}UE/ESM/esm_main.c - ${NAS_SRC}UE/ESM/esm_pt.c - ${NAS_SRC}UE/ESM/EsmStatusHdl.c - ${NAS_SRC}UE/ESM/PdnConnectivity.c - ${NAS_SRC}UE/ESM/PdnDisconnect.c - ) - set(libnas_ue_esm_sap_OBJS - ${NAS_SRC}UE/ESM/SAP/esm_recv.c - ${NAS_SRC}UE/ESM/SAP/esm_send.c - ${NAS_SRC}UE/ESM/SAP/esm_sap.c - ) - add_library(LIB_NAS_UE - ${NAS_SRC}UE/nas_itti_messaging.c - ${NAS_SRC}UE/nas_network.c - ${NAS_SRC}UE/nas_parser.c - ${NAS_SRC}UE/nas_proc.c - ${NAS_SRC}UE/nas_user.c - ${libnas_api_OBJS} - ${libnas_ue_api_OBJS} - ${libnas_emm_msg_OBJS} - ${libnas_esm_msg_OBJS} - ${libnas_ies_OBJS} - ${libnas_utils_OBJS} - ${libnas_ue_emm_OBJS} - ${libnas_ue_emm_sap_OBJS} - ${libnas_ue_esm_OBJS} - ${libnas_ue_esm_sap_OBJS} - ) - set(NAS_UE_LIB LIB_NAS_UE) - - include_directories(${NAS_SRC}UE) - include_directories(${NAS_SRC}UE/API/USER) - include_directories(${NAS_SRC}UE/API/USIM) - include_directories(${NAS_SRC}UE/EMM) - include_directories(${NAS_SRC}UE/EMM/SAP) - include_directories(${NAS_SRC}UE/ESM) - include_directories(${NAS_SRC}UE/ESM/SAP) -endif() - - - -# Make lfds as a own source code (even if it is a outside library) -# For better intergration with compilation flags & structure of cmake -################################################################### -set(lfds ${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/src/) -file(GLOB lfds_queue ${lfds}/lfds611_queue/*.c) -file(GLOB lfds_ring ${lfds}/lfds611_ringbuffer/*.c) -file(GLOB lfds_slist ${lfds}/lfds611_slist/*.c) -file(GLOB lfds_stack ${lfds}/lfds611_stack/*.c) -file(GLOB lfds_freelist ${lfds}/lfds611_freelist/*.c) - -include_directories(${lfds}) -add_library(LFDS - ${lfds_queue} ${lfds_ring} ${lfds_slist} ${lfds_stack} ${lfds_freelist} - ${lfds}/lfds611_liblfds/lfds611_liblfds_abstraction_test_helpers.c - ${lfds}/lfds611_liblfds/lfds611_liblfds_aligned_free.c - ${lfds}/lfds611_liblfds/lfds611_liblfds_aligned_malloc.c - ${lfds}/lfds611_abstraction/lfds611_abstraction_free.c - ${lfds}/lfds611_abstraction/lfds611_abstraction_malloc.c -) - -# Simulation library -########################## -add_library(SIMU -${OPENAIR1_DIR}/SIMULATION/TOOLS/random_channel.c -${OPENAIR1_DIR}/SIMULATION/TOOLS/rangen_double.c -${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c -${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c -${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c -${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c -${OPENAIR1_DIR}/SIMULATION/RF/rf.c -${OPENAIR1_DIR}/SIMULATION/RF/dac.c -${OPENAIR1_DIR}/SIMULATION/RF/adc.c -) - -add_library(SIMU_ETH -${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c -${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c -${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c -${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c -${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/emu_transport.c -${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/pgm_link.c -) - -add_library(OPENAIR0_LIB - ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c -) - -# System packages that are required -# We use either the cmake buildin, in ubuntu are in: /usr/share/cmake*/Modules/ -# or cmake provide a generic interface to pkg-config that widely used -################################### -include(FindPkgConfig) - -pkg_search_module(LIBXML2 libxml-2.0 REQUIRED) -include_directories(${LIBXML2_INCLUDE_DIRS}) - -pkg_search_module(LIBXSLT libxslt REQUIRED) -include_directories(${LIBXSLT_INCLUDE_DIRS}) - -pkg_search_module(OPENSSL openssl REQUIRED) -include_directories(${OPENSSL_INCLUDE_DIRS}) - -pkg_search_module(CONFIG libconfig REQUIRED) -include_directories(${CONFIG_INCLUDE_DIRS}) - -pkg_search_module(CRYPTO libcrypto REQUIRED) -include_directories(${CRYPTO_INCLUDE_DIRS}) - -#use native cmake method as this package is not in pkg-config -if (${RF_BOARD} STREQUAL "OAI_USRP") - find_package(Boost REQUIRED) - include_directories(${LIBBOOST_INCLUDE_DIR}) -endif (${RF_BOARD} STREQUAL "OAI_USRP") - -pkg_search_module(OPENPGM openpgm-5.1) -if(NOT ${OPENPGM_FOUND}) - message("PACKAGE openpgm-5.1 is required by binaries such as oaisim: will fail later if this target is built") -else() - include_directories(${OPENPGM_INCLUDE_DIRS}) -endif() - -pkg_search_module(NETTLE nettle) -if(NOT ${NETTLE_FOUND}) - message("PACKAGE nettle not found: some targets will fail") -else() - include_directories(${NETTLE_INCLUDE_DIRS}) -endif() - -pkg_search_module(XPM xpm) -if(NOT ${XPM_FOUND}) - message("PACKAGE xpm not found: some targets will fail") -else() - include_directories(${XPM_INCLUDE_DIRS}) -endif() - -# Atlas is required by some packages, but not found in pkg-config -if(EXISTS "/usr/include/atlas/cblas.h") - include_directories("/usr/include/atlas") - list(APPEND ATLAS_LIBRARIES lapack cblas atlas) -else() - message("No Blas/Atlas libs found, some targets will fail") -endif() - -if (${XFORMS}) - include_directories ("/usr/include/X11") - set(XFORMS_SOURCE - ${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope.c - ) - set(XFORMS_SOURCE_SOFTMODEM - ${OPENAIR_TARGETS}/RT/USER/stats.c - ) - set(XFORMS_LIBRARIES "forms") -endif (${XFORMS}) - -set(CMAKE_MODULE_PATH "${OPENAIR_DIR}/cmake_targets/tools/MODULES" "${CMAKE_MODULE_PATH}") - - -# Hack on a test of asn1c version (already dirty) -add_definitions(-DASN1_MINIMUM_VERSION=924) - -################################# -# add executables for operation -################################# - -# lte-softmodem is both eNB and UE implementation -################################################### - -add_executable(lte-softmodem - ${rrc_h} - ${s1ap_h} - ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c - ${OPENAIR_TARGETS}/RT/USER/lte-ue.c - ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c - ${OPENAIR_TARGETS}/RT/USER/lte-enb.c - ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c - ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c - ${OPENAIR_TARGETS}/COMMON/create_tasks.c - ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c - ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c - ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c - ${GTPU_need_ITTI} - ${HW_SOURCE} - ${TRANSPORT_SOURCE} - ${RTAI_SOURCE} - ${XFORMS_SOURCE} - ${XFORMS_SOURCE_SOFTMODEM} - ) - -target_link_libraries (lte-softmodem - -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} - -Wl,--end-group ) - - -target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) -target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) -target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES}) -target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES}) - -# lte-softmodem-nos1 is both eNB and UE implementation -################################################### -add_executable(lte-softmodem-nos1 - ${rrc_h} - ${s1ap_h} - ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c - ${OPENAIR_TARGETS}/RT/USER/lte-ue.c - ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c - ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c - ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c - ${OPENAIR_TARGETS}/COMMON/create_tasks.c - ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c - #${OPENAIR2_DIR}/RRC/NAS/nas_config.c # enable if you want rrc to mount ip interface - #${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c - ${HW_SOURCE} - ${TRANSPORT_SOURCE} - ${RTAI_SOURCE} - ${XFORMS_SOURCE} - ${XFORMS_SOURCE_SOFTMODEM} - ) -target_link_libraries (lte-softmodem-nos1 - -Wl,--start-group - RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} - -Wl,--end-group ) - -target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES}) -target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) -target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES}) -target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES}) - -# rrh -################################ -#Note: only one RF type (USRP) is currently supported for RRH -add_executable(rrh_gw - ${OPENAIR_TARGETS}/RT/USER/rrh_gw.c - ${OPENAIR_TARGETS}/RT/USER/eNB_transport_IQ.c - ${OPENAIR_TARGETS}/RT/USER/UE_transport_IQ.c - ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c - ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c - ${HW_SOURCE} - ${TRANSPORT_SOURCE} - ) -target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti) -target_link_libraries(rrh_gw - -Wl,--start-group - UTIL LFDS - -Wl,--end-group ) -target_link_libraries (rrh_gw rt pthread m ) -target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} ) -target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES}) - -Message("-- option_HW_lib=${option_HW_lib}") -Message("-- HW_SOURCE=${HW_SOURCE}") -Message("-- option_TP_lib=${option_TP_lib}") -Message("-- TRANSPORT_SOURCE=${TRANSPORT_SOURCE}") - -if (${RF_BOARD} STREQUAL "OAI_LMSSDR") - add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C) - add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C) - add_dependencies(rrh_gw LMS7002M LMS_SDR Si5351C) -endif (${RF_BOARD} STREQUAL "OAI_LMSSDR") - - - -# USIM process -################# -#add_executable(usim -# ${OPENAIR3_DIR}/NAS/TOOLS/usim_data.c -# ${OPENAIR3_DIR}/NAS/USER/API/USIM/usim_api.c -# ${OPENAIR3_DIR}/NAS/USER/API/USIM/aka_functions.c -# ${OPENAIR3_DIR}/NAS/COMMON/UTIL/memory.c -# ${OPENAIR3_DIR}/NAS/COMMON/UTIL/nas_log.c -# ${OPENAIR3_DIR}/NAS/COMMON/UTIL/OctetString.c -# ${OPENAIR3_DIR}/NAS/COMMON/UTIL/TLVEncoder.c -# ) -#target_link_libraries (usim ${NAS_LIB} UTIL ${ITTI_LIB} LFDS pthread rt nettle crypto m) - -# ??? -##################### -#add_executable(nvram -# ${OPENAIR3_DIR}/NAS/TOOLS/ue_data.c -# ${OPENAIR3_DIR}/NAS/COMMON/UTIL/memory.c -# ${OPENAIR3_DIR}/NAS/COMMON/UTIL/nas_log.c -# ) -#target_link_libraries (nvram LIB_NAS_UE UTIL ${ITTI_LIB} LFDS pthread rt nettle crypto m) - - -###################################" -# Addexecutables for tests -#################################### - -# A all in one network simulator -################ -add_executable(oaisim - ${rrc_h} - ${s1ap_h} - ${x2ap_h} - ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_TARGETS}/SIMU/USER/channel_sim.c - ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c - ${OPENAIR_TARGETS}/SIMU/USER/oaisim_config.c - ${OPENAIR_TARGETS}/SIMU/USER/sinr_sim.c - ${OPENAIR_TARGETS}/SIMU/USER/cor_SF_sim.c - ${OPENAIR_TARGETS}/SIMU/USER/oaisim_functions.c - ${OPENAIR_TARGETS}/SIMU/USER/event_handler.c - ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c - ${OPENAIR2_DIR}/RRC/NAS/nas_config.c - ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR2_DIR}/UTIL/OMG/sumo.c - ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c - ${GTPU_need_ITTI} - ${OPENAIR_TARGETS}/COMMON/create_tasks.c - ${HW_SOURCE} - ${TRANSPORT_SOURCE} - ${XFORMS_SOURCE} -) - - -target_include_directories(oaisim PUBLIC ${OPENAIR_TARGETS}/SIMU/USER) -target_link_libraries (oaisim - -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} LIB_NAS_UE SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} - -Wl,--end-group ) - -target_link_libraries (oaisim ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES}) -target_link_libraries (oaisim pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} - ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES}) -#Force link with forms, regardless XFORMS option -target_link_libraries (oaisim forms) - - - -# A all in one network simulator -################ -add_executable(oaisim_nos1 - ${rrc_h} - ${s1ap_h} - ${x2ap_h} - ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_TARGETS}/SIMU/USER/channel_sim.c - ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c - ${OPENAIR_TARGETS}/SIMU/USER/oaisim_config.c - ${OPENAIR_TARGETS}/SIMU/USER/sinr_sim.c - ${OPENAIR_TARGETS}/SIMU/USER/cor_SF_sim.c - ${OPENAIR_TARGETS}/SIMU/USER/oaisim_functions.c - ${OPENAIR_TARGETS}/SIMU/USER/event_handler.c - ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c - ${OPENAIR2_DIR}/RRC/NAS/nas_config.c - ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR2_DIR}/UTIL/OMG/sumo.c - ${OPENAIR_TARGETS}/COMMON/create_tasks.c - ${HW_SOURCE} - ${TRANSPORT_SOURCE} - ${XFORMS_SOURCE} -) -target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER) -target_link_libraries (oaisim_nos1 - -Wl,--start-group - RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} - -Wl,--end-group ) - -target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES}) -target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} - ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES}) -#Force link with forms, regardless XFORMS option -target_link_libraries (oaisim_nos1 forms) - - -# Unitary tests for each piece of L1: example, mbmssim is MBMS L1 simulator -##################################### - -foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim) - add_executable(${myExe} - ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c - ${XFORMS_SOURCE} - ) - target_link_libraries (${myExe} - -Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group - pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} - ) -endforeach(myExe) - -add_executable(test_epc_generate_scenario - ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.h - ${OPENAIR2_DIR}/ENB_APP/enb_config.h - ${OPENAIR2_DIR}/COMMON/commonDef.h - ${OPENAIR2_DIR}/COMMON/messages_def.h - ${OPENAIR2_DIR}/COMMON/messages_types.h - ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h - ${OPENAIR_BIN_DIR}/messages_xml.h - ) -target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} - ) - -add_executable(test_epc_play_scenario - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_decode.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_display.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_fsm.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_parse.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_sctp.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h - ${OPENAIR2_DIR}/COMMON/commonDef.h - ${OPENAIR2_DIR}/COMMON/messages_def.h - ${OPENAIR2_DIR}/COMMON/messages_types.h - ${OPENAIR_BIN_DIR}/messages_xml.h - ) -target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c) -target_link_libraries (test_epc_play_scenario - -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} - ) - - -#unitary tests for Core NEtwork pieces -################################# -foreach(myExe s1ap - secu_knas_encrypt_eia1 - secu_kenb - aes128_ctr_encrypt - aes128_ctr_decrypt - secu_knas_encrypt_eea2 - secu_knas secu_knas_encrypt_eea1 - kdf - aes128_cmac_encrypt - secu_knas_encrypt_eia2) - add_executable(test_${myExe} - ${OPENAIR3_DIR}/TEST/test_util.c - ${OPENAIR3_DIR}/TEST/test_${myExe}.c - ) - target_link_libraries (test_${myExe} - -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} - ) -endforeach(myExe) - -# to be added -#../targets/TEST/PDCP/test_pdcp.c -#../targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c + add_boolean_option(USE_MME False "this flag is used only one time in lte-softmodem.c") + add_list_string_option(PACKAGE_NAME "NotDefined" "As per attribute name") + add_boolean_option(MESSAGE_CHART_GENERATOR False "For generating sequence diagrams") + add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams") + add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams") + + add_boolean_option(ENB_AGENT True "enable eNB agent to inteface with a SDN contrller") + + ######################## + # Include order + ########################## + add_boolean_option(ENB_MODE True "Swap the include directories between openair2 and openair3" ) + + ########################## + # Emulation options + ########################## + add_boolean_option(ENABLE_PGM_TRANSPORT False "specific to oaisim, emulation through ethernet, reliable multicast") + add_boolean_option(ADDR_CONF False "specific to oaisim, IP autoconf of user-plane IP interface") + add_boolean_option(OPENAIR_EMU False "specific to oaisim") + add_boolean_option(OAI_EMU False "specific to oaisim") + add_boolean_option(PHY_ABSTRACTION False "specific to oaisim") + + ########################## + # SCHEDULING/REAL-TIME/PERF options + ########################## + add_boolean_option(ENABLE_USE_CPU_EXECUTION_TIME True "Add data in vcd traces: disable it if perf issues") + add_boolean_option(ENABLE_VCD True "always true now, time measurements of proc calls and var displays") + add_boolean_option(ENABLE_VCD_FIFO True "time measurements of proc calls and var displays sent to FIFO (one more thread)") + add_boolean_option(HARD_RT False "???") + add_boolean_option(LINUX False "used in weird memcpy() in pdcp.c ???") + add_boolean_option(LINUX_LIST False "used only in lists.c: either use OAI implementation of lists or Linux one (should be True, but it is False") + add_boolean_option(LOG_NO_THREAD True "Disable thread for log, seems always set to true") + add_boolean_option(OPENAIR_LTE True "Seems legacy: keep it to true") + + ########################## + # PHY options + ########################## + add_boolean_option(DRIVER2013 True "only relevant for EXMIMO") + add_boolean_option(ENABLE_FXP True "????") + add_boolean_option(ENABLE_NEW_MULTICAST False "specific to oaisim") + add_boolean_option(EXMIMO_IOT True "????") + add_boolean_option(LARGE_SCALE False "specific to oaisim: defines max eNB=2 and max UE=120") + add_boolean_option(LOCALIZATION False "???") + add_integer_option(MAX_NUM_CCs 1 "????") + add_boolean_option(MU_RECEIVER False "????") + add_boolean_option(NEW_FFT True "????") + add_boolean_option(OPENAIR1 True "????") + add_boolean_option(PBS_SIM False "????") + add_boolean_option(PC_DSP True "????") + add_boolean_option(PC_TARGET True "????") + add_boolean_option(PERFECT_CE False "????") + add_boolean_option(PHYSIM True "for L1 simulators (dlsim, ulsim, ...)") + add_boolean_option(PHY_CONTEXT True "not clear: must remain False for dlsim") + add_boolean_option(PHY_EMUL False "not clear: must remain False for dlsim") + add_boolean_option(PUCCH True "????") + add_boolean_option(RANDOM_BF False "????") + add_boolean_option(SMBV False "Rohde&Schwarz SMBV100A vector signal generator") + add_boolean_option(DEBUG_PHY False "Enable PHY layer debugging options") + add_boolean_option(DEBUG_PHY_PROC False "Enable debugging of PHY layer procedures") + add_boolean_option(DEBUG_DLSCH False "Enable debugging of DLSCH physical layer channel") + + ########################## + # 802.21 options + ########################## + add_boolean_option(ENABLE_RAL False "ENABLE 802.21 INTERFACE") + add_boolean_option(USE_3GPP_ADDR_AS_LINK_ADDR False "As per attribute name") + + ########################## + # NAS LAYER OPTIONS + ########################## + add_boolean_option(ENABLE_NAS_UE_LOGGING True "????") + add_boolean_option(NAS_BUILT_IN_UE True "UE NAS layer present in this executable") + add_boolean_option(NAS_UE True "NAS UE INSTANCE (<> NAS_MME)") + + + ########################## + # ACCESS STRATUM LAYER2 OPTIONS + ########################## + add_boolean_option(MAC_CONTEXT True "specific to oaisim") + add_boolean_option(JUMBO_FRAME True "ENABLE LARGE SDU in ACCESS STRATUM (larger than common MTU)") + + ########################## + # RLC LAYER OPTIONS + ########################## + add_boolean_option(OPENAIR2 True "Access Stratum layer 2 built in executable") + add_boolean_option(TRACE_RLC_PAYLOAD False "Fatal assert in this case") + add_boolean_option(RLC_STOP_ON_LOST_PDU False "Fatal assert in this case") + + add_boolean_option(TRACE_RLC_MUTEX True "TRACE for RLC, possible problem in thread scheduling") + add_boolean_option(TRACE_RLC_AM_BO False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_FREE_SDU False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_HOLE False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_PDU False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_RESEGMENT False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_RX False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_RX_DECODE False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_TX False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_TX_STATUS False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_AM_STATUS_CREATION False "TRACE for RLC AM, TO BE CHANGED IN A MORE GENERAL FLAG") + + add_boolean_option(STOP_ON_IP_TRAFFIC_OVERLOAD False "") + add_boolean_option(TRACE_RLC_UM_DAR False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_UM_DISPLAY_ASCII_DATA False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_UM_PDU False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_UM_RX False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_UM_SEGMENT False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") + add_boolean_option(TRACE_RLC_UM_TX_STATUS False "TRACE for RLC UM, TO BE CHANGED IN A MORE GENERAL FLAG") + + + ########################## + # PDCP LAYER OPTIONS + ########################## + add_boolean_option(PDCP_USE_NETLINK False "For eNB, PDCP communicate with a NETLINK socket if connected to network driver, else could use a RT-FIFO") + add_boolean_option(PDCP_USE_NETLINK_QUEUES False "When PDCP_USE_NETLINK is true, incoming IP packets are stored in queues") + add_boolean_option(LINK_ENB_PDCP_TO_IP_DRIVER False "For eNB, PDCP communicate with a IP driver") + add_boolean_option(LINK_ENB_PDCP_TO_GTPV1U True "For eNB, PDCP communicate with GTP-U protocol (eNB<->S-GW)") + + ########################## + # RRC LAYER OPTIONS + ########################## + add_boolean_option(RRC_DEFAULT_RAB_IS_AM False "Otherwise it is UM, configure params are actually set in rrc_eNB.c:rrc_eNB_generate_defaultRRCConnectionReconfiguration(...)") + + + ########################## + # S1AP LAYER OPTIONS + ########################## + # none + + ########################## + # PROJECTS (IST, FRENCH COLL., etc) + # SPECIFIC OPTIONS + ########################## + add_boolean_option(SPECTRA False "???") + add_boolean_option(MIH_C_MEDIEVAL_EXTENSIONS False "EXTENSIONS TO MIH 802.21 IN CONTEXT OF IST PROJECT CALLED MEDIEVAL") + + + + add_boolean_option(EMOS False "????") + if(${EMOS}) + add_definitions("-D_FILE_OFFSET_BITS=64") + set(EMOS_LIB gps) + endif(${EMOS}) + + + # add the binary tree to the search path for include files + ####################################################### + # We will find ConfigOAI.h after generation in target directory + include_directories("${OPENAIR_BIN_DIR}") + # add directories to find all include files + # the internal rule is to use generic names such as defs.h + # but to make it uniq name as adding the relative path in the include directtive + # example: #include "RRC/LITE/defs.h" + #find_path (include_dirs_all *.h ${OPENAIR_DIR}) + #find_path (include_dirs_all *.h PATHS /usr/include NO_CMAKE_PATH) + #include_directories("${include_dirs_all}") + + # Legacy exact order + if(ENB_MODE) + include_directories("${OPENAIR2_DIR}/COMMON") + include_directories("${OPENAIR2_DIR}/UTIL") + include_directories("${OPENAIR2_DIR}/UTIL/LOG") + include_directories("${OPENAIR3_DIR}/COMMON") + include_directories("${OPENAIR3_DIR}/UTILS") + else() + include_directories("${OPENAIR3_DIR}/COMMON") + include_directories("${OPENAIR3_DIR}/UTILS") + include_directories("${OPENAIR2_DIR}/COMMON") + include_directories("${OPENAIR2_DIR}/UTIL") + include_directories("${OPENAIR2_DIR}/UTIL/LOG") + endif() + include_directories("${OPENAIR1_DIR}") + include_directories("${OPENAIR2_DIR}/NAS") + include_directories("${OPENAIR2_DIR}") + include_directories("${OPENAIR2_DIR}/LAYER2/RLC") + include_directories("${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0") + include_directories("${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0") + include_directories("${OPENAIR2_DIR}/LAYER2/RLC/TM_v9.3.0") + include_directories("${OPENAIR2_DIR}/LAYER2/PDCP_v10.1.0") + include_directories("${OPENAIR2_DIR}/RRC/LITE/MESSAGES") + include_directories("${OPENAIR2_DIR}/RRC/LITE") + include_directories("${OPENAIR3_DIR}/RAL-LTE/INTERFACE-802.21/INCLUDE") + include_directories("${OPENAIR3_DIR}/RAL-LTE/LTE_RAL_ENB/INCLUDE") + include_directories("${OPENAIR3_DIR}/RAL-LTE/LTE_RAL_UE/INCLUDE") + include_directories("${OPENAIR_DIR}/common/utils") + include_directories("${OPENAIR_DIR}/common/utils/itti") + include_directories("${OPENAIR3_DIR}/NAS/COMMON") + include_directories("${OPENAIR3_DIR}/NAS/COMMON/API/NETWORK") + include_directories("${OPENAIR3_DIR}/NAS/COMMON/EMM/MSG") + include_directories("${OPENAIR3_DIR}/NAS/COMMON/ESM/MSG") + include_directories("${OPENAIR3_DIR}/NAS/COMMON/IES") + include_directories("${OPENAIR3_DIR}/NAS/COMMON/UTIL") + include_directories("${OPENAIR3_DIR}/SECU") + include_directories("${OPENAIR3_DIR}/SCTP") + include_directories("${OPENAIR3_DIR}/S1AP") + include_directories("${OPENAIR2_DIR}/X2AP") + include_directories("${OPENAIR3_DIR}/UDP") + include_directories("${OPENAIR3_DIR}/GTPV1-U") + include_directories("${OPENAIR_DIR}/targets/COMMON") + include_directories("${OPENAIR_DIR}/targets/ARCH/COMMON") + include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/USERSPACE/LIB/") + include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/DEFS") + include_directories("${OPENAIR2_DIR}/ENB_APP") + include_directories("${OPENAIR2_DIR}/UTIL/OSA") + include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/inc") + include_directories("${OPENAIR2_DIR}/UTIL/MEM") + include_directories("${OPENAIR2_DIR}/UTIL/LISTS") + include_directories("${OPENAIR2_DIR}/UTIL/FIFO") + include_directories("${OPENAIR2_DIR}/UTIL/OCG") + include_directories("${OPENAIR2_DIR}/UTIL/MATH") + include_directories("${OPENAIR2_DIR}/UTIL/TIMER") + include_directories("${OPENAIR2_DIR}/UTIL/OMG") + include_directories("${OPENAIR2_DIR}/UTIL/OTG") + include_directories("${OPENAIR2_DIR}/UTIL/CLI") + include_directories("${OPENAIR2_DIR}/UTIL/OPT") + include_directories("${OPENAIR2_DIR}/UTIL/OMV") + include_directories("${OPENAIR2_DIR}/RRC/LITE/MESSAGES") + include_directories("${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/shared") + include_directories("${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/include") + include_directories("${OPENAIR_DIR}") + + # Utilities Library + ################ + add_library(HASHTABLE + ${OPENAIR_DIR}/common/utils/collection/hashtable/hashtable.c + ${OPENAIR_DIR}/common/utils/collection/hashtable/obj_hashtable.c + ) + include_directories(${OPENAIR_DIR}/common/utils/collection/hashtable) + + if (MESSAGE_CHART_GENERATOR) + add_library(MSC + ${OPENAIR_DIR}/common/utils/msc/msc.c + ) + set(MSC_LIB MSC) + endif() + include_directories(${OPENAIR_DIR}/common/utils/msc) + + set(UTIL_SRC + ${OPENAIR2_DIR}/UTIL/CLI/cli.c + ${OPENAIR2_DIR}/UTIL/CLI/cli_cmd.c + ${OPENAIR2_DIR}/UTIL/CLI/cli_server.c + ${OPENAIR2_DIR}/UTIL/FIFO/pad_list.c + ${OPENAIR2_DIR}/UTIL/LISTS/list.c + ${OPENAIR2_DIR}/UTIL/LISTS/list2.c + ${OPENAIR2_DIR}/UTIL/LOG/log.c + ${OPENAIR2_DIR}/UTIL/LOG/vcd_signal_dumper.c + ${OPENAIR2_DIR}/UTIL/MATH/oml.c + ${OPENAIR2_DIR}/UTIL/MEM/mem_block.c + ${OPENAIR2_DIR}/UTIL/OCG/OCG.c + ${OPENAIR2_DIR}/UTIL/OCG/OCG_create_dir.c + ${OPENAIR2_DIR}/UTIL/OCG/OCG_detect_file.c + ${OPENAIR2_DIR}/UTIL/OCG/OCG_generate_report.c + ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c + ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c + ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c + ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c + ${OPENAIR2_DIR}/UTIL/OMG/common.c + ${OPENAIR2_DIR}/UTIL/OMG/grid.c + ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c + ${OPENAIR2_DIR}/UTIL/OMG/job.c + ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c + ${OPENAIR2_DIR}/UTIL/OMG/omg.c + ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c + ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c + ${OPENAIR2_DIR}/UTIL/OMG/rwp.c + ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c + ${OPENAIR2_DIR}/UTIL/OMG/static.c + ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c + ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c + ${OPENAIR2_DIR}/UTIL/OMG/trace.c + ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c + ${OPENAIR2_DIR}/UTIL/OPT/probe.c + ${OPENAIR2_DIR}/UTIL/OTG/otg_tx.c + ${OPENAIR2_DIR}/UTIL/OTG/otg.c + ${OPENAIR2_DIR}/UTIL/OTG/otg_kpi.c + ${OPENAIR2_DIR}/UTIL/OTG/otg_models.c + ${OPENAIR2_DIR}/UTIL/OTG/otg_form.c + ${OPENAIR2_DIR}/UTIL/OTG/otg_rx.c + ) + add_library(UTIL ${UTIL_SRC}) + + set(SECU_OSA_SRC + ${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eea.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c + ) + add_library(SECU_OSA ${SECU_OSA_SRC}) + + set(SECU_CN_SRC + ${OPENAIR3_DIR}/SECU/kdf.c + ${OPENAIR3_DIR}/SECU/rijndael.c + ${OPENAIR3_DIR}/SECU/snow3g.c + ${OPENAIR3_DIR}/SECU/key_nas_deriver.c + ${OPENAIR3_DIR}/SECU/nas_stream_eea1.c + ${OPENAIR3_DIR}/SECU/nas_stream_eia1.c + ${OPENAIR3_DIR}/SECU/nas_stream_eea2.c + ${OPENAIR3_DIR}/SECU/nas_stream_eia2.c + ) + add_library(SECU_CN ${SECU_CN_SRC}) + + # Scheduler + ################################" + file(GLOB SCHED_SRC ${OPENAIR1_DIR}/SCHED/*.c) + add_library(SCHED_LIB ${SCHED_SRC}) + + # Layer 1 + ############################# + set(PHY_SRC + # depend on code generation from asn1c + ${RRC_FULL_DIR}/asn1_constants.h + # actual source + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_demodulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_llr_computation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/power_control.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_decoding.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_scrambling.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/uci_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/srs_modulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/drs_modulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_modulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_coding.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_decoding.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/print_stats.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/initial_sync.c + ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c + ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c + ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c + ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c + ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_timefreq.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_eNB_measurements.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/adjust_gain.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_cell_spec.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_uespec.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold_mbsfn.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_mbsfn.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_ul_ref.c + ${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c + ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c + ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c + ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c + ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c + ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c + ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c + ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c + ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c + ${OPENAIR1_DIR}/PHY/CODING/rate_matching.c + ${OPENAIR1_DIR}/PHY/CODING/viterbi.c + ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c + ${OPENAIR1_DIR}/PHY/INIT/lte_init.c + ${OPENAIR1_DIR}/PHY/INIT/lte_parms.c + ${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c + ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c + ${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c + ${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c + ${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c + ${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c + ${OPENAIR1_DIR}/PHY/TOOLS/cdot_prod.c + ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c + ${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c + ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c + ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c + ${OPENAIR1_DIR}/PHY/TOOLS/lut.c + ) + if (${SMBV}) + set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c") + endif (${SMBV}) + add_library(PHY ${PHY_SRC}) + + #Layer 2 library + ##################### + set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC) + set(RLC_DIR ${OPENAIR2_DIR}/LAYER2/RLC) + set(RLC_UM_DIR ${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0) + set(RLC_AM_DIR ${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0) + set(RLC_TM_DIR ${OPENAIR2_DIR}/LAYER2/RLC/TM_v9.3.0) + set(RRC_DIR ${OPENAIR2_DIR}/RRC/LITE) + set(PDCP_DIR ${OPENAIR2_DIR}/LAYER2/PDCP_v10.1.0) + set(L2_SRC + ${OPENAIR2_DIR}/LAYER2/openair2_proc.c + ${PDCP_DIR}/pdcp.c + ${PDCP_DIR}/pdcp_fifo.c + ${PDCP_DIR}/pdcp_sequence_manager.c + ${PDCP_DIR}/pdcp_primitives.c + ${PDCP_DIR}/pdcp_util.c + ${PDCP_DIR}/pdcp_security.c + ${PDCP_DIR}/pdcp_netlink.c + ${RLC_AM_DIR}/rlc_am.c + ${RLC_AM_DIR}/rlc_am_init.c + ${RLC_AM_DIR}/rlc_am_timer_poll_retransmit.c + ${RLC_AM_DIR}/rlc_am_timer_reordering.c + ${RLC_AM_DIR}/rlc_am_timer_status_prohibit.c + ${RLC_AM_DIR}/rlc_am_segment.c + ${RLC_AM_DIR}/rlc_am_segments_holes.c + ${RLC_AM_DIR}/rlc_am_in_sdu.c + ${RLC_AM_DIR}/rlc_am_receiver.c + ${RLC_AM_DIR}/rlc_am_retransmit.c + ${RLC_AM_DIR}/rlc_am_windows.c + ${RLC_AM_DIR}/rlc_am_rx_list.c + ${RLC_AM_DIR}/rlc_am_reassembly.c + ${RLC_AM_DIR}/rlc_am_status_report.c + ${RLC_TM_DIR}/rlc_tm.c + ${RLC_TM_DIR}/rlc_tm_init.c + ${RLC_UM_DIR}/rlc_um.c + ${RLC_UM_DIR}/rlc_um_fsm.c + ${RLC_UM_DIR}/rlc_um_control_primitives.c + ${RLC_UM_DIR}/rlc_um_segment.c + ${RLC_UM_DIR}/rlc_um_reassembly.c + ${RLC_UM_DIR}/rlc_um_receiver.c + ${RLC_UM_DIR}/rlc_um_dar.c + ${RLC_DIR}/rlc_mac.c + ${RLC_DIR}/rlc.c + ${RLC_DIR}/rlc_rrc.c + ${RLC_DIR}/rlc_mpls.c + ${RRC_DIR}/rrc_UE.c + ${RRC_DIR}/rrc_eNB.c + ${RRC_DIR}/rrc_eNB_S1AP.c + ${RRC_DIR}/rrc_eNB_UE_context.c + ${RRC_DIR}/rrc_common.c + ${RRC_DIR}/L2_interface.c + ) + set (MAC_SRC + ${MAC_DIR}/lte_transport_init.c + ${MAC_DIR}/main.c + ${MAC_DIR}/ue_procedures.c + ${MAC_DIR}/ra_procedures.c + ${MAC_DIR}/l1_helpers.c + ${MAC_DIR}/rar_tools.c + ${MAC_DIR}/eNB_scheduler.c + ${MAC_DIR}/eNB_scheduler_dlsch.c + ${MAC_DIR}/eNB_scheduler_ulsch.c + ${MAC_DIR}/eNB_scheduler_mch.c + ${MAC_DIR}/eNB_scheduler_bch.c + ${MAC_DIR}/eNB_scheduler_primitives.c + ${MAC_DIR}/eNB_scheduler_RA.c + ${MAC_DIR}/pre_processor.c + ${MAC_DIR}/config.c + ) + + set (ENB_APP_SRC + ${OPENAIR2_DIR}/ENB_APP/enb_app.c + ${OPENAIR2_DIR}/ENB_APP/enb_config.c + ) + + add_library(L2 + ${L2_SRC} + ${MAC_SRC} + ${ENB_APP_SRC}) + # ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c) + + # L3 Libs + ########################## + + set(RAL_LTE_DIR ${OPENAIR3_DIR}/RAL-LTE/) + if (${ENABLE_RAL}) + set(RAL_LTE_SRC + ${RRC_DIR}/rrc_UE_ral.c + ${RRC_DIR}/rrc_eNB_ral.c + ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_action.c + ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_main.c + ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_mih_msg.c + ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_parameters.c + ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_process.c + ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_rrc_msg.c + ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_subscribe.c + ${RAL_LTE_DIR}LTE_RAL_ENB/SRC/lteRALenb_thresholds.c + ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_action.c + ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_main.c + ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_mih_msg.c + ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_parameters.c + ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_process.c + ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_rrc_msg.c + ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_subscribe.c + ${RAL_LTE_DIR}LTE_RAL_UE/SRC/lteRALue_thresholds.c + ) + add_library(RAL ${RAL_LTE_SRC}) + set(RAL_LIB RAL) + endif() + + if(${MIH_C_MEDIEVAL_EXTENSIONS}) + set(MIH_SRC + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_header_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_msg_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_primitive_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F1_basic_data_types_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F2_general_data_types_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F3_data_types_for_address_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F4_data_types_for_links_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F9_data_types_for_qos_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F13_data_types_for_information_elements_codec.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_L2_type_values_for_tlv_encoding.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_Medieval_extensions.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_bit_buffer.c + ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C.c + ) + add_library(MIH ${MIH_SRC}) + set(MIH_LIB MIH) + endif() + + # CN libs + ########################## + + add_library(CN_UTILS + ${OPENAIR3_DIR}/UTILS/conversions.c + ${OPENAIR3_DIR}/UTILS/enum_string.c + ${OPENAIR3_DIR}/UTILS/log.c + ${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c + ) + + set(GTPV1U_DIR ${OPENAIR3_DIR}/GTPV1-U) + set (GTPV1U_SRC + ${RRC_DIR}/rrc_eNB_GTPV1U.c + ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c + ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uTrxn.c + ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uMsg.c + ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1u.c + ${GTPV1U_DIR}/gtpv1u_teid_pool.c + ) + add_library(GTPV1U ${GTPV1U_SRC}) + + set(SCTP_SRC + ${OPENAIR3_DIR}/SCTP/sctp_common.c + ${OPENAIR3_DIR}/SCTP/sctp_eNB_task.c + ${OPENAIR3_DIR}/SCTP/sctp_eNB_itti_messaging.c + ) + add_library(SCTP_CLIENT ${SCTP_SRC}) + + add_library(UDP ${OPENAIR3_DIR}/UDP/udp_eNB_task.c) + + + set(NAS_SRC ${OPENAIR3_DIR}/NAS/) + set(libnas_api_OBJS + ${NAS_SRC}COMMON/API/NETWORK/as_message.c + ${NAS_SRC}COMMON/API/NETWORK/nas_message.c + ${NAS_SRC}COMMON/API/NETWORK/network_api.c + ) + + set(libnas_emm_msg_OBJS + ${NAS_SRC}COMMON/EMM/MSG/AttachAccept.c + ${NAS_SRC}COMMON/EMM/MSG/AttachComplete.c + ${NAS_SRC}COMMON/EMM/MSG/AttachReject.c + ${NAS_SRC}COMMON/EMM/MSG/AttachRequest.c + ${NAS_SRC}COMMON/EMM/MSG/AuthenticationFailure.c + ${NAS_SRC}COMMON/EMM/MSG/AuthenticationReject.c + ${NAS_SRC}COMMON/EMM/MSG/AuthenticationRequest.c + ${NAS_SRC}COMMON/EMM/MSG/AuthenticationResponse.c + ${NAS_SRC}COMMON/EMM/MSG/CsServiceNotification.c + ${NAS_SRC}COMMON/EMM/MSG/DetachAccept.c + ${NAS_SRC}COMMON/EMM/MSG/DetachRequest.c + ${NAS_SRC}COMMON/EMM/MSG/DownlinkNasTransport.c + ${NAS_SRC}COMMON/EMM/MSG/EmmInformation.c + ${NAS_SRC}COMMON/EMM/MSG/emm_msg.c + ${NAS_SRC}COMMON/EMM/MSG/EmmStatus.c + ${NAS_SRC}COMMON/EMM/MSG/ExtendedServiceRequest.c + ${NAS_SRC}COMMON/EMM/MSG/GutiReallocationCommand.c + ${NAS_SRC}COMMON/EMM/MSG/GutiReallocationComplete.c + ${NAS_SRC}COMMON/EMM/MSG/IdentityRequest.c + ${NAS_SRC}COMMON/EMM/MSG/IdentityResponse.c + ${NAS_SRC}COMMON/EMM/MSG/SecurityModeCommand.c + ${NAS_SRC}COMMON/EMM/MSG/SecurityModeComplete.c + ${NAS_SRC}COMMON/EMM/MSG/SecurityModeReject.c + ${NAS_SRC}COMMON/EMM/MSG/ServiceReject.c + ${NAS_SRC}COMMON/EMM/MSG/ServiceRequest.c + ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateAccept.c + ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateComplete.c + ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateReject.c + ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateRequest.c + ${NAS_SRC}COMMON/EMM/MSG/UplinkNasTransport.c + ) + + set(libnas_esm_msg_OBJS + ${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c + ${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c + ${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c + ${NAS_SRC}COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c + ${NAS_SRC}COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c + ${NAS_SRC}COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c + ${NAS_SRC}COMMON/ESM/MSG/BearerResourceAllocationReject.c + ${NAS_SRC}COMMON/ESM/MSG/BearerResourceAllocationRequest.c + ${NAS_SRC}COMMON/ESM/MSG/BearerResourceModificationReject.c + ${NAS_SRC}COMMON/ESM/MSG/BearerResourceModificationRequest.c + ${NAS_SRC}COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c + ${NAS_SRC}COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c + ${NAS_SRC}COMMON/ESM/MSG/EsmInformationRequest.c + ${NAS_SRC}COMMON/ESM/MSG/EsmInformationResponse.c + ${NAS_SRC}COMMON/ESM/MSG/esm_msg.c + ${NAS_SRC}COMMON/ESM/MSG/EsmStatus.c + ${NAS_SRC}COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c + ${NAS_SRC}COMMON/ESM/MSG/ModifyEpsBearerContextReject.c + ${NAS_SRC}COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c + ${NAS_SRC}COMMON/ESM/MSG/PdnConnectivityReject.c + ${NAS_SRC}COMMON/ESM/MSG/PdnConnectivityRequest.c + ${NAS_SRC}COMMON/ESM/MSG/PdnDisconnectReject.c + ${NAS_SRC}COMMON/ESM/MSG/PdnDisconnectRequest.c + ) + + set(libnas_ies_OBJS + ${NAS_SRC}COMMON/IES/AccessPointName.c + ${NAS_SRC}COMMON/IES/AdditionalUpdateResult.c + ${NAS_SRC}COMMON/IES/AdditionalUpdateType.c + ${NAS_SRC}COMMON/IES/ApnAggregateMaximumBitRate.c + ${NAS_SRC}COMMON/IES/AuthenticationFailureParameter.c + ${NAS_SRC}COMMON/IES/AuthenticationParameterAutn.c + ${NAS_SRC}COMMON/IES/AuthenticationParameterRand.c + ${NAS_SRC}COMMON/IES/AuthenticationResponseParameter.c + ${NAS_SRC}COMMON/IES/CipheringKeySequenceNumber.c + ${NAS_SRC}COMMON/IES/Cli.c + ${NAS_SRC}COMMON/IES/CsfbResponse.c + ${NAS_SRC}COMMON/IES/DaylightSavingTime.c + ${NAS_SRC}COMMON/IES/DetachType.c + ${NAS_SRC}COMMON/IES/DrxParameter.c + ${NAS_SRC}COMMON/IES/EmergencyNumberList.c + ${NAS_SRC}COMMON/IES/EmmCause.c + ${NAS_SRC}COMMON/IES/EpsAttachResult.c + ${NAS_SRC}COMMON/IES/EpsAttachType.c + ${NAS_SRC}COMMON/IES/EpsBearerContextStatus.c + ${NAS_SRC}COMMON/IES/EpsBearerIdentity.c + ${NAS_SRC}COMMON/IES/EpsMobileIdentity.c + ${NAS_SRC}COMMON/IES/EpsNetworkFeatureSupport.c + ${NAS_SRC}COMMON/IES/EpsQualityOfService.c + ${NAS_SRC}COMMON/IES/EpsUpdateResult.c + ${NAS_SRC}COMMON/IES/EpsUpdateType.c + ${NAS_SRC}COMMON/IES/EsmCause.c + ${NAS_SRC}COMMON/IES/EsmInformationTransferFlag.c + ${NAS_SRC}COMMON/IES/EsmMessageContainer.c + ${NAS_SRC}COMMON/IES/GprsTimer.c + ${NAS_SRC}COMMON/IES/GutiType.c + ${NAS_SRC}COMMON/IES/IdentityType2.c + ${NAS_SRC}COMMON/IES/ImeisvRequest.c + ${NAS_SRC}COMMON/IES/KsiAndSequenceNumber.c + ${NAS_SRC}COMMON/IES/LcsClientIdentity.c + ${NAS_SRC}COMMON/IES/LcsIndicator.c + ${NAS_SRC}COMMON/IES/LinkedEpsBearerIdentity.c + ${NAS_SRC}COMMON/IES/LlcServiceAccessPointIdentifier.c + ${NAS_SRC}COMMON/IES/LocationAreaIdentification.c + ${NAS_SRC}COMMON/IES/MessageType.c + ${NAS_SRC}COMMON/IES/MobileIdentity.c + ${NAS_SRC}COMMON/IES/MobileStationClassmark2.c + ${NAS_SRC}COMMON/IES/MobileStationClassmark3.c + ${NAS_SRC}COMMON/IES/MsNetworkCapability.c + ${NAS_SRC}COMMON/IES/MsNetworkFeatureSupport.c + ${NAS_SRC}COMMON/IES/NasKeySetIdentifier.c + ${NAS_SRC}COMMON/IES/NasMessageContainer.c + ${NAS_SRC}COMMON/IES/NasRequestType.c + ${NAS_SRC}COMMON/IES/NasSecurityAlgorithms.c + ${NAS_SRC}COMMON/IES/NetworkName.c + ${NAS_SRC}COMMON/IES/Nonce.c + ${NAS_SRC}COMMON/IES/PacketFlowIdentifier.c + ${NAS_SRC}COMMON/IES/PagingIdentity.c + ${NAS_SRC}COMMON/IES/PdnAddress.c + ${NAS_SRC}COMMON/IES/PdnType.c + ${NAS_SRC}COMMON/IES/PlmnList.c + ${NAS_SRC}COMMON/IES/ProcedureTransactionIdentity.c + ${NAS_SRC}COMMON/IES/ProtocolConfigurationOptions.c + ${NAS_SRC}COMMON/IES/ProtocolDiscriminator.c + ${NAS_SRC}COMMON/IES/PTmsiSignature.c + ${NAS_SRC}COMMON/IES/QualityOfService.c + ${NAS_SRC}COMMON/IES/RadioPriority.c + ${NAS_SRC}COMMON/IES/SecurityHeaderType.c + ${NAS_SRC}COMMON/IES/ServiceType.c + ${NAS_SRC}COMMON/IES/ShortMac.c + ${NAS_SRC}COMMON/IES/SsCode.c + ${NAS_SRC}COMMON/IES/SupportedCodecList.c + ${NAS_SRC}COMMON/IES/TimeZoneAndTime.c + ${NAS_SRC}COMMON/IES/TimeZone.c + ${NAS_SRC}COMMON/IES/TmsiStatus.c + ${NAS_SRC}COMMON/IES/TrackingAreaIdentity.c + ${NAS_SRC}COMMON/IES/TrackingAreaIdentityList.c + ${NAS_SRC}COMMON/IES/TrafficFlowAggregateDescription.c + ${NAS_SRC}COMMON/IES/TrafficFlowTemplate.c + ${NAS_SRC}COMMON/IES/TransactionIdentifier.c + ${NAS_SRC}COMMON/IES/UeNetworkCapability.c + ${NAS_SRC}COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c + ${NAS_SRC}COMMON/IES/UeSecurityCapability.c + ${NAS_SRC}COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c + ) + + set (libnas_utils_OBJS + ${NAS_SRC}COMMON/UTIL/device.c + ${NAS_SRC}COMMON/UTIL/memory.c + ${NAS_SRC}COMMON/UTIL/nas_log.c + ${NAS_SRC}COMMON/UTIL/nas_timer.c + ${NAS_SRC}COMMON/UTIL/socket.c + ${NAS_SRC}COMMON/UTIL/stty.c + ${NAS_SRC}COMMON/UTIL/TLVEncoder.c + ${NAS_SRC}COMMON/UTIL/TLVDecoder.c + ${NAS_SRC}COMMON/UTIL/OctetString.c + ) + + if(NAS_UE) + set(libnas_ue_api_OBJS + ${NAS_SRC}UE/API/USER/at_command.c + ${NAS_SRC}UE/API/USER/at_error.c + ${NAS_SRC}UE/API/USER/at_response.c + ${NAS_SRC}UE/API/USER/user_api.c + ${NAS_SRC}UE/API/USER/user_indication.c + ${NAS_SRC}UE/API/USIM/aka_functions.c + ${NAS_SRC}UE/API/USIM/usim_api.c + ) + set(libnas_ue_emm_OBJS + ${NAS_SRC}UE/EMM/Attach.c + ${NAS_SRC}UE/EMM/Authentication.c + ${NAS_SRC}UE/EMM/Detach.c + ${NAS_SRC}UE/EMM/emm_main.c + ${NAS_SRC}UE/EMM/EmmStatusHdl.c + ${NAS_SRC}UE/EMM/Identification.c + ${NAS_SRC}UE/EMM/IdleMode.c + ${NAS_SRC}UE/EMM/LowerLayer.c + ${NAS_SRC}UE/EMM/SecurityModeControl.c + ${NAS_SRC}UE/EMM/ServiceRequestHdl.c + ${NAS_SRC}UE/EMM/TrackingAreaUpdate.c + ) + set(libnas_ue_emm_sap_OBJS + ${NAS_SRC}UE/EMM/SAP/emm_as.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttachNeeded.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregistered.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredInitiated.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredLimitedService.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoImsi.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNormalService.c + ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredPlmnSearch.c + ${NAS_SRC}UE/EMM/SAP/emm_esm.c + ${NAS_SRC}UE/EMM/SAP/emm_fsm.c + ${NAS_SRC}UE/EMM/SAP/EmmNull.c + ${NAS_SRC}UE/EMM/SAP/emm_recv.c + ${NAS_SRC}UE/EMM/SAP/emm_reg.c + ${NAS_SRC}UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c + ${NAS_SRC}UE/EMM/SAP/EmmRegistered.c + ${NAS_SRC}UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c + ${NAS_SRC}UE/EMM/SAP/EmmRegisteredInitiated.c + ${NAS_SRC}UE/EMM/SAP/EmmRegisteredLimitedService.c + ${NAS_SRC}UE/EMM/SAP/EmmRegisteredNoCellAvailable.c + ${NAS_SRC}UE/EMM/SAP/EmmRegisteredNormalService.c + ${NAS_SRC}UE/EMM/SAP/EmmRegisteredPlmnSearch.c + ${NAS_SRC}UE/EMM/SAP/EmmRegisteredUpdateNeeded.c + ${NAS_SRC}UE/EMM/SAP/emm_sap.c + ${NAS_SRC}UE/EMM/SAP/emm_send.c + ${NAS_SRC}UE/EMM/SAP/EmmServiceRequestInitiated.c + ${NAS_SRC}UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c + ) + set (libnas_ue_esm_OBJS + ${NAS_SRC}UE/ESM/DedicatedEpsBearerContextActivation.c + ${NAS_SRC}UE/ESM/DefaultEpsBearerContextActivation.c + ${NAS_SRC}UE/ESM/EpsBearerContextDeactivation.c + ${NAS_SRC}UE/ESM/esm_ebr.c + ${NAS_SRC}UE/ESM/esm_ebr_context.c + ${NAS_SRC}UE/ESM/esm_ip.c + ${NAS_SRC}UE/ESM/esm_main.c + ${NAS_SRC}UE/ESM/esm_pt.c + ${NAS_SRC}UE/ESM/EsmStatusHdl.c + ${NAS_SRC}UE/ESM/PdnConnectivity.c + ${NAS_SRC}UE/ESM/PdnDisconnect.c + ) + set(libnas_ue_esm_sap_OBJS + ${NAS_SRC}UE/ESM/SAP/esm_recv.c + ${NAS_SRC}UE/ESM/SAP/esm_send.c + ${NAS_SRC}UE/ESM/SAP/esm_sap.c + ) + add_library(LIB_NAS_UE + ${NAS_SRC}UE/nas_itti_messaging.c + ${NAS_SRC}UE/nas_network.c + ${NAS_SRC}UE/nas_parser.c + ${NAS_SRC}UE/nas_proc.c + ${NAS_SRC}UE/nas_user.c + ${libnas_api_OBJS} + ${libnas_ue_api_OBJS} + ${libnas_emm_msg_OBJS} + ${libnas_esm_msg_OBJS} + ${libnas_ies_OBJS} + ${libnas_utils_OBJS} + ${libnas_ue_emm_OBJS} + ${libnas_ue_emm_sap_OBJS} + ${libnas_ue_esm_OBJS} + ${libnas_ue_esm_sap_OBJS} + ) + set(NAS_UE_LIB LIB_NAS_UE) + + include_directories(${NAS_SRC}UE) + include_directories(${NAS_SRC}UE/API/USER) + include_directories(${NAS_SRC}UE/API/USIM) + include_directories(${NAS_SRC}UE/EMM) + include_directories(${NAS_SRC}UE/EMM/SAP) + include_directories(${NAS_SRC}UE/ESM) + include_directories(${NAS_SRC}UE/ESM/SAP) + endif() + + + + # Make lfds as a own source code (even if it is a outside library) + # For better intergration with compilation flags & structure of cmake + ################################################################### + set(lfds ${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/src/) + file(GLOB lfds_queue ${lfds}/lfds611_queue/*.c) + file(GLOB lfds_ring ${lfds}/lfds611_ringbuffer/*.c) + file(GLOB lfds_slist ${lfds}/lfds611_slist/*.c) + file(GLOB lfds_stack ${lfds}/lfds611_stack/*.c) + file(GLOB lfds_freelist ${lfds}/lfds611_freelist/*.c) + + include_directories(${lfds}) + add_library(LFDS + ${lfds_queue} ${lfds_ring} ${lfds_slist} ${lfds_stack} ${lfds_freelist} + ${lfds}/lfds611_liblfds/lfds611_liblfds_abstraction_test_helpers.c + ${lfds}/lfds611_liblfds/lfds611_liblfds_aligned_free.c + ${lfds}/lfds611_liblfds/lfds611_liblfds_aligned_malloc.c + ${lfds}/lfds611_abstraction/lfds611_abstraction_free.c + ${lfds}/lfds611_abstraction/lfds611_abstraction_malloc.c + ) + + # Simulation library + ########################## + add_library(SIMU + ${OPENAIR1_DIR}/SIMULATION/TOOLS/random_channel.c + ${OPENAIR1_DIR}/SIMULATION/TOOLS/rangen_double.c + ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c + ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c + ${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c + ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c + ${OPENAIR1_DIR}/SIMULATION/RF/rf.c + ${OPENAIR1_DIR}/SIMULATION/RF/dac.c + ${OPENAIR1_DIR}/SIMULATION/RF/adc.c + ) + + add_library(SIMU_ETH + ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c + ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c + ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c + ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c + ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/emu_transport.c + ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/pgm_link.c + ) + + add_library(OPENAIR0_LIB + ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c + ) + + # System packages that are required + # We use either the cmake buildin, in ubuntu are in: /usr/share/cmake*/Modules/ + # or cmake provide a generic interface to pkg-config that widely used + ################################### + include(FindPkgConfig) + + pkg_search_module(LIBXML2 libxml-2.0 REQUIRED) + include_directories(${LIBXML2_INCLUDE_DIRS}) + + pkg_search_module(LIBXSLT libxslt REQUIRED) + include_directories(${LIBXSLT_INCLUDE_DIRS}) + + pkg_search_module(OPENSSL openssl REQUIRED) + include_directories(${OPENSSL_INCLUDE_DIRS}) + + pkg_search_module(CONFIG libconfig REQUIRED) + include_directories(${CONFIG_INCLUDE_DIRS}) + + pkg_search_module(CRYPTO libcrypto REQUIRED) + include_directories(${CRYPTO_INCLUDE_DIRS}) + + #use native cmake method as this package is not in pkg-config + if (${RF_BOARD} STREQUAL "OAI_USRP") + find_package(Boost REQUIRED) + include_directories(${LIBBOOST_INCLUDE_DIR}) + endif (${RF_BOARD} STREQUAL "OAI_USRP") + + pkg_search_module(OPENPGM openpgm-5.1) + if(NOT ${OPENPGM_FOUND}) + message("PACKAGE openpgm-5.1 is required by binaries such as oaisim: will fail later if this target is built") + else() + include_directories(${OPENPGM_INCLUDE_DIRS}) + endif() + + pkg_search_module(NETTLE nettle) + if(NOT ${NETTLE_FOUND}) + message("PACKAGE nettle not found: some targets will fail") + else() + include_directories(${NETTLE_INCLUDE_DIRS}) + endif() + + pkg_search_module(XPM xpm) + if(NOT ${XPM_FOUND}) + message("PACKAGE xpm not found: some targets will fail") + else() + include_directories(${XPM_INCLUDE_DIRS}) + endif() + + # Atlas is required by some packages, but not found in pkg-config + if(EXISTS "/usr/include/atlas/cblas.h") + include_directories("/usr/include/atlas") + list(APPEND ATLAS_LIBRARIES lapack cblas atlas) + else() + message("No Blas/Atlas libs found, some targets will fail") + endif() + + if (${XFORMS}) + include_directories ("/usr/include/X11") + set(XFORMS_SOURCE + ${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope.c + ) + set(XFORMS_SOURCE_SOFTMODEM + ${OPENAIR_TARGETS}/RT/USER/stats.c + ) + set(XFORMS_LIBRARIES "forms") + endif (${XFORMS}) + + set(CMAKE_MODULE_PATH "${OPENAIR_DIR}/cmake_targets/tools/MODULES" "${CMAKE_MODULE_PATH}") + + + # Hack on a test of asn1c version (already dirty) + add_definitions(-DASN1_MINIMUM_VERSION=924) + + ################################# + # add executables for operation + ################################# + + # lte-softmodem is both eNB and UE implementation + ################################################### + + add_executable(lte-softmodem + ${rrc_h} + ${s1ap_h} + ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c + ${OPENAIR_TARGETS}/RT/USER/lte-ue.c + ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c + ${OPENAIR_TARGETS}/RT/USER/lte-enb.c + ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c + ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c + ${OPENAIR_TARGETS}/COMMON/create_tasks.c + ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c + ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c + ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c + ${GTPU_need_ITTI} + ${HW_SOURCE} + ${TRANSPORT_SOURCE} + ${RTAI_SOURCE} + ${XFORMS_SOURCE} + ${XFORMS_SOURCE_SOFTMODEM} + ) + + target_link_libraries (lte-softmodem + -Wl,--start-group + RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} + -Wl,--end-group ) + + + target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) + target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) + target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES}) + target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES}) + + # lte-softmodem-nos1 is both eNB and UE implementation + ################################################### + add_executable(lte-softmodem-nos1 + ${rrc_h} + ${s1ap_h} + ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c + ${OPENAIR_TARGETS}/RT/USER/lte-ue.c + ${OPENAIR_TARGETS}/RT/USER/lte-enb.c + ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c + ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c + ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c + ${OPENAIR_TARGETS}/COMMON/create_tasks.c + ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c + #${OPENAIR2_DIR}/RRC/NAS/nas_config.c # enable if you want rrc to mount ip interface + #${OPENAIR2_DIR}/RRC/NAS/rb_config.c + ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c + ${HW_SOURCE} + ${TRANSPORT_SOURCE} + ${RTAI_SOURCE} + ${XFORMS_SOURCE} + ${XFORMS_SOURCE_SOFTMODEM} + ) + target_link_libraries (lte-softmodem-nos1 + -Wl,--start-group + RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} + -Wl,--end-group ) + + target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES}) + target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) + target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES}) + target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES}) + + # rrh + ################################ + #Note: only one RF type (USRP) is currently supported for RRH + add_executable(rrh_gw + ${OPENAIR_TARGETS}/RT/USER/rrh_gw.c + ${OPENAIR_TARGETS}/RT/USER/eNB_transport_IQ.c + ${OPENAIR_TARGETS}/RT/USER/UE_transport_IQ.c + ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c + ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c + ${HW_SOURCE} + ${TRANSPORT_SOURCE} + ) + target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti) + target_link_libraries(rrh_gw + -Wl,--start-group + UTIL LFDS + -Wl,--end-group ) + target_link_libraries (rrh_gw rt pthread m ) + target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} ) + target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES}) + + Message("-- option_HW_lib=${option_HW_lib}") + Message("-- HW_SOURCE=${HW_SOURCE}") + Message("-- option_TP_lib=${option_TP_lib}") + Message("-- TRANSPORT_SOURCE=${TRANSPORT_SOURCE}") + + if (${RF_BOARD} STREQUAL "OAI_LMSSDR") + add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C) + add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C) + add_dependencies(rrh_gw LMS7002M LMS_SDR Si5351C) + endif (${RF_BOARD} STREQUAL "OAI_LMSSDR") + + + + # USIM process + ################# + #add_executable(usim + # ${OPENAIR3_DIR}/NAS/TOOLS/usim_data.c + # ${OPENAIR3_DIR}/NAS/USER/API/USIM/usim_api.c + # ${OPENAIR3_DIR}/NAS/USER/API/USIM/aka_functions.c + # ${OPENAIR3_DIR}/NAS/COMMON/UTIL/memory.c + # ${OPENAIR3_DIR}/NAS/COMMON/UTIL/nas_log.c + # ${OPENAIR3_DIR}/NAS/COMMON/UTIL/OctetString.c + # ${OPENAIR3_DIR}/NAS/COMMON/UTIL/TLVEncoder.c + # ) + #target_link_libraries (usim ${NAS_LIB} UTIL ${ITTI_LIB} LFDS pthread rt nettle crypto m) + + # ??? + ##################### + #add_executable(nvram + # ${OPENAIR3_DIR}/NAS/TOOLS/ue_data.c + # ${OPENAIR3_DIR}/NAS/COMMON/UTIL/memory.c + # ${OPENAIR3_DIR}/NAS/COMMON/UTIL/nas_log.c + # ) + #target_link_libraries (nvram LIB_NAS_UE UTIL ${ITTI_LIB} LFDS pthread rt nettle crypto m) + + + ###################################" + # Addexecutables for tests + #################################### + + # A all in one network simulator + ################ + add_executable(oaisim + ${rrc_h} + ${s1ap_h} + ${x2ap_h} + ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_TARGETS}/SIMU/USER/channel_sim.c + ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c + ${OPENAIR_TARGETS}/SIMU/USER/oaisim_config.c + ${OPENAIR_TARGETS}/SIMU/USER/sinr_sim.c + ${OPENAIR_TARGETS}/SIMU/USER/cor_SF_sim.c + ${OPENAIR_TARGETS}/SIMU/USER/oaisim_functions.c + ${OPENAIR_TARGETS}/SIMU/USER/event_handler.c + ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c + ${OPENAIR2_DIR}/RRC/NAS/nas_config.c + ${OPENAIR2_DIR}/RRC/NAS/rb_config.c + ${OPENAIR2_DIR}/UTIL/OMG/sumo.c + ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c + ${GTPU_need_ITTI} + ${OPENAIR_TARGETS}/COMMON/create_tasks.c + ${HW_SOURCE} + ${TRANSPORT_SOURCE} + ${XFORMS_SOURCE} + ) + + + target_include_directories(oaisim PUBLIC ${OPENAIR_TARGETS}/SIMU/USER) + target_link_libraries (oaisim + -Wl,--start-group + RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} LIB_NAS_UE SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} + -Wl,--end-group ) + + target_link_libraries (oaisim ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES}) + target_link_libraries (oaisim pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} + ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES}) + #Force link with forms, regardless XFORMS option + target_link_libraries (oaisim forms) + + + + # A all in one network simulator + ################ + add_executable(oaisim_nos1 + ${rrc_h} + ${s1ap_h} + ${x2ap_h} + ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_TARGETS}/SIMU/USER/channel_sim.c + ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c + ${OPENAIR_TARGETS}/SIMU/USER/oaisim_config.c + ${OPENAIR_TARGETS}/SIMU/USER/sinr_sim.c + ${OPENAIR_TARGETS}/SIMU/USER/cor_SF_sim.c + ${OPENAIR_TARGETS}/SIMU/USER/oaisim_functions.c + ${OPENAIR_TARGETS}/SIMU/USER/event_handler.c + ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c + ${OPENAIR2_DIR}/RRC/NAS/nas_config.c + ${OPENAIR2_DIR}/RRC/NAS/rb_config.c + ${OPENAIR2_DIR}/UTIL/OMG/sumo.c + ${OPENAIR_TARGETS}/COMMON/create_tasks.c + ${HW_SOURCE} + ${TRANSPORT_SOURCE} + ${XFORMS_SOURCE} + ) + target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER) + target_link_libraries (oaisim_nos1 + -Wl,--start-group + RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} + -Wl,--end-group ) + + target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES}) + target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} + ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES}) + #Force link with forms, regardless XFORMS option + target_link_libraries (oaisim_nos1 forms) + + + # Unitary tests for each piece of L1: example, mbmssim is MBMS L1 simulator + ##################################### + + foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim) + add_executable(${myExe} + ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c + ${XFORMS_SOURCE} + ) + target_link_libraries (${myExe} + -Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group + pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} + ) + endforeach(myExe) + + add_executable(test_epc_generate_scenario + ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.h + ${OPENAIR2_DIR}/ENB_APP/enb_config.h + ${OPENAIR2_DIR}/COMMON/commonDef.h + ${OPENAIR2_DIR}/COMMON/messages_def.h + ${OPENAIR2_DIR}/COMMON/messages_types.h + ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h + ${OPENAIR_BIN_DIR}/messages_xml.h + ) + target_link_libraries (test_epc_generate_scenario + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + ) + + add_executable(test_epc_play_scenario + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_decode.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_display.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_fsm.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_parse.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_sctp.c + ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h + ${OPENAIR2_DIR}/COMMON/commonDef.h + ${OPENAIR2_DIR}/COMMON/messages_def.h + ${OPENAIR2_DIR}/COMMON/messages_types.h + ${OPENAIR_BIN_DIR}/messages_xml.h + ) + target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c) + target_link_libraries (test_epc_play_scenario + -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + ) + + + #unitary tests for Core NEtwork pieces + ################################# + foreach(myExe s1ap + secu_knas_encrypt_eia1 + secu_kenb + aes128_ctr_encrypt + aes128_ctr_decrypt + secu_knas_encrypt_eea2 + secu_knas secu_knas_encrypt_eea1 + kdf + aes128_cmac_encrypt + secu_knas_encrypt_eia2) + add_executable(test_${myExe} + ${OPENAIR3_DIR}/TEST/test_util.c + ${OPENAIR3_DIR}/TEST/test_${myExe}.c + ) + target_link_libraries (test_${myExe} + -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + ) + endforeach(myExe) + + # to be added + #../targets/TEST/PDCP/test_pdcp.c + #../targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c From 3dc0e4dd86d614a09c21ee73393182f613749fbe Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Mon, 30 May 2016 13:17:34 +0200 Subject: [PATCH 026/340] * route DlInformationTransfer to SRB2 if it is active * configure dedicated DRBs based on the transaction id * fix the issue in oaisim to work with S1 interface --- maketags | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 9 +- openair2/RRC/LITE/L2_interface.c | 6 +- openair2/RRC/LITE/defs.h | 12 ++- openair2/RRC/LITE/proto.h | 10 +- openair2/RRC/LITE/rrc_eNB.c | 132 +++++++++++++++-------- openair2/RRC/LITE/rrc_eNB_S1AP.c | 10 +- openair3/NAS/UE/API/USIM/aka_functions.c | 5 + targets/COMMON/create_tasks.c | 28 ++--- targets/SIMU/USER/oaisim.c | 10 ++ targets/SIMU/USER/oaisim_functions.c | 8 -- 11 files changed, 150 insertions(+), 82 deletions(-) diff --git a/maketags b/maketags index ec283c8bec..4dff87bf76 100755 --- a/maketags +++ b/maketags @@ -1,3 +1,3 @@ #!/bin/sh echo "building ctags for openair1 and openair2 ..." -ctags -e -R --exclude=openair1/DOCS/ --exclude=openair2/DOCS/ --exclude=openair2/RRC/CELLULAR/ --exclude=openair2/NAS/DRIVER/CELLULAR/ --exclude=openair2/SIMULATION/ --exclude=targets/DOCS/ --exclude=targets/PROJECTS/ openair1 openair2 targets +ctags -e -R --exclude=openair1/DOCS/ --exclude=openair2/DOCS/ --exclude=openair2/RRC/CELLULAR/ --exclude=openair2/NAS/DRIVER/CELLULAR/ --exclude=openair2/SIMULATION/ --exclude=targets/DOCS/ --exclude=targets/PROJECTS/ openair1 openair2 openair3 targets cmake_targets common diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index ac284f3650..87cbb9e77b 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -1093,7 +1093,7 @@ rrc_pdcp_config_asn1_req ( srb_id = srb2add_list_pP->list.array[cnt]->srb_Identity; srb_toaddmod_p = srb2add_list_pP->list.array[cnt]; rlc_type = RLC_MODE_AM; - lc_id = srb_id + 2; + lc_id = srb_id;// + 2; key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, srb_id, SRB_FLAG_YES); h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); @@ -1429,13 +1429,14 @@ pdcp_config_req_asn1 ( pdcp_pP->first_missing_pdu = -1; pdcp_pP->rx_hfn_offset = 0; - LOG_I(PDCP, PROTOCOL_PDCP_CTXT_FMT" Action ADD LCID %d (rb id %d) " + LOG_N(PDCP, PROTOCOL_PDCP_CTXT_FMT" Action ADD LCID %d (%s id %d) " "configured with SN size %d bits and RLC %s\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP), lc_idP, + (srb_flagP == SRB_FLAG_YES) ? "SRB" : "DRB", rb_idP, pdcp_pP->seq_num_size, - (rlc_modeP == RLC_MODE_AM ) ? "AM" : (rlc_modeP == RLC_MODE_TM) ? "TM" : "UM"); + (rlc_modeP == RLC_MODE_AM ) ? "AM" : (rlc_modeP == RLC_MODE_TM) ? "TM" : "UM"); /* Setup security */ if (security_modeP != 0xff) { pdcp_config_set_security( @@ -1477,7 +1478,7 @@ pdcp_config_req_asn1 ( pdcp_pP->seq_num_size=5; } - LOG_I(PDCP,PROTOCOL_PDCP_CTXT_FMT" Action MODIFY LCID %d " + LOG_N(PDCP,PROTOCOL_PDCP_CTXT_FMT" Action MODIFY LCID %d " "RB id %d reconfigured with SN size %d and RLC %s \n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP), lc_idP, diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index 34e47c2575..e379c61723 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -597,8 +597,8 @@ rrc_data_ind( rb_id_t DCCH_index = Srb_id; if (ctxt_pP->enb_flag == ENB_FLAG_NO) { - LOG_N(RRC, "[UE %x] Frame %d: received a DCCH %d message on SRB %d with Size %d from eNB ???\n", - ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id-1,sdu_sizeP); + LOG_N(RRC, "[UE %x] Frame %d: received a DCCH %d message on SRB %d with Size %d from eNB %d\n", + ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id-1,sdu_sizeP, ctxt_pP->eNB_index); } else { LOG_N(RRC, "[eNB %d] Frame %d: received a DCCH %d message on SRB %d with Size %d from UE %x\n", ctxt_pP->module_id, @@ -656,7 +656,7 @@ void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) #if defined(ENABLE_ITTI) { MessageDef *message_p; - + //LOG_I(RRC,"sending a message to task_mac_ue\n"); message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_IN_SYNC_IND); RRC_MAC_IN_SYNC_IND (message_p).frame = frameP; RRC_MAC_IN_SYNC_IND (message_p).enb_index = eNB_index; diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 14dd7bf267..1bce4cf313 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -187,6 +187,9 @@ typedef enum HO_STATE_e { #define CBA_OFFSET 0xfff4 // #define NUM_MAX_CBA_GROUP 4 // in the platform_constants +/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */ +#define RRC_TRANSACTION_IDENTIFIER_NUMBER 3 + typedef struct UE_RRC_INFO_s { UE_STATE_t State; uint8_t SIB1systemInfoValueTag; @@ -283,7 +286,7 @@ typedef struct SRB_INFO_TABLE_ENTRY_s { SRB_INFO Srb_info; uint8_t Active; uint8_t Status; - uint32_t Next_check_frame; + uint32_t Next_check_frame; } SRB_INFO_TABLE_ENTRY; typedef struct MEAS_REPORT_LIST_s { @@ -303,8 +306,9 @@ typedef struct eNB_RRC_UE_s { SCellToAddMod_r10_t sCell_config[2]; #endif SRB_ToAddModList_t* SRB_configList; + SRB_ToAddModList_t* SRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; DRB_ToAddModList_t* DRB_configList; - DRB_ToAddModList_t* DRB_configList2[8]; + DRB_ToAddModList_t* DRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; uint8_t DRB_active[8]; struct PhysicalConfigDedicated* physicalConfigDedicated; struct SPS_Config* sps_Config; @@ -412,10 +416,10 @@ typedef struct { #endif SRB_INFO SI; SRB_INFO Srb0; -} rcc_eNB_carrier_data_t; +} rrc_eNB_carrier_data_t; typedef struct eNB_RRC_INST_s { - rcc_eNB_carrier_data_t carrier[MAX_NUM_CCs]; + rrc_eNB_carrier_data_t carrier[MAX_NUM_CCs]; uid_allocator_t uid_allocator; // for rrc_ue_head RB_HEAD(rrc_ue_tree_s, rrc_eNB_ue_context_s) rrc_ue_head; // ue_context tree key search by rnti uint8_t HO_flag; diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 288ea87e2e..a7bc9c4940 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -228,19 +228,21 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject( void rrc_eNB_process_RRCConnectionSetupComplete( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, + rrc_eNB_ue_context_t* ue_context_pP, RRCConnectionSetupComplete_r8_IEs_t* rrcConnectionSetupComplete ); /**\brief Process the RRCConnectionReconfigurationComplete based on information coming from UE \param ctxt_pP Running context \param ue_context_pP RRC UE context - \param rrcConnectionReconfigurationComplete Pointer to RRCConnectionReconfigurationComplete message*/ + \param rrcConnectionReconfigurationComplete Pointer to RRCConnectionReconfigurationComplete message + \param xid the transaction id for the rrcconnectionreconfiguration procedure +*/ void rrc_eNB_process_RRCConnectionReconfigurationComplete( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, - RRCConnectionReconfigurationComplete_r8_IEs_t* rrcConnectionReconfigurationComplete + rrc_eNB_ue_context_t* ue_context_pP, + const uint8_t xid ); /**\brief Generate the RRCConnectionRelease diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 3d4d02454b..5247cf8f9e 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -112,9 +112,6 @@ extern void* bigphys_malloc(int); extern uint16_t two_tier_hexagonal_cellIds[7]; -/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */ -static const uint8_t RRC_TRANSACTION_IDENTIFIER_NUMBER = 3; - mui_t rrc_eNB_mui = 0; //----------------------------------------------------------------------------- @@ -850,15 +847,17 @@ rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* void rrc_eNB_process_RRCConnectionSetupComplete( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, + rrc_eNB_ue_context_t* ue_context_pP, RRCConnectionSetupComplete_r8_IEs_t * rrcConnectionSetupComplete ) //----------------------------------------------------------------------------- { LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing RRCConnectionSetupComplete from UE\n", + PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing RRCConnectionSetupComplete from UE (SRB1 Active)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); - + + ue_context_pP->ue_context.Srb1.Active=1; + #if defined(ENABLE_USE_MME) if (EPC_MODE_ENABLED == 1) { @@ -1154,20 +1153,22 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co *DRB_ul_SpecificParameters = NULL; // DRB_ToAddModList_t** DRB_configList=&ue_context_pP->ue_context.DRB_configList; DRB_ToAddModList_t* DRB_configList=ue_context_pP->ue_context.DRB_configList; - DRB_ToAddModList_t* DRB_configList2=NULL; + DRB_ToAddModList_t** DRB_configList2=NULL; //DRB_ToAddModList_t** RRC_DRB_configList=&ue_context_pP->ue_context.DRB_configList; struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; DedicatedInfoNAS_t *dedicatedInfoNas = NULL; long *logicalchannelgroup, *logicalchannelgroup_drb; - int drb_identity_index=0, nas_sequence_flag = 0; + int drb_identity_index=0;//, nas_sequence_flag = 0; uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, - -// Configure DRB + DRB_configList2=&ue_context_pP->ue_context.DRB_configList2[xid]; + if (*DRB_configList2) { + free(*DRB_configList2); + } //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); - DRB_configList2 = CALLOC(1, sizeof(*DRB_configList2)); + *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2)); dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); int e_rab_done=0; @@ -1262,7 +1263,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; ASN_SEQUENCE_ADD(&DRB_configList->list, DRB_config); - ASN_SEQUENCE_ADD(&DRB_configList2->list, DRB_config); + ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config); //ue_context_pP->ue_context.DRB_configList2[drb_identity_index] = &(*DRB_configList); LOG_I(RRC,"EPS ID %d, DRB ID %d (index %d), QCI %d, priority %d, LCID %d LCGID %d \n", @@ -1312,7 +1313,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co buffer, xid, (SRB_ToAddModList_t*)NULL, - (DRB_ToAddModList_t*)DRB_configList2, + (DRB_ToAddModList_t*)*DRB_configList2, (DRB_ToReleaseList_t*)NULL, // DRB2_list, (struct SPS_Config*)NULL, // *sps_Config, NULL, NULL, NULL, NULL,NULL, @@ -1387,7 +1388,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons uint16_t size; int i; - // configure SRB1/SRB2, PhysicalConfigDedicated, MAC_MainConfig for UE + // configure SRB1/SRB2, PhysicalConfiDedgicated, MAC_MainConfig for UE //eNB_RRC_INST* rrc_inst = &eNB_rrc_inst[ctxt_pP->module_id]; //struct PhysicalConfigDedicated** physicalConfigDedicated = &ue_context_pP->ue_context.physicalConfigDedicated; @@ -1397,7 +1398,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons struct LogicalChannelConfig__ul_SpecificParameters *SRB2_ul_SpecificParameters = NULL; SRB_ToAddModList_t* SRB_configList = ue_context_pP->ue_context.SRB_configList; - SRB_ToAddModList_t *SRB_configList2 = NULL; + SRB_ToAddModList_t **SRB_configList2 = NULL; struct DRB_ToAddMod *DRB_config = NULL; struct RLC_Config *DRB_rlc_config = NULL; @@ -1408,8 +1409,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons struct LogicalChannelConfig__ul_SpecificParameters *DRB_ul_SpecificParameters = NULL; DRB_ToAddModList_t** DRB_configList = &ue_context_pP->ue_context.DRB_configList; - - MAC_MainConfig_t *mac_MainConfig = NULL; + DRB_ToAddModList_t** DRB_configList2 = NULL; + MAC_MainConfig_t *mac_MainConfig = NULL; MeasObjectToAddModList_t *MeasObj_list = NULL; MeasObjectToAddMod_t *MeasObj = NULL; ReportConfigToAddModList_t *ReportConfig_list = NULL; @@ -1437,6 +1438,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons (void)dedicatedInfoNas; C_RNTI_t *cba_RNTI = NULL; + + uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, + #ifdef CBA //struct PUSCH_CBAConfigDedicated_vlola *pusch_CBAConfigDedicated_vlola; uint8_t *cba_RNTI_buf; @@ -1464,9 +1468,13 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons #endif // Configure SRB2 /// SRB2 + SRB_configList2=&ue_context_pP->ue_context.SRB_configList2[xid]; + if (*SRB_configList2) { + free(*SRB_configList2); + } + *SRB_configList2 = CALLOC(1, sizeof(**SRB_configList2)); + memset(*SRB_configList2, 0, sizeof(**SRB_configList2)); SRB2_config = CALLOC(1, sizeof(*SRB2_config)); - SRB_configList2 = CALLOC(1, sizeof(*SRB_configList2)); - memset(SRB_configList2, 0, sizeof(*SRB_configList2)); SRB2_config->srb_Identity = 2; SRB2_rlc_config = CALLOC(1, sizeof(*SRB2_rlc_config)); @@ -1504,14 +1512,26 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons // this list has the configuration for SRB1 and SRB2 ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config); // this list has only the configuration for SRB2 - ASN_SEQUENCE_ADD(&SRB_configList2->list, SRB2_config); + ASN_SEQUENCE_ADD(&(*SRB_configList2)->list, SRB2_config); // Configure DRB //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); + // list for all the configured DRB if (*DRB_configList) { free(*DRB_configList); } *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); + memset(*DRB_configList, 0, sizeof(**DRB_configList)); + + // list for the configured DRB for a this xid + DRB_configList2=&ue_context_pP->ue_context.DRB_configList2[xid]; + if (*DRB_configList2) { + free(*DRB_configList2); + } + *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2)); + memset(*DRB_configList2, 0, sizeof(**DRB_configList2)); + + /// DRB DRB_config = CALLOC(1, sizeof(*DRB_config)); @@ -1583,6 +1603,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); + ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config); + //ue_context_pP->ue_context.DRB_configList2[0] = &(*DRB_configList); mac_MainConfig = CALLOC(1, sizeof(*mac_MainConfig)); @@ -1873,7 +1895,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons //rrc_inst->handover_info.as_config.sourceRadioResourceConfig.srb_ToAddModList = CALLOC(1,sizeof()); ue_context_pP->ue_context.handover_info = CALLOC(1, sizeof(*(ue_context_pP->ue_context.handover_info))); //memcpy((void *)rrc_inst->handover_info[ue_mod_idP]->as_config.sourceRadioResourceConfig.srb_ToAddModList,(void *)SRB_list,sizeof(SRB_ToAddModList_t)); - ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.srb_ToAddModList = SRB_configList2; + ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.srb_ToAddModList = *SRB_configList2; //memcpy((void *)rrc_inst->handover_info[ue_mod_idP]->as_config.sourceRadioResourceConfig.drb_ToAddModList,(void *)DRB_list,sizeof(DRB_ToAddModList_t)); ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.drb_ToAddModList = *DRB_configList; ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.drb_ToReleaseList = NULL; @@ -1930,8 +1952,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons size = do_RRCConnectionReconfiguration(ctxt_pP, buffer, - rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), //Transaction_id, - (SRB_ToAddModList_t*)SRB_configList, // SRB_configList + xid, //Transaction_id, + (SRB_ToAddModList_t*)*SRB_configList2, // SRB_configList (DRB_ToAddModList_t*)*DRB_configList, (DRB_ToReleaseList_t*)NULL, // DRB2_list, (struct SPS_Config*)NULL, // *sps_Config, @@ -3100,11 +3122,12 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( memcpy(&ue_context_pP->ue_context.Srb1.Srb_info.Lchan_desc[0], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); memcpy(&ue_context_pP->ue_context.Srb1.Srb_info.Lchan_desc[1], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - // SRB2 + // SRB2 ue_context_pP->ue_context.Srb2.Active = 1; ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = Idx; memcpy(&ue_context_pP->ue_context.Srb2.Srb_info.Lchan_desc[0], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); memcpy(&ue_context_pP->ue_context.Srb2.Srb_info.Lchan_desc[1], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); + LOG_I(RRC, "[eNB %d] CALLING RLC CONFIG SRB1 (rbid %d) for UE %x\n", ctxt_pP->module_id, Idx, ue_context_pP->ue_context.rnti); @@ -3262,8 +3285,8 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( void rrc_eNB_process_RRCConnectionReconfigurationComplete( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, - RRCConnectionReconfigurationComplete_r8_IEs_t* rrcConnectionReconfigurationComplete + rrc_eNB_ue_context_t* ue_context_pP, + const uint8_t xid ) //----------------------------------------------------------------------------- { @@ -3282,8 +3305,8 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( uint8_t *kRRCint = NULL; uint8_t *kUPenc = NULL; - DRB_ToAddModList_t* DRB_configList = ue_context_pP->ue_context.DRB_configList; - //SRB_ToAddModList_t* SRB_configList = ue_context_pP->ue_context.SRB_configList; + DRB_ToAddModList_t* DRB_configList = ue_context_pP->ue_context.DRB_configList2[xid]; + SRB_ToAddModList_t* SRB_configList = ue_context_pP->ue_context.SRB_configList2[xid]; #if defined(ENABLE_SECURITY) @@ -3367,7 +3390,29 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( , (PMCH_InfoList_r9_t *) NULL #endif ); - + + // set the SRB active in Ue context + if (SRB_configList != NULL) { + for (i = 0; (i < SRB_configList->list.count) && (i < 3); i++) { + if (SRB_configList->list.array[i]->srb_Identity == 1 ){ + ue_context_pP->ue_context.Srb1.Active=1; + } + else if (SRB_configList->list.array[i]->srb_Identity == 2 ) { + ue_context_pP->ue_context.Srb2.Active=1; + ue_context_pP->ue_context.Srb2.Srb_info.Srb_id=2; + LOG_I(RRC,"[eNB %d] Frame %d CC %d : SRB2 is now active\n", + ctxt_pP->module_id, + ctxt_pP->frame, + ue_context_pP->ue_context.primaryCC_id); + } else { + LOG_W(RRC,"[eNB %d] Frame %d CC %d : invalide SRB identity %d\n", + ctxt_pP->module_id, + ctxt_pP->frame, + SRB_configList->list.array[i]->srb_Identity); + } + } + } + // Loop through DRBs and establish if necessary if (DRB_configList != NULL) { @@ -4083,7 +4128,7 @@ rrc_eNB_decode_ccch( &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - // SRB2 + // SRB2: set it to go through SRB1 with id 1 (DCCH) ue_context_p->ue_context.Srb2.Active = 1; ue_context_p->ue_context.Srb2.Srb_info.Srb_id = Idx; memcpy(&ue_context_p->ue_context.Srb2.Srb_info.Lchan_desc[0], @@ -4092,7 +4137,7 @@ rrc_eNB_decode_ccch( memcpy(&ue_context_p->ue_context.Srb2.Srb_info.Lchan_desc[1], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - + rrc_eNB_generate_RRCConnectionSetup(ctxt_pP, ue_context_p, CC_id); LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT"CALLING RLC CONFIG SRB1 (rbid %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), @@ -4172,8 +4217,11 @@ rrc_eNB_decode_dcch( LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Received message on SRB%d, should not have ...\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), Srb_id); + } else { + LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Received message on SRB%d\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), + Srb_id); } - //memset(ul_dcch_msg,0,sizeof(UL_DCCH_Message_t)); LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Decoding UL-DCCH Message\n", @@ -4288,25 +4336,23 @@ rrc_eNB_decode_dcch( if (ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions. present == RRCConnectionReconfigurationComplete__criticalExtensions_PR_rrcConnectionReconfigurationComplete_r8) { - rrc_eNB_process_RRCConnectionReconfigurationComplete( - ctxt_pP, - ue_context_p, - &ul_dcch_msg->message.choice.c1.choice. - rrcConnectionReconfigurationComplete. - criticalExtensions.choice. - rrcConnectionReconfigurationComplete_r8); /*NN: revise the condition */ if (ue_context_p->ue_context.Status == RRC_RECONFIGURED){ dedicated_DRB = 1; LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB)\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %d)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); }else { + dedicated_DRB = 0; ue_context_p->ue_context.Status = RRC_RECONFIGURED; LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (default DRB)\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (default DRB, xid %d)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); } + rrc_eNB_process_RRCConnectionReconfigurationComplete( + ctxt_pP, + ue_context_p, + ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); } #if defined(ENABLE_ITTI) # if defined(ENABLE_USE_MME) diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 117e820f4b..34ea4a4a4b 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -759,12 +759,15 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( uint32_t eNB_ue_s1ap_id; uint32_t length; uint8_t *buffer; - + uint8_t srb_id; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; protocol_ctxt_t ctxt; ue_initial_id = S1AP_DOWNLINK_NAS (msg_p).ue_initial_id; eNB_ue_s1ap_id = S1AP_DOWNLINK_NAS (msg_p).eNB_ue_s1ap_id; ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, ue_initial_id, eNB_ue_s1ap_id); + srb_id = ue_context_p->ue_context.Srb2.Srb_info.Srb_id; + LOG_I(RRC, "[eNB %d] Received %s: ue_initial_id %d, eNB_ue_s1ap_id %d\n", instance, msg_name, @@ -845,10 +848,13 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( LOG_F(RRC,"\n"); #endif + /* + * switch UL or DL NAS message without RRC piggybacked to SRB2 if active. + */ /* Transfer data to PDCP */ rrc_data_req ( &ctxt, - DCCH, + srb_id, *rrc_eNB_mui++, SDU_CONFIRM_NO, length, diff --git a/openair3/NAS/UE/API/USIM/aka_functions.c b/openair3/NAS/UE/API/USIM/aka_functions.c index 1c30a17bfd..1c2dbb6d91 100644 --- a/openair3/NAS/UE/API/USIM/aka_functions.c +++ b/openair3/NAS/UE/API/USIM/aka_functions.c @@ -306,6 +306,11 @@ void ComputeOPc( u8 op_c_pP[16] ) for (i=0; i<16; i++) op_c_pP[i] ^= OP[i]; + LOG_TRACE(DEBUG, + "USIM-API - OPc[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", + op_c_pP[0],op_c_pP[1],op_c_pP[2], op_c_pP[3], op_c_pP[4], op_c_pP[5], op_c_pP[6], op_c_pP[7], + op_c_pP[8],op_c_pP[9],op_c_pP[10],op_c_pP[11],op_c_pP[12],op_c_pP[13],op_c_pP[14],op_c_pP[15]); + return; } /* end of function ComputeOPc */ diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c index 148843dbbc..b31c96b72b 100644 --- a/targets/COMMON/create_tasks.c +++ b/targets/COMMON/create_tasks.c @@ -51,6 +51,20 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) { itti_wait_ready(1); + if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) { + LOG_E(PDCP, "Create task for L2L1 failed\n"); + return -1; + } + + if (enb_nb > 0) { + /* Last task to create, others task must be ready before its start */ + if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) { + LOG_E(ENB_APP, "Create task for eNB APP failed\n"); + return -1; + } + } + + # ifdef OPENAIR2 { # if defined(ENABLE_USE_MME) @@ -120,20 +134,8 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) # endif } } -# endif +# endif // openair2: NN: should be openair3 - if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) { - LOG_E(PDCP, "Create task for L2L1 failed\n"); - return -1; - } - - if (enb_nb > 0) { - /* Last task to create, others task must be ready before its start */ - if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) { - LOG_E(ENB_APP, "Create task for eNB APP failed\n"); - return -1; - } - } itti_wait_ready(0); diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 8a5d23afac..c6c36d613c 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -605,6 +605,16 @@ l2l1_task (void *args_p) } #endif + module_id_t enb_id; + module_id_t UE_id; + for (enb_id = 0; enb_id < NB_eNB_INST; enb_id++) + mac_xface->mrbch_phy_sync_failure (enb_id, 0, enb_id); + + if (abstraction_flag == 1) { + for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) + mac_xface->dl_phy_sync_success (UE_id, 0, 0,1); //UE_id%NB_eNB_INST); + } + start_meas (&oaisim_stats); for (frame = 0; diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index b87142c3e5..dcae94047a 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1057,14 +1057,6 @@ void init_openair2(void) oai_emulation.info.cba_group_active, oai_emulation.info.handover_active); - for (enb_id = 0; enb_id < NB_eNB_INST; enb_id++) - mac_xface->mrbch_phy_sync_failure (enb_id, 0, enb_id); - - if (abstraction_flag == 1) { - for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) - mac_xface->dl_phy_sync_success (UE_id, 0, 0,1); //UE_id%NB_eNB_INST); - } - mac_xface->macphy_exit = exit_fun; #endif From deab4aa2084d190ef7731af6d0e811a4d680af27 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 1 Jun 2016 20:44:57 +0200 Subject: [PATCH 027/340] debugging with USRP --- openair1/SCHED/phy_procedures_lte_eNb.c | 82 +++------- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 2 + .../CONF/enb.band7.tm1.usrpb210.conf | 32 ++-- targets/RT/USER/lte-enb.c | 140 +++++++++++++----- 4 files changed, 137 insertions(+), 119 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index a444686758..381d29d44a 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2491,6 +2491,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (subframe==9) { subframe=0; frame++; + frame&=1023; } else subframe++; @@ -2512,62 +2513,34 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl rxs = openair0.trx_read_func(&openair0, &proc->timestamp_rx, rxp, - fp->samples_per_tti>>1, + fp->samples_per_tti, fp->nb_antennas_rx); proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - if (proc->first_rx == 0) - AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is"); + if (proc->first_rx == 0) { + AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)",proc->subframe_rx,subframe); + AssertFatal(proc->frame_rx == frame, "Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)",proc->frame_rx,frame); + } else proc->first_rx = 0; + // printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, subframe ); - if (frame > 20){ - if (rxs != fp->samples_per_tti>>1) - exit_fun( "problem receiving samples" ); - } + + if (rxs != fp->samples_per_tti) + exit_fun( "problem receiving samples" ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - // wake up TX thread - // lock the TX mutex and make sure the thread is ready - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx ); - exit_fun( "error locking mutex_tx" ); - return; - } - - int cnt_tx = ++proc->instance_cnt_tx; - // We have just received and processed the common part of the first slot of a subframe, say n. - // TX_rx is the last received timestamp (start of 1st slot), TX_tx is the desired - // transmitted timestamp of the next TX slot (first). - // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, - // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, - // and proc->subframe_tx = proc->subframe_rx+3 - proc->timestamp_tx = proc->timestamp_rx + (3*fp->samples_per_tti); - proc->frame_tx = (subframe > 6) ? (frame+1) : frame; - proc->subframe_tx = (subframe + 3)%10; - - pthread_mutex_unlock( &proc->mutex_tx ); - - if (cnt_tx == 0){ - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc->cond_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n"); - exit_fun( "ERROR pthread_cond_signal" ); - return; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", frame, cnt_tx ); - exit_fun( "TX thread busy" ); - return; - } // now do common RX processing for first slot in subframe VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); remove_7_5_kHz(eNB,subframe<<1); - for (l=0; lsymbols_per_tti/2; l++) + remove_7_5_kHz(eNB,1+(subframe<<1)); + for (l=0; lsymbols_per_tti/2; l++) { slot_fep_ul(fp, &eNB->common_vars, l, @@ -2575,35 +2548,18 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl 0, 0 ); - - if (eNB->node_function == NGFI_RRU_IF4) { - //send_IF4(eNB,subframe<<1); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); - - for (i=0; inb_antennas_rx; i++) - rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][(fp->samples_per_tti>>1)+(subframe*fp->samples_per_tti)]; - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - rxs = openair0.trx_read_func(&openair0, - &proc->timestamp_rx, - rxp, - fp->samples_per_tti>>1, - fp->nb_antennas_rx); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); - remove_7_5_kHz(eNB,(subframe<<1)+1); - for (l=0; lsymbols_per_tti/2; l++) slot_fep_ul(fp, &eNB->common_vars, l, - (subframe<<1)+1, + 1+(subframe<<1), 0, 0 ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); + if (eNB->node_function == NGFI_RRU_IF4) { + //send_IF4(eNB,subframe<<1); //send_IF4(eNB,(subframe<<1)+1); } diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 72e79b44de..3c1e1796e6 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -174,6 +174,8 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, { usrp_state_t *s = (usrp_state_t*)device->priv; s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); + + if(flags) s->tx_md.has_time_spec = true; else diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf index 967b0c0ca8..ae2b076a49 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -28,7 +28,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2680000000L; + downlink_frequency = 2660000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 25; @@ -64,15 +64,15 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -103; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; rach_numberOfRA_Preambles = 64; rach_preamblesGroupAConfig = "DISABLE"; @@ -82,7 +82,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -130,7 +130,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; + mme_ip_address = ( { ipv4 = "127.0.0.3"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -139,11 +139,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index dcf970e44e..7e779bc88b 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -167,10 +167,11 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) unsigned int aa,slot_offset, slot_offset_F; int dummy_tx_b[7680*4] __attribute__((aligned(32))); - int i, tx_offset; + int i,j, tx_offset; int slot_sizeF = (phy_vars_eNB->frame_parms.ofdm_symbol_size)* ((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7); - int len; + int len,len2; + int16_t *txdata; slot_offset_F = (subframe<<1)*slot_sizeF; @@ -220,27 +221,52 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) dummy_tx_b[i+2] = 0xff00; dummy_tx_b[i+3] = 0xff000000; }*/ - for (i=0; icommon_vars.txdata[0][aa][(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)+tx_offset]; + len2 = -(slot_offset+time_offset[aa]); + len2 = (len2>len) ? len : len2; + for (i=0; i<(len2<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]<common_vars.txdata[0][aa][0]; + for (j=0; i<(len<<1); i++,j++) { + txdata[j++] = ((int16_t*)dummy_tx_b)[i]<(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) { - - if (tx_offset<0) - tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; + tx_offset = (int)slot_offset+time_offset[aa]; + txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset]; + len2 = -tx_offset+LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; + for (i=0; i<(len2<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]<common_vars.txdata[0][aa][0]; + for (j=0; i<(len<<1); i++,j++) { + txdata[j++] = ((int16_t*)dummy_tx_b)[i]<common_vars.txdata[0][aa][tx_offset]; - if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) - tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; + for (i=0; i<(len<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]<common_vars.txdata[0][aa][tx_offset])[0] = ((short*)dummy_tx_b)[2*i]<common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<frame_parms,subframe) == SF_S) { for (i=0; icommon_vars.txdata[0][aa][tx_offset++] = 0x00010001; } } - + */ if ((((phy_vars_eNB->frame_parms.tdd_config==0) || (phy_vars_eNB->frame_parms.tdd_config==1) || (phy_vars_eNB->frame_parms.tdd_config==2) || @@ -420,12 +446,13 @@ static void* eNB_thread_tx( void* param ) /* run PHY TX procedures the one after the other for all CCs to avoid race conditions * (may be relaxed in the future for performance reasons) */ + if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n"); exit_fun("nothing to add"); break; } - /* wait for our turn or oai_exit */ + // wait for our turn or oai_exit while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) { pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx, &sync_phy_proc.mutex_phy_proc_tx); @@ -436,6 +463,7 @@ static void* eNB_thread_tx( void* param ) exit_fun("nothing to add"); } + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_ENB, proc->subframe_tx ); @@ -488,14 +516,15 @@ static void* eNB_thread_tx( void* param ) for (i=0; iframe_parms.nb_antennas_tx; i++) txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; // if symb_written < spp ==> error - if (proc->frame_tx > 50) { - openair0.trx_write_func(&openair0, - (proc->timestamp_tx+openair0_cfg[0].tx_sample_advance), - txp, - PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, - PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, - 1); - } + openair0.trx_write_func(&openair0, + (proc->timestamp_tx+openair0_cfg[0].tx_sample_advance), + txp, + PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, + PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, + 1); + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); @@ -658,7 +687,7 @@ static void* eNB_thread_rx( void* param ) memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); policy = SCHED_FIFO ; s = pthread_setschedparam(pthread_self(), policy, &sparam); @@ -719,8 +748,10 @@ static void* eNB_thread_rx( void* param ) if ((((fp->frame_type == TDD )&&(subframe_select(fp,proc->subframe_rx)==SF_UL)) || (fp->frame_type == FDD))) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); - // this spawns the prach and TX threads inside and updates the frame and subframe counters + // this spawns the prach inside and updates the frame and subframe counters phy_procedures_eNB_common_RX(eNB, 0); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); if (eNB->node_function != NGFI_RRU_IF4) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); @@ -729,10 +760,39 @@ static void* eNB_thread_rx( void* param ) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); } } - - if ((subframe_select(fp,proc->subframe_rx) == SF_S)) { - phy_procedures_eNB_S_RX(eNB, 0, no_relay ); + + // wake up TX for subframe n+4 + // lock the TX mutex and make sure the thread is ready + if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx ); + exit_fun( "error locking mutex_tx" ); + break; } + int cnt_tx = ++proc->instance_cnt_tx; + // We have just received and processed the common part of a subframe, say n. + // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired + // transmitted timestamp of the next TX slot (first). + // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, + // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+3 + proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + proc->frame_tx = (proc->frame_rx > 5) ? (proc->frame_rx+1)&1023 : proc->frame_rx; + proc->subframe_tx = (proc->subframe_rx + 4)%10; + + pthread_mutex_unlock( &proc->mutex_tx ); + + if (cnt_tx == 0){ + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc->cond_tx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", proc->frame_tx, cnt_tx ); + exit_fun( "TX thread busy" ); + break; + } stop_meas( &softmodem_stats_rx_sf ); #ifdef LOWLATENCY @@ -747,17 +807,17 @@ static void* eNB_thread_rx( void* param ) } - - //stop_meas( &softmodem_stats_rx_sf[proc->thread_index] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); - - + + //stop_meas( &softmodem_stats_rx_sf[proc->thread_index] ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); + + #ifdef DEBUG_THREADS - printf( "Exiting eNB thread RX\n"); + printf( "Exiting eNB thread RX\n"); #endif - - eNB_thread_rx_status = 0; - return &eNB_thread_rx_status; + + eNB_thread_rx_status = 0; + return &eNB_thread_rx_status; } @@ -848,7 +908,7 @@ static void* eNB_thread_prach( void* param ) memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-2; policy = SCHED_FIFO ; s = pthread_setschedparam(pthread_self(), policy, &sparam); @@ -868,7 +928,7 @@ static void* eNB_thread_prach( void* param ) } - LOG_I( HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), + LOG_I( HW, "[SCHED][eNB] PRACH thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -962,7 +1022,7 @@ void init_eNB_proc(void) pthread_attr_setschedparam (&proc->attr_tx, &proc->sched_param_tx); pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO); - proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; pthread_attr_setschedparam (&proc->attr_rx, &proc->sched_param_rx); pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO); From ba93bbe99e05dd57dbd7d319bc89b28dad8b9506 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 1 Jun 2016 21:40:59 -0700 Subject: [PATCH 028/340] corrected frame_tx calculation in lte-enb.c --- targets/RT/USER/lte-enb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 7e779bc88b..1fe49bf6af 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -776,7 +776,7 @@ static void* eNB_thread_rx( void* param ) // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, // and proc->subframe_tx = proc->subframe_rx+3 proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); - proc->frame_tx = (proc->frame_rx > 5) ? (proc->frame_rx+1)&1023 : proc->frame_rx; + proc->frame_tx = (proc->subframe_rx > 5) ? (proc->frame_rx+1)&1023 : proc->frame_rx; proc->subframe_tx = (proc->subframe_rx + 4)%10; pthread_mutex_unlock( &proc->mutex_tx ); From f895f42c9dd67ca78bd40d58c9747a028c8ad43e Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 2 Jun 2016 09:34:56 +0200 Subject: [PATCH 029/340] frame/subframe numbering --- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 2 ++ openair1/SCHED/phy_procedures_lte_eNb.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 0850836b36..d63ed32fda 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -288,11 +288,13 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, if (harq_pid==255) { LOG_E(PHY, "FATAL ERROR: illegal harq_pid, returning\n"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,0); return -1; } if (ulsch_harq->Nsymb_pusch == 0) { LOG_E(PHY, "FATAL ERROR: harq_pid %d, Nsymb 0!\n",harq_pid); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,0); return 1+ulsch->max_turbo_iterations; } if (llr8_flag == 0) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 381d29d44a..cfcec35460 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -845,9 +845,9 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const in LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; eNB_proc_t *proc = &eNB->proc; int frame = proc->frame_tx; - int subframe = proc->frame_rx; + int subframe = proc->subframe_tx; - LOG_D(PHY, + LOG_I(PHY, "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n", eNB->Mod_id, subframe2harq_pid(fp, From a2234d18a637fd56c6ddbe0a99bf98cb604d0b3b Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 2 Jun 2016 00:41:28 -0700 Subject: [PATCH 030/340] new procedures document --- targets/DOCS/oai_L1_L2_procedures.pdf | Bin 1696869 -> 1652669 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/targets/DOCS/oai_L1_L2_procedures.pdf b/targets/DOCS/oai_L1_L2_procedures.pdf index e14948f5af9195b59e06b4b4aefafa065756d09f..0f47195db1c70b27f17b907a3b95174d45e4f292 100755 GIT binary patch delta 110207 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 z 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 Date: Thu, 2 Jun 2016 06:16:50 -0700 Subject: [PATCH 031/340] tx_scheduling_advance removed and tx_sample_advance added to trx_write in lte-enb.c --- targets/RT/USER/lte-enb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 1fe49bf6af..6290953e8b 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -517,7 +517,7 @@ static void* eNB_thread_tx( void* param ) txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; // if symb_written < spp ==> error openair0.trx_write_func(&openair0, - (proc->timestamp_tx+openair0_cfg[0].tx_sample_advance), + (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), txp, PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, From 4996f9855d8d41a5a1ef4a7646919ed31287e2de Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 2 Jun 2016 19:13:20 +0200 Subject: [PATCH 032/340] first draft of the send_if function --- openair1/PHY/TOOLS/if4tools.c | 47 +++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 openair1/PHY/TOOLS/if4tools.c diff --git a/openair1/PHY/TOOLS/if4tools.c b/openair1/PHY/TOOLS/if4tools.c new file mode 100644 index 0000000000..70e598e2a1 --- /dev/null +++ b/openair1/PHY/TOOLS/if4tools.c @@ -0,0 +1,47 @@ +/* +typedef struct data_block_type { + +} data_block; +*/ + +/* +void allocate_data_block(long *data_block ,int length){ + data_block = malloc(length*sizeof(long)); +} +*/ + +void send_IF4(PHY_VARS_eNB eNB, int subframe){ + eNB_proc_t *proc = &eNB->proc; + //int frame=proc->frame_tx; + //int subframe=proc->subframe_tx; + + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int i,j; + + float *data_block = malloc(length*sizeof(long)); + + + // find number of consecutive non zero in values in symbol + // NrOfNonZeroValues + + // how many values does the atan function output? + + for(i = 0; i <= fp->symbols_per_tti; i++){ + for(j = 0; j < NrOfNonZeroValues; j=j+2){ + + symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] + + data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); + data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); + // use memset? + } + + } + +/* +memset(&eNB->common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], + 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); + } + */ + +} From fd70527bf2b03ede4b54e1cf01362a54bd515c04 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 2 Jun 2016 16:00:02 -0700 Subject: [PATCH 033/340] updates for 2 RXn-TXnp4 threads --- openair1/PHY/INIT/lte_init.c | 10 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 7 +- openair1/PHY/LTE_TRANSPORT/phich.c | 17 +- openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c | 3 +- openair1/PHY/LTE_TRANSPORT/pmch.c | 10 +- openair1/PHY/LTE_TRANSPORT/print_stats.c | 8 +- openair1/PHY/LTE_TRANSPORT/proto.h | 17 +- openair1/PHY/LTE_TRANSPORT/pucch.c | 5 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 12 +- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 16 +- openair1/PHY/TOOLS/lte_phy_scope.c | 2 +- openair1/PHY/defs.h | 51 ++- openair1/SCHED/defs.h | 18 +- openair1/SCHED/phy_mac_stub.c | 44 +- openair1/SCHED/phy_procedures_lte_eNb.c | 377 +++++++++--------- openair2/LAYER2/MAC/proto.h | 2 +- openair2/UTIL/LOG/vcd_signal_dumper.c | 24 +- openair2/UTIL/LOG/vcd_signal_dumper.h | 24 +- targets/RT/USER/lte-enb.c | 218 +++++----- 19 files changed, 442 insertions(+), 423 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 5c8a5ec436..e3128d7296 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -121,7 +121,7 @@ void phy_config_sib2_eNB(uint8_t Mod_id, //int32_t rx_total_gain_eNB_dB = PHY_vars_eNB_g[Mod_id][CC_id]->rx_total_gain_eNB_dB; int i; - LOG_D(PHY,"[eNB%d] CCid %d Frame %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc.frame_tx); + LOG_D(PHY,"[eNB%d] CCid %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id); frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",frame_parms->prach_config_common.rootSequenceIndex ); @@ -388,7 +388,7 @@ void phy_config_sib13_eNB(uint8_t Mod_id,int CC_id,int mbsfn_Area_idx, LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; - LOG_I(PHY,"[eNB%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc.frame_tx,mbsfn_AreaId_r9,mbsfn_Area_idx); + LOG_I(PHY,"[eNB%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; @@ -409,7 +409,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB) physicalConfigDedicated = eNB->physicalConfigDedicated[UE_id]; if (physicalConfigDedicated != NULL) { - LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id, eNB->proc.frame_tx,physicalConfigDedicated,UE_id); + LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id,physicalConfigDedicated,UE_id); LOG_D(PHY,"------------------------------------------------------------------------\n"); if (physicalConfigDedicated->pdsch_ConfigDedicated) { @@ -644,7 +644,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id, int8_t UE_id = find_ue(rnti,eNB); if (UE_id == -1) { - LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id, eNB->proc.frame_tx ); + LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id); return; } @@ -653,7 +653,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id, eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated; LOG_I(PHY,"phy_config_dedicated_eNB: physicalConfigDedicated=%p\n",physicalConfigDedicated); } else { - LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, eNB->proc.frame_tx,UE_id); + LOG_E(PHY,"[eNB %d] Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, UE_id); return; } diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 4538deee13..18e232e967 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -7078,6 +7078,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, } int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, void *dci_pdu, uint16_t rnti, DCI_format_t dci_format, @@ -7095,7 +7096,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, ANFBmode_t AckNackFBMode = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id]; LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; - int subframe = eNB->proc.subframe_tx; + int subframe = proc->subframe_tx; uint32_t cqi_req = 0; uint32_t dai = 0; @@ -7116,7 +7117,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, harq_pid = subframe2harq_pid(frame_parms, pdcch_alloc2ul_frame(frame_parms, - eNB->proc.frame_tx, + proc->frame_tx, subframe), pdcch_alloc2ul_subframe(frame_parms,subframe)); @@ -7637,7 +7638,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d)\n", - eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift); + eNB->Mod_id,harq_pid,proc->frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift); diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 54564637d6..223afcfdd9 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1416,7 +1416,8 @@ void rx_phich(PHY_VARS_UE *ue, } void generate_phich_top(PHY_VARS_eNB *eNB, - int16_t amp, + eNB_rxtx_proc_t *proc, + int16_t amp, uint8_t sect_id, uint8_t abstraction_flag) { @@ -1431,7 +1432,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, uint8_t pusch_subframe; uint8_t UE_id; uint32_t pusch_frame; - int subframe = eNB->proc.subframe_tx; + int subframe = proc->subframe_tx; // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211 @@ -1443,7 +1444,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, if (frame_parms->Ncp == 1) NSF_PHICH = 2; - pusch_frame = phich_frame2_pusch_frame(frame_parms,eNB->proc.frame_tx,subframe); + pusch_frame = phich_frame2_pusch_frame(frame_parms,proc->frame_tx,subframe); pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe); harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe); @@ -1452,7 +1453,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, if (ulsch[UE_id]->harq_processes[harq_pid]->phich_active == 1) { LOG_D(PHY,"[eNB][PUSCH %d/%x] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n", - harq_pid,ulsch[UE_id]->rnti,eNB->proc.frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active); + harq_pid,ulsch[UE_id]->rnti,proc->frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active); ngroup_PHICH = (ulsch[UE_id]->harq_processes[harq_pid]->first_rb + ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH; @@ -1466,7 +1467,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, nseq_PHICH = ((ulsch[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) + ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH); LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n", - eNB->Mod_id,harq_pid,eNB->proc.frame_tx, + eNB->Mod_id,harq_pid,proc->frame_tx, subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH, ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK, ulsch[UE_id]->harq_processes[harq_pid]->first_rb, @@ -1474,7 +1475,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, if (ulsch[UE_id]->Msg3_active == 1) { LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n", - eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe, + eNB->Mod_id,harq_pid,proc->frame_tx,subframe, UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK, ulsch[UE_id]->harq_processes[harq_pid]->first_rb); } @@ -1504,7 +1505,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, (ulsch[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) { if (ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n", - eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe); + eNB->Mod_id,harq_pid,proc->frame_tx,subframe); ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; ulsch[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch[UE_id]->harq_processes[harq_pid]->round&3]; ulsch[UE_id]->harq_processes[harq_pid]->O_RI = 0; @@ -1514,7 +1515,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, } else { LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d PHICH ACK (no format0 DCI) Clearing subframe_scheduling_flag, setting round to 0\n", - eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe); + eNB->Mod_id,harq_pid,proc->frame_tx,subframe); ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; ulsch[UE_id]->harq_processes[harq_pid]->round=0; } diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c index b32d56f5be..8a76ef6e77 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c @@ -42,6 +42,7 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, int32_t **txdataF, int16_t amp) @@ -49,7 +50,7 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *eNB, LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t subframe_offset,Nsymb,samples_per_symbol; - int subframe = eNB->proc.subframe_tx; + int subframe = proc->subframe_tx; if (subframe<0 || subframe>= 10) { diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 084b2b1793..325e0918a5 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -286,11 +286,11 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id) } } -void generate_mch(PHY_VARS_eNB *eNB,uint8_t *a,int abstraction_flag) +void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a,int abstraction_flag) { int G; - int subframe = eNB->proc.subframe_tx; + int subframe = proc->subframe_tx; if (abstraction_flag != 0) { if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0) @@ -312,9 +312,9 @@ void generate_mch(PHY_VARS_eNB *eNB,uint8_t *a,int abstraction_flag) eNB->frame_parms.N_RB_DL, eNB->dlsch_MCH->harq_processes[0]->rb_alloc, get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1, - 2,eNB->proc.frame_tx,subframe); + 2,proc->frame_tx,subframe); - generate_mbsfn_pilot(eNB, + generate_mbsfn_pilot(eNB,proc, eNB->common_vars.txdataF[0], AMP); @@ -323,7 +323,7 @@ void generate_mch(PHY_VARS_eNB *eNB,uint8_t *a,int abstraction_flag) &eNB->frame_parms, 1, eNB->dlsch_MCH, - eNB->proc.frame_tx, + proc->frame_tx, subframe, &eNB->dlsch_rate_matching_stats, &eNB->dlsch_turbo_encoding_stats, diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 829b05530e..a175f4cb8e 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -568,7 +568,7 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) uint32_t ulsch_round_attempts[4]= {0,0,0,0},ulsch_round_errors[4]= {0,0,0,0}; uint32_t dlsch_round_attempts[4]= {0,0,0,0},dlsch_round_errors[4]= {0,0,0,0}; uint32_t UE_id_mac, RRC_status; - + eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0]; if (eNB==NULL) return 0; @@ -583,7 +583,7 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) for (eNB_id=0; eNB_idproc.frame_tx, + proc->frame_tx, eNB->rx_total_gain_dB, eNB->measurements[eNB_id].n0_power_tot_dBm, eNB->measurements[eNB_id].n0_power_dB[0], @@ -621,9 +621,9 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) - len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(eNB->total_transmitted_bits/1000),eNB->proc.frame_tx+1); + len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(eNB->total_transmitted_bits/1000),proc->frame_tx+1); len += sprintf(&buffer[len],"Total DLSCH throughput %d kbps ",(eNB->total_dlsch_bitrate/1000)); - len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,eNB->proc.frame_tx+1); + len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,proc->frame_tx+1); //len += sprintf(&buffer[len],"[eNB PROC] FULL MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->FULL_MUMIMO_transmissions,eNB->check_for_total_transmissions); //len += sprintf(&buffer[len],"[eNB PROC] MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_MUMIMO_transmissions,eNB->check_for_total_transmissions); //len += sprintf(&buffer[len],"[eNB PROC] SU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_SUMIMO_transmissions,eNB->check_for_total_transmissions); diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index fc9e800760..1f8f0723e6 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -232,10 +232,11 @@ int mch_modulation(int32_t **txdataF, @param abstraction_flag */ -void generate_mch(PHY_VARS_eNB *phy_vars_eNB,uint8_t *a,int abstraction_flag); +void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a,int abstraction_flag); /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals) @param phy_vars_eNB Pointer to eNB variables + @param proc Pointer to RXn-TXnp4 proc information @param mcs MCS for MBSFN @param ndi new data indicator @param rdvix @@ -299,7 +300,8 @@ int32_t generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, int first_pilot_only); int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, - int32_t **txdataF, + eNB_rxtx_proc_t *proc, + int32_t **txdataF, int16_t amp); int32_t generate_pss(int32_t **txdataF, @@ -1408,6 +1410,7 @@ int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id); int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB, + eNB_rxtx_proc_t *proc, void *dci_pdu, rnti_t rnti, DCI_format_t dci_format, @@ -1419,7 +1422,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB, uint8_t use_srs); -void dump_ulsch(PHY_VARS_eNB *phy_vars_eNb,uint8_t UE_id); +void dump_ulsch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id); void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); @@ -1474,12 +1477,14 @@ void generate_RIV_tables(void); int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode); void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, - uint8_t eNB_id, // this is the effective sector id + eNB_rxtx_proc_t *proc, + uint8_t eNB_id, // this is the effective sector id uint8_t UE_id, LTE_eNB_ULSCH_t **ulsch, uint8_t cooperation_flag); void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, uint8_t sect_id, uint8_t UE_index); @@ -1518,6 +1523,7 @@ int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer, /*! \brief Decoding of PUSCH/ACK/RI/ACK from 36-212. @param phy_vars_eNB Pointer to eNB top-level descriptor + @param proc Pointer to RXTX proc variables @param UE_id ID of UE transmitting this PUSCH @param subframe Index of subframe for PUSCH @param control_only_flag Receive PUSCH with control information only @@ -1526,6 +1532,7 @@ int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer, @returns 0 on success */ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_id, uint8_t control_only_flag, uint8_t Nbundled, @@ -1536,6 +1543,7 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, uint16_t *crnti); void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, int16_t amp, uint8_t sect_id, uint8_t abstraction_flag); @@ -1663,6 +1671,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, uint8_t pucch1_thres); int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_index, PUCCH_FMT_t fmt, uint8_t n1_pucch_sel, diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 547a0f2217..ce5f756145 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -1064,6 +1064,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, int32_t rx_pucch_emul(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_index, PUCCH_FMT_t fmt, uint8_t n1_pucch_sel, @@ -1072,7 +1073,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *eNB, { uint8_t UE_id; uint16_t rnti; - int subframe = eNB->proc.subframe_rx; + int subframe = proc->subframe_rx; uint8_t CC_id = eNB->CC_id; rnti = eNB->ulsch[UE_index]->rnti; @@ -1095,7 +1096,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *eNB, payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0]; payload[1] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[1]; } else - LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",eNB->proc.frame_rx); + LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",proc->frame_rx); if (PHY_vars_UE_g[UE_id][CC_id]->pucch_sel[subframe] == n1_pucch_sel) return(99); diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index d63ed32fda..02bf98c372 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -218,7 +218,7 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) -unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, +unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, uint8_t UE_id, uint8_t control_only_flag, uint8_t Nbundled, @@ -259,7 +259,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, int16_t cseq[6*14*1200]; int off; int status[20]; - int subframe = eNB->proc.subframe_rx; + int subframe = proc->subframe_rx; LTE_UL_eNB_HARQ_t *ulsch_harq; uint8_t (*tc)(int16_t *y, @@ -278,7 +278,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, time_stats_t *, time_stats_t *); - harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe); + harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,1); @@ -1501,18 +1501,18 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb #endif -uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, +uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t UE_index, uint16_t *crnti) { uint8_t UE_id; uint16_t rnti; - int subframe = eNB->proc.subframe_rx; + int subframe = proc->subframe_rx; uint8_t harq_pid; uint8_t CC_id = eNB->CC_id; - harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc.frame_rx,subframe); + harq_pid = subframe2harq_pid(&eNB->frame_parms,proc->frame_rx,subframe); rnti = eNB->ulsch[UE_index]->rnti; #ifdef DEBUG_PHY diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 53cab326f1..59cf11a06c 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1577,6 +1577,7 @@ int32_t avgU[2]; int32_t avgU_0[2],avgU_1[2]; // For the Distributed Alamouti Scheme void rx_ulsch(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t eNB_id, // this is the effective sector id uint8_t UE_id, LTE_eNB_ULSCH_t **ulsch, @@ -1602,9 +1603,9 @@ void rx_ulsch(PHY_VARS_eNB *eNB, uint8_t Qm; uint16_t rx_power_correction; int16_t *llrp; - int subframe = eNB->proc.subframe_rx; + int subframe = proc->subframe_rx; - harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe); + harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe); Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs); #ifdef DEBUG_ULSCH msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb, @@ -1885,24 +1886,25 @@ void rx_ulsch(PHY_VARS_eNB *eNB, } void rx_ulsch_emul(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t sect_id, uint8_t UE_index) { - msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,eNB->proc.subframe_rx,sect_id,UE_index); + msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,sect_id,UE_index); eNB->pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB; eNB->pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB; } -void dump_ulsch(PHY_VARS_eNB *eNB,uint8_t UE_id) + void dump_ulsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id) { - + uint32_t nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; uint8_t harq_pid; - int subframe = eNB->proc.subframe_rx; + int subframe = proc->subframe_rx; - harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc.frame_rx,subframe); + harq_pid = subframe2harq_pid(&eNB->frame_parms,proc->frame_rx,subframe); printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs), diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 28c407b088..8af3fcf8d1 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -183,7 +183,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, float time[FRAME_LENGTH_COMPLEX_SAMPLES]; float time2[2048]; float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; - int frame = phy_vars_enb->proc.frame_tx; + int frame = phy_vars_enb->proc.proc_rxtx[0].frame_tx; uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate; int coded_bits_per_codeword = 0; uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2 diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index e18c0b1d91..89fc1cd7ed 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -178,6 +178,34 @@ typedef struct ral_threshold_phy_s { } ral_threshold_phy_t; #endif +/// Context data structure for RX/TX portion of subframe processing +typedef struct { + /// Component Carrier index + uint8_t CC_id; + /// timestamp transmitted to HW + openair0_timestamp timestamp_tx; + /// subframe to act upon for transmission + int subframe_tx; + /// subframe to act upon for reception + int subframe_rx; + /// frame to act upon for transmission + int frame_tx; + /// frame to act upon for reception + int frame_rx; + /// \brief Instance count for RXn-TXnp4 processing thread. + /// \internal This variable is protected by \ref mutex_rxtx. + int instance_cnt_rxtx; + /// pthread structure for RXn-TXnp4 processing thread + pthread_t pthread_rxtx; + /// pthread attributes for RXn-TXnp4 processing thread + pthread_attr_t attr_rxtx; + /// condition variable for tx processing thread + pthread_cond_t cond_rxtx; + /// mutex for RXn-TXnp4 processing thread + pthread_mutex_t mutex_rxtx; + /// scheduling parameters for RXn-TXnp4 thread + struct sched_param sched_param_rxtx; +} eNB_rxtx_proc_t; /// Context data structure for eNB subframe processing typedef struct { /// Component Carrier index @@ -186,54 +214,37 @@ typedef struct { int thread_index; /// timestamp received from HW openair0_timestamp timestamp_rx; - /// timestamp transmitted to HW - openair0_timestamp timestamp_tx; - /// subframe to act upon for transmission - int subframe_tx; /// subframe to act upon for reception int subframe_rx; /// subframe to act upon for PRACH int subframe_prach; - /// frame to act upon for transmission - int frame_tx; /// frame to act upon for reception int frame_rx; /// frame to act upon for PRACH int frame_prach; - /// \brief Instance count for tx processing thread. - /// \internal This variable is protected by \ref mutex_tx. - int instance_cnt_tx; /// \brief Instance count for rx processing thread. /// \internal This variable is protected by \ref mutex_prach. int instance_cnt_prach; - /// pthread structure for tx processing thread - pthread_t pthread_tx; /// pthread structure for rx processing thread pthread_t pthread_rx; /// flag to indicate first RX acquisition int first_rx; - /// pthread attributes for tx processing thread - pthread_attr_t attr_tx; /// pthread attributes for rx processing thread pthread_attr_t attr_rx; /// pthread attributes for prach processing thread pthread_attr_t attr_prach; - /// scheduling parameters for tx thread - struct sched_param sched_param_tx; /// scheduling parameters for rx thread struct sched_param sched_param_rx; /// scheduling parameters for prach thread struct sched_param sched_param_prach; - /// condition variable for tx processing thread - pthread_t pthread_prach; /// condition variable for prach processing thread - pthread_cond_t cond_tx; + pthread_t pthread_prach; /// condition variable for rx processing thread; pthread_cond_t cond_prach; /// mutex for tx processing thread - pthread_mutex_t mutex_tx; - /// mutex for tx processing thread pthread_mutex_t mutex_prach; + /// set of scheduling variables RXn-TXnp4 threads + eNB_rxtx_proc_t proc_rxtx[2]; } eNB_proc_t; //! \brief Number of eNB TX and RX threads. diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 2174684126..62e0a7d9ce 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -226,17 +226,19 @@ void phy_procedures_UE_S_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abst @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param phy_vars_rn pointer to the RN variables */ -void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); /*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes. @param phy_vars_eNB Pointer to eNB variables on which to act + @param proc Pointer to RXn-TXnp4 proc information @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for eNB TX procedures in TDD S-subframes. @param phy_vars_eNB Pointer to eNB variables on which to act + @param proc Pointer to RXn-TXnp4 proc information @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ @@ -260,10 +262,11 @@ void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for eNB PRACH RX procedures @param phy_vars_eNB Pointer to eNB variables on which to act + @param proc Pointer to RXn-TXnp4 proc information @param abstraction_flag Indicator of PHY abstraction */ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag); @@ -393,10 +396,11 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); @param UE_id ID of UE which may be issuing the SR @returns 1 if TXOp is active. */ -uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id); +uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id); /*! \brief Gives the UL subframe corresponding to a PDDCH order in subframe n @param frame_parms Pointer to DL frame parameters + @param proc Pointer to RXn-TXnp4 proc information @param n subframe of PDCCH @returns UL subframe corresponding to pdcch order */ @@ -447,7 +451,8 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, /*! \brief This function retrives the resource (n1_pucch) corresponding to a PDSCH transmission in subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch = Ncce + N1_pucch. For TDD, this routine computes the procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2) -@param phy_vars_eNB Pointer to UE variables +@param phy_vars_eNB Pointer to eNB variables +@param proc Pointer to RXn-TXnp4 proc information @param eNB_id Index of eNB @param subframe Index of subframe @param b Pointer to PUCCH payload (b[0],b[1]) @@ -457,6 +462,7 @@ TDD, this routine computes the procedure described in Section 10.1 of 36.213 (th @param n1_pucch3 Pointer to n1_pucch3 */ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_id, int16_t *n1_pucch0, int16_t *n1_pucch1, @@ -467,6 +473,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, /*! \brief This function retrieves the harq_pid of the corresponding DLSCH process and updates the error statistics of the DLSCH based on the received ACK info from UE along with the round index. It also performs the fine-grain rate-adaptation based on the error statistics derived from the ACK/NAK process. @param UE_id Local UE index on which to act @param phy_vars_eNB Pointer to eNB variables on which to act + @param proc Pointer to RXn-TXnp4 proc information @param pusch_flag Indication that feedback came from PUSCH @param pucch_payload Resulting payload from pucch @param pucch_sel Selection of n1_pucch0 or n1_pucch1 (TDD specific) @@ -474,6 +481,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, */ void process_HARQ_feedback(uint8_t UE_id, PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, uint8_t pusch_flag, uint8_t *pucch_payload, uint8_t pucch_sel, diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 564a7951c6..b7f2e57f7c 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -48,7 +48,7 @@ #include "SCHED/phy_procedures_emos.h" #endif -void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) +void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { @@ -57,7 +57,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) uint32_t rballoc = 0x7FFF; //uint32_t rballoc2 = 0x000F; - int subframe = eNB->proc.subframe_tx; + int subframe = proc->subframe_tx; LTE_eNB_DLSCH_t *DLSCH_ptr = eNB->dlsch[0][0]; @@ -89,7 +89,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -100,7 +100,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -117,7 +117,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -128,7 +128,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -144,7 +144,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -155,7 +155,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; @@ -171,7 +171,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -182,7 +182,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -236,7 +236,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = proc->frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -267,7 +267,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = proc->frame_tx&1; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -303,7 +303,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = proc->frame_tx&1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); @@ -334,7 +334,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = proc->frame_tx&1; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); @@ -369,7 +369,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = proc->frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -400,7 +400,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = eNB->proc.frame_tx&1; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = proc->frame_tx&1; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t)); @@ -437,10 +437,10 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = eNB->proc.frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = proc->frame_tx&1; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = eNB->proc.frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = proc->frame_tx&1; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; @@ -459,7 +459,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = eNB->proc.frame_tx&1; + DLSCH_alloc_pdu1E.ndi = proc->frame_tx&1; //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[eNB->eNB_UE_stats->DL_cqi[0]]; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; @@ -482,7 +482,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) //DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((eNB->frame%1024)%28); - DLSCH_alloc_pdu1E.mcs = (unsigned char) (((eNB->proc.frame_tx%1024)/3)%28); + DLSCH_alloc_pdu1E.mcs = (unsigned char) (((proc->frame_tx%1024)/3)%28); eNB->UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); @@ -533,7 +533,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) UL_alloc_pdu.hopping = 0; UL_alloc_pdu.rballoc = computeRIV(25,2,eNB->ue_ul_nb_rb); UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; - UL_alloc_pdu.ndi = eNB->proc.frame_tx&1; + UL_alloc_pdu.ndi = proc->frame_tx&1; UL_alloc_pdu.TPC = 0; UL_alloc_pdu.cshift = 0; UL_alloc_pdu.dai = 0; @@ -555,7 +555,7 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB) else UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb); UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; - UL_alloc_pdu.ndi = eNB->proc.frame_tx&1; + UL_alloc_pdu.ndi = proc->frame_tx&1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) UL_alloc_pdu.cshift = 0; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index cfcec35460..9d43f21106 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -101,10 +101,9 @@ extern uint8_t smbv_frame_cnt; extern int rx_sig_fifo; #endif -uint8_t is_SR_subframe(PHY_VARS_eNB *eNB,uint8_t UE_id) +uint8_t is_SR_subframe(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id) { - eNB_proc_t *proc = &eNB->proc; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; @@ -339,10 +338,9 @@ void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *eNB) -void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,uint8_t abstraction_flag,relaying_type_t r_type) +void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type) { UNUSED(r_type); - eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; #ifdef DEBUG_PHY_PROC @@ -435,14 +433,13 @@ int QPSK2[4]= {AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),( unsigned int taus(void); -void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int abstraction_flag,relaying_type_t r_type) { +void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, int abstraction_flag,relaying_type_t r_type) { #ifdef Rel10 MCH_PDU *mch_pduP; MCH_PDU mch_pdu; // uint8_t sync_area=255; #endif - eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_tx; if (abstraction_flag==0) { @@ -508,7 +505,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int abstraction_flag,rel if (mch_pduP) { fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag); // Generate PMCH - generate_mch(eNB,(uint8_t*)mch_pduP->payload,abstraction_flag); + generate_mch(eNB,proc,(uint8_t*)mch_pduP->payload,abstraction_flag); } else { LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",proc->frame_tx,subframe); } @@ -516,12 +513,11 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int abstraction_flag,rel #endif } -void common_signal_procedures (PHY_VARS_eNB *eNB,int abstraction_flag) { +void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstraction_flag) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; int **txdataF = eNB->common_vars.txdataF[0]; uint8_t *pbch_pdu=&eNB->pbch_pdu[0]; - eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_tx; int frame = proc->frame_tx; @@ -703,10 +699,9 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,int abstraction_flag) { } -void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { +void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,const int UE_id) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - eNB_proc_t *proc = &eNB->proc; int frame = proc->frame_tx; int subframe = proc->subframe_tx; @@ -839,11 +834,10 @@ void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const in } -void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) { +void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,const int UE_id) { int harq_pid; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - eNB_proc_t *proc = &eNB->proc; int frame = proc->frame_tx; int subframe = proc->subframe_tx; @@ -862,6 +856,7 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const in 1<L); generate_eNB_ulsch_params_from_dci(eNB, + proc, &dci_alloc->dci_pdu[0], dci_alloc->rnti, format0, @@ -904,9 +899,8 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const in } -void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols,int abstraction_flag) { +void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols,int abstraction_flag) { - eNB_proc_t *proc = &eNB->proc; int frame=proc->frame_tx; int subframe=proc->subframe_tx; int harq_pid = dlsch->current_harq_pid; @@ -1112,12 +1106,12 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t } void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *rn) { UNUSED(rn); - eNB_proc_t *proc = &eNB->proc; int frame=proc->frame_tx; int subframe=proc->subframe_tx; // uint16_t input_buffer_length; @@ -1177,11 +1171,11 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, } if (is_pmch_subframe(frame,subframe,fp)) { - pmch_procedures(eNB,rn,abstraction_flag,r_type); + pmch_procedures(eNB,proc,rn,abstraction_flag,r_type); } else { // this is not a pmch subframe, so generate PSS/SSS/PBCH - common_signal_procedures(eNB,abstraction_flag); + common_signal_procedures(eNB,proc,abstraction_flag); } #if defined(SMBV) @@ -1207,7 +1201,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, #ifdef EMOS_CHANNEL fill_dci_emos(DCI_pdu,eNB); #else - fill_dci(DCI_pdu,eNB); + fill_dci(DCI_pdu,eNB,proc); #endif } @@ -1265,7 +1259,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, } else UE_id=0; - generate_eNB_dlsch_params(eNB,dci_alloc,UE_id); + generate_eNB_dlsch_params(eNB,proc,dci_alloc,UE_id); } @@ -1287,7 +1281,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,frame,dci_alloc->rnti); mac_xface->macphy_exit("FATAL\n"); } - generate_eNB_ulsch_params(eNB,dci_alloc,UE_id); + generate_eNB_ulsch_params(eNB,proc,dci_alloc,UE_id); } } @@ -1335,7 +1329,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, if (eNB->dlsch_SI->active == 1) { - pdsch_procedures(eNB,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,proc,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,num_pdcch_symbols,abstraction_flag); #if defined(SMBV) @@ -1368,7 +1362,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe); - pdsch_procedures(eNB,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,proc,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,num_pdcch_symbols,abstraction_flag); eNB->dlsch_ra->active = 0; @@ -1381,7 +1375,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& (eNB->dlsch[(uint8_t)UE_id][0]->active == 1)) { - pdsch_procedures(eNB,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,proc,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,num_pdcch_symbols,abstraction_flag); } @@ -1402,6 +1396,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, if (is_phich_subframe(fp,subframe)) { generate_phich_top(eNB, + proc, AMP, 0, abstraction_flag); @@ -1437,10 +1432,9 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, } -void process_Msg3(PHY_VARS_eNB *eNB,uint8_t UE_id, uint8_t harq_pid) +void process_Msg3(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id, uint8_t harq_pid) { // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 - eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; int frame = proc->frame_rx; @@ -1475,13 +1469,13 @@ void process_Msg3(PHY_VARS_eNB *eNB,uint8_t UE_id, uint8_t harq_pid) void process_HARQ_feedback(uint8_t UE_id, PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t pusch_flag, uint8_t *pucch_payload, uint8_t pucch_sel, uint8_t SR_payload) { - eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe; LTE_eNB_DLSCH_t *dlsch = eNB->dlsch[(uint32_t)UE_id][0]; @@ -1745,6 +1739,7 @@ void process_HARQ_feedback(uint8_t UE_id, } void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_id, int16_t *n1_pucch0, int16_t *n1_pucch1, @@ -1752,7 +1747,6 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, int16_t *n1_pucch3) { - eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms; uint8_t nCCE0,nCCE1; int sf; @@ -1892,9 +1886,8 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) uint16_t preamble_max,preamble_energy_max; uint16_t i; int8_t UE_id; - eNB_proc_t *proc = &eNB->proc; - int subframe = proc->subframe_rx; - int frame = proc->frame_rx; + int subframe = eNB->proc.subframe_prach; + int frame = eNB->proc.frame_prach; uint8_t CC_id = eNB->CC_id; memset(&preamble_energy_list[0],0,64*sizeof(uint16_t)); @@ -2002,7 +1995,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) } } -void pucch_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid,const uint8_t abstraction_flag) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; @@ -2012,7 +2005,6 @@ void pucch_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abs int32_t metric0=0,metric1=0,metric0_SR=0; ANFBmode_t bundling_flag; PUCCH_FMT_t format; - eNB_proc_t *proc = &eNB->proc; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; @@ -2021,159 +2013,160 @@ void pucch_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abs (eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { // check SR availability - do_SR = is_SR_subframe(eNB,UE_id); - // do_SR = 0; - + do_SR = is_SR_subframe(eNB,proc,UE_id); + // do_SR = 0; + // Now ACK/NAK // First check subframe_tx flag for earlier subframes - get_n1_pucch_eNB(eNB, - UE_id, - &n1_pucch0, - &n1_pucch1, - &n1_pucch2, - &n1_pucch3); + get_n1_pucch_eNB(eNB, + proc, + UE_id, + &n1_pucch0, + &n1_pucch1, + &n1_pucch2, + &n1_pucch3); + + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", + eNB->Mod_id,eNB->dlsch[UE_id][0]->rnti, + frame,subframe, + n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); + + if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id + } else { + // otherwise we have some PUCCH detection to do + + // Null out PUCCH PRBs for noise measurement + switch(fp->N_RB_UL) { + case 6: + eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 + break; + case 15: + eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 + break; + case 25: + eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 + break; + case 50: + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) + break; + case 75: + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) + break; + case 100: + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) + break; + default: + LOG_E(PHY,"Unknown number for N_RB_UL %d\n",fp->N_RB_UL); + break; + } + + if (do_SR == 1) { + eNB->UE_stats[UE_id].sr_total++; - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", - eNB->Mod_id,eNB->dlsch[UE_id][0]->rnti, - frame,subframe, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); - - if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id - } else { - // otherwise we have some PUCCH detection to do - - // Null out PUCCH PRBs for noise measurement - switch(fp->N_RB_UL) { - case 6: - eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 - break; - case 15: - eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 - break; - case 25: - eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 - break; - case 50: - eNB->rb_mask_ul[0] |= 0x1; - eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) - break; - case 75: - eNB->rb_mask_ul[0] |= 0x1; - eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) - break; - case 100: - eNB->rb_mask_ul[0] |= 0x1; - eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) - break; - default: - LOG_E(PHY,"Unknown number for N_RB_UL %d\n",fp->N_RB_UL); - break; + if (abstraction_flag == 0) + metric0_SR = rx_pucch(eNB, + pucch_format1, + UE_id, + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + 0, // n2_pucch + 0, // shortened format, should be use_srs flag, later + &SR_payload, + subframe, + PUCCH1_THRES); + +#ifdef PHY_ABSTRACTION + else { + metric0_SR = rx_pucch_emul(eNB, + UE_id, + pucch_format1, + 0, + &SR_payload); + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id, + eNB->ulsch[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); } - - if (do_SR == 1) { - eNB->UE_stats[UE_id].sr_total++; - - if (abstraction_flag == 0) - metric0_SR = rx_pucch(eNB, - pucch_format1, - UE_id, - eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, - 0, // n2_pucch - 0, // shortened format, should be use_srs flag, later - &SR_payload, - subframe, - PUCCH1_THRES); - -#ifdef PHY_ABSTRACTION - else { - metric0_SR = rx_pucch_emul(eNB, - UE_id, - pucch_format1, - 0, - &SR_payload); - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id, - eNB->ulsch[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); - } - + #endif - - if (SR_payload == 1) { - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id, - eNB->ulsch[UE_id]->rnti,frame,subframe); - eNB->UE_stats[UE_id].sr_received++; - - if (eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 - /* is this test necessary? */ - if (eNB->dlsch[UE_id][0]->harq_processes[0]->status != SCH_IDLE) - put_harq_pid_in_freelist(eNB->dlsch[UE_id][0], 0); - eNB->first_sr[UE_id] = 0; - eNB->dlsch[UE_id][0]->harq_processes[0]->round=0; - eNB->dlsch[UE_id][0]->harq_processes[0]->status=SCH_IDLE; - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", - eNB->Mod_id, - eNB->ulsch[UE_id]->rnti,frame,subframe); - } - - if (eNB->mac_enabled==1) { - mac_xface->SR_indication(eNB->Mod_id, - eNB->CC_id, - frame, - eNB->dlsch[UE_id][0]->rnti,subframe); - } - } - }// do_SR==1 - - if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR - } else if (fp->frame_type==FDD) { // FDD - // if SR was detected, use the n1_pucch from SR, else use n1_pucch0 - // n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; - - LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); - - if (abstraction_flag == 0) { - - - - metric0 = rx_pucch(eNB, - pucch_format1a, - UE_id, - (uint16_t)n1_pucch0, - 0, //n2_pucch - 0, // shortened format - pucch_payload0, - subframe, - PUCCH1a_THRES); - - if (metric0 < metric0_SR) - metric0=rx_pucch(eNB, - pucch_format1a, - UE_id, - eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, - 0, //n2_pucch - 0, // shortened format - pucch_payload0, - subframe, - PUCCH1a_THRES); + + if (SR_payload == 1) { + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id, + eNB->ulsch[UE_id]->rnti,frame,subframe); + eNB->UE_stats[UE_id].sr_received++; + + if (eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 + /* is this test necessary? */ + if (eNB->dlsch[UE_id][0]->harq_processes[0]->status != SCH_IDLE) + put_harq_pid_in_freelist(eNB->dlsch[UE_id][0], 0); + eNB->first_sr[UE_id] = 0; + eNB->dlsch[UE_id][0]->harq_processes[0]->round=0; + eNB->dlsch[UE_id][0]->harq_processes[0]->status=SCH_IDLE; + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", + eNB->Mod_id, + eNB->ulsch[UE_id]->rnti,frame,subframe); } - else { + + if (eNB->mac_enabled==1) { + mac_xface->SR_indication(eNB->Mod_id, + eNB->CC_id, + frame, + eNB->dlsch[UE_id][0]->rnti,subframe); + } + } + }// do_SR==1 + + if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR + } else if (fp->frame_type==FDD) { // FDD + // if SR was detected, use the n1_pucch from SR, else use n1_pucch0 + // n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; + + LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); + + if (abstraction_flag == 0) { + + + + metric0 = rx_pucch(eNB, + pucch_format1a, + UE_id, + (uint16_t)n1_pucch0, + 0, //n2_pucch + 0, // shortened format + pucch_payload0, + subframe, + PUCCH1a_THRES); + + if (metric0 < metric0_SR) + metric0=rx_pucch(eNB, + pucch_format1a, + UE_id, + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + 0, //n2_pucch + 0, // shortened format + pucch_payload0, + subframe, + PUCCH1a_THRES); + } + else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(eNB,UE_id, - pucch_format1a, - 0, - pucch_payload0, - subframe); + metric0 = rx_pucch_emul(eNB,UE_id, + pucch_format1a, + 0, + pucch_payload0, + subframe); #endif - } - + } + #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", - eNB->Mod_id, - eNB->dlsch[UE_id][0]->rnti, - frame,subframe, - pucch_payload0[0],metric0); + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", + eNB->Mod_id, + eNB->dlsch[UE_id][0]->rnti, + frame,subframe, + pucch_payload0[0],metric0); #endif - - process_HARQ_feedback(UE_id,eNB, + + process_HARQ_feedback(UE_id,eNB,proc, 0,// pusch_flag pucch_payload0, 2, @@ -2304,7 +2297,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abs frame,subframe, metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); #endif - process_HARQ_feedback(UE_id,eNB, + process_HARQ_feedback(UE_id,eNB,proc, 0,// pusch_flag pucch_payload, pucch_sel, @@ -2315,9 +2308,8 @@ void pucch_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abs } } -void cba_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid,const uint8_t abstraction_flag) { - eNB_proc_t *proc = &eNB->proc; uint8_t access_mode; int num_active_cba_groups; const int subframe = proc->subframe_rx; @@ -2342,7 +2334,7 @@ void cba_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstr #endif if (abstraction_flag==0) { - rx_ulsch(eNB, + rx_ulsch(eNB,proc, eNB->UE_stats[UE_id].sector, // this is the effective sector id UE_id, eNB->ulsch, @@ -2351,7 +2343,7 @@ void cba_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstr #ifdef PHY_ABSTRACTION else { - rx_ulsch_emul(eNB, + rx_ulsch_emul(eNB,proc, subframe, eNB->UE_stats[UE_id].sector, // this is the effective sector id UE_id); @@ -2360,7 +2352,7 @@ void cba_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstr #endif if (abstraction_flag == 0) { - ret = ulsch_decoding(eNB, + ret = ulsch_decoding(eNB,proc, UE_id, 0, // control_only_flag eNB->ulsch[UE_id]->harq_processes[harq_pid]->V_UL_DAI, @@ -2479,11 +2471,11 @@ void cba_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstr void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) { - eNB_proc_t *proc = &eNB->proc; int i,l; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; void *rxp[fp->nb_antennas_rx]; unsigned int rxs; + eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; int frame = proc->frame_rx; @@ -2617,11 +2609,10 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } } -void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) +void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const uint8_t abstraction_flag,const relaying_type_t r_type) { //RX processing for ue-specific resources (i UNUSED(r_type); - eNB_proc_t *proc = &eNB->proc; uint32_t l, ret=0,i,j,k; uint32_t harq_pid, harq_idx, round; uint8_t nPRS; @@ -2683,7 +2674,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl // Do PUCCH processing first for (i=0; imac_enabled==1) { if (eNB->UE_stats[i].mode == RA_RESPONSE) { - process_Msg3(eNB,i,harq_pid); + process_Msg3(eNB,proc,i,harq_pid); } } @@ -2772,7 +2763,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl start_meas(&eNB->ulsch_demodulation_stats); if (abstraction_flag==0) { - rx_ulsch(eNB, + rx_ulsch(eNB,proc, eNB->UE_stats[i].sector, // this is the effective sector id i, eNB->ulsch, @@ -2781,7 +2772,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl #ifdef PHY_ABSTRACTION else { - rx_ulsch_emul(eNB, + rx_ulsch_emul(eNB,proc, subframe, eNB->UE_stats[i].sector, // this is the effective sector id i); @@ -2794,7 +2785,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl start_meas(&eNB->ulsch_decoding_stats); if (abstraction_flag == 0) { - ret = ulsch_decoding(eNB, + ret = ulsch_decoding(eNB,proc, i, 0, // control_only_flag eNB->ulsch[i]->harq_processes[harq_pid]->V_UL_DAI, @@ -2803,7 +2794,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl #ifdef PHY_ABSTRACTION else { - ret = ulsch_decoding_emul(eNB, + ret = ulsch_decoding_emul(eNB,proc, i, &rnti); } @@ -3120,7 +3111,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl i); #endif process_HARQ_feedback(i, - eNB, + eNB,proc, 1, // pusch_flag 0, 0, @@ -3183,7 +3174,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } // CBA (non-LTE) - cba_procedures(eNB,i,harq_pid,abstraction_flag); + cba_procedures(eNB,proc,i,harq_pid,abstraction_flag); } // loop i=0 ... NUMBER_OF_UE_MAX-1 if (abstraction_flag == 0) { diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index 7a2a747741..b6b223bd6a 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -786,7 +786,7 @@ rrc_get_estimated_ue_distance( const int CC_idP, const uint8_t loc_typeP); -void fill_dci(DCI_PDU *DCI_pdu, PHY_VARS_eNB *phy_vars_eNB); +void fill_dci(DCI_PDU *DCI_pdu, PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc); #endif /** @}*/ diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 9e855696c4..3f8ddd89ef 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -183,26 +183,10 @@ const char* eurecomFunctionsNames[] = { "rt_sleep", "trx_read", "trx_write", - "eNB_thread_tx0", - "eNB_thread_rx0", - "eNB_thread_tx1", - "eNB_thread_rx1", - "eNB_thread_tx2", - "eNB_thread_rx2", - "eNB_thread_tx3", - "eNB_thread_rx3", - "eNB_thread_tx4", - "eNB_thread_rx4", - "eNB_thread_tx5", - "eNB_thread_rx5", - "eNB_thread_tx6", - "eNB_thread_rx6", - "eNB_thread_tx7", - "eNB_thread_rx7", - "eNB_thread_tx8", - "eNB_thread_rx8", - "eNB_thread_tx9", - "eNB_thread_rx9", + "eNB_thread_rxtx0", + "eNB_thread_rxtx1", + "eNB_thread_rx", + "eNB_thread_prach", "ue_thread_tx", "ue_thread_rx", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 192bebd976..11401f17af 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -157,26 +157,10 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP=0, VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX1, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX1, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX2, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX2, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX3, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX3, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX4, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX4, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX5, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX5, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX6, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX6, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX7, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX7, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX8, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX8, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX9, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX9, + VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0, + VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX1, + VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, + VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_PRACH, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 6290953e8b..daeca00f42 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -139,7 +139,7 @@ extern int sync_var; time_stats_t softmodem_stats_mt; // main thread time_stats_t softmodem_stats_hw; // hw acquisition -time_stats_t softmodem_stats_tx_sf; // total tx time +time_stats_t softmodem_stats_rxtx_sf; // total tx time time_stats_t softmodem_stats_rx_sf; // total rx time int32_t **rxdata; int32_t **txdata; @@ -290,16 +290,15 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) } /*! - * \brief The transmit thread of eNB. - * \ref NUM_ENB_THREADS threads of this type are active at the same time. + * \brief The RX UE-specific and TX thread of eNB. * \param param is a \ref eNB_proc_t structure which contains the info what to process. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -static void* eNB_thread_tx( void* param ) +static void* eNB_thread_rxtx( void* param ) { - static int eNB_thread_tx_status; + static int eNB_thread_rxtx_status; - eNB_proc_t *proc = (eNB_proc_t*)param; + eNB_rxtx_proc_t *proc = (eNB_rxtx_proc_t*)param; FILE *tx_time_file = NULL; char tx_time_name[101]; void *txp[PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx]; @@ -309,7 +308,7 @@ static void* eNB_thread_tx( void* param ) tx_time_file = fopen(tx_time_name,"w"); } // set default return value - eNB_thread_tx_status = 0; + eNB_thread_rxtx_status = 0; MSC_START_USE(); @@ -332,10 +331,10 @@ static void* eNB_thread_tx( void* param ) if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - return &eNB_thread_tx_status; + return &eNB_thread_rxtx_status; } - LOG_I( HW, "[SCHED] eNB TX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB RXn-TXnp4 deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); #else //LOW_LATENCY int policy, s, j; @@ -414,31 +413,40 @@ static void* eNB_thread_tx( void* param ) while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX\n"); + if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RXn-TXnp4\n"); exit_fun("nothing to add"); break; } - while (proc->instance_cnt_tx < 0) { + while (proc->instance_cnt_rxtx < 0) { // most of the time the thread is waiting here - // proc->instance_cnt_tx is -1 - pthread_cond_wait( &proc->cond_tx, &proc->mutex_tx ); // this unlocks mutex_tx while waiting and then locks it again + // proc->instance_cnt_rxtx is -1 + pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx ); // this unlocks mutex_rxtx while waiting and then locks it again } - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { + if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX\n"); exit_fun("nothing to add"); break; } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 1 ); - start_meas( &softmodem_stats_tx_sf ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 1 ); + start_meas( &softmodem_stats_rxtx_sf ); if (oai_exit) break; + // UE-specific RX processing for subframe n + if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); + // this is the ue-specific processing for the subframe and can be multi-threaded later + phy_procedures_eNB_uespec_RX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); + } + + // TX processing for subframe n+4 if (((PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.frame_type == TDD) && ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->frame_parms,proc->subframe_tx) == SF_DL) || (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->frame_parms,proc->subframe_tx) == SF_S))) || @@ -470,7 +478,7 @@ static void* eNB_thread_tx( void* param ) if (oai_exit) break; if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { - phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL ); + phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay, NULL ); /* we're done, let the next one proceed */ if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { @@ -531,42 +539,42 @@ static void* eNB_thread_tx( void* param ) } - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { + if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc\n"); exit_fun("nothing to add"); break; } - proc->instance_cnt_tx--; + proc->instance_cnt_rxtx--; - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { + if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc\n"); exit_fun("nothing to add"); break; } - stop_meas( &softmodem_stats_tx_sf ); + stop_meas( &softmodem_stats_rxtx_sf ); #ifdef LOWLATENCY if (opp_enabled){ - if(softmodem_stats_tx_sf.diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); + if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); } } #endif - print_meas_now(&softmodem_stats_tx_sf,"eNB_TX_SF",tx_time_file); + print_meas_now(&softmodem_stats_rxtx_sf,"eNB_TX_SF",tx_time_file); } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); #ifdef DEBUG_THREADS printf( "Exiting eNB thread TX\n"); #endif - eNB_thread_tx_status = 0; - return &eNB_thread_tx_status; + eNB_thread_rxtx_status = 0; + return &eNB_thread_rxtx_status; } #if defined(ENABLE_ITTI) @@ -592,12 +600,11 @@ static void wait_system_ready (char *message, volatile int *start_flag) #endif /*! - * \brief The receive thread of eNB. - * \ref NUM_ENB_THREADS threads of this type are active at the same time. + * \brief The RX common thread of eNB. * \param param is a \ref eNB_proc_t structure which contains the info what to process. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -static void* eNB_thread_rx( void* param ) +static void* eNB_thread_rx_common( void* param ) { static int eNB_thread_rx_status; @@ -721,7 +728,7 @@ static void* eNB_thread_rx( void* param ) // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads - printf( "waiting for sync (eNB_thread_rx)\n"); + printf( "waiting for sync (eNB_thread_rx_common)\n"); pthread_mutex_lock( &sync_mutex ); while (sync_var<0) @@ -739,7 +746,7 @@ static void* eNB_thread_rx( void* param ) while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); start_meas( &softmodem_stats_rx_sf ); @@ -753,67 +760,63 @@ static void* eNB_thread_rx( void* param ) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); - if (eNB->node_function != NGFI_RRU_IF4) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); - // this is the ue-specific processing for the subframe and can be multi-threaded later - phy_procedures_eNB_uespec_RX(eNB, 0, no_relay ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); - } } + // choose even or odd thread for RXn-TXnp4 processing + eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[proc->subframe_rx&1]; + // wake up TX for subframe n+4 // lock the TX mutex and make sure the thread is ready - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx ); - exit_fun( "error locking mutex_tx" ); + if (pthread_mutex_lock(&proc_rxtx->mutex_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc_rxtx->instance_cnt_rxtx ); + exit_fun( "error locking mutex_rxtx" ); break; } - int cnt_tx = ++proc->instance_cnt_tx; + int cnt_rxtx = ++proc_rxtx->instance_cnt_rxtx; // We have just received and processed the common part of a subframe, say n. // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired // transmitted timestamp of the next TX slot (first). - // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, + // The last (TS_rx mod samples_pexr_frame) was n*samples_per_tti, // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, // and proc->subframe_tx = proc->subframe_rx+3 - proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); - proc->frame_tx = (proc->subframe_rx > 5) ? (proc->frame_rx+1)&1023 : proc->frame_rx; - proc->subframe_tx = (proc->subframe_rx + 4)%10; + proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > 5) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; + proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + 4)%10; - pthread_mutex_unlock( &proc->mutex_tx ); + pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); - if (cnt_tx == 0){ + if (cnt_rxtx == 0){ // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc->cond_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n"); + if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); exit_fun( "ERROR pthread_cond_signal" ); break; } } else { - LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", proc->frame_tx, cnt_tx ); + LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, cnt_rxtx ); exit_fun( "TX thread busy" ); break; } - stop_meas( &softmodem_stats_rx_sf ); + stop_meas( &softmodem_stats_rxtx_sf ); #ifdef LOWLATENCY if (opp_enabled){ - if(softmodem_stats_rx_sf.diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); + if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); } } #endif // LOWLATENCY print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); } - //stop_meas( &softmodem_stats_rx_sf[proc->thread_index] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 ); - #ifdef DEBUG_THREADS - printf( "Exiting eNB thread RX\n"); + printf( "Exiting eNB thread RXn-TXnp4\n"); #endif eNB_thread_rx_status = 0; @@ -954,8 +957,8 @@ static void* eNB_thread_prach( void* param ) while (proc->instance_cnt_prach < 0) { // most of the time the thread is waiting here - // proc->instance_cnt_tx is -1 - pthread_cond_wait( &proc->cond_prach, &proc->mutex_prach ); // this unlocks mutex_tx while waiting and then locks it again + // proc->instance_cnt_prach is -1 + pthread_cond_wait( &proc->cond_prach, &proc->mutex_prach ); // this unlocks mutex_rxtx while waiting and then locks it again } if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { @@ -1000,13 +1003,14 @@ void init_eNB_proc(void) int CC_id; PHY_VARS_eNB *eNB; eNB_proc_t *proc; + eNB_rxtx_proc_t *proc_rxtx; for (CC_id=0; CC_idproc; - + proc_rxtx = proc->proc_rxtx; #ifndef LOWLATENCY /* pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] ); @@ -1018,9 +1022,12 @@ void init_eNB_proc(void) perror("[ENB_PROC_RX] setting thread stack size failed\n"); */ // set the kernel scheduling policy and priority - proc->sched_param_tx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_tx, &proc->sched_param_tx); - pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO); + proc_rxtx[0].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc_rxtx[0].attr_rxtx, &proc_rxtx[0].sched_param_rxtx); + pthread_attr_setschedpolicy (&proc_rxtx[0].attr_rxtx, SCHED_FIFO); + proc_rxtx[1].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc_rxtx[1].attr_rxtx, &proc_rxtx[1].sched_param_rxtx); + pthread_attr_setschedpolicy (&proc_rxtx[1].attr_rxtx, SCHED_FIFO); proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; pthread_attr_setschedparam (&proc->attr_rx, &proc->sched_param_rx); @@ -1032,27 +1039,35 @@ void init_eNB_proc(void) printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); #endif - proc->instance_cnt_tx = -1; + proc_rxtx[0].instance_cnt_rxtx = -1; + proc_rxtx[1].instance_cnt_rxtx = -1; proc->instance_cnt_prach = -1; proc->CC_id = CC_id; proc->first_rx=1; - pthread_mutex_init( &proc->mutex_tx, NULL); - pthread_cond_init( &proc->cond_tx, NULL); + pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); + pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); + pthread_mutex_init( &proc->mutex_prach, NULL); + pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); + pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); pthread_cond_init( &proc->cond_prach, NULL); #ifndef LOWLATENCY - pthread_create( &proc->pthread_tx, &proc->attr_tx, eNB_thread_tx, &eNB->proc ); - pthread_create( &proc->pthread_rx, &proc->attr_rx, eNB_thread_rx, &eNB->proc ); + pthread_create( &proc_rxtx[0].pthread_rxtx, &proc_rxtx[0].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, &proc_rxtx[1].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[1] ); + pthread_create( &proc->pthread_rx, &proc->attr_rx, eNB_thread_rx_common, &eNB->proc ); pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); #else - pthread_create( &proc->pthread_tx, NULL, eNB_thread_tx, &eNB->proc ); - pthread_create( &proc->pthread_rx, NULL, eNB_thread_rx, &eNB->proc ); + pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); + pthread_create( &proc->pthread_rx, NULL, eNB_thread_rx_common, &eNB->proc ); pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); #endif char name[16]; - snprintf( name, sizeof(name), "TX %d", i ); - pthread_setname_np( proc->pthread_tx, name ); + snprintf( name, sizeof(name), "RXTX0 %d", i ); + pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); + snprintf( name, sizeof(name), "RXTX1 %d", i ); + pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); snprintf( name, sizeof(name), "RX %d", i ); pthread_setname_np( proc->pthread_rx, name ); } @@ -1073,46 +1088,57 @@ void kill_eNB_proc(void) int *status; PHY_VARS_eNB *eNB; eNB_proc_t *proc; + eNB_rxtx_proc_t *proc_rxtx; for (int CC_id=0; CC_idproc; + proc_rxtx = &proc->proc_rxtx[0]; #ifdef DEBUG_THREADS printf( "Killing TX CC_id %d thread %d\n", CC_id, i ); #endif - proc->instance_cnt_tx = 0; // FIXME data race! - pthread_cond_signal( &proc->cond_tx ); + proc_rxtx[0].instance_cnt_rxtx = 0; // FIXME data race! + proc_rxtx[1].instance_cnt_rxtx = 0; // FIXME data race! + pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); + pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); #ifdef DEBUG_THREADS - printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i ); + printf( "Joining eNB TX CC_id %d thread\n", CC_id); #endif - int result = pthread_join( proc->pthread_tx, (void**)&status ); + int result,i; + for (i=0;i<1;i++) { + pthread_join( proc_rxtx[i].pthread_rxtx, (void**)&status ); #ifdef DEBUG_THREADS - if (result != 0) { - printf( "Error joining thread.\n" ); - } else { - if (status) { - printf( "status %d\n", *status ); + if (result != 0) { + printf( "Error joining thread.\n" ); } else { - printf( "The thread was killed. No status available.\n" ); + if (status) { + printf( "status %d\n", *status ); + } else { + printf( "The thread was killed. No status available.\n" ); + } } - } #else - UNUSED(result) + UNUSED(result); #endif - + + pthread_mutex_destroy( &proc_rxtx[i].mutex_rxtx ); + pthread_cond_destroy( &proc_rxtx[i].cond_rxtx ); + + + } #ifdef DEBUG_THREADS - printf( "Killing RX CC_id %d thread %d\n", CC_id, i ); + printf( "Killing RX CC_id %d thread\n", CC_id); #endif #ifdef DEBUG_THREADS - printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i ); + printf( "Joining eNB RX CC_id %d thread ...\n", CC_id); #endif result = pthread_join( proc->pthread_rx, (void**)&status ); @@ -1131,9 +1157,9 @@ void kill_eNB_proc(void) #else UNUSED(result); #endif - - pthread_mutex_destroy( &proc->mutex_tx ); - pthread_cond_destroy( &proc->cond_tx ); + + pthread_mutex_destroy( &proc->mutex_prach ); + pthread_cond_destroy( &proc->cond_prach ); } } @@ -1262,7 +1288,7 @@ void reset_opp_meas(void) { reset_meas(&softmodem_stats_hw); for (sfn=0; sfn < 10; sfn++) { - reset_meas(&softmodem_stats_tx_sf); + reset_meas(&softmodem_stats_rxtx_sf); reset_meas(&softmodem_stats_rx_sf); } } @@ -1274,7 +1300,7 @@ void print_opp_meas(void) { print_meas(&softmodem_stats_hw, "HW Acquisation", NULL, NULL); for (sfn=0; sfn < 10; sfn++) { - print_meas(&softmodem_stats_tx_sf,"[eNB][total_phy_proc_tx]",NULL, NULL); + print_meas(&softmodem_stats_rxtx_sf,"[eNB][total_phy_proc_rxtx]",NULL, NULL); print_meas(&softmodem_stats_rx_sf,"[eNB][total_phy_proc_rx]",NULL,NULL); } } From bba649ac9103fd064f14db40e7260f9621854fd5 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 3 Jun 2016 09:54:49 +0200 Subject: [PATCH 034/340] removal of slot_fep_ul in phy_procedures_rx_uespec --- openair1/SCHED/phy_procedures_lte_eNb.c | 35 +++---------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index cfcec35460..969970d917 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1954,7 +1954,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits eNB->UE_stats[(uint32_t)UE_id].sector = 0; - LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", + LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, frame, @@ -2647,30 +2647,6 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl - if (abstraction_flag == 0) { - start_meas(&eNB->ofdm_demod_stats); - - for (l=0; lsymbols_per_tti/2; l++) { - - slot_fep_ul(fp, - &eNB->common_vars, - l, - subframe<<1, - 0, - 0 - ); - slot_fep_ul(fp, - &eNB->common_vars, - l, - (subframe<<1)+1, - 0, - 0 - ); - } - - stop_meas(&eNB->ofdm_demod_stats); - } - // Check for active processes in current subframe harq_pid = subframe2harq_pid(fp, frame,subframe); @@ -2705,18 +2681,14 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl (eNB->ulsch[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { // UE is has ULSCH scheduling round = eNB->ulsch[i]->harq_processes[harq_pid]->round; - + for (int rb=0; rb<=eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb; rb++) { int rb2 = rb+eNB->ulsch[i]->harq_processes[harq_pid]->first_rb; eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); } -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n", - eNB->Mod_id,harq_pid, - frame,subframe,eNB->ulsch[i]->rnti,i); -#endif + if (eNB->ulsch[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", @@ -2726,6 +2698,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl eNB->UE_stats[i].sector); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,1); } else { + LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n", eNB->Mod_id, frame, From d420f75f3db8aea868aa411564d106b84c88532e Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 3 Jun 2016 14:01:34 +0200 Subject: [PATCH 035/340] nothing special --- openair1/SCHED/phy_procedures_lte_eNb.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index cfcec35460..cc4dc07283 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2570,6 +2570,9 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl //recv_IF4(eNB,subframe<<1); //recv_IF4(eNB,1+(subframe<<1)); + // Tobi aka mr monaco: ETH + + } else { // should not get here AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); From a396fdc5b09892f9e53be6050bc7976e2fefc188 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 3 Jun 2016 14:04:01 +0200 Subject: [PATCH 036/340] moving if4tools.c --- openair1/PHY/{TOOLS => LTE_TRANSPORT}/if4tools.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename openair1/PHY/{TOOLS => LTE_TRANSPORT}/if4tools.c (100%) diff --git a/openair1/PHY/TOOLS/if4tools.c b/openair1/PHY/LTE_TRANSPORT/if4tools.c similarity index 100% rename from openair1/PHY/TOOLS/if4tools.c rename to openair1/PHY/LTE_TRANSPORT/if4tools.c From 448b26f62562a931eba6aa06a37a40324948560e Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 3 Jun 2016 15:39:36 +0200 Subject: [PATCH 037/340] added draft of IF4 packet frame structure --- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 135 +++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 openair1/PHY/LTE_TRANSPORT/if4_tools.h diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h new file mode 100644 index 0000000000..977e5f36c5 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -0,0 +1,135 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/*! \file PHY/LTE_TRANSPORT/if4_tools.h +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +#include + +/// IF4 Frame Status (32 bits) +struct IF4_frame_status { + /// Antenna Numbers + uint32_t ant_num:3; + /// Antenna Start + uint32_t ant_start:3; + /// Radio Frame Number + uint32_t rf_num:16; + /// Sub-frame Number + uint32_t sf_num:4; + /// Symbol Number + uint32_t sym_num:4; + /// Reserved + uint32_t rsvd:2; +}; + +/// IF4 PRACH Configuration (32 bits) +struct IF4_lte_prach_conf { + /// Reserved + uint32_t rsvd:3; + /// Antenna Indication + uint32_t ant:3; + /// Radio Frame Number + uint32_t rf_num:16; + /// Sub-frame Number + uint32_t sf_num:4; + /// FFT Exponent Output + uint32_t exponent:6; +}; + +/// IF4 Antenna Gain +struct IF4_gain { + /// Reserved + uint32_t rsvd:10; + /// FFT Exponent Output + uint32_t exponent:6; +}; + +struct IF4_dl_packet { + /// Destination Address + + /// Source Address + + /// Type + + /// Sub-Type + + /// Reserved + + /// Frame Status + + /// Data Blocks + + /// Frame Check Sequence + +}; + +struct IF4_ul_packet { + /// Destination Address + + /// Source Address + + /// Type + + /// Sub-Type + + /// Reserved + + /// Frame Status + + /// Gain 0 + /// Gain 1 + /// Gain 2 + /// Gain 3 + /// Gain 4 + /// Gain 5 + /// Gain 6 + /// Gain 7 + + /// Data Blocks + + /// Frame Check Sequence + uint32_t fcs; +}; + +struct IF4_prach_packet { + + +}; + +void send_IF4(PHY_VARS_eNB *eNB, int subframe); + +void recv_IF4(PHY_VARS_eNB *eNB, int subframe); From 7b3fe853584067d5bcae80752271a17466f83675 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 3 Jun 2016 16:23:22 +0200 Subject: [PATCH 038/340] fixed file name, updated the IF4 frame structure, added dummy functions for frame generation --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 114 +++++++++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/if4_tools.h | 65 +++++++++----- openair1/PHY/LTE_TRANSPORT/if4tools.c | 47 ---------- 3 files changed, 160 insertions(+), 66 deletions(-) create mode 100644 openair1/PHY/LTE_TRANSPORT/if4_tools.c delete mode 100644 openair1/PHY/LTE_TRANSPORT/if4tools.c diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c new file mode 100644 index 0000000000..a3e6d75ac8 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -0,0 +1,114 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/*! \file PHY/LTE_TRANSPORT/if4_tools.c +* \brief +* \author Mauricio Gunther, Raymond Knopp, S. Sandeep Kumar +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: knopp@eurecom.fr, ee13b1025@iith.ac.in +* \note +* \warning +*/ + +#include "PHY/LTE_TRANSPORT/if4_tools.h" + +/* +typedef struct data_block_type { + +} data_block; +*/ + +/* +void allocate_data_block(long *data_block ,int length){ + data_block = malloc(length*sizeof(long)); +} +*/ + +void send_IF4(PHY_VARS_eNB *eNB, int subframe){ + eNB_proc_t *proc = &eNB->proc; + //int frame=proc->frame_tx; + //int subframe=proc->subframe_tx; + + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int i,j; + + float *data_block = malloc(length*sizeof(long)); + + + // find number of consecutive non zero in values in symbol + // NrOfNonZeroValues + + // how many values does the atan function output? + + for(i = 0; i <= fp->symbols_per_tti; i++){ + for(j = 0; j < NrOfNonZeroValues; j=j+2){ + + symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] + + data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); + data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); + // use memset? + } + + } + +/* +memset(&eNB->common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], + 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); + } + */ + +} + +void recv_IF4( ) { + +} + +IF4_dl_packet gen_IF4_dl_packet( ) { + + IF4_dl_packet dl_packet; + + return dl_packet; +} + +IF4_ul_packet gen_IF4_ul_packet( ) { + + IF4_ul_packet ul_packet; + + return ul_packet; +} + +IF4_prach_packet gen_IF4_prach_packet( ) { + + IF4_prach_packet prach_packet; + + return prach_packet; +} diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 977e5f36c5..363dbf444d 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -56,7 +56,15 @@ struct IF4_frame_status { uint32_t rsvd:2; }; -/// IF4 PRACH Configuration (32 bits) +/// IF4 Antenna Gain +struct IF4_gain { + /// Reserved + uint32_t rsvd:10; + /// FFT Exponent Output + uint32_t exponent:6; +}; + +/// IF4 LTE PRACH Configuration (32 bits) struct IF4_lte_prach_conf { /// Reserved uint32_t rsvd:3; @@ -69,14 +77,6 @@ struct IF4_lte_prach_conf { /// FFT Exponent Output uint32_t exponent:6; }; - -/// IF4 Antenna Gain -struct IF4_gain { - /// Reserved - uint32_t rsvd:10; - /// FFT Exponent Output - uint32_t exponent:6; -}; struct IF4_dl_packet { /// Destination Address @@ -84,17 +84,17 @@ struct IF4_dl_packet { /// Source Address /// Type - + uint16_t type; /// Sub-Type - + uint16_t sub_type; /// Reserved - + uint32_t rsvd; /// Frame Status - + IF4_frame_status frame_status; /// Data Blocks /// Frame Check Sequence - + uint32_t fcs; }; struct IF4_ul_packet { @@ -103,22 +103,29 @@ struct IF4_ul_packet { /// Source Address /// Type - + uint16_t type; /// Sub-Type - + uint16_t sub_type; /// Reserved - + uint32_t rsvd; /// Frame Status - + IF4_frame_status frame_status; /// Gain 0 + IF4_gain gain0; /// Gain 1 + IF4_gain gain1; /// Gain 2 + IF4_gain gain2; /// Gain 3 + IF4_gain gain3; /// Gain 4 + IF4_gain gain4; /// Gain 5 + IF4_gain gain5; /// Gain 6 + IF4_gain gain6; /// Gain 7 - + IF4_gain gain7; /// Data Blocks /// Frame Check Sequence @@ -126,10 +133,30 @@ struct IF4_ul_packet { }; struct IF4_prach_packet { + /// Destination Address + /// Source Address + /// Type + uint16_t type; + /// Sub-Type + uint16_t sub_type; + /// Reserved + uint32_t rsvd; + /// LTE Prach Configuration + IF4_lte_prach_conf prach_conf; + /// Prach Data Block (one antenna) + + /// Frame Check Sequence + uint32_t fcs; }; +IF4_dl_packet gen_IF4_dl_packet(); + +IF4_ul_packet gen_IF4_ul_packet(); + +IF4_prach_packet gen_IF4_prach_packet(); + void send_IF4(PHY_VARS_eNB *eNB, int subframe); void recv_IF4(PHY_VARS_eNB *eNB, int subframe); diff --git a/openair1/PHY/LTE_TRANSPORT/if4tools.c b/openair1/PHY/LTE_TRANSPORT/if4tools.c deleted file mode 100644 index 70e598e2a1..0000000000 --- a/openair1/PHY/LTE_TRANSPORT/if4tools.c +++ /dev/null @@ -1,47 +0,0 @@ -/* -typedef struct data_block_type { - -} data_block; -*/ - -/* -void allocate_data_block(long *data_block ,int length){ - data_block = malloc(length*sizeof(long)); -} -*/ - -void send_IF4(PHY_VARS_eNB eNB, int subframe){ - eNB_proc_t *proc = &eNB->proc; - //int frame=proc->frame_tx; - //int subframe=proc->subframe_tx; - - LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - int i,j; - - float *data_block = malloc(length*sizeof(long)); - - - // find number of consecutive non zero in values in symbol - // NrOfNonZeroValues - - // how many values does the atan function output? - - for(i = 0; i <= fp->symbols_per_tti; i++){ - for(j = 0; j < NrOfNonZeroValues; j=j+2){ - - symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] - - data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); - data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); - // use memset? - } - - } - -/* -memset(&eNB->common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], - 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); - } - */ - -} From ad1114c7f75b677b99a51e88e902df5352e7bc38 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 3 Jun 2016 17:54:32 +0200 Subject: [PATCH 039/340] added more structural changes --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 156 ++++++++++++++++++------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 4 +- 2 files changed, 117 insertions(+), 43 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index a3e6d75ac8..669b7a6739 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -29,28 +29,19 @@ /*! \file PHY/LTE_TRANSPORT/if4_tools.c * \brief -* \author Mauricio Gunther, Raymond Knopp, S. Sandeep Kumar +* \author Mauricio Gunther, S. Sandeep Kumar, Raymond Knopp * \date 2016 * \version 0.1 * \company Eurecom -* \email: knopp@eurecom.fr, ee13b1025@iith.ac.in +* \email: knopp@eurecom.fr * \note * \warning */ #include "PHY/LTE_TRANSPORT/if4_tools.h" -/* -typedef struct data_block_type { - -} data_block; -*/ +// Define how data blocks are stored and transferred -/* -void allocate_data_block(long *data_block ,int length){ - data_block = malloc(length*sizeof(long)); -} -*/ void send_IF4(PHY_VARS_eNB *eNB, int subframe){ eNB_proc_t *proc = &eNB->proc; @@ -58,57 +49,138 @@ void send_IF4(PHY_VARS_eNB *eNB, int subframe){ //int subframe=proc->subframe_tx; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - int i,j; + uint32_t i,j; float *data_block = malloc(length*sizeof(long)); + // Generate IF4 packet (for now DL) with frame status information + dl_packet = gen_IF4_dl_packet( /* ADD INFO and data_block pointer */ ); - // find number of consecutive non zero in values in symbol - // NrOfNonZeroValues - - // how many values does the atan function output? - - for(i = 0; i <= fp->symbols_per_tti; i++){ - for(j = 0; j < NrOfNonZeroValues; j=j+2){ - - symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] - - data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); - data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); - // use memset? - } - - } - -/* -memset(&eNB->common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], - 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); - } - */ + for(i=0; isymbols_per_tti; i++) { + // Do compression of the two parts and generate data blocks + + symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] + data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); + data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); + + // Set data blocks and update subframe no./other information to generated packet + + + // Write the packet(s) to the fronthaul + + } + } -void recv_IF4( ) { +void recv_IF4( /* ADD INFO and data_block pointer */ ) { + + // Read packet(s) from the fronthaul + + // Apply reverse processing - decompression + + // Generate and return the OFDM symbols (txdataF) } -IF4_dl_packet gen_IF4_dl_packet( ) { - +IF4_dl_packet gen_IF4_dl_packet( /* ADD INFO and data_block pointer */ ) { IF4_dl_packet dl_packet; + // Set destination and source address + + // Set Type and Sub-Type + dl_packet.type = ; //08_0A ? + dl_packet.sub_type = 0x0020; + + // Leave reserved as it is + //dl_packet.rsvd = ; + + // Set frame status + dl_packet.frame_status.ant_num = ; + dl_packet.frame_status.ant_start = ; + dl_packet.frame_status.rf_num = ; + dl_packet.frame_status.sf_num = ; + dl_packet.frame_status.sym_num = ; + //dl_packet.frame_status.rsvd = ; + + // Set data blocks if sent + if (data_block != NULL) { + + } else { + + } + + // Set frame check sequence + dl_packet.fcs = ; + return dl_packet; } -IF4_ul_packet gen_IF4_ul_packet( ) { - +IF4_ul_packet gen_IF4_ul_packet( /* ADD INFO and data_block pointer */ ) { IF4_ul_packet ul_packet; + + // Set destination and source address + + // Set Type and Sub-Type + ul_packet.type = ; //08_0A ? + ul_packet.sub_type = 0x0019; + + // Leave reserved as it is + //ul_packet.rsvd = ; + + // Set frame status + ul_packet.frame_status.ant_num = ; + ul_packet.frame_status.ant_start = ; + ul_packet.frame_status.rf_num = ; + ul_packet.frame_status.sf_num = ; + ul_packet.frame_status.sym_num = ; + //ul_packet.frame_status.rsvd = ; + + // Set antenna specific gain + ul_packet.gain0.exponent = ; + //ul_packet.gain0.rsvd = ; + + // Set data blocks if sent + if (data_block != NULL) { + + } else { + + } + + // Set frame check sequence + ul_packet.fcs = ; return ul_packet; } -IF4_prach_packet gen_IF4_prach_packet( ) { - +IF4_prach_packet gen_IF4_prach_packet( /* ADD INFO and data_block pointer */ ) { IF4_prach_packet prach_packet; + + // Set destination and source address + + // Set Type and Sub-Type + prach_packet.type = ; //08_0A ? + prach_packet.sub_type = 0x0021; + + // Leave reserved as it is + //prach_packet.rsvd = ; + + // Set LTE Prach configuration + //prach_packet.prach_conf.rsvd = ; + prach_packet.prach_conf.ant = ; + prach_packet.prach_conf.rf_num = ; + prach_packet.prach_conf.sf_num = ; + prach_packet.prach_conf.exponent = ; + + // Set data blocks if sent + if (data_block != NULL) { + + } else { + + } + + // Set frame check sequence + prach_packet.fcs = ; return prach_packet; } diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 363dbf444d..3b25e82c6a 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -56,7 +56,7 @@ struct IF4_frame_status { uint32_t rsvd:2; }; -/// IF4 Antenna Gain +/// IF4 Antenna Gain (16 bits) struct IF4_gain { /// Reserved uint32_t rsvd:10; @@ -151,6 +151,8 @@ struct IF4_prach_packet { uint32_t fcs; }; +// Needs to be checked + IF4_dl_packet gen_IF4_dl_packet(); IF4_ul_packet gen_IF4_ul_packet(); From eea7764acefca644d17b76d8c1d871f882e81689 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 3 Jun 2016 22:57:16 -0700 Subject: [PATCH 040/340] updated oai_L1_L2_procedures.pdf --- targets/DOCS/oai_L1_L2_procedures.pdf | Bin 1652669 -> 269265 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/targets/DOCS/oai_L1_L2_procedures.pdf b/targets/DOCS/oai_L1_L2_procedures.pdf index 0f47195db1c70b27f17b907a3b95174d45e4f292..89ec48595691438ecf418ab54e78041267f880e3 100755 GIT binary patch delta 138261 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%0DhsqMyeWgdBEL54Xx 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 z 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%0DlJl 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 Date: Tue, 7 Jun 2016 15:43:43 +0200 Subject: [PATCH 041/340] * update the mapping of qci to DRB --- openair2/RRC/LITE/L2_interface.c | 4 +- openair2/RRC/LITE/rrc_eNB.c | 111 +++++++++++++++++++----------- openair2/RRC/LITE/rrc_eNB_S1AP.c | 2 +- openair3/S1AP/s1ap_eNB_decoder.c | 3 +- openair3/S1AP/s1ap_eNB_handlers.c | 6 +- 5 files changed, 81 insertions(+), 45 deletions(-) diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index e379c61723..4275f7dfc8 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -598,13 +598,13 @@ rrc_data_ind( if (ctxt_pP->enb_flag == ENB_FLAG_NO) { LOG_N(RRC, "[UE %x] Frame %d: received a DCCH %d message on SRB %d with Size %d from eNB %d\n", - ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id-1,sdu_sizeP, ctxt_pP->eNB_index); + ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id,sdu_sizeP, ctxt_pP->eNB_index); } else { LOG_N(RRC, "[eNB %d] Frame %d: received a DCCH %d message on SRB %d with Size %d from UE %x\n", ctxt_pP->module_id, ctxt_pP->frame, DCCH_index, - Srb_id-1, + Srb_id, sdu_sizeP, ctxt_pP->rnti); } diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 5247cf8f9e..a0487a53ea 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1128,6 +1128,8 @@ rrc_eNB_generate_RRCConnectionRelease( PDCP_TRANSMISSION_MODE_CONTROL); } +uint8_t qci_to_priority[9]={2,4,3,5,1,6,7,8,9}; + // TBD: this directive can be remived if we create a similar e_rab_param_t structure in RRC context #if defined(ENABLE_ITTI) //----------------------------------------------------------------------------- @@ -1158,9 +1160,11 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; DedicatedInfoNAS_t *dedicatedInfoNas = NULL; + /* for no gcc warnings */ + (void)dedicatedInfoNas; - long *logicalchannelgroup, *logicalchannelgroup_drb; - int drb_identity_index=0;//, nas_sequence_flag = 0; + long *logicalchannelgroup_drb; + int drb_identity_index=0; uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, DRB_configList2=&ue_context_pP->ue_context.DRB_configList2[xid]; @@ -1168,7 +1172,8 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co free(*DRB_configList2); } //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); - *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2)); + *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2)); + /* Initialize NAS list */ dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); int e_rab_done=0; @@ -1187,7 +1192,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long)); // allowed value 5..15, value : x+4 - *(DRB_config->eps_BearerIdentity) = ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 4; + *(DRB_config->eps_BearerIdentity) = ue_context_pP->ue_context.e_rab[i].param.e_rab_id;//+ 4; // especial case generation DRB_config->drb_Identity = 1 + drb_identity_index + e_rab_done;// + i ;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; // 1 + drb_identiy_index; @@ -1205,12 +1210,18 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_pdcp_config->rlc_AM = NULL; DRB_pdcp_config->rlc_UM = NULL; + switch (ue_context_pP->ue_context.e_rab[i].param.qos.qci){ - case 1: // RLC _UM - case 2: - case 3: - case 4: - case 5: + /* + * type: realtime data with medium packer error rate + * action: swtich to RLC UM + */ + case 1: // 100ms, 10^-2, p2, GBR + case 2: // 150ms, 10^-3, p4, GBR + case 3: // 50ms, 10^-3, p3, GBR + case 7: // 100ms, 10^-3, p7, GBR + case 65: // 75ms, 10^-2, p0.7, mission critical voice, GBR + case 66: // 100ms, 10^-2, p2, non-mission critical voice , GBR // RLC DRB_rlc_config->present = RLC_Config_PR_um_Bi_Directional; DRB_rlc_config->choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = SN_FieldLength_size10; @@ -1221,11 +1232,18 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; PDCP_rlc_UM->pdcp_SN_Size = PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits; break; - case 6: - case 7: - case 8: - case 9: - default: + + /* + * type: non-realtime data with low packer error rate + * action: swtich to RLC AM + */ + case 4: // 300ms, 10^-6, p5 + case 5: // 100ms, 10^-6, p1 , IMS signaling + case 6: // 300ms, 10^-6, p6 + case 8: // 300ms, 10^-6, p8 + case 9: // 300ms, 10^-6, p9 + case 69: // 60ms, 10^-6, p0.5, mission critical delay sensitive data, Lowest Priority + case 70: // 200ms, 10^-6, p5.5, mision critical data // RLC DRB_rlc_config->present = RLC_Config_PR_am; DRB_rlc_config->choice.am.ul_AM_RLC.t_PollRetransmit = T_PollRetransmit_ms50; @@ -1240,8 +1258,12 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; PDCP_rlc_AM->statusReportRequired = FALSE; - //LOG_I(RRC,"not supported qci %d\n", ue_context_pP->ue_context.e_rab[i].param.qos.qci); - break; + break; + default : + LOG_E(RRC,"not supported qci %d\n", ue_context_pP->ue_context.e_rab[i].param.qos.qci); + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_FAILED; + ue_context_pP->ue_context.e_rab[i].xid = xid; + continue; } DRB_pdcp_config->headerCompression.present = PDCP_Config__headerCompression_PR_notUsed; @@ -1251,10 +1273,14 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters)); DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters; - DRB_ul_SpecificParameters->priority = ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level; - // TO DO - DRB_ul_SpecificParameters->prioritisedBitRate = - LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; + if (ue_context_pP->ue_context.e_rab[i].param.qos.qci < 10 ) + DRB_ul_SpecificParameters->priority = qci_to_priority[ue_context_pP->ue_context.e_rab[i].param.qos.qci-1] + 3; + // ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level; + else + DRB_ul_SpecificParameters->priority= 4; + + DRB_ul_SpecificParameters->prioritisedBitRate = LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8; + //LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; DRB_ul_SpecificParameters->bucketSizeDuration = LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; @@ -1275,7 +1301,10 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co *DRB_ul_SpecificParameters->logicalChannelGroup ); - //if (nas_sequence_flag == 0) + e_rab_done++; + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; + ue_context_pP->ue_context.e_rab[i].xid = xid; + { if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); @@ -1284,29 +1313,32 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); - // nas_sequence_flag = 1; + LOG_I(RRC,"add NAS info with size %d (rab id %d)\n",ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length, i); } + else { + LOG_W(RRC,"Not received activate dedicated EPS bearer context request\n"); + } /* TODO parameters yet to process ... */ { // ue_context_pP->ue_context.e_rab[i].param.qos; // ue_context_pP->ue_context.e_rab[i].param.sgw_addr; // ue_context_pP->ue_context.e_rab[i].param.gtp_teid; } - - /* If list is empty free the list and reset the address */ - if (dedicatedInfoNASList != NULL) { - if (dedicatedInfoNASList->list.count == 0) { - free(dedicatedInfoNASList); - dedicatedInfoNASList = NULL; - } - } } - e_rab_done++; - ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; - ue_context_pP->ue_context.e_rab[i].xid = xid; } - + + /* If list is empty free the list and reset the address */ + if (dedicatedInfoNASList != NULL) { + if (dedicatedInfoNASList->list.count == 0) { + free(dedicatedInfoNASList); + dedicatedInfoNASList = NULL; + LOG_W(RRC,"dedlicated NAS list is empty, free the list and reset the address\n"); + } + } else { + LOG_W(RRC,"dedlicated NAS list is empty\n"); + } + memset(buffer, 0, RRC_BUF_SIZE); size = do_RRCConnectionReconfiguration(ctxt_pP, @@ -1323,6 +1355,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co , (SCellToAddMod_r10_t*)NULL #endif ); + #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); @@ -1346,7 +1379,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co #endif LOG_I(RRC, - "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration (bytes %d, UE id %x)\n", + "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration (bytes %d, UE RNTI %x)\n", ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti); LOG_D(RRC, @@ -1496,7 +1529,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons SRB2_ul_SpecificParameters = CALLOC(1, sizeof(*SRB2_ul_SpecificParameters)); - SRB2_ul_SpecificParameters->priority = 1; + SRB2_ul_SpecificParameters->priority = 3; // let some priority for SRB1 and dedicated DRBs SRB2_ul_SpecificParameters->prioritisedBitRate = LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; SRB2_ul_SpecificParameters->bucketSizeDuration = @@ -1591,9 +1624,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters)); DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters; - DRB_ul_SpecificParameters->priority = 2; // lower priority than srb1, srb2 - DRB_ul_SpecificParameters->prioritisedBitRate = - LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; + DRB_ul_SpecificParameters->priority = 12; // lower priority than srb1, srb2 and other dedicated bearer + DRB_ul_SpecificParameters->prioritisedBitRate =LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8 ; + //LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; DRB_ul_SpecificParameters->bucketSizeDuration = LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 34ea4a4a4b..77554c98b8 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -28,7 +28,7 @@ *******************************************************************************/ /*! \file rrc_eNB_S1AP.c * \brief rrc S1AP procedures for eNB - * \author Laurent Winckel, Sebastien ROUX, Navid Nikaein and Lionel GAUTHIER + * \author Navid Nikaein, Laurent Winckel, Sebastien ROUX, and Lionel GAUTHIER * \date 2013-2016 * \version 1.0 * \company Eurecom diff --git a/openair3/S1AP/s1ap_eNB_decoder.c b/openair3/S1AP/s1ap_eNB_decoder.c index cb1de2e6e9..d60e19f352 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.c +++ b/openair3/S1AP/s1ap_eNB_decoder.c @@ -142,7 +142,8 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message, //s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); S1AP_INFO("TODO E_RABRelease nitiating message\n"); free(message_string); - + break; + default: S1AP_ERROR("Unknown procedure ID (%d) for initiating message\n", (int)initiating_p->procedureCode); diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index cf7b6aacdb..f99c5128bd 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.c +++ b/openair3/S1AP/s1ap_eNB_handlers.c @@ -770,7 +770,8 @@ int s1ap_eNB_handle_initial_context_request(uint32_t assoc_id, malloc(sizeof(uint8_t) * item_p->nAS_PDU->size); memcpy(S1AP_INITIAL_CONTEXT_SETUP_REQ(message_p).e_rab_param[i].nas_pdu.buffer, - item_p->nAS_PDU->buf, item_p->nAS_PDU->size); + item_p->nAS_PDU->buf, item_p->nAS_PDU->size); + S1AP_DEBUG("Received NAS message with the E_RAB setup procedure\n"); } else { S1AP_INITIAL_CONTEXT_SETUP_REQ(message_p).e_rab_param[i].nas_pdu.length = 0; S1AP_INITIAL_CONTEXT_SETUP_REQ(message_p).e_rab_param[i].nas_pdu.buffer = NULL; @@ -950,7 +951,8 @@ int s1ap_eNB_handle_e_rab_setup_request(uint32_t assoc_id, S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer = malloc(sizeof(uint8_t) * item_p->nAS_PDU.size); memcpy(S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer, - item_p->nAS_PDU.buf, item_p->nAS_PDU.size); + item_p->nAS_PDU.buf, item_p->nAS_PDU.size); + // S1AP_INFO("received a NAS PDU with size %d (%02x.%02x)\n",S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.length, item_p->nAS_PDU.buf[0], item_p->nAS_PDU.buf[1]); } else { S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.length = 0; S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer = NULL; From f101c6634b6218564779c3ce6891924c82ddec68 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 7 Jun 2016 17:17:36 +0200 Subject: [PATCH 042/340] added original ALAW compression --- openair1/PHY/TOOLS/ALAW/companders.c | 125 ++++++++++++ openair1/PHY/TOOLS/ALAW/companders.h | 90 +++++++++ openair1/PHY/TOOLS/ALAW/compandit.c | 128 ++++++++++++ openair1/PHY/TOOLS/ALAW/readme-companders.txt | 185 ++++++++++++++++++ 4 files changed, 528 insertions(+) create mode 100644 openair1/PHY/TOOLS/ALAW/companders.c create mode 100644 openair1/PHY/TOOLS/ALAW/companders.h create mode 100644 openair1/PHY/TOOLS/ALAW/compandit.c create mode 100644 openair1/PHY/TOOLS/ALAW/readme-companders.txt diff --git a/openair1/PHY/TOOLS/ALAW/companders.c b/openair1/PHY/TOOLS/ALAW/companders.c new file mode 100644 index 0000000000..b089716977 --- /dev/null +++ b/openair1/PHY/TOOLS/ALAW/companders.c @@ -0,0 +1,125 @@ +/** + * @companders.c - implementation + * + * @copy Copyright (C) <2012> + * @author M A Chatterjee + * @version 1.01 M. A. Chatterjee, cleaned up naming + * + * This file contains integer math compander functions for analog/audio representations on + * embedded systems. Linear2Alaw derived from Mark Spencer, Sun Microsystem and from + * the A Law specification + * + * @license: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +#include "companders.h" + +DIO_s8 DIO_LinearToALaw(DIO_s16 sample) +{ + const DIO_s16 cClip = 32635; + const static DIO_s8 LogTable[128] = + { + 1,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + }; + + DIO_s32 sign, exponent, mantissa; + DIO_s8 compandedValue; + sample = (sample ==-32768) ? -32767 : sample; + sign = ((~sample) >> 8) & 0x80; + if (!sign) + sample = (short)-sample; + if (sample > cClip) + sample = cClip; + if (sample >= 256) + { + exponent = (int)LogTable[(sample >> 8) & 0x7F]; + mantissa = (sample >> (exponent + 3) ) & 0x0F; + compandedValue = ((exponent << 4) | mantissa); + } + else + { + compandedValue = (unsigned char)(sample >> 4); + } + compandedValue ^= (sign ^ 0x55); + return compandedValue; +} + +DIO_s16 DIO_ALawToLinear(DIO_s8 aLawByte) +{ + const static DIO_s16 ALawDecompTable[256]={ + 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, + 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, + 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, + 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, + 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, + 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, + 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, + 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, + 344, 328, 376, 360, 280, 264, 312, 296, + 472, 456, 504, 488, 408, 392, 440, 424, + 88, 72, 120, 104, 24, 8, 56, 40, + 216, 200, 248, 232, 152, 136, 184, 168, + 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, + 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, + 688, 656, 752, 720, 560, 528, 624, 592, + 944, 912, 1008, 976, 816, 784, 880, 848, + -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, + -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, + -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, + -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, + -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944, + -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136, + -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472, + -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568, + -344, -328, -376, -360, -280, -264, -312, -296, + -472, -456, -504, -488, -408, -392, -440, -424, + -88, -72, -120, -104, -24, -8, -56, -40, + -216, -200, -248, -232, -152, -136, -184, -168, + -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, + -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, + -688, -656, -752, -720, -560, -528, -624, -592, + -944, -912, -1008, -976, -816, -784, -880, -848}; + DIO_s16 addr = ((DIO_s16)aLawByte)+128; // done for compilers with poor expr type enforcement + return ALawDecompTable[addr]; +} + +// see companders.h +// fixed-radix IIR averager implementation supporting arbitrarily chosen windows +DIO_s32 DIO_IIRavgFR (DIO_s32 prevAvg, DIO_u16 windowLen, DIO_s16 newSample, DIO_u8 radix) +{ + DIO_s32 iirAvg=0; + iirAvg = ((prevAvg * (windowLen-1)) + (DIO_I2FR(newSample,radix)))/windowLen; + return iirAvg; +} + +// see companders.h +// fixed-radix IIR averager implementation using power-of-2 sized windows +// and only shift operations for cpu efficiency +DIO_s32 DIO_IIRavgPower2FR (DIO_s32 prevAvg, DIO_u8 windowLenInBits, DIO_s16 newSample, DIO_u8 radix) +{ + DIO_s32 iirAvg=0; + iirAvg = (((prevAvg<>windowLenInBits; + return iirAvg; +} diff --git a/openair1/PHY/TOOLS/ALAW/companders.h b/openair1/PHY/TOOLS/ALAW/companders.h new file mode 100644 index 0000000000..4d1ab33f19 --- /dev/null +++ b/openair1/PHY/TOOLS/ALAW/companders.h @@ -0,0 +1,90 @@ +/** + * @companders.h - header definition file for embedded companding routines + * + * @copy Copyright (C) <2001-2012> + * @author M A Chatterjee + * @version 1.01 M. A. Chatterjee, cleaned up naming + * + * This file contains integer math settable fixed point radix math routines for + * use on systems in which floating point is not desired or unavailable. + * + * @license: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +#ifndef __DIO_Compand_h__ +#define __DIO_Compand_h__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//"DIO" prefixes are to assist in prevent name collisions if global namespace is used. + +//typedefs ... change for platform dependant register size +// u/s = unsigned/signed 8/16/32 = num of bits +// keywords "int" and "long" in C/C++ are platform dependant +typedef unsigned char DIO_u8 ; +typedef signed char DIO_s8 ; +typedef unsigned short DIO_u16 ; +typedef signed short DIO_s16 ; +typedef unsigned long DIO_u32 ; +typedef signed long DIO_s32 ; + +// macros for converting from Fixed-Radix to integer, vice-versa +// r represents radix precision in bits, converts to/from integer w truncation +#define DIO_I2FR(x,r) ((x)<<(r)) +#define DIO_FR2I(x,r) ((x)>>(r)) + + +// convert FR to double, this is for debug only and WILL NOT compile under many embedded systems. +// use this in test harnesses. Since this is a macro if its not used it won't expand / link +#define DIO_FR2D(x,r) ((double)(((double)(x))/((double)(1<<(r))))) + +//convert signed linear 16 bit sample to an 8 bit A-Law companded sample +DIO_s8 DIO_LinearToALaw(DIO_s16 sample); + +//convert 8bit Alaw companded representation back to linear 16 bit +DIO_s16 DIO_ALawToLinear(DIO_s8 aLawByte); + + +//DC Offset correction for integer companders +//IIR: y_0=(y_1*(w-1)+x_0)/(w) +//where w is the window length +//below are fixed radix precision IIR averagers which allow runtime tradeoffs for windowLen & precision +//Note that (windowLen)*(1< + * @author M A Chatterjee + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +#include +#include + + +#include "companders.h" + + +//=============================================== +//main program for testing the functions +int main (int argc, char *argv[]) +{ + int ret_val = 0; + int i=0,j=0; + printf("\n============================================================\n"); + printf("compandit library quikie program\n"); + printf("M. A. Chatterjee (c) 2012\n\n"); + printf("These routines were developed for use on embedded projects\n"); + printf("for more info see the accompanying compand.txt\n"); + printf("\n"); + + //uncomment to + //show how linear-->alaw-->linear-->alaw progression / quantization error works + /* + + { + char alaw=0,alaw2; + short rev=0; + + for (i= -32768; i <= 32767; i++) + { + alaw = DIO_LinearToALaw((short)i); + rev = DIO_ALawToLinear(alaw); + alaw2 =DIO_LinearToALaw(rev); + if (alaw != alaw2) + printf("***********"); + printf("%7d %7d %7d %7d\n",i,(int)alaw,(int)rev,(int)alaw2); + } + } + + + // IIR averager examples + //IIR window length of 8 samples, using fractional precision of 4 bits + { + int a3=0, a4=0; + unsigned char rad=4; //4 bits fixed-radix fractional precision + printf(" index wave IIRav(i) IIRav(f) IIRavP2(i) IIRavP2(f)\n"); + for (i=0; i < 300; i++) + { + j=(i&0x3f)-20; // triangle wave with range -20 to + 43 + a3= DIO_IIRavgFR(a3,8,j,rad); + a4= DIO_IIRavgPower2FR(a4,3,j,rad); + printf("%6d %6d %6d %9.4f %6d %9.4f \n",i,j, + DIO_FR2I(a3,rad),DIO_FR2D(a3,rad) ,DIO_FR2I(a4,rad),DIO_FR2D(a4,rad)); + } + } + //IIR window length of 64 samples + { + int a3=0, a4=0; + unsigned char rad=6; //rad is the number of bits of precision + printf(" index wave IIRav(i) IIRav(f) IIRavP2(i) IIRavP2(f)\n"); + for (i=0; i < 300; i++) + { + j=(i&0x3f)-20; // triangle wave with range -20 to + 43 + a3= DIO_IIRavgFR(a3,64,j,rad); + a4= DIO_IIRavgPower2FR(a4,6,j,rad); + printf("%6d %6d %6d %9.4f %6d %9.4f \n",i,j, + DIO_FR2I(a3,rad),DIO_FR2D(a3,rad) ,DIO_FR2I(a4,rad),DIO_FR2D(a4,rad)); + } + } + // */ + //Typical microcontroller application. See readme-companders.txt + // the input here simulates an A/D which has a range 0..3.3V mapped as 12 bits (0..4095) + // with a DC bias of 1.55V ==> (1.55/3.3)*4095 counts = 1923 counts + + //now window length of 256 is used for rejecting the resistor bias. at 8KHz this window + // would be approx 8000/256 ~= 31 Hz (not quite but explaining Z xforms is beyond what + // can be explained in this small space.) + //we seed the DC average at 3.3/2 = 1.65V (we guess its in the middle) and let the long window + //length hone in on the correct value. (1.65V/3.3V) *4095 = 2048 counts + { + int actualDCbias =1923; + int calculatedDCbias =2048; //2048 is our initial estimate as outlined above + unsigned char windowLenPow2InBits = 8; // 8 bit long window = 256 sample long window + unsigned char rad=6; //rad is the number of bits of precision + + calculatedDCbias = DIO_I2FR(calculatedDCbias,rad); + printf(" index wave actDCbias calcDCbias calcDCbias(f) alaw\n"); + for (i=0; i < 1000; i++) // if 8000 hz sample rate this represents the number of samples captured + { + j=(((i&0x3f)<<1)-63)+1923; // triangle wave w range 0..127 with a bias set at actualDCbias + calculatedDCbias = DIO_IIRavgPower2FR(calculatedDCbias,windowLenPow2InBits,j,rad); + printf("%6d %6d %6d %6d %9.4f %3d\n",i,j,actualDCbias, + DIO_FR2I(calculatedDCbias,rad),DIO_FR2D(calculatedDCbias,rad), + (int)(DIO_LinearToALaw(j-DIO_FR2I(calculatedDCbias,rad)) )); + } + } + printf("\n"); + return ret_val; +} + diff --git a/openair1/PHY/TOOLS/ALAW/readme-companders.txt b/openair1/PHY/TOOLS/ALAW/readme-companders.txt new file mode 100644 index 0000000000..dbedc91788 --- /dev/null +++ b/openair1/PHY/TOOLS/ALAW/readme-companders.txt @@ -0,0 +1,185 @@ +/** + * @readme-companders.txt - using compander.c / .h and related functions + * + * @copy Copyright (C) <2001-2012> + * @author M A Chatterjee + * + * This document is a brief overview of the simple compander library with + * a small introductory disucssion about fixed radix math IIRs for microcontrollers + * + * @license: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +Welcome... + +The accompanying companders.c contains a small set of functions written in C using only integer math for companding operations. I developed this several years ago for use in several embedded interized math projects and this small, slightly cleaned up version is made available for the public here. It worked very well on M*CORE, 80x86 and ARM processors for small embedded systems. + +usage: +#include "companders.h" +no other dependancies are required. +compile and link companders.c + + +*********************** +About companding... + +Companding is a special type of lossy compression in which linear format samples are converted to logarithmic representation in order to preserve dynamic range of the original linear sample at the expense of uniform precision. Companding is an old method and is free of patents (all have expired). + +Theory of how companding works: +Suppose that we have a signed 16 bit linear sample in 2's complement math. The range of this sample can vary from -32768 to + 32767 in integer steps. Now lets put the constraint that we only have 8 bits with which to represent the data not the full 16 bits of the original linear number. A simple way to preserve high order information would be to linearly truncate off the lower 8 bits giving us a signed number from -128 to +127. We could make a mental note to keep track of the fact that we lost the lower 8 bits and so when use this representation we multiply by 8 bits (or 256) to preserve the input range. +so: +-128 * 256 = -32768 +-127 * 256 = -32512 +... + -1 * 256 = -256 + 0 * 256 = 0 + 1 * 256 = 256 + 2 * 256 = 512 +... + 126 * 256 = 32256 + 127 * 256 = 32512 + + Notice that the steps between these linearly rounded off samples are quite large. This truncated 8 bit representation would be very good at representing a linear quantity system such as linear displacement transducer which moves through its whole range as part of normal operation (like a door). but terrible at logarithmic phenomonen such as audio. Audio information tends to be grouped around zero with occaisonaly peaks of loudness. So with linear quantization soft audio would be lost due to the large quanitization steps at low volumes. To address this companders were developed for use in landline telephony for compressing audio data logarithmically instead of linearly. Hence we use more bits for audio samples near zero and less with audio samples near the integer max extremes. + +A-Law and it cousin mu-Law are companders. Rather than represent samples in linear steps the more bits are allocated to samples near zero while larger magnitude (positive or negative) samples are represented with proportionately larger interval sizes. + +Differential encoding (taking the difference of neighboring samples) can greatly help with compressing data to where we "have more bits" as well, provided samples rates are fast enough. Telephony typically operated with 8 bit non-differential (companded) samples at 8KHz. + +In A-Law the following table (in bits) shows how a 13 bit signed linear integer is companded in to A-Law: +(source is Sun microsystems, a similar table is on wikipedia or the G.711 specification). + + * Linear Input Code Compressed Code + * ------------------------ --------------- + * 0000000wxyza 000wxyz + * 0000001wxyza 001wxyz + * 000001wxyzab 010wxyz + * 00001wxyzabc 011wxyz + * 0001wxyzabcd 100wxyz + * 001wxyzabcde 101wxyz + * 01wxyzabcdef 110wxyz + * 1wxyzabcdefg 111wxyz + + + About this library: + + This free library supports A-Law and IIR averages. A-Law is used for the companding while the IIR averagers can be used for for embedded ADCs where the zero point is set loosely. Since the companders are sensitive, and allocate more bits, to values near zero its important to define a good zero. For example a microcontroller has a pin with an ADC which is fed digitized audio signal. The smallest value for the microtroncoller is 0V = 0x00 and the 3.3V = 0x3ff for 10 effective bits of resolution. A resisitive analog divider is used to center the ADC near the half-input range or about 1.6V while the audio is capacitively coupled as shown here: + + +3.3V + | + R + | + uC_ADC_Pin-----------C----audio_input + | + R + | + GND + + However cheap resistors have tolerances 5 to 10%, so the setpoint voltage could easily be anywhere from 1.4 to 1.8V. To address this software should read the ADC before audio is coming in and determine the actual DC bias voltage set by the resistors. Then when audio is coming in this value is subtracted from the ADC input to give a signed number which is fed to the LinearToAlaw encoder. + + If it not easily possible to turn off the analog / audio source then the long term DC average can be inferred by using one of the IIR functions included here with a long window length (perhaps 2000 samples if sampling at 8 KHz or about 1/4 second). These IIR functions are cheap to run in realtime even with reasonably high sample rates as they take little memory and are simple integer-math IIRs. + + About the Fixed Radix (FR) Math IIR averages + +The (Infinite Impulse Reponse) IIR functions included here use fixed radix math to represent fractional parts of an integer. By providing a settable radix (amount of bits devoted to fractional resolution), the programmer can make tradeoffs between resolution and dynamic range. The larger the radix specified the more bits that will be used in the fractional portion of the representation, which for smaller window sizes may not by necessary. There are more comprehensive ways to deal with fractional representation in binary systems (floating point, bigNum / arbitrary length registers, separation of numerator/denomators etc) but these incur much larger compute/code/memory overhead. The simple system used here avoids the need for testing for overflow/underflow which allows for low foot print code/cpu/memory bandwidth. + + To calculate how many bits of fractional part while preventing overflow use the following formulas: + +Nb = number of bits in use = ceiling(log2(highest_number_represented)) + +radix = 32-Nb(sample_resolution)-Nb(WindowLength)-2 + +for example if you have a ADC generating counts from 0 to 1023 then the Nb(ADC-range) = + Nb = ceiling(log2(1023)) = 10 bits + +If you use a DC average window length of 2000 + Nb = ceiling(log2(2000)) = 11 bits + +so the max radix that should be specified is: + radix = 32 - 10 - 11 - 2 = 32 - 23 = 9 bits + +with 9 bits in the radix fractional precision of 512 units per integer (e.g 1/512) is possible. The "2" in for formula comes from reserving bits for the sign bit and the additional operation in averager. + +The function DIO_s32 DIO_IIRavgFR() allows any integer length window size to be used, while the function DIO_IIRavgPower2FR() specifies window lengths in powers of two but all calculations are based on shift operations which can be significantly faster on lower end microprocessors. + + + +Embedded Systems + +Now back to an embedded microcontroller example. It has a ADC which maps the voltage on 1 pin from 0-3.3V in to 0-4095 counts (12 bit). We capacitively couple the input voltage and use the bias resistors to set mid point in the center of the range. Lets say the the our resistors set the bias at 1.55V. This equals our "zero point". Below this point is negative from the incoming capacitively coupled audio and above this is positive. + +Our "guess" as to the bias = both resistors are the same = (3.3V/2) =1.65V = (1.65V)/(4095 counts/3.3V)= 2048 counts + +Resistor actual set bias "zero point" = 1.55V = (1.55V) *(4095 counts/3.3V)) = 1923 counts +We want this to be "zero" we use for the companded A/D process. + +To do this we start our ADC to periodically sample for sometime before we start "recording" audio. We will feed the ADC values in to our IIR average to find the actual zero point. Note that even when we decide not to "record" we still can still run the A/D and IIR averager so its adapting to the real zero point. + + + +//C-like psuedo code + +#include "companders.h" + +static volatile int32 gIIRavg= 2048; // global static var holds DC average +static volatile int gDoSomethingWithCompandedValue=0; +void processAudioSample() //interrupt handler +{ + short adcValue; + char aLawValue; + + //read the raw uncorrected sample + adcValue= inputPin.read_u16(); // read a 16 bit unsigned sample + + // this updates the IIR average everytime the adc returns a sample + gIIRavg = DIO_IIRavgPower2FR(gIIRavg,11,adcValue,8); + + //now compute companded value with DC offset correction + if (gDoSomethingWithCompandedValue) + { + aLawValue = DIO_LinearToALaw(adcValue-DIO_FR2I(gIIRavg)); + doSomethingWithALaw(aLawValue); // store it to a buffer, send it etc + } +} + +main() +{ + gDoSomethingWithCompandedValue=0; + inputPin.attachInterrupt(&processAudioSample,8000); //attach interrupt handler, 8000 Hz sample rate + + // ... somepoint later in the code + + inputPin.start(); // start the averager + + // ... some time later + gDoSomethingWithCompandedValue=1; //now the interrupt routine will call the doSomethingWithALaw() function + + // ... some time later + gDoSomethingWithCompandedValue=0; //we're no longer collecting ALaw companded date, but we're + // still running the IIR averager + + +} + +Finally, it can be in some systems that we can't turn off the audio input source it may be hard wired to some sensor or mic or perhaps the A/D center bias circuit (the 2 resistors) always is on when the audio is on. In this case running the IIR with a long filter length all the time can remove the bias even when the audio is running. For example in an 8KHz sampling system with an IIR length of 1024 is about 1/8 of a second or a cutoff freq well below 10Hz and costs almost nothing to run. + + + From d5d1dd0e8a0a5f94ee041d8188756e16d32de06c Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 7 Jun 2016 18:19:26 +0200 Subject: [PATCH 043/340] fixed packet struct types --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 121 ++++++++++++++----------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 41 ++++----- 2 files changed, 86 insertions(+), 76 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 669b7a6739..a42eae8798 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -38,40 +38,44 @@ * \warning */ +#ifndef USER_MODE +#include "if4_tools.h" +#include +#else #include "PHY/LTE_TRANSPORT/if4_tools.h" +#endif // Define how data blocks are stored and transferred - -void send_IF4(PHY_VARS_eNB *eNB, int subframe){ - eNB_proc_t *proc = &eNB->proc; +//void send_IF4(PHY_VARS_eNB *eNB, int subframe){ + //eNB_proc_t *proc = &eNB->proc; //int frame=proc->frame_tx; //int subframe=proc->subframe_tx; - LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + //LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - uint32_t i,j; - float *data_block = malloc(length*sizeof(long)); + //uint32_t i,j; + //float *data_block = malloc(length*sizeof(long)); // Generate IF4 packet (for now DL) with frame status information - dl_packet = gen_IF4_dl_packet( /* ADD INFO and data_block pointer */ ); + //dl_packet = gen_IF4_dl_packet( /* ADD INFO and data_block pointer */ ); - for(i=0; isymbols_per_tti; i++) { + //for(i=0; isymbols_per_tti; i++) { // Do compression of the two parts and generate data blocks - symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] - data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); - data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); + //symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] + //data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); + //data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); // Set data blocks and update subframe no./other information to generated packet // Write the packet(s) to the fronthaul - } + //} -} +//} void recv_IF4( /* ADD INFO and data_block pointer */ ) { @@ -83,83 +87,83 @@ void recv_IF4( /* ADD INFO and data_block pointer */ ) { } -IF4_dl_packet gen_IF4_dl_packet( /* ADD INFO and data_block pointer */ ) { - IF4_dl_packet dl_packet; +struct IF4_dl_packet gen_IF4_dl_packet( /* ADD INFO and data_block pointer */ ) { + struct IF4_dl_packet dl_packet; // Set destination and source address // Set Type and Sub-Type - dl_packet.type = ; //08_0A ? + dl_packet.type = 0x080A; dl_packet.sub_type = 0x0020; // Leave reserved as it is //dl_packet.rsvd = ; // Set frame status - dl_packet.frame_status.ant_num = ; - dl_packet.frame_status.ant_start = ; - dl_packet.frame_status.rf_num = ; - dl_packet.frame_status.sf_num = ; - dl_packet.frame_status.sym_num = ; + dl_packet.frame_status.ant_num = 0; + dl_packet.frame_status.ant_start = 0; + dl_packet.frame_status.rf_num = 0; + dl_packet.frame_status.sf_num = 0; + dl_packet.frame_status.sym_num = 0; //dl_packet.frame_status.rsvd = ; // Set data blocks if sent - if (data_block != NULL) { - - } else { - - } + //if (data_block != NULL) { + // + //} else { + // + //} // Set frame check sequence - dl_packet.fcs = ; + dl_packet.fcs = 0; return dl_packet; } -IF4_ul_packet gen_IF4_ul_packet( /* ADD INFO and data_block pointer */ ) { - IF4_ul_packet ul_packet; +struct IF4_ul_packet gen_IF4_ul_packet( /* ADD INFO and data_block pointer */ ) { + struct IF4_ul_packet ul_packet; // Set destination and source address // Set Type and Sub-Type - ul_packet.type = ; //08_0A ? + ul_packet.type = 0x080A; ul_packet.sub_type = 0x0019; // Leave reserved as it is //ul_packet.rsvd = ; // Set frame status - ul_packet.frame_status.ant_num = ; - ul_packet.frame_status.ant_start = ; - ul_packet.frame_status.rf_num = ; - ul_packet.frame_status.sf_num = ; - ul_packet.frame_status.sym_num = ; + ul_packet.frame_status.ant_num = 0; + ul_packet.frame_status.ant_start = 0; + ul_packet.frame_status.rf_num = 0; + ul_packet.frame_status.sf_num = 0; + ul_packet.frame_status.sym_num = 0; //ul_packet.frame_status.rsvd = ; // Set antenna specific gain - ul_packet.gain0.exponent = ; + ul_packet.gain0.exponent = 0; //ul_packet.gain0.rsvd = ; // Set data blocks if sent - if (data_block != NULL) { - - } else { - - } + //if (data_block != NULL) { + // + //} else { + // + //} // Set frame check sequence - ul_packet.fcs = ; + ul_packet.fcs = 0; return ul_packet; } -IF4_prach_packet gen_IF4_prach_packet( /* ADD INFO and data_block pointer */ ) { - IF4_prach_packet prach_packet; +struct IF4_prach_packet gen_IF4_prach_packet( /* ADD INFO and data_block pointer */ ) { + struct IF4_prach_packet prach_packet; // Set destination and source address // Set Type and Sub-Type - prach_packet.type = ; //08_0A ? + prach_packet.type = 0x080A; prach_packet.sub_type = 0x0021; // Leave reserved as it is @@ -167,20 +171,27 @@ IF4_prach_packet gen_IF4_prach_packet( /* ADD INFO and data_block pointer */ ) { // Set LTE Prach configuration //prach_packet.prach_conf.rsvd = ; - prach_packet.prach_conf.ant = ; - prach_packet.prach_conf.rf_num = ; - prach_packet.prach_conf.sf_num = ; - prach_packet.prach_conf.exponent = ; + prach_packet.prach_conf.ant = 0; + prach_packet.prach_conf.rf_num = 0; + prach_packet.prach_conf.sf_num = 0; + prach_packet.prach_conf.exponent = 0; // Set data blocks if sent - if (data_block != NULL) { - - } else { - - } + //if (data_block != NULL) { + // + //} else { + // + //} // Set frame check sequence - prach_packet.fcs = ; + prach_packet.fcs = 0; return prach_packet; } + +int main(){ + + uint32_t i=0; + + return 0; +} diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 3b25e82c6a..c5bb46576c 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -38,8 +38,6 @@ * \warning */ -#include - /// IF4 Frame Status (32 bits) struct IF4_frame_status { /// Antenna Numbers @@ -59,9 +57,9 @@ struct IF4_frame_status { /// IF4 Antenna Gain (16 bits) struct IF4_gain { /// Reserved - uint32_t rsvd:10; + uint16_t rsvd:10; /// FFT Exponent Output - uint32_t exponent:6; + uint16_t exponent:6; }; /// IF4 LTE PRACH Configuration (32 bits) @@ -77,7 +75,7 @@ struct IF4_lte_prach_conf { /// FFT Exponent Output uint32_t exponent:6; }; - + struct IF4_dl_packet { /// Destination Address @@ -90,13 +88,14 @@ struct IF4_dl_packet { /// Reserved uint32_t rsvd; /// Frame Status - IF4_frame_status frame_status; + struct IF4_frame_status frame_status; /// Data Blocks /// Frame Check Sequence uint32_t fcs; }; + struct IF4_ul_packet { /// Destination Address @@ -109,23 +108,23 @@ struct IF4_ul_packet { /// Reserved uint32_t rsvd; /// Frame Status - IF4_frame_status frame_status; + struct IF4_frame_status frame_status; /// Gain 0 - IF4_gain gain0; + struct IF4_gain gain0; /// Gain 1 - IF4_gain gain1; + struct IF4_gain gain1; /// Gain 2 - IF4_gain gain2; + struct IF4_gain gain2; /// Gain 3 - IF4_gain gain3; + struct IF4_gain gain3; /// Gain 4 - IF4_gain gain4; + struct IF4_gain gain4; /// Gain 5 - IF4_gain gain5; + struct IF4_gain gain5; /// Gain 6 - IF4_gain gain6; + struct IF4_gain gain6; /// Gain 7 - IF4_gain gain7; + struct IF4_gain gain7; /// Data Blocks /// Frame Check Sequence @@ -144,7 +143,7 @@ struct IF4_prach_packet { /// Reserved uint32_t rsvd; /// LTE Prach Configuration - IF4_lte_prach_conf prach_conf; + struct IF4_lte_prach_conf prach_conf; /// Prach Data Block (one antenna) /// Frame Check Sequence @@ -153,12 +152,12 @@ struct IF4_prach_packet { // Needs to be checked -IF4_dl_packet gen_IF4_dl_packet(); +struct IF4_dl_packet gen_IF4_dl_packet(); -IF4_ul_packet gen_IF4_ul_packet(); +struct IF4_ul_packet gen_IF4_ul_packet(); -IF4_prach_packet gen_IF4_prach_packet(); +struct IF4_prach_packet gen_IF4_prach_packet(); -void send_IF4(PHY_VARS_eNB *eNB, int subframe); +void send_IF4( /* ADD INFO */ ); -void recv_IF4(PHY_VARS_eNB *eNB, int subframe); +void recv_IF4( /* ADD INFO */ ); From 1654af9a63c9071d7208738535a1602000933ec5 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 8 Jun 2016 00:28:16 +0200 Subject: [PATCH 044/340] removed some traces that flooded the screen. Added UE information in PHY/MAC/RRC to indicate status of active/failing UEs every 10.24 seconds. --- openair1/SCHED/phy_procedures_lte_eNb.c | 23 +++++++++++++---------- openair2/LAYER2/MAC/eNB_scheduler.c | 8 +++++--- openair2/RRC/LITE/rrc_common.c | 13 +++++++++++++ openair2/RRC/LITE/rrc_eNB.c | 3 ++- targets/RT/USER/lte-enb.c | 3 ++- targets/RT/USER/lte-softmodem.c | 2 +- 6 files changed, 36 insertions(+), 16 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 619a5d6329..4601781e68 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -159,12 +159,11 @@ int32_t add_ue(int16_t rnti, PHY_VARS_eNB *eNB) { uint8_t i; -#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d/%d] Adding UE with rnti %x\n", + + LOG_D(PHY,"[eNB %d/%d] Adding UE with rnti %x\n", eNB->Mod_id, eNB->CC_id, (uint16_t)rnti); -#endif for (i=0; idlsch[i]==NULL) || (eNB->ulsch[i]==NULL)) { @@ -209,9 +208,9 @@ int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { } else { if (eNB->UE_stats[i].crnti==rntiP) { MSC_LOG_EVENT(MSC_PHY_ENB, "0 Removed ue %"PRIx16" ", rntiP); -#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",eNB->Mod_id,i,rnti); -#endif + + LOG_D(PHY,"eNB %d removing UE %d with rnti %x\n",eNB->Mod_id,i,rntiP); + //LOG_D(PHY,("[PHY] UE_id %d\n",i); clean_eNb_dlsch(eNB->dlsch[i][0]); clean_eNb_ulsch(eNB->ulsch[i]); @@ -841,7 +840,7 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC int frame = proc->frame_tx; int subframe = proc->subframe_tx; - LOG_I(PHY, + LOG_D(PHY, "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n", eNB->Mod_id, subframe2harq_pid(fp, @@ -1137,7 +1136,11 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, for (i=0; iUE_stats[i].crnti > 0) { + LOG_I(PHY,"UE %d : rnti %x\n",i,eNB->UE_stats[i].crnti); + } + } if (eNB->UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) { LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n", eNB->Mod_id,eNB->CC_id,frame,subframe, i, eNB->UE_stats[i].ulsch_consecutive_errors); @@ -1947,7 +1950,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits eNB->UE_stats[(uint32_t)UE_id].sector = 0; - LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", + LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, frame, @@ -2616,7 +2619,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const { //RX processing for ue-specific resources (i UNUSED(r_type); - uint32_t l, ret=0,i,j,k; + uint32_t ret=0,i,j,k; uint32_t harq_pid, harq_idx, round; uint8_t nPRS; int sync_pos; diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index 65098e975f..4167db00fd 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -119,8 +119,10 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, while (i>=0) { rnti = UE_RNTI(module_idP, i); CC_id = UE_PCCID(module_idP, i); - LOG_D(MAC,"UE %d: rnti %x (%p)\n", i, rnti, - mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)); + if ((frameP==0)&&(subframeP==0)) + LOG_I(MAC,"UE rnti %x : %s\n", rnti, + UE_list->UE_sched_ctrl[i].ul_out_of_sync==0 ? "in synch" : "out of sync"); + next_i= UE_list->next[i]; PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]=-63; @@ -317,7 +319,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, //if (subframeP%5 == 0) //#ifdef EXMIMO - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,module_idP); + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, subframeP,module_idP); pdcp_run(&ctxt); //#endif diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index 2092317647..e05e957e36 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -525,6 +525,19 @@ rrc_rx_tx( // check for UL failure RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head)) { + if ((ctxt_pP->frame == 0) && (ctxt_pP->subframe==0)) { + if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) { + LOG_I(RRC,"UE rnti %x:S-TMSI %x failure timer %d/20000\n", + ue_context_p->ue_context.rnti, + ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, + ue_context_p->ue_context.ul_failure_timer); + } + else { + LOG_I(RRC,"UE rnti %x failure timer %d/20000\n", + ue_context_p->ue_context.rnti, + ue_context_p->ue_context.ul_failure_timer); + } + } if (ue_context_p->ue_context.ul_failure_timer>0) { ue_context_p->ue_context.ul_failure_timer++; if (ue_context_p->ue_context.ul_failure_timer >= 20000) { diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index dcc3264828..b0ee647fc8 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -3742,12 +3742,13 @@ rrc_eNB_decode_ccch( if ((ue_context_p = rrc_eNB_ue_context_stmsi_exist(ctxt_pP, mme_code, m_tmsi))) { //#warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)" - LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti); + LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti,ctxt_pP->rnti); stmsi_received=1; ue_context_p->ue_context.rnti = ctxt_pP->rnti; // AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)"); // ue_context_p = NULL; } else { + LOG_I(RRC," S-TMSI doesn't exist, setting Initialue_identity_s_TMSI.m_tmsi to %x => %x\n",ue_context_p,m_tmsi); ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, NOT_A_RANDOM_UE_IDENTITY); ue_context_p->ue_context.Initialue_identity_s_TMSI.presence = TRUE; ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code = mme_code; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index daeca00f42..373a13e150 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -741,7 +741,8 @@ static void* eNB_thread_rx_common( void* param ) #if defined(ENABLE_ITTI) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif - + if (openair0.trx_start_func(&openair0) != 0 ) + LOG_E(HW,"Could not start the device\n"); // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 26c4a9ae88..70769c6957 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1762,7 +1762,7 @@ int main( int argc, char **argv ) #ifndef USRP_DEBUG - if (mode!=loop_through_memory) + if ((UE_flag==1) && (mode!=loop_through_memory)) if (openair0.trx_start_func(&openair0) != 0 ) LOG_E(HW,"Could not start the device\n"); From d51d5deeaca2378cea73758a1e05d6aa519eabf0 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Wed, 8 Jun 2016 04:00:13 +0530 Subject: [PATCH 045/340] fix some structures and add more details to if4 functions --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 211 +++++++++++-------------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 55 ++++--- 2 files changed, 130 insertions(+), 136 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index a42eae8798..e75a8675e9 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -45,153 +45,132 @@ #include "PHY/LTE_TRANSPORT/if4_tools.h" #endif -// Define how data blocks are stored and transferred - -//void send_IF4(PHY_VARS_eNB *eNB, int subframe){ - //eNB_proc_t *proc = &eNB->proc; - //int frame=proc->frame_tx; - //int subframe=proc->subframe_tx; - - //LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - - //uint32_t i,j; - //float *data_block = malloc(length*sizeof(long)); - - // Generate IF4 packet (for now DL) with frame status information - //dl_packet = gen_IF4_dl_packet( /* ADD INFO and data_block pointer */ ); +void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { + int frame = proc->frame_tx; + int subframe = proc->subframe_tx; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - //for(i=0; isymbols_per_tti; i++) { - - // Do compression of the two parts and generate data blocks - - //symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] - //data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); - //data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); - - // Set data blocks and update subframe no./other information to generated packet - - - // Write the packet(s) to the fronthaul - - //} - -//} + uint16_t i; -void recv_IF4( /* ADD INFO and data_block pointer */ ) { + float_t data_block_length = 1200*(fp->ofdm_symbol_size/2048); + uint16_t *data_block = (uint16_t*)malloc(data_block_length*sizeof(uint16_t)); + + // Caller: RCC - DL *** handle RRU case - UL and PRACH *** + if (eNB->node_function == NGFI_RCC_IF4) { + IF4_dl_packet_t *dl_packet = (IF4_dl_packet_t*)malloc(sizeof_IF4_dl_packet_t); + gen_IF4_dl_packet(dl_packet, proc); + + dl_packet->data_block = data_block; + + for(i=0; isymbols_per_tti; i++) { + + //Do compression of the two parts and generate data blocks + + //symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] + //data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); + //data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); + + // Update information in generated packet + dl_packet->frame_status.sym_num = i; + + // Write the packet(s) to the fronthaul + + } + }else { + IF4_ul_packet_t *ul_packet = (IF4_ul_packet_t*)malloc(sizeof_IF4_ul_packet_t); + gen_IF4_ul_packet(ul_packet, proc); + + ul_packet->data_block = data_block; + + for(i=0; isymbols_per_tti; i++) { + + //Do compression of the two parts and generate data blocks + + //symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] + //data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); + //data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); + + // Update information in generated packet + ul_packet->frame_status.sym_num = i; + + // Write the packet(s) to the fronthaul + + } + } + +} + +void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { // Read packet(s) from the fronthaul // Apply reverse processing - decompression // Generate and return the OFDM symbols (txdataF) - + + // Caller: RRU - DL *** handle RCC case - UL and PRACH *** + } -struct IF4_dl_packet gen_IF4_dl_packet( /* ADD INFO and data_block pointer */ ) { - struct IF4_dl_packet dl_packet; - - // Set destination and source address - +void gen_IF4_dl_packet(IF4_dl_packet_t *dl_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type - dl_packet.type = 0x080A; - dl_packet.sub_type = 0x0020; + dl_packet->type = 0x080A; + dl_packet->sub_type = 0x0020; // Leave reserved as it is - //dl_packet.rsvd = ; + dl_packet->rsvd = 0; // Set frame status - dl_packet.frame_status.ant_num = 0; - dl_packet.frame_status.ant_start = 0; - dl_packet.frame_status.rf_num = 0; - dl_packet.frame_status.sf_num = 0; - dl_packet.frame_status.sym_num = 0; - //dl_packet.frame_status.rsvd = ; - - // Set data blocks if sent - //if (data_block != NULL) { - // - //} else { - // - //} - + dl_packet->frame_status.ant_num = 0; + dl_packet->frame_status.ant_start = 0; + dl_packet->frame_status.rf_num = proc->frame_tx; + dl_packet->frame_status.sf_num = proc->subframe_tx; + dl_packet->frame_status.sym_num = 0; + dl_packet->frame_status.rsvd = 0; + // Set frame check sequence - dl_packet.fcs = 0; - - return dl_packet; + dl_packet->fcs = 0; } -struct IF4_ul_packet gen_IF4_ul_packet( /* ADD INFO and data_block pointer */ ) { - struct IF4_ul_packet ul_packet; - - // Set destination and source address - +void gen_IF4_ul_packet(IF4_ul_packet_t *ul_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type - ul_packet.type = 0x080A; - ul_packet.sub_type = 0x0019; + ul_packet->type = 0x080A; + ul_packet->sub_type = 0x0019; // Leave reserved as it is - //ul_packet.rsvd = ; + ul_packet->rsvd = 0; // Set frame status - ul_packet.frame_status.ant_num = 0; - ul_packet.frame_status.ant_start = 0; - ul_packet.frame_status.rf_num = 0; - ul_packet.frame_status.sf_num = 0; - ul_packet.frame_status.sym_num = 0; - //ul_packet.frame_status.rsvd = ; + ul_packet->frame_status.ant_num = 0; + ul_packet->frame_status.ant_start = 0; + ul_packet->frame_status.rf_num = proc->frame_rx; + ul_packet->frame_status.sf_num = proc->subframe_rx; + ul_packet->frame_status.sym_num = 0; + ul_packet->frame_status.rsvd = 0; + + // Set antenna specific gain *** set other antenna gain *** + ul_packet->gain0.exponent = 0; + ul_packet->gain0.rsvd = 0; - // Set antenna specific gain - ul_packet.gain0.exponent = 0; - //ul_packet.gain0.rsvd = ; - - // Set data blocks if sent - //if (data_block != NULL) { - // - //} else { - // - //} - // Set frame check sequence - ul_packet.fcs = 0; - - return ul_packet; + ul_packet->fcs = 0; } -struct IF4_prach_packet gen_IF4_prach_packet( /* ADD INFO and data_block pointer */ ) { - struct IF4_prach_packet prach_packet; - - // Set destination and source address - +void gen_IF4_prach_packet(IF4_prach_packet_t *prach_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type - prach_packet.type = 0x080A; - prach_packet.sub_type = 0x0021; + prach_packet->type = 0x080A; + prach_packet->sub_type = 0x0021; // Leave reserved as it is - //prach_packet.rsvd = ; + prach_packet->rsvd = 0; // Set LTE Prach configuration - //prach_packet.prach_conf.rsvd = ; - prach_packet.prach_conf.ant = 0; - prach_packet.prach_conf.rf_num = 0; - prach_packet.prach_conf.sf_num = 0; - prach_packet.prach_conf.exponent = 0; - - // Set data blocks if sent - //if (data_block != NULL) { - // - //} else { - // - //} - + prach_packet->prach_conf.rsvd = 0; + prach_packet->prach_conf.ant = 0; + prach_packet->prach_conf.rf_num = proc->frame_rx; + prach_packet->prach_conf.sf_num = proc->subframe_rx; + prach_packet->prach_conf.exponent = 0; + // Set frame check sequence - prach_packet.fcs = 0; - - return prach_packet; + prach_packet->fcs = 0; } - -int main(){ - - uint32_t i=0; - - return 0; -} diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index c5bb46576c..819aca58d6 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -54,6 +54,9 @@ struct IF4_frame_status { uint32_t rsvd:2; }; +typedef struct IF4_frame_status IF4_frame_status_t; +#define sizeof_IF4_frame_status_t 4 + /// IF4 Antenna Gain (16 bits) struct IF4_gain { /// Reserved @@ -62,6 +65,9 @@ struct IF4_gain { uint16_t exponent:6; }; +typedef struct IF4_gain IF4_gain_t; +#define sizeof_IF_gain_t 2 + /// IF4 LTE PRACH Configuration (32 bits) struct IF4_lte_prach_conf { /// Reserved @@ -76,6 +82,9 @@ struct IF4_lte_prach_conf { uint32_t exponent:6; }; +typedef struct IF4_lte_prach_conf IF4_lte_prach_conf_t; +#define sizeof_IF4_lte_prach_conf_t 4 + struct IF4_dl_packet { /// Destination Address @@ -88,13 +97,15 @@ struct IF4_dl_packet { /// Reserved uint32_t rsvd; /// Frame Status - struct IF4_frame_status frame_status; + IF4_frame_status_t frame_status; /// Data Blocks - + uint16_t *data_block; /// Frame Check Sequence uint32_t fcs; }; +typedef struct IF4_dl_packet IF4_dl_packet_t; +#define sizeof_IF4_dl_packet_t 18 struct IF4_ul_packet { /// Destination Address @@ -108,29 +119,32 @@ struct IF4_ul_packet { /// Reserved uint32_t rsvd; /// Frame Status - struct IF4_frame_status frame_status; + IF4_frame_status_t frame_status; /// Gain 0 - struct IF4_gain gain0; + IF4_gain_t gain0; /// Gain 1 - struct IF4_gain gain1; + IF4_gain_t gain1; /// Gain 2 - struct IF4_gain gain2; + IF4_gain_t gain2; /// Gain 3 - struct IF4_gain gain3; + IF4_gain_t gain3; /// Gain 4 - struct IF4_gain gain4; + IF4_gain_t gain4; /// Gain 5 - struct IF4_gain gain5; + IF4_gain_t gain5; /// Gain 6 - struct IF4_gain gain6; + IF4_gain_t gain6; /// Gain 7 - struct IF4_gain gain7; + IF4_gain_t gain7; /// Data Blocks - + uint16_t *data_block; /// Frame Check Sequence uint32_t fcs; }; +typedef struct IF4_ul_packet IF4_ul_packet_t; +#define sizeof_IF4_ul_packet_t 34 + struct IF4_prach_packet { /// Destination Address @@ -143,21 +157,22 @@ struct IF4_prach_packet { /// Reserved uint32_t rsvd; /// LTE Prach Configuration - struct IF4_lte_prach_conf prach_conf; + IF4_lte_prach_conf_t prach_conf; /// Prach Data Block (one antenna) - + uint16_t *data_block; /// Frame Check Sequence uint32_t fcs; }; -// Needs to be checked +typedef struct IF4_prach_packet IF4_prach_packet_t; +#define sizeof_IF4_prach_packet_t 18 -struct IF4_dl_packet gen_IF4_dl_packet(); +void gen_IF4_dl_packet(IF4_dl_packet_t*, eNB_rxtx_proc_t*); -struct IF4_ul_packet gen_IF4_ul_packet(); +void gen_IF4_ul_packet(IF4_ul_packet_t*, eNB_rxtx_proc_t*); -struct IF4_prach_packet gen_IF4_prach_packet(); +void gen_IF4_prach_packet(IF4_prach_packet_t*, eNB_rxtx_proc_t*); -void send_IF4( /* ADD INFO */ ); +void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*); -void recv_IF4( /* ADD INFO */ ); +void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*); From 89eba068aa3fbc353ef2bf2eaddb3c5203a01767 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 8 Jun 2016 11:41:14 +0200 Subject: [PATCH 046/340] added comments on IF# split point phy_TX --- openair1/SCHED/phy_procedures_lte_eNb.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 4601781e68..c0165bc2e6 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1412,7 +1412,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, #endif #if !(defined(EXMIMO) || defined(OAI_USRP) || defined (CPRIGW)) - + if (abstraction_flag==0) { start_meas(&eNB->ofdm_mod_stats); @@ -1429,10 +1429,27 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, #endif + // Clean up split point *** RRU only function to recv and do_OFDM_mod *** + if (eNB->node_function == eNodeB_3GPP) { + // Add above to IF4 split + // do_OFDM_mod + + }else if (eNB->node_function == NGFI_RCC_IF4) { + //send_IF4(eNB,subframe<<1); + //send_IF4(eNB,(subframe<<1)+1); + + }else if (eNB->node_function == NGFI_RRU_IF4) { // => acquisition from RCC (IF4) + // get frame/subframe information from IF4 interface + + //recv_IF4(eNB,subframe<<1); + //recv_IF4(eNB,1+(subframe<<1)); + + //do_OFDM_mod + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0); stop_meas(&eNB->phy_proc_tx); - - + } void process_Msg3(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id, uint8_t harq_pid) From f7b6d16c4ec6845c23df2d266de7de7c24a30210 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 8 Jun 2016 19:27:11 +0200 Subject: [PATCH 047/340] initializations for LMSSDR --- openair1/SCHED/phy_procedures_lte_eNb.c | 4 +++- targets/RT/USER/lte-enb.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 4601781e68..de44777c33 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2512,12 +2512,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl fp->nb_antennas_rx); proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + /* printf("Frame %d, subframe %d : TS %lu => %d,%d (rxs %d)\n", + frame,subframe,proc->timestamp_rx,proc->frame_rx,proc->subframe_rx,rxs);*/ if (proc->first_rx == 0) { AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)",proc->subframe_rx,subframe); AssertFatal(proc->frame_rx == frame, "Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)",proc->frame_rx,frame); } else - proc->first_rx = 0; + proc->first_rx--;// = 0; // printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 373a13e150..7ab31098d2 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1045,7 +1045,7 @@ void init_eNB_proc(void) proc->instance_cnt_prach = -1; proc->CC_id = CC_id; - proc->first_rx=1; + proc->first_rx=4; pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); From f5b368461be0c83bd8a477aa5246100c5ffaf6fe Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 9 Jun 2016 12:16:57 +0200 Subject: [PATCH 048/340] fixed a bug in initialization of DCI --- openair1/SCHED/phy_mac_stub.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 56882bf404..e1a75a3a4e 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -239,6 +239,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rah = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_FDD_t)); /* @@ -270,6 +272,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); /* @@ -288,6 +291,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); */ } @@ -306,6 +310,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rah = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_FDD_t)); /* @@ -324,6 +330,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); */ } else { @@ -337,6 +344,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); /* @@ -355,6 +363,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); */ } @@ -372,6 +381,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rah = 0; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_FDD_t)); /* @@ -390,6 +401,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); */ } else { @@ -403,6 +415,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t)); /* @@ -421,6 +434,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); */ } From a2e7ddee8621dfa15fd53aad2d18033072c39115 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 12 Jun 2016 04:56:16 -0700 Subject: [PATCH 049/340] fixed AVX2 issue in 3gpplte_sse.c --- openair1/PHY/CODING/3gpplte_sse.c | 12 ++- openair1/PHY/CODING/lte_segmentation.c | 2 +- openair1/PHY/INIT/lte_param_init.c | 3 +- openair1/PHY/LTE_ESTIMATION/defs.h | 1 + .../lte_ul_channel_estimation.c | 5 +- openair1/PHY/LTE_TRANSPORT/drs_modulation.c | 84 ++----------------- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 28 +++---- openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c | 2 +- openair1/PHY/TOOLS/ALAW/companders.c | 18 +++- openair1/SIMULATION/LTE_PHY/ulsim.c | 41 +++++---- 10 files changed, 75 insertions(+), 121 deletions(-) diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c index 6806967921..99afa1cf5a 100755 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -233,7 +233,7 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns loop++; #endif - + for (i=0; i>1; + int input_length_words=1+((n-1)>>1); #else - int input_length_words=n>>2; + int input_length_words=1+((n-1)>>2); #endif + for ( i=0; i< input_length_words ; i ++ ) { + #if defined(__x86_64__) || defined(__i386__) #ifndef __AVX2__ tmp=_mm_insert_epi8(tmp,expandInput[*ptr_intl++],7); @@ -571,6 +573,7 @@ void threegpplte_turbo_encoder(unsigned char *input, unsigned char systematic2[768] __attribute__((aligned(32))); + interleave_compact_byte(base_interleaver,input,systematic2,input_length_bytes); #if defined(__x86_64__) || defined(__i386__) @@ -584,7 +587,7 @@ void threegpplte_turbo_encoder(unsigned char *input, for ( state0=state1=i=0 ; i>3)) { output_buffers[r][k] = input_buffer[s]; - // printf("encoding segment %d : byte %d => %d\n",r,k,input_buffer[s]); + // printf("encoding segment %d : byte %d (%d) => %d\n",r,k,Kr>>3,input_buffer[s]); k++; s++; } diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c index 0e18537965..a32a2441c7 100644 --- a/openair1/PHY/INIT/lte_param_init.c +++ b/openair1/PHY/INIT/lte_param_init.c @@ -28,10 +28,11 @@ void lte_param_init(unsigned char N_tx, LTE_DL_FRAME_PARMS *frame_parms; int i; - printf("Start lte_param_init\n"); eNB = malloc(sizeof(PHY_VARS_eNB)); UE = malloc(sizeof(PHY_VARS_UE)); + memset((void*)eNB,0,sizeof(PHY_VARS_eNB)); + memset((void*)UE,0,sizeof(PHY_VARS_UE)); //PHY_config = malloc(sizeof(PHY_CONFIG)); mac_xface = malloc(sizeof(MAC_xface)); diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index ebba52670d..c01b1435d9 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -217,6 +217,7 @@ void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, unsigned char eNB_id); int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, module_id_t eNB_id, module_id_t UE_id, uint8_t l, diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index 84975c1deb..8434d2a72c 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -53,6 +53,7 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32 #define SCALE 0x3FFF int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t eNB_id, uint8_t UE_id, unsigned char l, @@ -67,8 +68,8 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB, int32_t **ul_ch_estimates_0= pusch_vars->drs_ch_estimates_0[eNB_id]; int32_t **ul_ch_estimates_1= pusch_vars->drs_ch_estimates_1[eNB_id]; int32_t **rxdataF_ext= pusch_vars->rxdataF_ext[eNB_id]; - int subframe = eNB->proc.subframe_rx; - uint8_t harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe); + int subframe = proc->subframe_rx; + uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe); int16_t delta_phase = 0; int16_t *ru1 = ru_90; int16_t *ru2 = ru_90; diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c index 2d3b9d3b23..8ccfc72d20 100644 --- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c @@ -94,7 +94,7 @@ int generate_drs_pusch(PHY_VARS_UE *ue, if (Msc_idx_ptr) Msc_RS_idx = Msc_idx_ptr - dftsizes; else { - msg("generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS); + printf("generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS); return(-1); } @@ -107,7 +107,7 @@ int generate_drs_pusch(PHY_VARS_UE *ue, #endif #ifdef DEBUG_DRS - msg("[PHY] drs_modulation: Msc_RS = %d, Msc_RS_idx = %d,cyclic_shift %d, u0 %d, v0 %d, u1 %d, v1 %d,cshift0 %d,cshift1 %d\n",Msc_RS, Msc_RS_idx,cyclic_shift,u0,v0,u1,v1,cyclic_shift0,cyclic_shift1); + printf("[PHY] drs_modulation: Msc_RS = %d, Msc_RS_idx = %d,cyclic_shift %d, u0 %d, v0 %d, u1 %d, v1 %d,cshift0 %d,cshift1 %d\n",Msc_RS, Msc_RS_idx,cyclic_shift,u0,v0,u1,v1,cyclic_shift0,cyclic_shift1); #endif @@ -116,21 +116,17 @@ int generate_drs_pusch(PHY_VARS_UE *ue, lsymbols_per_tti; l += (7 - frame_parms->Ncp),u=u1,v=v1,cyclic_shift=cyclic_shift1) { - drs_offset = 0; // msg("drs_modulation: Msc_RS = %d, Msc_RS_idx = %d\n",Msc_RS, Msc_RS_idx); + drs_offset = 0; // printf("drs_modulation: Msc_RS = %d, Msc_RS_idx = %d\n",Msc_RS, Msc_RS_idx); + -#ifdef IFFT_FPGA_UE - re_offset = frame_parms->N_RB_DL*12/2; - subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->N_RB_UL*12; - symbol_offset = subframe_offset + frame_parms->N_RB_UL*12*l; -#else re_offset = frame_parms->first_carrier_offset; subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->ofdm_symbol_size; symbol_offset = subframe_offset + frame_parms->ofdm_symbol_size*l; -#endif + #ifdef DEBUG_DRS - msg("generate_drs_pusch: symbol_offset %d, subframe offset %d, cyclic shift %d\n",symbol_offset,subframe_offset,cyclic_shift); + printf("generate_drs_pusch: symbol_offset %d, subframe offset %d, cyclic shift %d\n",symbol_offset,subframe_offset,cyclic_shift); #endif alpha_ind = 0; @@ -139,60 +135,9 @@ int generate_drs_pusch(PHY_VARS_UE *ue, if ((rb >= first_rb) && (rb<(first_rb+nb_rb))) { #ifdef DEBUG_DRS - msg("generate_drs_pusch: doing RB %d, re_offset=%d, drs_offset=%d,cyclic shift %d\n",rb,re_offset,drs_offset,cyclic_shift); + printf("generate_drs_pusch: doing RB %d, re_offset=%d, drs_offset=%d,cyclic shift %d\n",rb,re_offset,drs_offset,cyclic_shift); #endif -#ifdef IFFT_FPGA_UE - - if (cyclic_shift == 0) { - for (k=0; k<12; k++) { - if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 1; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 2; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 3; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 4; - - re_offset++; - drs_offset++; - - if (re_offset >= frame_parms->N_RB_UL*12) - re_offset=0; - } - } else if(cyclic_shift == 6 ) { - for (k=0; k<12; k++) { - if(k%2 == 0) { - if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 4; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 3; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 2; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 1; - } else { - if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 1; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 2; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 3; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 4; - } - - re_offset++; - drs_offset++; - - if (re_offset >= frame_parms->N_RB_UL*12) - re_offset=0; - } - } - -#else //IFFT_FPGA_UE - for (k=0; k<12; k++) { ref_re = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1]; ref_im = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1]; @@ -211,7 +156,7 @@ int generate_drs_pusch(PHY_VARS_UE *ue, alpha_ind-=12; #ifdef DEBUG_DRS - msg("symbol_offset %d, alpha_ind %d , re_offset %d : (%d,%d)\n", + printf("symbol_offset %d, alpha_ind %d , re_offset %d : (%d,%d)\n", symbol_offset, alpha_ind, re_offset, @@ -226,21 +171,10 @@ int generate_drs_pusch(PHY_VARS_UE *ue, re_offset = 0; } -#endif // IFFT_FPGA_UE } else { re_offset+=12; // go to next RB // check if we crossed the symbol boundary and skip DC -#ifdef IFFT_FPGA_UE - - if (re_offset >= frame_parms->N_RB_DL*12) { - if (frame_parms->N_RB_DL&1) // odd number of RBs - re_offset=6; - else // even number of RBs (doesn't straddle DC) - re_offset=0; - } - -#else if (re_offset >= frame_parms->ofdm_symbol_size) { if (frame_parms->N_RB_DL&1) // odd number of RBs @@ -249,7 +183,7 @@ int generate_drs_pusch(PHY_VARS_UE *ue, re_offset=0; } -#endif + } } } diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 59cf11a06c..25ba06077f 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -739,7 +739,7 @@ void ulsch_extract_rbs_single(int32_t **rxdataF, nb_rb2 = 2*nb_rb - nb_rb1; // 2 times no. RBs after the DC #ifdef DEBUG_ULSCH - msg("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2); + printf("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2); #endif rxF_ext = &rxdataF_ext[aarx][(symbol*frame_parms->N_RB_UL*12)]; @@ -1608,7 +1608,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe); Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs); #ifdef DEBUG_ULSCH - msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb, + printf("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb, cooperation_flag); #endif //DEBUG_ULSCH @@ -1622,7 +1622,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) { #ifdef DEBUG_ULSCH - msg("rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l, + printf("rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l, ulsch[UE_id]->harq_processes[harq_pid]->first_rb, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, common_vars->rxdataF[eNB_id], @@ -1637,7 +1637,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, l/(frame_parms->symbols_per_tti/2), frame_parms); - lte_ul_channel_estimation(eNB, + lte_ul_channel_estimation(eNB,proc, eNB_id, UE_id, l%(frame_parms->symbols_per_tti/2), @@ -1681,7 +1681,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, avgU_0, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - // msg("[ULSCH] avg_0[0] %d\n",avgU_0[0]); + // printf("[ULSCH] avg_0[0] %d\n",avgU_0[0]); avgs_0 = 0; @@ -1691,7 +1691,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, log2_maxh_0 = (log2_approx(avgs_0)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+3; #ifdef DEBUG_ULSCH - msg("[ULSCH] log2_maxh_0 = %d (%d,%d)\n",log2_maxh_0,avgU_0[0],avgs_0); + printf("[ULSCH] log2_maxh_0 = %d (%d,%d)\n",log2_maxh_0,avgU_0[0],avgs_0); #endif ulsch_channel_level(pusch_vars->drs_ch_estimates_1[eNB_id], @@ -1699,7 +1699,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, avgU_1, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - // msg("[ULSCH] avg_1[0] %d\n",avgU_1[0]); + // printf("[ULSCH] avg_1[0] %d\n",avgU_1[0]); avgs_1 = 0; @@ -1709,7 +1709,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, log2_maxh_1 = (log2_approx(avgs_1)/2) + log2_approx(frame_parms->nb_antennas_rx-1)+3; #ifdef DEBUG_ULSCH - msg("[ULSCH] log2_maxh_1 = %d (%d,%d)\n",log2_maxh_1,avgU_1[0],avgs_1); + printf("[ULSCH] log2_maxh_1 = %d (%d,%d)\n",log2_maxh_1,avgU_1[0],avgs_1); #endif log2_maxh = max(log2_maxh_0,log2_maxh_1); } else { @@ -1718,7 +1718,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, avgU, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - // msg("[ULSCH] avg[0] %d\n",avgU[0]); + // printf("[ULSCH] avg[0] %d\n",avgU[0]); avgs = 0; @@ -1731,7 +1731,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, log2_maxh = (log2_approx(avgs)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+4; #ifdef DEBUG_ULSCH - msg("[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); + printf("[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); #endif } @@ -1827,11 +1827,11 @@ void rx_ulsch(PHY_VARS_eNB *eNB, //#ifdef DEBUG_ULSCH // Inverse-Transform equalized outputs - // msg("Doing IDFTs\n"); + // printf("Doing IDFTs\n"); lte_idft(frame_parms, (uint32_t*)pusch_vars->rxdataF_comp[eNB_id][0], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12); - // msg("Done\n"); + // printf("Done\n"); //#endif //DEBUG_ULSCH #endif @@ -1877,7 +1877,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, default: #ifdef DEBUG_ULSCH - msg("ulsch_demodulation.c (rx_ulsch): Unknown Qm!!!!\n"); + printf("ulsch_demodulation.c (rx_ulsch): Unknown Qm!!!!\n"); #endif //DEBUG_ULSCH break; } @@ -1890,7 +1890,7 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB, uint8_t sect_id, uint8_t UE_index) { - msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,sect_id,UE_index); + printf("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,sect_id,UE_index); eNB->pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB; eNB->pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB; diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c index 32d3f3e34d..a60e27908b 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c @@ -754,7 +754,7 @@ void ulsch_modulation(int32_t **txdataF, re_offset = re_offset0; symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb)); #ifdef DEBUG_ULSCH_MODULATION - printf("ulsch_mod (OFDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); + printf("ulsch_mod (SC-FDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); #endif txptr = &txdataF[0][symbol_offset]; diff --git a/openair1/PHY/TOOLS/ALAW/companders.c b/openair1/PHY/TOOLS/ALAW/companders.c index b089716977..566c7d6cf3 100644 --- a/openair1/PHY/TOOLS/ALAW/companders.c +++ b/openair1/PHY/TOOLS/ALAW/companders.c @@ -45,8 +45,9 @@ DIO_s8 DIO_LinearToALaw(DIO_s16 sample) }; DIO_s32 sign, exponent, mantissa; - DIO_s8 compandedValue; - sample = (sample ==-32768) ? -32767 : sample; + DIO_s8 compandedValue; + + sample = (sample ==-32768) ? -32767 : sample; sign = ((~sample) >> 8) & 0x80; if (!sign) sample = (short)-sample; @@ -123,3 +124,16 @@ DIO_s32 DIO_IIRavgPower2FR (DIO_s32 prevAvg, DIO_u8 windowLenInBits, DIO_s16 new iirAvg = (((prevAvg<>windowLenInBits; return iirAvg; } + + +#ifdef MAIN + +int main(int argc, char* argv[]) +{ + + + + return 0; +} + +#endif diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 96c0083f94..135ad59037 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -668,7 +668,7 @@ int main(int argc, char **argv) if (eNB->frame_parms.frame_type == TDD) { ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; @@ -678,7 +678,7 @@ int main(int argc, char **argv) } else { ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->type = 0; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; @@ -692,7 +692,7 @@ int main(int argc, char **argv) if (eNB->frame_parms.frame_type == TDD) { ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; @@ -702,7 +702,7 @@ int main(int argc, char **argv) } else { ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->type = 0; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); + //printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; @@ -754,16 +754,15 @@ int main(int argc, char **argv) eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; + eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1]; + proc_rxtx->frame_rx=1; + proc_rxtx->subframe_rx=subframe; + proc_rxtx->frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe); + proc_rxtx->subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe); - eNB->proc.frame_rx=1; - eNB->proc.subframe_rx=subframe; - - eNB->proc.frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe); - eNB->proc.subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe); - - UE->frame_tx = eNB->proc.frame_rx; - UE->frame_rx = eNB->proc.frame_tx; + UE->frame_tx = proc_rxtx->frame_rx; + UE->frame_rx = proc_rxtx->frame_tx; printf("Init UL hopping UE\n"); init_ul_hopping(&UE->frame_parms); @@ -773,11 +772,11 @@ int main(int argc, char **argv) UE->dlsch[0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&eNB->frame_parms,subframe)].send_harq_status = 1; - - + UE->ulsch_Msg3_active[eNB_id] = 0; + UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1; generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu, 14, - eNB->proc.subframe_tx, + proc_rxtx->subframe_tx, format0, UE, SI_RNTI, @@ -789,7 +788,7 @@ int main(int argc, char **argv) // printf("RIV %d\n",UL_alloc_pdu.rballoc); - generate_eNB_ulsch_params_from_dci(eNB, + generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx, (void *)&UL_alloc_pdu, 14, format0, @@ -848,7 +847,7 @@ int main(int argc, char **argv) harq_pid = subframe2harq_pid(&UE->frame_parms,UE->frame_tx,subframe); input_buffer_length = UE->ulsch[0]->harq_processes[harq_pid]->TBS/8; - input_buffer = (unsigned char *)malloc(input_buffer_length+4); + input_buffer = (unsigned char *)memalign(32,input_buffer_length+64); // printf("UL frame %d/subframe %d, harq_pid %d\n",UE->frame,subframe,harq_pid); if (input_fdUL == NULL) { @@ -1230,7 +1229,7 @@ int main(int argc, char **argv) */ start_meas(&eNB->ulsch_demodulation_stats); - rx_ulsch(eNB, + rx_ulsch(eNB,proc_rxtx, 0, // this is the effective sector id 0, // this is the UE_id eNB->ulsch, @@ -1253,7 +1252,7 @@ int main(int argc, char **argv) start_meas(&eNB->ulsch_decoding_stats); - ret= ulsch_decoding(eNB, + ret= ulsch_decoding(eNB,proc_rxtx, 0, // UE_id control_only_flag, 1, // Nbundled @@ -1303,7 +1302,7 @@ int main(int argc, char **argv) print_CQI(eNB->ulsch[0]->harq_processes[harq_pid]->o, eNB->ulsch[0]->harq_processes[harq_pid]->uci_format,0,eNB->frame_parms.N_RB_DL); - dump_ulsch(eNB,0); + dump_ulsch(eNB,proc_rxtx,0); exit(-1); } @@ -1332,7 +1331,7 @@ int main(int argc, char **argv) eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i]^UE->ulsch[0]->harq_processes[harq_pid]->c[s][i]); } - dump_ulsch(eNB,0); + dump_ulsch(eNB,proc_rxtx,0); exit(-1); } From 9c159229d52b3f10467ab752ee21ca14443001f3 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Mon, 13 Jun 2016 02:48:05 +0530 Subject: [PATCH 050/340] added rcc rx recv_IF4 logic --- openair1/PHY/LTE_TRANSPORT/prach.c | 5 +++-- openair1/SCHED/phy_procedures_lte_eNb.c | 28 +++++++++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 15c7bda045..0f806e2ea1 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1272,9 +1272,10 @@ void rx_prach(PHY_VARS_eNB *eNB, //send prachF to RCC return; } - else if (eNB->node_function == NGFI_RCC_IF4) { + // in case of RCC and prach received rx_thread wakes up prach + //else if (eNB->node_function == NGFI_RCC_IF4) { //wait for prachF from RRU and continue with PRACH processing - } + //} diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index c0165bc2e6..785001e8f4 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2498,7 +2498,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; int frame = proc->frame_rx; - + int symbol_number, symbol_mask, symbol_mask_full, prach_rx; if (subframe==9) { subframe=0; @@ -2577,10 +2577,30 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } else if (eNB->node_function == NGFI_RCC_IF4) { // => acquisition from RRU (IF4) - // get frame/subframe information from IF4 interface + // get frame/subframe information from IF4 interface + // timed loop (200 us) + + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + if (is_prach_subframe(fp,frame,subframe)>0) + prach_rx = 0; + else + prach_rx = 1; + + do { + recv_IF4(eNB, proc, &packet_type, &symbol_number); + if (is_prach_subframe(fp,frame,subframe)>0 && packet_type == PRACH) { + // wake up prach_rx + prach_rx = 1; + } + if (packet_type == PULFFT) + symbol_mask = symbol_mask | (1< Date: Sun, 12 Jun 2016 21:44:40 -0700 Subject: [PATCH 051/340] fixed unitary simulators --- openair1/SIMULATION/LTE_PHY/pbchsim.c | 342 ++++++++++++------------- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 15 +- 2 files changed, 175 insertions(+), 182 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 4a2b3f9351..624ce7ad3e 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -52,8 +52,10 @@ #include "OCG_vars.h" -PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2; -PHY_VARS_UE *PHY_vars_UE; +#include "unitary_defs.h" + +PHY_VARS_eNB *eNB,*eNB1,*eNB2; +PHY_VARS_UE *UE; #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 @@ -123,17 +125,7 @@ int main(int argc, char **argv) logInit(); number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:O:dP:")) != -1) { switch (c) { case 'f': @@ -340,29 +332,29 @@ int main(int argc, char **argv) if (transmission_mode>=2) n_tx=2; - lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,N_RB_DL,osf); + lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,3,N_RB_DL,0,osf,0); - PHY_vars_eNB1 = malloc(sizeof(PHY_VARS_eNB)); - PHY_vars_eNB2 = malloc(sizeof(PHY_VARS_eNB)); - PHY_vars_UE->PHY_measurements.n_adj_cells=2; - PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1; - PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2; + eNB1 = malloc(sizeof(PHY_VARS_eNB)); + eNB2 = malloc(sizeof(PHY_VARS_eNB)); + UE->measurements.n_adj_cells=2; + UE->measurements.adj_cell_id[0] = Nid_cell+1; + UE->measurements.adj_cell_id[1] = Nid_cell+2; for (i=0; i<3; i++) - lte_gold(&PHY_vars_eNB->lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i); + lte_gold(&eNB->frame_parms,UE->lte_gold_table[i],Nid_cell+i); - memcpy((void*)&PHY_vars_eNB1->lte_frame_parms,(void*)&PHY_vars_eNB->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS)); - PHY_vars_eNB1->lte_frame_parms.Nid_cell=Nid_cell+1; - PHY_vars_eNB1->lte_frame_parms.nushift=(Nid_cell+1)%6; - PHY_vars_eNB1->Mod_id=1; + memcpy((void*)&eNB1->frame_parms,(void*)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS)); + eNB1->frame_parms.Nid_cell=Nid_cell+1; + eNB1->frame_parms.nushift=(Nid_cell+1)%6; + eNB1->Mod_id=1; - memcpy((void*)&PHY_vars_eNB2->lte_frame_parms,(void*)&PHY_vars_eNB->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS)); - PHY_vars_eNB2->lte_frame_parms.Nid_cell=Nid_cell+2; - PHY_vars_eNB2->lte_frame_parms.nushift=(Nid_cell+2)%6; - PHY_vars_eNB2->Mod_id=2; + memcpy((void*)&eNB2->frame_parms,(void*)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS)); + eNB2->frame_parms.Nid_cell=Nid_cell+2; + eNB2->frame_parms.nushift=(Nid_cell+2)%6; + eNB2->Mod_id=2; - phy_init_lte_eNB(PHY_vars_eNB1,0,0,0); - phy_init_lte_eNB(PHY_vars_eNB2,0,0,0); + phy_init_lte_eNB(eNB1,0,0,0); + phy_init_lte_eNB(eNB2,0,0,0); #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); @@ -380,13 +372,13 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; - txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[0]; - txdata1 = PHY_vars_eNB1->lte_eNB_common_vars.txdata[0]; - txdata2 = PHY_vars_eNB2->lte_eNB_common_vars.txdata[0]; + txdata = eNB->common_vars.txdata[0]; + txdata1 = eNB1->common_vars.txdata[0]; + txdata2 = eNB2->common_vars.txdata[0]; s_re = malloc(2*sizeof(double*)); @@ -407,8 +399,8 @@ int main(int argc, char **argv) printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, interf (%d,%d)\n",NUMBER_OF_OFDM_CARRIERS, frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,interf1,interf2); - printf("PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0] = %p\n", - PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0]); + printf("eNB1->common_vars.txdataF[0][0] = %p\n", + eNB1->common_vars.txdataF[0][0]); DLSCH_alloc_pdu2.rah = 0; @@ -423,31 +415,31 @@ int main(int argc, char **argv) // Forget second codeword DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding - eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, 0); if (interf1>-20) - eNB2UE1 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE1 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 4, 0); if (interf2>-20) - eNB2UE2 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE2 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 8, 0); @@ -511,47 +503,47 @@ int main(int argc, char **argv) pbch_pdu[1]=1; pbch_pdu[2]=0; - if (PHY_vars_eNB->lte_frame_parms.frame_type == 0) { - generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + if (eNB->frame_parms.frame_type == 0) { + generate_pss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 6 : 5, 0); - generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_sss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 5 : 4, 0); - generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 6 : 5, 10); - generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_sss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 5 : 4, 10); } else { - generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_sss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 6 : 5, 1); - generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, 2, 2); - generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_sss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 6 : 5, 11); - generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, 2, 12); @@ -570,11 +562,11 @@ int main(int argc, char **argv) dci_alloc[1].rnti = 0x1234; */ - printf("Generating PBCH for mode1_flag = %d\n", PHY_vars_eNB->lte_frame_parms.mode1_flag); + printf("Generating PBCH for mode1_flag = %d\n", eNB->frame_parms.mode1_flag); - generate_pilots(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pilots(eNB, + eNB->common_vars.txdataF[0], AMP, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); @@ -585,8 +577,8 @@ int main(int argc, char **argv) dci_alloc, 0, 1024, - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + &eNB->frame_parms, + eNB->common_vars.txdataF[0], 0); */ @@ -601,47 +593,47 @@ int main(int argc, char **argv) dummybuf[1] = dummy1; dummybuf[2] = dummy2; dummybuf[3] = dummy3; - generate_pbch(&PHY_vars_eNB->lte_eNB_pbch, + generate_pbch(&eNB->pbch, (int32_t**)dummybuf, AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, pbch_pdu, 0); } - generate_pbch(&PHY_vars_eNB->lte_eNB_pbch, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pbch(&eNB->pbch, + eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, pbch_pdu, pbch_phase); /* - generate_pbch(&PHY_vars_eNB->lte_eNB_pbch, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pbch(&eNB->pbch, + eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, pbch_pdu, 1); */ if (interf1>-20) { /* - generate_pss(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB1->common_vars.txdataF[0], AMP, - &PHY_vars_eNB1->lte_frame_parms, - (PHY_vars_eNB1->lte_frame_parms.Ncp==0)?6:5, + &eNB1->frame_parms, + (eNB1->frame_parms.Ncp==0)?6:5, 0); */ - generate_pilots(PHY_vars_eNB1, - PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0], + generate_pilots(eNB1, + eNB1->common_vars.txdataF[0], AMP, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - generate_pbch(&PHY_vars_eNB1->lte_eNB_pbch, - PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0], + generate_pbch(&eNB1->pbch, + eNB1->common_vars.txdataF[0], AMP, - &PHY_vars_eNB1->lte_frame_parms, + &eNB1->frame_parms, pbch_pdu, 0); @@ -649,38 +641,38 @@ int main(int argc, char **argv) if (interf2>-20) { /* - generate_pss(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB2->common_vars.txdataF[0], AMP, - &PHY_vars_eNB2->lte_frame_parms, - (PHY_vars_eNB2->lte_frame_parms.Ncp==0)?6:5, + &eNB2->frame_parms, + (eNB2->frame_parms.Ncp==0)?6:5, 0); */ - generate_pilots(PHY_vars_eNB2, - PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0], + generate_pilots(eNB2, + eNB2->common_vars.txdataF[0], AMP, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - generate_pbch(&PHY_vars_eNB2->lte_eNB_pbch, - PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0], + generate_pbch(&eNB2->pbch, + eNB2->common_vars.txdataF[0], AMP, - &PHY_vars_eNB2->lte_frame_parms, + &eNB2->frame_parms, pbch_pdu, 0); } - // write_output("pilotsF.m","rsF",txdataF[0],lte_frame_parms->ofdm_symbol_size,1,1); + // write_output("pilotsF.m","rsF",txdataF[0],frame_parms->ofdm_symbol_size,1,1); - write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0.m","txsF0", eNB->common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("txsigF1.m","txsF1", eNB->common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); tx_lev = 0; tx_lev1 = 0; @@ -689,16 +681,16 @@ int main(int argc, char **argv) - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa], // input, + PHY_ofdm_mod(eNB->common_vars.txdataF[0][aa], // input, txdata[aa], // output frame_parms->ofdm_symbol_size, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa], + normal_prefix_mod(eNB->common_vars.txdataF[0][aa], txdata[aa], LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, frame_parms); @@ -709,17 +701,17 @@ int main(int argc, char **argv) } if (interf1>-20) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][aa], // input, - PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][aa], // output + PHY_ofdm_mod(eNB1->common_vars.txdataF[0][aa], // input, + eNB1->common_vars.txdata[0][aa], // output frame_parms->ofdm_symbol_size, 2*nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][aa], - PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][aa], + normal_prefix_mod(eNB1->common_vars.txdataF[0][aa], + eNB1->common_vars.txdata[0][aa], 2*nsymb, frame_parms); } @@ -728,24 +720,24 @@ int main(int argc, char **argv) OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); } - write_output("txsigF0_1.m","txsF0_1", PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0_1.m","txsF0_1", eNB1->common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - if (PHY_vars_eNB1->lte_frame_parms.nb_antennas_tx>1) - write_output("txsigF1_1.m","txsF1_1", PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + if (eNB1->frame_parms.nb_antennas_tx>1) + write_output("txsigF1_1.m","txsF1_1", eNB1->common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); } if (interf2>-20) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][aa], // input, - PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][aa], // output + PHY_ofdm_mod(eNB2->common_vars.txdataF[0][aa], // input, + eNB2->common_vars.txdata[0][aa], // output frame_parms->ofdm_symbol_size, 2*nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][aa], - PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][aa], + normal_prefix_mod(eNB2->common_vars.txdataF[0][aa], + eNB2->common_vars.txdata[0][aa], 2*nsymb, frame_parms); } @@ -754,10 +746,10 @@ int main(int argc, char **argv) OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); } - write_output("txsigF0_2.m","txsF0_2", PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0_2.m","txsF0_2", eNB2->common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - if (PHY_vars_eNB2->lte_frame_parms.nb_antennas_tx>1) - write_output("txsigF1_2.m","txsF1_2", PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + if (eNB2->frame_parms.nb_antennas_tx>1) + write_output("txsigF1_2.m","txsF1_2", eNB2->common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); } // tx_lev_dB = (unsigned int) dB_fixed(tx_lev); @@ -767,15 +759,15 @@ int main(int argc, char **argv) if (frame_parms->nb_antennas_tx>1) write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("txsig0_1.m","txs0_1", PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("txsig0_1.m","txs0_1", eNB1->common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); if (frame_parms->nb_antennas_tx>1) - write_output("txsig1_1.m","txs1_1", PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("txsig1_1.m","txs1_1", eNB1->common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("txsig0_2.m","txs0_2", PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("txsig0_2.m","txs0_2", eNB2->common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); if (frame_parms->nb_antennas_tx>1) - write_output("txsig1_2.m","txs1_2", PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("txsig1_2.m","txs1_2", eNB2->common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); } else { //read in from file i=0; @@ -811,7 +803,7 @@ int main(int argc, char **argv) // multipath channel for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); @@ -872,7 +864,7 @@ int main(int argc, char **argv) } } - sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR; + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR; if (n_frames==1) printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,%f,%f\n",sigma2_dB,SNR, @@ -894,20 +886,20 @@ int main(int argc, char **argv) for (n_trials=0; n_trialslte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { if (n_trials==0) { r_re[aa][i] += (pow(10.0,.05*interf1)*r_re1[aa][i] + pow(10.0,.05*interf2)*r_re2[aa][i]); r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]); } - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) UE->common_vars.rxdata[aa])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } if (n_frames==1) { printf("rx_level data symbol %f\n", - 10*log10(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))); + 10*log10(signal_energy(&UE->common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))); } @@ -919,10 +911,10 @@ int main(int argc, char **argv) exit(0); } - result = fread((void *)PHY_vars_UE->lte_ue_common_vars.rxdata[0],4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); + result = fread((void *)UE->common_vars.rxdata[0],4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); printf("Read %d bytes\n",result); - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) { - result = fread((void *)PHY_vars_UE->lte_ue_common_vars.rxdata[1],4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); + if (UE->frame_parms.nb_antennas_rx>1) { + result = fread((void *)UE->common_vars.rxdata[1],4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); printf("Read %d bytes\n",result); } @@ -930,21 +922,21 @@ int main(int argc, char **argv) */ - for (l=0; llte_frame_parms.symbols_per_tti; l++) { + for (l=0; lframe_parms.symbols_per_tti; l++) { - // subframe_offset = (l/PHY_vars_eNB->lte_frame_parms.symbols_per_tti)*PHY_vars_eNB->lte_frame_parms.samples_per_tti; + // subframe_offset = (l/eNB->frame_parms.symbols_per_tti)*eNB->frame_parms.samples_per_tti; // printf("subframe_offset = %d\n",subframe_offset); - slot_fep(PHY_vars_UE, - l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), - l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), + slot_fep(UE, + l%(eNB->frame_parms.symbols_per_tti/2), + l/(eNB->frame_parms.symbols_per_tti/2), 0, 0, 0); if (l==0) { - lte_ue_measurements(PHY_vars_UE, + lte_ue_measurements(UE, 0, 1, 0); @@ -952,19 +944,19 @@ int main(int argc, char **argv) if (trial%100 == 0) { msg("[PHY_PROCEDURES_LTE] frame %d, RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), RX gain %d dB\n", trial, - PHY_vars_UE->PHY_measurements.rx_rssi_dBm[0], - PHY_vars_UE->PHY_measurements.rx_power_dB[0][0], - PHY_vars_UE->PHY_measurements.rx_power_dB[0][1], - PHY_vars_UE->PHY_measurements.rx_power[0][0], - PHY_vars_UE->PHY_measurements.rx_power[0][1], - PHY_vars_UE->rx_total_gain_dB); + UE->measurements.rx_rssi_dBm[0], + UE->measurements.rx_power_dB[0][0], + UE->measurements.rx_power_dB[0][1], + UE->measurements.rx_power[0][0], + UE->measurements.rx_power[0][1], + UE->rx_total_gain_dB); msg("[PHY_PROCEDURES_LTE] frame %d, N0 digital (%d, %d) dB, linear (%d, %d)\n", trial, - PHY_vars_UE->PHY_measurements.n0_power_dB[0], - PHY_vars_UE->PHY_measurements.n0_power_dB[1], - PHY_vars_UE->PHY_measurements.n0_power[0], - PHY_vars_UE->PHY_measurements.n0_power[1]); + UE->measurements.n0_power_dB[0], + UE->measurements.n0_power_dB[1], + UE->measurements.n0_power[0], + UE->measurements.n0_power[1]); msg("[PHY_PROCEDURES_LTE] frame %d, freq_offset_filt = %d\n", trial, freq_offset); @@ -973,47 +965,47 @@ int main(int argc, char **argv) */ } - if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?4:3)) { + if (l==((eNB->frame_parms.Ncp==0)?4:3)) { //sprintf(fname,"dl_ch00_%d.m",l); //sprintf(vname,"dl_ch00_%d",l); - //write_output(fname,vname,&(lte_ue_common_vars->dl_ch_estimates[0][lte_frame_parms->ofdm_symbol_size*(l%6)]),lte_frame_parms->ofdm_symbol_size,1,1); + //write_output(fname,vname,&(common_vars->dl_ch_estimates[0][frame_parms->ofdm_symbol_size*(l%6)]),frame_parms->ofdm_symbol_size,1,1); - lte_est_freq_offset(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0], - &PHY_vars_UE->lte_frame_parms, + lte_est_freq_offset(UE->common_vars.dl_ch_estimates[0], + &UE->frame_parms, l, &freq_offset, 1); } - if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?10:9)) { + if (l==((eNB->frame_parms.Ncp==0)?10:9)) { for (frame_mod4=0; frame_mod4<4; frame_mod4++) { - pbch_tx_ant = rx_pbch(&PHY_vars_UE->lte_ue_common_vars, - PHY_vars_UE->lte_ue_pbch_vars[0], - &PHY_vars_UE->lte_frame_parms, + pbch_tx_ant = rx_pbch(&UE->common_vars, + UE->pbch_vars[0], + &UE->frame_parms, 0, SISO, - PHY_vars_UE->high_speed_flag, + UE->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { - PHY_vars_UE->lte_frame_parms.mode1_flag = 1; + UE->frame_parms.mode1_flag = 1; break; if (pbch_phase != frame_mod4) printf("pbch_phase different!!!\n"); } - pbch_tx_ant = rx_pbch(&PHY_vars_UE->lte_ue_common_vars, - PHY_vars_UE->lte_ue_pbch_vars[0], - &PHY_vars_eNB->lte_frame_parms, + pbch_tx_ant = rx_pbch(&UE->common_vars, + UE->pbch_vars[0], + &eNB->frame_parms, 0, ALAMOUTI, - PHY_vars_UE->high_speed_flag, + UE->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { - PHY_vars_UE->lte_frame_parms.mode1_flag = 0; + UE->frame_parms.mode1_flag = 0; n_alamouti++; break; } @@ -1023,7 +1015,7 @@ int main(int argc, char **argv) if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { if (n_frames==1) msg("pbch decoded sucessfully mode1_flag %d, frame_mod4 %d, tx_ant %d!\n", - PHY_vars_UE->lte_frame_parms.mode1_flag,frame_mod4,pbch_tx_ant); + UE->frame_parms.mode1_flag,frame_mod4,pbch_tx_ant); } else { n_errors++; n_errors2++; @@ -1036,7 +1028,7 @@ int main(int argc, char **argv) #ifdef XFORMS phy_scope_UE(form_ue, - PHY_vars_UE, + UE, 0,0,1); #endif @@ -1066,16 +1058,16 @@ int main(int argc, char **argv) if (n_frames==1) { - write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) - write_output("H10.m","h10",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(UE->common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); - write_output("rxsig0.m","rxs0", PHY_vars_UE->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("rxsigF0.m","rxsF0", PHY_vars_UE->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); - write_output("PBCH_rxF0_ext.m","pbch0_ext",PHY_vars_UE->lte_ue_pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1); - write_output("PBCH_rxF0_comp.m","pbch0_comp",PHY_vars_UE->lte_ue_pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1); - write_output("PBCH_rxF_llr.m","pbch_llr",PHY_vars_UE->lte_ue_pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); + write_output("rxsig0.m","rxs0", UE->common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("rxsigF0.m","rxsF0", UE->common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("PBCH_rxF0_ext.m","pbch0_ext",UE->pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1); + write_output("PBCH_rxF0_comp.m","pbch0_comp",UE->pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1); + write_output("PBCH_rxF_llr.m","pbch_llr",UE->pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); } diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 73da52085f..d14f13f60f 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -759,13 +759,14 @@ int main(int argc, char **argv) + eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1]; eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0); UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); - eNB->proc.frame_tx = 0; - eNB->proc.subframe_tx = subframe; + proc_rxtx->frame_tx = 0; + proc_rxtx->subframe_tx = subframe; if (input_fd==NULL) { msg("No input file, so starting TX\n"); @@ -932,7 +933,7 @@ int main(int argc, char **argv) if (n_frames==1) printf("generating PHICH\n"); - harq_pid = phich_subframe_to_harq_pid(&eNB->frame_parms, eNB->proc.frame_tx, subframe); + harq_pid = phich_subframe_to_harq_pid(&eNB->frame_parms, proc_rxtx->frame_tx, subframe); phich_ACK = taus()&1; eNB->ulsch[0]->harq_processes[harq_pid]->phich_active = 1; @@ -944,23 +945,23 @@ int main(int argc, char **argv) UE->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; UE->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 0; - generate_phich_top(eNB,AMP,0,0); + generate_phich_top(eNB,proc_rxtx,AMP,0,0); // generate 3 interfering PHICH if (num_phich_interf>0) { eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 4; - generate_phich_top(eNB,1024,0,0); + generate_phich_top(eNB,proc_rxtx,1024,0,0); } if (num_phich_interf>1) { eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 8; eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1; - generate_phich_top(eNB,1024,0,0); + generate_phich_top(eNB,proc_rxtx,1024,0,0); } if (num_phich_interf>2) { eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 12; eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1; - generate_phich_top(eNB,1024,0,0); + generate_phich_top(eNB,proc_rxtx,1024,0,0); } From 2cc779b9302e3ba3ea3b0a25b7ac2ddfd4aee74e Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 13 Jun 2016 18:27:42 +0200 Subject: [PATCH 052/340] added macros for packet_type --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 50 +++++++++++++++++++------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 6 +++- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index e75a8675e9..cf41812c19 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -45,6 +45,7 @@ #include "PHY/LTE_TRANSPORT/if4_tools.h" #endif +// Get device information void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { int frame = proc->frame_tx; int subframe = proc->subframe_tx; @@ -73,8 +74,15 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { // Update information in generated packet dl_packet->frame_status.sym_num = i; - // Write the packet(s) to the fronthaul - + // Write the packet(s) to the fronthaul + //if ((bytes_sent = dev->eth_dev.trx_write_func (&dev->eth_dev, + // timestamp_rx, + // rx_eNB, + // spp_eth, + // dev->eth_dev.openair0_cfg->rx_num_channels, + // 0)) < 0) { + // perror("RCC : ETHERNET write"); + //} } }else { IF4_ul_packet_t *ul_packet = (IF4_ul_packet_t*)malloc(sizeof_IF4_ul_packet_t); @@ -102,20 +110,38 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { - // Read packet(s) from the fronthaul - - // Apply reverse processing - decompression - - // Generate and return the OFDM symbols (txdataF) - // Caller: RRU - DL *** handle RCC case - UL and PRACH *** - + + if (eNB->node_function == NGFI_RRU_IF4) { + + + + for(i=0; isymbols_per_tti; i++) { + // Read packet(s) from the fronthaul + if (dev->eth_dev.trx_read_func (&dev->eth_dev, + timestamp_rx, + rx_eNB, + spp_eth, + dev->eth_dev.openair0_cfg->rx_num_channels + ) < 0) { + perror("RRU : ETHERNET read"); + } + + // Apply reverse processing - decompression + // txAlawtolinear( Datablock ) + + // Generate and return the OFDM symbols (txdataF) + txDataF + } + }else { + + } } void gen_IF4_dl_packet(IF4_dl_packet_t *dl_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type dl_packet->type = 0x080A; - dl_packet->sub_type = 0x0020; + dl_packet->sub_type = IF4_PDLFFT; // Leave reserved as it is dl_packet->rsvd = 0; @@ -135,7 +161,7 @@ void gen_IF4_dl_packet(IF4_dl_packet_t *dl_packet, eNB_rxtx_proc_t *proc) { void gen_IF4_ul_packet(IF4_ul_packet_t *ul_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type ul_packet->type = 0x080A; - ul_packet->sub_type = 0x0019; + ul_packet->sub_type = IF4_PULFFT; // Leave reserved as it is ul_packet->rsvd = 0; @@ -159,7 +185,7 @@ void gen_IF4_ul_packet(IF4_ul_packet_t *ul_packet, eNB_rxtx_proc_t *proc) { void gen_IF4_prach_packet(IF4_prach_packet_t *prach_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type prach_packet->type = 0x080A; - prach_packet->sub_type = 0x0021; + prach_packet->sub_type = IF4_PRACH; // Leave reserved as it is prach_packet->rsvd = 0; diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 819aca58d6..91a9e93d79 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -38,6 +38,10 @@ * \warning */ +#define IF4_PULFFT 0x0019 +#define IF4_PDLFFT 0x0020 +#define IF4_PRACH 0x0021 + /// IF4 Frame Status (32 bits) struct IF4_frame_status { /// Antenna Numbers @@ -175,4 +179,4 @@ void gen_IF4_prach_packet(IF4_prach_packet_t*, eNB_rxtx_proc_t*); void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*); -void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*); +void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, int*, int*); From 2cd848908646746dc8d76fabc5872ed16e3b0428 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 13 Jun 2016 18:50:05 +0200 Subject: [PATCH 053/340] starting to add run options for node_function --- openair1/SCHED/phy_procedures_lte_eNb.c | 32 ++++----- targets/RT/USER/lte-softmodem.c | 92 ++++++++++++++++++++----- 2 files changed, 92 insertions(+), 32 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 785001e8f4..0e1685d266 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2498,7 +2498,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; int frame = proc->frame_rx; - int symbol_number, symbol_mask, symbol_mask_full, prach_rx; + int symbol_number, symbol_mask, symbol_mask_full, prach_rx, packet_type; if (subframe==9) { subframe=0; @@ -2580,23 +2580,23 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl // get frame/subframe information from IF4 interface // timed loop (200 us) - symbol_mask = 0; - symbol_mask_full = (1<symbols_per_tti)-1; - if (is_prach_subframe(fp,frame,subframe)>0) - prach_rx = 0; - else - prach_rx = 1; + //symbol_mask = 0; + //symbol_mask_full = (1<symbols_per_tti)-1; + //if (is_prach_subframe(fp,frame,subframe)>0) + //prach_rx = 0; + //else + //prach_rx = 1; - do { - recv_IF4(eNB, proc, &packet_type, &symbol_number); - if (is_prach_subframe(fp,frame,subframe)>0 && packet_type == PRACH) { - // wake up prach_rx - prach_rx = 1; - } - if (packet_type == PULFFT) - symbol_mask = symbol_mask | (1<0 && packet_type == PRACH) { + //// wake up prach_rx + //prach_rx = 1; + //} + //if (packet_type == IF4_PULFFT) + //symbol_mask = symbol_mask | (1<properties[i]->rrh_gw_config[j].active == 1 ) { local_remote_radio = BBU_REMOTE_RADIO_HEAD; - eth_params = (eth_params_t*)malloc(sizeof(eth_params_t)); + eth_params = (eth_params_t*)malloc(sizeof(eth_params_t)); memset(eth_params, 0, sizeof(eth_params_t)); eth_params->local_if_name = enb_properties->properties[i]->rrh_gw_if_name; @@ -1120,7 +1141,6 @@ int main( int argc, char **argv ) uint16_t Nid_cell = 0; uint8_t cooperation_flag=0, abstraction_flag=0; uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; - eNB_func_t node_function=eNodeB_3GPP; #if defined (XFORMS) int ret; @@ -1458,13 +1478,20 @@ int main( int argc, char **argv ) else //FDD openair0_cfg[card].duplex_mode = duplex_mode_FDD; - + if (local_remote_radio == BBU_REMOTE_RADIO_HEAD) { openair0_cfg[card].remote_addr = eth_params->remote_addr; openair0_cfg[card].remote_port = eth_params->remote_port; openair0_cfg[card].my_addr = eth_params->my_addr; openair0_cfg[card].my_port = eth_params->my_port; - } + } + + //if (node_function == NGFI_RCC_IF4 || node_function == NGFI_RRU_IF4) { + //openair0_cfg[card].remote_addr = eth_params->remote_addr; + //openair0_cfg[card].remote_port = eth_params->remote_port; + //openair0_cfg[card].my_addr = eth_params->my_addr; + //openair0_cfg[card].my_port = eth_params->my_port; + //} printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx), @@ -1562,35 +1589,68 @@ int main( int argc, char **argv ) /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ openair0.transp_type = NONE_TP; openair0_cfg[0].log_level = glog_level; - + + // Legacy BBU - RRH init + //int returns=-1; + ///* BBU can have either a local or a remote radio head */ + //if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active - load library of radio head and initiate it + //if (mode!=loop_through_memory) { + //returns=openair0_device_load(&openair0, &openair0_cfg[0]); + //printf("openair0_device_init returns %d\n",returns); + //if (returns<0) { + //printf("Exiting, cannot initialize device\n"); + //exit(-1); + //} + //} + //else if (mode==loop_through_memory) { + //} + //} else { //remote radio head active - load library of transport protocol and initiate it + //if (mode!=loop_through_memory) { + //returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params); + //printf("openair0_transport_init returns %d\n",returns); + //if (returns<0) { + //printf("Exiting, cannot initialize transport protocol\n"); + //exit(-1); + //} + //} + //else if (mode==loop_through_memory) { + //} + //} + + //printf("Done\n"); + int returns=-1; - /* BBU can have either a local or a remote radio head */ - if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active - load library of radio head and initiate it + + // Load RF device and initialize + if (node_function == eNodeB_3GPP || node_function == NGFI_RRU_IF4) { if (mode!=loop_through_memory) { returns=openair0_device_load(&openair0, &openair0_cfg[0]); printf("openair0_device_init returns %d\n",returns); if (returns<0) { - printf("Exiting, cannot initialize device\n"); - exit(-1); + printf("Exiting, cannot initialize device\n"); + exit(-1); } } else if (mode==loop_through_memory) { } - } else { //remote radio head active - load library of transport protocol and initiate it + } + + // Load transport protocol and initialize + if (node_function == NGFI_RCC_IF4 || node_function == NGFI_RRU_IF4){ if (mode!=loop_through_memory) { returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params); printf("openair0_transport_init returns %d\n",returns); if (returns<0) { - printf("Exiting, cannot initialize transport protocol\n"); - exit(-1); + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); } } else if (mode==loop_through_memory) { } } - - printf("Done\n"); + printf("Done\n"); + mac_xface = malloc(sizeof(MAC_xface)); int eMBMS_active=0; From e48a34f68fc50c987a39bfb4f63a78abdbcbdbd7 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Tue, 14 Jun 2016 05:07:16 +0530 Subject: [PATCH 054/340] added alaw lut for +-16/+8/+-16 --- openair1/PHY/TOOLS/ALAW/alaw_lut.h | 47 ++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 openair1/PHY/TOOLS/ALAW/alaw_lut.h diff --git a/openair1/PHY/TOOLS/ALAW/alaw_lut.h b/openair1/PHY/TOOLS/ALAW/alaw_lut.h new file mode 100644 index 0000000000..bcb9bea790 --- /dev/null +++ b/openair1/PHY/TOOLS/ALAW/alaw_lut.h @@ -0,0 +1,47 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/*! \file PHY/TOOLS/ALAW/alaw_lut.h +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +// Linear to ALaw +// 16 bit signed integer to 8 bit unsigned integer +const uint8_t lin2alaw[65536] = {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170}; + +// ALaw to Linear +// 8 bit unsigned integer to 16 bit signed integer +const int16_t alaw2lin[256] = {-5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472, -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, -344, -328, -376, -360, -280, -264, -312, -296, -472, -456, -504, -488, -408, -392, -440, -424, -88, -72, -120, -104, -24, -8, -56, -40, -216, -200, -248, -232, -152, -136, -184, -168, -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, -688, -656, -752, -720, -560, -528, -624, -592, -944, -912, -1008, -976, -816, -784, -880, -848, 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296, 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56, 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976, 816, 784, 880, 848}; From a33bb694216a8073f03b3422bc9b568caba56e0e Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 14 Jun 2016 11:18:47 +0200 Subject: [PATCH 055/340] added multiple eth_params read --- targets/RT/USER/lte-softmodem.c | 61 ++++++++++++++++----------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index b8adf5b405..c92f28b332 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1009,39 +1009,38 @@ static void get_options (int argc, char **argv) AssertFatal (MAX_NUM_CCs == enb_properties->properties[i]->nb_cc, "lte-softmodem compiled with MAX_NUM_CCs=%d, but only %d CCs configured for eNB %d!", MAX_NUM_CCs, enb_properties->properties[i]->nb_cc, i); + eth_params = (eth_params_t*)malloc(enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t)); + memset(eth_params, 0, enb_properties->properties[i]->nb_rrh_gw * sizeof(eth_params_t)); for (j=0; jproperties[i]->nb_rrh_gw; j++) { - - if (enb_properties->properties[i]->rrh_gw_config[j].active == 1 ) { - local_remote_radio = BBU_REMOTE_RADIO_HEAD; - eth_params = (eth_params_t*)malloc(sizeof(eth_params_t)); - memset(eth_params, 0, sizeof(eth_params_t)); - - eth_params->local_if_name = enb_properties->properties[i]->rrh_gw_if_name; - eth_params->my_addr = enb_properties->properties[i]->rrh_gw_config[j].local_address; - eth_params->my_port = enb_properties->properties[i]->rrh_gw_config[j].local_port; - eth_params->remote_addr = enb_properties->properties[i]->rrh_gw_config[j].remote_address; - eth_params->remote_port = enb_properties->properties[i]->rrh_gw_config[j].remote_port; - eth_params->transp_preference = enb_properties->properties[i]->rrh_gw_config[j].raw; - eth_params->iq_txshift = enb_properties->properties[i]->rrh_gw_config[j].iq_txshift; - eth_params->tx_sample_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_sample_advance; - eth_params->tx_scheduling_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_scheduling_advance; - if (enb_properties->properties[i]->rrh_gw_config[j].exmimo == 1) { - eth_params->rf_preference = EXMIMO_DEV; - } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_b200 == 1) { - eth_params->rf_preference = USRP_B200_DEV; - } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_x300 == 1) { - eth_params->rf_preference = USRP_X300_DEV; - } else if (enb_properties->properties[i]->rrh_gw_config[j].bladerf == 1) { - eth_params->rf_preference = BLADERF_DEV; - } else if (enb_properties->properties[i]->rrh_gw_config[j].lmssdr == 1) { - //eth_params->rf_preference = LMSSDR_DEV; - } else { - eth_params->rf_preference = 0; - } - } else { - local_remote_radio = BBU_LOCAL_RADIO_HEAD; - } + + if (enb_properties->properties[i]->rrh_gw_config[j].active == 1 ) { + local_remote_radio = BBU_REMOTE_RADIO_HEAD; + (eth_params+j)->local_if_name = enb_properties->properties[i]->rrh_gw_if_name; + (eth_params+j)->my_addr = enb_properties->properties[i]->rrh_gw_config[j].local_address; + (eth_params+j)->my_port = enb_properties->properties[i]->rrh_gw_config[j].local_port; + (eth_params+j)->remote_addr = enb_properties->properties[i]->rrh_gw_config[j].remote_address; + (eth_params+j)->remote_port = enb_properties->properties[i]->rrh_gw_config[j].remote_port; + (eth_params+j)->transp_preference = enb_properties->properties[i]->rrh_gw_config[j].raw; + (eth_params+j)->iq_txshift = enb_properties->properties[i]->rrh_gw_config[j].iq_txshift; + (eth_params+j)->tx_sample_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_sample_advance; + (eth_params+j)->tx_scheduling_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_scheduling_advance; + if (enb_properties->properties[i]->rrh_gw_config[j].exmimo == 1) { + (eth_params+j)->rf_preference = EXMIMO_DEV; + } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_b200 == 1) { + (eth_params+j)->rf_preference = USRP_B200_DEV; + } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_x300 == 1) { + (eth_params+j)->rf_preference = USRP_X300_DEV; + } else if (enb_properties->properties[i]->rrh_gw_config[j].bladerf == 1) { + (eth_params+j)->rf_preference = BLADERF_DEV; + } else if (enb_properties->properties[i]->rrh_gw_config[j].lmssdr == 1) { + //(eth_params+j)->rf_preference = LMSSDR_DEV; + } else { + (eth_params+j)->rf_preference = 0; + } + } else { + local_remote_radio = BBU_LOCAL_RADIO_HEAD; + } } From 981655ccb1b96a94051ab236ba3f7e69d7829621 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 14 Jun 2016 17:05:07 +0200 Subject: [PATCH 056/340] integrate send_IF4 with alaw lut --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 69 +++++++++++++++----------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 4 +- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index cf41812c19..9c521f10ff 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -29,7 +29,7 @@ /*! \file PHY/LTE_TRANSPORT/if4_tools.c * \brief -* \author Mauricio Gunther, S. Sandeep Kumar, Raymond Knopp +* \author Fredrik Skretteberg, Tobias Schuster, Mauricio Gunther, S. Sandeep Kumar, Raymond Knopp * \date 2016 * \version 0.1 * \company Eurecom @@ -43,6 +43,7 @@ #include #else #include "PHY/LTE_TRANSPORT/if4_tools.h" +#include "PHY/TOOLS/ALAW/alaw_lut.h" #endif // Get device information @@ -50,11 +51,15 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { int frame = proc->frame_tx; int subframe = proc->subframe_tx; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - - uint16_t i; - - float_t data_block_length = 1200*(fp->ofdm_symbol_size/2048); - uint16_t *data_block = (uint16_t*)malloc(data_block_length*sizeof(uint16_t)); + int32_t **txdataF = eNB->common_vars.txdataF[0]; + + uint16_t symbol_id, element_id; + uint16_t db_fulllength = 12*fp->N_RB_DL; + uint16_t db_halflength = db_fulllength>>1; + int slotoffsetF = (subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + int blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + + int16_t *data_block = (int16_t*)malloc(db_fulllength*sizeof(int16_t)); // Caller: RCC - DL *** handle RRU case - UL and PRACH *** if (eNB->node_function == NGFI_RCC_IF4) { @@ -63,14 +68,17 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { dl_packet->data_block = data_block; - for(i=0; isymbols_per_tti; i++) { - - //Do compression of the two parts and generate data blocks + for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - //symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] - //data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); - //data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); - + // Do compression of the two parts and generate data blocks + for (element_id=0; element_id>16 + 32768 ]<<8; + + data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id])&0xffff + 32768 ]; + data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id])>>16 + 32768 ]<<8; + } + // Update information in generated packet dl_packet->frame_status.sym_num = i; @@ -82,7 +90,10 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { // dev->eth_dev.openair0_cfg->rx_num_channels, // 0)) < 0) { // perror("RCC : ETHERNET write"); - //} + //} + + slotoffsetF += fp->ofdm_symbol_size; + blockoffsetF += fp->ofdm_symbol_size; } }else { IF4_ul_packet_t *ul_packet = (IF4_ul_packet_t*)malloc(sizeof_IF4_ul_packet_t); @@ -90,32 +101,34 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { ul_packet->data_block = data_block; - for(i=0; isymbols_per_tti; i++) { - - //Do compression of the two parts and generate data blocks + for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - //symbol = eNB->common_vars.txdataF[0][0 /*antenna number*/][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)] - //data_block[j] = Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j -1])<<16 + Atan(symbol[fp->ofmd_symbol_size - NrOfNonZeroValues + j]); - //data_block[j+NrOfNonZeroValues] = Atan(subframe[i][j+1])<<16 + Atan(subframe[i][j+2]); - + // Do compression of the two parts and generate data blocks + for (element_id=0; element_id>16 + 32768 ]<<8; + + data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id])&0xffff + 32768 ]; + data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id])>>16 + 32768 ]<<8; + } + // Update information in generated packet ul_packet->frame_status.sym_num = i; // Write the packet(s) to the fronthaul + slotoffsetF += fp->ofdm_symbol_size; + blockoffsetF += fp->ofdm_symbol_size; } } } -void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { +void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, uint32_t *symbol_number) { // Caller: RRU - DL *** handle RCC case - UL and PRACH *** - if (eNB->node_function == NGFI_RRU_IF4) { - - for(i=0; isymbols_per_tti; i++) { // Read packet(s) from the fronthaul if (dev->eth_dev.trx_read_func (&dev->eth_dev, @@ -140,7 +153,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { void gen_IF4_dl_packet(IF4_dl_packet_t *dl_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type - dl_packet->type = 0x080A; + dl_packet->type = IF4_PACKET_TYPE; dl_packet->sub_type = IF4_PDLFFT; // Leave reserved as it is @@ -160,7 +173,7 @@ void gen_IF4_dl_packet(IF4_dl_packet_t *dl_packet, eNB_rxtx_proc_t *proc) { void gen_IF4_ul_packet(IF4_ul_packet_t *ul_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type - ul_packet->type = 0x080A; + ul_packet->type = IF4_PACKET_TYPE; ul_packet->sub_type = IF4_PULFFT; // Leave reserved as it is @@ -184,7 +197,7 @@ void gen_IF4_ul_packet(IF4_ul_packet_t *ul_packet, eNB_rxtx_proc_t *proc) { void gen_IF4_prach_packet(IF4_prach_packet_t *prach_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type - prach_packet->type = 0x080A; + prach_packet->type = IF4_PACKET_TYPE; prach_packet->sub_type = IF4_PRACH; // Leave reserved as it is diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 91a9e93d79..cadcb2f8c2 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -38,6 +38,8 @@ * \warning */ +/// Macro for IF4 packet type +#define IF4_PACKET_TYPE 0x080A #define IF4_PULFFT 0x0019 #define IF4_PDLFFT 0x0020 #define IF4_PRACH 0x0021 @@ -179,4 +181,4 @@ void gen_IF4_prach_packet(IF4_prach_packet_t*, eNB_rxtx_proc_t*); void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*); -void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, int*, int*); +void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t*, uint32_t*); From b70b2ac4c49a3af0b8ac3dbc08c56d1346c1f703 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Thu, 16 Jun 2016 11:32:48 +0200 Subject: [PATCH 057/340] add openair0 device to eNB struct and per CC_id changes --- openair1/PHY/defs.h | 7 ++++ targets/RT/USER/lte-softmodem.c | 74 ++++++++++++++++++++------------- 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 89fc1cd7ed..ed3ca5c251 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -139,6 +139,8 @@ static inline void* malloc16_clear( size_t size ) #include "PHY/LTE_TRANSPORT/defs.h" #include +#include "targets/ARCH/COMMON/common_lib.h" + #define NUM_DCI_MAX 32 #define NUMBER_OF_eNB_SECTORS_MAX 3 @@ -456,6 +458,11 @@ typedef struct PHY_VARS_eNB_s { SLIST_HEAD(ral_thresholds_gen_poll_enb_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX]; SLIST_HEAD(ral_thresholds_lte_poll_enb_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX]; #endif + + /// RF and Interface devices per CC + openair0_device rfdevice; + openair0_device ifdevice; + // *** Handle spatially distributed MIMO antenna ports } PHY_VARS_eNB; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index c92f28b332..8a2d8d9360 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -152,8 +152,6 @@ int sync_var=-1; //!< protected by mutex \ref sync_mutex. static pthread_t forms_thread; //xforms #endif -openair0_device openair0; - uint16_t runtime_phy_rx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] uint16_t runtime_phy_tx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] @@ -1580,15 +1578,27 @@ int main( int argc, char **argv ) } LOG_I(HW, "CPU Affinity of main() function is... %s\n", cpu_affinity); #endif - - /* device host type is set*/ - openair0.host_type = BBU_HOST; - /* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */ - openair0.type = NONE_DEV; - /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ - openair0.transp_type = NONE_TP; + openair0_cfg[0].log_level = glog_level; + for (CC_id=0; CC_idrfdevice.host_type = BBU_HOST; + PHY_vars_eNB_g[0][CC_id]->rfdevice.type = NONE_DEV; + PHY_vars_eNB_g[0][CC_id]->rfdevice.transp_type = NONE_TP; + + PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = BBU_HOST; + PHY_vars_eNB_g[0][CC_id]->ifdevice.type = NONE_DEV; + PHY_vars_eNB_g[0][CC_id]->ifdevice.transp_type = NONE_TP; + } + + /* device host type is set*/ + //openair0.host_type = BBU_HOST; + /* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */ + //openair0.type = NONE_DEV; + /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ + //openair0.transp_type = NONE_TP; + //openair0_cfg[0].log_level = glog_level; + // Legacy BBU - RRH init //int returns=-1; ///* BBU can have either a local or a remote radio head */ @@ -1619,36 +1629,40 @@ int main( int argc, char **argv ) //printf("Done\n"); int returns=-1; - + + // Handle spatially distributed MIMO antenna ports // Load RF device and initialize if (node_function == eNodeB_3GPP || node_function == NGFI_RRU_IF4) { - if (mode!=loop_through_memory) { - returns=openair0_device_load(&openair0, &openair0_cfg[0]); - printf("openair0_device_init returns %d\n",returns); - if (returns<0) { - printf("Exiting, cannot initialize device\n"); - exit(-1); + for (CC_id=0; CC_idrfdevice), &openair0_cfg[0]); + printf("openair0_device_init returns %d for CC_id %d\n",returns,CC_id); + if (returns<0) { + printf("Exiting, cannot initialize device\n"); + exit(-1); + } } - } - else if (mode==loop_through_memory) { + else if (mode==loop_through_memory) { + } } } // Load transport protocol and initialize if (node_function == NGFI_RCC_IF4 || node_function == NGFI_RRU_IF4){ - if (mode!=loop_through_memory) { - returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params); - printf("openair0_transport_init returns %d\n",returns); - if (returns<0) { - printf("Exiting, cannot initialize transport protocol\n"); - exit(-1); + for (CC_id=0; CC_idifdevice), &openair0_cfg[0], (eth_params+CC_id)); + printf("openair0_transport_init returns %d for CC_id %d\n",returns,CC_id); + if (returns<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } } + else if (mode==loop_through_memory) { + } } - else if (mode==loop_through_memory) { - } - } - printf("Done\n"); + printf("Done initializing RF and IF devices\n"); mac_xface = malloc(sizeof(MAC_xface)); @@ -1819,7 +1833,7 @@ int main( int argc, char **argv ) - +// *** Handle per CC_id openair0 #ifndef USRP_DEBUG if ((UE_flag==1) && (mode!=loop_through_memory)) if (openair0.trx_start_func(&openair0) != 0 ) @@ -1889,7 +1903,7 @@ int main( int argc, char **argv ) pthread_cond_destroy(&sync_cond); pthread_mutex_destroy(&sync_mutex); - + // *** Handle per CC_id openair0 openair0.trx_end_func(&openair0); if (ouput_vcd) From dd6e1f9d87020e31222abf4e55da441cd5bc19ab Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Thu, 16 Jun 2016 12:45:08 +0200 Subject: [PATCH 058/340] fixes for if4_tools for compilation --- cmake_targets/CMakeLists.txt | 3 +- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 49 +++++++++++++------------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 8 +++-- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5eca2e8d41..2101009016 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -138,7 +138,7 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") endif() if (CPUINFO MATCHES "sse4_1") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mavx2") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1") endif() if (CPUINFO MATCHES "ssse3") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3") @@ -959,6 +959,7 @@ add_boolean_option(OAI_NW_DRIVER_USE_NETLINK True "????") ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/print_stats.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/initial_sync.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 9c521f10ff..06e057cdf0 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -42,21 +42,22 @@ #include "if4_tools.h" #include #else +#include +#include "PHY/defs.h" + #include "PHY/LTE_TRANSPORT/if4_tools.h" #include "PHY/TOOLS/ALAW/alaw_lut.h" #endif // Get device information void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { - int frame = proc->frame_tx; - int subframe = proc->subframe_tx; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; uint16_t symbol_id, element_id; uint16_t db_fulllength = 12*fp->N_RB_DL; uint16_t db_halflength = db_fulllength>>1; - int slotoffsetF = (subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + int slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; int blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; int16_t *data_block = (int16_t*)malloc(db_fulllength*sizeof(int16_t)); @@ -72,15 +73,15 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { // Do compression of the two parts and generate data blocks for (element_id=0; element_id>16 + 32768 ]<<8; + data_block[element_id] = lin2alaw[ (txdataF[0][blockoffsetF+element_id] & 0xffff) + 32768 ]; + data_block[element_id] |= lin2alaw[ (txdataF[0][blockoffsetF+element_id]>>16) + 32768 ]<<8; - data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id])&0xffff + 32768 ]; - data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id])>>16 + 32768 ]<<8; + data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; + data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; } // Update information in generated packet - dl_packet->frame_status.sym_num = i; + dl_packet->frame_status.sym_num = symbol_id; // Write the packet(s) to the fronthaul //if ((bytes_sent = dev->eth_dev.trx_write_func (&dev->eth_dev, @@ -105,15 +106,15 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { // Do compression of the two parts and generate data blocks for (element_id=0; element_id>16 + 32768 ]<<8; + data_block[element_id] = lin2alaw[ (txdataF[0][blockoffsetF+element_id] & 0xffff) + 32768 ]; + data_block[element_id] |= lin2alaw[ (txdataF[0][blockoffsetF+element_id]>>16) + 32768 ]<<8; - data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id])&0xffff + 32768 ]; - data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id])>>16 + 32768 ]<<8; + data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; + data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; } // Update information in generated packet - ul_packet->frame_status.sym_num = i; + ul_packet->frame_status.sym_num = symbol_id; // Write the packet(s) to the fronthaul @@ -129,23 +130,23 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u // Caller: RRU - DL *** handle RCC case - UL and PRACH *** if (eNB->node_function == NGFI_RRU_IF4) { - for(i=0; isymbols_per_tti; i++) { +// for(i=0; isymbols_per_tti; i++) { // Read packet(s) from the fronthaul - if (dev->eth_dev.trx_read_func (&dev->eth_dev, - timestamp_rx, - rx_eNB, - spp_eth, - dev->eth_dev.openair0_cfg->rx_num_channels - ) < 0) { - perror("RRU : ETHERNET read"); - } +// if (dev->eth_dev.trx_read_func (&dev->eth_dev, +// timestamp_rx, +// rx_eNB, +// spp_eth, +// dev->eth_dev.openair0_cfg->rx_num_channels +// ) < 0) { +// perror("RRU : ETHERNET read"); +// } // Apply reverse processing - decompression // txAlawtolinear( Datablock ) // Generate and return the OFDM symbols (txdataF) - txDataF - } + //txDataF + //} }else { } diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index cadcb2f8c2..d7a0461169 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -38,6 +38,8 @@ * \warning */ +#include + /// Macro for IF4 packet type #define IF4_PACKET_TYPE 0x080A #define IF4_PULFFT 0x0019 @@ -105,7 +107,7 @@ struct IF4_dl_packet { /// Frame Status IF4_frame_status_t frame_status; /// Data Blocks - uint16_t *data_block; + int16_t *data_block; /// Frame Check Sequence uint32_t fcs; }; @@ -143,7 +145,7 @@ struct IF4_ul_packet { /// Gain 7 IF4_gain_t gain7; /// Data Blocks - uint16_t *data_block; + int16_t *data_block; /// Frame Check Sequence uint32_t fcs; }; @@ -165,7 +167,7 @@ struct IF4_prach_packet { /// LTE Prach Configuration IF4_lte_prach_conf_t prach_conf; /// Prach Data Block (one antenna) - uint16_t *data_block; + int16_t *data_block; /// Frame Check Sequence uint32_t fcs; }; From c76951a31904fbe73d04366cc3457f9ee13fd450 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Thu, 16 Jun 2016 12:49:15 +0200 Subject: [PATCH 059/340] handle per cc device for some tx/rx cases --- openair1/SCHED/phy_procedures_lte_eNb.c | 5 +++-- targets/RT/USER/lte-enb.c | 21 ++++++++++++++++----- targets/RT/USER/lte-softmodem.c | 10 +++++++--- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 0e1685d266..a42d01fd32 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -73,7 +73,8 @@ void exit_fun(const char* s); extern int exit_openair; -extern openair0_device openair0; +// Fix per CC openair rf/if device update +// extern openair0_device openair0; unsigned char dlsch_input_buffer[2700] __attribute__ ((aligned(32))); int eNB_sync_buffer0[640*6] __attribute__ ((aligned(32))); @@ -2522,7 +2523,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - rxs = openair0.trx_read_func(&openair0, + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, &proc->timestamp_rx, rxp, fp->samples_per_tti, diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 373a13e150..aa30f0874b 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -120,8 +120,8 @@ struct timing_info_t { unsigned int n_samples; } timing_info; - -extern openair0_device openair0; +// Fix per CC openair rf/if device update +// extern openair0_device openair0; #if defined(ENABLE_ITTI) extern volatile int start_eNB; @@ -524,7 +524,7 @@ static void* eNB_thread_rxtx( void* param ) for (i=0; iframe_parms.nb_antennas_tx; i++) txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; // if symb_written < spp ==> error - openair0.trx_write_func(&openair0, + PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), txp, PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, @@ -741,8 +741,19 @@ static void* eNB_thread_rx_common( void* param ) #if defined(ENABLE_ITTI) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif - if (openair0.trx_start_func(&openair0) != 0 ) - LOG_E(HW,"Could not start the device\n"); + + // Start RF device for this CC + if (eNB->node_function == eNodeB_3GPP || eNB->node_function == NGFI_RRU_IF4) { + if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) + LOG_E(HW,"Could not start the RF device\n"); + } + + // Start IF device for this CC + if (eNB->node_function == NGFI_RCC_IF4 || eNB->node_function == NGFI_RRU_IF4) { + if (eNB->ifdevice.trx_start_func(&eNB->ifdevice) != 0 ) + LOG_E(HW,"Could not start the IF device\n"); + } + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 8a2d8d9360..97feaed919 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -280,6 +280,9 @@ eth_params_t *eth_params; openair0_config_t openair0_cfg[MAX_CARDS]; +// Change to openair_global to handle UE +openair0_device openair0; + double cpuf; char uecap_xer[1024],uecap_xer_in=0; @@ -1592,11 +1595,11 @@ int main( int argc, char **argv ) } /* device host type is set*/ - //openair0.host_type = BBU_HOST; + openair0.host_type = BBU_HOST; /* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */ - //openair0.type = NONE_DEV; + openair0.type = NONE_DEV; /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ - //openair0.transp_type = NONE_TP; + openair0.transp_type = NONE_TP; //openair0_cfg[0].log_level = glog_level; // Legacy BBU - RRH init @@ -1661,6 +1664,7 @@ int main( int argc, char **argv ) else if (mode==loop_through_memory) { } } + } printf("Done initializing RF and IF devices\n"); From c5745c16226385fa4771eb3e60daa6cd5d6ea43b Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Thu, 16 Jun 2016 17:44:05 +0200 Subject: [PATCH 060/340] highlight send/recv if4 - midsave to swich pc --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 33 +++++---- openair1/PHY/LTE_TRANSPORT/prach.c | 6 +- openair1/SCHED/phy_procedures_lte_eNb.c | 32 ++------- targets/RT/USER/lte-enb.c | 89 ++++++++++++++----------- targets/RT/USER/lte-softmodem.c | 4 +- 5 files changed, 78 insertions(+), 86 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 06e057cdf0..a8a27b2c09 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -38,16 +38,11 @@ * \warning */ -#ifndef USER_MODE -#include "if4_tools.h" #include -#else -#include -#include "PHY/defs.h" +#include "PHY/defs.h" #include "PHY/LTE_TRANSPORT/if4_tools.h" #include "PHY/TOOLS/ALAW/alaw_lut.h" -#endif // Get device information void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { @@ -70,6 +65,8 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { dl_packet->data_block = data_block; for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { + + printf("\n Send IF4 for frame %d, subframe %d and symbol %d\n", proc->frame_tx, proc->subframe_tx, symbol_id); // Do compression of the two parts and generate data blocks for (element_id=0; element_idframe_status.sym_num = symbol_id; // Write the packet(s) to the fronthaul - //if ((bytes_sent = dev->eth_dev.trx_write_func (&dev->eth_dev, - // timestamp_rx, - // rx_eNB, - // spp_eth, - // dev->eth_dev.openair0_cfg->rx_num_channels, - // 0)) < 0) { - // perror("RCC : ETHERNET write"); - //} + // if ((bytes_sent = eNB->ifdevice.trx_write_func(&eNB->ifdevice, + // (proc->timestamp_tx-eNB->ifdevice.openair0_cfg.tx_sample_advance), + // dl_packet, + // eNB->frame_parms.samples_per_tti, + // eNB->frame_parms.nb_antennas_tx, + // 0)) < 0) { + // perror("RCC : ETHERNET write"); + //} slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; @@ -104,10 +101,10 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - // Do compression of the two parts and generate data blocks + // Do compression of the two parts and generate data blocks - rxdataF for (element_id=0; element_id>16) + 32768 ]<<8; + data_block[element_id] = lin2alaw[ (rxdataF[0][blockoffsetF+element_id] & 0xffff) + 32768 ]; + data_block[element_id] |= lin2alaw[ (rxdataF[0][blockoffsetF+element_id]>>16) + 32768 ]<<8; data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; @@ -130,6 +127,8 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u // Caller: RRU - DL *** handle RCC case - UL and PRACH *** if (eNB->node_function == NGFI_RRU_IF4) { + printf("\n Recv IF4 for frame %d, subframe %d and symbol %d\n", proc->frame_tx, proc->subframe_tx, symbol_id); + // for(i=0; isymbols_per_tti; i++) { // Read packet(s) from the fronthaul // if (dev->eth_dev.trx_read_func (&dev->eth_dev, diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 0f806e2ea1..555685b23e 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1269,16 +1269,16 @@ void rx_prach(PHY_VARS_eNB *eNB, } if (eNB->node_function == NGFI_RRU_IF4) { - //send prachF to RCC + /// **** send_IF4 of prachF to RCC **** /// return; } + // in case of RCC and prach received rx_thread wakes up prach //else if (eNB->node_function == NGFI_RCC_IF4) { - //wait for prachF from RRU and continue with PRACH processing + // wait for prachF from RRU and continue with PRACH processing //} - // here onwards is for eNodeB_3GPP or NGFI_RCC_IF4 preamble_offset_old = 99; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index a42d01fd32..087404d10a 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1430,24 +1430,6 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, #endif - // Clean up split point *** RRU only function to recv and do_OFDM_mod *** - if (eNB->node_function == eNodeB_3GPP) { - // Add above to IF4 split - // do_OFDM_mod - - }else if (eNB->node_function == NGFI_RCC_IF4) { - //send_IF4(eNB,subframe<<1); - //send_IF4(eNB,(subframe<<1)+1); - - }else if (eNB->node_function == NGFI_RRU_IF4) { // => acquisition from RCC (IF4) - // get frame/subframe information from IF4 interface - - //recv_IF4(eNB,subframe<<1); - //recv_IF4(eNB,1+(subframe<<1)); - - //do_OFDM_mod - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0); stop_meas(&eNB->phy_proc_tx); @@ -2572,12 +2554,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); if (eNB->node_function == NGFI_RRU_IF4) { - //send_IF4(eNB,subframe<<1); - //send_IF4(eNB,(subframe<<1)+1); + /// **** send_IF4 of rxdataF to RCC **** /// + /// Handle routing to prach thread for sending prach } } - else if (eNB->node_function == NGFI_RCC_IF4) { // => acquisition from RRU (IF4) + else if (eNB->node_function == NGFI_RCC_IF4) { + /// **** recv_IF4 of rxdataF from RRU **** /// + /// **** recv_IF4 of prachF from RRU **** /// // get frame/subframe information from IF4 interface // timed loop (200 us) @@ -2598,11 +2582,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl //symbol_mask = symbol_mask | (1<CC_id]->node_function != NGFI_RCC_IF4) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); - do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); - /* - short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.samples_per_tti]; - int i; - for (i=0;iCC_id]->frame_parms.samples_per_tti*2;i+=8) { - txdata[i] = 2047; - txdata[i+1] = 0; - txdata[i+2] = 0; - txdata[i+3] = 2047; - txdata[i+4] = -2047; - txdata[i+5] = 0; - txdata[i+6] = 0; - txdata[i+7] = -2047; } - */ + // eNodeB_3GPP and RRU create txdata and write to RF device + if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); + do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); + /* + short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.samples_per_tti]; + int i; + for (i=0;iCC_id]->frame_parms.samples_per_tti*2;i+=8) { + txdata[i] = 2047; + txdata[i+1] = 0; + txdata[i+2] = 0; + txdata[i+3] = 2047; + txdata[i+4] = -2047; + txdata[i+5] = 0; + txdata[i+6] = 0; + txdata[i+7] = -2047; } + */ - // Transmit TX buffer based on timestamp from RX + // Transmit TX buffer based on timestamp from RX + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + int i; + for (i=0; iframe_parms.nb_antennas_tx; i++) + txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; + // if symb_written < spp ==> error + PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, + (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), + txp, + PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, + PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, + 1); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - int i; - for (i=0; iframe_parms.nb_antennas_tx; i++) - txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; - // if symb_written < spp ==> error - PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, - (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), - txp, - PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, - PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, - 1); - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - } + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + + } else { // RCC sends the txdataF using send_IF4 function + + /// **** send_IF4 of txdataF to RRU **** /// + //send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc); + + } if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc\n"); @@ -743,13 +756,13 @@ static void* eNB_thread_rx_common( void* param ) #endif // Start RF device for this CC - if (eNB->node_function == eNodeB_3GPP || eNB->node_function == NGFI_RRU_IF4) { + if (eNB->node_function != NGFI_RCC_IF4) { if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) LOG_E(HW,"Could not start the RF device\n"); } // Start IF device for this CC - if (eNB->node_function == NGFI_RCC_IF4 || eNB->node_function == NGFI_RRU_IF4) { + if (eNB->node_function != eNodeB_3GPP) { if (eNB->ifdevice.trx_start_func(&eNB->ifdevice) != 0 ) LOG_E(HW,"Could not start the IF device\n"); } @@ -769,7 +782,7 @@ static void* eNB_thread_rx_common( void* param ) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); // this spawns the prach inside and updates the frame and subframe counters phy_procedures_eNB_common_RX(eNB, 0); - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 97feaed919..efc2291dde 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1635,7 +1635,7 @@ int main( int argc, char **argv ) // Handle spatially distributed MIMO antenna ports // Load RF device and initialize - if (node_function == eNodeB_3GPP || node_function == NGFI_RRU_IF4) { + if (node_function != NGFI_RCC_IF4) { for (CC_id=0; CC_idrfdevice), &openair0_cfg[0]); @@ -1651,7 +1651,7 @@ int main( int argc, char **argv ) } // Load transport protocol and initialize - if (node_function == NGFI_RCC_IF4 || node_function == NGFI_RRU_IF4){ + if (node_function != eNodeB_3GPP){ for (CC_id=0; CC_idifdevice), &openair0_cfg[0], (eth_params+CC_id)); From d7781f7a315e2d3558329f095597bd8d94b2f13e Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Fri, 17 Jun 2016 01:47:42 +0530 Subject: [PATCH 061/340] asthetic fixes for lte-enb.c --- targets/RT/USER/lte-enb.c | 632 +++++++++++++++++--------------------- 1 file changed, 285 insertions(+), 347 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 3afdb15ef1..918c1f82ee 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -108,10 +108,6 @@ unsigned short config_frames[4] = {2,9,11,13}; # endif #endif - - - - //#define DEBUG_THREADS 1 //#define USRP_DEBUG 1 @@ -158,15 +154,14 @@ static struct { volatile uint8_t phy_proc_CC_id; } sync_phy_proc; - void exit_fun(const char* s); void init_eNB(eNB_func_t node_function); void stop_eNB(void); -void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) -{ +void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { + unsigned int aa,slot_offset, slot_offset_F; int dummy_tx_b[7680*4] __attribute__((aligned(32))); int i,j, tx_offset; @@ -183,7 +178,6 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) ((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_S))) { // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); - for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (phy_vars_eNB->frame_parms.Ncp == EXTENDED) { PHY_ofdm_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F], @@ -204,7 +198,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) 7, &(phy_vars_eNB->frame_parms)); // if S-subframe generate first slot only - if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL) + if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL) normal_prefix_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], dummy_tx_b+(phy_vars_eNB->frame_parms.samples_per_tti>>1), 7, @@ -237,9 +231,8 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) txdata[j++] = ((int16_t*)dummy_tx_b)[i]<(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) { - tx_offset = (int)slot_offset+time_offset[aa]; txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset]; len2 = -tx_offset+LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; @@ -260,7 +253,6 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) } } - // if S-subframe switch to RX in second subframe /* if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) { @@ -270,34 +262,35 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) } */ if ((((phy_vars_eNB->frame_parms.tdd_config==0) || - (phy_vars_eNB->frame_parms.tdd_config==1) || - (phy_vars_eNB->frame_parms.tdd_config==2) || - (phy_vars_eNB->frame_parms.tdd_config==6)) && - (subframe==0)) || (subframe==5)) { + (phy_vars_eNB->frame_parms.tdd_config==1) || + (phy_vars_eNB->frame_parms.tdd_config==2) || + (phy_vars_eNB->frame_parms.tdd_config==6)) && + (subframe==0)) || (subframe==5)) { // turn on tx switch N_TA_offset before //LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,phy_vars_eNB->N_TA_offset,slot_offset); for (i=0; iN_TA_offset; i++) { - tx_offset = (int)slot_offset+time_offset[aa]+i-phy_vars_eNB->N_TA_offset/2; - if (tx_offset<0) - tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; + tx_offset = (int)slot_offset+time_offset[aa]+i-phy_vars_eNB->N_TA_offset/2; + if (tx_offset<0) + tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; - if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) - tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; + if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) + tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; - phy_vars_eNB->common_vars.txdata[0][aa][tx_offset] = 0x00000000; + phy_vars_eNB->common_vars.txdata[0][aa][tx_offset] = 0x00000000; } } } } } + /*! * \brief The RX UE-specific and TX thread of eNB. * \param param is a \ref eNB_proc_t structure which contains the info what to process. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -static void* eNB_thread_rxtx( void* param ) -{ +static void* eNB_thread_rxtx( void* param ) { + static int eNB_thread_rxtx_status; eNB_rxtx_proc_t *proc = (eNB_rxtx_proc_t*)param; @@ -365,56 +358,47 @@ static void* eNB_thread_rxtx( void* param ) #endif //CPU_AFFINITY /* Check the actual affinity mask assigned to the thread */ - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { + if (s != 0) { perror( "pthread_getaffinity_np"); exit_fun("Error getting processor affinity "); } memset(cpu_affinity,0,sizeof(cpu_affinity)); for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } + if (CPU_ISSET(j, &cpuset)) { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } - memset(&sparam, 0 , sizeof (sparam)); + memset(&sparam, 0, sizeof(sparam)); sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; policy = SCHED_FIFO ; s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } + if (s != 0) { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); + if (s != 0) { + perror("pthread_getschedparam : "); + exit_fun("Error getting thread priority"); + } - } - - LOG_I( HW, "[SCHED][eNB] TX thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), + LOG_I(HW, "[SCHED][eNB] TX thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : "???", sparam.sched_priority, cpu_affinity ); - #endif //LOW_LATENCY - mlockall(MCL_CURRENT | MCL_FUTURE); - while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { @@ -462,6 +446,7 @@ static void* eNB_thread_rxtx( void* param ) exit_fun("nothing to add"); break; } + // wait for our turn or oai_exit while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) { pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx, @@ -473,28 +458,27 @@ static void* eNB_thread_rxtx( void* param ) exit_fun("nothing to add"); } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_ENB, proc->subframe_tx ); - if (oai_exit) - break; + + if (oai_exit) break; + if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { - phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay, NULL ); - - /* we're done, let the next one proceed */ - if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc\n"); - exit_fun("nothing to add"); - break; - } - sync_phy_proc.phy_proc_CC_id++; - sync_phy_proc.phy_proc_CC_id %= MAX_NUM_CCs; - pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); - if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc\n"); - exit_fun("nothing to add"); - break; + phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay, NULL ); + + /* we're done, let the next one proceed */ + if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc\n"); + exit_fun("nothing to add"); + break; + } + sync_phy_proc.phy_proc_CC_id++; + sync_phy_proc.phy_proc_CC_id %= MAX_NUM_CCs; + pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); + if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc\n"); + exit_fun("nothing to add"); + break; } } else { @@ -504,53 +488,51 @@ static void* eNB_thread_rxtx( void* param ) } } - // eNodeB_3GPP and RRU create txdata and write to RF device - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); - do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); - /* - short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.samples_per_tti]; - int i; - for (i=0;iCC_id]->frame_parms.samples_per_tti*2;i+=8) { - txdata[i] = 2047; - txdata[i+1] = 0; - txdata[i+2] = 0; - txdata[i+3] = 2047; - txdata[i+4] = -2047; - txdata[i+5] = 0; - txdata[i+6] = 0; - txdata[i+7] = -2047; } - */ - - - // Transmit TX buffer based on timestamp from RX + // eNodeB_3GPP and RRU create txdata and write to RF device + if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); + do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - int i; - for (i=0; iframe_parms.nb_antennas_tx; i++) - txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; - // if symb_written < spp ==> error - PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, - (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), - txp, - PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, - PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, - 1); + /* + short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.samples_per_tti]; + int i; + for (i=0;iCC_id]->frame_parms.samples_per_tti*2;i+=8) { + txdata[i] = 2047; + txdata[i+1] = 0; + txdata[i+2] = 0; + txdata[i+3] = 2047; + txdata[i+4] = -2047; + txdata[i+5] = 0; + txdata[i+6] = 0; + txdata[i+7] = -2047; } + */ + + // Transmit TX buffer based on timestamp from RX + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + int i; + for (i=0; iframe_parms.nb_antennas_tx; i++) + txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; + // if symb_written < spp ==> error + PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, + (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), + txp, + PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, + PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, + 1); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + } else { + + /// **** send_IF4 of txdataF to RRU **** /// + //send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); - - } else { // RCC sends the txdataF using send_IF4 function - - /// **** send_IF4 of txdataF to RRU **** /// - //send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc); - - } + } if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc\n"); @@ -567,19 +549,18 @@ static void* eNB_thread_rxtx( void* param ) } stop_meas( &softmodem_stats_rxtx_sf ); + #ifdef LOWLATENCY - if (opp_enabled){ - if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); + if (opp_enabled) { + if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); } } #endif + print_meas_now(&softmodem_stats_rxtx_sf,"eNB_TX_SF",tx_time_file); - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); #ifdef DEBUG_THREADS @@ -591,13 +572,11 @@ static void* eNB_thread_rxtx( void* param ) } #if defined(ENABLE_ITTI) -static void wait_system_ready (char *message, volatile int *start_flag) - - /* Wait for eNB application initialization to be complete (eNB registration to MME) */ -{ +/* Wait for eNB application initialization to be complete (eNB registration to MME) */ +static void wait_system_ready (char *message, volatile int *start_flag) { + static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", - " ....", " ...", " ..", " .", " " - }; + " ....", " ...", " ..", " .", " "}; int i = 0; while ((!oai_exit) && (*start_flag == 0)) { @@ -609,16 +588,16 @@ static void wait_system_ready (char *message, volatile int *start_flag) LOG_D(EMU,"\n"); } - #endif + /*! * \brief The RX common thread of eNB. * \param param is a \ref eNB_proc_t structure which contains the info what to process. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -static void* eNB_thread_rx_common( void* param ) -{ +static void* eNB_thread_rx_common( void* param ) { + static int eNB_thread_rx_status; eNB_proc_t *proc = (eNB_proc_t*)param; @@ -629,7 +608,7 @@ static void* eNB_thread_rx_common( void* param ) char rx_time_name[101]; //int i; - if (opp_enabled == 1){ + if (opp_enabled == 1) { snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf", "eNB"); rx_time_file = fopen(rx_time_name,"w"); } @@ -674,14 +653,12 @@ static void* eNB_thread_rx_common( void* param ) /* Set CPU Affinity only if number of CPUs >2 */ CPU_ZERO(&cpuset); #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { + if (get_nprocs() >2) { for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); + CPU_SET(j, &cpuset); s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { + if (s != 0) { perror( "pthread_setaffinity_np"); exit_fun (" Error setting processor affinity :"); } @@ -690,66 +667,58 @@ static void* eNB_thread_rx_common( void* param ) /* Check the actual affinity mask assigned to the thread */ s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror ("pthread_getaffinity_np"); - exit_fun (" Error getting processor affinity :"); + if (s != 0) { + perror ("pthread_getaffinity_np"); + exit_fun (" Error getting processor affinity :"); } memset(cpu_affinity,0, sizeof(cpu_affinity)); for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - + if (CPU_ISSET(j, &cpuset)) { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } memset(&sparam, 0 , sizeof (sparam)); sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); policy = SCHED_FIFO ; s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } + if (s != 0) { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } memset(&sparam, 0 , sizeof (sparam)); s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam"); - exit_fun("Error getting thread priority"); - } + if (s != 0) { + perror("pthread_getschedparam"); + exit_fun("Error getting thread priority"); + } - - LOG_I( HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), + LOG_I(HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : "???", sparam.sched_priority, cpu_affinity); - - + #endif // LOWLATENCY - mlockall(MCL_CURRENT | MCL_FUTURE); + mlockall(MCL_CURRENT | MCL_FUTURE); + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads + printf( "waiting for sync (eNB_thread_rx_common)\n"); + pthread_mutex_lock( &sync_mutex ); - // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads - printf( "waiting for sync (eNB_thread_rx_common)\n"); - pthread_mutex_lock( &sync_mutex ); - - while (sync_var<0) - pthread_cond_wait( &sync_cond, &sync_mutex ); + while (sync_var<0) + pthread_cond_wait( &sync_cond, &sync_mutex ); - pthread_mutex_unlock(&sync_mutex); + pthread_mutex_unlock(&sync_mutex); - printf( "got sync (eNB_thread)\n" ); + printf( "got sync (eNB_thread)\n" ); #if defined(ENABLE_ITTI) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); @@ -767,96 +736,90 @@ static void* eNB_thread_rx_common( void* param ) LOG_E(HW,"Could not start the IF device\n"); } - // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices - while (!oai_exit) { + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices + while (!oai_exit) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); + start_meas( &softmodem_stats_rx_sf ); + if (oai_exit) break; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, 0 ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); - start_meas( &softmodem_stats_rx_sf ); - - if (oai_exit) break; - - if ((((fp->frame_type == TDD )&&(subframe_select(fp,proc->subframe_rx)==SF_UL)) || - (fp->frame_type == FDD))) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); - // this spawns the prach inside and updates the frame and subframe counters - phy_procedures_eNB_common_RX(eNB, 0); - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); - } + if ((((fp->frame_type == TDD )&&(subframe_select(fp,proc->subframe_rx)==SF_UL)) || + (fp->frame_type == FDD))) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); + // this spawns the prach inside and updates the frame and subframe counters + phy_procedures_eNB_common_RX(eNB, 0); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); + } - // choose even or odd thread for RXn-TXnp4 processing - eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[proc->subframe_rx&1]; + // choose even or odd thread for RXn-TXnp4 processing + eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[proc->subframe_rx&1]; - // wake up TX for subframe n+4 - // lock the TX mutex and make sure the thread is ready - if (pthread_mutex_lock(&proc_rxtx->mutex_rxtx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc_rxtx->instance_cnt_rxtx ); - exit_fun( "error locking mutex_rxtx" ); - break; - } - int cnt_rxtx = ++proc_rxtx->instance_cnt_rxtx; - // We have just received and processed the common part of a subframe, say n. - // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired - // transmitted timestamp of the next TX slot (first). - // The last (TS_rx mod samples_pexr_frame) was n*samples_per_tti, - // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, - // and proc->subframe_tx = proc->subframe_rx+3 - proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); - proc_rxtx->frame_rx = proc->frame_rx; - proc_rxtx->subframe_rx = proc->subframe_rx; - proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > 5) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; - proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + 4)%10; + // wake up TX for subframe n+4 + // lock the TX mutex and make sure the thread is ready + if (pthread_mutex_lock(&proc_rxtx->mutex_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc_rxtx->instance_cnt_rxtx ); + exit_fun( "error locking mutex_rxtx" ); + break; + } + int cnt_rxtx = ++proc_rxtx->instance_cnt_rxtx; + // We have just received and processed the common part of a subframe, say n. + // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired + // transmitted timestamp of the next TX slot (first). + // The last (TS_rx mod samples_pexr_frame) was n*samples_per_tti, + // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+3 + proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > 5) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; + proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + 4)%10; - pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); + pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); - if (cnt_rxtx == 0){ - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, cnt_rxtx ); - exit_fun( "TX thread busy" ); - break; - } + if (cnt_rxtx == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, cnt_rxtx ); + exit_fun( "TX thread busy" ); + break; + } - stop_meas( &softmodem_stats_rxtx_sf ); + stop_meas( &softmodem_stats_rxtx_sf ); + #ifdef LOWLATENCY - if (opp_enabled){ - if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); - } - } + if (opp_enabled){ + if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); + } + } #endif // LOWLATENCY - print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); - - } - + print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); + } #ifdef DEBUG_THREADS - printf( "Exiting eNB thread RXn-TXnp4\n"); + printf( "Exiting eNB thread RXn-TXnp4\n"); #endif - eNB_thread_rx_status = 0; - return &eNB_thread_rx_status; + eNB_thread_rx_status = 0; + return &eNB_thread_rx_status; } - /*! * \brief The prach receive thread of eNB. * \param param is a \ref eNB_proc_t structure which contains the info what to process. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -static void* eNB_thread_prach( void* param ) -{ +static void* eNB_thread_prach( void* param ) { static int eNB_thread_prach_status; eNB_proc_t *proc = (eNB_proc_t*)param; @@ -865,7 +828,6 @@ static void* eNB_thread_prach( void* param ) eNB_thread_prach_status = 0; MSC_START_USE(); - #ifdef LOWLATENCY struct sched_attr attr; @@ -903,113 +865,102 @@ static void* eNB_thread_prach( void* param ) /* Set CPU Affinity only if number of CPUs >2 */ CPU_ZERO(&cpuset); #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { + if (get_nprocs() >2) { for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); + CPU_SET(j, &cpuset); s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { + if (s != 0) { perror( "pthread_setaffinity_np"); exit_fun (" Error setting processor affinity :"); } } #endif //CPU_AFFINITY - /* Check the actual affinity mask assigned to the thread */ + /* Check the actual affinity mask assigned to the thread */ s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror ("pthread_getaffinity_np"); - exit_fun (" Error getting processor affinity :"); + if (s != 0) { + perror ("pthread_getaffinity_np"); + exit_fun (" Error getting processor affinity :"); } memset(cpu_affinity,0, sizeof(cpu_affinity)); for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - + if (CPU_ISSET(j, &cpuset)) { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } memset(&sparam, 0 , sizeof (sparam)); sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-2; policy = SCHED_FIFO ; s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } + if (s != 0) { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } memset(&sparam, 0 , sizeof (sparam)); s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam"); - exit_fun("Error getting thread priority"); - } + if (s != 0) { + perror("pthread_getschedparam"); + exit_fun("Error getting thread priority"); + } - - LOG_I( HW, "[SCHED][eNB] PRACH thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), + LOG_I(HW, "[SCHED][eNB] PRACH thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : "???", sparam.sched_priority, cpu_affinity); - - + #endif // LOWLATENCY - mlockall(MCL_CURRENT | MCL_FUTURE); + mlockall(MCL_CURRENT | MCL_FUTURE); - - while (!oai_exit) { - - - if (oai_exit) break; - - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH\n"); - exit_fun( "error locking mutex" ); - break; - } - - while (proc->instance_cnt_prach < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_prach is -1 - pthread_cond_wait( &proc->cond_prach, &proc->mutex_prach ); // this unlocks mutex_rxtx while waiting and then locks it again - } - - if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB PRACH\n"); - exit_fun( "error unlocking mutex" ); - break; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(eNB,0); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); + while (!oai_exit) { - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n"); - exit_fun( "error locking mutex" ); - break; - } + if (oai_exit) break; + + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH\n"); + exit_fun( "error locking mutex" ); + break; + } + + while (proc->instance_cnt_prach < 0) { + // most of the time the thread is waiting here + // proc->instance_cnt_prach is -1 + pthread_cond_wait( &proc->cond_prach, &proc->mutex_prach ); // this unlocks mutex_rxtx while waiting and then locks it again + } + + if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB PRACH\n"); + exit_fun( "error unlocking mutex" ); + break; + } - proc->instance_cnt_prach--; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); + prach_procedures(eNB,0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); + + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n"); + exit_fun( "error locking mutex" ); + break; + } - if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n"); - exit_fun( "error unlocking mutex" ); - break; - } - } + proc->instance_cnt_prach--; + + if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n"); + exit_fun( "error unlocking mutex" ); + break; + } + } #ifdef DEBUG_THREADS printf( "Exiting eNB thread PRACH\n"); @@ -1020,10 +971,8 @@ static void* eNB_thread_prach( void* param ) } - - -void init_eNB_proc(void) -{ +void init_eNB_proc(void) { + int i; int CC_id; PHY_VARS_eNB *eNB; @@ -1033,7 +982,6 @@ void init_eNB_proc(void) for (CC_id=0; CC_idproc; proc_rxtx = proc->proc_rxtx; #ifndef LOWLATENCY @@ -1097,7 +1045,6 @@ void init_eNB_proc(void) pthread_setname_np( proc->pthread_rx, name ); } - /* setup PHY proc TX sync mechanism */ pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL); @@ -1108,8 +1055,8 @@ void init_eNB_proc(void) /*! * \brief Terminate eNB TX and RX threads. */ -void kill_eNB_proc(void) -{ +void kill_eNB_proc(void) { + int *status; PHY_VARS_eNB *eNB; eNB_proc_t *proc; @@ -1133,6 +1080,7 @@ void kill_eNB_proc(void) #ifdef DEBUG_THREADS printf( "Joining eNB TX CC_id %d thread\n", CC_id); #endif + int result,i; for (i=0;i<1;i++) { pthread_join( proc_rxtx[i].pthread_rxtx, (void**)&status ); @@ -1148,16 +1096,14 @@ void kill_eNB_proc(void) printf( "The thread was killed. No status available.\n" ); } } - #else UNUSED(result); #endif pthread_mutex_destroy( &proc_rxtx[i].mutex_rxtx ); pthread_cond_destroy( &proc_rxtx[i].cond_rxtx ); - - } + #ifdef DEBUG_THREADS printf( "Killing RX CC_id %d thread\n", CC_id); #endif @@ -1165,10 +1111,10 @@ void kill_eNB_proc(void) #ifdef DEBUG_THREADS printf( "Joining eNB RX CC_id %d thread ...\n", CC_id); #endif + result = pthread_join( proc->pthread_rx, (void**)&status ); -#ifdef DEBUG_THREADS - +#ifdef DEBUG_THREADS if (result != 0) { printf( "Error joining thread.\n" ); } else { @@ -1177,8 +1123,7 @@ void kill_eNB_proc(void) } else { printf( "The thread was killed. No status available.\n" ); } - } - + } #else UNUSED(result); #endif @@ -1193,17 +1138,17 @@ void kill_eNB_proc(void) Each rf chain is is addressed by the card number and the chain on the card. The rf_map specifies for each CC, on which rf chain the mapping should start. Multiple antennas are mapped to successive RF chains on the same card. */ -int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) -{ +int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) { int i, CC_id; + #ifndef EXMIMO uint16_t N_TA_offset = 0; #else int j; #endif - LTE_DL_FRAME_PARMS *frame_parms; + LTE_DL_FRAME_PARMS *frame_parms; for (CC_id=0; CC_idframe_type == TDD) { - if (frame_parms->N_RB_DL == 100) - N_TA_offset = 624; - else if (frame_parms->N_RB_DL == 50) - N_TA_offset = 624/2; - else if (frame_parms->N_RB_DL == 25) - N_TA_offset = 624/4; - } - + if (frame_parms->frame_type == TDD) { + if (frame_parms->N_RB_DL == 100) + N_TA_offset = 624; + else if (frame_parms->N_RB_DL == 50) + N_TA_offset = 624/2; + else if (frame_parms->N_RB_DL == 25) + N_TA_offset = 624/4; + } #endif // replace RX signal buffers with mmaped HW versions @@ -1285,8 +1227,7 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory memset(rxdata[i], 0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->common_vars.rxdata[0][i],rxdata[i],N_TA_offset); - + printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->common_vars.rxdata[0][i],rxdata[i],N_TA_offset); } for (i=0; inb_antennas_tx; i++) { @@ -1295,19 +1236,17 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = txdata[i]; memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); - } - #endif + } return(0); } - - void reset_opp_meas(void) { + int sfn; reset_meas(&softmodem_stats_mt); reset_meas(&softmodem_stats_hw); @@ -1318,6 +1257,7 @@ void reset_opp_meas(void) { } } + void print_opp_meas(void) { int sfn=0; @@ -1333,7 +1273,6 @@ void print_opp_meas(void) { void init_eNB(eNB_func_t node_function) { - int CC_id; for (CC_id=0;CC_id Date: Fri, 17 Jun 2016 04:14:41 +0530 Subject: [PATCH 062/340] handle prach rx for enb node functions --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 53 +++-- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 266 +++++++++++++----------- targets/RT/USER/lte-enb.c | 2 +- 4 files changed, 182 insertions(+), 141 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index a8a27b2c09..24b338f5a4 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -45,11 +45,11 @@ #include "PHY/TOOLS/ALAW/alaw_lut.h" // Get device information -void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { - LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - int32_t **txdataF = eNB->common_vars.txdataF[0]; +void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + int32_t **txdataF = eNB->common_vars.txdataF[0]; - uint16_t symbol_id, element_id; + uint16_t symbol_id, element_id; uint16_t db_fulllength = 12*fp->N_RB_DL; uint16_t db_halflength = db_fulllength>>1; int slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; @@ -58,7 +58,7 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { int16_t *data_block = (int16_t*)malloc(db_fulllength*sizeof(int16_t)); // Caller: RCC - DL *** handle RRU case - UL and PRACH *** - if (eNB->node_function == NGFI_RCC_IF4) { + if (packet_type == IF4_PDLFFT) { IF4_dl_packet_t *dl_packet = (IF4_dl_packet_t*)malloc(sizeof_IF4_dl_packet_t); gen_IF4_dl_packet(dl_packet, proc); @@ -93,7 +93,7 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; } - }else { + } else if (packet_type == IF4_PULFFT) { IF4_ul_packet_t *ul_packet = (IF4_ul_packet_t*)malloc(sizeof_IF4_ul_packet_t); gen_IF4_ul_packet(ul_packet, proc); @@ -101,7 +101,7 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - // Do compression of the two parts and generate data blocks - rxdataF + // Do compression of the two parts and generate data blocks - rxdataF for (element_id=0; element_id>16) + 32768 ]<<8; @@ -118,19 +118,23 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc) { slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; } - } - + } else if (packet_type == IF4_PRACH) { + + + } else { + AssertFatal(1==0, "send_IF4 - Unknown packet_type %x", packet_type); + } + + return; } void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, uint32_t *symbol_number) { - // Caller: RRU - DL *** handle RCC case - UL and PRACH *** - if (eNB->node_function == NGFI_RRU_IF4) { - - printf("\n Recv IF4 for frame %d, subframe %d and symbol %d\n", proc->frame_tx, proc->subframe_tx, symbol_id); - + *packet_type = 0; + int16_t *data_block=NULL; + + // Read packet(s) from the fronthaul // for(i=0; isymbols_per_tti; i++) { - // Read packet(s) from the fronthaul // if (dev->eth_dev.trx_read_func (&dev->eth_dev, // timestamp_rx, // rx_eNB, @@ -139,16 +143,27 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u // ) < 0) { // perror("RRU : ETHERNET read"); // } +// printf("\n Recv IF4 for frame %d, subframe %d and symbol %d\n", proc->frame_tx, proc->subframe_tx, symbol_id); + + //*packet_type = ; + + if (*packet_type == IF4_PDLFFT) { // Apply reverse processing - decompression // txAlawtolinear( Datablock ) // Generate and return the OFDM symbols (txdataF) - //txDataF - //} - }else { + // txDataF - } + } else if (*packet_type == IF4_PULFFT) { + + } else if (*packet_type == IF4_PRACH) { + + } else { + AssertFatal(1==0, "recv_IF4 - Unknown packet_type %x", *packet_type); + } + + return; } void gen_IF4_dl_packet(IF4_dl_packet_t *dl_packet, eNB_rxtx_proc_t *proc) { diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index d7a0461169..a6ca7eb5c0 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -181,6 +181,6 @@ void gen_IF4_ul_packet(IF4_ul_packet_t*, eNB_rxtx_proc_t*); void gen_IF4_prach_packet(IF4_prach_packet_t*, eNB_rxtx_proc_t*); -void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*); +void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t); void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t*, uint32_t*); diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 087404d10a..ae6627939c 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -44,6 +44,8 @@ #include "SCHED/defs.h" #include "SCHED/extern.h" +#include "PHY/LTE_TRANSPORT/if4_tools.h" + #ifdef EMOS #include "SCHED/phy_procedures_emos.h" #endif @@ -2471,7 +2473,6 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p } - void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) { int i,l; @@ -2481,158 +2482,183 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; int frame = proc->frame_rx; - int symbol_number, symbol_mask, symbol_mask_full, prach_rx, packet_type; + + int prach_rx; + + uint16_t packet_type; + uint32_t symbol_number; + uint32_t symbol_mask, symbol_mask_full; if (subframe==9) { subframe=0; frame++; frame&=1023; + } else { + subframe++; } - else subframe++; - + // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_COMMON_RX,1); start_meas(&eNB->phy_proc_rx); + #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); #endif if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) - + + if ((eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF and front-end processing - if ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF and front-end processing - for (i=0; inb_antennas_rx; i++) - rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; + for (i=0; inb_antennas_rx; i++) + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, - &proc->timestamp_rx, - rxp, - fp->samples_per_tti, - fp->nb_antennas_rx); - proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - if (proc->first_rx == 0) { - AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)",proc->subframe_rx,subframe); - AssertFatal(proc->frame_rx == frame, "Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)",proc->frame_rx,frame); - } - else - proc->first_rx = 0; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &proc->timestamp_rx, + rxp, + fp->samples_per_tti, + fp->nb_antennas_rx); + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - // printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + if (proc->first_rx == 0) { + AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)",proc->subframe_rx,subframe); + AssertFatal(proc->frame_rx == frame, "Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)",proc->frame_rx,frame); + } else { + proc->first_rx = 0; + } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, subframe ); + //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, subframe ); - if (rxs != fp->samples_per_tti) - exit_fun( "problem receiving samples" ); + if (rxs != fp->samples_per_tti) + exit_fun( "problem receiving samples" ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - // now do common RX processing for first slot in subframe - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); - remove_7_5_kHz(eNB,subframe<<1); - remove_7_5_kHz(eNB,1+(subframe<<1)); - for (l=0; lsymbols_per_tti/2; l++) { - slot_fep_ul(fp, - &eNB->common_vars, - l, - subframe<<1, - 0, - 0 - ); - slot_fep_ul(fp, - &eNB->common_vars, - l, - 1+(subframe<<1), - 0, - 0 - ); - } + // now do common RX processing for first slot in subframe + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); + remove_7_5_kHz(eNB,subframe<<1); + remove_7_5_kHz(eNB,1+(subframe<<1)); + for (l=0; lsymbols_per_tti/2; l++) { + slot_fep_ul(fp, + &eNB->common_vars, + l, + subframe<<1, + 0, + 0 + ); + slot_fep_ul(fp, + &eNB->common_vars, + l, + 1+(subframe<<1), + 0, + 0 + ); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); - if (eNB->node_function == NGFI_RRU_IF4) { - /// **** send_IF4 of rxdataF to RCC **** /// - /// Handle routing to prach thread for sending prach - } + if (eNB->node_function == NGFI_RRU_IF4 && is_prach_subframe(fp, frame, subframe)<=0) { - } - else if (eNB->node_function == NGFI_RCC_IF4) { - /// **** recv_IF4 of rxdataF from RRU **** /// - /// **** recv_IF4 of prachF from RRU **** /// - // get frame/subframe information from IF4 interface - // timed loop (200 us) - - //symbol_mask = 0; - //symbol_mask_full = (1<symbols_per_tti)-1; - //if (is_prach_subframe(fp,frame,subframe)>0) - //prach_rx = 0; - //else - //prach_rx = 1; - - //do { - //recv_IF4(eNB, proc, &packet_type, &symbol_number); - //if (is_prach_subframe(fp,frame,subframe)>0 && packet_type == PRACH) { - //// wake up prach_rx - //prach_rx = 1; - //} - //if (packet_type == IF4_PULFFT) - //symbol_mask = symbol_mask | (1<node_function %d",eNB->node_function); - } - - - // check if we have to detect PRACH first - if (is_prach_subframe(fp,frame,subframe)>0) { - // wake up thread for PRACH RX - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); - exit_fun( "error locking mutex_prach" ); - return; - } - - int cnt_prach = ++proc->instance_cnt_prach; - // set timing for prach thread - proc->frame_prach = frame; - proc->subframe_prach = subframe; - - pthread_mutex_unlock( &proc->mutex_prach ); - - if (cnt_prach == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc->cond_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); - exit_fun( "ERROR pthread_cond_signal" ); - return; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", frame); - exit_fun( "PRACH thread busy" ); - return; + /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// } + /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) + // check if we have to detect PRACH first + if (is_prach_subframe(fp,frame,subframe)>0) { + // wake up thread for PRACH RX + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); + exit_fun( "error locking mutex_prach" ); + return; + } + + int cnt_prach = ++proc->instance_cnt_prach; + // set timing for prach thread + proc->frame_prach = frame; + proc->subframe_prach = subframe; + pthread_mutex_unlock( &proc->mutex_prach ); + + if (cnt_prach == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", frame); + exit_fun( "PRACH thread busy" ); + return; + } + } + + } else if (eNB->node_function == NGFI_RCC_IF4) { + /// **** recv_IF4 of rxdataF from RRU **** /// + /// **** recv_IF4 of prachF from RRU **** /// + // get frame/subframe information from IF4 interface + // timed loop (200 us) + + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + prach_rx = 0; + + do { + //recv_IF4(eNB, proc, &packet_type, &symbol_number); + + if (packet_type == IF4_PULFFT) { + symbol_mask = symbol_mask | (1<0 && packet_type == PRACH) { + // wake up thread for PRACH RX + prach_rx = 1; + + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); + exit_fun( "error locking mutex_prach" ); + return; + } + + int cnt_prach = ++proc->instance_cnt_prach; + // set timing for prach thread + proc->frame_prach = frame; + proc->subframe_prach = subframe; + + pthread_mutex_unlock( &proc->mutex_prach ); + + if (cnt_prach == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", frame); + exit_fun( "PRACH thread busy" ); + return; + } + } + + } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); + + // Tobi aka mr monaco: ETH + + } else { // should not get here + AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); } - - - } - - else { // grab transport channel information from network interface + } else { // grab transport channel information from network interface } + } + void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const uint8_t abstraction_flag,const relaying_type_t r_type) { //RX processing for ue-specific resources (i diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 918c1f82ee..3a836d6bdb 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -483,7 +483,7 @@ static void* eNB_thread_rxtx( void* param ) { } else { /// **** recv_IF4 of txdataF from RCC **** /// - //recv_IF4( eNB, proc, packet_type, symbol_number); + //recv_IF4(eNB, proc, packet_type, symbol_number); } } From e38dc81c16d7c132ac5ab721b079e94e7d7f670f Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 17 Jun 2016 12:19:36 +0200 Subject: [PATCH 063/340] just testing node function --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 8 ++++---- openair1/SCHED/phy_procedures_lte_eNb.c | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 24b338f5a4..15e98c36f6 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -103,11 +103,11 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { // Do compression of the two parts and generate data blocks - rxdataF for (element_id=0; element_id>16) + 32768 ]<<8; + //data_block[element_id] = lin2alaw[ (rxdataF[0][blockoffsetF+element_id] & 0xffff) + 32768 ]; + //data_block[element_id] |= lin2alaw[ (rxdataF[0][blockoffsetF+element_id]>>16) + 32768 ]<<8; - data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; - data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; + //data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; + //data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; } // Update information in generated packet diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index ae6627939c..87153a3b10 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2607,9 +2607,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl symbol_mask_full = (1<symbols_per_tti)-1; prach_rx = 0; + // Block from loop while testing + symbol_mask = symbol_mask_full; do { //recv_IF4(eNB, proc, &packet_type, &symbol_number); - + if (packet_type == IF4_PULFFT) { symbol_mask = symbol_mask | (1< Date: Fri, 17 Jun 2016 15:39:24 +0200 Subject: [PATCH 064/340] add vcd logging for send, recv if4 and delay for testing without recv --- openair1/PHY/LTE_TRANSPORT/prach.c | 7 +++++-- openair1/SCHED/phy_procedures_lte_eNb.c | 19 +++++++++++++++++-- openair2/UTIL/LOG/vcd_signal_dumper.c | 6 +++++- openair2/UTIL/LOG/vcd_signal_dumper.h | 5 +++++ targets/RT/USER/lte-enb.c | 12 +++++++++--- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 555685b23e..85330b5a18 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1269,7 +1269,11 @@ void rx_prach(PHY_VARS_eNB *eNB, } if (eNB->node_function == NGFI_RRU_IF4) { - /// **** send_IF4 of prachF to RCC **** /// + /// **** send_IF4 of prachF to RCC **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); + // send_IF4(); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + return; } @@ -1278,7 +1282,6 @@ void rx_prach(PHY_VARS_eNB *eNB, // wait for prachF from RRU and continue with PRACH processing //} - // here onwards is for eNodeB_3GPP or NGFI_RCC_IF4 preamble_offset_old = 99; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 87153a3b10..92392070af 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -61,6 +61,8 @@ #include "assertions.h" #include "msc.h" +#include + #if defined(ENABLE_ITTI) # include "intertask_interface.h" #endif @@ -2488,7 +2490,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl uint16_t packet_type; uint32_t symbol_number; uint32_t symbol_mask, symbol_mask_full; - + + struct timespec time_req, time_rem; + time_req.tv_sec = 0; + time_req.tv_nsec = 300000; + if (subframe==9) { subframe=0; frame++; @@ -2564,6 +2570,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (eNB->node_function == NGFI_RRU_IF4 && is_prach_subframe(fp, frame, subframe)<=0) { /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); + // send_IF4(); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + } /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) @@ -2608,9 +2619,13 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl prach_rx = 0; // Block from loop while testing - symbol_mask = symbol_mask_full; + symbol_mask = symbol_mask_full; + nanosleep(&time_req, &time_rem); + do { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); //recv_IF4(eNB, proc, &packet_type, &symbol_number); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); if (packet_type == IF4_PULFFT) { symbol_mask = symbol_mask | (1<CC_id], proc); + /// **** send_IF4 of txdataF to RRU **** /// + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); + //send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc, 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); } From f91457d8d29f9d8d34e8f7672b00eb7ad94cda95 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 18 Jun 2016 03:48:23 -0700 Subject: [PATCH 065/340] added common acquisition interfaces for ExpressMIMO2 --- cmake_targets/CMakeLists.txt | 12 +- cmake_targets/build_oai | 4 +- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 81 ----- openair1/PHY/TOOLS/lte_dfts.c | 33 +- targets/ARCH/COMMON/common_lib.h | 23 +- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 321 +++++++++++++++++- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h | 23 ++ targets/RT/USER/lte-enb.c | 19 +- targets/RT/USER/lte-ue.c | 1 + 9 files changed, 385 insertions(+), 132 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5f5f09dfab..46fd189952 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -494,7 +494,7 @@ include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS/") #set (option_HWEXMIMOLIB_lib "-l ") set(HWLIB_EXMIMO_SOURCE ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c - ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c +# ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c ) add_library(oai_exmimodevif MODULE ${HWLIB_EXMIMO_SOURCE} ) @@ -535,8 +535,8 @@ if (${RF_BOARD} STREQUAL "EXMIMO") include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/") include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS/") set(HW_SOURCE ${HW_SOURCE} - ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c - ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c) + ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c) +# ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c) set(option_HW_lib "-rdynamic -ldl") elseif (${RF_BOARD} STREQUAL "OAI_USRP") @@ -1478,9 +1478,9 @@ add_boolean_option(OAI_NW_DRIVER_USE_NETLINK True "????") ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/pgm_link.c ) - add_library(OPENAIR0_LIB - ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c - ) +# add_library(OPENAIR0_LIB +# ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +# ) # System packages that are required # We use either the cmake buildin, in ubuntu are in: /usr/share/cmake*/Modules/ diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 96adfa0040..a289677373 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -692,7 +692,9 @@ function main() { #add exmimo compilation #TODO EXMIMO library support - + compilations \ + $build_dir oai_exmimodevif \ + liboai_exmimodevif.so $dbin/liboai_exmimodevif.so.$REL echo_info "liboai_device.so is linked to EXMIMO device library" elif [ "$HW" == "OAI_USRP" ] ; then if [ -d "/usr/include/uhd" ] ; then diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index 48339de4cd..da07687a9e 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -30,20 +30,10 @@ #include "PHY/defs.h" #include "PHY/extern.h" -#ifdef EXMIMO -#include "openair0_lib.h" -extern int card; -#endif - void phy_adjust_gain (PHY_VARS_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id) { -#ifdef EXMIMO - exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr; - uint16_t i; -#endif - LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n", rx_power_fil_dB, ue->measurements.rssi, @@ -80,77 +70,6 @@ phy_adjust_gain (PHY_VARS_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id) LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); -#ifdef EXMIMO - - if (ue->rx_total_gain_dB>ue->rx_gain_max[0]) { - ue->rx_total_gain_dB = ue->rx_gain_max[0]; - - for (i=0; iframe_parms.nb_antennas_rx; i++) { - p_exmimo_config->rf.rx_gain[i][0] = 30; - } - - } else if (ue->rx_total_gain_dB<(ue->rx_gain_max[0]-30)) { - // for the moment we stay in max gain mode - ue->rx_total_gain_dB = ue->rx_gain_max[0] - 30; - - for (i=0; iframe_parms.nb_antennas_rx; i++) { - p_exmimo_config->rf.rx_gain[i][0] = 0; - } - - /* - ue->rx_gain_mode[0] = byp; - ue->rx_gain_mode[1] = byp; - exmimo_pci_interface->rf.rf_mode0 = 22991; //bypass - exmimo_pci_interface->rf.rf_mode1 = 22991; //bypass - - if (ue->rx_total_gain_dB<(ue->rx_gain_byp[0]-50)) { - exmimo_pci_interface->rf.rx_gain00 = 0; - exmimo_pci_interface->rf.rx_gain10 = 0; - } - */ - } else { - - for (i=0; iframe_parms.nb_antennas_rx; i++) { - p_exmimo_config->rf.rx_gain[i][0] = 30 - ue->rx_gain_max[0] + ue->rx_total_gain_dB; - } - } - - /* - break; - case med_gain: - case byp_gain: - if (ue->rx_total_gain_dB>ue->rx_gain_byp[0]) { - ue->rx_gain_mode[0] = max_gain; - ue->rx_gain_mode[1] = max_gain; - exmimo_pci_interface->rf.rf_mode0 = 55759; //max gain - exmimo_pci_interface->rf.rf_mode1 = 55759; //max gain - - if (ue->rx_total_gain_dB>ue->rx_gain_max[0]) { - exmimo_pci_interface->rf.rx_gain00 = 50; - exmimo_pci_interface->rf.rx_gain10 = 50; - } - else { - exmimo_pci_interface->rf.rx_gain00 = 50 - ue->rx_gain_max[0] + ue->rx_total_gain_dB; - exmimo_pci_interface->rf.rx_gain10 = 50 - ue->rx_gain_max[1] + ue->rx_total_gain_dB; - } - } - else if (ue->rx_total_gain_dB<(ue->rx_gain_byp[0]-50)) { - exmimo_pci_interface->rf.rx_gain00 = 0; - exmimo_pci_interface->rf.rx_gain10 = 0; - } - else { - exmimo_pci_interface->rf.rx_gain00 = 50 - ue->rx_gain_byp[0] + ue->rx_total_gain_dB; - exmimo_pci_interface->rf.rx_gain10 = 50 - ue->rx_gain_byp[1] + ue->rx_total_gain_dB; - } - break; - default: - exmimo_pci_interface->rf.rx_gain00 = 50; - exmimo_pci_interface->rf.rx_gain10 = 50; - break; - } - */ -#endif - #ifdef DEBUG_PHY /* if ((ue->frame%100==0) || (ue->frame < 10)) msg("[PHY][ADJUST_GAIN] frame %d, rx_power = %d, rx_power_fil = %d, rx_power_fil_dB = %d, coef=%d, ncoef=%d, rx_total_gain_dB = %d (%d,%d,%d)\n", diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 375ea418d7..4fc332704b 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -6817,6 +6817,7 @@ void dft60(int16_t *x,int16_t *y,unsigned char scale) for (i=0; i<60; i++) { y128[i] = mulhi_int16(y128[i],norm128); + printf("y[%d] = (%d,%d)\n",i,((int16_t*)&y128[i])[0],((int16_t*)&y128[i])[1]); } } @@ -18553,6 +18554,7 @@ int main(int argc, char**argv) simd_q15_t x[4096],y[4096],tw0,tw1,tw2,tw3; #endif int i; + simd_q15_t *x128=x,*y128=y; set_taus_seed(0); opp_enabled = 1; @@ -18592,17 +18594,22 @@ int main(int argc, char**argv) ((int16_t *)&tw3)[5] = 0; ((int16_t *)&tw3)[6] = 32767; ((int16_t *)&tw3)[7] = 0; - + */ for (i=0;i<300;i++) { #if defined(__x86_64__) || defined(__i386__) +#ifndef __AVX2__ x[i] = _mm_set1_epi32(taus()); x[i] = _mm_srai_epi16(x[i],4); +#else + x[i] = _mm256_set1_epi32(taus()); + x[i] = _mm256_srai_epi16(x[i],4); +#endif #elif defined(__arm__) x[i] = (int16x8_t)vdupq_n_s32(taus()); x[i] = vshrq_n_s16(x[i],4); #endif } - + /* bfly2_tw1(x,x+1,y,y+1); printf("(%d,%d) (%d,%d) => (%d,%d) (%d,%d)\n",((int16_t*)&x[0])[0],((int16_t*)&x[0])[1],((int16_t*)&x[1])[0],((int16_t*)&x[1])[1],((int16_t*)&y[0])[0],((int16_t*)&y[0])[1],((int16_t*)&y[1])[0],((int16_t*)&y[1])[1]); printf("(%d,%d) (%d,%d) => (%d,%d) (%d,%d)\n",((int16_t*)&x[0])[0],((int16_t*)&x[0])[1],((int16_t*)&x[1])[0],((int16_t*)&x[1])[1],((int16_t*)&y[0])[2],((int16_t*)&y[0])[3],((int16_t*)&y[1])[2],((int16_t*)&y[1])[3]); @@ -18743,27 +18750,27 @@ int main(int argc, char**argv) for (i=0;i<48;i++) printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); printf("\n"); - + */ dft60((int16_t *)x,(int16_t *)y,1); printf("\n\n60-point\n"); printf("X: "); for (i=0;i<60;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); + printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); printf("\nY:"); for (i=0;i<60;i++) - printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); + printf("%d,%d,",((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); printf("\n"); - + dft72((int16_t *)x,(int16_t *)y,1); printf("\n\n72-point\n"); printf("X: "); for (i=0;i<72;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); + printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); printf("\nY:"); for (i=0;i<72;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); + printf("%d: %d,%d\n",i,((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); printf("\n"); - + /* dft96((int16_t *)x,(int16_t *)y,1); printf("\n\n96-point\n"); printf("X: "); @@ -18783,17 +18790,17 @@ int main(int argc, char**argv) for (i=0;i<108;i++) printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); printf("\n"); - + */ dft120((int16_t *)x,(int16_t *)y,1); printf("\n\n120-point\n"); printf("X: "); for (i=0;i<120;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); + printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); printf("\nY:"); for (i=0;i<120;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); + printf("%d: %d,%d\n",i,((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); printf("\n"); - + /* dft144((int16_t *)x,(int16_t *)y,1); printf("\n\n144-point\n"); printf("X: "); diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index dc0b31af58..f8ec3f8e58 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -51,6 +51,9 @@ #define BBU_LOCAL_RADIO_HEAD 0 #define BBU_REMOTE_RADIO_HEAD 1 +#define MAX_CARDS 8 + + typedef int64_t openair0_timestamp; typedef volatile int64_t openair0_vtimestamp; @@ -59,9 +62,9 @@ typedef volatile int64_t openair0_vtimestamp; typedef struct openair0_device_t openair0_device; -#ifndef EXMIMO -#define MAX_CARDS 1 -#endif + + + //#define USRP_GAIN_OFFSET (56.0) // 86 calibrated for USRP B210 @ 2.6 GHz to get equivalent RS EPRE in OAI to SMBV100 output @@ -145,16 +148,12 @@ typedef struct { unsigned int samples_per_frame; //! the sample rate for both transmit and receive. double sample_rate; - //! number of samples per RX/TX packet (USRP + Ethernet) - unsigned int samples_per_packet; - //! delay in sending samples (write) due to hardware access, softmodem processing and fronthaul delay if exist - int tx_scheduling_advance; + //! flag to indicate that the device is doing mmapped DMA transfers + int mmapped_dma; //! offset in samples between TX and RX paths int tx_sample_advance; - //! configurable tx thread lauch delay - int txlaunch_wait; /* 1 or 0 */ - //! configurable tx thread lauch delay - int txlaunch_wait_slotcount; + int samples_per_packet; + int tx_scheduling_advance; //! number of RX channels (=RX antennas) int rx_num_channels; //! number of TX channels (=TX antennas) @@ -165,7 +164,7 @@ typedef struct { //! \brief Center frequency in Hz for TX. //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels double tx_freq[4]; - + //! \brief memory //! \brief Pointer to Calibration table for RX gains rx_gain_calib_table_t *rx_gain_calib_table; diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 427cd47be8..a8b5f3e21b 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -36,17 +36,34 @@ * 28.01.2013: Initial version */ -#include -#include -#include -#include -#include +#define _GNU_SOURCE #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "openair0_lib.h" #include "openair_device.h" #include "common_lib.h" + +#include + #define max(a,b) ((a)>(b) ? (a) : (b)) exmimo_pci_interface_bot_virtual_t openair0_exmimo_pci[MAX_CARDS]; // contains userspace pointers for each card @@ -66,6 +83,14 @@ static uint32_t rf_vcocal[4] = {910,910,910,910}; static uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015}; static uint32_t rf_rxdc[4] = {32896,32896,32896,32896}; + + +extern volatile int oai_exit; + + +void kill_watchdog(openair0_device *); +void create_watchdog(openair0_device *); + unsigned int log2_int( unsigned int x ) { unsigned int ans = 0 ; @@ -247,16 +272,279 @@ int openair0_stop_without_reset(int card) #define MY_RF_MODE (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX) #define RF_MODE_BASE (LNA1ON + RFBBNORM) +static void *watchdog_thread(void *arg) { + + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + exmimo_state_t *exm=((openair0_device *)arg)->priv; + openair0_config_t *cfg=&((openair0_device *)arg)->openair0_cfg[0]; + + volatile unsigned int *daq_mbox = openair0_daq_cnt(); + unsigned int mbox,diff; + + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD threads */ + /* CPU 1 is reserved for all TX threads */ + /* Enable CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); + +#ifdef CPU_AFFINITY + if (get_nprocs() > 2) + { + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + printf("Error setting processor affinity"); + } + } +#endif //CPU_AFFINITY + + /* Check the actual affinity mask assigned to the thread */ + + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_getaffinity_np"); + printf("Error getting processor affinity "); + } + memset(cpu_affinity,0,sizeof(cpu_affinity)); + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) + { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + memset(&sparam, 0 , sizeof (sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); + policy = SCHED_FIFO ; + + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) + { + perror("pthread_setschedparam : "); + printf("Error setting thread priority"); + } + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) + { + perror("pthread_getschedparam : "); + printf("Error getting thread priority"); + + } + + printf("EXMIMO2 Watchdog TX thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", + sched_getcpu(), + syscall(__NR_gettid), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, + cpu_affinity ); + + + + + mlockall(MCL_CURRENT | MCL_FUTURE); + + exm->watchdog_exit = 0; + exm->ts = 0; + exm->last_mbox = 0; + + if (cfg->sample_rate==30.72e6) { + exm->samples_per_tick = 15360; + exm->samples_per_frame = 307200; + } + else if (cfg->sample_rate==23.04e6) { + exm->samples_per_tick = 11520; + exm->samples_per_frame = 230400; + } + else if (cfg->sample_rate==15.36e6) { + exm->samples_per_tick = 7680; + exm->samples_per_frame = 153600; + } + else if (cfg->sample_rate==7.68e6) { + exm->samples_per_tick = 3840; + exm->samples_per_frame = 76800; + } + else if (cfg->sample_rate==3.84e6) { + exm->samples_per_tick = 1920; + exm->samples_per_frame = 38400; + } + else if (cfg->sample_rate==1.92e6) { + exm->samples_per_tick = 960; + exm->samples_per_frame = 19200; + } + else { + printf("Unknown sampling rate %f, exiting \n",cfg->sample_rate); + exm->watchdog_exit=1; + } + // main loop to keep up with DMA transfers from exmimo2 + while ((!oai_exit) && (!exm->watchdog_exit)) { + + if (exm->daq_state == running) { + + // grab time from MBOX + mbox = daq_mbox[0]; + if (mboxlast_mbox) { // wrap-around + diff = 150 + mbox - exm->last_mbox; + } + else { + diff = mbox - exm->last_mbox; + } + exm->last_mbox = mbox; + + pthread_mutex_lock(&exm->watchdog_mutex); + exm->ts += (diff*exm->samples_per_frame/150) ; + + if (diff > 10) // we're too late so exit + exm->watchdog_exit = 1; + + if (exm->ts - exm->last_ts_rx > exm->samples_per_frame) { + exm->watchdog_exit = 1; + printf("RX Overflow, exiting\n"); + } + pthread_mutex_unlock(&exm->watchdog_mutex); + } + + + usleep(500); // sleep for 500us + } + + oai_exit=1; + return NULL; +} + +void create_watchdog(openair0_device *dev) { + + exmimo_state_t *priv = dev->priv; + priv->watchdog_exit=0; +#ifndef DEADLINE_SCHEDULER + priv->watchdog_sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO); + pthread_attr_setschedparam(&priv->watchdog_attr,&priv->watchdog_sched_param); + pthread_attr_setschedpolicy(&priv->watchdog_attr,SCHED_FIFO); + pthread_create(&priv->watchdog,&priv->watchdog_attr,watchdog_thread,dev); +#else + pthread_create(&priv->watchdog,NULL,watchdog_thread,devv); +#endif + pthread_mutex_init(&priv->watchdog_mutex,NULL); + + +} + +int trx_exmimo_start(openair0_device *device) { + + exmimo_state_t *exm=device->priv; + + openair0_start_rt_acquisition(0); + exm->daq_state = running; + + return(0); +} + +int trx_exmimo_write(openair0_device *device,openair0_timestamp ptimestamp, void **buff, int nsamps, int cc, int flags) { + + return(0); +} + +int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + + exmimo_state_t *exm=device->priv; + openair0_config_t *cfg=&device->openair0_cfg[0]; + openair0_timestamp ts,diff; + int i; + + pthread_mutex_lock(&exm->watchdog_mutex); + ts = exm->ts; + pthread_mutex_unlock(&exm->watchdog_mutex); + while (ts < exm->last_ts_rx + nsamps) { + + diff = exm->last_ts_rx+nsamps - ts; // difference in samples between current timestamp and last RX received sample + // go to sleep until we should have enough samples (1024 for a bit more) + usleep((unsigned int)((double)(diff+1024)*1e6/cfg->sample_rate)); + // get new timestamp, in case we have to sleep again + pthread_mutex_lock(&exm->watchdog_mutex); + ts = exm->ts; + pthread_mutex_unlock(&exm->watchdog_mutex); + } + + if (cfg->mmapped_dma == 0) { // if buff is not the dma buffer, do a memcpy, otherwise do nothing + for (i=0;ilast_ts_rx % exm->samples_per_frame), + nsamps*sizeof(int)); + } + } + + *ptimestamp=exm->last_ts_rx; + exm->last_ts_rx += nsamps; + + return(0); +} + +void trx_exmimo_end(openair0_device *device) { + + exmimo_state_t *exm=device->priv; + + exm->daq_state = idle; + openair0_stop(0); + +} + +int trx_exmimo_get_stats(openair0_device* device) { + + return(0); + +} + +int trx_exmimo_reset_stats(openair0_device* device) { + + return(0); + +} + +int trx_exmimo_stop(int card) { + + return(0); + +} + +int trx_exmimo_set_freq(openair0_device* device, openair0_config_t *openair0_cfg1,int exmimo_dump_config) { + + return(0); +} + +int trx_exmimo_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { + + return(0); + +} + +void kill_watchdog(openair0_device *device) { + + exmimo_state_t *exm=(exmimo_state_t *)device->priv; + exm->watchdog_exit=1; + +} + int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { // Initialize card // exmimo_config_t *p_exmimo_config; exmimo_id_t *p_exmimo_id; int ret; + exmimo_state_t *exm = (exmimo_state_t *)malloc(sizeof(exmimo_state_t)); ret = openair0_open(); - - + if ( ret != 0 ) { if (ret == -1) printf("Error opening /dev/openair0"); @@ -289,6 +577,23 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { device->type = EXMIMO_DEV; + // Add stuff that was in lte-softmodem here + + // + device->trx_start_func = trx_exmimo_start; + device->trx_end_func = trx_exmimo_end; + device->trx_read_func = trx_exmimo_read; + device->trx_write_func = trx_exmimo_write; + device->trx_get_stats_func = trx_exmimo_get_stats; + device->trx_reset_stats_func = trx_exmimo_reset_stats; + device->trx_stop_func = trx_exmimo_stop; + device->trx_set_freq_func = trx_exmimo_set_freq; + device->trx_set_gains_func = trx_exmimo_set_gains; + device->openair0_cfg = openair0_cfg; + device->priv = (void *)exm; + + create_watchdog(device); + return(0); } @@ -326,8 +631,6 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) p_exmimo_config->framing.multicard_syncmode=SYNCMODE_SLAVE; /* device specific */ - openair0_cfg[card].txlaunch_wait = 1;//manage when TX processing is triggered - openair0_cfg[card].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered openair0_cfg[card].iq_txshift = 4;//shift openair0_cfg[card].iq_rxrescale = 15;//rescale iqs diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h index 0abb27dee2..a2f37b09dc 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h @@ -42,6 +42,29 @@ #include "pcie_interface.h" #include "openair_device.h" #include "common_lib.h" +#include +#include +#include + +typedef enum { + idle=0, + waiting_for_synch, + running +} exmimo_daq_state_t; + +typedef struct { + pthread_t watchdog; + pthread_attr_t watchdog_attr; + struct sched_param watchdog_sched_param; + pthread_mutex_t watchdog_mutex; + int watchdog_exit; + exmimo_daq_state_t daq_state; + openair0_timestamp ts; + openair0_timestamp last_ts_rx; + int samples_per_tick; + int samples_per_frame; + int last_mbox; +} exmimo_state_t; // Use this to access shared memory (configuration structures, adc/dac data buffers, ...) // contains userspace pointers diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 5275bb43bd..f59ec9ba64 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -129,7 +129,7 @@ extern volatile int start_UE; #endif extern volatile int oai_exit; -extern openair0_config_t openair0_cfg[MAX_CARDS]; +extern openair0_config_t *openair0_cfg; extern pthread_cond_t sync_cond; extern pthread_mutex_t sync_mutex; @@ -1174,11 +1174,9 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c { int i, CC_id; -#ifndef EXMIMO + uint16_t N_TA_offset = 0; -#else - int j; -#endif + LTE_DL_FRAME_PARMS *frame_parms; @@ -1191,8 +1189,6 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c return(-1); } -#ifndef EXMIMO - if (frame_parms->frame_type == TDD) { if (frame_parms->N_RB_DL == 100) N_TA_offset = 624; @@ -1202,8 +1198,9 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c N_TA_offset = 624/4; } -#endif + + /* // replace RX signal buffers with mmaped HW versions #ifdef EXMIMO openair0_cfg[CC_id].tx_num_channels = 0; @@ -1253,7 +1250,9 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c } } -#else // not EXMIMO +#else // not EXMIMO + */ + rxdata = (int32_t**)malloc16(frame_parms->nb_antennas_rx*sizeof(int32_t*)); txdata = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); @@ -1275,7 +1274,7 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c } -#endif + } return(0); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 991438d4d5..66c60056b3 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -100,6 +100,7 @@ extern pthread_cond_t sync_cond; extern pthread_mutex_t sync_mutex; extern int sync_var; + extern openair0_config_t openair0_cfg[MAX_CARDS]; extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; From fc13e2005f222d7e48905f3004d5bd335b288e0d Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 20 Jun 2016 10:21:02 +0200 Subject: [PATCH 066/340] if header and data blocks seperated --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 81 +++++++++++++++----------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 36 ++++++------ 2 files changed, 65 insertions(+), 52 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 15e98c36f6..39a07a881b 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -48,21 +48,29 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; + int32_t **rxdataF = eNB->common_vars.rxdataF[0]; + + IF4_dl_header_t *dl_header=NULL; + IF4_ul_header_t *ul_header=NULL; + IF4_prach_header_t *prach_header=NULL; uint16_t symbol_id, element_id; - uint16_t db_fulllength = 12*fp->N_RB_DL; - uint16_t db_halflength = db_fulllength>>1; - int slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; - int blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - - int16_t *data_block = (int16_t*)malloc(db_fulllength*sizeof(int16_t)); + uint16_t db_halflength; + int slotoffsetF, blockoffsetF; + + int16_t *data_block=NULL; +// int16_t *txbuffer = (int16_t*)malloc(db_halflength*sizeof(int16_t)); - // Caller: RCC - DL *** handle RRU case - UL and PRACH *** if (packet_type == IF4_PDLFFT) { - IF4_dl_packet_t *dl_packet = (IF4_dl_packet_t*)malloc(sizeof_IF4_dl_packet_t); - gen_IF4_dl_packet(dl_packet, proc); + dl_header = (IF4_dl_header_t*)malloc(sizeof_IF4_dl_header_t); + gen_IF4_dl_header(dl_header, proc); - dl_packet->data_block = data_block; + db_halflength = (12*fp->N_RB_DL)>>1; + slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + + printf("Problem here - db_half %d\n", db_halflength); + data_block = (int16_t*)malloc(db_halflength*sizeof(int16_t)); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { @@ -78,40 +86,45 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { } // Update information in generated packet - dl_packet->frame_status.sym_num = symbol_id; + dl_header->frame_status.sym_num = symbol_id; + printf("\n Not even here !!\n"); // Write the packet(s) to the fronthaul - // if ((bytes_sent = eNB->ifdevice.trx_write_func(&eNB->ifdevice, - // (proc->timestamp_tx-eNB->ifdevice.openair0_cfg.tx_sample_advance), - // dl_packet, - // eNB->frame_parms.samples_per_tti, - // eNB->frame_parms.nb_antennas_tx, - // 0)) < 0) { - // perror("RCC : ETHERNET write"); - //} + if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, + symbol_id, + &data_block, + 1, + 1, + 0)) < 0) { + perror("RCC : ETHERNET write"); + } slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; } } else if (packet_type == IF4_PULFFT) { - IF4_ul_packet_t *ul_packet = (IF4_ul_packet_t*)malloc(sizeof_IF4_ul_packet_t); - gen_IF4_ul_packet(ul_packet, proc); + ul_header = (IF4_ul_header_t*)malloc(sizeof_IF4_ul_header_t); + gen_IF4_ul_header(ul_header, proc); + + db_halflength = (12*fp->N_RB_UL)>>1; + slotoffsetF = (proc->subframe_rx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - ul_packet->data_block = data_block; + data_block = (int16_t*)malloc(db_halflength*sizeof(int16_t)); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { // Do compression of the two parts and generate data blocks - rxdataF for (element_id=0; element_id>16) + 32768 ]<<8; + data_block[element_id] = lin2alaw[ (rxdataF[0][blockoffsetF+element_id] & 0xffff) + 32768 ]; + data_block[element_id] |= lin2alaw[ (rxdataF[0][blockoffsetF+element_id]>>16) + 32768 ]<<8; - //data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; - //data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; + data_block[element_id+db_halflength] = lin2alaw[ (rxdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; + data_block[element_id+db_halflength] |= lin2alaw[ (rxdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; } // Update information in generated packet - ul_packet->frame_status.sym_num = symbol_id; + ul_header->frame_status.sym_num = symbol_id; // Write the packet(s) to the fronthaul @@ -131,7 +144,7 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, uint32_t *symbol_number) { *packet_type = 0; - int16_t *data_block=NULL; + //int16_t *data_block=NULL; // Read packet(s) from the fronthaul // for(i=0; isymbols_per_tti; i++) { @@ -166,7 +179,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u return; } -void gen_IF4_dl_packet(IF4_dl_packet_t *dl_packet, eNB_rxtx_proc_t *proc) { +void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type dl_packet->type = IF4_PACKET_TYPE; dl_packet->sub_type = IF4_PDLFFT; @@ -183,10 +196,10 @@ void gen_IF4_dl_packet(IF4_dl_packet_t *dl_packet, eNB_rxtx_proc_t *proc) { dl_packet->frame_status.rsvd = 0; // Set frame check sequence - dl_packet->fcs = 0; + } -void gen_IF4_ul_packet(IF4_ul_packet_t *ul_packet, eNB_rxtx_proc_t *proc) { +void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type ul_packet->type = IF4_PACKET_TYPE; ul_packet->sub_type = IF4_PULFFT; @@ -207,10 +220,10 @@ void gen_IF4_ul_packet(IF4_ul_packet_t *ul_packet, eNB_rxtx_proc_t *proc) { ul_packet->gain0.rsvd = 0; // Set frame check sequence - ul_packet->fcs = 0; + } -void gen_IF4_prach_packet(IF4_prach_packet_t *prach_packet, eNB_rxtx_proc_t *proc) { +void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type prach_packet->type = IF4_PACKET_TYPE; prach_packet->sub_type = IF4_PRACH; @@ -226,5 +239,5 @@ void gen_IF4_prach_packet(IF4_prach_packet_t *prach_packet, eNB_rxtx_proc_t *pro prach_packet->prach_conf.exponent = 0; // Set frame check sequence - prach_packet->fcs = 0; + } diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index a6ca7eb5c0..d61c0c59a0 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -93,7 +93,7 @@ struct IF4_lte_prach_conf { typedef struct IF4_lte_prach_conf IF4_lte_prach_conf_t; #define sizeof_IF4_lte_prach_conf_t 4 -struct IF4_dl_packet { +struct IF4_dl_header { /// Destination Address /// Source Address @@ -107,15 +107,15 @@ struct IF4_dl_packet { /// Frame Status IF4_frame_status_t frame_status; /// Data Blocks - int16_t *data_block; + /// Frame Check Sequence - uint32_t fcs; + }; -typedef struct IF4_dl_packet IF4_dl_packet_t; -#define sizeof_IF4_dl_packet_t 18 +typedef struct IF4_dl_header IF4_dl_header_t; +#define sizeof_IF4_dl_header_t 12 -struct IF4_ul_packet { +struct IF4_ul_header { /// Destination Address /// Source Address @@ -145,15 +145,15 @@ struct IF4_ul_packet { /// Gain 7 IF4_gain_t gain7; /// Data Blocks - int16_t *data_block; + /// Frame Check Sequence - uint32_t fcs; + }; -typedef struct IF4_ul_packet IF4_ul_packet_t; -#define sizeof_IF4_ul_packet_t 34 +typedef struct IF4_ul_header IF4_ul_header_t; +#define sizeof_IF4_ul_header_t 28 -struct IF4_prach_packet { +struct IF4_prach_header { /// Destination Address /// Source Address @@ -167,19 +167,19 @@ struct IF4_prach_packet { /// LTE Prach Configuration IF4_lte_prach_conf_t prach_conf; /// Prach Data Block (one antenna) - int16_t *data_block; + /// Frame Check Sequence - uint32_t fcs; + }; -typedef struct IF4_prach_packet IF4_prach_packet_t; -#define sizeof_IF4_prach_packet_t 18 +typedef struct IF4_prach_header IF4_prach_header_t; +#define sizeof_IF4_prach_header_t 12 -void gen_IF4_dl_packet(IF4_dl_packet_t*, eNB_rxtx_proc_t*); +void gen_IF4_dl_header(IF4_dl_header_t*, eNB_rxtx_proc_t*); -void gen_IF4_ul_packet(IF4_ul_packet_t*, eNB_rxtx_proc_t*); +void gen_IF4_ul_header(IF4_ul_header_t*, eNB_rxtx_proc_t*); -void gen_IF4_prach_packet(IF4_prach_packet_t*, eNB_rxtx_proc_t*); +void gen_IF4_prach_header(IF4_prach_header_t*, eNB_rxtx_proc_t*); void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t); From 9246b16ca9d168f8490b651944f9ceaddf20e318 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 20 Jun 2016 10:51:40 +0200 Subject: [PATCH 067/340] added logic for recv_if4 function --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 79 ++++++++++++++++++++------ 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 39a07a881b..5da0b0f81f 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -96,7 +96,7 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { 1, 1, 0)) < 0) { - perror("RCC : ETHERNET write"); + perror("ETHERNET write"); } slotoffsetF += fp->ofdm_symbol_size; @@ -142,35 +142,78 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { } void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, uint32_t *symbol_number) { + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + int32_t **txdataF = eNB->common_vars.txdataF[0]; + int32_t **rxdataF = eNB->common_vars.rxdataF[0]; + + uint16_t element_id; + uint16_t db_halflength; + int slotoffsetF, blockoffsetF; *packet_type = 0; - //int16_t *data_block=NULL; + void *rxbuffer=NULL; + int16_t *data_block=NULL; // Read packet(s) from the fronthaul -// for(i=0; isymbols_per_tti; i++) { -// if (dev->eth_dev.trx_read_func (&dev->eth_dev, -// timestamp_rx, -// rx_eNB, -// spp_eth, -// dev->eth_dev.openair0_cfg->rx_num_channels -// ) < 0) { -// perror("RRU : ETHERNET read"); -// } -// printf("\n Recv IF4 for frame %d, subframe %d and symbol %d\n", proc->frame_tx, proc->subframe_tx, symbol_id); + if (eNB->ifdevice.trx_read_func (&eNB->ifdevice, + symbol_number, + rxbuffer, + fp->symbols_per_tti, + eNB->ifdevice.openair0_cfg->rx_num_channels + ) < 0) { + perror("ETHERNET read"); + } - //*packet_type = ; + packet_type = (uint16_t*) (rxbuffer+2); if (*packet_type == IF4_PDLFFT) { + data_block = (int16_t*) (rxbuffer+sizeof_IF4_dl_header_t); - // Apply reverse processing - decompression - // txAlawtolinear( Datablock ) - - // Generate and return the OFDM symbols (txdataF) - // txDataF + db_halflength = (12*fp->N_RB_DL)>>1; + // Calculate from received packet + slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + + data_block = (int16_t*)malloc(db_halflength*sizeof(int16_t)); + + // Do decompression of the two parts and generate data blocks + for (element_id=0; element_id>8) ]<<16; + + txdataF[0][slotoffsetF+element_id] = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ]; + txdataF[0][slotoffsetF+element_id] |= alaw2lin[ (data_block[element_id+db_halflength]>>8) ]<<16; + } + + // Find and return symbol_number + *symbol_number = 0; + } else if (*packet_type == IF4_PULFFT) { + data_block = (int16_t*) (rxbuffer+sizeof_IF4_ul_header_t); + + db_halflength = (12*fp->N_RB_UL)>>1; + + // Calculate from received packet + slotoffsetF = (proc->subframe_rx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + + data_block = (int16_t*)malloc(db_halflength*sizeof(int16_t)); + + // Do decompression of the two parts and generate data blocks + for (element_id=0; element_id>8) ]<<16; + + rxdataF[0][slotoffsetF+element_id] = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ]; + rxdataF[0][slotoffsetF+element_id] |= alaw2lin[ (data_block[element_id+db_halflength]>>8) ]<<16; + } + + // Find and return symbol_number + *symbol_number = 0; } else if (*packet_type == IF4_PRACH) { + data_block = (int16_t*) (rxbuffer+sizeof_IF4_prach_header_t); } else { AssertFatal(1==0, "recv_IF4 - Unknown packet_type %x", *packet_type); From f2e183fb2b7bbb56c2813b4d10205447b44bb413 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 20 Jun 2016 18:33:37 +0200 Subject: [PATCH 068/340] handling changes in eth lower level functions --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 131 +++++++++++++++---------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 10 +- 2 files changed, 85 insertions(+), 56 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 5da0b0f81f..946734f81b 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -44,38 +44,34 @@ #include "PHY/LTE_TRANSPORT/if4_tools.h" #include "PHY/TOOLS/ALAW/alaw_lut.h" -// Get device information -void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { +// --- Careful to handle buffer memory --- RAW/UDP modes --- PRACH variables and data +void send_IF4(PHY_VARS_eNB *eNB, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; - - IF4_dl_header_t *dl_header=NULL; - IF4_ul_header_t *ul_header=NULL; - IF4_prach_header_t *prach_header=NULL; - + int16_t *prachF = eNB->prach_vars.prachF; + uint16_t symbol_id, element_id; - uint16_t db_halflength; + uint16_t db_fulllength, db_halflength; int slotoffsetF, blockoffsetF; + void *tx_buffer=NULL; int16_t *data_block=NULL; -// int16_t *txbuffer = (int16_t*)malloc(db_halflength*sizeof(int16_t)); if (packet_type == IF4_PDLFFT) { - dl_header = (IF4_dl_header_t*)malloc(sizeof_IF4_dl_header_t); - gen_IF4_dl_header(dl_header, proc); - - db_halflength = (12*fp->N_RB_DL)>>1; + db_fulllength = 12*fp->N_RB_DL; + db_halflength = (db_fulllength)>>1; slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - - printf("Problem here - db_half %d\n", db_halflength); - data_block = (int16_t*)malloc(db_halflength*sizeof(int16_t)); + tx_buffer = malloc(/*SIZE_OF_MAC_BYTES +*/ sizeof_IF4_dl_header_t + db_fulllength*sizeof(int16_t)); + IF4_dl_header_t *dl_header = (IF4_dl_header_t *)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/); + data_block = (int16_t*)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/ + sizeof_IF4_dl_header_t); + + gen_IF4_dl_header(dl_header, proc); + for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - - printf("\n Send IF4 for frame %d, subframe %d and symbol %d\n", proc->frame_tx, proc->subframe_tx, symbol_id); - // Do compression of the two parts and generate data blocks for (element_id=0; element_idframe_status.sym_num = symbol_id; - printf("\n Not even here !!\n"); - // Write the packet(s) to the fronthaul + // Write the packet to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, - symbol_id, - &data_block, - 1, - 1, - 0)) < 0) { - perror("ETHERNET write"); + symbol_id, + tx_buffer, + db_fulllength, + 1, + IF4_PDLFFT)) < 0) { + perror("ETHERNET write for IF4_PDLFFT\n"); } slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; } } else if (packet_type == IF4_PULFFT) { - ul_header = (IF4_ul_header_t*)malloc(sizeof_IF4_ul_header_t); - gen_IF4_ul_header(ul_header, proc); - - db_halflength = (12*fp->N_RB_UL)>>1; + db_fulllength = 12*fp->N_RB_UL; + db_halflength = (db_fulllength)>>1; slotoffsetF = (proc->subframe_rx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - - data_block = (int16_t*)malloc(db_halflength*sizeof(int16_t)); + + tx_buffer = malloc(/*SIZE_OF_MAC_BYTES +*/ sizeof_IF4_dl_header_t + db_fulllength*sizeof(int16_t)); + IF4_ul_header_t *ul_header = (IF4_ul_header_t *)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/); + data_block = (int16_t*)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/ + sizeof_IF4_ul_header_t); + + gen_IF4_ul_header(ul_header, proc); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - // Do compression of the two parts and generate data blocks - rxdataF for (element_id=0; element_idframe_status.sym_num = symbol_id; // Write the packet(s) to the fronthaul + if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, + symbol_id, + tx_buffer, + db_fulllength, + 1, + IF4_PULFFT)) < 0) { + perror("ETHERNET write for IF4_PULFFT\n"); + } slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; } } else if (packet_type == IF4_PRACH) { - - + // FIX: hard coded prach samples length + db_fulllength = 839; + slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + + tx_buffer = malloc(/*SIZE_OF_MAC_BYTES +*/ sizeof_IF4_prach_header_t + db_fulllength*sizeof(int16_t)); + IF4_prach_header_t *prach_header = (IF4_prach_header_t *)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/); + data_block = (int16_t*)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/ + sizeof_IF4_prach_header_t); + + gen_IF4_prach_header(prach_header, proc); + + // Do compression and generate data blocks + for (element_id=0; element_id>16) + 32768 ]<<8; + } + + // Write the packet to the fronthaul + if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, + symbol_id, + tx_buffer, + db_fulllength, + 1, + IF4_PRACH)) < 0) { + perror("ETHERNET write for IF4_PRACH\n"); + } } else { AssertFatal(1==0, "send_IF4 - Unknown packet_type %x", packet_type); } + free(tx_buffer); return; } -void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, uint32_t *symbol_number) { +void recv_IF4(PHY_VARS_eNB *eNB, uint16_t *packet_type, uint32_t *symbol_number) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; @@ -151,23 +180,22 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u int slotoffsetF, blockoffsetF; *packet_type = 0; - void *rxbuffer=NULL; + void *rx_buffer=NULL; int16_t *data_block=NULL; // Read packet(s) from the fronthaul - if (eNB->ifdevice.trx_read_func (&eNB->ifdevice, + if (eNB->ifdevice.trx_read_func(&eNB->ifdevice, symbol_number, - rxbuffer, - fp->symbols_per_tti, - eNB->ifdevice.openair0_cfg->rx_num_channels - ) < 0) { + rx_buffer, + 0, + 0) < 0) { perror("ETHERNET read"); } - packet_type = (uint16_t*) (rxbuffer+2); + packet_type = (uint16_t*) (rx_buffer+2); if (*packet_type == IF4_PDLFFT) { - data_block = (int16_t*) (rxbuffer+sizeof_IF4_dl_header_t); + data_block = (int16_t*) (rx_buffer+sizeof_IF4_dl_header_t); db_halflength = (12*fp->N_RB_DL)>>1; @@ -190,7 +218,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u *symbol_number = 0; } else if (*packet_type == IF4_PULFFT) { - data_block = (int16_t*) (rxbuffer+sizeof_IF4_ul_header_t); + data_block = (int16_t*) (rx_buffer+sizeof_IF4_ul_header_t); db_halflength = (12*fp->N_RB_UL)>>1; @@ -213,16 +241,17 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u *symbol_number = 0; } else if (*packet_type == IF4_PRACH) { - data_block = (int16_t*) (rxbuffer+sizeof_IF4_prach_header_t); + data_block = (int16_t*) (rx_buffer+sizeof_IF4_prach_header_t); } else { AssertFatal(1==0, "recv_IF4 - Unknown packet_type %x", *packet_type); } - + + free(rx_buffer); return; } -void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_rxtx_proc_t *proc) { +void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_proc_t *proc) { // Set Type and Sub-Type dl_packet->type = IF4_PACKET_TYPE; dl_packet->sub_type = IF4_PDLFFT; @@ -242,7 +271,7 @@ void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_rxtx_proc_t *proc) { } -void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_rxtx_proc_t *proc) { +void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_proc_t *proc) { // Set Type and Sub-Type ul_packet->type = IF4_PACKET_TYPE; ul_packet->sub_type = IF4_PULFFT; @@ -266,7 +295,7 @@ void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_rxtx_proc_t *proc) { } -void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, eNB_rxtx_proc_t *proc) { +void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, eNB_proc_t *proc) { // Set Type and Sub-Type prach_packet->type = IF4_PACKET_TYPE; prach_packet->sub_type = IF4_PRACH; diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index d61c0c59a0..269ecb72a9 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -175,12 +175,12 @@ struct IF4_prach_header { typedef struct IF4_prach_header IF4_prach_header_t; #define sizeof_IF4_prach_header_t 12 -void gen_IF4_dl_header(IF4_dl_header_t*, eNB_rxtx_proc_t*); +void gen_IF4_dl_header(IF4_dl_header_t*, eNB_proc_t*); -void gen_IF4_ul_header(IF4_ul_header_t*, eNB_rxtx_proc_t*); +void gen_IF4_ul_header(IF4_ul_header_t*, eNB_proc_t*); -void gen_IF4_prach_header(IF4_prach_header_t*, eNB_rxtx_proc_t*); +void gen_IF4_prach_header(IF4_prach_header_t*, eNB_proc_t*); -void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t); +void send_IF4(PHY_VARS_eNB*, uint16_t); -void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t*, uint32_t*); +void recv_IF4(PHY_VARS_eNB*, uint16_t*, uint32_t*); From a8def02fbf3d4e0d5b25fd409db88c406e759699 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 20 Jun 2016 18:36:17 +0200 Subject: [PATCH 069/340] starting to add if4 specific eth read, write --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 94 ++++++++++++++++++- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 21 ++++- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 10 ++ 3 files changed, 119 insertions(+), 6 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index a360f26556..14561a25e7 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -140,7 +140,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi //sendto_flag|=flags; eth->tx_nsamps=nsamps; - + for (i=0;ipriv; + int Mod_id = device->Mod_id; + + ssize_t packet_size; + + if (flags == IF4_PDLFFT) { + packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4_PULFFT) { + packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); + } else { + packet_size = RAW_IF4_PRACH_SIZE_BYTES(nblocks); + } + + eth->tx_nsamps = nblocks; + + memcpy(buff[0], (void*)&eh, MAC_HEADER_SIZE_BYTES); + + bytes_sent = send(eth->sockfd[Mod_id], + buff[0], + packet_size, + 0); + + if (bytes_sent == -1) { + eth->num_tx_errors++; + perror("ETHERNET WRITE: "); + exit(-1); + } else { + eth->tx_actual_nsamps = bytes_sent>>1; + eth->tx_count++; + } + + return (bytes_sent-MAC_HEADER_SIZE_BYTES); +} + + + int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { int bytes_received=0; @@ -256,7 +298,55 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi return (bytes_received-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES)>>2; } - + + +int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + + int bytes_received=0; + int i=0; + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; + int rcvfrom_flag =0; + + eth->rx_nsamps=nsamps; + + /* buff[i] points to the position in rx buffer where the payload to be received will be placed + buff2 points to the position in rx buffer where the packet header will be placed */ + void *buff2 = (void*)(buff[i]-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES); + + /* we don't want to ovewrite with the header info the previous rx buffer data so we store it*/ + struct ether_header temp = *(struct ether_header *)buff2; + int32_t temp0 = *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES); + openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); + + bytes_received=0; + + while(bytes_received < RAW_PACKET_SIZE_BYTES(nsamps)) { + bytes_received +=recv(eth->sockfd[Mod_id], + buff2, + RAW_PACKET_SIZE_BYTES(nsamps), + rcvfrom_flag); + + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("ETHERNET READ: "); + exit(-1); + } else { + /* store the timestamp value from packet's header */ + *timestamp = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); + eth->rx_actual_nsamps=bytes_received>>2; + eth->rx_count++; + } + } + + /* tx buffer values restored */ + *(struct ether_header *)buff2 = temp; + *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES) = temp0; + *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)) = temp1; + + return (bytes_received-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES)>>2; +} + int eth_set_dev_conf_raw(openair0_device *device) { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index f15f2d98eb..7537d77e2e 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -313,8 +313,14 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth if (eth_params->transp_preference == 1) { eth->flags = ETH_RAW_MODE; - } else { + } else if (eth_params->transp_preference == 0) { eth->flags = ETH_UDP_MODE; + } else if (eth_params->transp_preference == 3) { + eth->flags = ETH_RAW_IF4_MODE; + } else if (eth_params->transp_preference == 2) { + eth->flags = ETH_UDP_IF4_MODE; + } else { + AssertFatal(0==4, "transport_init: Unknown transport preference %d", eth_params->transp_preference); } printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); @@ -330,14 +336,21 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth device->trx_set_freq_func = trx_eth_set_freq; device->trx_set_gains_func = trx_eth_set_gains; - if ((eth->flags & ETH_RAW_MODE) != 0 ) { + /// handle if4 eth read and write functions + if (eth->flags == ETH_RAW_MODE) { device->trx_write_func = trx_eth_write_raw; device->trx_read_func = trx_eth_read_raw; - } else { + } else if (eth->flags == ETH_UDP_MODE) { device->trx_write_func = trx_eth_write_udp; device->trx_read_func = trx_eth_read_udp; + } else if (eth->flags == ETH_RAW_IF4_MODE) { + device->trx_write_func = trx_eth_write_raw_IF4; + device->trx_read_func = trx_eth_read_raw_IF4; + } else { + device->trx_write_func = trx_eth_write_udp_IF4; + device->trx_read_func = trx_eth_read_udp_IF4; } - + eth->if_name[device->Mod_id] = eth_params->local_if_name; device->priv = eth; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index b4618bb825..beb324cc59 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -54,6 +54,8 @@ #define ETH_RAW_MODE 1 #define ETH_UDP_MODE 0 +#define ETH_RAW_IF4_MODE 3 +#define ETH_UDP_IF4_MODE 2 #define TX_FLAG 1 #define RX_FLAG 0 @@ -65,6 +67,10 @@ #define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) #define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) +#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (2*scaled_nblocks) +#define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4_PRACH_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) /*!\brief opaque ethernet data structure */ typedef struct { @@ -212,6 +218,8 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value); int eth_socket_init_udp(openair0_device *device); int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +//int trx_eth_write_udp_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); +//int trx_eth_read_udp_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int eth_get_dev_conf_udp(openair0_device *device); /*! \fn static int eth_set_dev_conf_udp(openair0_device *device) @@ -226,6 +234,8 @@ int eth_set_dev_conf_udp(openair0_device *device); int eth_socket_init_raw(openair0_device *device); int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +//int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); +//int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int eth_get_dev_conf_raw(openair0_device *device); int eth_set_dev_conf_raw(openair0_device *device); From e5132ebf5f5b11ae331053bbccccd92bb55bb309 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 20 Jun 2016 13:59:00 -0700 Subject: [PATCH 070/340] eNB_proc_t -> eNB_rxtx_proc_t in if4_tools.c, addition on parameter of functions --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 10 ++++------ openair1/PHY/LTE_TRANSPORT/if4_tools.h | 8 ++++---- targets/RT/USER/lte-enb.c | 2 -- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 946734f81b..d07817c310 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -45,9 +45,8 @@ #include "PHY/TOOLS/ALAW/alaw_lut.h" // --- Careful to handle buffer memory --- RAW/UDP modes --- PRACH variables and data -void send_IF4(PHY_VARS_eNB *eNB, uint16_t packet_type) { +void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - eNB_proc_t *proc = &eNB->proc; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; int16_t *prachF = eNB->prach_vars.prachF; @@ -169,9 +168,8 @@ void send_IF4(PHY_VARS_eNB *eNB, uint16_t packet_type) { return; } -void recv_IF4(PHY_VARS_eNB *eNB, uint16_t *packet_type, uint32_t *symbol_number) { +void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, uint32_t *symbol_number) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - eNB_proc_t *proc = &eNB->proc; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; @@ -251,7 +249,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, uint16_t *packet_type, uint32_t *symbol_number) return; } -void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_proc_t *proc) { +void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type dl_packet->type = IF4_PACKET_TYPE; dl_packet->sub_type = IF4_PDLFFT; @@ -271,7 +269,7 @@ void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_proc_t *proc) { } -void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_proc_t *proc) { +void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_rxtx_proc_t *proc) { // Set Type and Sub-Type ul_packet->type = IF4_PACKET_TYPE; ul_packet->sub_type = IF4_PULFFT; diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 269ecb72a9..9d4424ab01 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -175,12 +175,12 @@ struct IF4_prach_header { typedef struct IF4_prach_header IF4_prach_header_t; #define sizeof_IF4_prach_header_t 12 -void gen_IF4_dl_header(IF4_dl_header_t*, eNB_proc_t*); +void gen_IF4_dl_header(IF4_dl_header_t*, eNB_rxtx_proc_t*); -void gen_IF4_ul_header(IF4_ul_header_t*, eNB_proc_t*); +void gen_IF4_ul_header(IF4_ul_header_t*, eNB_rxtx_proc_t*); void gen_IF4_prach_header(IF4_prach_header_t*, eNB_proc_t*); -void send_IF4(PHY_VARS_eNB*, uint16_t); +void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t); -void recv_IF4(PHY_VARS_eNB*, uint16_t*, uint32_t*); +void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t*, uint32_t*); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 0113ee4b5b..8126ef46e0 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1245,8 +1245,6 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); } - - } return(0); From ad9411fcaa5a1ee5e33554cd416f0df6b2196e9c Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 21 Jun 2016 11:05:11 +0200 Subject: [PATCH 071/340] changes to allow if4 specific eth transport modes --- openair2/ENB_APP/enb_config.c | 4 ++ openair2/ENB_APP/enb_config.h | 2 + targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 1 + targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 1 + .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 3 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 15 +---- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 57 +++++++++++++++++++ targets/RT/USER/lte-softmodem.c | 13 ++++- 8 files changed, 79 insertions(+), 17 deletions(-) create mode 100644 targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 51d5f3805f..7f8cf95c2b 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -2242,6 +2242,10 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; } else if (strcmp(tr_preference, "raw") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; + } else if (strcmp(tr_preference, "udpif4") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udpif4 = 1; + } else if (strcmp(tr_preference, "rawif4") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rawif4 = 1; } else {//if (strcmp(preference, "no") == 0) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 5f7f2636a3..e53921b4d0 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -86,6 +86,8 @@ typedef struct rrh_gw_config_s { char *remote_address; uint16_t local_port; uint16_t remote_port; + uint8_t udpif4; + uint8_t rawif4; int tx_scheduling_advance; int tx_sample_advance; int iq_txshift; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 14561a25e7..be524b6d5f 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -51,6 +51,7 @@ #include "common_lib.h" #include "ethernet_lib.h" +#include "if_defs.h" #define DEBUG 0 diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index a9706c73bd..55b5e08535 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -52,6 +52,7 @@ #include "common_lib.h" #include "ethernet_lib.h" +#include "if_defs.h" #define DEBUG 0 struct sockaddr_in dest_addr[MAX_INST]; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 7537d77e2e..ee9ba50f66 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -51,7 +51,7 @@ #include "common_lib.h" #include "ethernet_lib.h" - +#include "if_defs.h" int num_devices_eth = 0; struct sockaddr_in dest_addr[MAX_INST]; @@ -336,7 +336,6 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth device->trx_set_freq_func = trx_eth_set_freq; device->trx_set_gains_func = trx_eth_set_gains; - /// handle if4 eth read and write functions if (eth->flags == ETH_RAW_MODE) { device->trx_write_func = trx_eth_write_raw; device->trx_read_func = trx_eth_read_raw; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index beb324cc59..72ddc0e87c 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -52,25 +52,12 @@ #define MAX_INST 4 #define DEFAULT_IF "lo" -#define ETH_RAW_MODE 1 -#define ETH_UDP_MODE 0 -#define ETH_RAW_IF4_MODE 3 -#define ETH_UDP_IF4_MODE 2 - #define TX_FLAG 1 #define RX_FLAG 0 -#define MAX_PACKET_SEQ_NUM(spp,spf) (spf/spp) +#include "if_defs.h" #define MAC_HEADER_SIZE_BYTES (sizeof(struct ether_header)) #define APP_HEADER_SIZE_BYTES (sizeof(int32_t) + sizeof(openair0_timestamp)) -#define PAYLOAD_SIZE_BYTES(nsamps) (nsamps<<2) -#define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) -#define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) - -#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (2*scaled_nblocks) -#define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) -#define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) -#define RAW_IF4_PRACH_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) /*!\brief opaque ethernet data structure */ typedef struct { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h new file mode 100644 index 0000000000..f38421bed2 --- /dev/null +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -0,0 +1,57 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/*! \file targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +// ETH transport preference modes +#define ETH_UDP_MODE 0 +#define ETH_RAW_MODE 1 +#define ETH_UDP_IF4_MODE 2 +#define ETH_RAW_IF4_MODE 3 + +// Time domain RRH packet sizes +#define MAX_PACKET_SEQ_NUM(spp,spf) (spf/spp) +#define PAYLOAD_SIZE_BYTES(nsamps) (nsamps<<2) +#define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) +#define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) + +// Packet sizes for IF4 interface format +#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (2*scaled_nblocks) +#define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4_PRACH_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 50ffc6e1ff..dd55dacb1f 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -65,6 +65,7 @@ //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all #include "../../ARCH/COMMON/common_lib.h" +#include "../../ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all @@ -1016,7 +1017,17 @@ static void get_options (int argc, char **argv) (eth_params+j)->my_port = enb_properties->properties[i]->rrh_gw_config[j].local_port; (eth_params+j)->remote_addr = enb_properties->properties[i]->rrh_gw_config[j].remote_address; (eth_params+j)->remote_port = enb_properties->properties[i]->rrh_gw_config[j].remote_port; - (eth_params+j)->transp_preference = enb_properties->properties[i]->rrh_gw_config[j].raw; + + if (enb_properties->properties[i]->rrh_gw_config[j].raw == 1) { + (eth_params+j)->transp_preference = ETH_RAW_MODE; + } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif4 == 1) { + (eth_params+j)->transp_preference = ETH_RAW_IF4_MODE; + } else if (enb_properties->properties[i]->rrh_gw_config[j].udpif4 == 1) { + (eth_params+j)->transp_preference = ETH_UDP_IF4_MODE; + } else { + (eth_params+j)->transp_preference = ETH_UDP_MODE; + } + (eth_params+j)->iq_txshift = enb_properties->properties[i]->rrh_gw_config[j].iq_txshift; (eth_params+j)->tx_sample_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_sample_advance; (eth_params+j)->tx_scheduling_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_scheduling_advance; From ba77625411dfa4c0f59512be302aac34dd30a3c8 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 21 Jun 2016 11:50:17 +0200 Subject: [PATCH 072/340] device specific eth headers - needs testing --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 19 +++++++++---------- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 3 ++- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 3 +++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index be524b6d5f..df2018ad0a 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -59,7 +59,6 @@ struct sockaddr_ll dest_addr[MAX_INST]; struct sockaddr_ll local_addr[MAX_INST]; int addr_len[MAX_INST]; struct ifreq if_index[MAX_INST]; -struct ether_header eh; int eth_socket_init_raw(openair0_device *device) { @@ -121,11 +120,11 @@ int eth_socket_init_raw(openair0_device *device) { } /* Construct the Ethernet header */ - ether_aton_r(local_mac, (struct ether_addr *)(&(eh.ether_shost))); - ether_aton_r(remote_mac, (struct ether_addr *)(&(eh.ether_dhost))); - eh.ether_type = htons((short)device->openair0_cfg->my_port); + ether_aton_r(local_mac, (struct ether_addr *)(&(eth->eh.ether_shost))); + ether_aton_r(remote_mac, (struct ether_addr *)(&(eth->eh.ether_dhost))); + eth->eh.ether_type = htons((short)device->openair0_cfg->my_port); - printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eh.ether_shost[0],eh.ether_shost[1],eh.ether_shost[2],eh.ether_shost[3],eh.ether_shost[4],eh.ether_shost[5]); + printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5]); return 0; } @@ -153,7 +152,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); bytes_sent = 0; - memcpy(buff2,(void*)&eh,MAC_HEADER_SIZE_BYTES); + memcpy(buff2,(void*)ð->eh,MAC_HEADER_SIZE_BYTES); *(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t))=1+(i<<1); *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)) = timestamp; @@ -220,7 +219,7 @@ int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, eth->tx_nsamps = nblocks; - memcpy(buff[0], (void*)&eh, MAC_HEADER_SIZE_BYTES); + memcpy(buff[0], (void*)ð->eh, MAC_HEADER_SIZE_BYTES); bytes_sent = send(eth->sockfd[Mod_id], buff[0], @@ -365,7 +364,7 @@ int eth_set_dev_conf_raw(openair0_device *device) { msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); - memcpy(msg,(void*)&eh,MAC_HEADER_SIZE_BYTES); + memcpy(msg,(void*)ð->eh,MAC_HEADER_SIZE_BYTES); memcpy((msg+MAC_HEADER_SIZE_BYTES),(void*)device->openair0_cfg,sizeof(openair0_config_t)); if (send(eth->sockfd[Mod_id], @@ -401,10 +400,10 @@ int eth_get_dev_conf_raw(openair0_device *device) { } /* RRH stores the remote MAC address */ - memcpy(eh.ether_dhost,(msg+ETH_ALEN),ETH_ALEN); + memcpy(eth->eh.ether_dhost,(msg+ETH_ALEN),ETH_ALEN); //memcpy((void*)&device->openair0_cfg,(msg + MAC_HEADER_SIZE_BYTES), sizeof(openair0_config_t)); device->openair0_cfg=(openair0_config_t *)(msg + MAC_HEADER_SIZE_BYTES); - printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eh.ether_shost[0],eh.ether_shost[1],eh.ether_shost[2],eh.ether_shost[3],eh.ether_shost[4],eh.ether_shost[5],eh.ether_dhost[0],eh.ether_dhost[1],eh.ether_dhost[2],eh.ether_dhost[3],eh.ether_dhost[4],eh.ether_dhost[5]); + printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5],eth->eh.ether_dhost[0],eth->eh.ether_dhost[1],eth->eh.ether_dhost[2],eth->eh.ether_dhost[3],eth->eh.ether_dhost[4],eth->eh.ether_dhost[5]); return 0; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 72ddc0e87c..307a312670 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -56,7 +56,6 @@ #define RX_FLAG 0 #include "if_defs.h" -#define MAC_HEADER_SIZE_BYTES (sizeof(struct ether_header)) #define APP_HEADER_SIZE_BYTES (sizeof(int32_t) + sizeof(openair0_timestamp)) /*!\brief opaque ethernet data structure */ @@ -114,6 +113,8 @@ typedef struct { /*!\brief number of packets received */ uint64_t rx_count; + struct ether_header eh; + } eth_state_t; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index f38421bed2..04cd66e6e8 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -38,6 +38,8 @@ * \warning */ +#include + // ETH transport preference modes #define ETH_UDP_MODE 0 #define ETH_RAW_MODE 1 @@ -45,6 +47,7 @@ #define ETH_RAW_IF4_MODE 3 // Time domain RRH packet sizes +#define MAC_HEADER_SIZE_BYTES (sizeof(struct ether_header)) #define MAX_PACKET_SEQ_NUM(spp,spf) (spf/spp) #define PAYLOAD_SIZE_BYTES(nsamps) (nsamps<<2) #define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) From 12385fbd64e772e8887478a0f282d053a16c5ca0 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 21 Jun 2016 17:05:32 +0200 Subject: [PATCH 073/340] changes to handle different proc in callers --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 98 ++++++++++++++------------ openair1/PHY/LTE_TRANSPORT/if4_tools.h | 11 +-- 2 files changed, 60 insertions(+), 49 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index d07817c310..342512397a 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -44,8 +44,11 @@ #include "PHY/LTE_TRANSPORT/if4_tools.h" #include "PHY/TOOLS/ALAW/alaw_lut.h" +#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" + + // --- Careful to handle buffer memory --- RAW/UDP modes --- PRACH variables and data -void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { +void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; @@ -61,14 +64,14 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { if (packet_type == IF4_PDLFFT) { db_fulllength = 12*fp->N_RB_DL; db_halflength = (db_fulllength)>>1; - slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - tx_buffer = malloc(/*SIZE_OF_MAC_BYTES +*/ sizeof_IF4_dl_header_t + db_fulllength*sizeof(int16_t)); - IF4_dl_header_t *dl_header = (IF4_dl_header_t *)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/); - data_block = (int16_t*)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/ + sizeof_IF4_dl_header_t); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + db_fulllength*sizeof(int16_t)); + IF4_dl_header_t *dl_header = (IF4_dl_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t); - gen_IF4_dl_header(dl_header, proc); + gen_IF4_dl_header(dl_header, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { // Do compression of the two parts and generate data blocks @@ -99,14 +102,14 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { } else if (packet_type == IF4_PULFFT) { db_fulllength = 12*fp->N_RB_UL; db_halflength = (db_fulllength)>>1; - slotoffsetF = (proc->subframe_rx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - tx_buffer = malloc(/*SIZE_OF_MAC_BYTES +*/ sizeof_IF4_dl_header_t + db_fulllength*sizeof(int16_t)); - IF4_ul_header_t *ul_header = (IF4_ul_header_t *)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/); - data_block = (int16_t*)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/ + sizeof_IF4_ul_header_t); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + db_fulllength*sizeof(int16_t)); + IF4_ul_header_t *ul_header = (IF4_ul_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t); - gen_IF4_ul_header(ul_header, proc); + gen_IF4_ul_header(ul_header, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { // Do compression of the two parts and generate data blocks - rxdataF @@ -123,7 +126,7 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { // Write the packet(s) to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, - symbol_id, + (int64_t) symbol_id, tx_buffer, db_fulllength, 1, @@ -137,13 +140,13 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { } else if (packet_type == IF4_PRACH) { // FIX: hard coded prach samples length db_fulllength = 839; - slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; - tx_buffer = malloc(/*SIZE_OF_MAC_BYTES +*/ sizeof_IF4_prach_header_t + db_fulllength*sizeof(int16_t)); - IF4_prach_header_t *prach_header = (IF4_prach_header_t *)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/); - data_block = (int16_t*)(tx_buffer /*+ MAC_HEADER_SIZE_BYTES*/ + sizeof_IF4_prach_header_t); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + db_fulllength*sizeof(int16_t)); + IF4_prach_header_t *prach_header = (IF4_prach_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t); - gen_IF4_prach_header(prach_header, proc); + gen_IF4_prach_header(prach_header, frame, subframe); // Do compression and generate data blocks for (element_id=0; element_idifdevice.trx_write_func(&eNB->ifdevice, - symbol_id, + (int64_t) symbol_id, tx_buffer, db_fulllength, 1, @@ -168,29 +171,35 @@ void send_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t packet_type) { return; } -void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, uint32_t *symbol_number) { + +void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, uint32_t *symbol_number) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; + int16_t *prachF = eNB->prach_vars.prachF; uint16_t element_id; - uint16_t db_halflength; + uint16_t db_fulllength, db_halflength; int slotoffsetF, blockoffsetF; - + *packet_type = 0; + + int64_t *ret_type=(int64_t*)malloc(sizeof(int64_t)); void *rx_buffer=NULL; + void **buff=NULL; int16_t *data_block=NULL; // Read packet(s) from the fronthaul if (eNB->ifdevice.trx_read_func(&eNB->ifdevice, - symbol_number, - rx_buffer, + ret_type, + buff, 0, 0) < 0) { perror("ETHERNET read"); } - - packet_type = (uint16_t*) (rx_buffer+2); + + *packet_type = *ret_type; + rx_buffer = buff[0]; if (*packet_type == IF4_PDLFFT) { data_block = (int16_t*) (rx_buffer+sizeof_IF4_dl_header_t); @@ -198,12 +207,10 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u db_halflength = (12*fp->N_RB_DL)>>1; // Calculate from received packet - slotoffsetF = (proc->subframe_tx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - data_block = (int16_t*)malloc(db_halflength*sizeof(int16_t)); - - // Do decompression of the two parts and generate data blocks + // Do decompression of the two parts and generate txdataF for (element_id=0; element_id>8) ]<<16; @@ -213,7 +220,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u } // Find and return symbol_number - *symbol_number = 0; + *symbol_number = ((IF4_dl_header_t*)(rx_buffer))->frame_status.sym_num; } else if (*packet_type == IF4_PULFFT) { data_block = (int16_t*) (rx_buffer+sizeof_IF4_ul_header_t); @@ -221,12 +228,10 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u db_halflength = (12*fp->N_RB_UL)>>1; // Calculate from received packet - slotoffsetF = (proc->subframe_rx)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - data_block = (int16_t*)malloc(db_halflength*sizeof(int16_t)); - - // Do decompression of the two parts and generate data blocks + // Do decompression of the two parts and generate rxdataF for (element_id=0; element_id>8) ]<<16; @@ -236,10 +241,12 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u } // Find and return symbol_number - *symbol_number = 0; + *symbol_number = ((IF4_ul_header_t*)(rx_buffer))->frame_status.sym_num; } else if (*packet_type == IF4_PRACH) { data_block = (int16_t*) (rx_buffer+sizeof_IF4_prach_header_t); + + db_fulllength = 839; // hard coded } else { AssertFatal(1==0, "recv_IF4 - Unknown packet_type %x", *packet_type); @@ -249,7 +256,8 @@ void recv_IF4(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint16_t *packet_type, u return; } -void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_rxtx_proc_t *proc) { + +void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, int frame, int subframe) { // Set Type and Sub-Type dl_packet->type = IF4_PACKET_TYPE; dl_packet->sub_type = IF4_PDLFFT; @@ -260,8 +268,8 @@ void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_rxtx_proc_t *proc) { // Set frame status dl_packet->frame_status.ant_num = 0; dl_packet->frame_status.ant_start = 0; - dl_packet->frame_status.rf_num = proc->frame_tx; - dl_packet->frame_status.sf_num = proc->subframe_tx; + dl_packet->frame_status.rf_num = frame; + dl_packet->frame_status.sf_num = subframe; dl_packet->frame_status.sym_num = 0; dl_packet->frame_status.rsvd = 0; @@ -269,7 +277,8 @@ void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, eNB_rxtx_proc_t *proc) { } -void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_rxtx_proc_t *proc) { + +void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, int frame, int subframe) { // Set Type and Sub-Type ul_packet->type = IF4_PACKET_TYPE; ul_packet->sub_type = IF4_PULFFT; @@ -280,8 +289,8 @@ void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_rxtx_proc_t *proc) { // Set frame status ul_packet->frame_status.ant_num = 0; ul_packet->frame_status.ant_start = 0; - ul_packet->frame_status.rf_num = proc->frame_rx; - ul_packet->frame_status.sf_num = proc->subframe_rx; + ul_packet->frame_status.rf_num = frame; + ul_packet->frame_status.sf_num = subframe; ul_packet->frame_status.sym_num = 0; ul_packet->frame_status.rsvd = 0; @@ -293,7 +302,8 @@ void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, eNB_rxtx_proc_t *proc) { } -void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, eNB_proc_t *proc) { + +void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, int frame, int subframe) { // Set Type and Sub-Type prach_packet->type = IF4_PACKET_TYPE; prach_packet->sub_type = IF4_PRACH; @@ -304,8 +314,8 @@ void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, eNB_proc_t *proc) { // Set LTE Prach configuration prach_packet->prach_conf.rsvd = 0; prach_packet->prach_conf.ant = 0; - prach_packet->prach_conf.rf_num = proc->frame_rx; - prach_packet->prach_conf.sf_num = proc->subframe_rx; + prach_packet->prach_conf.rf_num = frame; + prach_packet->prach_conf.sf_num = subframe; prach_packet->prach_conf.exponent = 0; // Set frame check sequence diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 9d4424ab01..46396d3034 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -39,6 +39,7 @@ */ #include +#include "PHY/defs.h" /// Macro for IF4 packet type #define IF4_PACKET_TYPE 0x080A @@ -175,12 +176,12 @@ struct IF4_prach_header { typedef struct IF4_prach_header IF4_prach_header_t; #define sizeof_IF4_prach_header_t 12 -void gen_IF4_dl_header(IF4_dl_header_t*, eNB_rxtx_proc_t*); +void gen_IF4_dl_header(IF4_dl_header_t*, int, int); -void gen_IF4_ul_header(IF4_ul_header_t*, eNB_rxtx_proc_t*); +void gen_IF4_ul_header(IF4_ul_header_t*, int, int); -void gen_IF4_prach_header(IF4_prach_header_t*, eNB_proc_t*); +void gen_IF4_prach_header(IF4_prach_header_t*, int, int); -void send_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t); +void send_IF4(PHY_VARS_eNB*, int, int, uint16_t); -void recv_IF4(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint16_t*, uint32_t*); +void recv_IF4(PHY_VARS_eNB*, int, int, uint16_t*, uint32_t*); From d43b8a3041243e898480e3d34190ca1f5a033ddd Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 21 Jun 2016 17:08:27 +0200 Subject: [PATCH 074/340] handling low level eth function for read --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 88 +++++++++++-------- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 11 +-- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 4 +- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 7 +- 4 files changed, 66 insertions(+), 44 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index df2018ad0a..5041d188a3 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -52,6 +52,7 @@ #include "common_lib.h" #include "ethernet_lib.h" #include "if_defs.h" +#include "openair1/PHY/LTE_TRANSPORT/if4_tools.h" #define DEBUG 0 @@ -214,7 +215,7 @@ int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, } else if (flags == IF4_PULFFT) { packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); } else { - packet_size = RAW_IF4_PRACH_SIZE_BYTES(nblocks); + packet_size = RAW_IF4_PRACH_SIZE_BYTES; } eth->tx_nsamps = nblocks; @@ -302,49 +303,66 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + int nblocks = nsamps; int bytes_received=0; - int i=0; eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - int rcvfrom_flag =0; - eth->rx_nsamps=nsamps; - - /* buff[i] points to the position in rx buffer where the payload to be received will be placed - buff2 points to the position in rx buffer where the packet header will be placed */ - void *buff2 = (void*)(buff[i]-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES); - - /* we don't want to ovewrite with the header info the previous rx buffer data so we store it*/ - struct ether_header temp = *(struct ether_header *)buff2; - int32_t temp0 = *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES); - openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); - - bytes_received=0; - - while(bytes_received < RAW_PACKET_SIZE_BYTES(nsamps)) { - bytes_received +=recv(eth->sockfd[Mod_id], - buff2, - RAW_PACKET_SIZE_BYTES(nsamps), - rcvfrom_flag); - + ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t; + + void *test_buffer = (void*)malloc(packet_size); + void *rx_buffer=NULL; + IF4_dl_header_t *test_header = (IF4_dl_header_t*)(test_buffer + MAC_HEADER_SIZE_BYTES); + + bytes_received = recv(eth->sockfd[Mod_id], + test_buffer, + packet_size, + 0); if (bytes_received ==-1) { eth->num_rx_errors++; perror("ETHERNET READ: "); exit(-1); - } else { - /* store the timestamp value from packet's header */ - *timestamp = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); - eth->rx_actual_nsamps=bytes_received>>2; - eth->rx_count++; - } - } - - /* tx buffer values restored */ - *(struct ether_header *)buff2 = temp; - *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES) = temp0; - *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)) = temp1; + } + + *timestamp = test_header->sub_type; + + if (test_header->sub_type == IF4_PDLFFT) { + buff[0] = (void*)malloc(RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) - MAC_HEADER_SIZE_BYTES); + packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) - packet_size; + + } else if (test_header->sub_type == IF4_PULFFT) { + buff[0] = (void*)malloc(RAW_IF4_PULFFT_SIZE_BYTES(nblocks) - MAC_HEADER_SIZE_BYTES); + packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks) - packet_size; + + } else { + buff[0] = (void*)malloc(RAW_IF4_PRACH_SIZE_BYTES - MAC_HEADER_SIZE_BYTES); + packet_size = RAW_IF4_PRACH_SIZE_BYTES - packet_size; + } - return (bytes_received-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES)>>2; + memcpy(buff[0], test_header, sizeof_IF4_dl_header_t); + rx_buffer = (void*)(buff[0]+sizeof_IF4_dl_header_t); + + bytes_received = 0; + + while(bytes_received < packet_size) { + bytes_received += recv(eth->sockfd[Mod_id], + rx_buffer, + packet_size-bytes_received, + 0); + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("ETHERNET READ: "); + exit(-1); + } else { + eth->rx_actual_nsamps = bytes_received>>1; + eth->rx_count++; + } + } + + eth->rx_nsamps = nsamps; + + free(test_buffer); + return (bytes_received-MAC_HEADER_SIZE_BYTES)>>1; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index ee9ba50f66..6e5aa11140 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -320,7 +320,8 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth } else if (eth_params->transp_preference == 2) { eth->flags = ETH_UDP_IF4_MODE; } else { - AssertFatal(0==4, "transport_init: Unknown transport preference %d", eth_params->transp_preference); + printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference); + eth->flags = ETH_RAW_MODE; } printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); @@ -346,16 +347,16 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth device->trx_write_func = trx_eth_write_raw_IF4; device->trx_read_func = trx_eth_read_raw_IF4; } else { - device->trx_write_func = trx_eth_write_udp_IF4; - device->trx_read_func = trx_eth_read_udp_IF4; + //device->trx_write_func = trx_eth_write_udp_IF4; + //device->trx_read_func = trx_eth_read_udp_IF4; } eth->if_name[device->Mod_id] = eth_params->local_if_name; device->priv = eth; /* device specific */ - openair0_cfg[0].txlaunch_wait = 0;//manage when TX processing is triggered - openair0_cfg[0].txlaunch_wait_slotcount = 0; //manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait = 0;//manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait_slotcount = 0; //manage when TX processing is triggered openair0_cfg[0].iq_rxrescale = 15;//rescale iqs openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 307a312670..66cb13ef12 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -222,8 +222,8 @@ int eth_set_dev_conf_udp(openair0_device *device); int eth_socket_init_raw(openair0_device *device); int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); -//int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); -//int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); +int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int eth_get_dev_conf_raw(openair0_device *device); int eth_set_dev_conf_raw(openair0_device *device); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 04cd66e6e8..5b95e5eeca 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -39,6 +39,7 @@ */ #include +#include // ETH transport preference modes #define ETH_UDP_MODE 0 @@ -54,7 +55,9 @@ #define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) // Packet sizes for IF4 interface format -#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (2*scaled_nblocks) +#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(int16_t)*scaled_nblocks) +#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839) // FIX hard coded prach size + #define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) -#define RAW_IF4_PRACH_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + PRACH_BLOCK_SIZE_BYTES) From 21b492f95cd305f83b6e7d17d35caac46b1460b5 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 21 Jun 2016 18:08:10 +0200 Subject: [PATCH 075/340] minimal fixes from rcc test --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 6 +++--- openair1/PHY/LTE_TRANSPORT/prach.c | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 4 ++-- targets/RT/USER/lte-enb.c | 4 ++-- targets/RT/USER/lte-softmodem.c | 6 +++++- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 342512397a..e716695c06 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -89,7 +89,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) // Write the packet to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, symbol_id, - tx_buffer, + &tx_buffer, db_fulllength, 1, IF4_PDLFFT)) < 0) { @@ -127,7 +127,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) // Write the packet(s) to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, (int64_t) symbol_id, - tx_buffer, + &tx_buffer, db_fulllength, 1, IF4_PULFFT)) < 0) { @@ -157,7 +157,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) // Write the packet to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, (int64_t) symbol_id, - tx_buffer, + &tx_buffer, db_fulllength, 1, IF4_PRACH)) < 0) { diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 85330b5a18..23ea2cae53 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1271,7 +1271,7 @@ void rx_prach(PHY_VARS_eNB *eNB, if (eNB->node_function == NGFI_RRU_IF4) { /// **** send_IF4 of prachF to RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - // send_IF4(); + //send_IF4(eNB, frame, subframe, IF4_PRACH); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); return; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 92392070af..3b7052db58 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2572,7 +2572,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - // send_IF4(); + //send_IF4(eNB, frame, subframe, IF4_PULFFT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); } @@ -2624,7 +2624,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl do { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - //recv_IF4(eNB, proc, &packet_type, &symbol_number); + //recv_IF4(eNB, frame, subframe, &packet_type, &symbol_number); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); if (packet_type == IF4_PULFFT) { diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 8126ef46e0..4031cd5842 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -486,7 +486,7 @@ static void* eNB_thread_rxtx( void* param ) { /// **** recv_IF4 of txdataF from RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - //recv_IF4(eNB, proc, packet_type, symbol_number); + //recv_IF4(eNB, frame, subframe, packet_type, symbol_number); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); } @@ -536,7 +536,7 @@ static void* eNB_thread_rxtx( void* param ) { /// **** send_IF4 of txdataF to RRU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - //send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc, 0); + send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index dd55dacb1f..dcfa88afbf 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1911,8 +1911,12 @@ int main( int argc, char **argv ) pthread_cond_destroy(&sync_cond); pthread_mutex_destroy(&sync_mutex); - // *** Handle per CC_id openair0 + // *** Handle per CC_id openair0 openair0.trx_end_func(&openair0); + for(CC_id=0; CC_idrfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice); + PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice); + } if (ouput_vcd) VCD_SIGNAL_DUMPER_CLOSE(); From 4302afee51c01046ed86f63da631bb58f243b01a Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 22 Jun 2016 08:38:54 +0200 Subject: [PATCH 076/340] small changes --- openair1/SCHED/phy_procedures_lte_eNb.c | 28 ++++++------- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 40 +++++++++++++++---- .../CONF/enb.dual.band7_band20.conf | 8 ++-- targets/RT/USER/lte-enb.c | 4 +- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 92392070af..71b31fcad6 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2534,11 +2534,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl proc->first_rx = 0; } - //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + // printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, subframe ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); if (rxs != fp->samples_per_tti) exit_fun( "problem receiving samples" ); @@ -2547,27 +2547,27 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl // now do common RX processing for first slot in subframe VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); - remove_7_5_kHz(eNB,subframe<<1); - remove_7_5_kHz(eNB,1+(subframe<<1)); + remove_7_5_kHz(eNB,proc->subframe_rx<<1); + remove_7_5_kHz(eNB,1+(proc->subframe_rx<<1)); for (l=0; lsymbols_per_tti/2; l++) { slot_fep_ul(fp, &eNB->common_vars, l, - subframe<<1, + proc->subframe_rx<<1, 0, 0 ); slot_fep_ul(fp, &eNB->common_vars, l, - 1+(subframe<<1), + 1+(proc->subframe_rx<<1), 0, 0 ); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); - if (eNB->node_function == NGFI_RRU_IF4 && is_prach_subframe(fp, frame, subframe)<=0) { + if (eNB->node_function == NGFI_RRU_IF4 && is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)<=0) { /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// @@ -2579,7 +2579,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) // check if we have to detect PRACH first - if (is_prach_subframe(fp,frame,subframe)>0) { + if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) { // wake up thread for PRACH RX if (pthread_mutex_lock(&proc->mutex_prach) != 0) { LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); @@ -2589,8 +2589,8 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl int cnt_prach = ++proc->instance_cnt_prach; // set timing for prach thread - proc->frame_prach = frame; - proc->subframe_prach = subframe; + proc->frame_prach = proc->frame_rx; + proc->subframe_prach = proc->subframe_rx; pthread_mutex_unlock( &proc->mutex_prach ); @@ -2602,7 +2602,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl return; } } else { - LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", frame); + LOG_W( PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,cnt_prach); exit_fun( "PRACH thread busy" ); return; } @@ -2642,8 +2642,8 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl int cnt_prach = ++proc->instance_cnt_prach; // set timing for prach thread - proc->frame_prach = frame; - proc->subframe_prach = subframe; + proc->frame_prach = proc->frame_rx; + proc->subframe_prach = proc->subframe_rx; pthread_mutex_unlock( &proc->mutex_prach ); diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index a8b5f3e21b..b608c8acd2 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -283,7 +283,7 @@ static void *watchdog_thread(void *arg) { volatile unsigned int *daq_mbox = openair0_daq_cnt(); unsigned int mbox,diff; - + int first_acquisition; /* Set affinity mask to include CPUs 1 to MAX_CPUS */ /* CPU 0 is reserved for UHD threads */ @@ -351,8 +351,6 @@ static void *watchdog_thread(void *arg) { cpu_affinity ); - - mlockall(MCL_CURRENT | MCL_FUTURE); exm->watchdog_exit = 0; @@ -387,6 +385,8 @@ static void *watchdog_thread(void *arg) { printf("Unknown sampling rate %f, exiting \n",cfg->sample_rate); exm->watchdog_exit=1; } + + first_acquisition=1; // main loop to keep up with DMA transfers from exmimo2 while ((!oai_exit) && (!exm->watchdog_exit)) { @@ -394,6 +394,7 @@ static void *watchdog_thread(void *arg) { // grab time from MBOX mbox = daq_mbox[0]; + if (mboxlast_mbox) { // wrap-around diff = 150 + mbox - exm->last_mbox; } @@ -405,13 +406,25 @@ static void *watchdog_thread(void *arg) { pthread_mutex_lock(&exm->watchdog_mutex); exm->ts += (diff*exm->samples_per_frame/150) ; - if (diff > 10) // we're too late so exit + if (first_acquisition==1) //set last read to a closest subframe boundary + exm->last_ts_rx = (exm->ts/(exm->samples_per_frame/10))*(exm->samples_per_frame/10); + + if ((diff > 16)&&(first_acquisition==0)) {// we're too late so exit exm->watchdog_exit = 1; + printf("exiting, too late to keep up\n"); + } + first_acquisition=0; + + if (diff == 0) { + exm->watchdog_exit = 1; + printf("exiting, HW stopped\n"); + } if (exm->ts - exm->last_ts_rx > exm->samples_per_frame) { exm->watchdog_exit = 1; printf("RX Overflow, exiting\n"); } + // printf("ts %lu, last_ts_rx %lu, mbox %d, diff %d\n",exm->ts, exm->last_ts_rx,mbox,diff); pthread_mutex_unlock(&exm->watchdog_mutex); } @@ -444,6 +457,7 @@ int trx_exmimo_start(openair0_device *device) { exmimo_state_t *exm=device->priv; + printf("Starting ...\n"); openair0_start_rt_acquisition(0); exm->daq_state = running; @@ -460,7 +474,7 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi exmimo_state_t *exm=device->priv; openair0_config_t *cfg=&device->openair0_cfg[0]; openair0_timestamp ts,diff; - int i; + // int i; pthread_mutex_lock(&exm->watchdog_mutex); ts = exm->ts; @@ -469,25 +483,35 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi diff = exm->last_ts_rx+nsamps - ts; // difference in samples between current timestamp and last RX received sample // go to sleep until we should have enough samples (1024 for a bit more) +#ifdef DEBUG_EXMIMO + printf("Reading %d samples, ts %lu, last_ts_rx %lu (%lu) => sleeping %u us\n",nsamps,ts,exm->last_ts_rx,exm->last_ts_rx+nsamps, + (unsigned int)((double)(diff+1024)*1e6/cfg->sample_rate)); +#endif usleep((unsigned int)((double)(diff+1024)*1e6/cfg->sample_rate)); +#ifdef DEBUG_EXMIMO + printf("back\n"); +#endif // get new timestamp, in case we have to sleep again pthread_mutex_lock(&exm->watchdog_mutex); ts = exm->ts; pthread_mutex_unlock(&exm->watchdog_mutex); } + /* if (cfg->mmapped_dma == 0) { // if buff is not the dma buffer, do a memcpy, otherwise do nothing for (i=0;ilast_ts_rx % exm->samples_per_frame), nsamps*sizeof(int)); + } - } + }*/ *ptimestamp=exm->last_ts_rx; exm->last_ts_rx += nsamps; - return(0); + return(nsamps); } void trx_exmimo_end(openair0_device *device) { @@ -592,6 +616,8 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { device->openair0_cfg = openair0_cfg; device->priv = (void *)exm; + openair0_config(openair0_cfg,0); + create_watchdog(device); return(0); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band7_band20.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band7_band20.conf index 781e2a82e9..02f9077984 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band7_band20.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band7_band20.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "92"; + mobile_network_code = "93"; ////////// Physical parameters: @@ -211,7 +211,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; + mme_ip_address = ( { ipv4 = "192.168.12.70"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -221,10 +221,10 @@ eNBs = NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.82/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.82/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 8126ef46e0..abdbe0fb35 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -127,7 +127,7 @@ extern volatile int start_UE; #endif extern volatile int oai_exit; -extern openair0_config_t *openair0_cfg; +extern openair0_config_t openair0_cfg[MAX_CARDS]; extern pthread_cond_t sync_cond; extern pthread_mutex_t sync_mutex; @@ -920,7 +920,7 @@ static void* eNB_thread_prach( void* param ) { exit_fun("Error getting thread priority"); } - LOG_I(HW, "[SCHED][eNB] PRACH thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), + LOG_I(HW, "[SCHED][eNB] PRACH thread started on CPU %d TID %ld, IC %d, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(),proc->instance_cnt_prach, (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : From 641af1631fda803d317172b60f1e836f44fddd85 Mon Sep 17 00:00:00 2001 From: nikaeinn Date: Wed, 22 Jun 2016 12:31:03 +0200 Subject: [PATCH 077/340] update rrc and oaisim for the dedicated bearers --- openair2/RRC/LITE/rrc_eNB.c | 6 +- .../CONF/enb.band7.tm1.usrpb210.conf | 2 +- targets/SIMU/USER/oaisim.c | 71 +++++++++---------- 3 files changed, 37 insertions(+), 42 deletions(-) diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index a0487a53ea..f8a46854c0 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1219,7 +1219,9 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co case 1: // 100ms, 10^-2, p2, GBR case 2: // 150ms, 10^-3, p4, GBR case 3: // 50ms, 10^-3, p3, GBR + case 4: // 300ms, 10^-6, p5 case 7: // 100ms, 10^-3, p7, GBR + case 9: // 300ms, 10^-6, p9 case 65: // 75ms, 10^-2, p0.7, mission critical voice, GBR case 66: // 100ms, 10^-2, p2, non-mission critical voice , GBR // RLC @@ -1237,11 +1239,9 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co * type: non-realtime data with low packer error rate * action: swtich to RLC AM */ - case 4: // 300ms, 10^-6, p5 case 5: // 100ms, 10^-6, p1 , IMS signaling case 6: // 300ms, 10^-6, p6 case 8: // 300ms, 10^-6, p8 - case 9: // 300ms, 10^-6, p9 case 69: // 60ms, 10^-6, p0.5, mission critical delay sensitive data, Lowest Priority case 70: // 200ms, 10^-6, p5.5, mision critical data // RLC @@ -1273,7 +1273,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters)); DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters; - if (ue_context_pP->ue_context.e_rab[i].param.qos.qci < 10 ) + if (ue_context_pP->ue_context.e_rab[i].param.qos.qci < 9 ) DRB_ul_SpecificParameters->priority = qci_to_priority[ue_context_pP->ue_context.e_rab[i].param.qos.qci-1] + 3; // ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level; else diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf index f4bf15d717..145c6387a2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "95"; + mobile_network_code = "93"; ////////// Physical parameters: diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index c6c36d613c..3ccdc587af 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -618,8 +618,9 @@ l2l1_task (void *args_p) start_meas (&oaisim_stats); for (frame = 0; - (l2l1_state != L2L1_TERMINATED) - && (frame < oai_emulation.info.n_frames); + (l2l1_state != L2L1_TERMINATED) && + ((oai_emulation.info.n_frames_flag == 0) || + (frame < oai_emulation.info.n_frames)); frame++) { #if defined(ENABLE_ITTI) @@ -681,13 +682,7 @@ l2l1_task (void *args_p) //oai_emulation.info.time_ms += 1; oai_emulation.info.time_s += 0.01; // emu time in s, each frame lasts for 10 ms // JNote: TODO check the coherency of the time and frame (I corrected it to 10 (instead of 0.01) - // if n_frames not set by the user or is greater than max num frame then set adjust the frame counter - if ((oai_emulation.info.n_frames_flag == 0) - || (oai_emulation.info.n_frames >= 0xffff)) { - frame %= (oai_emulation.info.n_frames - 1); - } - - update_omg (frame); // frequency is defined in the omg_global params configurable by the user + update_omg (frame); // frequency is defined in the omg_global params configurable by the user update_omg_ocm (); @@ -718,7 +713,7 @@ l2l1_task (void *args_p) wait_for_slot_isr (); #if defined(ENABLE_ITTI) - itti_update_lte_time(frame, slot); + itti_update_lte_time(frame%MAX_FRAME_NUMBER, slot); #endif last_slot = (slot - 1) % 20; @@ -758,7 +753,7 @@ l2l1_task (void *args_p) LOG_D(EMU, "PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d) TDD %d/%d Nid_cell %d\n", eNB_inst, - frame, + frame%MAX_FRAME_NUMBER, slot, PHY_vars_eNB_g[eNB_inst][0]->proc[slot >> 1].subframe_tx, PHY_vars_eNB_g[eNB_inst][0]->proc[slot >> 1].subframe_rx, @@ -833,27 +828,27 @@ l2l1_task (void *args_p) { LOG_D(EMU, "PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n", - UE_inst, frame, slot, next_slot >> 1, + UE_inst, frame%MAX_FRAME_NUMBER, slot, next_slot >> 1, last_slot >> 1); if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] != NOT_SYNCHED) { if (frame > 0) { - PHY_vars_UE_g[UE_inst][0]->frame_rx = frame; + PHY_vars_UE_g[UE_inst][0]->frame_rx = frame%MAX_FRAME_NUMBER; PHY_vars_UE_g[UE_inst][0]->slot_rx = last_slot; PHY_vars_UE_g[UE_inst][0]->slot_tx = next_slot; if (next_slot > 1) - PHY_vars_UE_g[UE_inst][0]->frame_tx = frame; + PHY_vars_UE_g[UE_inst][0]->frame_tx = frame%MAX_FRAME_NUMBER; else - PHY_vars_UE_g[UE_inst][0]->frame_tx = frame + 1; + PHY_vars_UE_g[UE_inst][0]->frame_tx = (frame + 1)%MAX_FRAME_NUMBER; #ifdef OPENAIR2 //Application update_otg_UE (UE_inst, oai_emulation.info.time_ms); //Access layer - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE_inst, 0, ENB_FLAG_NO, NOT_A_RNTI, frame, next_slot); + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE_inst, 0, ENB_FLAG_NO, NOT_A_RNTI, frame%MAX_FRAME_NUMBER, next_slot); pdcp_run (&ctxt); #endif @@ -905,7 +900,7 @@ l2l1_task (void *args_p) if(last_slot==2 && frame%10==0) { if (UE_stats_th[UE_inst]) { - fprintf(UE_stats_th[UE_inst],"%d %d\n",frame, PHY_vars_UE_g[UE_inst][0]->bitrate[0]/1000); + fprintf(UE_stats_th[UE_inst],"%d %d\n",frame%MAX_FRAME_NUMBER, PHY_vars_UE_g[UE_inst][0]->bitrate[0]/1000); } } @@ -939,7 +934,7 @@ l2l1_task (void *args_p) exit(-1); } - PHY_vars_RN_g[RN_id]->frame = frame; + PHY_vars_RN_g[RN_id]->frame = frame%MAX_FRAME_NUMBER; if ( oai_emulation.info.frame_type == 0) { // RN == UE @@ -947,12 +942,12 @@ l2l1_task (void *args_p) if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] != NOT_SYNCHED) { LOG_D(EMU,"[RN %d] PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n", RN_id, UE_inst, frame, slot, next_slot >> 1,last_slot>>1); - PHY_vars_UE_g[UE_inst][0]->frame_rx = frame; + PHY_vars_UE_g[UE_inst][0]->frame_rx = frame%MAX_FRAME_NUMBER; PHY_vars_UE_g[UE_inst][0]->slot_rx = last_slot; PHY_vars_UE_g[UE_inst][0]->slot_tx = next_slot; - if (next_slot>1) PHY_vars_UE_g[UE_inst][0]->frame_tx = frame; - else PHY_vars_UE_g[UE_inst][0]->frame_tx = frame+1; + if (next_slot>1) PHY_vars_UE_g[UE_inst][0]->frame_tx = frame%MAX_FRAME_NUMBER; + else PHY_vars_UE_g[UE_inst][0]->frame_tx = (frame+1)%MAX_FRAME_NUMBER; phy_procedures_UE_lte (PHY_vars_UE_g[UE_inst][0], 0, abstraction_flag,normal_txrx, r_type, PHY_vars_RN_g[RN_id]); @@ -963,7 +958,7 @@ l2l1_task (void *args_p) // RN == eNB LOG_D(EMU,"[RN %d] PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d)\n", - RN_id, eNB_inst, frame, slot, next_slot >> 1,last_slot>>1); + RN_id, eNB_inst, frame%MAX_FRAME_NUMBER, slot, next_slot >> 1,last_slot>>1); phy_procedures_eNB_lte(slot>>1, PHY_vars_eNB_g[eNB_inst], abstraction_flag, r_type, PHY_vars_RN_g[RN_id]); } else { @@ -973,7 +968,7 @@ l2l1_task (void *args_p) } #endif - emu_transport (frame, last_slot, next_slot, direction, + emu_transport (frame%MAX_FRAME_NUMBER, last_slot, next_slot, direction, oai_emulation.info.frame_type[0], ethernet_flag); if ((direction == SF_DL) @@ -1019,7 +1014,7 @@ l2l1_task (void *args_p) enb_data, ue_data, next_slot, abstraction_flag, &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - frame, CC_id); + frame%MAX_FRAME_NUMBER, CC_id); } stop_meas (&ul_chan_stats); @@ -1088,7 +1083,7 @@ l2l1_task (void *args_p) next_slot, abstraction_flag, &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - frame, CC_id); + frame%MAX_FRAME_NUMBER, CC_id); } stop_meas (&ul_chan_stats); @@ -1105,7 +1100,7 @@ l2l1_task (void *args_p) } } - if ((last_slot == 1) && (frame == 0) && (abstraction_flag == 0) + if ((last_slot == 1) && ((frame%MAX_FRAME_NUMBER) == 0) && (abstraction_flag == 0) && (oai_emulation.info.n_frames == 1)) { write_output ("dlchan0.m", @@ -1153,40 +1148,40 @@ l2l1_task (void *args_p) &&(Channel_Flag==0) #endif ) { - sprintf (fname, "UEtxsig%d.m", frame); - sprintf (vname, "txs%d", frame); + sprintf (fname, "UEtxsig%d.m", frame%MAX_FRAME_NUMBER); + sprintf (vname, "txs%d", frame%MAX_FRAME_NUMBER); write_output (fname, vname, PHY_vars_UE_g[0][0]->lte_ue_common_vars.txdata[0], PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti * 10, 1, 1); - sprintf (fname, "eNBtxsig%d.m", frame); - sprintf (vname, "txs%d", frame); + sprintf (fname, "eNBtxsig%d.m", frame%MAX_FRAME_NUMBER); + sprintf (vname, "txs%d", frame%MAX_FRAME_NUMBER); write_output (fname, vname, PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdata[0][0], PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti * 10, 1, 1); - sprintf (fname, "eNBtxsigF%d.m", frame); - sprintf (vname, "txsF%d", frame); + sprintf (fname, "eNBtxsigF%d.m", frame%MAX_FRAME_NUMBER); + sprintf (vname, "txsF%d", frame%MAX_FRAME_NUMBER); write_output (fname, vname, PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdataF[0][0], PHY_vars_eNB_g[0][0]->lte_frame_parms.symbols_per_tti * PHY_vars_eNB_g[0][0]->lte_frame_parms.ofdm_symbol_size, 1, 1); - sprintf (fname, "UErxsig%d.m", frame); - sprintf (vname, "rxs%d", frame); + sprintf (fname, "UErxsig%d.m", frame%MAX_FRAME_NUMBER); + sprintf (vname, "rxs%d", frame%MAX_FRAME_NUMBER); write_output (fname, vname, PHY_vars_UE_g[0][0]->lte_ue_common_vars.rxdata[0], PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti * 10, 1, 1); - sprintf (fname, "eNBrxsig%d.m", frame); - sprintf (vname, "rxs%d", frame); + sprintf (fname, "eNBrxsig%d.m", frame%MAX_FRAME_NUMBER); + sprintf (vname, "rxs%d", frame%MAX_FRAME_NUMBER); write_output (fname, vname, PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.rxdata[0][0], @@ -1219,7 +1214,7 @@ l2l1_task (void *args_p) #ifdef SMBV // Rohde&Schwarz SMBV100A vector signal generator - if ((frame == config_frames[0]) || (frame == config_frames[1]) || (frame == config_frames[2]) || (frame == config_frames[3])) { + if ((frame%MAX_FRAME_NUMBER == config_frames[0]) || (frame%MAX_FRAME_NUMBER == config_frames[1]) || (frame%MAX_FRAME_NUMBER == config_frames[2]) || (frame%MAX_FRAME_NUMBER == config_frames[3])) { smbv_frame_cnt++; } @@ -1279,7 +1274,7 @@ main (int argc, char **argv) int port,Process_Flag=0,wgt,Channel_Flag=0,temp; #endif //default parameters - oai_emulation.info.n_frames = 0xffff; //1024; //10; + oai_emulation.info.n_frames = MAX_FRAME_NUMBER; //1024; //10; oai_emulation.info.n_frames_flag = 0; //fixme snr_dB = 30; From f5eaa7d7edadb179594ebc687af2e33ad8c103ac Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 22 Jun 2016 18:21:28 +0200 Subject: [PATCH 078/340] minimal fixes from base rru run --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 33 +++++++++---------- openair1/SCHED/phy_procedures_lte_eNb.c | 3 +- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 7 ++-- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 4 +-- targets/RT/USER/lte-enb.c | 10 +++--- 5 files changed, 27 insertions(+), 30 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index e716695c06..bbfea66b31 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -56,7 +56,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) uint16_t symbol_id, element_id; uint16_t db_fulllength, db_halflength; - int slotoffsetF, blockoffsetF; + int slotoffsetF=0, blockoffsetF=0; void *tx_buffer=NULL; int16_t *data_block=NULL; @@ -105,7 +105,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + db_fulllength*sizeof(int16_t)); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + db_fulllength*sizeof(int16_t)); IF4_ul_header_t *ul_header = (IF4_ul_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t); @@ -126,7 +126,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) // Write the packet(s) to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, - (int64_t) symbol_id, + symbol_id, &tx_buffer, db_fulllength, 1, @@ -156,7 +156,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) // Write the packet to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, - (int64_t) symbol_id, + symbol_id, &tx_buffer, db_fulllength, 1, @@ -172,7 +172,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) } -void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, uint32_t *symbol_number) { +void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, uint32_t *symbol_number, uint16_t expected_packet) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; @@ -182,30 +182,31 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, uint16_t db_fulllength, db_halflength; int slotoffsetF, blockoffsetF; - *packet_type = 0; - + if (expected_packet == IF4_PDLFFT) { + db_fulllength = = (12*fp->N_RB_DL); + } else { + db_fulllength = = (12*fp->N_RB_UL); + } + db_halflength = db_fulllength>>1; + int64_t *ret_type=(int64_t*)malloc(sizeof(int64_t)); void *rx_buffer=NULL; - void **buff=NULL; int16_t *data_block=NULL; // Read packet(s) from the fronthaul if (eNB->ifdevice.trx_read_func(&eNB->ifdevice, ret_type, - buff, - 0, + &rx_buffer, + db_fulllength, 0) < 0) { perror("ETHERNET read"); } *packet_type = *ret_type; - rx_buffer = buff[0]; if (*packet_type == IF4_PDLFFT) { data_block = (int16_t*) (rx_buffer+sizeof_IF4_dl_header_t); - - db_halflength = (12*fp->N_RB_DL)>>1; - + // Calculate from received packet slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; @@ -224,9 +225,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } else if (*packet_type == IF4_PULFFT) { data_block = (int16_t*) (rx_buffer+sizeof_IF4_ul_header_t); - - db_halflength = (12*fp->N_RB_UL)>>1; - + // Calculate from received packet slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 16386dfed6..cb033eb904 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2604,9 +2604,8 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (eNB->node_function == NGFI_RRU_IF4 && is_prach_subframe(fp, frame, subframe)<=0) { /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - //send_IF4(eNB, frame, subframe, IF4_PULFFT); + send_IF4(eNB, frame, subframe, IF4_PULFFT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 5041d188a3..0cb4fdfabb 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -303,14 +303,15 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + // Read nblocks info from packet itself int nblocks = nsamps; int bytes_received=0; eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t; - + ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t; void *test_buffer = (void*)malloc(packet_size); + void *rx_buffer=NULL; IF4_dl_header_t *test_header = (IF4_dl_header_t*)(test_buffer + MAC_HEADER_SIZE_BYTES); @@ -339,7 +340,7 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, packet_size = RAW_IF4_PRACH_SIZE_BYTES - packet_size; } - memcpy(buff[0], test_header, sizeof_IF4_dl_header_t); + memcpy(buff[0], test_header, sizeof_IF4_dl_header_t); rx_buffer = (void*)(buff[0]+sizeof_IF4_dl_header_t); bytes_received = 0; diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 3c1e1796e6..cfe857f9a2 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -654,8 +654,8 @@ extern "C" { } /* device specific */ - openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered - openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered openair0_cfg[0].iq_txshift = 4;//shift openair0_cfg[0].iq_rxrescale = 15;//rescale iqs diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index fb224615fe..08390d1f6b 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -127,7 +127,7 @@ extern volatile int start_UE; #endif extern volatile int oai_exit; -extern openair0_config_t *openair0_cfg; +extern openair0_config_t openair0_cfg[MAX_CARDS]; extern pthread_cond_t sync_cond; extern pthread_mutex_t sync_mutex; @@ -483,10 +483,9 @@ static void* eNB_thread_rxtx( void* param ) { } } else { - /// **** recv_IF4 of txdataF from RCC **** /// - + /// **** recv_IF4 of txdataF from RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - //recv_IF4(eNB, frame, subframe, packet_type, symbol_number); + //recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, packet_type, symbol_number); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); } @@ -533,8 +532,7 @@ static void* eNB_thread_rxtx( void* param ) { } else { - /// **** send_IF4 of txdataF to RRU **** /// - + /// **** send_IF4 of txdataF to RRU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); From 89052325e1fa4e7c6b44d776422b10d10b9732db Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Thu, 23 Jun 2016 11:33:30 +0200 Subject: [PATCH 079/340] handling if send for rxsigF --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 28 ++++++++++--------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 4 +-- openair1/PHY/LTE_TRANSPORT/prach.c | 18 ++++++++---- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 2 +- targets/RT/USER/lte-enb.c | 2 +- 6 files changed, 33 insertions(+), 23 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index bbfea66b31..38641941f8 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -48,13 +48,13 @@ // --- Careful to handle buffer memory --- RAW/UDP modes --- PRACH variables and data -void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) { +void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int k) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; - int16_t *prachF = eNB->prach_vars.prachF; + int16_t **rxsigF = eNB->prach_vars.rxsigF; - uint16_t symbol_id, element_id; + uint16_t symbol_id=0, element_id=0; uint16_t db_fulllength, db_halflength; int slotoffsetF=0, blockoffsetF=0; @@ -139,8 +139,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) } } else if (packet_type == IF4_PRACH) { // FIX: hard coded prach samples length - db_fulllength = 839; - slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + db_fulllength = 839*2; tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + db_fulllength*sizeof(int16_t)); IF4_prach_header_t *prach_header = (IF4_prach_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); @@ -148,11 +147,14 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type) gen_IF4_prach_header(prach_header, frame, subframe); - // Do compression and generate data blocks - for (element_id=0; element_id>16) + 32768 ]<<8; - } + // Generate uncompressed data blocks + memcpy(data_block, (rxsigF[0]+k), db_fulllength*sizeof(int16_t)); + + //for (element_id=0; element_idifdevice.trx_write_func(&eNB->ifdevice, @@ -176,16 +178,16 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; - int16_t *prachF = eNB->prach_vars.prachF; + int16_t **rxsigF = eNB->prach_vars.rxsigF; uint16_t element_id; uint16_t db_fulllength, db_halflength; int slotoffsetF, blockoffsetF; if (expected_packet == IF4_PDLFFT) { - db_fulllength = = (12*fp->N_RB_DL); + db_fulllength = (12*fp->N_RB_DL); } else { - db_fulllength = = (12*fp->N_RB_UL); + db_fulllength = (12*fp->N_RB_UL); } db_halflength = db_fulllength>>1; diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 46396d3034..4828daeddb 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -182,6 +182,6 @@ void gen_IF4_ul_header(IF4_ul_header_t*, int, int); void gen_IF4_prach_header(IF4_prach_header_t*, int, int); -void send_IF4(PHY_VARS_eNB*, int, int, uint16_t); +void send_IF4(PHY_VARS_eNB*, int, int, uint16_t, int); -void recv_IF4(PHY_VARS_eNB*, int, int, uint16_t*, uint32_t*); +void recv_IF4(PHY_VARS_eNB*, int, int, uint16_t*, uint32_t*, uint16_t); diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 23ea2cae53..4634be7321 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -41,6 +41,7 @@ #include "PHY/defs.h" #include "PHY/extern.h" //#include "prach.h" +#include "PHY/LTE_TRANSPORT/if4_tools.h" #include "SCHED/defs.h" #include "SCHED/extern.h" #include "UTIL/LOG/vcd_signal_dumper.h" @@ -1269,18 +1270,25 @@ void rx_prach(PHY_VARS_eNB *eNB, } if (eNB->node_function == NGFI_RRU_IF4) { - /// **** send_IF4 of prachF to RCC **** /// + k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; + + if (k<0) { + k+=(eNB->frame_parms.ofdm_symbol_size); + } + + k*=12; + k+=13; + k*=2; + + /// **** send_IF4 of rxsigF to RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - //send_IF4(eNB, frame, subframe, IF4_PRACH); + send_IF4(eNB, eNB->proc.frame_rx, eNB->proc.subframe_rx, IF4_PRACH, k); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); return; } // in case of RCC and prach received rx_thread wakes up prach - //else if (eNB->node_function == NGFI_RCC_IF4) { - // wait for prachF from RRU and continue with PRACH processing - //} // here onwards is for eNodeB_3GPP or NGFI_RCC_IF4 diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index cb033eb904..654619fee6 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2605,7 +2605,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - send_IF4(eNB, frame, subframe, IF4_PULFFT); + send_IF4(eNB, frame, subframe, IF4_PULFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 5b95e5eeca..12878badd1 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -56,7 +56,7 @@ // Packet sizes for IF4 interface format #define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(int16_t)*scaled_nblocks) -#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839) // FIX hard coded prach size +#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839*2) // FIX hard coded prach size (uncompressed) #define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 08390d1f6b..b30ed5b390 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -534,7 +534,7 @@ static void* eNB_thread_rxtx( void* param ) { /// **** send_IF4 of txdataF to RRU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT); + send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); } From b3fc3850d8764c529af57d3b95854bd2b976f588 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 23 Jun 2016 15:14:01 +0200 Subject: [PATCH 080/340] changing the way data is generated at eNB in --phy-test option --- openair1/SCHED/phy_mac_stub.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 5ed1b6837d..011d2cd954 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -233,10 +233,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(25,10,3); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe%5; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = subframe/5; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rah = 0; @@ -266,10 +266,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(25,10,3); ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe%5; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = subframe/5; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t)); @@ -304,10 +304,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(50,10,3); ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe%5; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = subframe/5; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rah = 0; @@ -338,10 +338,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(50,10,3); ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe%5; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = subframe/5; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t)); @@ -375,10 +375,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(100,10,3); ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe%5; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = subframe/5; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rah = 0; @@ -409,10 +409,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(100,10,3); ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe%5; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = subframe/5; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rah = 0; memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t)); @@ -451,13 +451,13 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = subframe/5; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = openair_daq_vars.target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = subframe/5; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = openair_daq_vars.target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = subframe%5; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = openair_daq_vars.ue_dl_rb_alloc; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0; @@ -473,13 +473,13 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + DLSCH_alloc_pdu1E.ndi = subframe/5; //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]]; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; - DLSCH_alloc_pdu1E.harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]; + DLSCH_alloc_pdu1E.harq_pid = subframe%5; DLSCH_alloc_pdu1E.dai = 0; DLSCH_alloc_pdu1E.TPC = 0; DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; From 8390977e7e6462a9612d17da02f12dbabbcd3397 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Thu, 23 Jun 2016 18:36:34 +0200 Subject: [PATCH 081/340] getting rid of bit-fields --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 71 +++++++++++++------------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 37 ++++++-------- 2 files changed, 52 insertions(+), 56 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 38641941f8..a712ae0674 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -84,7 +84,8 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, } // Update information in generated packet - dl_header->frame_status.sym_num = symbol_id; + dl_header->frame_status &= ~(0x000f<<26); + dl_header->frame_status |= (symbol_id&0x000f)<<26; // Write the packet to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, @@ -122,7 +123,8 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, } // Update information in generated packet - ul_header->frame_status.sym_num = symbol_id; + ul_header->frame_status &= ~(0x000f<<26); + ul_header->frame_status |= (symbol_id&0x000f)<<26; // Write the packet(s) to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, @@ -174,7 +176,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, } -void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, uint32_t *symbol_number, uint16_t expected_packet) { +void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, uint32_t *symbol_number) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; @@ -182,9 +184,9 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, uint16_t element_id; uint16_t db_fulllength, db_halflength; - int slotoffsetF, blockoffsetF; + int slotoffsetF=0, blockoffsetF=0; - if (expected_packet == IF4_PDLFFT) { + if (eNB->node_function == NGFI_RRU_IF4) { db_fulllength = (12*fp->N_RB_DL); } else { db_fulllength = (12*fp->N_RB_UL); @@ -194,6 +196,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, int64_t *ret_type=(int64_t*)malloc(sizeof(int64_t)); void *rx_buffer=NULL; int16_t *data_block=NULL; + // Read packet(s) from the fronthaul if (eNB->ifdevice.trx_read_func(&eNB->ifdevice, @@ -204,7 +207,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, perror("ETHERNET read"); } - *packet_type = *ret_type; + *packet_type = (uint16_t) *ret_type; if (*packet_type == IF4_PDLFFT) { data_block = (int16_t*) (rx_buffer+sizeof_IF4_dl_header_t); @@ -223,7 +226,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } // Find and return symbol_number - *symbol_number = ((IF4_dl_header_t*)(rx_buffer))->frame_status.sym_num; + *symbol_number = ((((IF4_dl_header_t*)(rx_buffer))->frame_status)>>26)&0x000f; } else if (*packet_type == IF4_PULFFT) { data_block = (int16_t*) (rx_buffer+sizeof_IF4_ul_header_t); @@ -242,12 +245,16 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } // Find and return symbol_number - *symbol_number = ((IF4_ul_header_t*)(rx_buffer))->frame_status.sym_num; + *symbol_number = ((((IF4_ul_header_t*)(rx_buffer))->frame_status)>>26)&0x000f; } else if (*packet_type == IF4_PRACH) { data_block = (int16_t*) (rx_buffer+sizeof_IF4_prach_header_t); - db_fulllength = 839; // hard coded + // FIX: hard coded prach samples length + db_fulllength = 839*2; + + // Generate uncompressed data blocks + memcpy((rxsigF[0]+slotoffsetF), data_block, db_fulllength*sizeof(int16_t)); } else { AssertFatal(1==0, "recv_IF4 - Unknown packet_type %x", *packet_type); @@ -263,18 +270,13 @@ void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, int frame, int subframe) { dl_packet->type = IF4_PACKET_TYPE; dl_packet->sub_type = IF4_PDLFFT; - // Leave reserved as it is + // Reset frame status dl_packet->rsvd = 0; // Set frame status - dl_packet->frame_status.ant_num = 0; - dl_packet->frame_status.ant_start = 0; - dl_packet->frame_status.rf_num = frame; - dl_packet->frame_status.sf_num = subframe; - dl_packet->frame_status.sym_num = 0; - dl_packet->frame_status.rsvd = 0; - - // Set frame check sequence + dl_packet->frame_status = 0; + dl_packet->frame_status |= (frame&0xffff)<<6; + dl_packet->frame_status |= (subframe&0x000f)<<22; } @@ -288,19 +290,20 @@ void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, int frame, int subframe) { ul_packet->rsvd = 0; // Set frame status - ul_packet->frame_status.ant_num = 0; - ul_packet->frame_status.ant_start = 0; - ul_packet->frame_status.rf_num = frame; - ul_packet->frame_status.sf_num = subframe; - ul_packet->frame_status.sym_num = 0; - ul_packet->frame_status.rsvd = 0; + ul_packet->frame_status = 0; + ul_packet->frame_status |= (frame&0xffff)<<6; + ul_packet->frame_status |= (subframe&0x000f)<<22; // Set antenna specific gain *** set other antenna gain *** - ul_packet->gain0.exponent = 0; - ul_packet->gain0.rsvd = 0; - - // Set frame check sequence - + ul_packet->gain0 = 0; + ul_packet->gain1 = 0; + ul_packet->gain2 = 0; + ul_packet->gain3 = 0; + ul_packet->gain4 = 0; + ul_packet->gain5 = 0; + ul_packet->gain6 = 0; + ul_packet->gain7 = 0; + } @@ -313,12 +316,8 @@ void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, int frame, int subfr prach_packet->rsvd = 0; // Set LTE Prach configuration - prach_packet->prach_conf.rsvd = 0; - prach_packet->prach_conf.ant = 0; - prach_packet->prach_conf.rf_num = frame; - prach_packet->prach_conf.sf_num = subframe; - prach_packet->prach_conf.exponent = 0; + prach_packet->prach_conf = 0; + prach_packet->prach_conf |= (frame&0xffff)<<6; + prach_packet->prach_conf |= (subframe&0x000f)<<22; - // Set frame check sequence - } diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 4828daeddb..5d7b5e0f79 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -47,6 +47,10 @@ #define IF4_PDLFFT 0x0020 #define IF4_PRACH 0x0021 +/* + +Bit-field reference + /// IF4 Frame Status (32 bits) struct IF4_frame_status { /// Antenna Numbers @@ -63,9 +67,6 @@ struct IF4_frame_status { uint32_t rsvd:2; }; -typedef struct IF4_frame_status IF4_frame_status_t; -#define sizeof_IF4_frame_status_t 4 - /// IF4 Antenna Gain (16 bits) struct IF4_gain { /// Reserved @@ -74,9 +75,6 @@ struct IF4_gain { uint16_t exponent:6; }; -typedef struct IF4_gain IF4_gain_t; -#define sizeof_IF_gain_t 2 - /// IF4 LTE PRACH Configuration (32 bits) struct IF4_lte_prach_conf { /// Reserved @@ -91,8 +89,7 @@ struct IF4_lte_prach_conf { uint32_t exponent:6; }; -typedef struct IF4_lte_prach_conf IF4_lte_prach_conf_t; -#define sizeof_IF4_lte_prach_conf_t 4 +*/ struct IF4_dl_header { /// Destination Address @@ -106,7 +103,7 @@ struct IF4_dl_header { /// Reserved uint32_t rsvd; /// Frame Status - IF4_frame_status_t frame_status; + uint32_t frame_status; /// Data Blocks /// Frame Check Sequence @@ -128,23 +125,23 @@ struct IF4_ul_header { /// Reserved uint32_t rsvd; /// Frame Status - IF4_frame_status_t frame_status; + uint32_t frame_status; /// Gain 0 - IF4_gain_t gain0; + uint16_t gain0; /// Gain 1 - IF4_gain_t gain1; + uint16_t gain1; /// Gain 2 - IF4_gain_t gain2; + uint16_t gain2; /// Gain 3 - IF4_gain_t gain3; + uint16_t gain3; /// Gain 4 - IF4_gain_t gain4; + uint16_t gain4; /// Gain 5 - IF4_gain_t gain5; + uint16_t gain5; /// Gain 6 - IF4_gain_t gain6; + uint16_t gain6; /// Gain 7 - IF4_gain_t gain7; + uint16_t gain7; /// Data Blocks /// Frame Check Sequence @@ -166,7 +163,7 @@ struct IF4_prach_header { /// Reserved uint32_t rsvd; /// LTE Prach Configuration - IF4_lte_prach_conf_t prach_conf; + uint32_t prach_conf; /// Prach Data Block (one antenna) /// Frame Check Sequence @@ -184,4 +181,4 @@ void gen_IF4_prach_header(IF4_prach_header_t*, int, int); void send_IF4(PHY_VARS_eNB*, int, int, uint16_t, int); -void recv_IF4(PHY_VARS_eNB*, int, int, uint16_t*, uint32_t*, uint16_t); +void recv_IF4(PHY_VARS_eNB*, int, int, uint16_t*, uint32_t*); From 08d89933e1677e890d4ed6c68a5c18fd30071934 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 23 Jun 2016 19:08:01 +0200 Subject: [PATCH 082/340] expressmimo TX ok. --- openair1/SCHED/phy_procedures_lte_eNb.c | 10 +- targets/ARCH/COMMON/common_lib.h | 4 + .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 87 +++++++-- targets/RT/USER/lte-enb.c | 166 +++++++++--------- targets/RT/USER/lte-softmodem.c | 33 +++- 5 files changed, 193 insertions(+), 107 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index c4a57836d0..9b1ab9d2ce 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2562,8 +2562,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; if (proc->first_rx == 0) { - AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)",proc->subframe_rx,subframe); - AssertFatal(proc->frame_rx == frame, "Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)",proc->frame_rx,frame); + if (proc->subframe_rx != subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + exit_fun("Exiting"); + } + if (proc->frame_rx != frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } } else { proc->first_rx = 0; } diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index f8ec3f8e58..6e112f5e43 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -158,6 +158,10 @@ typedef struct { int rx_num_channels; //! number of TX channels (=TX antennas) int tx_num_channels; + //! \brief RX base addresses for mmapped_dma + int32_t* rxbase[4]; + //! \brief TX base addresses for mmapped_dma + int32_t* txbase[4]; //! \brief Center frequency in Hz for RX. //! index: [0..rx_num_channels[ double rx_freq[4]; diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index b608c8acd2..89b43a22cf 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -64,7 +64,10 @@ #include + #define max(a,b) ((a)>(b) ? (a) : (b)) + + exmimo_pci_interface_bot_virtual_t openair0_exmimo_pci[MAX_CARDS]; // contains userspace pointers for each card char *bigshm_top[MAX_CARDS] = INIT_ZEROS; @@ -90,6 +93,7 @@ extern volatile int oai_exit; void kill_watchdog(openair0_device *); void create_watchdog(openair0_device *); +void rt_sleep(struct timespec *,long ); unsigned int log2_int( unsigned int x ) { @@ -272,6 +276,20 @@ int openair0_stop_without_reset(int card) #define MY_RF_MODE (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX) #define RF_MODE_BASE (LNA1ON + RFBBNORM) +void rt_sleep(struct timespec *ts,long tv_nsec) { + + clock_gettime(CLOCK_MONOTONIC, ts); + + ts->tv_nsec += tv_nsec; + + if (ts->tv_nsec>=1000000000L) { + ts->tv_nsec -= 1000000000L; + ts->tv_sec++; + } + + clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, ts, NULL); + +} static void *watchdog_thread(void *arg) { int policy, s, j; @@ -284,7 +302,12 @@ static void *watchdog_thread(void *arg) { volatile unsigned int *daq_mbox = openair0_daq_cnt(); unsigned int mbox,diff; int first_acquisition; - + struct timespec sleep_time,wait; + + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ /* CPU 0 is reserved for UHD threads */ /* CPU 1 is reserved for all TX threads */ @@ -388,6 +411,8 @@ static void *watchdog_thread(void *arg) { first_acquisition=1; // main loop to keep up with DMA transfers from exmimo2 + + int cnt_diff0=0; while ((!oai_exit) && (!exm->watchdog_exit)) { if (exm->daq_state == running) { @@ -403,7 +428,7 @@ static void *watchdog_thread(void *arg) { } exm->last_mbox = mbox; - pthread_mutex_lock(&exm->watchdog_mutex); + pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); exm->ts += (diff*exm->samples_per_frame/150) ; if (first_acquisition==1) //set last read to a closest subframe boundary @@ -416,9 +441,14 @@ static void *watchdog_thread(void *arg) { first_acquisition=0; if (diff == 0) { - exm->watchdog_exit = 1; - printf("exiting, HW stopped\n"); + cnt_diff0++; + if (cnt_diff0 == 10) { + exm->watchdog_exit = 1; + printf("exiting, HW stopped\n"); + } } + else + cnt_diff0=0; if (exm->ts - exm->last_ts_rx > exm->samples_per_frame) { exm->watchdog_exit = 1; @@ -427,12 +457,11 @@ static void *watchdog_thread(void *arg) { // printf("ts %lu, last_ts_rx %lu, mbox %d, diff %d\n",exm->ts, exm->last_ts_rx,mbox,diff); pthread_mutex_unlock(&exm->watchdog_mutex); } - - - usleep(500); // sleep for 500us + rt_sleep(&sleep_time,250000L); } oai_exit=1; + printf("Exiting watchdog\n"); return NULL; } @@ -473,13 +502,23 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi exmimo_state_t *exm=device->priv; openair0_config_t *cfg=&device->openair0_cfg[0]; - openair0_timestamp ts,diff; + openair0_timestamp old_ts=0,ts,diff; + struct timespec sleep_time; + unsigned long tv_nsec; // int i; + struct timespec wait; - pthread_mutex_lock(&exm->watchdog_mutex); + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + if (exm->watchdog_exit == 1) + return(0); + + pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); ts = exm->ts; pthread_mutex_unlock(&exm->watchdog_mutex); - while (ts < exm->last_ts_rx + nsamps) { + while ((ts < exm->last_ts_rx + nsamps) && + (exm->watchdog_exit==0)) { diff = exm->last_ts_rx+nsamps - ts; // difference in samples between current timestamp and last RX received sample // go to sleep until we should have enough samples (1024 for a bit more) @@ -487,14 +526,21 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi printf("Reading %d samples, ts %lu, last_ts_rx %lu (%lu) => sleeping %u us\n",nsamps,ts,exm->last_ts_rx,exm->last_ts_rx+nsamps, (unsigned int)((double)(diff+1024)*1e6/cfg->sample_rate)); #endif - usleep((unsigned int)((double)(diff+1024)*1e6/cfg->sample_rate)); + tv_nsec=(unsigned long)((double)(diff+3840)*1e9/cfg->sample_rate); + // tv_nsec = 500000L; + old_ts = ts; + rt_sleep(&sleep_time,tv_nsec); #ifdef DEBUG_EXMIMO printf("back\n"); #endif // get new timestamp, in case we have to sleep again - pthread_mutex_lock(&exm->watchdog_mutex); + pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); ts = exm->ts; pthread_mutex_unlock(&exm->watchdog_mutex); + if (old_ts == ts) { + printf("ts stopped, returning\n"); + return(0); + } } /* @@ -511,6 +557,7 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi *ptimestamp=exm->last_ts_rx; exm->last_ts_rx += nsamps; + return(nsamps); } @@ -659,6 +706,7 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) /* device specific */ openair0_cfg[card].iq_txshift = 4;//shift openair0_cfg[card].iq_rxrescale = 15;//rescale iqs + openair0_cfg[card].mmapped_dma = 1; if (openair0_cfg[card].sample_rate==30.72e6) { resampling_factor = 0; @@ -690,6 +738,10 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) #endif for (ant=0; ant<4; ant++) { + + openair0_cfg[card].rxbase[ant] = (int32_t*)openair0_exmimo_pci[card].adc_head[ant]; + openair0_cfg[card].txbase[ant] = (int32_t*)openair0_exmimo_pci[card].dac_head[ant]; + if (openair0_cfg[card].rx_freq[ant] || openair0_cfg[card].tx_freq[ant]) { ACTIVE_RF += (1<rf.rf_mode[ant] = RF_MODE_BASE; @@ -697,14 +749,14 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) printf("card %d, antenna %d, autocal %d\n",card,ant,openair0_cfg[card].autocal[ant]); } - if (openair0_cfg[card].tx_freq[ant]) { + if (openair0_cfg[card].tx_freq[ant]>0) { p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX + TXLPFNORM + TXLPFEN + tx_filter); p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg[card].tx_freq[ant]; p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg[card].tx_gain[ant]; - + printf("openair0 : programming card %d TX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); } - if (openair0_cfg[card].rx_freq[ant]) { + if (openair0_cfg[card].rx_freq[ant]>0) { p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX + RXLPFNORM + RXLPFEN + rx_filter); p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg[card].rx_freq[ant]; @@ -786,13 +838,14 @@ int openair0_reconfig(openair0_config_t *openair0_cfg) if (openair0_cfg[card].tx_freq[ant]) { p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg[card].tx_freq[ant]; p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg[card].tx_gain[ant]; - //printf("openair0 : programming TX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); + printf("openair0 : programming TX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); } + if (openair0_cfg[card].rx_freq[ant]) { p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg[card].rx_freq[ant]; p_exmimo_config->rf.rx_gain[ant][0] = (unsigned int)openair0_cfg[card].rx_gain[ant]; - //printf("openair0 : programming RX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); + printf("openair0 : programming RX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); switch (openair0_cfg[card].rxg_mode[ant]) { default: diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 51f21b57c8..f915afcb46 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -337,6 +337,10 @@ static void* eNB_thread_rxtx( void* param ) { struct sched_param sparam; char cpu_affinity[1024]; cpu_set_t cpuset; + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; /* Set affinity mask to include CPUs 1 to MAX_CPUS */ /* CPU 0 is reserved for UHD threads */ @@ -402,7 +406,7 @@ static void* eNB_thread_rxtx( void* param ) { while (!oai_exit) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); - if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { + if (pthread_mutex_timedlock(&proc->mutex_rxtx,&wait) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RXn-TXnp4\n"); exit_fun("nothing to add"); break; @@ -442,7 +446,7 @@ static void* eNB_thread_rxtx( void* param ) { * (may be relaxed in the future for performance reasons) */ - if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + if (pthread_mutex_timedlock(&sync_phy_proc.mutex_phy_proc_tx,&wait) != 0) { LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n"); exit_fun("nothing to add"); break; @@ -569,9 +573,9 @@ static void* eNB_thread_rxtx( void* param ) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); -#ifdef DEBUG_THREADS - printf( "Exiting eNB thread TX\n"); -#endif + + printf( "Exiting eNB thread RXn_TXnp4\n"); + eNB_thread_rxtx_status = 0; return &eNB_thread_rxtx_status; @@ -613,6 +617,10 @@ static void* eNB_thread_rx_common( void* param ) { FILE *rx_time_file = NULL; char rx_time_name[101]; //int i; + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; if (opp_enabled == 1) { snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf", "eNB"); @@ -766,7 +774,7 @@ static void* eNB_thread_rx_common( void* param ) { // wake up TX for subframe n+4 // lock the TX mutex and make sure the thread is ready - if (pthread_mutex_lock(&proc_rxtx->mutex_rxtx) != 0) { + if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) { LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc_rxtx->instance_cnt_rxtx ); exit_fun( "error locking mutex_rxtx" ); break; @@ -815,9 +823,9 @@ static void* eNB_thread_rx_common( void* param ) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); } -#ifdef DEBUG_THREADS - printf( "Exiting eNB thread RXn-TXnp4\n"); -#endif + + printf( "Exiting eNB thread rx_common\n"); + eNB_thread_rx_status = 0; return &eNB_thread_rx_status; @@ -832,8 +840,16 @@ static void* eNB_thread_rx_common( void* param ) { static void* eNB_thread_prach( void* param ) { static int eNB_thread_prach_status; + + eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id]; + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + // set default return value eNB_thread_prach_status = 0; @@ -935,7 +951,7 @@ static void* eNB_thread_prach( void* param ) { if (oai_exit) break; - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + if (pthread_mutex_timedlock(&proc->mutex_prach,&wait) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH\n"); exit_fun( "error locking mutex" ); break; @@ -957,7 +973,7 @@ static void* eNB_thread_prach( void* param ) { prach_procedures(eNB,0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + if (pthread_mutex_timedlock(&proc->mutex_prach,&wait) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n"); exit_fun( "error locking mutex" ); break; @@ -972,9 +988,9 @@ static void* eNB_thread_prach( void* param ) { } } -#ifdef DEBUG_THREADS + printf( "Exiting eNB thread PRACH\n"); -#endif + eNB_thread_prach_status = 0; return &eNB_thread_prach_status; @@ -1083,16 +1099,17 @@ void kill_eNB_proc(void) { proc_rxtx[0].instance_cnt_rxtx = 0; // FIXME data race! proc_rxtx[1].instance_cnt_rxtx = 0; // FIXME data race! + proc->instance_cnt_prach = 0; pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); - pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); + pthread_cond_signal( &proc_rxtx[1].cond_rxtx ); + pthread_cond_signal( &proc->cond_prach ); pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); - -#ifdef DEBUG_THREADS - printf( "Joining eNB TX CC_id %d thread\n", CC_id); -#endif + + pthread_join( proc->pthread_rx, (void**)&status ); + int result,i; - for (i=0;i<1;i++) { + for (i=0;i<2;i++) { pthread_join( proc_rxtx[i].pthread_rxtx, (void**)&status ); #ifdef DEBUG_THREADS @@ -1151,6 +1168,7 @@ void kill_eNB_proc(void) { int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) { int i, CC_id; + int j; uint16_t N_TA_offset = 0; @@ -1174,77 +1192,61 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c N_TA_offset = 624/4; } - /* + + + if (openair0_cfg[CC_id].mmapped_dma == 1) { // replace RX signal buffers with mmaped HW versions -#ifdef EXMIMO - openair0_cfg[CC_id].tx_num_channels = 0; - openair0_cfg[CC_id].rx_num_channels = 0; - - for (i=0; inb_antennas_rx; i++) { - printf("Mapping eNB CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); - phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_gain[rf_map[CC_id].chain+i] = rx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_num_channels++; + + for (i=0; inb_antennas_rx; i++) { + printf("Mapping eNB CC_id %d, rx_ant %d\n",CC_id,i); + free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = openair0_cfg[CC_id].rxbase[i]; + + + + printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); + + for (j=0; j<16; j++) { + printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j]); + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j] = 16-j; + } } - - printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); - - for (j=0; j<16; j++) { - printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j]); - phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j] = 16-j; + + for (i=0; inb_antennas_tx; i++) { + printf("Mapping eNB CC_id %d, tx_ant %d\n",CC_id,i); + free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); + phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = openair0_cfg[CC_id].txbase[i];//(int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; + + printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); + + for (j=0; j<16; j++) { + printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.txdata[0][i][j]); + phy_vars_eNB[CC_id]->common_vars.txdata[0][i][j] = 16-j; + } } } + else { // not memory-mapped DMA + - for (i=0; inb_antennas_tx; i++) { - printf("Mapping eNB CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); - phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_gain[rf_map[CC_id].chain+i] = tx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_num_channels++; + rxdata = (int32_t**)malloc16(frame_parms->nb_antennas_rx*sizeof(int32_t*)); + txdata = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); + + for (i=0; inb_antennas_rx; i++) { + free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); + rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory + memset(rxdata[i], 0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); + printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->common_vars.rxdata[0][i],rxdata[i],N_TA_offset); } - - printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); - - for (j=0; j<16; j++) { - printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.txdata[0][i][j]); - phy_vars_eNB[CC_id]->common_vars.txdata[0][i][j] = 16-j; + + for (i=0; inb_antennas_tx; i++) { + free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); + txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation + phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = txdata[i]; + memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); + printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); } } - -#else // not EXMIMO - */ - - rxdata = (int32_t**)malloc16(frame_parms->nb_antennas_rx*sizeof(int32_t*)); - txdata = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); - - for (i=0; inb_antennas_rx; i++) { - free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); - rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation - phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory - memset(rxdata[i], 0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->common_vars.rxdata[0][i],rxdata[i],N_TA_offset); - } - - for (i=0; inb_antennas_tx; i++) { - free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); - txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation - phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = txdata[i]; - memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); - } } return(0); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 61a8ccd9a0..0cd5d4d0fc 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -416,11 +416,20 @@ void help (void) { void exit_fun(const char* s) { + int CC_id; + if (s != NULL) { printf("%s %s() Exiting OAI softmodem: %s\n",__FILE__, __FUNCTION__, s); } oai_exit = 1; + + for(CC_id=0; CC_idrfdevice.trx_end_func) + PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice); + if (PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func) + PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice); + } #if defined(ENABLE_ITTI) sleep(1); //allow lte-softmodem threads to exit first @@ -1563,8 +1572,16 @@ int main( int argc, char **argv ) for (i=0; i<4; i++) { - openair0_cfg[card].tx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] : downlink_frequency[0][i]+uplink_frequency_offset[0][i]; - openair0_cfg[card].rx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] + uplink_frequency_offset[0][i] : downlink_frequency[0][i]; + if (irfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice); - PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice); + if (PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func) + PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice); + if (PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func) + PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice); } if (ouput_vcd) From 808494dd44cc2b4b0d1d5a1a59b6f3af60cf6a0e Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 24 Jun 2016 10:52:52 +0200 Subject: [PATCH 083/340] unified if4 header --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 57 +++----- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 123 +----------------- openair1/SCHED/phy_procedures_lte_eNb.c | 13 +- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 13 +- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 6 +- 5 files changed, 44 insertions(+), 168 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index a712ae0674..10b6ee66b7 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -67,9 +67,9 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + db_fulllength*sizeof(int16_t)); - IF4_dl_header_t *dl_header = (IF4_dl_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(int16_t)); + IF4_header_t *dl_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); gen_IF4_dl_header(dl_header, frame, subframe); @@ -106,9 +106,9 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + db_fulllength*sizeof(int16_t)); - IF4_ul_header_t *ul_header = (IF4_ul_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(int16_t)); + IF4_header_t *ul_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); gen_IF4_ul_header(ul_header, frame, subframe); @@ -143,9 +143,9 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, // FIX: hard coded prach samples length db_fulllength = 839*2; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + db_fulllength*sizeof(int16_t)); - IF4_prach_header_t *prach_header = (IF4_prach_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(int16_t)); + IF4_header_t *prach_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); gen_IF4_prach_header(prach_header, frame, subframe); @@ -208,10 +208,9 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } *packet_type = (uint16_t) *ret_type; + data_block = (int16_t*) (rx_buffer+sizeof_IF4_header_t); - if (*packet_type == IF4_PDLFFT) { - data_block = (int16_t*) (rx_buffer+sizeof_IF4_dl_header_t); - + if (*packet_type == IF4_PDLFFT) { // Calculate from received packet slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; @@ -226,11 +225,9 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } // Find and return symbol_number - *symbol_number = ((((IF4_dl_header_t*)(rx_buffer))->frame_status)>>26)&0x000f; + *symbol_number = ((((IF4_header_t*)(rx_buffer))->frame_status)>>26)&0x000f; - } else if (*packet_type == IF4_PULFFT) { - data_block = (int16_t*) (rx_buffer+sizeof_IF4_ul_header_t); - + } else if (*packet_type == IF4_PULFFT) { // Calculate from received packet slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; @@ -245,11 +242,9 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } // Find and return symbol_number - *symbol_number = ((((IF4_ul_header_t*)(rx_buffer))->frame_status)>>26)&0x000f; - - } else if (*packet_type == IF4_PRACH) { - data_block = (int16_t*) (rx_buffer+sizeof_IF4_prach_header_t); + *symbol_number = ((((IF4_header_t*)(rx_buffer))->frame_status)>>26)&0x000f; + } else if (*packet_type == IF4_PRACH) { // FIX: hard coded prach samples length db_fulllength = 839*2; @@ -265,7 +260,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } -void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, int frame, int subframe) { +void gen_IF4_dl_header(IF4_header_t *dl_packet, int frame, int subframe) { // Set Type and Sub-Type dl_packet->type = IF4_PACKET_TYPE; dl_packet->sub_type = IF4_PDLFFT; @@ -281,7 +276,7 @@ void gen_IF4_dl_header(IF4_dl_header_t *dl_packet, int frame, int subframe) { } -void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, int frame, int subframe) { +void gen_IF4_ul_header(IF4_header_t *ul_packet, int frame, int subframe) { // Set Type and Sub-Type ul_packet->type = IF4_PACKET_TYPE; ul_packet->sub_type = IF4_PULFFT; @@ -294,20 +289,10 @@ void gen_IF4_ul_header(IF4_ul_header_t *ul_packet, int frame, int subframe) { ul_packet->frame_status |= (frame&0xffff)<<6; ul_packet->frame_status |= (subframe&0x000f)<<22; - // Set antenna specific gain *** set other antenna gain *** - ul_packet->gain0 = 0; - ul_packet->gain1 = 0; - ul_packet->gain2 = 0; - ul_packet->gain3 = 0; - ul_packet->gain4 = 0; - ul_packet->gain5 = 0; - ul_packet->gain6 = 0; - ul_packet->gain7 = 0; - } -void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, int frame, int subframe) { +void gen_IF4_prach_header(IF4_header_t *prach_packet, int frame, int subframe) { // Set Type and Sub-Type prach_packet->type = IF4_PACKET_TYPE; prach_packet->sub_type = IF4_PRACH; @@ -316,8 +301,8 @@ void gen_IF4_prach_header(IF4_prach_header_t *prach_packet, int frame, int subfr prach_packet->rsvd = 0; // Set LTE Prach configuration - prach_packet->prach_conf = 0; - prach_packet->prach_conf |= (frame&0xffff)<<6; - prach_packet->prach_conf |= (subframe&0x000f)<<22; + prach_packet->frame_status = 0; + prach_packet->frame_status |= (frame&0xffff)<<6; + prach_packet->frame_status |= (subframe&0x000f)<<22; } diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 5d7b5e0f79..f06072b73e 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -47,55 +47,7 @@ #define IF4_PDLFFT 0x0020 #define IF4_PRACH 0x0021 -/* - -Bit-field reference - -/// IF4 Frame Status (32 bits) -struct IF4_frame_status { - /// Antenna Numbers - uint32_t ant_num:3; - /// Antenna Start - uint32_t ant_start:3; - /// Radio Frame Number - uint32_t rf_num:16; - /// Sub-frame Number - uint32_t sf_num:4; - /// Symbol Number - uint32_t sym_num:4; - /// Reserved - uint32_t rsvd:2; -}; - -/// IF4 Antenna Gain (16 bits) -struct IF4_gain { - /// Reserved - uint16_t rsvd:10; - /// FFT Exponent Output - uint16_t exponent:6; -}; - -/// IF4 LTE PRACH Configuration (32 bits) -struct IF4_lte_prach_conf { - /// Reserved - uint32_t rsvd:3; - /// Antenna Indication - uint32_t ant:3; - /// Radio Frame Number - uint32_t rf_num:16; - /// Sub-frame Number - uint32_t sf_num:4; - /// FFT Exponent Output - uint32_t exponent:6; -}; - -*/ - -struct IF4_dl_header { - /// Destination Address - - /// Source Address - +struct IF4_header { /// Type uint16_t type; /// Sub-Type @@ -104,80 +56,17 @@ struct IF4_dl_header { uint32_t rsvd; /// Frame Status uint32_t frame_status; - /// Data Blocks - - /// Frame Check Sequence }; -typedef struct IF4_dl_header IF4_dl_header_t; -#define sizeof_IF4_dl_header_t 12 +typedef struct IF4_header IF4_header_t; +#define sizeof_IF4_header_t 12 -struct IF4_ul_header { - /// Destination Address - - /// Source Address - - /// Type - uint16_t type; - /// Sub-Type - uint16_t sub_type; - /// Reserved - uint32_t rsvd; - /// Frame Status - uint32_t frame_status; - /// Gain 0 - uint16_t gain0; - /// Gain 1 - uint16_t gain1; - /// Gain 2 - uint16_t gain2; - /// Gain 3 - uint16_t gain3; - /// Gain 4 - uint16_t gain4; - /// Gain 5 - uint16_t gain5; - /// Gain 6 - uint16_t gain6; - /// Gain 7 - uint16_t gain7; - /// Data Blocks +void gen_IF4_dl_header(IF4_header_t*, int, int); - /// Frame Check Sequence +void gen_IF4_ul_header(IF4_header_t*, int, int); -}; - -typedef struct IF4_ul_header IF4_ul_header_t; -#define sizeof_IF4_ul_header_t 28 - -struct IF4_prach_header { - /// Destination Address - - /// Source Address - - /// Type - uint16_t type; - /// Sub-Type - uint16_t sub_type; - /// Reserved - uint32_t rsvd; - /// LTE Prach Configuration - uint32_t prach_conf; - /// Prach Data Block (one antenna) - - /// Frame Check Sequence - -}; - -typedef struct IF4_prach_header IF4_prach_header_t; -#define sizeof_IF4_prach_header_t 12 - -void gen_IF4_dl_header(IF4_dl_header_t*, int, int); - -void gen_IF4_ul_header(IF4_ul_header_t*, int, int); - -void gen_IF4_prach_header(IF4_prach_header_t*, int, int); +void gen_IF4_prach_header(IF4_header_t*, int, int); void send_IF4(PHY_VARS_eNB*, int, int, uint16_t, int); diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 46364e82be..ef7b70d179 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2522,7 +2522,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl int prach_rx; uint16_t packet_type; - uint32_t symbol_number; + uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; struct timespec time_req, time_rem; @@ -2649,21 +2649,22 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } else if (eNB->node_function == NGFI_RCC_IF4) { /// **** recv_IF4 of rxdataF from RRU **** /// - /// **** recv_IF4 of prachF from RRU **** /// + /// **** recv_IF4 of rxsigF from RRU **** /// // get frame/subframe information from IF4 interface // timed loop (200 us) - + + symbol_number = 0; symbol_mask = 0; symbol_mask_full = (1<symbols_per_tti)-1; prach_rx = 0; // Block from loop while testing - symbol_mask = symbol_mask_full; - nanosleep(&time_req, &time_rem); + //symbol_mask = symbol_mask_full; + //nanosleep(&time_req, &time_rem); do { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - //recv_IF4(eNB, frame, subframe, &packet_type, &symbol_number); + recv_IF4(eNB, proc->frame_rx, proc->subframe_rx, &packet_type, &symbol_number); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); if (packet_type == IF4_PULFFT) { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 0cb4fdfabb..f6e7db4c6e 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -309,11 +309,11 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t; + ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t; void *test_buffer = (void*)malloc(packet_size); void *rx_buffer=NULL; - IF4_dl_header_t *test_header = (IF4_dl_header_t*)(test_buffer + MAC_HEADER_SIZE_BYTES); + IF4_header_t *test_header = (IF4_header_t*)(test_buffer + MAC_HEADER_SIZE_BYTES); bytes_received = recv(eth->sockfd[Mod_id], test_buffer, @@ -324,7 +324,7 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, perror("ETHERNET READ: "); exit(-1); } - + *timestamp = test_header->sub_type; if (test_header->sub_type == IF4_PDLFFT) { @@ -337,11 +337,12 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, } else { buff[0] = (void*)malloc(RAW_IF4_PRACH_SIZE_BYTES - MAC_HEADER_SIZE_BYTES); - packet_size = RAW_IF4_PRACH_SIZE_BYTES - packet_size; + packet_size = RAW_IF4_PRACH_SIZE_BYTES - packet_size; + printf(" Came for prach\n"); } - memcpy(buff[0], test_header, sizeof_IF4_dl_header_t); - rx_buffer = (void*)(buff[0]+sizeof_IF4_dl_header_t); + memcpy(buff[0], test_header, sizeof_IF4_header_t); + rx_buffer = (void*)(buff[0]+sizeof_IF4_header_t); bytes_received = 0; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 12878badd1..030bfda147 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -58,6 +58,6 @@ #define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(int16_t)*scaled_nblocks) #define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839*2) // FIX hard coded prach size (uncompressed) -#define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) -#define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) -#define RAW_IF4_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + PRACH_BLOCK_SIZE_BYTES) +#define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + PRACH_BLOCK_SIZE_BYTES) From 19922715895572071400ebd55ec5b2760941e90a Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 24 Jun 2016 16:35:42 +0200 Subject: [PATCH 084/340] rcc recv and send work (not sync with rru yet) --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 15 ++++----- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 33 +++++++------------ 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 10b6ee66b7..4756559ac3 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -193,22 +193,21 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } db_halflength = db_fulllength>>1; - int64_t *ret_type=(int64_t*)malloc(sizeof(int64_t)); void *rx_buffer=NULL; + IF4_header_t *packet_header=NULL; int16_t *data_block=NULL; - - + // Read packet(s) from the fronthaul if (eNB->ifdevice.trx_read_func(&eNB->ifdevice, - ret_type, + (int64_t*) packet_type, &rx_buffer, db_fulllength, 0) < 0) { perror("ETHERNET read"); } - *packet_type = (uint16_t) *ret_type; - data_block = (int16_t*) (rx_buffer+sizeof_IF4_header_t); + packet_header = (IF4_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); + data_block = (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t); if (*packet_type == IF4_PDLFFT) { // Calculate from received packet @@ -225,7 +224,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } // Find and return symbol_number - *symbol_number = ((((IF4_header_t*)(rx_buffer))->frame_status)>>26)&0x000f; + *symbol_number = ((packet_header->frame_status)>>26)&0x000f; } else if (*packet_type == IF4_PULFFT) { // Calculate from received packet @@ -242,7 +241,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } // Find and return symbol_number - *symbol_number = ((((IF4_header_t*)(rx_buffer))->frame_status)>>26)&0x000f; + *symbol_number = ((packet_header->frame_status)>>26)&0x000f; } else if (*packet_type == IF4_PRACH) { // FIX: hard coded prach samples length diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index f6e7db4c6e..780261d12a 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -312,13 +312,12 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t; void *test_buffer = (void*)malloc(packet_size); - void *rx_buffer=NULL; IF4_header_t *test_header = (IF4_header_t*)(test_buffer + MAC_HEADER_SIZE_BYTES); bytes_received = recv(eth->sockfd[Mod_id], test_buffer, packet_size, - 0); + MSG_PEEK); if (bytes_received ==-1) { eth->num_rx_errors++; perror("ETHERNET READ: "); @@ -328,29 +327,22 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, *timestamp = test_header->sub_type; if (test_header->sub_type == IF4_PDLFFT) { - buff[0] = (void*)malloc(RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) - MAC_HEADER_SIZE_BYTES); - packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) - packet_size; - + packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks); } else if (test_header->sub_type == IF4_PULFFT) { - buff[0] = (void*)malloc(RAW_IF4_PULFFT_SIZE_BYTES(nblocks) - MAC_HEADER_SIZE_BYTES); - packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks) - packet_size; - + packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); } else { - buff[0] = (void*)malloc(RAW_IF4_PRACH_SIZE_BYTES - MAC_HEADER_SIZE_BYTES); - packet_size = RAW_IF4_PRACH_SIZE_BYTES - packet_size; - printf(" Came for prach\n"); + packet_size = RAW_IF4_PRACH_SIZE_BYTES; } - - memcpy(buff[0], test_header, sizeof_IF4_header_t); - rx_buffer = (void*)(buff[0]+sizeof_IF4_header_t); + + buff[0] = (void*)malloc(packet_size); bytes_received = 0; while(bytes_received < packet_size) { - bytes_received += recv(eth->sockfd[Mod_id], - rx_buffer, - packet_size-bytes_received, - 0); + bytes_received = recv(eth->sockfd[Mod_id], + buff[0], + packet_size, + 0); if (bytes_received ==-1) { eth->num_rx_errors++; perror("ETHERNET READ: "); @@ -361,10 +353,9 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, } } - eth->rx_nsamps = nsamps; - + eth->rx_nsamps = nsamps; free(test_buffer); - return (bytes_received-MAC_HEADER_SIZE_BYTES)>>1; + return(bytes_received); } From 56fcc17ebc6f19183d64489e32da4eee918159cd Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 24 Jun 2016 17:36:40 +0200 Subject: [PATCH 085/340] small compilation rru --- targets/RT/USER/lte-enb.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 5494871521..00d1bdcdaa 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -297,7 +297,10 @@ static void* eNB_thread_rxtx( void* param ) { FILE *tx_time_file = NULL; char tx_time_name[101]; void *txp[PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx]; - + + uint16_t packet_type; + uint32_t symbol_number=0; + if (opp_enabled == 1) { snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf", "eNB"); tx_time_file = fopen(tx_time_name,"w"); @@ -488,8 +491,10 @@ static void* eNB_thread_rxtx( void* param ) { } else { /// **** recv_IF4 of txdataF from RCC **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - //recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, packet_type, symbol_number); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); + while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1) { + recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, &packet_type, &symbol_number); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); } From 456572c9ada78da6da3e33b6fd3c42cb65a8539a Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 27 Jun 2016 00:58:54 -0700 Subject: [PATCH 086/340] ExMIMO2 RX gain calibration --- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 89b43a22cf..582a2f75d2 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -670,6 +670,13 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { return(0); } +unsigned int rxg_max[4] = {128,128,128,126}; +unsigned int rxg_med[4] = {122,123,123,120}; +unsigned int rxg_byp[4] = {116,117,116,116}; +unsigned int nf_max[4] = {7,9,16,12}; +unsigned int nf_med[4] = {12,13,22,17}; +unsigned int nf_byp[4] = {15,20,29,23}; + int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) { int ret; @@ -760,21 +767,42 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX + RXLPFNORM + RXLPFEN + rx_filter); p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg[card].rx_freq[ant]; - p_exmimo_config->rf.rx_gain[ant][0] = (unsigned int)openair0_cfg[card].rx_gain[ant]; + printf("openair0 : programming card %d RX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); switch (openair0_cfg[card].rxg_mode[ant]) { default: case max_gain: p_exmimo_config->rf.rf_mode[ant] += LNAMax; + if (rxg_max[ant] >= (int)openair0_cfg[card].rx_gain[ant]) { + p_exmimo_config->rf.rx_gain[ant][0] = 30 - (rxg_max[ant] - (int)openair0_cfg[card].rx_gain[ant]); //was measured at rxgain=30; + } + else { + printf("openair0: RX RF gain too high, reduce by %d dB\n", (int)openair0_cfg[card].rx_gain[ant]-rxg_max[ant]); + exit(-1); + } break; case med_gain: p_exmimo_config->rf.rf_mode[ant] += LNAMed; + if (rxg_med[ant] >= (int)openair0_cfg[card].rx_gain[ant]) { + p_exmimo_config->rf.rx_gain[ant][0] = 30 - (rxg_med[ant] - (int)openair0_cfg[card].rx_gain[ant]); //was measured at rxgain=30; + } + else { + printf("openair0: RX RF gain too high, reduce by %d dB\n", (int)openair0_cfg[card].rx_gain[ant]-rxg_med[ant]); + exit(-1); + } break; case byp_gain: p_exmimo_config->rf.rf_mode[ant] += LNAByp; + if (rxg_byp[ant] >= (int)openair0_cfg[card].rx_gain[ant]) { + p_exmimo_config->rf.rx_gain[ant][0] = 30 - (rxg_byp[ant] - (int)openair0_cfg[card].rx_gain[ant]); //was measured at rxgain=30; + } + else { + printf("openair0: RX RF gain too high, reduce by %d dB\n", (int)openair0_cfg[card].rx_gain[ant]-rxg_byp[ant]); + exit(-1); + } break; } } else { From 6ae4123733336959196f538b297b25715f24cd81 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 27 Jun 2016 12:43:43 +0200 Subject: [PATCH 087/340] some fixes for host type/dev type --- openair2/ENB_APP/enb_config.c | 6 +- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 61 +++++++++++++++++++ .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 17 +++++- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 3 +- targets/RT/USER/lte-softmodem.c | 22 +++---- 5 files changed, 91 insertions(+), 18 deletions(-) diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 7f8cf95c2b..5bc0088ed5 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -298,7 +298,7 @@ void enb_config_display(void) printf( "\ttx_scheduling_advance :\t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_scheduling_advance); printf( "\ttx_sample_advance : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_sample_advance); printf( "\tiq_txshift : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].iq_txshift); - printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : "UDP"); + printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : (enb_properties.properties[i]->rrh_gw_config[j].rawif4 == 1)? "RAW_IF4" : (enb_properties.properties[i]->rrh_gw_config[j].udpif4 == 1)? "UDP_IF4" : "UDP"); if (enb_properties.properties[i]->rrh_gw_config[j].exmimo == 1) { printf( "\tRF target : \tEXMIMO:\n\n"); } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_b200 == 1) { @@ -2242,9 +2242,9 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; } else if (strcmp(tr_preference, "raw") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; - } else if (strcmp(tr_preference, "udpif4") == 0) { + } else if (strcmp(tr_preference, "udp_if4") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udpif4 = 1; - } else if (strcmp(tr_preference, "rawif4") == 0) { + } else if (strcmp(tr_preference, "raw_if4") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rawif4 = 1; } else {//if (strcmp(preference, "no") == 0) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 780261d12a..13dfe574c2 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -390,6 +390,37 @@ int eth_set_dev_conf_raw(openair0_device *device) { } + +int eth_set_dev_conf_raw_IF4(openair0_device *device) { + + int Mod_id = device->Mod_id; + eth_state_t *eth = (eth_state_t*)device->priv; + void *msg; + ssize_t msg_len; + + /* a BBU client sends to RRH a set of configuration parameters (openair0_config_t) + so that RF front end is configured appropriately and + frame/packet size etc. can be set */ + + msg = malloc(MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t)); + msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); + + + memcpy(msg,(void*)ð->eh,MAC_HEADER_SIZE_BYTES); + memcpy((msg+MAC_HEADER_SIZE_BYTES),(void*)device->openair0_cfg,sizeof(openair0_config_t)); + + if (send(eth->sockfd[Mod_id], + msg, + msg_len, + 0)==-1) { + perror("ETHERNET: "); + exit(0); + } + + return 0; +} + + int eth_get_dev_conf_raw(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; @@ -418,3 +449,33 @@ int eth_get_dev_conf_raw(openair0_device *device) { return 0; } + + +int eth_get_dev_conf_raw_IF4(openair0_device *device) { + + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; + char str[INET_ADDRSTRLEN]; + void *msg; + ssize_t msg_len; + + msg = malloc(MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t)); + msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); + + /* RRH receives from BBU openair0_config_t */ + if (recv(eth->sockfd[Mod_id], + msg, + msg_len, + 0)==-1) { + perror("ETHERNET: "); + exit(0); + } + + /* RRH stores the remote MAC address */ + memcpy(eth->eh.ether_dhost,(msg+ETH_ALEN),ETH_ALEN); + //memcpy((void*)&device->openair0_cfg,(msg + MAC_HEADER_SIZE_BYTES), sizeof(openair0_config_t)); + //device->openair0_cfg=(openair0_config_t *)(msg + MAC_HEADER_SIZE_BYTES); + printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5],eth->eh.ether_dhost[0],eth->eh.ether_dhost[1],eth->eh.ether_dhost[2],eth->eh.ether_dhost[3],eth->eh.ether_dhost[4],eth->eh.ether_dhost[5]); + + return 0; +} diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 6e5aa11140..5802b1569f 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -63,7 +63,7 @@ int trx_eth_start(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; /* initialize socket */ - if ((eth->flags & ETH_RAW_MODE) != 0 ) { + if (eth->flags == ETH_RAW_MODE) { if (eth_socket_init_raw(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ if (device->host_type == BBU_HOST) { @@ -73,6 +73,21 @@ int trx_eth_start(openair0_device *device) { } /* adjust MTU wrt number of samples per packet */ if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; + + } else if (eth->flags == ETH_RAW_IF4_MODE) { + if (eth_socket_init_raw(device)!=0) return -1; + /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_raw_IF4(device)!=0) return -1; + } else { + if(eth_get_dev_conf_raw_IF4(device)!=0) return -1; + } + /* adjust MTU wrt number of samples per packet */ + if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; + + } else if (eth->flags == ETH_UDP_IF4_MODE) { + + } else { if (eth_socket_init_udp(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 66cb13ef12..f7753fb517 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -226,6 +226,7 @@ int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int eth_get_dev_conf_raw(openair0_device *device); int eth_set_dev_conf_raw(openair0_device *device); - +int eth_get_dev_conf_raw_IF4(openair0_device *device); +int eth_set_dev_conf_raw_IF4(openair0_device *device); #endif diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 0cd5d4d0fc..c4d37393bd 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1541,13 +1541,6 @@ int main( int argc, char **argv ) openair0_cfg[card].my_port = eth_params->my_port; } - //if (node_function == NGFI_RCC_IF4 || node_function == NGFI_RRU_IF4) { - //openair0_cfg[card].remote_addr = eth_params->remote_addr; - //openair0_cfg[card].remote_port = eth_params->remote_port; - //openair0_cfg[card].my_addr = eth_params->my_addr; - //openair0_cfg[card].my_port = eth_params->my_port; - //} - printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx), ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); @@ -1648,11 +1641,17 @@ int main( int argc, char **argv ) openair0_cfg[0].log_level = glog_level; for (CC_id=0; CC_idrfdevice.host_type = BBU_HOST; + if (node_function == NGFI_RRU_IF4) { + PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = RRH_HOST; + PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST; + } else { + PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = BBU_HOST; + PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = BBU_HOST; + } + PHY_vars_eNB_g[0][CC_id]->rfdevice.type = NONE_DEV; PHY_vars_eNB_g[0][CC_id]->rfdevice.transp_type = NONE_TP; - PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = BBU_HOST; PHY_vars_eNB_g[0][CC_id]->ifdevice.type = NONE_DEV; PHY_vars_eNB_g[0][CC_id]->ifdevice.transp_type = NONE_TP; } @@ -1663,7 +1662,6 @@ int main( int argc, char **argv ) openair0.type = NONE_DEV; /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ openair0.transp_type = NONE_TP; - //openair0_cfg[0].log_level = glog_level; // Legacy BBU - RRH init //int returns=-1; @@ -1691,9 +1689,7 @@ int main( int argc, char **argv ) //else if (mode==loop_through_memory) { //} //} - - //printf("Done\n"); - + int returns=-1; // Handle spatially distributed MIMO antenna ports From 0d4d8cef0e97480899f5602ce118dfbc3426fd5d Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 27 Jun 2016 17:21:53 +0200 Subject: [PATCH 088/340] added node func BBU and marked split for rf/if read and write --- openair1/PHY/defs.h | 9 +++--- openair1/SCHED/phy_procedures_lte_eNb.c | 38 ++++++++++++------------- targets/RT/USER/lte-enb.c | 19 +++++++++---- targets/RT/USER/lte-softmodem.c | 12 ++++++-- 4 files changed, 46 insertions(+), 32 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index ed3ca5c251..d01edd1ba0 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -157,10 +157,11 @@ enum transmission_access_mode { SCHEDULED_ACCESS, CBA_ACCESS}; -typedef enum { - eNodeB_3GPP=0, // classical eNodeB function - NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) - NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) +typedef enum { + eNodeB_3GPP=0, // classical eNodeB function + eNodeB_3GPP_BBU, // classical eNodeB function with transport interface + NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) + NGFI_RCC_IF4, // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) } eNB_func_t; typedef struct UE_SCAN_INFO_s { diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index ef7b70d179..2754f7842b 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2524,11 +2524,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl uint16_t packet_type; uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; - - struct timespec time_req, time_rem; - time_req.tv_sec = 0; - time_req.tv_nsec = 300000; - + if (subframe==9) { subframe=0; frame++; @@ -2547,7 +2543,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) if ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF and front-end processing + (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF for (i=0; inb_antennas_rx; i++) rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; @@ -2563,13 +2559,13 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (proc->first_rx == 0) { if (proc->subframe_rx != subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - exit_fun("Exiting"); - } + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + exit_fun("Exiting"); + } if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - exit_fun("Exiting"); - } + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } } else { proc->first_rx = 0; } @@ -2585,6 +2581,16 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + } else if(eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF + /// **** trx_read_func from IF device **** /// + + } + + + if ((eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == eNodeB_3GPP) || + (eNB->node_function == eNodeB_3GPP_BBU)) { // front-end processing + // now do common RX processing for first slot in subframe VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); remove_7_5_kHz(eNB,proc->subframe_rx<<1); @@ -2608,12 +2614,10 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); if (eNB->node_function == NGFI_RRU_IF4 && is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)<=0) { - - /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// + /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(eNB, frame, subframe, IF4_PULFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); - } /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) @@ -2657,10 +2661,6 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl symbol_mask = 0; symbol_mask_full = (1<symbols_per_tti)-1; prach_rx = 0; - - // Block from loop while testing - //symbol_mask = symbol_mask_full; - //nanosleep(&time_req, &time_rem); do { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 00d1bdcdaa..0ce83c721f 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -500,12 +500,13 @@ static void* eNB_thread_rxtx( void* param ) { } } - // eNodeB_3GPP and RRU create txdata and write to RF device + // eNodeB_3GPP, _BBU and RRU create txdata if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); - + } + /* short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.samples_per_tti]; int i; @@ -518,8 +519,12 @@ static void* eNB_thread_rxtx( void* param ) { txdata[i+5] = 0; txdata[i+6] = 0; txdata[i+7] = -2047; } - */ + */ + + // eNodeB_3GPP, RRU write to RF device + if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP || + PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) { // Transmit TX buffer based on timestamp from RX VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers @@ -539,13 +544,15 @@ static void* eNB_thread_rxtx( void* param ) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { + /// **** trx_write_func to IF device **** /// + + } else { - /// **** send_IF4 of txdataF to RRU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); - } if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { @@ -744,7 +751,7 @@ static void* eNB_thread_rx_common( void* param ) { #endif // Start RF device for this CC - if (eNB->node_function != NGFI_RCC_IF4) { + if (eNB->node_function == eNodeB_3GPP || eNB->node_function == NGFI_RRU_IF4) { if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) LOG_E(HW,"Could not start the RF device\n"); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index c4d37393bd..bd877e7aff 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -686,7 +686,8 @@ static void get_options (int argc, char **argv) LONG_OPTION_PHYTEST, LONG_OPTION_RCC, LONG_OPTION_RRU, - LONG_OPTION_ENB + LONG_OPTION_ENB, + LONG_OPTION_ENB_BBU #if T_TRACER , LONG_OPTION_T_PORT, @@ -713,6 +714,7 @@ static void get_options (int argc, char **argv) {"RCC", no_argument, NULL, LONG_OPTION_RCC}, {"RRU", no_argument, NULL, LONG_OPTION_RRU}, {"eNB", no_argument, NULL, LONG_OPTION_ENB}, + {"BBU", no_argument, NULL, LONG_OPTION_ENB_BBU}, #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, @@ -815,6 +817,10 @@ static void get_options (int argc, char **argv) case LONG_OPTION_ENB: node_function = eNodeB_3GPP; break; + + case LONG_OPTION_ENB_BBU: + node_function = eNodeB_3GPP_BBU; + break; #if T_TRACER case LONG_OPTION_T_PORT: { @@ -1694,7 +1700,7 @@ int main( int argc, char **argv ) // Handle spatially distributed MIMO antenna ports // Load RF device and initialize - if (node_function != NGFI_RCC_IF4) { + if (node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { for (CC_id=0; CC_idrfdevice), &openair0_cfg[0]); @@ -1710,7 +1716,7 @@ int main( int argc, char **argv ) } // Load transport protocol and initialize - if (node_function != eNodeB_3GPP){ + if (node_function != eNodeB_3GPP) { for (CC_id=0; CC_idifdevice), &openair0_cfg[0], (eth_params+CC_id)); From 36df9556c287ad6c67384bf7930a0c8480a9295c Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 27 Jun 2016 17:26:43 +0200 Subject: [PATCH 089/340] minor typo --- openair1/PHY/defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index d01edd1ba0..0c61fe0bc7 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -161,7 +161,7 @@ typedef enum { eNodeB_3GPP=0, // classical eNodeB function eNodeB_3GPP_BBU, // classical eNodeB function with transport interface NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) - NGFI_RCC_IF4, // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) + NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) } eNB_func_t; typedef struct UE_SCAN_INFO_s { From 36a3d857270dd5760a3df439dda9bf4b7b32dc54 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 28 Jun 2016 18:05:23 +0200 Subject: [PATCH 090/340] init if before rf, cleaning usrp blocks --- targets/RT/USER/lte-enb.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 0ce83c721f..0e3af529c2 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -749,6 +749,12 @@ static void* eNB_thread_rx_common( void* param ) { #if defined(ENABLE_ITTI) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif + + // Start IF device for this CC + if (eNB->node_function != eNodeB_3GPP) { + if (eNB->ifdevice.trx_start_func(&eNB->ifdevice) != 0 ) + LOG_E(HW,"Could not start the IF device\n"); + } // Start RF device for this CC if (eNB->node_function == eNodeB_3GPP || eNB->node_function == NGFI_RRU_IF4) { @@ -756,12 +762,6 @@ static void* eNB_thread_rx_common( void* param ) { LOG_E(HW,"Could not start the RF device\n"); } - // Start IF device for this CC - if (eNB->node_function != eNodeB_3GPP) { - if (eNB->ifdevice.trx_start_func(&eNB->ifdevice) != 0 ) - LOG_E(HW,"Could not start the IF device\n"); - } - // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, 0 ); From 3fd226f7b05de1f36faaa0e897753e76125d3f15 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 29 Jun 2016 17:16:29 +0200 Subject: [PATCH 091/340] added sync between rru and rcc frame, subframe --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 11 +++++++---- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 21 +++++++++++++++++++-- targets/RT/USER/lte-enb.c | 3 ++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 4756559ac3..b71365d6fc 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -176,7 +176,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, } -void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, uint32_t *symbol_number) { +void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; @@ -208,10 +208,13 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, packet_header = (IF4_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); data_block = (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t); + + *frame = ((packet_header->frame_status)>>6)&0xffff; + *subframe = ((packet_header->frame_status)>>22)&0x000f; if (*packet_type == IF4_PDLFFT) { // Calculate from received packet - slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; // Do decompression of the two parts and generate txdataF @@ -228,7 +231,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } else if (*packet_type == IF4_PULFFT) { // Calculate from received packet - slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; // Do decompression of the two parts and generate rxdataF @@ -246,7 +249,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t *packet_type, } else if (*packet_type == IF4_PRACH) { // FIX: hard coded prach samples length db_fulllength = 839*2; - + // Generate uncompressed data blocks memcpy((rxsigF[0]+slotoffsetF), data_block, db_fulllength*sizeof(int16_t)); diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index f06072b73e..18ff2bb8f8 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -70,4 +70,4 @@ void gen_IF4_prach_header(IF4_header_t*, int, int); void send_IF4(PHY_VARS_eNB*, int, int, uint16_t, int); -void recv_IF4(PHY_VARS_eNB*, int, int, uint16_t*, uint32_t*); +void recv_IF4(PHY_VARS_eNB*, int*, int*, uint16_t*, uint32_t*); diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 2754f7842b..e5b93dc6ac 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2664,13 +2664,13 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl do { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - recv_IF4(eNB, proc->frame_rx, proc->subframe_rx, &packet_type, &symbol_number); + recv_IF4(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); if (packet_type == IF4_PULFFT) { symbol_mask = symbol_mask | (1<0 && packet_type == PRACH) { + } else if (packet_type == IF4_PRACH) { // wake up thread for PRACH RX prach_rx = 1; @@ -2703,6 +2703,23 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); + if (proc->first_rx == 0) { + if (proc->subframe_rx != subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); +// exit_fun("Exiting"); + } + if (proc->frame_rx != frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + // exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); + // Tobi aka mr monaco: ETH } else { // should not get here diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 0e3af529c2..6eb916c41b 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -493,10 +493,11 @@ static void* eNB_thread_rxtx( void* param ) { /// **** recv_IF4 of txdataF from RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1) { - recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, &packet_type, &symbol_number); + recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + // Check the recv frame/subframe } } From b62885663534a087beacc335cf58ffd5925ad916 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 1 Jul 2016 03:10:39 -0700 Subject: [PATCH 092/340] updates in UE for new process scheduling --- openair1/PHY/INIT/lte_init.c | 12 +- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 4 +- .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 22 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 15 +- .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 2 +- openair1/PHY/LTE_TRANSPORT/drs_modulation.c | 3 +- openair1/PHY/LTE_TRANSPORT/initial_sync.c | 23 +- openair1/PHY/LTE_TRANSPORT/phich.c | 17 +- openair1/PHY/LTE_TRANSPORT/print_stats.c | 6 +- openair1/PHY/LTE_TRANSPORT/proto.h | 21 +- openair1/PHY/LTE_TRANSPORT/pucch.c | 9 +- openair1/PHY/LTE_TRANSPORT/rar_tools.c | 7 +- openair1/PHY/TOOLS/lte_phy_scope.c | 2 +- openair1/PHY/defs.h | 102 +- openair1/SCHED/defs.h | 100 +- openair1/SCHED/phy_procedures_lte_ue.c | 4347 ++++++++--------- openair1/SCHED/pucch_pc.c | 6 +- openair1/SCHED/pusch_pc.c | 10 +- targets/RT/USER/lte-softmodem.c | 2 +- targets/RT/USER/lte-ue.c | 559 +-- 20 files changed, 2407 insertions(+), 2862 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index e3128d7296..a453b8eb8d 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -259,7 +259,7 @@ void phy_config_sib2_ue(uint8_t Mod_id,int CC_id, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_IN); - LOG_I(PHY,"[UE%d] Frame %d: Applying radioResourceConfigCommon from eNB%d\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,CH_index); + LOG_I(PHY,"[UE%d] Applying radioResourceConfigCommon from eNB%d\n",Mod_id,CH_index); frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; @@ -369,7 +369,7 @@ void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index,int mbsfn_Are LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; - LOG_I(PHY,"[UE%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,mbsfn_AreaId_r9,mbsfn_Area_idx); + LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; @@ -517,8 +517,8 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility // uint8_t prach_fmt; // int u; - LOG_I(PHY,"[UE%d] Frame %d: Handover triggered: Applying radioResourceConfigCommon from eNB %d\n", - Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,eNB_id); + LOG_I(PHY,"[UE%d] Handover triggered: Applying radioResourceConfigCommon from eNB %d\n", + Mod_id,eNB_id); frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; frame_parms->prach_config_common.prach_Config_enabled=1; @@ -752,7 +752,7 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index, if (physicalConfigDedicated) { - LOG_D(PHY,"[UE %d] Frame %d: Received physicalConfigDedicated from eNB %d\n",Mod_id, phy_vars_ue->frame_rx,CH_index); + LOG_D(PHY,"[UE %d] Received physicalConfigDedicated from eNB %d\n",Mod_id, CH_index); LOG_D(PHY,"------------------------------------------------------------------------\n"); if (physicalConfigDedicated->pdsch_ConfigDedicated) { @@ -843,7 +843,7 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index, #endif } else { - LOG_D(PHY,"[PHY][UE %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, phy_vars_ue->frame_rx,CH_index); + LOG_D(PHY,"[PHY][UE %d] Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id,CH_index); return; } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 6980ca358c..b78a7e24fd 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -51,7 +51,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, ncoef = 32767 - coef; #ifdef DEBUG_PHY - LOG_D(PHY,"frame %d, slot %d: rx_offset (before) = %d\n",ue->frame_rx,ue->slot_rx,ue->rx_offset); + LOG_D(PHY,"frame %d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset); #endif //DEBUG_PHY @@ -95,7 +95,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, #ifdef DEBUG_PHY LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n", - ue->frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp); + ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp); #endif //DEBUG_PHY diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index ae484092b8..7a9fd1284d 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -77,7 +77,7 @@ int16_t get_PL(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) RSoffset = 3; */ - LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", ue->frame_rx, + LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", ue->proc.proc_rxtx[0].frame_rx, (1.0*dB_fixed_times10(ue->measurements.rsrp[eNB_index])-(10.0*ue->rx_total_gain_dB))/10.0, 10*log10((double)ue->measurements.rsrp[eNB_index]), ue->frame_parms.pdsch_config_common.referenceSignalPower); @@ -172,7 +172,7 @@ int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs } void ue_rrc_measurements(PHY_VARS_UE *ue, - uint8_t slot, + uint8_t subframe, uint8_t abstraction_flag) { @@ -192,7 +192,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, if (abstraction_flag == 0) { if ((ue->frame_parms.frame_type == FDD) && - ((slot == 0) || (slot == 10))) { // FDD PSS/SSS, compute noise in DTX REs + ((subframe == 0) || (subframe == 5))) { // FDD PSS/SSS, compute noise in DTX REs if (ue->frame_parms.Ncp==NORMAL) { for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { @@ -240,7 +240,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, } } else if ((ue->frame_parms.frame_type == TDD) && - (slot == 1)) { // TDD SSS, compute noise in DTX REs + (subframe == 0)) { // TDD SSS, compute noise in DTX REs if (ue->frame_parms.Ncp==NORMAL) { for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { @@ -294,7 +294,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) { k = (nu + nushift)%6; #ifdef DEBUG_MEAS - LOG_I(PHY,"[UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->frame_rx,slot,Nid_cell,nushift, + LOG_I(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift, eNB_offset,k,l); #endif @@ -376,15 +376,15 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, // if (slot == 0) { if (eNB_offset == 0) - LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id, - ue->frame_rx,slot,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, + LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id, + ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, 10*log10(ue->measurements.rssi), ue->rx_total_gain_dB, ue->measurements.n0_power_tot_dBm); - LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n", + LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n", ue->Mod_id, - ue->frame_rx,slot,eNB_offset, + ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,eNB_offset, (eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell, 10*log10(ue->measurements.rsrp[eNB_offset])-ue->rx_total_gain_dB, ue->measurements.rsrp[eNB_offset], @@ -699,9 +699,9 @@ void lte_ue_measurements(PHY_VARS_UE *ue, } -void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id) +void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id) { - msg("[PHY] EMUL UE lte_ue_measurements_emul last slot %d, eNB_id %d\n",last_slot,eNB_id); + msg("[PHY] EMUL UE lte_ue_measurements_emul subframe %d, eNB_id %d\n",subframe,eNB_id); } diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 18e232e967..3f784e22d3 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -6236,6 +6236,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, uint8_t subframe, DCI_format_t dci_format, PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, @@ -6269,12 +6270,12 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, harq_pid = 0; else harq_pid = subframe2harq_pid(frame_parms, - pdcch_alloc2ul_frame(frame_parms,ue->frame_rx,subframe), + pdcch_alloc2ul_frame(frame_parms,proc->frame_rx,subframe), pdcch_alloc2ul_subframe(frame_parms,subframe)); if (harq_pid == 255) { LOG_E(PHY, "frame %d, subframe %d, rnti %x, format %d: illegal harq_pid!\n", - ue->frame_rx, subframe, rnti, dci_format); + proc->frame_rx, subframe, rnti, dci_format); return(-1); } @@ -6401,7 +6402,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, if (rballoc > RIV_max) { LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc > RIV_max\n", - ue->frame_rx, subframe, rnti, dci_format); + proc->frame_rx, subframe, rnti, dci_format); return(-1); } @@ -6416,13 +6417,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, if (ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) { LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n", - ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->f_pusch, + ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch, delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC], ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC); ulsch->f_pusch += delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC]; } else { LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ABS) %d, adjusting to %d (TPC %d)\n", - ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->f_pusch, + ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch, delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC], ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC); ulsch->f_pusch = delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC]; @@ -7044,7 +7045,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, } LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d\n", - ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb, + ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb, ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx); // ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift; @@ -7071,7 +7072,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, return(0); } else { LOG_E(PHY,"frame %d, subframe %d: FATAL ERROR, generate_ue_ulsch_params_from_dci, Illegal dci_format %d\n", - ue->frame_rx, subframe,dci_format); + proc->frame_rx, subframe,dci_format); return(-1); } diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index c41262727f..ab6c4703d6 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -123,7 +123,7 @@ int rx_pdsch(PHY_VARS_UE *ue, break; default: - LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->frame_rx,subframe,type); + LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->proc.proc_rxtx[0].frame_rx,subframe,type); return(-1); break; } diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c index 8ccfc72d20..1f8e605eaf 100644 --- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c @@ -43,6 +43,7 @@ //#define DEBUG_DRS int generate_drs_pusch(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, uint8_t eNB_id, short amp, unsigned int subframe, @@ -70,7 +71,7 @@ int generate_drs_pusch(PHY_VARS_UE *ue, uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; int32_t ref_re,ref_im; - uint8_t harq_pid = subframe2harq_pid(frame_parms,ue->frame_tx,subframe); + uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe); cyclic_shift0 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 673b7a4348..57c9a824a2 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -239,20 +239,25 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode) break; } - ue->frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2; - ue->frame_rx += frame_mod4; + ue->proc.proc_rxtx[0].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2; + ue->proc.proc_rxtx[0].frame_rx += frame_mod4; + + ue->proc.proc_rxtx[1].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2; + ue->proc.proc_rxtx[1].frame_rx += frame_mod4; #ifndef USER_MODE // one frame delay - ue->frame_rx ++; + ue->proc.proc_rxtx[0].frame_rx ++; + ue->proc.proc_rxtx[1].frame_rx ++; #endif - ue->frame_tx = ue->frame_rx; + ue->proc.proc_rxtx[0].frame_tx = ue->proc.proc_rxtx[0].frame_rx; + ue->proc.proc_rxtx[1].frame_tx = ue->proc.proc_rxtx[1].frame_rx; #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully mode1_flag %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n", ue->Mod_id, frame_parms->mode1_flag, pbch_tx_ant, - ue->frame_rx, + ue->proc.proc_rxtx[0].frame_rx, frame_parms->N_RB_DL, frame_parms->phich_config_common.phich_duration, phich_resource); //frame_parms->phich_config_common.phich_resource); @@ -475,7 +480,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode) if (ue->mac_enabled==1) { LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id); //mac_resynch(); - mac_xface->dl_phy_sync_success(ue->Mod_id,ue->frame_rx,0,1);//ue->common_vars.eNb_id); + mac_xface->dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id); ue->UE_mode[0] = PRACH; } else { @@ -491,7 +496,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode) } LOG_I(PHY,"[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id, - ue->frame_rx, + ue->proc.proc_rxtx[0].frame_rx, 10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, 10*log10(ue->measurements.rssi), ue->rx_total_gain_dB, @@ -502,7 +507,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode) LOG_I(PHY,"[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n", ue->Mod_id, - ue->frame_rx, + ue->proc.proc_rxtx[0].frame_rx, duplex_string[ue->frame_parms.frame_type], prefix_string[ue->frame_parms.Ncp], ue->frame_parms.Nid_cell, @@ -513,7 +518,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode) LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n", ue->Mod_id, - ue->frame_rx, + ue->proc.proc_rxtx[0].frame_rx, openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset, ue->common_vars.freq_offset); diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 0d0d5832cb..71de66cfc2 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1055,6 +1055,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, void rx_phich(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, uint8_t subframe, uint8_t eNB_id) { @@ -1064,7 +1065,7 @@ void rx_phich(PHY_VARS_UE *ue, LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars; // uint8_t HI; - uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,ue->frame_rx,subframe); + uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,proc->frame_rx,subframe); LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; int16_t phich_d[24],*phich_d_ptr,HI16; // unsigned int i,aa; @@ -1082,10 +1083,10 @@ void rx_phich(PHY_VARS_UE *ue, uint8_t pusch_subframe; // check if we're expecting a PHICH in this subframe - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,ue->frame_rx,subframe); + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe); if (ulsch->harq_processes[harq_pid]->status == ACTIVE) { - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,ue->frame_rx,subframe); + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe); Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48; if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0) @@ -1349,14 +1350,14 @@ void rx_phich(PHY_VARS_UE *ue, if (ue->ulsch_Msg3_active[eNB_id] == 1) { LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received NAK (%d) nseq %d, ngroup %d\n", ue->Mod_id,harq_pid, - ue->frame_rx, + proc->frame_rx, subframe, HI16, nseq_PHICH, ngroup_PHICH); get_Msg3_alloc_ret(&ue->frame_parms, subframe, - ue->frame_rx, + proc->frame_rx, &ue->ulsch_Msg3_frame[eNB_id], &ue->ulsch_Msg3_subframe[eNB_id]); ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; @@ -1374,7 +1375,7 @@ void rx_phich(PHY_VARS_UE *ue, //#ifdef DEBUG_PHICH LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d\n", ue->Mod_id,harq_pid, - ue->frame_rx, + proc->frame_rx, subframe, HI16, nseq_PHICH, @@ -1394,7 +1395,7 @@ void rx_phich(PHY_VARS_UE *ue, if (ue->ulsch_Msg3_active[eNB_id] == 1) { LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received ACK (%d) nseq %d, ngroup %d\n\n", ue->Mod_id,harq_pid, - ue->frame_rx, + proc->frame_rx, subframe, HI16, nseq_PHICH,ngroup_PHICH); @@ -1402,7 +1403,7 @@ void rx_phich(PHY_VARS_UE *ue, //#ifdef PHICH_DEBUG LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n", ue->Mod_id,harq_pid, - ue->frame_rx, + proc->frame_rx, subframe, HI16, nseq_PHICH,ngroup_PHICH); //#endif diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index a175f4cb8e..1653d0e549 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -55,7 +55,7 @@ extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index); extern openair0_config_t openair0_cfg[]; #endif -int dump_ue_stats(PHY_VARS_UE *ue, char* buffer, int length, runmode_t mode, int input_level_dBm) +int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length, runmode_t mode, int input_level_dBm) { uint8_t eNB=0; @@ -78,7 +78,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, char* buffer, int length, runmode_t mode, int /* len += sprintf(&buffer[len], "[UE PROC] Frame count: %d\neNB0 RSSI %d dBm/RE (%d dB, %d dB)\neNB1 RSSI %d dBm/RE (%d dB, %d dB)neNB2 RSSI %d dBm/RE (%d dB, %d dB)\nN0 %d dBm/RE, %f dBm/%dPRB (%d dB, %d dB)\n", - ue->frame_rx, + proc->frame_rx, ue->measurements.rx_rssi_dBm[0], ue->measurements.rx_power_dB[0][0], ue->measurements.rx_power_dB[0][1], @@ -535,7 +535,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, char* buffer, int length, runmode_t mode, int } else { len += sprintf(&buffer[len], "[UE PROC] Frame count: %d, RSSI %3.2f dB (%d dB, %d dB), N0 %3.2f dB (%d dB, %d dB)\n", - ue->frame_rx, + proc->frame_rx, 10*log10(ue->measurements.rssi), ue->measurements.rx_power_dB[0][0], ue->measurements.rx_power_dB[0][1], diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 0afa2936bb..547dd86a9c 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -1328,6 +1328,7 @@ int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue, */ int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, uint8_t eNB_id, int16_t amp, uint32_t subframe, @@ -1398,7 +1399,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, uint8_t subframe, DCI_format_t dci_format, PHY_VARS_UE *phy_vars_ue, - uint16_t si_rnti, + UE_rxtx_proc_t *proc, + uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, uint16_t cba_rnti, @@ -1406,7 +1408,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, uint8_t use_srs); int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, - uint8_t eNB_id); + UE_rxtx_proc_t *proc, + uint8_t eNB_id); double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id); int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB, @@ -1424,16 +1427,13 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB, void dump_ulsch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id); -void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); -void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); -void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); -void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round); + int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci); -int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t mode, int input_level_dBm); +int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc, char* buffer, int length, runmode_t mode, int input_level_dBm); int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length); @@ -1550,11 +1550,13 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, /* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters. @param phy_vars_ue Pointer to UE variables + @param proc Pointer to RXN_TXNp4 proc @param subframe Subframe of received PDCCH/PHICH @param eNB_id Index of eNB */ void rx_phich(PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, uint8_t subframe, uint8_t eNB_id); @@ -1653,11 +1655,12 @@ void generate_pucch(int32_t **txdataF, uint8_t subframe); void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, PUCCH_FMT_t format, uint8_t ncs1, uint8_t *pucch_ack_payload, - uint8_t sr, - uint8_t subframe); + uint8_t sr); + uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index e2876f95e3..cb7803fbfc 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -403,13 +403,16 @@ void generate_pucch(int32_t **txdataF, } void generate_pucch_emul(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, PUCCH_FMT_t format, uint8_t ncs1, uint8_t *pucch_payload, - uint8_t sr, - uint8_t subframe) + uint8_t sr) + { + int subframe = proc->subframe_tx; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_flag = format; UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_Ncs1 = ncs1; @@ -428,7 +431,7 @@ void generate_pucch_emul(PHY_VARS_UE *ue, ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1); UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1); } else if (format == pucch_format1) { - LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,ue->frame_tx,subframe,sr); + LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,proc->frame_tx,subframe,sr); } ue->sr[subframe] = sr; diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c index dbac1e2280..0cdabe9b9d 100644 --- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c @@ -175,6 +175,7 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, int8_t delta_PUSCH_msg2[8] = {-6,-4,-2,0,2,4,6,8}; int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, unsigned char eNB_id ) { @@ -189,13 +190,13 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue, // int current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id]; uint8_t *rar = (uint8_t *)(rar_pdu+1); - uint8_t harq_pid = subframe2harq_pid(frame_parms,ue->frame_tx,subframe); + uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe); uint16_t rballoc; uint8_t cqireq; uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT; uint16_t RIV_max = 0; - LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",ue->frame_tx,subframe,harq_pid); + LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",proc->frame_tx,subframe,harq_pid); switch (frame_parms->N_RB_DL) { case 6: @@ -272,7 +273,7 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue, ulsch->uci_format = HLC_subband_cqi_nopmi; fill_CQI(ulsch,meas,eNB_id,0,ue->frame_parms.N_RB_DL,0, transmission_mode,ue->sinr_eff); - if (((ue->frame_tx % 100) == 0) || (ue->frame_tx < 10)) + if (((proc->frame_tx % 100) == 0) || (proc->frame_tx < 10)) print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL); } else { ulsch->O_RI = 0; diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 8af3fcf8d1..f3e5e71775 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -509,7 +509,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, float **chest_t_abs; float time[FRAME_LENGTH_COMPLEX_SAMPLES]; float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; - int frame = phy_vars_ue->frame_rx; + int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx; uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id]; int coded_bits_per_codeword = 0; int mcs = 0; diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 0c61fe0bc7..70a661adf0 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -157,11 +157,11 @@ enum transmission_access_mode { SCHEDULED_ACCESS, CBA_ACCESS}; -typedef enum { - eNodeB_3GPP=0, // classical eNodeB function - eNodeB_3GPP_BBU, // classical eNodeB function with transport interface - NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) - NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) +typedef enum { + eNodeB_3GPP=0, // classical eNodeB function + eNodeB_3GPP_BBU, // eNodeB with NGFI IF5 + NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) + NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) } eNB_func_t; typedef struct UE_SCAN_INFO_s { @@ -250,8 +250,58 @@ typedef struct { eNB_rxtx_proc_t proc_rxtx[2]; } eNB_proc_t; -//! \brief Number of eNB TX and RX threads. -//! This number must be equal to the number of LTE subframes (10). Each thread is responsible for a single subframe. + +/// Context data structure for RX/TX portion of subframe processing +typedef struct { + /// Component Carrier index + uint8_t CC_id; + /// timestamp transmitted to HW + openair0_timestamp timestamp_tx; + /// subframe to act upon for transmission + int subframe_tx; + /// subframe to act upon for reception + int subframe_rx; + /// frame to act upon for transmission + int frame_tx; + /// frame to act upon for reception + int frame_rx; + /// \brief Instance count for RXn-TXnp4 processing thread. + /// \internal This variable is protected by \ref mutex_rxtx. + int instance_cnt_rxtx; + /// pthread structure for RXn-TXnp4 processing thread + pthread_t pthread_rxtx; + /// pthread attributes for RXn-TXnp4 processing thread + pthread_attr_t attr_rxtx; + /// condition variable for tx processing thread + pthread_cond_t cond_rxtx; + /// mutex for RXn-TXnp4 processing thread + pthread_mutex_t mutex_rxtx; + /// scheduling parameters for RXn-TXnp4 thread + struct sched_param sched_param_rxtx; +} UE_rxtx_proc_t; + +/// Context data structure for eNB subframe processing +typedef struct { + /// Component Carrier index + uint8_t CC_id; + /// Last RX timestamp + openair0_timestamp timestamp_rx; + /// \brief Instance count for synch thread. + /// \internal This variable is protected by \ref mutex_synch. + int instance_cnt_synch; + /// pthread attributes for prach processing thread + pthread_attr_t attr_synch; + /// scheduling parameters for synch thread + struct sched_param sched_param_synch; + /// pthread descriptor synch thread + pthread_t pthread_synch; + /// condition variable for UE synch thread; + pthread_cond_t cond_synch; + /// mutex for UE synch thread + pthread_mutex_t mutex_synch; + /// set of scheduling variables RXn-TXnp4 threads + UE_rxtx_proc_t proc_rxtx[2]; +} UE_proc_t; /// Top-level PHY Data Structure for eNB typedef struct PHY_VARS_eNB_s { @@ -491,34 +541,8 @@ typedef struct { int UE_scan_carrier; /// \brief Indicator that UE is synchronized to an eNB int is_synchronized; - /// \brief Instance count of TX processing thread (-1 means ready, 0 means busy) - int instance_cnt_tx; - /// \brief Instance count of RX processing thread (-1 means ready, 0 means busy) - int instance_cnt_rx; - /// \brief Instance count of initial synchronization thread (-1 means ready, 0 means busy). - /// Protected by mutex \ref mutex_synch and condition \ref cond_synch. - int instance_cnt_synch; - /// \brief Condition variable for TX processing thread - pthread_cond_t cond_tx; - /// \brief Condition variable for RX processing thread - pthread_cond_t cond_rx; - /// \brief Condition variable for initial synchronization thread. - /// The corresponding mutex is \ref mutex_synch. - pthread_cond_t cond_synch; - /// \brief Mutex for TX processing thread - pthread_mutex_t mutex_tx; - /// \brief Mutex for RX processing thread - pthread_mutex_t mutex_rx; - /// \brief Mutex for initial synchronization thread. - /// Used to protect \ref instance_cnt_synch. - /// \sa cond_synch - pthread_mutex_t mutex_synch; - /// \brief Pthread structure for RX processing thread - pthread_t thread_rx; - /// \brief Pthread structure for TX processing thread - pthread_t thread_tx; - /// \brief Pthread structure to RX processing thread - pthread_t thread_synch; + /// Data structure for UE process scheduling + UE_proc_t proc; /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna) uint32_t tx_total_gain_dB; /// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card. @@ -535,10 +559,6 @@ typedef struct { int tx_total_RE; /// \brief Maximum transmit power int8_t tx_power_max_dBm; - /// \brief Frame counters for TX and RX processing - uint32_t frame_rx,frame_tx; - /// \brief Slot counters for TX and RX processing - uint32_t slot_tx,slot_rx; /// \brief Number of eNB seen by UE uint8_t n_connected_eNB; /// \brief indicator that Handover procedure has been initiated @@ -587,10 +607,14 @@ typedef struct { uint32_t high_speed_flag; uint32_t perfect_ce; int16_t ch_est_alpha; + int generate_ul_signal[NUMBER_OF_CONNECTED_eNB_MAX]; + UE_SCAN_INFO_t scan_info[NB_BANDS_MAX]; char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX]; + + unsigned char ulsch_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX]; uint32_t ulsch_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX]; unsigned char ulsch_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX]; diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 62e0a7d9ce..9f0b37ca30 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -72,12 +72,7 @@ enum openair_ERROR { enum openair_SYNCH_STATUS { openair_NOT_SYNCHED=1, -#ifdef OPENAIR_LTE openair_SYNCHED, -#else - openair_SYNCHED_TO_CHSCH, - openair_SYNCHED_TO_MRSCH, -#endif openair_SCHED_EXIT }; @@ -86,65 +81,6 @@ enum openair_SYNCH_STATUS { #define DAQ_AGC_OFF 0 -/* -typedef struct { - boolean_t is_eNB; - uint8_t mode; - uint8_t synch_source; - uint32_t slot_count; - uint32_t sched_cnt; - uint32_t synch_wait_cnt; - uint32_t sync_state; - uint32_t scheduler_interval_ns; - uint32_t last_adac_cnt; - uint8_t first_sync_call; - int32_t instance_cnt; - uint8_t one_shot_get_frame; - uint8_t do_synch; - uint8_t node_configured; // &1..basic config, &3..ue config &5..eNb config - uint8_t node_running; - uint8_t tx_test; - uint8_t mac_registered; - //uint8_t freq; - uint32_t freq; - uint32_t rx_gain_val; - uint32_t rx_gain_mode; - uint32_t tcxo_dac; - uint32_t auto_freq_correction; - int32_t freq_offset; - uint32_t tx_rx_switch_point; - uint32_t manual_timing_advance; /// 1 to override automatic timing advance - int32_t timing_advance; - uint32_t dual_tx; /// 1 for dual-antenna TX, 0 for single-antenna TX - uint32_t tdd; /// 1 for TDD mode, 0 for FDD mode - uint32_t rx_rf_mode; - uint32_t node_id; - uint32_t rach_detection_count; - uint32_t channel_vacant[4]; - uint32_t target_ue_dl_mcs; - uint32_t target_ue_ul_mcs; - uint32_t ue_ul_nb_rb; - uint32_t ue_dl_rb_alloc; - uint32_t dlsch_rate_adaptation; - uint32_t dlsch_transmission_mode; - uint32_t ulsch_allocation_mode; - uint32_t rx_total_gain_dB; - uint32_t hw_frame; - uint32_t get_frame_done; - uint32_t use_ia_receiver; -} OPENAIR_DAQ_VARS; -*/ - -#ifndef USER_MODE -int32_t openair_sched_init(void); -void openair_sched_cleanup(void); -void openair_sched_exit(char *); -void openair1_restart(void); -int32_t init_dlsch_threads(void); -void cleanup_dlsch_threads(void); -#endif //USER_MODE - -#ifdef OPENAIR_LTE /** @addtogroup _PHY_PROCEDURES_ * @{ */ @@ -168,7 +104,7 @@ void phy_procedures_eNB_lte(uint8_t subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param *phy_vars_rn pointer to RN variables */ -void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); #ifdef Rel10 /*! \brief Top-level entry routine for relay node procedures when acting as eNB. This proc will make us of the existing eNB procs. @@ -187,22 +123,24 @@ int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, re /*! \brief Scheduling for UE TX procedures in normal subframes. @param phy_vars_ue Pointer to UE variables on which to act + @param proc Pointer to RXn-TXnp4 proc information @param eNB_id Local id of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @param mode calib/normal mode @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type); +void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type); /*! \brief Scheduling for UE RX procedures in normal subframes. @param last_slot Index of last slot (0-19) @param phy_vars_ue Pointer to UE variables on which to act + @param proc Pointer to RXn_TXnp4 proc information @param eNB_id Local id of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @param mode calibration/debug mode @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param phy_vars_rn pointer to RN variables */ -int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); /*! \brief Scheduling for UE TX procedures in TDD S-subframes. @param phy_vars_ue Pointer to UE variables on which to act @@ -385,11 +323,11 @@ uint8_t ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subfram /*! \brief Indicates the SR TXOp in current subframe. Implements Table 10.1-5 from 36.213. @param phy_vars_ue Pointer to UE variables + @param proc Pointer to RXn_TXnp4 thread context @param eNB_id ID of eNB which is to receive the SR - @param subframe index of next subframe @returns 1 if TXOp is active. */ -uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); +uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id); /*! \brief Indicates the SR TXOp in current subframe for eNB and particular UE index. Implements Table 10.1-5 from 36.213. @param phy_vars_eNB Pointer to eNB variables @@ -426,7 +364,7 @@ int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB); int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rnti); void process_timing_advance(module_id_t Mod_id,uint8_t CC_id,int16_t timing_advance); -void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance); +void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint16_t timing_advance); unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb); @@ -436,15 +374,15 @@ void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch = Ncce + N1_pucch. For TDD, this routine computes the complex procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2) @param phy_vars_ue Pointer to UE variables +@param proc Pointer to RXn-TXnp4 proc information @param eNB_id Index of eNB -@param subframe subframe on which to act @param b Pointer to PUCCH payload (b[0],b[1]) @param SR 1 means there's a positive SR in parallel to ACK/NAK @returns n1_pucch */ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, uint8_t eNB_id, - uint8_t subframe, uint8_t *b, uint8_t SR); @@ -497,21 +435,21 @@ UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index); /*! \brief This function implements the power control mechanism for PUCCH from 36.213. @param phy_vars_ue PHY variables - @param subframe Index of subframe + @param proc Pointer to proc descriptor @param eNB_id Index of eNB @param pucch_fmt Format of PUCCH that is being transmitted @returns Transmit power */ -int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt); +int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt); /*! \brief This function implements the power control mechanism for PUCCH from 36.213. @param phy_vars_ue PHY variables - @param subframe Index of subframe + @param proc Pointer to proc descriptor @param eNB_id Index of eNB @param j index of type of PUSCH (SPS, Normal, Msg3) @returns Transmit power */ -void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag); +void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag); int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id, uint8_t eNB_index); @@ -543,15 +481,13 @@ int16_t get_target_pucch_rx_power(module_id_t module_idP, uint8_t CC_id); int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag); -void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); -void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); -void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); +void dump_dlsch(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); +void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe); +void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe); +void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round); /*@}*/ -#endif //OPENAIR_LTE - -extern int slot_irq_handler(int irq, void *cookie); #endif diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index c80fdd0e40..b74a79f148 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -25,7 +25,7 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - *******************************************************************************/ +*******************************************************************************/ /*! \file phy_procedures_lte_ue.c * \brief Implementation of UE procedures from 36.213 LTE specifications @@ -49,14 +49,6 @@ #include "SCHED/phy_procedures_emos.h" #endif -#ifdef EXMIMO -#ifdef DRIVER2013 -#include "openair0_lib.h" -#include "gain_control.h" -extern int card; -#endif -#endif - #define DEBUG_PHY_PROC #ifndef PUCCH @@ -75,9 +67,6 @@ fifo_dump_emos_UE emos_dump_UE; #if defined(ENABLE_ITTI) # include "intertask_interface.h" -# if ENABLE_RAL -# include "timer.h" -# endif #endif @@ -91,24 +80,8 @@ extern int oai_exit; uint8_t ulsch_input_buffer[2700] __attribute__ ((aligned(16))); uint8_t access_mode; -#ifdef DLSCH_THREAD -extern int dlsch_instance_cnt[8]; -extern int dlsch_subframe[8]; -extern pthread_mutex_t dlsch_mutex[8]; -/// Condition variable for dlsch thread -extern pthread_cond_t dlsch_cond[8]; -extern int rx_pdsch_instance_cnt; -extern int rx_pdsch_slot; -extern pthread_mutex_t rx_pdsch_mutex; -/// Condition variable for rx_pdsch thread -extern pthread_cond_t rx_pdsch_cond; -#endif - DCI_ALLOC_t dci_alloc_rx[8]; -#ifdef DIAG_PHY -extern int rx_sig_fifo; -#endif #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) @@ -117,7 +90,7 @@ extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; -void dump_dlsch(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) +void dump_dlsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) { unsigned int coded_bits_per_codeword; uint8_t nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12; @@ -128,7 +101,7 @@ void dump_dlsch(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm, ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, ue->pdcch_vars[eNB_id]->num_pdcch_symbols, - ue->frame_rx,subframe); + proc->frame_rx,subframe); write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,2,1); write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); @@ -146,7 +119,7 @@ void dump_dlsch(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars[0]->dl_ch_magb0,300*12,1,1); } -void dump_dlsch_SI(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) +void dump_dlsch_SI(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe) { unsigned int coded_bits_per_codeword; uint8_t nsymb = ((ue->frame_parms.Ncp == 0) ? 14 : 12); @@ -157,7 +130,7 @@ void dump_dlsch_SI(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) 2, 1, ue->pdcch_vars[eNB_id]->num_pdcch_symbols, - ue->frame_rx,subframe); + proc->frame_rx,subframe); LOG_D(PHY,"[UE %d] Dumping dlsch_SI : ofdm_symbol_size %d, nsymb %d, nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", ue->Mod_id, ue->frame_parms.ofdm_symbol_size, @@ -190,43 +163,43 @@ void dump_dlsch_SI(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) //unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162}; /* -unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL) -{ + unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL) + { int gain_dB = power_dBm - power_max_dBm; int amp_x_100; switch (N_RB_UL) { case 6: - amp_x_100 = AMP; // PRACH is 6 PRBS so no scale - break; + amp_x_100 = AMP; // PRACH is 6 PRBS so no scale + break; case 15: - amp_x_100 = 158*AMP; // 158 = 100*sqrt(15/6) - break; + amp_x_100 = 158*AMP; // 158 = 100*sqrt(15/6) + break; case 25: - amp_x_100 = 204*AMP; // 204 = 100*sqrt(25/6) - break; + amp_x_100 = 204*AMP; // 204 = 100*sqrt(25/6) + break; case 50: - amp_x_100 = 286*AMP; // 286 = 100*sqrt(50/6) - break; + amp_x_100 = 286*AMP; // 286 = 100*sqrt(50/6) + break; case 75: - amp_x_100 = 354*AMP; // 354 = 100*sqrt(75/6) - break; + amp_x_100 = 354*AMP; // 354 = 100*sqrt(75/6) + break; case 100: - amp_x_100 = 408*AMP; // 408 = 100*sqrt(100/6) - break; + amp_x_100 = 408*AMP; // 408 = 100*sqrt(100/6) + break; default: - LOG_E(PHY,"Unknown PRB size %d\n",N_RB_UL); - mac_xface->macphy_exit(""); - break; + LOG_E(PHY,"Unknown PRB size %d\n",N_RB_UL); + mac_xface->macphy_exit(""); + break; } if (gain_dB < -30) { - return(amp_x_100/3162); + return(amp_x_100/3162); } else if (gain_dB>0) - return(amp_x_100); + return(amp_x_100); else - return(amp_x_100/gain_table[-gain_dB]); // 245 corresponds to the factor sqrt(25/6) -} + return(amp_x_100/gain_table[-gain_dB]); // 245 corresponds to the factor sqrt(25/6) + } */ unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb) @@ -251,7 +224,7 @@ unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb #endif -void dump_dlsch_ra(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) +void dump_dlsch_ra(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe) { unsigned int coded_bits_per_codeword; uint8_t nsymb = ((ue->frame_parms.Ncp == 0) ? 14 : 12); @@ -262,7 +235,7 @@ void dump_dlsch_ra(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) 2, 1, ue->pdcch_vars[eNB_id]->num_pdcch_symbols, - ue->frame_rx,subframe); + proc->frame_rx,subframe); LOG_D(PHY,"[UE %d] Dumping dlsch_ra : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", ue->Mod_id, ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, @@ -329,7 +302,7 @@ void ra_failed(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) // if contention resolution fails, go back to PRACH PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PRACH; - LOG_E(PHY,"[UE %d] Frame %d Random-access procedure fails, going back to PRACH, setting SIStatus = 0 and State RRC_IDLE\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx); + LOG_E(PHY,"[UE %d] Random-access procedure fails, going back to PRACH, setting SIStatus = 0 and State RRC_IDLE\n",Mod_id); //mac_xface->macphy_exit(""); } @@ -338,7 +311,7 @@ void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) int i; - LOG_I(PHY,"[UE %d][RAPROC] Frame %d Random-access procedure succeeded\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx); + LOG_I(PHY,"[UE %d][RAPROC] Random-access procedure succeeded\n",Mod_id); PHY_vars_UE_g[Mod_id][CC_id]->ulsch_Msg3_active[eNB_index] = 0; PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PUSCH; @@ -359,19 +332,13 @@ UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) return(PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index]); } -void process_timing_advance_rar(PHY_VARS_UE *ue,uint16_t timing_advance) -{ - - /* - if ((timing_advance>>10) & 1) //it is negative - timing_advance = timing_advance - (1<<11); - */ +void process_timing_advance_rar(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint16_t timing_advance) { ue->timing_advance = timing_advance*4; #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,ue->frame_rx, ue->timing_advance); + LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,proc->frame_rx, ue->timing_advance); #endif } @@ -392,11 +359,13 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance) } -uint8_t is_SR_TXOp(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) +uint8_t is_SR_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id) { + int subframe=proc->subframe_tx; + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for SR TXOp (sr_ConfigIndex %d)\n", - ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,ue->frame_tx,subframe, + ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,proc->frame_tx,subframe, ue->scheduling_request_config[eNB_id].sr_ConfigIndex); if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 4) { // 5 ms SR period @@ -406,13 +375,13 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) if (subframe==(ue->scheduling_request_config[eNB_id].sr_ConfigIndex-5)) return(1); } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 34) { // 20 ms SR period - if ((10*(ue->frame_tx&1)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15)) + if ((10*(proc->frame_tx&1)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15)) return(1); } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 74) { // 40 ms SR period - if ((10*(ue->frame_tx&3)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35)) + if ((10*(proc->frame_tx&3)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35)) return(1); } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 154) { // 80 ms SR period - if ((10*(ue->frame_tx&7)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75)) + if ((10*(proc->frame_tx&7)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75)) return(1); } @@ -420,8 +389,8 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe) } uint16_t get_n1_pucch(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, uint8_t eNB_id, - uint8_t subframe, uint8_t *b, uint8_t SR) { @@ -434,6 +403,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue, int sf; int M; // clear this, important for case where n1_pucch selection is not used + int subframe=proc->subframe_tx; ue->pucch_sel[subframe] = 0; @@ -451,10 +421,10 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue, #ifdef DEBUG_PHY_PROC if (bundling_flag==bundling) { - LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",ue->Mod_id,ue->frame_tx,subframe,SR, + LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR, ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } else { - LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",ue->Mod_id,ue->frame_tx,subframe,SR, + LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR, ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } @@ -479,7 +449,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue, subframe_offset = 4; } else { LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - ue->Mod_id,ue->frame_tx,subframe,frame_parms->tdd_config); + ue->Mod_id,proc->frame_tx,subframe,frame_parms->tdd_config); return(0); } @@ -589,858 +559,848 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue, } // switch tdd_config } - LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",ue->frame_tx); + LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",proc->frame_tx); return(-1); } #ifdef EMOS /* -void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) { + void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) { uint8_t harq_pid; if (next_slot%2==0) { - // get harq_pid from subframe relationship - harq_pid = subframe2harq_pid(&ue->frame_parms,ue->frame,(next_slot>>1)); - if (harq_pid==255) { - LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n", - 0,ue->frame); - return; - } + // get harq_pid from subframe relationship + harq_pid = subframe2harq_pid(&ue->frame_parms,ue->frame,(next_slot>>1)); + if (harq_pid==255) { + LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n", + 0,ue->frame); + return; + } - if (ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { - emos_dump_UE.uci_cnt[next_slot>>1] = 1; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch[eNB_id]->o,MAX_CQI_BITS*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch[eNB_id]->O; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch[eNB_id]->o_RI,2*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch[eNB_id]->O_RI; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch[eNB_id]->o_ACK,4*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK; - } - else { - emos_dump_UE.uci_cnt[next_slot>>1] = 0; - } + if (ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { + emos_dump_UE.uci_cnt[next_slot>>1] = 1; + memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch[eNB_id]->o,MAX_CQI_BITS*sizeof(char)); + emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch[eNB_id]->O; + memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch[eNB_id]->o_RI,2*sizeof(char)); + emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch[eNB_id]->O_RI; + memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch[eNB_id]->o_ACK,4*sizeof(char)); + emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK; + } + else { + emos_dump_UE.uci_cnt[next_slot>>1] = 0; + } + } } -} */ #endif -int dummy_tx_buffer[3840*4] __attribute__((aligned(16))); -PRACH_RESOURCES_t prach_resources_local; +void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc) { -void phy_procedures_UE_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) -{ + int aa; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + int k,l; + int nsymb; + int subframe_tx = proc->subframe_tx; + int frame_tx = proc->frame_tx; + int ulsch_start; + int overflow=0; - int i; - uint16_t first_rb, nb_rb; - uint8_t harq_pid; - unsigned int input_buffer_length; - unsigned int aa; + int dummy_tx_buffer[3840*4] __attribute__((aligned(16))); + + start_meas(&ue->ofdm_mod_stats); + nsymb = (frame_parms->Ncp == 0) ? 14 : 12; + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case + ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- + ue->hw_timing_advance- + ue->timing_advance- + ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); +#else //this is the normal case + ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance; +#endif //else EXMIMO + if ((frame_tx%100) == 0) + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n", + ue->Mod_id,frame_tx,subframe_tx, + ulsch_start, + ue->rx_offset, + ue->hw_timing_advance, + ue->timing_advance, + ue->N_TA_offset); + + + for (aa=0; aanb_antennas_tx; aa++) { + if (frame_parms->Ncp == 1) + PHY_ofdm_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + dummy_tx_buffer, +#else + &ue->common_vars.txdata[aa][ulsch_start], +#endif + frame_parms->ofdm_symbol_size, + nsymb, + frame_parms->nb_prefix_samples, + CYCLIC_PREFIX); + else + normal_prefix_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + dummy_tx_buffer, +#else + &ue->common_vars.txdata[aa][ulsch_start], +#endif + nsymb, + &ue->frame_parms); + + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + apply_7_5_kHz(ue,dummy_tx_buffer,0); + apply_7_5_kHz(ue,dummy_tx_buffer,1); +#else + apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],0); + apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],1); +#endif + + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + overflow = ulsch_start - 9*frame_parms->samples_per_tti; + + + for (k=ulsch_start,l=0; ksamples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) { + ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; + ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; + } + + for (k=0; kcommon_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; + ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; + } +#if defined(EXMIMO) + // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on + for (k=ulsch_start - (frame_parms->samples_per_tti>>1) ; kcommon_vars.txdata[aa][k+frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else if (k>(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) + ue->common_vars.txdata[aa][k-frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else + ue->common_vars.txdata[aa][k] &= 0xFFFEFFFE; + } +#endif +#endif + + } //nb_antennas_tx + + stop_meas(&ue->ofdm_mod_stats); + + + +} + +void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) { + + int frame_tx = proc->frame_tx; + int subframe_tx = proc->subframe_tx; + int prach_power; + PRACH_RESOURCES_t prach_resources_local; + + ue->generate_prach=0; + + if (ue->mac_enabled==0){ + ue->prach_resources[eNB_id] = &prach_resources_local; + prach_resources_local.ra_RNTI = 0xbeef; + prach_resources_local.ra_PreambleIndex = 0; + } + + if (ue->mac_enabled==1){ + // ask L2 for RACH transport + if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { + ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(ue->Mod_id, + ue->CC_id, + frame_tx, + eNB_id, + subframe_tx); + // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); + } + } + + if (ue->prach_resources[eNB_id]!=NULL) { + + ue->generate_prach=1; + ue->prach_cnt=0; +#ifdef SMBV + ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; +#endif +#ifdef OAI_EMU + ue->prach_PreambleIndex=ue->prach_resources[eNB_id]->ra_PreambleIndex; +#endif + + if (abstraction_flag == 0) { + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", + ue->Mod_id, + frame_tx, + subframe_tx, + ue->prach_resources[eNB_id]->ra_PreambleIndex, + ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, + ue->prach_resources[eNB_id]->ra_TDD_map_index, + ue->prach_resources[eNB_id]->ra_RNTI); + + if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) { + ue->tx_power_dBm = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id); + } + else { + ue->tx_power_dBm = ue->tx_power_max_dBm; + ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; + } + + ue->tx_total_RE = 96; + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + 6); +#else + ue->prach_vars[eNB_id]->amp = AMP; +#endif + if ((mode == calib_prach_tx) && (((proc->frame_tx&0xfffe)%100)==0)) + LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n", + ue->Mod_id, + proc->frame_rx, + proc->subframe_tx, + ue->tx_power_dBm, + ue->prach_vars[eNB_id]->amp); + + + // start_meas(&ue->tx_prach); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN); + prach_power = generate_prach(ue,eNB_id,subframe_tx,frame_tx); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT); + // stop_meas(&ue->tx_prach); + LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n", + ue->Mod_id, + get_PL(ue->Mod_id,ue->CC_id,eNB_id), + ue->tx_power_dBm, + dB_fixed(prach_power), + ue->prach_vars[eNB_id]->amp); + } else { + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.prach_flag=1; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.prach_id=ue->prach_resources[eNB_id]->ra_PreambleIndex; + if (ue->mac_enabled==1){ + mac_xface->Msg1_transmitted(ue->Mod_id, + ue->CC_id, + frame_tx, + eNB_id); + } + } + + LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n", + ue->Mod_id,frame_tx,subframe_tx,eNB_id, + ue->prach_resources[eNB_id]->ra_PreambleIndex, + ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id), + get_PL(ue->Mod_id,ue->CC_id,eNB_id)); + + } + + + // if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue + if (mode == calib_prach_tx) + ue->prach_resources[eNB_id]=NULL; + + LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n", + ue->Mod_id,frame_tx,subframe_tx,ue->generate_prach,ue->prach_cnt); + + ue->prach_cnt++; + + if (ue->prach_cnt==3) + ue->generate_prach=0; +} + +void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) { + + int harq_pid; + int frame_tx=proc->frame_tx; + int subframe_tx=proc->subframe_tx; + int Mod_id = ue->Mod_id; + int CC_id = ue->CC_id; uint8_t Msg3_flag=0; + uint8_t ack_status=0; + uint16_t first_rb, nb_rb; + unsigned int input_buffer_length; + int i; + int aa; + int tx_amp; + + // get harq_pid from subframe relationship + harq_pid = subframe2harq_pid(&ue->frame_parms, + frame_tx, + subframe_tx); + + + if (ue->mac_enabled == 1) { + if ((ue->ulsch_Msg3_active[eNB_id] == 1) && + (ue->ulsch_Msg3_frame[eNB_id] == frame_tx) && + (ue->ulsch_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3 + + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) + generate_ue_ulsch_params_from_rar(ue, + proc, + eNB_id); + + ue->ulsch[eNB_id]->power_offset = 14; + LOG_D(PHY,"[UE %d][RAPROC] Frame %d: Setting Msg3_flag in subframe %d, for harq_pid %d\n", + Mod_id, + frame_tx, + subframe_tx, + harq_pid); + Msg3_flag = 1; + } else { + + if (harq_pid==255) { + LOG_E(PHY,"[UE%d] Frame %d ulsch_decoding.c: FATAL ERROR: illegal harq_pid, returning\n", + Mod_id,frame_tx); + mac_xface->macphy_exit("Error in ulsch_decoding"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); + stop_meas(&ue->phy_proc_tx); + return; + } + + Msg3_flag=0; + } + } + + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { + + ue->generate_ul_signal[eNB_id] = 1; + + // deactivate service request + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; + + ack_status = get_ack(&ue->frame_parms, + ue->dlsch[eNB_id][0]->harq_ack, + subframe_tx, + ue->ulsch[eNB_id]->o_ACK); + + first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb; + nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; + + + + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY, + "[UE %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n", + Mod_id,harq_pid,frame_tx,subframe_tx, + first_rb,nb_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx, + (ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+ + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2+ + ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe_tx<<1])%12, + ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2, + ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe_tx<<1], + ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); +#endif + + if (ack_status > 0) { + LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating ACK (%d,%d) for %d bits on PUSCH\n", + Mod_id, + ue->ulsch[eNB_id]->rnti, + frame_tx,subframe_tx, + ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); + } + + + + + + if (Msg3_flag == 1) { + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",Mod_id,frame_tx, + subframe_tx, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx, + ue->prach_resources[eNB_id]->Msg3[0], + ue->prach_resources[eNB_id]->Msg3[1], + ue->prach_resources[eNB_id]->Msg3[2], + ue->prach_resources[eNB_id]->Msg3[3], + ue->prach_resources[eNB_id]->Msg3[4], + ue->prach_resources[eNB_id]->Msg3[5], + ue->prach_resources[eNB_id]->Msg3[6], + ue->prach_resources[eNB_id]->Msg3[7], + ue->prach_resources[eNB_id]->Msg3[8]); + + start_meas(&ue->ulsch_encoding_stats); + + if (abstraction_flag==0) { + if (ulsch_encoding(ue->prach_resources[eNB_id]->Msg3, + ue, + harq_pid, + eNB_id, + ue->transmission_mode[eNB_id],0,0)!=0) { + LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); + mac_xface->macphy_exit("Error in ulsch_coding"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); + stop_meas(&ue->phy_proc_tx); + return; + } + } + +#ifdef PHY_ABSTRACTION + else { + ulsch_encoding_emul(ue->prach_resources[eNB_id]->Msg3,ue,eNB_id,harq_pid,0); + } + +#endif + + stop_meas(&ue->ulsch_encoding_stats); + + if (ue->mac_enabled == 1) { + // signal MAC that Msg3 was sent + mac_xface->Msg3_transmitted(Mod_id, + CC_id, + frame_tx, + eNB_id); + } + } // Msg3_flag==1 + else { + input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8; + + if (ue->mac_enabled==1) { + // LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id); + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) { + //if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { + access_mode=SCHEDULED_ACCESS; + mac_xface->ue_get_sdu(Mod_id, + CC_id, + frame_tx, + subframe_tx, + eNB_id, + ulsch_input_buffer, + input_buffer_length, + &access_mode); + } + +#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_ULSCH + LOG_D(PHY,"[UE] Frame %d, subframe %d : ULSCH SDU (TX harq_pid %d) (%d bytes) : \n",frame_tx,subframe_tx,harq_pid, ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3); + + for (i=0; iulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++) + LOG_T(PHY,"%x.",ulsch_input_buffer[i]); + + LOG_T(PHY,"\n"); +#endif +#endif + } + else { + unsigned int taus(void); + + for (i=0; iulsch_encoding_stats); + + if (abstraction_flag==0) { + + if (ulsch_encoding(ulsch_input_buffer, + ue, + harq_pid, + eNB_id, + ue->transmission_mode[eNB_id],0, + 0)!=0) { // Nbundled, to be updated!!!! + LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); + stop_meas(&ue->phy_proc_tx); + return; + } + } + +#ifdef PHY_ABSTRACTION + else { + ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0); + } + +#endif + stop_meas(&ue->ulsch_encoding_stats); + } + + if (abstraction_flag == 0) { + if (ue->mac_enabled==1) { + pusch_power_cntl(ue,proc,eNB_id,1, abstraction_flag); + ue->tx_power_dBm = ue->ulsch[eNB_id]->Po_PUSCH; + } + else { + ue->tx_power_dBm = ue->tx_power_max_dBm; + } + ue->tx_total_RE = nb_rb*12; + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + tx_amp = get_tx_amp(ue->tx_power_dBm, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + nb_rb); +#else + tx_amp = AMP; +#endif + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n", + Mod_id,harq_pid,frame_tx,subframe_tx,ue->tx_power_dBm,ue->tx_power_max_dBm, tx_amp); + start_meas(&ue->ulsch_modulation_stats); + ulsch_modulation(ue->common_vars.txdataF, + tx_amp, + frame_tx, + subframe_tx, + &ue->frame_parms, + ue->ulsch[eNB_id]); + for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) + generate_drs_pusch(ue, + proc, + eNB_id, + tx_amp, + subframe_tx, + first_rb, + nb_rb, + aa); + + stop_meas(&ue->ulsch_modulation_stats); + } + + if (abstraction_flag==1) { + // clear SR + ue->sr[subframe_tx]=0; + } + } // subframe_scheduling_flag==1 +} + + +void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) { + + uint8_t pucch_ack_payload[2]; uint8_t n1_pucch; ANFBmode_t bundling_flag; PUCCH_FMT_t format; uint8_t SR_payload; - int32_t prach_power; - uint8_t nsymb; - LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; - uint8_t generate_ul_signal = 0; - uint8_t ack_status=0; - int8_t Po_PUCCH; - int32_t ulsch_start=0; -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - int overflow=0; - int k,l; -#endif - int slot_tx = ue->slot_tx; - int subframe_tx = ue->slot_tx>>1; - int frame_tx = ue->frame_tx; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int frame_tx=proc->frame_tx; + int subframe_tx=proc->subframe_tx; int Mod_id = ue->Mod_id; int CC_id = ue->CC_id; int tx_amp; + int8_t Po_PUCCH; + + bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; + + if ((frame_parms->frame_type==FDD) || + (bundling_flag==bundling) || + ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe_tx!=2)||(subframe_tx!=7)))) { + format = pucch_format1a; + LOG_D(PHY,"[UE] PUCCH 1a\n"); + } else { + format = pucch_format1b; + LOG_D(PHY,"[UE] PUCCH 1b\n"); + } + + // Check for SR and do ACK/NACK accordingly + if (is_SR_TXOp(ue,proc,eNB_id)==1) { + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n", + Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx); + + if (ue->mac_enabled==1) { + SR_payload = mac_xface->ue_get_SR(Mod_id, + CC_id, + frame_tx, + eNB_id, + ue->pdcch_vars[eNB_id]->crnti, + subframe_tx); // subframe used for meas gap + } + else { + SR_payload = 1; + } + + if (SR_payload>0) { + ue->generate_ul_signal[eNB_id] = 1; + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n", + Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx,SR_payload); + } else { + ue->sr[subframe_tx]=0; + } + } else { + SR_payload=0; + } + + if (get_ack(&ue->frame_parms, + ue->dlsch[eNB_id][0]->harq_ack, + subframe_tx,pucch_ack_payload) > 0) { + // we need to transmit ACK/NAK in this subframe + + ue->generate_ul_signal[eNB_id] = 1; + + n1_pucch = get_n1_pucch(ue, + proc, + eNB_id, + pucch_ack_payload, + SR_payload); + + if (ue->mac_enabled == 1) { + Po_PUCCH = pucch_power_cntl(ue,proc,eNB_id,format); + } + else { + Po_PUCCH = ue->tx_power_max_dBm; + } + ue->tx_power_dBm = Po_PUCCH; + ue->tx_total_RE = 12; + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + tx_amp = get_tx_amp(Po_PUCCH, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + 1); +#else + tx_amp = AMP; +#endif + + if (SR_payload>0) { + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b payload %d,%d (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n", + Mod_id, + ue->dlsch[eNB_id][0]->rnti, + frame_tx, subframe_tx, + pucch_ack_payload[0],pucch_ack_payload[1], + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, + Po_PUCCH, + tx_amp); + } else { + LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating PUCCH 1a/1b, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", + Mod_id, + ue->dlsch[eNB_id][0]->rnti, + frame_tx, subframe_tx, + n1_pucch,pucch_ack_payload[0],pucch_ack_payload[1],SR_payload, + Po_PUCCH, + tx_amp); + } + + if (abstraction_flag == 0) { + + generate_pucch(ue->common_vars.txdataF, + &ue->frame_parms, + ue->ncs_cell, + format, + &ue->pucch_config_dedicated[eNB_id], + n1_pucch, + 0, // n2_pucch + 1, // shortened format + pucch_ack_payload, + tx_amp, + subframe_tx); + + } else { +#ifdef PHY_ABSTRACTION + LOG_D(PHY,"Calling generate_pucch_emul ... (ACK %d %d, SR %d)\n",pucch_ack_payload[0],pucch_ack_payload[1],SR_payload); + generate_pucch_emul(ue, + proc, + format, + ue->frame_parms.pucch_config_common.nCS_AN, + pucch_ack_payload, + SR_payload, + subframe_tx); +#endif + } + } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC + + if (ue->mac_enabled == 1) { + Po_PUCCH = pucch_power_cntl(ue,proc,eNB_id,pucch_format1); + } + else { + Po_PUCCH = ue->tx_power_max_dBm; + } + ue->tx_power_dBm = Po_PUCCH; + ue->tx_total_RE = 12; + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + tx_amp = get_tx_amp(Po_PUCCH, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + 1); +#else + tx_amp = AMP; +#endif + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n", + Mod_id, + ue->dlsch[eNB_id][0]->rnti, + frame_tx, subframe_tx, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, + Po_PUCCH); + + if (abstraction_flag == 0) { + + generate_pucch(ue->common_vars.txdataF, + &ue->frame_parms, + ue->ncs_cell, + pucch_format1, + &ue->pucch_config_dedicated[eNB_id], + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, + 0, // n2_pucch + 1, // shortened format + pucch_ack_payload, // this is ignored anyway, we just need a pointer + tx_amp, + subframe_tx); + } else { + LOG_D(PHY,"Calling generate_pucch_emul ...\n"); + generate_pucch_emul(ue, + proc, + pucch_format1, + ue->frame_parms.pucch_config_common.nCS_AN, + pucch_ack_payload, + SR_payload); + + } + } // SR_Payload==1 +} + +void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) { + + + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + int32_t ulsch_start=0; + int subframe_tx = proc->subframe_tx; + int frame_tx = proc->frame_tx; + unsigned int aa; + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN); + ue->generate_ul_signal[eNB_id] = 0; + start_meas(&ue->phy_proc_tx); #ifdef EMOS //phy_procedures_emos_UE_TX(next_slot); #endif - if ((slot_tx%2)==0) { - ue->tx_power_dBm=-127; - - if (abstraction_flag==0) { - for (aa=0; aanb_antennas_tx; aa++) { - memset(&ue->common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti], - 0, - frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t)); - } + ue->tx_power_dBm=-127; + + if (abstraction_flag==0) { + for (aa=0; aanb_antennas_tx; aa++) { + memset(&ue->common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti], + 0, + frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t)); } + } + + if (ue->UE_mode[eNB_id] != PRACH) { - if (ue->UE_mode[eNB_id] != PRACH) { - /* - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: Generating SRS\n",Mod_id,ue->frame,slot_tx); - #endif - if (abstraction_flag == 0) { - #ifdef OFDMA_ULSCH - generate_srs_tx(ue,eNB_id,AMP,subframe_tx); - #else - generate_srs_tx(ue,eNB_id,AMP,subframe_tx); - #endif - } + ue_ulsch_uespec_procedures(ue,proc,eNB_id,abstraction_flag); - #ifdef PHY_ABSTRACTION - else { - generate_srs_tx_emul(ue,subframe_tx); - } - #endif - */ - // get harq_pid from subframe relationship - harq_pid = subframe2harq_pid(&ue->frame_parms, - frame_tx, - subframe_tx); - - - if (ue->mac_enabled == 1) { - if ((ue->ulsch_Msg3_active[eNB_id] == 1) && - (ue->ulsch_Msg3_frame[eNB_id] == frame_tx) && - (ue->ulsch_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3 - - ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - - if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) - generate_ue_ulsch_params_from_rar(ue, - eNB_id); - - ue->ulsch[eNB_id]->power_offset = 14; - LOG_D(PHY,"[UE %d][RAPROC] Frame %d: Setting Msg3_flag in subframe %d, for harq_pid %d\n", - Mod_id, - frame_tx, - subframe_tx, - harq_pid); - Msg3_flag = 1; - } else { - - if (harq_pid==255) { - LOG_E(PHY,"[UE%d] Frame %d ulsch_decoding.c: FATAL ERROR: illegal harq_pid, returning\n", - Mod_id,frame_tx); - mac_xface->macphy_exit("Error in ulsch_decoding"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&ue->phy_proc_tx); - return; - } - - Msg3_flag=0; - } - } - - if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { - - generate_ul_signal = 1; - - // deactivate service request - ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; - - ack_status = get_ack(&ue->frame_parms, - ue->dlsch[eNB_id][0]->harq_ack, - subframe_tx, - ue->ulsch[eNB_id]->o_ACK); - - first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb; - nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; - - - //frame_parms->pusch_config_c ommon.ul_ReferenceSignalsPUSCH.cyclicShift = 0; - - //frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[20] = 0; - - - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY, - "[UE %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n", - Mod_id,harq_pid,frame_tx,subframe_tx, - first_rb,nb_rb, - ue->ulsch[eNB_id]->harq_processes[harq_pid]->round, - ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs, - ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx, - (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+ - ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2+ - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx])%12, - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, - ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2, - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx], - ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], - ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); -#endif - - if (ack_status > 0) { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating ACK (%d,%d) for %d bits on PUSCH\n", - Mod_id, - ue->ulsch[eNB_id]->rnti, - frame_tx,subframe_tx, - ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], - ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); - } - - - - - - //#ifdef DEBUG_PHY_PROC - // debug_LOG_D(PHY,"[UE %d] Frame %d, Subframe %d ulsch harq_pid %d : O %d, O_ACK %d, O_RI %d, TBS %d\n",Mod_id,ue->frame,subframe_tx,harq_pid,ue->ulsch[eNB_id]->O,ue->ulsch[eNB_id]->O_ACK,ue->ulsch[eNB_id]->O_RI,ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS); - //#endif - if (Msg3_flag == 1) { - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d next slot %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",Mod_id,frame_tx, - subframe_tx, slot_tx, - ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb, - ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb, - ue->ulsch[eNB_id]->harq_processes[harq_pid]->round, - ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx, - ue->prach_resources[eNB_id]->Msg3[0], - ue->prach_resources[eNB_id]->Msg3[1], - ue->prach_resources[eNB_id]->Msg3[2], - ue->prach_resources[eNB_id]->Msg3[3], - ue->prach_resources[eNB_id]->Msg3[4], - ue->prach_resources[eNB_id]->Msg3[5], - ue->prach_resources[eNB_id]->Msg3[6], - ue->prach_resources[eNB_id]->Msg3[7], - ue->prach_resources[eNB_id]->Msg3[8]); - - start_meas(&ue->ulsch_encoding_stats); - - if (abstraction_flag==0) { - if (ulsch_encoding(ue->prach_resources[eNB_id]->Msg3, - ue, - harq_pid, - eNB_id, - ue->transmission_mode[eNB_id],0,0)!=0) { - LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); - mac_xface->macphy_exit("Error in ulsch_coding"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&ue->phy_proc_tx); - return; - } - } - -#ifdef PHY_ABSTRACTION - else { - ulsch_encoding_emul(ue->prach_resources[eNB_id]->Msg3,ue,eNB_id,harq_pid,0); - } - -#endif - stop_meas(&ue->ulsch_encoding_stats); - - if (ue->mac_enabled == 1) { - // signal MAC that Msg3 was sent - mac_xface->Msg3_transmitted(Mod_id, - CC_id, - frame_tx, - eNB_id); - } - } else { - input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8; - - if (ue->mac_enabled==1) { - // LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id); - if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) { - //if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { - access_mode=SCHEDULED_ACCESS; - mac_xface->ue_get_sdu(Mod_id, - CC_id, - frame_tx, - subframe_tx, - eNB_id, - ulsch_input_buffer, - input_buffer_length, - &access_mode); - - //} - /* - else { - // Get calibration information from TDD procedures - LOG_D(PHY,"[UE %d] Frame %d, subframe %d : ULSCH: Getting TDD Auto-Calibration information\n", - Mod_id,ue->frame,subframe_tx); - for (i=0;iulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3); - - for (i=0; iulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++) - LOG_T(PHY,"%x.",ulsch_input_buffer[i]); - - LOG_T(PHY,"\n"); -#endif -#endif - } - else { - // the following lines were necessary for the calibration in CROWN - /* - if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { - for (i=0;iulsch[eNB_id]->o ,0,MAX_CQI_BYTES*sizeof(uint8_t)); - memset(ue->ulsch[eNB_id]->o_RI ,0,2*sizeof(uint8_t)); - memset(ue->ulsch[eNB_id]->o_ACK,0,4*sizeof(uint8_t)); - for (i=0;iulsch_encoding_stats); - - if (abstraction_flag==0) { - /* - if (ue->frame%100==0) { - LOG_I(PHY,"Encoding ulsch\n"); - } - */ - if (ulsch_encoding(ulsch_input_buffer, - ue, - harq_pid, - eNB_id, - ue->transmission_mode[eNB_id],0, - 0)!=0) { // Nbundled, to be updated!!!! - LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&ue->phy_proc_tx); - return; - } - } - -#ifdef PHY_ABSTRACTION - else { - ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0); - } - -#endif - stop_meas(&ue->ulsch_encoding_stats); - } - - if (abstraction_flag == 0) { - if (ue->mac_enabled==1) { - pusch_power_cntl(ue,subframe_tx,eNB_id,1, abstraction_flag); - ue->tx_power_dBm = ue->ulsch[eNB_id]->Po_PUSCH; - } - else { - ue->tx_power_dBm = ue->tx_power_max_dBm; - } - ue->tx_total_RE = nb_rb*12; - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(ue->tx_power_dBm, - ue->tx_power_max_dBm, - ue->frame_parms.N_RB_UL, - nb_rb); -#else - tx_amp = AMP; -#endif - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n", - Mod_id,harq_pid,frame_tx,subframe_tx,ue->tx_power_dBm,ue->tx_power_max_dBm, tx_amp); - start_meas(&ue->ulsch_modulation_stats); - ulsch_modulation(ue->common_vars.txdataF, - tx_amp, - frame_tx, - subframe_tx, - &ue->frame_parms, - ue->ulsch[eNB_id]); - for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) - generate_drs_pusch(ue, - eNB_id, - tx_amp, - subframe_tx, - first_rb, - nb_rb, - aa); - - stop_meas(&ue->ulsch_modulation_stats); - } - - if (abstraction_flag==1) { - // clear SR - ue->sr[subframe_tx]=0; - } - } // ULSCH is active - -#ifdef PUCCH - else if (ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b - // debug_LOG_D(PHY,"[UE%d] Frame %d, subframe %d: Checking for PUCCH 1a/1b\n",Mod_id,frame_tx,subframe_tx); - bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; - - if ((frame_parms->frame_type==FDD) || - (bundling_flag==bundling) || - ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((slot_tx!=4)||(slot_tx!=14)))) { - format = pucch_format1a; - LOG_D(PHY,"[UE] PUCCH 1a\n"); - } else { - format = pucch_format1b; - LOG_D(PHY,"[UE] PUCCH 1b\n"); - } - - // Check for SR and do ACK/NACK accordingly - if (is_SR_TXOp(ue,eNB_id,subframe_tx)==1) { - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n", - Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx); - - if (ue->mac_enabled==1) { - SR_payload = mac_xface->ue_get_SR(Mod_id, - CC_id, - frame_tx, - eNB_id, - ue->pdcch_vars[eNB_id]->crnti, - subframe_tx); // subframe used for meas gap - } - else { - SR_payload = 1; - } - - if (SR_payload>0) { - generate_ul_signal = 1; - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n", - Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx,SR_payload); - } else { - ue->sr[subframe_tx]=0; - } - } else { - SR_payload=0; - } - - if (get_ack(&ue->frame_parms, - ue->dlsch[eNB_id][0]->harq_ack, - subframe_tx,pucch_ack_payload) > 0) { - // we need to transmit ACK/NAK in this subframe - - generate_ul_signal = 1; - - n1_pucch = get_n1_pucch(ue, - eNB_id, - subframe_tx, - pucch_ack_payload, - SR_payload); - - if (ue->mac_enabled == 1) { - Po_PUCCH = pucch_power_cntl(ue,subframe_tx,eNB_id,format); - } - else { - Po_PUCCH = ue->tx_power_max_dBm; - } - ue->tx_power_dBm = Po_PUCCH; - ue->tx_total_RE = 12; - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(Po_PUCCH, - ue->tx_power_max_dBm, - ue->frame_parms.N_RB_UL, - 1); -#else - tx_amp = AMP; -#endif - - if (SR_payload>0) { - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b payload %d,%d (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n", - Mod_id, - ue->dlsch[eNB_id][0]->rnti, - frame_tx, subframe_tx, - pucch_ack_payload[0],pucch_ack_payload[1], - ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, - Po_PUCCH, - tx_amp); - } else { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating PUCCH 1a/1b, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", - Mod_id, - ue->dlsch[eNB_id][0]->rnti, - frame_tx, subframe_tx, - n1_pucch,pucch_ack_payload[0],pucch_ack_payload[1],SR_payload, - Po_PUCCH, - tx_amp); - } - - if (abstraction_flag == 0) { - - generate_pucch(ue->common_vars.txdataF, - &ue->frame_parms, - ue->ncs_cell, - format, - &ue->pucch_config_dedicated[eNB_id], - n1_pucch, - 0, // n2_pucch - 1, // shortened format - pucch_ack_payload, - tx_amp, - subframe_tx); - - } else { -#ifdef PHY_ABSTRACTION - LOG_D(PHY,"Calling generate_pucch_emul ... (ACK %d %d, SR %d)\n",pucch_ack_payload[0],pucch_ack_payload[1],SR_payload); - generate_pucch_emul(ue, - format, - ue->frame_parms.pucch_config_common.nCS_AN, - pucch_ack_payload, - SR_payload, - subframe_tx); -#endif - } - } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC - - if (ue->mac_enabled == 1) { - Po_PUCCH = pucch_power_cntl(ue,subframe_tx,eNB_id,pucch_format1); - } - else { - Po_PUCCH = ue->tx_power_max_dBm; - } - ue->tx_power_dBm = Po_PUCCH; - ue->tx_total_RE = 12; - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(Po_PUCCH, - ue->tx_power_max_dBm, - ue->frame_parms.N_RB_UL, - 1); -#else - tx_amp = AMP; -#endif - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n", - Mod_id, - ue->dlsch[eNB_id][0]->rnti, - frame_tx, subframe_tx, - ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, - Po_PUCCH); - - if (abstraction_flag == 0) { - - generate_pucch(ue->common_vars.txdataF, - &ue->frame_parms, - ue->ncs_cell, - pucch_format1, - &ue->pucch_config_dedicated[eNB_id], - ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, - 0, // n2_pucch - 1, // shortened format - pucch_ack_payload, // this is ignored anyway, we just need a pointer - tx_amp, - subframe_tx); - } else { - LOG_D(PHY,"Calling generate_pucch_emul ...\n"); - generate_pucch_emul(ue, - pucch_format1, - ue->frame_parms.pucch_config_common.nCS_AN, - pucch_ack_payload, - SR_payload, - subframe_tx); - } - } - } - -#endif // PUCCH + } + + if (ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b + + } // UE_mode==PUSCH + + #ifdef CBA - - if ((ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag >= 1) && - (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == CBA_ACTIVE)) { - ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag=0; //-=1 - // ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE; - first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb; - nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; - //cba_mcs=ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs; - input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8; - access_mode=CBA_ACCESS; - - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: CBA num dci %d\n", - Mod_id,frame_tx,subframe_tx, - ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]); - - mac_xface->ue_get_sdu(Mod_id, - CC_id, - frame_tx, - subframe_tx, - eNB_id, - ulsch_input_buffer, - input_buffer_length, - &access_mode); - - ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]=0; - - if (access_mode > UNKNOWN_ACCESS) { - - if (abstraction_flag==0) { - if (ulsch_encoding(ulsch_input_buffer, - ue, - harq_pid, - eNB_id, - ue->transmission_mode[eNB_id],0, - 0)!=0) { // Nbundled, to be updated!!!! - LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); - return; - } - } - -#ifdef PHY_ABSTRACTION - else { - ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0); - } - -#endif - } else { - ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE; - //reset_cba_uci(ue->ulsch[eNB_id]->o); - LOG_N(PHY,"[UE %d] Frame %d, subframe %d: CBA transmission cancelled or postponed\n", - Mod_id, frame_tx,subframe_tx); - } + + if ((ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag >= 1) && + (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == CBA_ACTIVE)) { + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag=0; //-=1 + // ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE; + first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb; + nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; + //cba_mcs=ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs; + input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8; + access_mode=CBA_ACCESS; + + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: CBA num dci %d\n", + Mod_id,frame_tx,subframe_tx, + ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]); + + mac_xface->ue_get_sdu(Mod_id, + CC_id, + frame_tx, + subframe_tx, + eNB_id, + ulsch_input_buffer, + input_buffer_length, + &access_mode); + + ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]=0; + + if (access_mode > UNKNOWN_ACCESS) { + + if (abstraction_flag==0) { + if (ulsch_encoding(ulsch_input_buffer, + ue, + harq_pid, + eNB_id, + ue->transmission_mode[eNB_id],0, + 0)!=0) { // Nbundled, to be updated!!!! + LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); + return; + } } - + +#ifdef PHY_ABSTRACTION + else { + ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0); + } + +#endif + } else { + ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE; + //reset_cba_uci(ue->ulsch[eNB_id]->o); + LOG_N(PHY,"[UE %d] Frame %d, subframe %d: CBA transmission cancelled or postponed\n", + Mod_id, frame_tx,subframe_tx); + } + } + #endif // end CBA - if (abstraction_flag == 0) { - nsymb = (frame_parms->Ncp == 0) ? 14 : 12; - + + if (abstraction_flag == 0) { + + if (ue->generate_ul_signal[eNB_id] == 1 ) + ulsch_common_procedures(ue,proc); + else { // no uplink so clear signal buffer instead #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case - ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- - ue->hw_timing_advance- - ue->timing_advance- - ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); + ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- + ue->hw_timing_advance- + ue->timing_advance- + ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); #else //this is the normal case - ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance; + ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance; #endif //else EXMIMO - if ((frame_tx%100) == 0) - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n", - Mod_id,frame_tx,subframe_tx, - ulsch_start, - ue->rx_offset, - ue->hw_timing_advance, - ue->timing_advance, - ue->N_TA_offset); - - - if (generate_ul_signal == 1 ) { - - - - start_meas(&ue->ofdm_mod_stats); - - for (aa=0; aanb_antennas_tx; aa++) { - if (frame_parms->Ncp == 1) - PHY_ofdm_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - dummy_tx_buffer, -#else - &ue->common_vars.txdata[aa][ulsch_start], -#endif - frame_parms->ofdm_symbol_size, - nsymb, - frame_parms->nb_prefix_samples, - CYCLIC_PREFIX); - else - normal_prefix_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - dummy_tx_buffer, -#else - &ue->common_vars.txdata[aa][ulsch_start], -#endif - nsymb, - &ue->frame_parms); - - /* - if (subframe_tx == 8) { - printf("Symbol 0 %p (offset %d) base %p\n", - &ue->common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe], - nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe, - ue->common_vars.txdataF[0]); - write_output("txsigF8.m","txsF8", &ue->common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe], - ue->frame_parms.ofdm_symbol_size*nsymb,1,1); - write_output("txsig8.m","txs8", &ue->common_vars.txdata[0][ue->frame_parms.samples_per_tti*subframe], - ue->frame_parms.samples_per_tti,1,1); - } - */ -#ifndef OFDMA_ULSCH -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - apply_7_5_kHz(ue,dummy_tx_buffer,0); - apply_7_5_kHz(ue,dummy_tx_buffer,1); -#else - apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],0); - apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],1); -#endif - /* - if (subframe_tx == 8) { - write_output("txsig8_mod.m","txs8_mod", &ue->common_vars.txdata[0][ue->frame_parms.samples_per_tti*subframe], - ue->frame_parms.samples_per_tti,1,1); - } - */ -#endif - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - overflow = ulsch_start - 9*frame_parms->samples_per_tti; - - //if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow); - for (k=ulsch_start,l=0; ksamples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) { - ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; - ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; - } - - for (k=0; kcommon_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; - ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; - } -#if defined(EXMIMO) - // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on - for (k=ulsch_start - (frame_parms->samples_per_tti>>1) ; kcommon_vars.txdata[aa][k+frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else if (k>(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) - ue->common_vars.txdata[aa][k-frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else - ue->common_vars.txdata[aa][k] &= 0xFFFEFFFE; - } -#endif -#endif - - } //nb_antennas_tx - - stop_meas(&ue->ofdm_mod_stats); - } // generate_ul_signal == 1 - else { // no uplink so clear signal buffer instead - for (aa=0; aanb_antennas_tx; aa++) { - memset(&ue->common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2); - } - } + for (aa=0; aanb_antennas_tx; aa++) { + memset(&ue->common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2); } - } // mode != PRACH - - // }// slot_tx is even - // else { // slot_tx is odd, do the PRACH here - - if ((ue->UE_mode[eNB_id] == PRACH) && (ue->frame_parms.prach_config_common.prach_Config_enabled==1)) { - - // check if we have PRACH opportunity - if (is_prach_subframe(&ue->frame_parms,frame_tx,subframe_tx)) { - ue->generate_prach=0; - - if (ue->mac_enabled==1){ - // ask L2 for RACH transport - if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { - ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id, - CC_id, - frame_tx, - eNB_id, - subframe_tx); - // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); - } - } - - if (ue->prach_resources[eNB_id]!=NULL) { - - ue->generate_prach=1; - ue->prach_cnt=0; -#ifdef SMBV - ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; -#endif -#ifdef OAI_EMU - ue->prach_PreambleIndex=ue->prach_resources[eNB_id]->ra_PreambleIndex; -#endif - - if (abstraction_flag == 0) { - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", - Mod_id, - frame_tx, - subframe_tx, - ue->prach_resources[eNB_id]->ra_PreambleIndex, - ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, - ue->prach_resources[eNB_id]->ra_TDD_map_index, - ue->prach_resources[eNB_id]->ra_RNTI); - - if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) { - ue->tx_power_dBm = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id); - } - else { - ue->tx_power_dBm = ue->tx_power_max_dBm; - ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; - } - - ue->tx_total_RE = 96; - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm, - ue->tx_power_max_dBm, - ue->frame_parms.N_RB_UL, - 6); -#else - ue->prach_vars[eNB_id]->amp = AMP; -#endif - if ((mode == calib_prach_tx) && (((ue->frame_tx&0xfffe)%100)==0)) - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,ue->frame_rx,ue->slot_tx>>1,ue->tx_power_dBm, - ue->prach_vars[eNB_id]->amp); - - - // start_meas(&ue->tx_prach); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN); - prach_power = generate_prach(ue,eNB_id,subframe_tx,frame_tx); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT); - // stop_meas(&ue->tx_prach); - LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n", - Mod_id, - get_PL(Mod_id,CC_id,eNB_id), - ue->tx_power_dBm, - dB_fixed(prach_power), - ue->prach_vars[eNB_id]->amp); - } else { - UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1; - UE_transport_info[Mod_id][CC_id].cntl.prach_id=ue->prach_resources[eNB_id]->ra_PreambleIndex; - if (ue->mac_enabled==1){ - mac_xface->Msg1_transmitted(Mod_id, - CC_id, - frame_tx, - eNB_id); - } - } - - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n", - Mod_id,frame_tx,subframe_tx,eNB_id, - ue->prach_resources[eNB_id]->ra_PreambleIndex, - ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id), - get_PL(Mod_id,CC_id,eNB_id)); - - } - - } - // if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue - if (mode == calib_prach_tx) - ue->prach_resources[eNB_id]=NULL; - - LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n", - Mod_id,frame_tx,subframe_tx,ue->generate_prach,ue->prach_cnt); - - ue->prach_cnt++; - - if (ue->prach_cnt==3) - ue->generate_prach=0; - } // mode is PRACH - else { - ue->generate_prach=0; } - } // slot_tx is even + } // mode != PRACH + + + if ((ue->UE_mode[eNB_id] == PRACH) && + (ue->frame_parms.prach_config_common.prach_Config_enabled==1)) { + + // check if we have PRACH opportunity + if (is_prach_subframe(&ue->frame_parms,frame_tx,subframe_tx)) { + + ue_prach_procedures(ue,proc,eNB_id,abstraction_flag,mode); + } + } // mode is PRACH + else { + ue->generate_prach=0; + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); stop_meas(&ue->phy_proc_tx); } @@ -1449,37 +1409,31 @@ void phy_procedures_UE_S_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_f { int aa;//i,aa; LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; - + if (abstraction_flag==0) { - + for (aa=0; aanb_antennas_tx; aa++) { #if defined(EXMIMO) //this is the EXPRESS MIMO case int i; // set the whole tx buffer to RX for (i=0; isamples_per_tti; i++) - ue->common_vars.txdata[aa][i] = 0x00010001; - + ue->common_vars.txdata[aa][i] = 0x00010001; + #else //this is the normal case memset(&ue->common_vars.txdata[aa][0],0, - (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)*sizeof(int32_t)); + (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)*sizeof(int32_t)); #endif //else EXMIMO - + } } } -void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) +void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) { - + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; - // int aa; -#if defined(EXMIMO) && defined(DRIVER2013) - // exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr; - // int aa; -#endif - int slot_rx = ue->slot_rx; - int subframe_rx = slot_rx>>1; + int subframe_rx = proc->subframe_rx; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN); @@ -1489,25 +1443,25 @@ void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_ LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,ue->common_vars.rxdata); lte_ue_measurements(ue, - (subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME), - (slot_rx == 2) ? 1 : 0, - 0); + (subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME), + (subframe_rx == 1) ? 1 : 0, + 0); } else { lte_ue_measurements(ue, - 0, - 0, - 1); + 0, + 0, + 1); } } if (l==(6-ue->frame_parms.Ncp)) { - // make sure we have signal from PSS/SSS for N0 measurement + // make sure we have signal from PSS/SSS for N0 measurement VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_IN); ue_rrc_measurements(ue, - slot_rx, - abstraction_flag); + subframe_rx, + abstraction_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_OUT); if (abstraction_flag==1) @@ -1515,7 +1469,7 @@ void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_ } - if ((slot_rx==1) && (l==(4-frame_parms->Ncp))) { + if ((subframe_rx==0) && (l==(4-frame_parms->Ncp))) { // AGC @@ -1535,10 +1489,10 @@ void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_ if (abstraction_flag == 0) lte_adjust_synch(&ue->frame_parms, - ue, - eNB_id, - 0, - 16384); + ue, + eNB_id, + 0, + 16384); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); @@ -1557,14 +1511,14 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id) int Mod_id = ue->Mod_id; /* - if (last_slot<2) + if (last_slot<2) last_slot_emos = last_slot; - else if (last_slot>9) + else if (last_slot>9) last_slot_emos = last_slot - 8; - else { + else { LOG_E(PHY,"emos rx last_slot_emos %d, last_slot %d\n", last_slot_emos,last_slot); mac_xface->macphy_exit("should never happen"); - } + } */ #ifdef EMOS_CHANNEL @@ -1572,14 +1526,14 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id) if ((last_slot==10) || (last_slot==11)) { for (i=0; iframe_parms.nb_antennas_rx; i++) for (j=0; jframe_parms.nb_antennas_tx; j++) { - // first OFDM symbol with pilots - memcpy(&emos_dump_UE.channel[i][j][(last_slot%2)*2*ue->frame_parms.ofdm_symbol_size], - &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][0], - ue->frame_parms.ofdm_symbol_size*sizeof(int)); - // second OFDM symbol with pilots - memcpy(&emos_dump_UE.channel[i][j][((last_slot%2)*2+1)*ue->frame_parms.ofdm_symbol_size], - &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][(ue->frame_parms.Ncp == 0 ? 4 : 3)*ue->frame_parms.ofdm_symbol_size], - ue->frame_parms.ofdm_symbol_size*sizeof(int)); + // first OFDM symbol with pilots + memcpy(&emos_dump_UE.channel[i][j][(last_slot%2)*2*ue->frame_parms.ofdm_symbol_size], + &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][0], + ue->frame_parms.ofdm_symbol_size*sizeof(int)); + // second OFDM symbol with pilots + memcpy(&emos_dump_UE.channel[i][j][((last_slot%2)*2+1)*ue->frame_parms.ofdm_symbol_size], + &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][(ue->frame_parms.Ncp == 0 ? 4 : 3)*ue->frame_parms.ofdm_symbol_size], + ue->frame_parms.ofdm_symbol_size*sizeof(int)); } } @@ -1587,7 +1541,7 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id) if (last_slot==0) { emos_dump_UE.timestamp = rt_get_time_ns(); - emos_dump_UE.frame_rx = ue->frame_rx; + emos_dump_UE.frame_rx = proc->frame_rx; emos_dump_UE.UE_mode = ue->UE_mode[eNB_id]; emos_dump_UE.mimo_mode = ue->transmission_mode[eNB_id]; emos_dump_UE.freq_offset = ue->common_vars.freq_offset; @@ -1624,10 +1578,10 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id) bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE)); if (bytes!=sizeof(fifo_dump_emos_UE)) { - LOG_W(PHY,"[UE %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,ue->frame_rx, last_slot); + LOG_W(PHY,"[UE %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,proc->frame_rx, last_slot); } else { - if (ue->frame_rx%100==0) { - LOG_I(PHY,"[UE %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,ue->frame_rx, last_slot, bytes); + if (proc->frame_rx%100==0) { + LOG_I(PHY,"[UE %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,proc->frame_rx, last_slot, bytes); } } } @@ -1636,12 +1590,12 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id) #endif -void restart_phy(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag) +void restart_phy(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t eNB_id,uint8_t abstraction_flag) { // uint8_t last_slot; uint8_t i; - LOG_I(PHY,"[UE %d] frame %d, slot %d, restarting PHY!\n",ue->Mod_id,ue->frame_rx,ue->slot_rx); + LOG_I(PHY,"[UE %d] frame %d, slot %d, restarting PHY!\n",ue->Mod_id,proc->frame_rx,proc->subframe_rx); mac_xface->macphy_exit("restart_phy called"); // first_run = 1; @@ -1652,8 +1606,8 @@ void restart_phy(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag) ue->prach_resources[eNB_id]=NULL; } - ue->frame_rx = -1; - ue->frame_tx = -1; + proc->frame_rx = -1; + proc->frame_tx = -1; // ue->synch_wait_cnt=0; // ue->sched_cnt=-1; @@ -1694,7 +1648,7 @@ void restart_phy(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag) } -void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) +void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t abstraction_flag) { // int i; @@ -1705,8 +1659,9 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) uint8_t pbch_trials = 0; DevAssert(ue); - int slot_rx = ue->slot_rx; - int frame_rx = ue->frame_rx; + + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN); @@ -1720,12 +1675,12 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) //LOG_I(PHY,"[UE %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",ue->Mod_id,frame_rx,pbch_phase,ue->frame_parms.Nid_cell,eNB_id); if (abstraction_flag == 0) { pbch_tx_ant = rx_pbch(&ue->common_vars, - ue->pbch_vars[eNB_id], - &ue->frame_parms, - eNB_id, - ue->frame_parms.mode1_flag==1?SISO:ALAMOUTI, - ue->high_speed_flag, - pbch_phase); + ue->pbch_vars[eNB_id], + &ue->frame_parms, + eNB_id, + ue->frame_parms.mode1_flag==1?SISO:ALAMOUTI, + ue->high_speed_flag, + pbch_phase); @@ -1734,8 +1689,8 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) #ifdef PHY_ABSTRACTION else { pbch_tx_ant = rx_pbch_emul(ue, - eNB_id, - pbch_phase); + eNB_id, + pbch_phase); } #endif @@ -1778,76 +1733,49 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) if (first_run) { first_run = 0; - LOG_I(PHY,"[UE %d] frame %d, slot %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d).\n", - ue->Mod_id, - frame_rx, - slot_rx, - pbch_tx_ant, - frame_tx, - pbch_phase); - ue->frame_rx = (ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - ue->frame_tx = ue->frame_rx; - frame_rx = ue->frame_rx; - } else if (((frame_tx & 0x03FF) != (ue->frame_rx & 0x03FF))) { + LOG_I(PHY,"[UE %d] frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d).\n", + ue->Mod_id, + frame_rx, + subframe_rx, + pbch_tx_ant, + frame_tx, + pbch_phase); + proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); + proc->frame_tx = proc->frame_rx; + frame_rx = proc->frame_rx; + } else if (((frame_tx & 0x03FF) != (proc->frame_rx & 0x03FF))) { //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) { - LOG_D(PHY,"[UE %d] frame %d, slot %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%1024=%d, phase %d).\n", - ue->Mod_id, - ue->frame_rx, - slot_rx, - pbch_tx_ant, - frame_tx, - frame_rx & 0x03FF, - pbch_phase); + LOG_D(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%1024=%d, phase %d).\n", + ue->Mod_id, + proc->frame_rx, + subframe_rx, + pbch_tx_ant, + frame_tx, + frame_rx & 0x03FF, + pbch_phase); + + proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); + proc->frame_tx = proc->frame_rx; + frame_rx = proc->frame_rx; - ue->frame_rx = (ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - ue->frame_tx = ue->frame_rx; - frame_rx = ue->frame_rx; - /* - LOG_D(PHY,"[UE %d] frame %d, slot %d: PBCH PDU does not match, ignoring it (PBCH ant_tx=%d, frame_tx=%d).\n", - ue->Mod_id, - ue->frame, - slot_rx, - pbch_tx_ant, - frame_tx); - */ - //ue->pbch_vars[eNB_id]->pdu_errors_conseq = 21; // this will make it go out of sync - //ue->pbch_vars[eNB_id]->pdu_errors_conseq += 1; // this will make it go out of sync } #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] frame %d, slot %d, Received PBCH (MIB): mode1_flag %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n", - ue->Mod_id, - frame_rx, - slot_rx, - ue->frame_parms.mode1_flag, - pbch_tx_ant, - frame_tx, - ue->frame_parms.N_RB_DL, - ue->frame_parms.phich_config_common.phich_duration, - ue->frame_parms.phich_config_common.phich_resource); - /* - if (frame_rx%100 == 0) { - LOG_I(PHY,"[UE %d] frame %d, slot %d, PBCH: mode1_flag %d, tx_ant %d, frame_tx %d, phase %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6,Frequency offset %d Hz (%d)\n", - ue->Mod_id, - frame_rx, - slot_rx, - ue->frame_parms.mode1_flag, - pbch_tx_ant, - frame_tx, - pbch_phase, - ue->frame_parms.N_RB_DL, - ue->frame_parms.phich_config_common.phich_duration, - ue->frame_parms.phich_config_common.phich_resource, - ue->common_vars.freq_offset,openair_daq_vars.freq_offset); - //dump_frame_parms(&ue->frame_parms); - - } - */ + LOG_D(PHY,"[UE %d] frame %d, subframe %d, Received PBCH (MIB): mode1_flag %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n", + ue->Mod_id, + frame_rx, + subframe_rx, + ue->frame_parms.mode1_flag, + pbch_tx_ant, + frame_tx, + ue->frame_parms.N_RB_DL, + ue->frame_parms.phich_config_common.phich_duration, + ue->frame_parms.phich_config_common.phich_resource); #endif } else { LOG_E(PHY,"[UE %d] frame %d, slot %d, Error decoding PBCH!\n", - ue->Mod_id,frame_rx, slot_rx); + ue->Mod_id,frame_rx, subframe_rx); ue->pbch_vars[eNB_id]->pdu_errors_conseq++; ue->pbch_vars[eNB_id]->pdu_errors++; if (ue->mac_enabled == 1) { @@ -1868,24 +1796,20 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!\n", - ue->Mod_id,frame_rx, slot_rx, - ue->pbch_vars[eNB_id]->pdu_errors, - ue->pbch_vars[eNB_id]->pdu_errors_conseq); + ue->Mod_id,frame_rx, subframe_rx, + ue->pbch_vars[eNB_id]->pdu_errors, + ue->pbch_vars[eNB_id]->pdu_errors_conseq); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT); } -int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) +int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t abstraction_flag) { unsigned int dci_cnt=0, i; - //DCI_PDU *DCI_pdu; - //uint16_t ra_RNTI; - - int frame_rx = ue->frame_rx; - int slot_rx = ue->slot_rx; - int subframe_rx = slot_rx>>1; + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; #ifdef PHY_ABSTRACTION @@ -1902,29 +1826,29 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN); rx_pdcch(&ue->common_vars, - ue->pdcch_vars, - &ue->frame_parms, - subframe_rx, - eNB_id, - (ue->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - ue->high_speed_flag, - ue->is_secondary_ue); + ue->pdcch_vars, + &ue->frame_parms, + subframe_rx, + eNB_id, + (ue->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + ue->high_speed_flag, + ue->is_secondary_ue); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN); dci_cnt = dci_decoding_procedure(ue, - dci_alloc_rx, - (ue->UE_mode[eNB_id] < PUSCH)? 1 : 0, // if we're in PUSCH don't listen to common search space, - // later when we need paging or RA during connection, update this ... - eNB_id,subframe_rx); + dci_alloc_rx, + (ue->UE_mode[eNB_id] < PUSCH)? 1 : 0, // if we're in PUSCH don't listen to common search space, + // later when we need paging or RA during connection, update this ... + eNB_id,subframe_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT); //LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d PHICH RX\n",ue->Mod_id,frame_rx,subframe_rx); if (is_phich_subframe(&ue->frame_parms,subframe_rx)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_IN); - rx_phich(ue, - subframe_rx,eNB_id); + rx_phich(ue,proc, + subframe_rx,eNB_id); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_OUT); } } @@ -1933,11 +1857,11 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) else { for (i=0; iframe_parms.Nid_cell == ue->frame_parms.Nid_cell) - break; + if (PHY_vars_eNB_g[i][CC_id]->frame_parms.Nid_cell == ue->frame_parms.Nid_cell) + break; if (CC_id < MAX_NUM_CCs) - break; + break; } if (i==NB_eNB_INST) { @@ -1949,59 +1873,28 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) LOG_D(PHY,"Calling dci_decoding_proc_emul ...\n"); dci_cnt = dci_decoding_procedure_emul(ue->pdcch_vars, - PHY_vars_eNB_g[i][CC_id]->num_ue_spec_dci[subframe_rx&1], - PHY_vars_eNB_g[i][CC_id]->num_common_dci[subframe_rx&1], - PHY_vars_eNB_g[i][CC_id]->dci_alloc[subframe_rx&1], - dci_alloc_rx, - eNB_id); + PHY_vars_eNB_g[i][CC_id]->num_ue_spec_dci[subframe_rx&1], + PHY_vars_eNB_g[i][CC_id]->num_common_dci[subframe_rx&1], + PHY_vars_eNB_g[i][CC_id]->dci_alloc[subframe_rx&1], + dci_alloc_rx, + eNB_id); // printf("DCI: dci_cnt %d\n",dci_cnt); UE_id = (uint32_t)find_ue((int16_t)ue->pdcch_vars[eNB_id]->crnti,PHY_vars_eNB_g[i][CC_id]); if (UE_id>=0) { - // msg("Checking PHICH for UE %d (eNB %d)\n",UE_id,i); + // printf("Checking PHICH for UE %d (eNB %d)\n",UE_id,i); if (is_phich_subframe(&ue->frame_parms,subframe_rx)) { - harq_pid = phich_subframe_to_harq_pid(&ue->frame_parms,frame_rx,subframe_rx); + harq_pid = phich_subframe_to_harq_pid(&ue->frame_parms,frame_rx,subframe_rx); - if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) { - // ue->ulsch[eNB_id]->harq_processes[harq_pid]->phich_ACK=1; - ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; - ue->ulsch[eNB_id]->harq_processes[harq_pid]->status = IDLE; - ue->ulsch_Msg3_active[eNB_id] = 0; - ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; - LOG_D(PHY,"Msg3 inactive\n"); - /* Phich is not abstracted for the moment - if (PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->phich_ACK==0) { // NAK - if (ue->ulsch_Msg3_active[eNB_id] == 1) { - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received NAK\n", - ue->Mod_id, - frame_rx, - subframe_rx); - #endif - get_Msg3_alloc_ret(&ue->frame_parms, - subframe_rx, - frame_rx, - &ue->ulsch_Msg3_frame[eNB_id], - &ue->ulsch_Msg3_subframe[eNB_id]); - } - // PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - // PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Ndi = 0; - // PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; - } - else { - #ifdef DEBUG_PHY_PROC - if (ue->ulsch_Msg3_active[eNB_id] == 1) - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received ACK\n", - ue->Mod_id, - frame_rx, - subframe_rx); - #endif - PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; - PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status = IDLE; - // inform MAC? - ue->ulsch_Msg3_active[eNB_id] = 0; - } //phich_ACK */ - } // harq_pid is ACTIVE + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) { + // ue->ulsch[eNB_id]->harq_processes[harq_pid]->phich_ACK=1; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->status = IDLE; + ue->ulsch_Msg3_active[eNB_id] = 0; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; + LOG_D(PHY,"Msg3 inactive\n"); + + } // harq_pid is ACTIVE } // This is a PHICH subframe } // UE_id exists } @@ -2009,41 +1902,15 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) #endif //#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d, Mode %s: DCI found %i\n",ue->Mod_id,frame_rx,slot_rx,mode_string[ue->UE_mode[eNB_id]],dci_cnt); + LOG_D(PHY,"[UE %d] Frame %d, subframe %d, Mode %s: DCI found %i\n",ue->Mod_id,frame_rx,subframe_rx,mode_string[ue->UE_mode[eNB_id]],dci_cnt); //#endif ue->pdcch_vars[eNB_id]->dci_received += dci_cnt; - /* - #ifdef DEBUG_PHY_PROC - if (slot_rx==18) - debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: PDCCH: DCI errors %d, DCI received %d, DCI missed %d, DCI False Detection %d \n", - ue->Mod_id,frame_rx,slot_rx, - ue->pdcch_vars[eNB_id]->dci_errors, - ue->pdcch_vars[eNB_id]->dci_received, - ue->pdcch_vars[eNB_id]->dci_missed, - ue->pdcch_vars[eNB_id]->dci_false); - #endif - */ + #ifdef EMOS //emos_dump_UE.dci_cnt[subframe_rx] = dci_cnt; #endif - /* - #ifdef DIAG_PHY - //if (ue->UE_mode[eNB_id] == PUSCH) - if (dci_cnt > 1) { - LOG_D(PHY,"[UE %d][DIAG] frame %d, subframe %d: received %d>1 DCI!\n",ue->Mod_id,frame_rx,subframe_rx,dci_cnt); - ue->pdcch_vars[eNB_id]->dci_false++; - } - else if (dci_cnt==0) { - LOG_D(PHY,"[UE %d][DIAG] frame %d, subframe %d: received %d DCI!\n",ue->Mod_id,frame_rx,subframe_rx,dci_cnt); - ue->pdcch_vars[eNB_id]->dci_missed++; - } - #endif - */ - - // dci_cnt = 0; - // ra_RNTI = (ue->prach_resources[eNB_id]) ? ue->prach_resources[eNB_id]->ra_RNTI : 0; for (i=0; iUE_mode[eNB_id] != PRACH) && - // (dci_alloc_rx[i].rnti != 0x1234) && - if ((ue->UE_mode[eNB_id]>PRACH) && (dci_alloc_rx[i].rnti == ue->pdcch_vars[eNB_id]->crnti) && (dci_alloc_rx[i].format != format0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][DCI][PDSCH %x] frame %d, subframe %d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d\n", - ue->Mod_id,dci_alloc_rx[i].rnti, - frame_rx,subframe_rx, - dci_alloc_rx[i].format, - ue->pdcch_vars[eNB_id]->num_pdcch_symbols, - ue->pdcch_vars[eNB_id]->nCCE[subframe_rx], - get_nCCE(3,&ue->frame_parms,get_mi(&ue->frame_parms,0))); + ue->Mod_id,dci_alloc_rx[i].rnti, + frame_rx,subframe_rx, + dci_alloc_rx[i].format, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->pdcch_vars[eNB_id]->nCCE[subframe_rx], + get_nCCE(3,&ue->frame_parms,get_mi(&ue->frame_parms,0))); #endif -#ifdef DIAG_PHY - - if (!(((subframe_rx == 7) && (dci_alloc_rx[i].format == format1E_2A_M10PRB)) || - ((subframe_rx == 7) && (dci_alloc_rx[i].format == format1)))) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format); - ue->pdcch_vars[eNB_id]->dci_errors++; - ue->pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - -#endif + // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); if ((ue->UE_mode[eNB_id] > PRACH) && @@ -2100,86 +1953,61 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) 0, P_RNTI)==0)) { -#ifdef DIAG_PHY - - if (ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs != (((frame_rx%1024)%28))) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: wrong mcs!\n",ue->Mod_id,frame_rx,subframe_rx, - ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs); - dump_dci(&ue->frame_parms,(void *)&dci_alloc_rx[i]); - } - -#endif - - - ue->dlsch_received[eNB_id]++; + ue->dlsch_received[eNB_id]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format); - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",ue->Mod_id,subframe_rx,slot_rx,ue->dlsch[eNB_id][0]->active); + LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d=> %d\n",ue->Mod_id,subframe_rx,ue->dlsch[eNB_id][0]->active); #endif - // we received a CRNTI, so we're in PUSCH - if (ue->UE_mode[eNB_id] != PUSCH) { + // we received a CRNTI, so we're in PUSCH + if (ue->UE_mode[eNB_id] != PUSCH) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",ue->Mod_id,frame_rx,subframe_rx,ue->pdcch_vars[eNB_id]->crnti); + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",ue->Mod_id,frame_rx,subframe_rx,ue->pdcch_vars[eNB_id]->crnti); #endif - //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - ue->UE_mode[eNB_id] = PUSCH; - //mac_xface->macphy_exit("Connected. Exiting\n"); - } + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + ue->UE_mode[eNB_id] = PUSCH; + //mac_xface->macphy_exit("Connected. Exiting\n"); + } } else { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Problem in DCI!\n",ue->Mod_id,frame_rx,subframe_rx); - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Problem in DCI!\n",ue->Mod_id,frame_rx,subframe_rx); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); } } else if ((dci_alloc_rx[i].rnti == SI_RNTI) && - ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { + ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); - /* - if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - */ #endif -#ifdef DIAG_PHY - if ((subframe_rx != 5)) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received SI_RNTI!\n",ue->Mod_id,frame_rx,subframe_rx); - ue->pdcch_vars[eNB_id]->dci_errors++; - ue->pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - -#endif if (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, - (void *)&dci_alloc_rx[i].dci_pdu, - SI_RNTI, - dci_alloc_rx[i].format, - &ue->dlsch_SI[eNB_id], - &ue->frame_parms, - ue->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI)==0) { + (void *)&dci_alloc_rx[i].dci_pdu, + SI_RNTI, + dci_alloc_rx[i].format, + &ue->dlsch_SI[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI)==0) { - ue->dlsch_SI_received[eNB_id]++; + ue->dlsch_SI_received[eNB_id]++; LOG_D(PHY,"[UE %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C"); - //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); } } else if ((ue->prach_resources[eNB_id]) && - (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) && - (dci_alloc_rx[i].format == format1A)) { + (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) && + (dci_alloc_rx[i].format == format1A)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i); @@ -2188,57 +2016,32 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); //mac_xface->macphy_exit("so far so good...\n"); #endif -#ifdef DIAG_PHY - if (subframe_rx != 9) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received RA_RNTI!\n",ue->Mod_id,frame_rx,subframe_rx); - ue->pdcch_vars[eNB_id]->dci_errors++; - ue->pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - -#endif if (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, - (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu, - ue->prach_resources[eNB_id]->ra_RNTI, - format1A, - &ue->dlsch_ra[eNB_id], - &ue->frame_parms, - ue->pdsch_config_dedicated, - SI_RNTI, - ue->prach_resources[eNB_id]->ra_RNTI, - P_RNTI)==0) { + (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu, + ue->prach_resources[eNB_id]->ra_RNTI, + format1A, + &ue->dlsch_ra[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, + SI_RNTI, + ue->prach_resources[eNB_id]->ra_RNTI, + P_RNTI)==0) { - ue->dlsch_ra_received[eNB_id]++; + ue->dlsch_ra_received[eNB_id]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n", - ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]); + LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n", + ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]); #endif } } else if( (dci_alloc_rx[i].rnti == ue->pdcch_vars[eNB_id]->crnti) && - (dci_alloc_rx[i].format == format0)) { + (dci_alloc_rx[i].format == format0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n", - ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); - /* - if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - */ -#endif -#ifdef DIAG_PHY - - if (subframe_rx != 9) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format 0!\n",ue->Mod_id,frame_rx,subframe_rx); - ue->pdcch_vars[eNB_id]->dci_errors++; - ue->pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - + ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); #endif ue->ulsch_no_allocation_counter[eNB_id] = 0; @@ -2250,6 +2053,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) subframe_rx, format0, ue, + proc, SI_RNTI, 0, P_RNTI, @@ -2258,34 +2062,22 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) 0)==0)) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); + LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); #endif } } else if( (dci_alloc_rx[i].rnti == ue->ulsch[eNB_id]->cba_rnti[0]) && - (dci_alloc_rx[i].format == format0)) { + (dci_alloc_rx[i].format == format0)) { // UE could belong to more than one CBA group // ue->Mod_id%ue->ulsch[eNB_id]->num_active_cba_groups] #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found cba rnti %x, format 0, dci_cnt %d\n", - ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); + ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); /* - if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + if (((frame_rx%100) == 0) || (frame_rx < 20)) + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); */ #endif - /* - #ifdef DIAG_PHY - if (subframe_rx != 8) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received CBA RNTI Format 0!\n", - ue->Mod_id,frame_rx,subframe_rx); - ue->pdcch_vars[eNB_id]->dci_errors++; - ue->pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - #endif - */ ue->ulsch_no_allocation_counter[eNB_id] = 0; //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); @@ -2296,6 +2088,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) subframe_rx, format0, ue, + proc, SI_RNTI, 0, P_RNTI, @@ -2304,49 +2097,31 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag) 0)==0)) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); + LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); #endif - ue->ulsch[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++; + ue->ulsch[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++; } } else { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti, - ue->pdcch_vars[eNB_id]->crnti, - ue->ulsch[eNB_id]->cba_rnti[0], - dci_alloc_rx[i].format); + ue->pdcch_vars[eNB_id]->crnti, + ue->ulsch[eNB_id]->cba_rnti[0], + dci_alloc_rx[i].format); // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); -#endif -#ifdef DIAG_PHY - ue->pdcch_vars[eNB_id]->dci_errors++; - ue->pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); #endif } } -/* - if ((frame_rx > 1000) && ((frame_rx&1)==0) && (subframe_rx == 5)) { - write_output("rxsig0.m","rxs0", ue->common_vars.rxdata[0],10*ue->frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],ue->frame_parms.ofdm_symbol_size*2*((ue->frame_parms.Ncp==0)?14:12),2,1); - write_output("H00.m","h00",&(ue->common_vars.dl_ch_estimates[0][0][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1); - write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",ue->pdcch_vars[eNB_id]->rxdataF_ext[0],3*12*ue->frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",ue->pdcch_vars[eNB_id]->rxdataF_comp[0],4*12*ue->frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_llr.m","pdcch_llr",ue->pdcch_vars[eNB_id]->llr,2400,1,4); - mac_xface->macphy_exit("debug exit"); - } -*/ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(0); } -int phy_procedures_UE_RX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, - relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) -{ +int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, + relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) { uint16_t l,m,n_symb; // int eNB_id = 0, @@ -2354,1080 +2129,1005 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag uint8_t harq_pid = -1; int timing_advance; uint8_t pilot1,pilot2,pilot3; -#ifndef DLSCH_THREAD uint8_t i_mod = 0; int eNB_id_i = 1; uint8_t dual_stream_UE = 0; -#endif + uint8_t *rar; int pmch_flag=0; uint8_t sync_area=255; int pmch_mcs=-1; uint8_t mcch_active=0; - int frame_rx = ue->frame_rx; - int slot_rx = ue->slot_rx; - int subframe_rx = slot_rx>>1; + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; int subframe_prev = (subframe_rx+9)%10; int CC_id = ue->CC_id; + int slot; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN); start_meas(&ue->phy_proc_rx); + + for (slot=0;slot<2;slot++) { + #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX(%d)\n", - (r_type == multicast_relay) ? "RN/UE" : "UE", - ue->Mod_id,frame_rx, subframe_rx, slot_rx); + LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX (%d)\n", + (r_type == multicast_relay) ? "RN/UE" : "UE", + ue->Mod_id,frame_rx, subframe_rx,slot); #endif #ifdef EMOS - - if ((slot_rx == 0)) { - if (frame_rx%1024 == 0) - openair_daq_vars.use_ia_receiver = 0; - else - openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3; - - LOG_D(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n", - frame_rx, - openair_daq_vars.use_ia_receiver, - ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs, - ue->bitrate[eNB_id]); - } - -#endif - - if (ue->frame_parms.Ncp == 0) { // normal prefix - pilot1 = 4; - pilot2 = 7; - pilot3 = 11; - } else { // extended prefix - pilot1 = 3; - pilot2 = 6; - pilot3 = 9; - } - - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { - if ((slot_rx%2)==0) - n_symb = 5;//3; - else - n_symb = 0; - } else { - /* - if (is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms)) { - if ((slot_rx%2)==0) { - n_symb=2; - pmch_flag=1; - } + + if (subframe_rx == 0) { + if (frame_rx%1024 == 0) + openair_daq_vars.use_ia_receiver = 0; else - n_symb=0; - } - else*/ - n_symb = ue->frame_parms.symbols_per_tti/2; - } + openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3; - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // This is normal processing (i.e. not MBSFN) - // RX processing of symbols in slot_rx - - - - for (l=0; lofdm_demod_stats); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); - - slot_fep(ue, - l, - slot_rx, - ue->rx_offset, - 0, - 0); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); - stop_meas(&ue->ofdm_demod_stats); - } - - //if (subframe_select(&ue->frame_parms,subframe_rx) == SF_DL) - ue_measurement_procedures(l,ue,eNB_id,abstraction_flag,mode); - - - if ((slot_rx==1) && (l==4-ue->frame_parms.Ncp)) { - - /* - ue->ulsch_no_allocation_counter[eNB_id]++; - - if (ue->ulsch_no_allocation_counter[eNB_id] == 10) { - #ifdef DEBUG_PHY_PROC - msg("[UE %d] no_allocation : setting mode to PRACH\n",ue->Mod_id); - #endif - ue->UE_mode[eNB_id] = PRACH; - ue->pdcch_vars[eNB_id]->crnti = 0x1234; - } - */ - - ue_pbch_procedures(eNB_id,ue,abstraction_flag); - - /* - if (ue->UE_mode[eNB_id] == RA_RESPONSE) { - ue->Msg3_timer[eNB_id]--; - msg("[UE RAR] frame %d: Msg3_timer %d\n",frame_rx,ue->Msg3_timer); - - if (ue->Msg3_timer[eNB_id] == 0) { - LOG_D(PHY,"[UE %d] Frame %d: Msg3_timer = 0 : setting mode to PRACH\n",ue->Mod_id,frame_rx); - // I guess here we also need to tell the RRC - ue->UE_mode[eNB_id] = PRACH; - ue->pdcch_vars[eNB_id]->crnti = 0x1234; - } - } - */ - } - -#ifdef DLSCH_THREAD - if (ue->dlsch[eNB_id][0]->active == 1) { - // activate thread since Chest is now done for slot before slot_rx - if (l==0) { - LOG_I(PHY,"frame %d, slot_rx %d: Calling rx_pdsch_thread for harq_pid %d\n",frame_rx,slot_rx, ue->dlsch[eNB_id][0]->current_harq_pid); - - if (pthread_mutex_lock (&rx_pdsch_mutex) != 0) { // Signal MAC_PHY Scheduler - LOG_E(PHY,"[UE %d] ERROR pthread_mutex_lock\n",ue->Mod_id); // lock before accessing shared resource - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - } else { - rx_pdsch_instance_cnt++; - (slot_rx == 0) ? (rx_pdsch_slot = 19) : (rx_pdsch_slot = (slot_rx-1)); - pthread_mutex_unlock (&rx_pdsch_mutex); - - if (rx_pdsch_instance_cnt == 0) { - if (pthread_cond_signal(&rx_pdsch_cond) != 0) { - LOG_E(PHY,"[UE %d] ERROR pthread_cond_signal for rx_pdsch_cond\n",ue->Mod_id); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - } - } else { - LOG_W(PHY,"[UE %d] Frame=%d, Slot=%d, RX_PDSCH thread for rx_pdsch_thread busy!!!\n",ue->Mod_id,frame_rx,slot_rx); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - } - } - - // trigger DLSCH decoding thread - if ((slot_rx%2)==1) // odd slots - ue->dlsch[eNB_id][0]->active = 0; - } + LOG_D(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n", + frame_rx, + openair_daq_vars.use_ia_receiver, + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs, + ue->bitrate[eNB_id]); } #endif - // process last DLSCH symbols + invoke decoding - if (((slot_rx%2)==0) && (l==0)) { - // Regular PDSCH - LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",ue->Mod_id,subframe_prev,ue->dlsch[eNB_id][0]->active); + if (ue->frame_parms.Ncp == 0) { // normal prefix + pilot1 = 4; + pilot2 = 7; + pilot3 = 11; + } else { // extended prefix + pilot1 = 3; + pilot2 = 6; + pilot3 = 9; + } - if (ue->dlsch[eNB_id][0]->active == 1) { -#ifndef DLSCH_THREAD //USER_MODE - harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; - LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",ue->Mod_id,subframe_prev,harq_pid); + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { + if (slot==0) + n_symb = 5;//3; + else + n_symb = 0; + } else { + n_symb = ue->frame_parms.symbols_per_tti/2; + } + + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // This is normal processing (i.e. not MBSFN) + // RX processing of symbols in slot - if ((ue->transmission_mode[eNB_id] == 5) && - (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (ue->use_ia_receiver ==1)) { - dual_stream_UE = 1; - eNB_id_i = ue->n_connected_eNB; - i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; + - if (frame_rx%100==0) { - LOG_I(PHY,"using IA receiver\n"); - } - } else { - dual_stream_UE = 0; - eNB_id_i = eNB_id+1; - i_mod = 0; - } + for (l=0; lofdm_demod_stats); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); - // process symbols 10,11,12 and trigger DLSCH decoding - if (abstraction_flag == 0) { + slot_fep(ue, + l, + (subframe_rx<<1)+slot, + ue->rx_offset, + 0, + 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); + stop_meas(&ue->ofdm_demod_stats); + } - start_meas(&ue->dlsch_llr_stats); + ue_measurement_procedures(l,ue,proc,eNB_id,abstraction_flag,mode); - for (m=pilot3; mframe_parms.symbols_per_tti; m++) { + if ((slot==1) && (l==4-ue->frame_parms.Ncp)) { - rx_pdsch(ue, - PDSCH, - eNB_id, - eNB_id_i, - subframe_prev, // subframe - m, // symbol - 0, // first_symbol_flag - dual_stream_UE, - i_mod, - ue->dlsch[eNB_id][0]->current_harq_pid); - } + ue_pbch_procedures(eNB_id,ue,proc,abstraction_flag); - stop_meas(&ue->dlsch_llr_stats); - } + } + + // process last DLSCH symbols + invoke decoding + if ((slot==0) && + (l==0)) { + // Regular PDSCH + LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",ue->Mod_id,subframe_prev,ue->dlsch[eNB_id][0]->active); - ue->dlsch[eNB_id][0]->active = 0; + + if (ue->dlsch[eNB_id][0]->active == 1) { - //#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n", - ue->Mod_id, - ue->dlsch[eNB_id][0]->rnti, - harq_pid, - (subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev); - //#endif + harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; + LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",ue->Mod_id,subframe_prev,harq_pid); - if (ue->dlsch[eNB_id][0]) { - if (abstraction_flag == 0) { - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, - ue->pdcch_vars[eNB_id]->num_pdcch_symbols, - frame_rx,subframe_prev); - start_meas(&ue->dlsch_unscrambling_stats); - dlsch_unscrambling(&ue->frame_parms, - 0, - ue->dlsch[0][0], - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G, - ue->pdsch_vars[eNB_id]->llr[0], - 0, - subframe_prev<<1); - stop_meas(&ue->dlsch_unscrambling_stats); + if ((ue->transmission_mode[eNB_id] == 5) && + (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && + (ue->use_ia_receiver ==1)) { + dual_stream_UE = 1; + eNB_id_i = ue->n_connected_eNB; + i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; - start_meas(&ue->dlsch_decoding_stats); - ret = dlsch_decoding(ue, - ue->pdsch_vars[eNB_id]->llr[0], - &ue->frame_parms, - ue->dlsch[eNB_id][0], - ue->dlsch[eNB_id][0]->harq_processes[harq_pid], - subframe_prev, - harq_pid, - 1,ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb>10 ? 1 : 0); - stop_meas(&ue->dlsch_decoding_stats); - } + if (frame_rx%100==0) { + LOG_I(PHY,"using IA receiver\n"); + } + } else { + dual_stream_UE = 0; + eNB_id_i = eNB_id+1; + i_mod = 0; + } + + // process symbols 10,11,12 and trigger DLSCH decoding + if (abstraction_flag == 0) { - else { - LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); + start_meas(&ue->dlsch_llr_stats); + + for (m=pilot3; mframe_parms.symbols_per_tti; m++) { + + rx_pdsch(ue, + PDSCH, + eNB_id, + eNB_id_i, + subframe_prev, // subframe + m, // symbol + 0, // first_symbol_flag + dual_stream_UE, + i_mod, + ue->dlsch[eNB_id][0]->current_harq_pid); + } + + stop_meas(&ue->dlsch_llr_stats); + } + + ue->dlsch[eNB_id][0]->active = 0; + + + + //#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n", + ue->Mod_id, + ue->dlsch[eNB_id][0]->rnti, + harq_pid, + (subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev); + //#endif + + if (ue->dlsch[eNB_id][0]) { + if (abstraction_flag == 0) { + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + frame_rx,subframe_prev); + start_meas(&ue->dlsch_unscrambling_stats); + dlsch_unscrambling(&ue->frame_parms, + 0, + ue->dlsch[0][0], + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G, + ue->pdsch_vars[eNB_id]->llr[0], + 0, + subframe_prev<<1); + stop_meas(&ue->dlsch_unscrambling_stats); + + start_meas(&ue->dlsch_decoding_stats); + ret = dlsch_decoding(ue, + ue->pdsch_vars[eNB_id]->llr[0], + &ue->frame_parms, + ue->dlsch[eNB_id][0], + ue->dlsch[eNB_id][0]->harq_processes[harq_pid], + subframe_prev, + harq_pid, + 1,ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb>10 ? 1 : 0); + stop_meas(&ue->dlsch_decoding_stats); + } + + else { + LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); #ifdef PHY_ABSTRACTION - ret = dlsch_decoding_emul(ue, - subframe_prev, - 2, - eNB_id); + ret = dlsch_decoding_emul(ue, + subframe_prev, + 2, + eNB_id); #endif - } + } - if (ret == (1+ue->dlsch[eNB_id][0]->max_turbo_iterations)) { - ue->dlsch_errors[eNB_id]++; + if (ret == (1+ue->dlsch[eNB_id][0]->max_turbo_iterations)) { + ue->dlsch_errors[eNB_id]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n", - ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, - harq_pid,frame_rx,subframe_prev, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); -/* - if (abstraction_flag ==0 ) - dump_dlsch(ue,eNB_id,subframe_prev,harq_pid); - mac_xface->macphy_exit(""); -*/ + LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n", + ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, + harq_pid,frame_rx,subframe_prev, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); + #endif - } else { - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n", - ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, - harq_pid,frame_rx,subframe_prev,slot_rx, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); + } else { + LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n", + ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, + harq_pid,frame_rx,subframe_prev,slot, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); #ifdef DEBUG_PHY_PROC #ifdef DEBUG_DLSCH - int j; - LOG_D(PHY,"dlsch harq_pid %d (rx): \n",ue->dlsch[eNB_id][0]->current_harq_pid); + int j; + LOG_D(PHY,"dlsch harq_pid %d (rx): \n",ue->dlsch[eNB_id][0]->current_harq_pid); - for (j=0; jdlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b[j]); + for (j=0; jdlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b[j]); - LOG_T(PHY,"\n"); + LOG_T(PHY,"\n"); #endif #endif - if (ue->mac_enabled == 1) { - mac_xface->ue_send_sdu(ue->Mod_id, - CC_id, - frame_rx, - ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b, - ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3, - eNB_id); + + if (ue->mac_enabled == 1) { + mac_xface->ue_send_sdu(ue->Mod_id, + CC_id, + frame_rx, + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b, + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3, + eNB_id); + } + ue->total_TBS[eNB_id] = ue->total_TBS[eNB_id] + + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS; + ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] + + ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS; } - ue->total_TBS[eNB_id] = ue->total_TBS[eNB_id] + - ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS; - ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] + - ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS; - } - } - + } + #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", - ue->Mod_id, - ue->dlsch[eNB_id][0]->rnti,harq_pid, - frame_rx,subframe_prev,ret, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, - ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); + LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", + ue->Mod_id, + ue->dlsch[eNB_id][0]->rnti,harq_pid, + frame_rx,subframe_prev,ret, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx, + ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS); - if (frame_rx%100==0) { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", - ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, - frame_rx,subframe_prev, - ue->dlsch_errors[eNB_id], - ue->dlsch_received[eNB_id], - ue->dlsch_fer[eNB_id], - ue->measurements.wideband_cqi_tot[eNB_id]); - } - -#endif -#endif //DLSCH_THREAD - } else { - // printf("PDSCH inactive in subframe %d\n",subframe_rx-1); - ue->dlsch[eNB_id][0]->harq_ack[subframe_prev].send_harq_status = 0; - } - - // SI_DLSCH - if (ue->dlsch_SI[eNB_id]->active == 1) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev); -#endif - - // process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding - if (abstraction_flag==0) { - start_meas(&ue->dlsch_llr_stats); - - for (m=pilot3; mframe_parms.symbols_per_tti; m++) { -#ifdef DEBUG_PHY_PROC - - LOG_D(PHY,"[UE %d] Frame %d, slot %d: DLSCH (SI) demod between pilot 3 and 4 (2nd slot), m %d\n", - ue->Mod_id,frame_rx,slot_rx,m); - -#endif - rx_pdsch(ue, - SI_PDSCH, - eNB_id, - eNB_id+1, - subframe_prev, // subframe, - m, - 0, - 0, - ue->is_secondary_ue, - ue->dlsch_SI[eNB_id]->current_harq_pid); - } - - stop_meas(&ue->dlsch_llr_stats); - } - - // write_output("dlsch_ra_llr.m","llr",pdsch_vars_ra[eNB_id]->llr[0],40,1,0); - - ue->dlsch_SI[eNB_id]->active = 0; - - if (frame_rx < ue->dlsch_SI_errors[eNB_id]) - ue->dlsch_SI_errors[eNB_id]=0; - - if (ue->dlsch_SI[eNB_id]) { - - if (abstraction_flag==0) { - - // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - ue->dlsch_SI[eNB_id]->harq_processes[0]->G = - get_G(&ue->frame_parms, - ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, - 2, - 1, - ue->pdcch_vars[eNB_id]->num_pdcch_symbols, - frame_rx,subframe_prev); - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, - ue->dlsch_SI[eNB_id]->harq_processes[0]->G, - ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, - ue->pdcch_vars[eNB_id]->num_pdcch_symbols); -#endif - - - dlsch_unscrambling(&ue->frame_parms, - 0, - ue->dlsch_SI[eNB_id], - ue->dlsch_SI[eNB_id]->harq_processes[0]->G, - ue->pdsch_vars_SI[eNB_id]->llr[0], - 0, - subframe_prev<<1); - - ret = dlsch_decoding(ue, - ue->pdsch_vars_SI[eNB_id]->llr[0], - &ue->frame_parms, - ue->dlsch_SI[eNB_id], - ue->dlsch_SI[eNB_id]->harq_processes[0], - subframe_prev, - ue->dlsch_SI[eNB_id]->current_harq_pid, - 0,0); - -#ifdef DEBUG_PHY_PROC - - for (int i=0; i<11; i++) - LOG_D(PHY,"dlsch_output_buffer[%d]=%x\n",i,ue->dlsch_SI[eNB_id]->harq_processes[0]->c[0][i]); + if (frame_rx%100==0) { + LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", + ue->Mod_id,ue->dlsch[eNB_id][0]->rnti, + frame_rx,subframe_prev, + ue->dlsch_errors[eNB_id], + ue->dlsch_received[eNB_id], + ue->dlsch_fer[eNB_id], + ue->measurements.wideband_cqi_tot[eNB_id]); + } #endif - } + } else { + // printf("PDSCH inactive in subframe %d\n",subframe_rx-1); + ue->dlsch[eNB_id][0]->harq_ack[subframe_prev].send_harq_status = 0; + } + + + // SI_DLSCH + if (ue->dlsch_SI[eNB_id]->active == 1) { +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev); +#endif + + // process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding + if (abstraction_flag==0) { + start_meas(&ue->dlsch_llr_stats); + + for (m=pilot3; mframe_parms.symbols_per_tti; m++) { +#ifdef DEBUG_PHY_PROC + + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: DLSCH (SI) demod between pilot 3 and 4 (2nd slot), m %d\n", + ue->Mod_id,frame_rx,subframe_rx,m); + +#endif + rx_pdsch(ue, + SI_PDSCH, + eNB_id, + eNB_id+1, + subframe_prev, // subframe, + m, + 0, + 0, + ue->is_secondary_ue, + ue->dlsch_SI[eNB_id]->current_harq_pid); + } + + stop_meas(&ue->dlsch_llr_stats); + } + + // write_output("dlsch_ra_llr.m","llr",pdsch_vars_ra[eNB_id]->llr[0],40,1,0); + + ue->dlsch_SI[eNB_id]->active = 0; + + if (frame_rx < ue->dlsch_SI_errors[eNB_id]) + ue->dlsch_SI_errors[eNB_id]=0; + + if (ue->dlsch_SI[eNB_id]) { + + if (abstraction_flag==0) { + + // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + ue->dlsch_SI[eNB_id]->harq_processes[0]->G = + get_G(&ue->frame_parms, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, + 2, + 1, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + frame_rx,subframe_prev); + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->G, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols); +#endif + + + dlsch_unscrambling(&ue->frame_parms, + 0, + ue->dlsch_SI[eNB_id], + ue->dlsch_SI[eNB_id]->harq_processes[0]->G, + ue->pdsch_vars_SI[eNB_id]->llr[0], + 0, + subframe_prev<<1); + + ret = dlsch_decoding(ue, + ue->pdsch_vars_SI[eNB_id]->llr[0], + &ue->frame_parms, + ue->dlsch_SI[eNB_id], + ue->dlsch_SI[eNB_id]->harq_processes[0], + subframe_prev, + ue->dlsch_SI[eNB_id]->current_harq_pid, + 0,0); + +#ifdef DEBUG_PHY_PROC + + for (int i=0; i<11; i++) + LOG_D(PHY,"dlsch_output_buffer[%d]=%x\n",i,ue->dlsch_SI[eNB_id]->harq_processes[0]->c[0][i]); + +#endif + + + + + + #ifdef PHY_ABSTRACTION - else { - LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); - ret = dlsch_decoding_emul(ue, - subframe_prev, - 0, - eNB_id); - } + else { + LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); + ret = dlsch_decoding_emul(ue, + subframe_prev, + 0, + eNB_id); + } + +#endif + + + + + + if (ret == (1+ue->dlsch_SI[eNB_id]->max_turbo_iterations)) { + ue->dlsch_SI_errors[eNB_id]++; +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", + ue->Mod_id, + frame_rx, + subframe_prev, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, + ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); +#endif + + // dump_dlsch_SI(ue,eNB_id,subframe_prev); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + stop_meas(&ue->phy_proc_rx); + return(-1); + } else { + + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", + ue->Mod_id,frame_rx,subframe_prev, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, + ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); +#endif + + if (ue->mac_enabled == 1) { + mac_xface->ue_decode_si(ue->Mod_id, + CC_id, + frame_rx, + eNB_id, + ue->dlsch_SI[eNB_id]->harq_processes[0]->b, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); + } + } + } + } + } + + if (ue->dlsch_ra[eNB_id]->active == 1) { +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: DLSCH (RA) demod symbols 10,11,12\n",ue->Mod_id,frame_rx,subframe_rx); +#endif + + // process symbols 10,11,12 and trigger DLSCH decoding + if (abstraction_flag==0) { + start_meas(&ue->dlsch_llr_stats); + + for (m=pilot3; mframe_parms.symbols_per_tti; m++) + rx_pdsch(ue, + RA_PDSCH, + eNB_id, + eNB_id+1, + subframe_prev, // subframe, + m, // symbol + 0, // first_symbol_flag + 0, + ue->is_secondary_ue, + ue->dlsch_ra[eNB_id]->current_harq_pid); + } + + stop_meas(&ue->dlsch_llr_stats); + + ue->dlsch_ra[eNB_id]->active = 0; + + if (frame_rx < ue->dlsch_ra_errors[eNB_id]) + ue->dlsch_ra_errors[eNB_id]=0; + + if (ue->prach_resources[eNB_id]!=NULL) + ue->dlsch_ra[eNB_id]->rnti = ue->prach_resources[eNB_id]->ra_RNTI; + else { + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",ue->Mod_id,frame_rx,subframe_prev); + mac_xface->macphy_exit("prach_resources is NULL"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + stop_meas(&ue->phy_proc_rx); + return 0; + } + + if (abstraction_flag==0) { + ue->dlsch_ra[eNB_id]->harq_processes[0]->G = get_G(&ue->frame_parms, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even, + 2, + 1, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + frame_rx, + subframe_prev); + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[UE] decoding RA (subframe %d): G %d,rnti %x\n" ,subframe_prev, + ue->dlsch_ra[eNB_id]->harq_processes[0]->G, + ue->dlsch_ra[eNB_id]->rnti); +#endif + + dlsch_unscrambling(&ue->frame_parms, + 0, + ue->dlsch_ra[eNB_id], + ue->dlsch_ra[eNB_id]->harq_processes[0]->G, + ue->pdsch_vars_ra[eNB_id]->llr[0], + 0, + subframe_prev<<1); + + ret = dlsch_decoding(ue, + ue->pdsch_vars_ra[eNB_id]->llr[0], + &ue->frame_parms, + ue->dlsch_ra[eNB_id], + ue->dlsch_ra[eNB_id]->harq_processes[0], + subframe_prev, // subframe + ue->dlsch_ra[eNB_id]->current_harq_pid, + 0,0); + } + +#ifdef PHY_ABSTRACTION + else { + LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); + ret = dlsch_decoding_emul(ue, + subframe_prev, + 1, + eNB_id); + } #endif - if (ret == (1+ue->dlsch_SI[eNB_id]->max_turbo_iterations)) { - ue->dlsch_SI_errors[eNB_id]++; + + + if (ret == (1+ue->dlsch_ra[eNB_id]->max_turbo_iterations)) { + ue->dlsch_ra_errors[eNB_id]++; + LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received RA in error\n",ue->Mod_id,frame_rx,subframe_prev); + + // dump_dlsch_ra(ue,eNB_id,subframe_prev); exit(-1); + + // oai_exit=1; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + stop_meas(&ue->phy_proc_rx); + return(-1); + + } else { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", + LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Received RAR mode %d\n", ue->Mod_id, frame_rx, - subframe_prev, - ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, - ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, - ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx, - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); -#endif - - // dump_dlsch_SI(ue,eNB_id,subframe_prev); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&ue->phy_proc_rx); - return(-1); - } else { - - -#ifdef DEBUG_PHY_PROC - //if ((frame_rx % 100) == 0) - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", - ue->Mod_id,frame_rx,subframe_prev, - ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS, - ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, - ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx, - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); + subframe_prev, ue->UE_mode[eNB_id]); #endif if (ue->mac_enabled == 1) { - /* - printf("\n\n"); - for (i=0;idlsch_SI[eNB_id]->harq_processes[0]->TBS>>3;i++) - printf("%02x ",ue->dlsch_SI[eNB_id]->harq_processes[0]->b[i]); - printf("\n"); - */ - mac_xface->ue_decode_si(ue->Mod_id, - CC_id, - frame_rx, - eNB_id, - ue->dlsch_SI[eNB_id]->harq_processes[0]->b, - ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); + if ((ue->UE_mode[eNB_id] != PUSCH) && (ue->prach_resources[eNB_id]->Msg3!=NULL)) { + LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n", + ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0), + subframe_prev, + ue->prach_resources[eNB_id]->ra_PreambleIndex); + + timing_advance = mac_xface->ue_process_rar(ue->Mod_id, + CC_id, + frame_rx-((subframe_prev==0) ? 1 : 0), + ue->dlsch_ra[eNB_id]->harq_processes[0]->b, + &ue->pdcch_vars[eNB_id]->crnti, + ue->prach_resources[eNB_id]->ra_PreambleIndex); + + + if (timing_advance!=0xffff) { + + LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Got rnti %x and timing advance %d from RAR\n", + ue->Mod_id, + frame_rx-((subframe_prev==9) ? 1 : 0), + subframe_prev, + ue->pdcch_vars[eNB_id]->crnti, + timing_advance); + + //timing_advance = 0; + process_timing_advance_rar(ue,proc,timing_advance); + + if (mode!=debug_prach) { + ue->ulsch_Msg3_active[eNB_id]=1; + get_Msg3_alloc(&ue->frame_parms, + subframe_prev, + frame_rx-((subframe_prev==9) ? 1 : 0), + &ue->ulsch_Msg3_frame[eNB_id], + &ue->ulsch_Msg3_subframe[eNB_id]); + + LOG_D(PHY,"[UE %d][RAPROC] Got Msg3_alloc Frame %d subframe %d: Msg3_frame %d, Msg3_subframe %d\n", + ue->Mod_id, + frame_rx-((subframe_prev==9) ? 1 : 0), + subframe_prev, + ue->ulsch_Msg3_frame[eNB_id], + ue->ulsch_Msg3_subframe[eNB_id]); + harq_pid = subframe2harq_pid(&ue->frame_parms, + ue->ulsch_Msg3_frame[eNB_id], + ue->ulsch_Msg3_subframe[eNB_id]); + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; + + ue->UE_mode[eNB_id] = RA_RESPONSE; + // ue->Msg3_timer[eNB_id] = 10; + ue->ulsch[eNB_id]->power_offset = 6; + ue->ulsch_no_allocation_counter[eNB_id] = 0; + } + } else { // PRACH preamble doesn't match RAR + LOG_W(PHY,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n", + ue->Mod_id, + ue->prach_resources[eNB_id]->ra_PreambleIndex); + } + } // mode != PUSCH } - } - } - - /* - #ifdef DEBUG_PHY_PROC - debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: dlsch_decoding (SI) ret %d (%d errors)\n", - ue->Mod_id,frame_rx,slot_rx,ret,ue->dlsch_SI_errors[eNB_id]); - #endif - */ - } - - - if (ue->dlsch_ra[eNB_id]->active == 1) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: DLSCH (RA) demod symbols 10,11,12\n",ue->Mod_id,frame_rx,slot_rx); -#endif - - // process symbols 10,11,12 and trigger DLSCH decoding - if (abstraction_flag==0) { - start_meas(&ue->dlsch_llr_stats); - - for (m=pilot3; mframe_parms.symbols_per_tti; m++) - rx_pdsch(ue, - RA_PDSCH, - eNB_id, - eNB_id+1, - subframe_prev, // subframe, - m, // symbol - 0, // first_symbol_flag - 0, - ue->is_secondary_ue, - ue->dlsch_ra[eNB_id]->current_harq_pid); - } - - stop_meas(&ue->dlsch_llr_stats); - - ue->dlsch_ra[eNB_id]->active = 0; - - if (frame_rx < ue->dlsch_ra_errors[eNB_id]) - ue->dlsch_ra_errors[eNB_id]=0; - - if (ue->prach_resources[eNB_id]!=NULL) - ue->dlsch_ra[eNB_id]->rnti = ue->prach_resources[eNB_id]->ra_RNTI; - else { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",ue->Mod_id,frame_rx,subframe_prev); - mac_xface->macphy_exit("prach_resources is NULL"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&ue->phy_proc_rx); - return 0; - } - - if (abstraction_flag==0) { - ue->dlsch_ra[eNB_id]->harq_processes[0]->G = get_G(&ue->frame_parms, - ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, - ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even, - 2, - 1, - ue->pdcch_vars[eNB_id]->num_pdcch_symbols, - frame_rx, - subframe_prev); - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE] decoding RA (subframe %d): G %d,rnti %x\n" ,subframe_prev, - ue->dlsch_ra[eNB_id]->harq_processes[0]->G, - ue->dlsch_ra[eNB_id]->rnti); -#endif - - dlsch_unscrambling(&ue->frame_parms, - 0, - ue->dlsch_ra[eNB_id], - ue->dlsch_ra[eNB_id]->harq_processes[0]->G, - ue->pdsch_vars_ra[eNB_id]->llr[0], - 0, - subframe_prev<<1); - - ret = dlsch_decoding(ue, - ue->pdsch_vars_ra[eNB_id]->llr[0], - &ue->frame_parms, - ue->dlsch_ra[eNB_id], - ue->dlsch_ra[eNB_id]->harq_processes[0], - subframe_prev, // subframe - ue->dlsch_ra[eNB_id]->current_harq_pid, - 0,0); - } - -#ifdef PHY_ABSTRACTION - else { - LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); - ret = dlsch_decoding_emul(ue, - subframe_prev, - 1, - eNB_id); - } - -#endif - - if (ret == (1+ue->dlsch_ra[eNB_id]->max_turbo_iterations)) { - ue->dlsch_ra_errors[eNB_id]++; - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received RA in error\n",ue->Mod_id,frame_rx,subframe_prev); - - // dump_dlsch_ra(ue,eNB_id,subframe_prev); exit(-1); - - // oai_exit=1; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&ue->phy_proc_rx); - return(-1); - - } else { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Received RAR mode %d\n", - ue->Mod_id, - frame_rx, - subframe_prev, ue->UE_mode[eNB_id]); -#endif - - if (ue->mac_enabled == 1) { - if ((ue->UE_mode[eNB_id] != PUSCH) && (ue->prach_resources[eNB_id]->Msg3!=NULL)) { - LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n", - ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0), - subframe_prev, - ue->prach_resources[eNB_id]->ra_PreambleIndex); - - timing_advance = mac_xface->ue_process_rar(ue->Mod_id, - CC_id, - frame_rx-((subframe_prev==0) ? 1 : 0), - ue->dlsch_ra[eNB_id]->harq_processes[0]->b, - &ue->pdcch_vars[eNB_id]->crnti, - ue->prach_resources[eNB_id]->ra_PreambleIndex); - - - if (timing_advance!=0xffff) { - - LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Got rnti %x and timing advance %d from RAR\n", - ue->Mod_id, - frame_rx-((subframe_prev==9) ? 1 : 0), - subframe_prev, - ue->pdcch_vars[eNB_id]->crnti, - timing_advance); - - //timing_advance = 0; - process_timing_advance_rar(ue,timing_advance); - - if (mode!=debug_prach) { - ue->ulsch_Msg3_active[eNB_id]=1; - get_Msg3_alloc(&ue->frame_parms, - subframe_prev, - frame_rx-((subframe_prev==9) ? 1 : 0), - &ue->ulsch_Msg3_frame[eNB_id], - &ue->ulsch_Msg3_subframe[eNB_id]); - - LOG_D(PHY,"[UE %d][RAPROC] Got Msg3_alloc Frame %d subframe %d: Msg3_frame %d, Msg3_subframe %d\n", - ue->Mod_id, - frame_rx-((subframe_prev==9) ? 1 : 0), - subframe_prev, - ue->ulsch_Msg3_frame[eNB_id], - ue->ulsch_Msg3_subframe[eNB_id]); - harq_pid = subframe2harq_pid(&ue->frame_parms, - ue->ulsch_Msg3_frame[eNB_id], - ue->ulsch_Msg3_subframe[eNB_id]); - ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; - - ue->UE_mode[eNB_id] = RA_RESPONSE; - // ue->Msg3_timer[eNB_id] = 10; - ue->ulsch[eNB_id]->power_offset = 6; - ue->ulsch_no_allocation_counter[eNB_id] = 0; - } - } else { // PRACH preamble doesn't match RAR - LOG_W(PHY,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n", - ue->Mod_id, - ue->prach_resources[eNB_id]->ra_PreambleIndex); - } - } // mode != PUSCH - } else { rar = ue->dlsch_ra[eNB_id]->harq_processes[0]->b+1; timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); //timing_advance = ue->dlsch_ra[eNB_id]->harq_processes[0]->b[0]; - process_timing_advance_rar(ue,timing_advance); + process_timing_advance_rar(ue,proc,timing_advance); } - } //ret <= MAX_ITERATIONS + } //ret <= MAX_ITERATIONS + } // dlsch_ra[eNB_id]->active == 1 + } + - /* - #ifdef DEBUG_PHY_PROC - debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: dlsch_decoding (RA) ret %d (%d errors)\n", - ue->Mod_id,frame_rx,slot_rx,ret,ue->dlsch_ra_errors[eNB_id]); - #endif - */ - } // dlsch_ra[eNB_id]->active == 1 - - } - - - if ((((slot_rx%2)==0) && ((l==pilot1))) || - ((pmch_flag==1)&&(l==1))) { + if (((slot==0) && ((l==pilot1))) || + ((pmch_flag==1)&&(l==1))) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,slot_rx,eNB_id); + LOG_D(PHY,"[UE %d] Frame %d, slot %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,slot,eNB_id); #endif - // rt_printk("[PDCCH] Frame %d, slot %d, start %llu\n",frame_rx,slot_rx,rt_get_time_ns()); - if (ue_pdcch_procedures(eNB_id,ue,abstraction_flag) == -1) { + // rt_printk("[PDCCH] Frame %d, slot %d, start %llu\n",frame_rx,slot_rx,rt_get_time_ns()); + if (ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { #ifdef DEBUG_PHY_PROC - LOG_E(PHY,"[UE %d] Frame %d, slot %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,slot_rx); + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,subframe_rx); #endif return(-1); - } + } - // rt_printk("[PDCCH] Frame %d, slot %d, stop %llu\n",frame_rx,slot_rx,rt_get_time_ns()); + // rt_printk("[PDCCH] Frame %d, slot %d, stop %llu\n",frame_rx,slot_rx,rt_get_time_ns()); #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"num_pdcch_symbols %d\n",ue->pdcch_vars[eNB_id]->num_pdcch_symbols); + LOG_D(PHY,"num_pdcch_symbols %d\n",ue->pdcch_vars[eNB_id]->num_pdcch_symbols); #endif + } + + if (abstraction_flag==0) { + + if ((slot==1) && + (l==0)) { + start_meas(&ue->dlsch_llr_stats); + + for (m=ue->pdcch_vars[eNB_id]->num_pdcch_symbols; + mdlsch[eNB_id][0]->active == 1) { + harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; + LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",ue->Mod_id,subframe_rx,subframe_rx,harq_pid); + + if ((ue->transmission_mode[eNB_id] == 5) && + (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && + (ue->use_ia_receiver ==1)) { + dual_stream_UE = 1; + eNB_id_i = ue->n_connected_eNB; + i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; + } else { + dual_stream_UE = 0; + eNB_id_i = eNB_id+1; + i_mod = 0; + } + + // process DLSCH received in first slot + + + + rx_pdsch(ue, + PDSCH, + eNB_id, + eNB_id_i, + subframe_rx, // subframe, + m, + (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag + dual_stream_UE, + i_mod, + ue->dlsch[eNB_id][0]->current_harq_pid); + } // CRNTI active + + + + if (ue->dlsch_SI[eNB_id]->active == 1) { + // process SI DLSCH in first slot + rx_pdsch(ue, + SI_PDSCH, + eNB_id, + eNB_id+1, + subframe_rx, // subframe, + m, + (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag + 0, + ue->is_secondary_ue, + ue->dlsch_SI[eNB_id]->current_harq_pid); + } // SI active + + if (ue->dlsch_ra[eNB_id]->active == 1) { + rx_pdsch(ue, + RA_PDSCH, + eNB_id, + eNB_id+1, + subframe_rx, // subframe, + m, + (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, + 0, + ue->is_secondary_ue, + ue->dlsch_ra[eNB_id]->current_harq_pid); + } // RA active + } // loop from first dlsch symbol to end of slot + + stop_meas(&ue->dlsch_llr_stats); + } // 2nd quarter + + + if ((slot==1) && (l==pilot1)) { + start_meas(&ue->dlsch_llr_stats); + + for (m=pilot2; mdlsch[eNB_id][0]->active == 1) { + harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; + + if ((ue->transmission_mode[eNB_id] == 5) && + (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && + (ue->use_ia_receiver ==1)) { + dual_stream_UE = 1; + eNB_id_i = ue->n_connected_eNB; + i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; + } else { + dual_stream_UE = 0; + eNB_id_i = eNB_id+1; + i_mod = 0; + } + + rx_pdsch(ue, + PDSCH, + eNB_id, + eNB_id_i, + subframe_rx, // subframe, + m, + 0, + dual_stream_UE, + i_mod, + ue->dlsch[eNB_id][0]->current_harq_pid); + } // CRNTI active + + + + if(ue->dlsch_SI[eNB_id]->active == 1) { + rx_pdsch(ue, + SI_PDSCH, + eNB_id, + eNB_id+1, + subframe_rx, // subframe, + m, + 0, // first_symbol_flag + 0, + ue->is_secondary_ue, + ue->dlsch_SI[eNB_id]->current_harq_pid); + } // SI active + + if (ue->dlsch_ra[eNB_id]->active == 1) { + rx_pdsch(ue, + RA_PDSCH, + eNB_id, + eNB_id+1, + subframe_rx, // subframe, + m, + 0, // first_symbol_flag + 0, + ue->is_secondary_ue, + ue->dlsch_ra[eNB_id]->current_harq_pid); + } // RA active + + } // loop over 3rd quarter + + stop_meas(&ue->dlsch_llr_stats); + } // 3rd quarter of subframe + } // abstraction_flag==0 + }// l loop + + // calculate some statistics + if ((subframe_rx==9) && + (slot==1)) { + if (frame_rx % 10 == 0) { + if ((ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]) != 0) + ue->dlsch_fer[eNB_id] = (100*(ue->dlsch_errors[eNB_id] - ue->dlsch_errors_last[eNB_id]))/(ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]); + + ue->dlsch_errors_last[eNB_id] = ue->dlsch_errors[eNB_id]; + ue->dlsch_received_last[eNB_id] = ue->dlsch_received[eNB_id]; + } + + ue->bitrate[eNB_id] = (ue->total_TBS[eNB_id] - ue->total_TBS_last[eNB_id])*100; + ue->total_TBS_last[eNB_id] = ue->total_TBS[eNB_id]; + LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n", + ue->Mod_id,frame_rx,ue->total_TBS[eNB_id], + ue->total_TBS_last[eNB_id],(float) ue->bitrate[eNB_id]/1000.0); + /* + if ((frame_rx % 100 == 0)) { + LOG_I(PHY,"Throughput %5.1f kbps\n",(float) ue->bitrate[eNB_id]/1000.0); + } + */ } - if (abstraction_flag==0) { + if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&ue->frame_parms)) { + LOG_D(PHY,"ue calling pmch subframe ..\n "); - if (((slot_rx%2)==1) && (l==0)) { - start_meas(&ue->dlsch_llr_stats); - - for (m=ue->pdcch_vars[eNB_id]->num_pdcch_symbols; - mdlsch[eNB_id][0]->active == 1) { - harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; - LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",ue->Mod_id,subframe_rx,slot_rx,harq_pid); - - if ((ue->transmission_mode[eNB_id] == 5) && - (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (ue->use_ia_receiver ==1)) { - dual_stream_UE = 1; - eNB_id_i = ue->n_connected_eNB; - i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; - } else { - dual_stream_UE = 0; - eNB_id_i = eNB_id+1; - i_mod = 0; - } - - // process DLSCH received in first slot - - rx_pdsch(ue, - PDSCH, - eNB_id, - eNB_id_i, - subframe_rx, // subframe, - m, - (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag - dual_stream_UE, - i_mod, - ue->dlsch[eNB_id][0]->current_harq_pid); - } // CRNTI active - -#endif - - if (ue->dlsch_SI[eNB_id]->active == 1) { - // process SI DLSCH in first slot - rx_pdsch(ue, - SI_PDSCH, - eNB_id, - eNB_id+1, - subframe_rx, // subframe, - m, - (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag - 0, - ue->is_secondary_ue, - ue->dlsch_SI[eNB_id]->current_harq_pid); - } // SI active - - if (ue->dlsch_ra[eNB_id]->active == 1) { - rx_pdsch(ue, - RA_PDSCH, - eNB_id, - eNB_id+1, - subframe_rx, // subframe, - m, - (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, - 0, - ue->is_secondary_ue, - ue->dlsch_ra[eNB_id]->current_harq_pid); - } // RA active - } // loop from first dlsch symbol to end of slot - - stop_meas(&ue->dlsch_llr_stats); - } // 2nd quarter - - if (((slot_rx%2)==1) && (l==pilot1)) { - start_meas(&ue->dlsch_llr_stats); - - for (m=pilot2; mdlsch[eNB_id][0]->active == 1) { - harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid; - - if ((ue->transmission_mode[eNB_id] == 5) && - (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (ue->use_ia_receiver ==1)) { - dual_stream_UE = 1; - eNB_id_i = ue->n_connected_eNB; - i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm; - } else { - dual_stream_UE = 0; - eNB_id_i = eNB_id+1; - i_mod = 0; - } - - rx_pdsch(ue, - PDSCH, - eNB_id, - eNB_id_i, - subframe_rx, // subframe, - m, - 0, - dual_stream_UE, - i_mod, - ue->dlsch[eNB_id][0]->current_harq_pid); - } // CRNTI active - -#endif - - if(ue->dlsch_SI[eNB_id]->active == 1) { - rx_pdsch(ue, - SI_PDSCH, - eNB_id, - eNB_id+1, - subframe_rx, // subframe, - m, - 0, // first_symbol_flag - 0, - ue->is_secondary_ue, - ue->dlsch_SI[eNB_id]->current_harq_pid); - } // SI active - - if (ue->dlsch_ra[eNB_id]->active == 1) { - rx_pdsch(ue, - RA_PDSCH, - eNB_id, - eNB_id+1, - subframe_rx, // subframe, - m, - 0, // first_symbol_flag - 0, - ue->is_secondary_ue, - ue->dlsch_ra[eNB_id]->current_harq_pid); - } // RA active - - } // loop over 3rd quarter - - stop_meas(&ue->dlsch_llr_stats); - } // 3rd quarter of subframe - } // abstraction_flag==0 - }// l loop - - // calculate some statistics - if (slot_rx==19) { - if (frame_rx % 10 == 0) { - if ((ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]) != 0) - ue->dlsch_fer[eNB_id] = (100*(ue->dlsch_errors[eNB_id] - ue->dlsch_errors_last[eNB_id]))/(ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]); - - ue->dlsch_errors_last[eNB_id] = ue->dlsch_errors[eNB_id]; - ue->dlsch_received_last[eNB_id] = ue->dlsch_received[eNB_id]; - } - - ue->bitrate[eNB_id] = (ue->total_TBS[eNB_id] - ue->total_TBS_last[eNB_id])*100; - ue->total_TBS_last[eNB_id] = ue->total_TBS[eNB_id]; - LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n", - ue->Mod_id,frame_rx,ue->total_TBS[eNB_id], - ue->total_TBS_last[eNB_id],(float) ue->bitrate[eNB_id]/1000.0); - /* - if ((frame_rx % 100 == 0)) { - LOG_I(PHY,"Throughput %5.1f kbps\n",(float) ue->bitrate[eNB_id]/1000.0); - } - */ - } - - if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&ue->frame_parms)) { - LOG_D(PHY,"ue calling pmch subframe ..\n "); - - if ((slot_rx%2)==1) { - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n", - ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,slot_rx); + if (slot==1) { + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n", + ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,slot); #ifdef Rel10 - pmch_mcs = mac_xface->ue_query_mch(ue->Mod_id, - CC_id, - (subframe_rx==9?-1:0)+frame_rx, - subframe_rx, - eNB_id, - &sync_area, - &mcch_active); + pmch_mcs = mac_xface->ue_query_mch(ue->Mod_id, + CC_id, + (subframe_rx==9?-1:0)+frame_rx, + subframe_rx, + eNB_id, + &sync_area, + &mcch_active); - if (phy_vars_rn) - phy_vars_rn->mch_avtive[subframe_rx]=0; + if (phy_vars_rn) + phy_vars_rn->mch_avtive[subframe_rx]=0; #else - pmch_mcs=-1; + pmch_mcs=-1; #endif - if (pmch_mcs>=0) { - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,pmch_mcs); - fill_UE_dlsch_MCH(ue,pmch_mcs,1,0,0); + if (pmch_mcs>=0) { + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,pmch_mcs); + fill_UE_dlsch_MCH(ue,pmch_mcs,1,0,0); - if (abstraction_flag == 0 ) { - for (l=2; l<12; l++) { + if (abstraction_flag == 0 ) { + for (l=2; l<12; l++) { - slot_fep_mbsfn(ue, - l, - subframe_rx, - 0,0);//ue->rx_offset,0); - } + slot_fep_mbsfn(ue, + l, + subframe_rx, + 0,0);//ue->rx_offset,0); + } - for (l=2; l<12; l++) { - rx_pmch(ue, - 0, - subframe_rx, - l); + for (l=2; l<12; l++) { + rx_pmch(ue, + 0, + subframe_rx, + l); - } + } - /* printf("PMCH decoding, Frame %d, subframe %d, G %d\n", - (subframe_rx==9?-1:0)+frame_rx, - subframe_rx, - ue->dlsch_MCH[0]->harq_processes[0]->G); - */ - ue->dlsch_MCH[0]->harq_processes[0]->G = get_G(&ue->frame_parms, - ue->dlsch_MCH[0]->harq_processes[0]->nb_rb, - ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, - ue->dlsch_MCH[0]->harq_processes[0]->Qm, - 1, - 2, - (subframe_rx==9?-1:0)+frame_rx,subframe_rx); + /* printf("PMCH decoding, Frame %d, subframe %d, G %d\n", + (subframe_rx==9?-1:0)+frame_rx, + subframe_rx, + ue->dlsch_MCH[0]->harq_processes[0]->G); + */ + ue->dlsch_MCH[0]->harq_processes[0]->G = get_G(&ue->frame_parms, + ue->dlsch_MCH[0]->harq_processes[0]->nb_rb, + ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, + ue->dlsch_MCH[0]->harq_processes[0]->Qm, + 1, + 2, + (subframe_rx==9?-1:0)+frame_rx,subframe_rx); - dlsch_unscrambling(&ue->frame_parms,1,ue->dlsch_MCH[0], - ue->dlsch_MCH[0]->harq_processes[0]->G, - ue->pdsch_vars_MCH[0]->llr[0],0,subframe_prev<<1); + dlsch_unscrambling(&ue->frame_parms,1,ue->dlsch_MCH[0], + ue->dlsch_MCH[0]->harq_processes[0]->G, + ue->pdsch_vars_MCH[0]->llr[0],0,subframe_prev<<1); - ret = dlsch_decoding(ue, - ue->pdsch_vars_MCH[0]->llr[0], - &ue->frame_parms, - ue->dlsch_MCH[0], - ue->dlsch_MCH[0]->harq_processes[0], - subframe_prev, - 0, - 0,1); - } else { // abstraction + ret = dlsch_decoding(ue, + ue->pdsch_vars_MCH[0]->llr[0], + &ue->frame_parms, + ue->dlsch_MCH[0], + ue->dlsch_MCH[0]->harq_processes[0], + subframe_prev, + 0, + 0,1); + } else { // abstraction #ifdef PHY_ABSTRACTION - ret = dlsch_decoding_emul(ue, - subframe_rx, - 5, // PMCH - eNB_id); + ret = dlsch_decoding_emul(ue, + subframe_rx, + 5, // PMCH + eNB_id); #endif - } + } + + if (mcch_active == 1) + ue->dlsch_mcch_trials[sync_area][0]++; + else + ue->dlsch_mtch_trials[sync_area][0]++; - if (mcch_active == 1) - ue->dlsch_mcch_trials[sync_area][0]++; - else - ue->dlsch_mtch_trials[sync_area][0]++; + if (ret == (1+ue->dlsch_MCH[0]->max_turbo_iterations)) { + if (mcch_active == 1) + ue->dlsch_mcch_errors[sync_area][0]++; + else + ue->dlsch_mtch_errors[sync_area][0]++; - if (ret == (1+ue->dlsch_MCH[0]->max_turbo_iterations)) { - if (mcch_active == 1) - ue->dlsch_mcch_errors[sync_area][0]++; - else - ue->dlsch_mtch_errors[sync_area][0]++; - - LOG_D(PHY,"[%s %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n", - (r_type == no_relay)? "UE": "RN/UE", ue->Mod_id, - (subframe_rx==9?-1:0)+frame_rx,subframe_rx, - ue->dlsch_mcch_errors[sync_area][0], - ue->dlsch_mtch_errors[sync_area][0], - ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, - ue->dlsch_MCH[0]->max_turbo_iterations, - ue->dlsch_MCH[0]->harq_processes[0]->G); - dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx); + LOG_D(PHY,"[%s %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n", + (r_type == no_relay)? "UE": "RN/UE", ue->Mod_id, + (subframe_rx==9?-1:0)+frame_rx,subframe_rx, + ue->dlsch_mcch_errors[sync_area][0], + ue->dlsch_mtch_errors[sync_area][0], + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, + ue->dlsch_MCH[0]->max_turbo_iterations, + ue->dlsch_MCH[0]->harq_processes[0]->G); + dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx); #ifdef DEBUG_DLSCH - for (int i=0; idlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) { - LOG_T(PHY,"%02x.",ue->dlsch_MCH[0]->harq_processes[0]->c[0][i]); - } + for (int i=0; idlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) { + LOG_T(PHY,"%02x.",ue->dlsch_MCH[0]->harq_processes[0]->c[0][i]); + } - LOG_T(PHY,"\n"); + LOG_T(PHY,"\n"); #endif - if (subframe_rx==9) - mac_xface->macphy_exit("Why are we exiting here?"); - } else { + if (subframe_rx==9) + mac_xface->macphy_exit("Why are we exiting here?"); + } else { #ifdef Rel10 - if ((r_type == no_relay) || (mcch_active == 1)) { - mac_xface->ue_send_mch_sdu(ue->Mod_id, - CC_id, - frame_rx, - ue->dlsch_MCH[0]->harq_processes[0]->b, - ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, - eNB_id,// not relevant in eMBMS context - sync_area); - /* for (i=0;idlsch_MCH[0]->harq_processes[0]->TBS>>3;i++) - msg("%2x.",ue->dlsch_MCH[0]->harq_processes[0]->b[i]); - msg("\n"); - */ + if ((r_type == no_relay) || (mcch_active == 1)) { + mac_xface->ue_send_mch_sdu(ue->Mod_id, + CC_id, + frame_rx, + ue->dlsch_MCH[0]->harq_processes[0]->b, + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, + eNB_id,// not relevant in eMBMS context + sync_area); + /* for (i=0;idlsch_MCH[0]->harq_processes[0]->TBS>>3;i++) + printf("%2x.",ue->dlsch_MCH[0]->harq_processes[0]->b[i]); + printf("\n"); + */ - if (mcch_active == 1) - ue->dlsch_mcch_received[sync_area][0]++; - else - ue->dlsch_mtch_received[sync_area][0]++; + if (mcch_active == 1) + ue->dlsch_mcch_received[sync_area][0]++; + else + ue->dlsch_mtch_received[sync_area][0]++; - if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) { - ue->dlsch_mch_received_sf[subframe_rx%5][0]=0; - } else { - ue->dlsch_mch_received[0]+=1; - ue->dlsch_mch_received_sf[subframe_rx][0]=1; - } + if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) { + ue->dlsch_mch_received_sf[subframe_rx%5][0]=0; + } else { + ue->dlsch_mch_received[0]+=1; + ue->dlsch_mch_received_sf[subframe_rx][0]=1; + } - } else if (r_type == multicast_relay) { // mcch is not active here - // only 1 harq process exists - // Fix me: this could be a pointer copy - memcpy (phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b, - ue->dlsch_MCH[0]->harq_processes[0]->b, - ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3); - // keep the tbs - phy_vars_rn->mch_avtive[subframe_rx] = 1; - phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = ue->dlsch_MCH[0]->harq_processes[0]->TBS; - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = ue->dlsch_MCH[0]->harq_processes[0]->mcs; - LOG_D(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n", - ue->Mod_id, frame_rx,subframe_rx,sync_area, - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs, - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3); + } else if (r_type == multicast_relay) { // mcch is not active here + // only 1 harq process exists + // Fix me: this could be a pointer copy + memcpy (phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b, + ue->dlsch_MCH[0]->harq_processes[0]->b, + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3); + // keep the tbs + phy_vars_rn->mch_avtive[subframe_rx] = 1; + phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct + phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = ue->dlsch_MCH[0]->harq_processes[0]->TBS; + phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = ue->dlsch_MCH[0]->harq_processes[0]->mcs; + LOG_D(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n", + ue->Mod_id, frame_rx,subframe_rx,sync_area, + phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs, + phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3); #ifdef DEBUG_PHY - for (int i=0; idlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3; i++) - msg("%02x ",phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b[i]); + for (int i=0; idlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3; i++) + printf("%02x ",phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b[i]); - msg("\n"); + printf("\n"); #endif - } else - LOG_W(PHY,"[UE %d] Frame %d: not supported option\n",ue->Mod_id, frame_rx); + } else + LOG_W(PHY,"[UE %d] Frame %d: not supported option\n",ue->Mod_id, frame_rx); #endif - } + } + } } } - } #ifdef EMOS - phy_procedures_emos_UE_RX(ue,slot_rx,eNB_id); + phy_procedures_emos_UE_RX(ue,slot,eNB_id); #endif + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); stop_meas(&ue->phy_proc_rx); return (0); } - + #ifdef Rel10 int phy_procedures_RN_UE_RX(uint8_t slot_rx, uint8_t next_slot, relaying_type_t r_type) { - + int do_proc =0; // do nothing by default - + switch(r_type) { case no_relay: do_proc=no_relay; // perform the normal UE operation break; - + case multicast_relay: if (slot_rx > 12) do_proc = 0; // do nothing else // SF#1, SF#2, SF3, SF#3, SF#4, SF#5, SF#6(do rx slot 12) do_proc = multicast_relay ; // do PHY procedures UE RX - + break; - + default: // should'not be here LOG_W(PHY,"Not supported relay type %d, do nothing \n", r_type); do_proc= 0; break; } - + return do_proc; } #endif - - -void phy_procedures_UE_lte(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, - relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) + + +void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, + relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) { #if defined(ENABLE_ITTI) MessageDef *msg_p; @@ -3436,251 +3136,114 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_fl unsigned int Mod_id; int result; #endif -# if ENABLE_RAL - int CC_id =0; -#endif - int frame_rx = ue->frame_rx; - int frame_tx = ue->frame_tx; - int slot_rx = ue->slot_rx; - int slot_tx = ue->slot_tx; - int subframe_tx = slot_tx>>1; - int subframe_rx = slot_rx>>1; + + int frame_rx = proc->frame_rx; + int frame_tx = proc->frame_tx; + int subframe_rx = proc->subframe_rx; + int subframe_tx = proc->subframe_tx; #undef DEBUG_PHY_PROC - + UE_L2_STATE_t ret; + int slot; if (ue->mac_enabled == 0) { ue->UE_mode[eNB_id]=PUSCH; - ue->prach_resources[eNB_id] = &prach_resources_local; - prach_resources_local.ra_RNTI = 0xbeef; - prach_resources_local.ra_PreambleIndex = 0; } - - + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1); -#if defined(EXMIMO) -#ifndef OAI_USRP - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[0].rxcnt_ptr[0])); -#endif -#endif start_meas(&ue->phy_proc); #if defined(ENABLE_ITTI) do { // Checks if a message has been sent to PHY sub-task itti_poll_msg (TASK_PHY_UE, &msg_p); - + if (msg_p != NULL) { msg_name = ITTI_MSG_NAME (msg_p); instance = ITTI_MSG_INSTANCE (msg_p); Mod_id = instance - NB_eNB_INST; - + switch (ITTI_MSG_ID(msg_p)) { case PHY_FIND_CELL_REQ: - LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name); - - /* TODO process the message */ -# if ENABLE_RAL - { - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_PHY_UE , PHY_FIND_CELL_IND); - memset(&PHY_FIND_CELL_IND(message_p), 0, sizeof(PHY_FIND_CELL_IND(message_p))); - PHY_FIND_CELL_IND (message_p).transaction_id = PHY_FIND_CELL_REQ(msg_p).transaction_id; - PHY_FIND_CELL_IND (message_p).cell_nb = 1; - PHY_FIND_CELL_IND (message_p).cells[0].earfcn = 1; - PHY_FIND_CELL_IND (message_p).cells[0].cell_id = 06; - PHY_FIND_CELL_IND (message_p).cells[0].rsrp = 39; - PHY_FIND_CELL_IND (message_p).cells[0].rsrq = 39; - - itti_send_msg_to_task(TASK_RRC_UE, instance, message_p); - - } -# endif - break; - -# if ENABLE_RAL - - case TIMER_HAS_EXPIRED: - // check if it is a measurement timer - { - hashtable_rc_t hashtable_rc; - hashtable_rc = hashtable_is_key_exists(ue_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id)); - LOG_I(PHY, "[UE %d] Received TIMER HAS EXPIRED: (hash_rc %d, HASH_TABLE_OK %d)\n", Mod_id, hashtable_rc, HASH_TABLE_OK); - - if (hashtable_rc == HASH_TABLE_OK) { - phy_UE_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg); - } - } - break; - - - case PHY_MEAS_THRESHOLD_REQ: -#warning "TO DO LIST OF THRESHOLDS" - LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name); - { - ral_threshold_phy_t* threshold_phy_p = NULL; - int index, res; - long timer_id; - hashtable_rc_t hashtable_rc; - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) { - - case RAL_TH_ACTION_CANCEL_THRESHOLD: - break; - - case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: - case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: - for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) { - threshold_phy_p = calloc(1, sizeof(ral_threshold_phy_t)); - threshold_phy_p->th_action = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action; - memcpy(&threshold_phy_p->link_param.link_param_type, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type, - sizeof(ral_link_param_type_t)); - - memcpy(&threshold_phy_p->threshold, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index], - sizeof(ral_threshold_t)); - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) { - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL: - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) { - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - SLIST_INSERT_HEAD( - &ue_g[Mod_id][CC_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen], - threshold_phy_p, - ral_thresholds); - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - SLIST_INSERT_HEAD( - &ue_g[Mod_id][CC_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte], - threshold_phy_p, - ral_thresholds); - //LOG_E(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER NULL - type LTE in %s\n", Mod_id, msg_name); - break; - - default: - LOG_E(PHY, "[UE %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name); - } - - break; - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER: - res = timer_setup( - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t interval_sec, - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t interval_us, - TASK_PHY_UE, - instance, - TIMER_PERIODIC, - threshold_phy_p, - &timer_id); - - if (res == 0) { - hashtable_rc = hashtable_insert(ue_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p); - - if (hashtable_rc == HASH_TABLE_OK) { - threshold_phy_p->timer_id = timer_id; - LOG_I(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER CHOICE - OK - in Hash %s\n", Mod_id, msg_name); - } else { - LOG_E(PHY, "[UE %d] %s: Error in hashtable. Could not configure threshold index %d \n", - Mod_id, msg_name, index); - } - - } else { - LOG_E(PHY, "[UE %d] %s: Could not configure threshold index %d because of timer initialization failure\n", - Mod_id, msg_name, index); - } - - break; - - default: // already checked in RRC, should not happen here - LOG_E(PHY, "[UE %d] BAD PARAMETER cfg_param.union_choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name); - } - } - - break; - - default: - LOG_E(PHY, "[UE %d] BAD PARAMETER th_action value %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name); - } - - } - break; -# endif - + LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name); + + /* TODO process the message */ + break; + default: - LOG_E(PHY, "[UE %d] Received unexpected message %s\n", Mod_id, msg_name); - break; + LOG_E(PHY, "[UE %d] Received unexpected message %s\n", Mod_id, msg_name); + break; } - + result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); } } while(msg_p != NULL); - + #endif - - if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)|| - (ue->frame_parms.frame_type == FDD)) { - phy_procedures_UE_TX(ue,eNB_id,abstraction_flag,mode,r_type); - } - - if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_DL) || - (ue->frame_parms.frame_type == FDD)) { -#ifdef Rel10 - - if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 ) -#endif - phy_procedures_UE_RX(ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); - } - - if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_S) && - ((slot_tx&1)==1)) { - phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag,r_type); - } - - if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_S) && - ((slot_rx&1)==0)) { -#ifdef Rel10 - - if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 ) -#endif - phy_procedures_UE_RX(ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); - } - - if (ue->mac_enabled==1) { - if (slot_rx%2==0) { - ret = mac_xface->ue_scheduler(ue->Mod_id, - frame_tx, - subframe_rx, - subframe_select(&ue->frame_parms,subframe_tx), - eNB_id, - 0/*FIXME CC_id*/); - - if (ret == CONNECTION_LOST) { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",ue->Mod_id, - frame_rx,subframe_tx); - ue->UE_mode[eNB_id] = PRACH; - // mac_xface->macphy_exit("Connection lost"); - } else if (ret == PHY_RESYNCH) { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n", - ue->Mod_id, - frame_rx,subframe_tx); - ue->UE_mode[eNB_id] = RESYNCH; - // mac_xface->macphy_exit("Connection lost"); - } else if (ret == PHY_HO_PRACH) { - LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n", - ue->Mod_id,frame_rx,subframe_tx); - ue->UE_mode[eNB_id] = PRACH; + + for (slot=0;slot<2;slot++) { + + if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)|| + (ue->frame_parms.frame_type == FDD)) { + phy_procedures_UE_TX(ue,proc,eNB_id,abstraction_flag,mode,r_type); } - } - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0); - stop_meas(&ue->phy_proc); + + if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_DL) || + (ue->frame_parms.frame_type == FDD)) { +#ifdef Rel10 + + if (phy_procedures_RN_UE_RX(subframe_rx, subframe_tx, r_type) != 0 ) +#endif + phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); + } + + if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_S) && + (slot==1)) { + phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag,r_type); + } + + if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_S) && + (slot==0)) { +#ifdef Rel10 + + if (phy_procedures_RN_UE_RX(subframe_rx, subframe_tx, r_type) != 0 ) +#endif + phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); + } + + if (ue->mac_enabled==1) { + if (slot==0) { + ret = mac_xface->ue_scheduler(ue->Mod_id, + frame_tx, + subframe_rx, + subframe_select(&ue->frame_parms,subframe_tx), + eNB_id, + 0/*FIXME CC_id*/); + + if (ret == CONNECTION_LOST) { + LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",ue->Mod_id, + frame_rx,subframe_tx); + ue->UE_mode[eNB_id] = PRACH; + // mac_xface->macphy_exit("Connection lost"); + } else if (ret == PHY_RESYNCH) { + LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n", + ue->Mod_id, + frame_rx,subframe_tx); + ue->UE_mode[eNB_id] = RESYNCH; + // mac_xface->macphy_exit("Connection lost"); + } else if (ret == PHY_HO_PRACH) { + LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n", + ue->Mod_id,frame_rx,subframe_tx); + ue->UE_mode[eNB_id] = PRACH; + } + } + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0); + stop_meas(&ue->phy_proc); + } // slot } + + diff --git a/openair1/SCHED/pucch_pc.c b/openair1/SCHED/pucch_pc.c index 229ae3f1a3..7eaf1738dc 100644 --- a/openair1/SCHED/pucch_pc.c +++ b/openair1/SCHED/pucch_pc.c @@ -42,7 +42,7 @@ #include "PHY/LTE_TRANSPORT/proto.h" #include "PHY/extern.h" -int8_t pucch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt) +int8_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt) { int8_t Po_PUCCH; @@ -98,7 +98,7 @@ int8_t pucch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FM if (pucch_fmt!=pucch_format1) { LOG_I(PHY,"[UE %d][PDSCH %x] frame %d, subframe %d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB, g_pucch %d dB\n", ue->Mod_id, - ue->dlsch[eNB_id][0]->rnti,ue->frame_tx,subframe, + ue->dlsch[eNB_id][0]->rnti,proc->frame_tx,subframe, Po_PUCCH, ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, get_PL(ue->Mod_id,ue->CC_id,eNB_id), @@ -106,7 +106,7 @@ int8_t pucch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FM } else { LOG_I(PHY,"[UE %d][SR %x] frame %d, subframe %d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB g_pucch %d dB\n", ue->Mod_id, - ue->dlsch[eNB_id][0]->rnti,ue->frame_tx,subframe, + ue->dlsch[eNB_id][0]->rnti,proc->frame_tx,subframe, Po_PUCCH, ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, get_PL(ue->Mod_id,ue->CC_id,eNB_id), diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c index 074cd507ef..6babb4fef0 100644 --- a/openair1/SCHED/pusch_pc.c +++ b/openair1/SCHED/pusch_pc.c @@ -136,13 +136,13 @@ int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_p uint8_t alpha_lut[8] = {0,40,50,60,70,80,90,100}; -void pusch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag) +void pusch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag) { uint8_t harq_pid = subframe2harq_pid(&ue->frame_parms, - ue->frame_tx, - subframe); + proc->frame_tx, + proc->subframe_tx); uint8_t nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; int8_t PL; @@ -164,7 +164,7 @@ void pusch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, ue->ulsch[eNB_id]->Po_PUSCH += (mac_xface->get_Po_NOMINAL_PUSCH(ue->Mod_id,0) + PL); LOG_I(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,100*PL=%d,%d,%d)\n", - ue->Mod_id,ue->frame_tx,subframe,ue->ulsch[eNB_id]->Po_PUSCH, + ue->Mod_id,proc->frame_tx,proc->subframe_tx,ue->ulsch[eNB_id]->Po_PUSCH, 100*mac_xface->get_Po_NOMINAL_PUSCH(ue->Mod_id,0), hundred_times_log10_NPRB[nb_rb-1], 100*PL, @@ -183,7 +183,7 @@ void pusch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, ue->ulsch[eNB_id]->PHR = 40; LOG_D(PHY,"[UE %d][PUSCH %d] frame %d, subframe %d: Po_PUSCH %d dBm : tx power %d, Po_NOMINAL_PUSCH %d,log10(NPRB) %f,PHR %d, PL %d, alpha*PL %f,delta_IF %f,f_pusch %d\n", - ue->Mod_id,harq_pid,ue->frame_tx,subframe, + ue->Mod_id,harq_pid,proc->frame_tx,proc->subframe_tx, ue->ulsch[eNB_id]->Po_PUSCH, ue->tx_power_max_dBm, ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH, diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index bd877e7aff..4447999bfd 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -499,7 +499,7 @@ static void *scope_thread(void *arg) while (!oai_exit) { if (UE_flag==1) { - len = dump_ue_stats (PHY_vars_UE_g[0][0], stats_buffer, 0, mode,rx_input_level_dBm); + len = dump_ue_stats (PHY_vars_UE_g[0][0], &PHY_vars_UE_g[0][0]->proc.proc_rxtx[0],stats_buffer, 0, mode,rx_input_level_dBm); //fl_set_object_label(form_stats->stats_text, stats_buffer); fl_clear_browser(form_stats->stats_text); fl_add_browser_line(form_stats->stats_text, stats_buffer); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 66c60056b3..1c023c4457 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -306,7 +306,7 @@ static void *UE_thread_synch(void *arg) pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex (UE_sync_thread)\n"); - printf("starting UE synch thread (IC %d)\n",UE->instance_cnt_synch); + printf("starting UE synch thread (IC %d)\n",UE->proc.instance_cnt_synch); ind = 0; found = 0; @@ -358,34 +358,8 @@ static void *UE_thread_synch(void *arg) openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]; openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]; -#ifdef OAI_USRP - openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; - -#if 0 // UHD 3.8 - switch(UE->frame_parms.N_RB_DL) { - case 6: - openair0_cfg[card].rx_gain[i] -= 12; - break; - - case 25: - openair0_cfg[card].rx_gain[i] -= 6; - break; - - case 50: - openair0_cfg[card].rx_gain[i] -= 3; - break; - - case 100: - openair0_cfg[card].rx_gain[i] -= 0; - break; - - default: - printf( "Unknown number of RBs %d\n", UE->frame_parms.N_RB_DL ); - break; - } -#endif + openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB; printf( "UE synch: setting RX gain (%d,%d) to %f\n", card, i, openair0_cfg[card].rx_gain[i] ); -#endif } } @@ -393,19 +367,19 @@ static void *UE_thread_synch(void *arg) while (oai_exit==0) { - if (pthread_mutex_lock(&UE->mutex_synch) != 0) { + if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) { LOG_E( PHY, "[SCHED][UE] error locking mutex for UE initial synch thread\n" ); exit_fun("noting to add"); return &UE_thread_synch_retval; } - while (UE->instance_cnt_synch < 0) { + while (UE->proc.instance_cnt_synch < 0) { // the thread waits here most of the time - pthread_cond_wait( &UE->cond_synch, &UE->mutex_synch ); + pthread_cond_wait( &UE->proc.cond_synch, &UE->proc.mutex_synch ); } - if (pthread_mutex_unlock(&UE->mutex_synch) != 0) { + if (pthread_mutex_unlock(&UE->proc.mutex_synch) != 0) { LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for UE Initial Synch thread\n" ); exit_fun("nothing to add"); return &UE_thread_synch_retval; @@ -437,36 +411,8 @@ static void *UE_thread_synch(void *arg) openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]; openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]; -#ifdef OAI_USRP - openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; // 65 calibrated for USRP B210 @ 2.6 GHz - -#if 0 // UHD 3.8 - switch(UE->frame_parms.N_RB_DL) { - case 6: - openair0_cfg[card].rx_gain[i] -= 12; - break; - - case 25: - openair0_cfg[card].rx_gain[i] -= 6; - break; - - case 50: - openair0_cfg[card].rx_gain[i] -= 3; - break; - - case 100: - openair0_cfg[card].rx_gain[i] -= 0; - break; - - default: - printf("Unknown number of RBs %d\n",UE->frame_parms.N_RB_DL); - break; - } -#endif - + openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB; printf("UE synch: setting RX gain (%d,%d) to %f\n",card,i,openair0_cfg[card].rx_gain[i]); -#endif - } } @@ -537,32 +483,27 @@ static void *UE_thread_synch(void *arg) else { UE->is_synchronized = 1; - if( UE->mode == rx_dump_frame ){ - FILE *fd; - if ((UE->frame_rx&1) == 0) { // this guarantees SIB1 is present - if ((fd = fopen("rxsig_frame0.dat","w")) != NULL) { - fwrite((void*)&UE->common_vars.rxdata[0][0], - sizeof(int32_t), - 10*UE->frame_parms.samples_per_tti, - fd); - LOG_I(PHY,"Dummping Frame ... bye bye \n"); - fclose(fd); - exit(0); - } - else { - LOG_E(PHY,"Cannot open file for writing\n"); - exit(0); - } - } - else { - UE->is_synchronized = 0; - } - } - - - - UE->slot_rx = 0; - UE->slot_tx = 4; + if( UE->mode == rx_dump_frame ){ + FILE *fd; + if ((UE->proc.proc_rxtx[0].frame_rx&1) == 0) { // this guarantees SIB1 is present + if ((fd = fopen("rxsig_frame0.dat","w")) != NULL) { + fwrite((void*)&UE->common_vars.rxdata[0][0], + sizeof(int32_t), + 10*UE->frame_parms.samples_per_tti, + fd); + LOG_I(PHY,"Dummping Frame ... bye bye \n"); + fclose(fd); + exit(0); + } + else { + LOG_E(PHY,"Cannot open file for writing\n"); + exit(0); + } + } + else { + UE->is_synchronized = 0; + } + } } } else { // initial sync failed @@ -631,16 +572,16 @@ static void *UE_thread_synch(void *arg) - if (pthread_mutex_lock(&UE->mutex_synch) != 0) { + if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) { LOG_E( PHY, "[SCHED][UE] error locking mutex for UE synch\n" ); exit_fun("noting to add"); return &UE_thread_synch_retval; } // indicate readiness - UE->instance_cnt_synch--; + UE->proc.instance_cnt_synch--; - if (pthread_mutex_unlock(&UE->mutex_synch) != 0) { + if (pthread_mutex_unlock(&UE->proc.mutex_synch) != 0) { LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE synch\n" ); exit_fun("noting to add"); return &UE_thread_synch_retval; @@ -658,6 +599,7 @@ static void *UE_thread_synch(void *arg) * \param arg is a pointer to a \ref PHY_VARS_UE structure. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ +/* static void *UE_thread_tx(void *arg) { static int UE_thread_tx_retval; @@ -677,7 +619,7 @@ static void *UE_thread_tx(void *arg) attr.sched_nice = 0; attr.sched_priority = 0; - /* This creates a 1ms reservation every 10ms period*/ + // This creates a 1ms reservation every 10ms period attr.sched_policy = SCHED_DEADLINE; attr.sched_runtime = 900000; // each tx thread requires .5ms to finish its job attr.sched_deadline = 1000000; // each tx thread will finish within 1ms @@ -695,8 +637,8 @@ static void *UE_thread_tx(void *arg) char cpu_affinity[1024]; cpu_set_t cpuset; - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ + // Set affinity mask to include CPUs 1 to MAX_CPUS + // CPU 0 is reserved for UHD threads CPU_ZERO(&cpuset); #ifdef CPU_AFFINITY @@ -714,7 +656,7 @@ static void *UE_thread_tx(void *arg) } #endif - /* Check the actual affinity mask assigned to the thread */ + // Check the actual affinity mask assigned to the thread s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); if (s != 0) @@ -836,44 +778,24 @@ static void *UE_thread_tx(void *arg) return &UE_thread_tx_retval; } +*/ + /*! - * \brief This is the UE receive thread. + * \brief This is the UE thread for RX subframe n and TX subframe n+4. * This thread performs the phy_procedures_UE_RX() on every received slot. + * then, if TX is enabled it performs TX for n+4. * \param arg is a pointer to a \ref PHY_VARS_UE structure. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -/* -#ifdef OAI_USRP -void rescale(int16_t *input,int length) -{ -#if defined(__x86_64__) || defined(__i386__) - __m128i *input128 = (__m128i *)input; -#elif defined(__arm__) - int16x8_t *input128 = (int16x8_t *)input; -#endif - int i; - - for (i=0; i>2; i++) { -#if defined(__x86_64__) || defined(__i386__) - input128[i] = _mm_srai_epi16(input128[i],4); -#elif defined(__arm__) - input128[i] = vshrq_n_s16(input128[i],4); -#endif - } -} -#endif -*/ - -static void *UE_thread_rx(void *arg) +static void *UE_thread_rxn_txnp4(void *arg) { static int UE_thread_rx_retval; - PHY_VARS_UE *UE = (PHY_VARS_UE*)arg; - int i; + UE_rxtx_proc_t *proc = (UE_rxtx_proc_t *)arg; int ret; - - UE->instance_cnt_rx=-1; + PHY_VARS_UE *UE=PHY_vars_UE_g[0][proc->CC_id]; + proc->instance_cnt_rxtx=-1; #ifdef DEADLINE_SCHEDULER @@ -970,10 +892,10 @@ static void *UE_thread_rx(void *arg) // Lock memory from swapping. This is a process wide call (not constraint to this thread). mlockall(MCL_CURRENT | MCL_FUTURE); - printf("waiting for sync (UE_thread_rx)\n"); + printf("waiting for sync (UE_thread_rxn_txnp4)\n"); pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_thread_rx)\n"); + printf("Locked sync_mutex, waiting (UE_thread_rxn_txnp4)\n"); while (sync_var<0) pthread_cond_wait(&sync_cond, &sync_mutex); @@ -981,160 +903,76 @@ static void *UE_thread_rx(void *arg) pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex, waiting (UE_thread_rx)\n"); - printf("Starting UE RX thread\n"); + printf("Starting UE RXN_TXNP4 thread\n"); while (!oai_exit) { - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { + if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" ); exit_fun("nothing to add"); return &UE_thread_rx_retval; } - while (UE->instance_cnt_rx < 0) { + while (proc->instance_cnt_rxtx < 0) { // most of the time, the thread is waiting here - pthread_cond_wait( &UE->cond_rx, &UE->mutex_rx ); + pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx ); } - if (pthread_mutex_unlock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" ); + if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXn_TXnp4\n" ); exit_fun("nothing to add"); return &UE_thread_rx_retval; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 1 ); - for (i=0; i<2; i++) { - if ((subframe_select( &UE->frame_parms, UE->slot_rx>>1 ) == SF_DL) || - (UE->frame_parms.frame_type == FDD)) { - /* -#ifdef OAI_USRP - // this does the adjustments of RX signal amplitude to bring into least 12 significant bits - int slot_length = UE->frame_parms.samples_per_tti>>1; - int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset; - int frame_length = UE->frame_parms.samples_per_tti*10; - int aa; - if (rx_offset > frame_length) - rx_offset-=frame_length; - - if (rx_offset >= 0) { - if (rx_offset + slot_length < frame_length) - for (aa=0;aaframe_parms.nb_antennas_rx;aa++) - rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)], - slot_length); - else { - int diff = rx_offset + slot_length - frame_length; - for (aa=0;aaframe_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)], - slot_length-diff); - rescale((int16_t*)&UE->common_vars.rxdata[aa][0], - diff); - } - } - } - else { - for (aa=0;aaframe_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], - -rx_offset); - rescale((int16_t*)&UE->common_vars.rxdata[aa][0], - slot_length+rx_offset); - } - } -#endif - */ - phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL ); - } - - if ((subframe_select( &UE->frame_parms, UE->slot_rx>>1 ) == SF_S) && - ((UE->slot_rx&1) == 0)) { - /* -#ifdef OAI_USRP - // this does the adjustments of RX signal amplitude to bring into least 12 significant bits - int slot_length = UE->frame_parms.samples_per_tti>>1; - int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset; - int frame_length = UE->frame_parms.samples_per_tti*10; - if (rx_offset > frame_length) - rx_offset-=frame_length; - int aa; - - if (rx_offset >= 0) { - if (rx_offset + slot_length < frame_length) - for (aa=0;aaframe_parms.nb_antennas_rx;aa++) - rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)], - slot_length); - else { - int diff = rx_offset + slot_length - frame_length; - for (aa=0;aaframe_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)], - slot_length-diff); - rescale((int16_t*)&UE->common_vars.rxdata[aa][0], - diff); - } - } - } - else { - for (aa=0;aaframe_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], - -rx_offset); - rescale((int16_t*)&UE->common_vars.rxdata[aa][0], - slot_length+rx_offset); - } - } -#endif - */ - phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL ); - } - - if ((UE->mac_enabled==1) && (i==0)) { - ret = mac_xface->ue_scheduler(UE->Mod_id, - UE->frame_tx, - UE->slot_rx>>1, - subframe_select(&UE->frame_parms,UE->slot_tx>>1), - 0, - 0/*FIXME CC_id*/); - - if (ret == CONNECTION_LOST) { - LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, returning to PRACH\n", - UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 ); - UE->UE_mode[0] = PRACH; - } else if (ret == PHY_RESYNCH) { - LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, trying to resynch\n", - UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 ); - UE->UE_mode[0] = RESYNCH; - } else if (ret == PHY_HO_PRACH) { - LOG_I( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u, return to PRACH and perform a contention-free access\n", - UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 ); - UE->UE_mode[0] = PRACH; - } - } - - UE->slot_rx++; - - if (UE->slot_rx == 20) { - UE->slot_rx = 0; - UE->frame_rx++; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_UE, UE->frame_rx ); - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_UE, UE->slot_rx>>1 ); + if ((subframe_select( &UE->frame_parms, proc->subframe_rx) == SF_DL) || + (UE->frame_parms.frame_type == FDD) || + (subframe_select( &UE->frame_parms, proc->subframe_rx ) == SF_S)) { + phy_procedures_UE_RX( UE, proc, 0, 0, UE->mode, no_relay, NULL ); } + + + if (UE->mac_enabled==1) { + ret = mac_xface->ue_scheduler(UE->Mod_id, + proc->frame_tx, + proc->subframe_rx, + subframe_select(&UE->frame_parms,proc->subframe_tx), + 0, + 0/*FIXME CC_id*/); + + if (ret == CONNECTION_LOST) { + LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, returning to PRACH\n", + UE->Mod_id, proc->frame_rx, proc->subframe_tx ); + UE->UE_mode[0] = PRACH; + } else if (ret == PHY_RESYNCH) { + LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, trying to resynch\n", + UE->Mod_id, proc->frame_rx, proc->subframe_tx ); + UE->UE_mode[0] = RESYNCH; + } else if (ret == PHY_HO_PRACH) { + LOG_I( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u, return to PRACH and perform a contention-free access\n", + UE->Mod_id, proc->frame_rx, proc->subframe_tx ); + UE->UE_mode[0] = PRACH; + } + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 0 ); - - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { + + if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" ); exit_fun("noting to add"); return &UE_thread_rx_retval; } - - UE->instance_cnt_rx--; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, UE->instance_cnt_rx); - - if (pthread_mutex_unlock(&UE->mutex_rx) != 0) { + + proc->instance_cnt_rxtx--; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, proc->instance_cnt_rxtx); + + if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" ); exit_fun("noting to add"); return &UE_thread_rx_retval; } } - + // thread finished return &UE_thread_rx_retval; } @@ -1150,13 +988,185 @@ static void *UE_thread_rx(void *arg) /*! * \brief This is the main UE thread. * This thread controls the other three UE threads: - * - UE_thread_rx - * - UE_thread_tx + * - UE_thread_rxn_txnp4 (even subframes) + * - UE_thread_rxn_txnp4 (odd subframes) * - UE_thread_synch * \param arg unused * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -void *UE_thread(void *arg) + +void *UE_thread(void *arg) { + + static int UE_thread_retval; + PHY_VARS_UE *UE = PHY_vars_UE_g[0][0]; + // int tx_enabled = 0; + unsigned int rxs; + int dummy_rx[UE->frame_parms.nb_antennas_rx][UE->frame_parms.samples_per_tti]; + openair0_timestamp timestamp; + void* rxp[2]; + + +#ifdef NAS_UE + MessageDef *message_p; +#endif + + int start_rx_stream = 0; + +#ifdef DEADLINE_SCHEDULER + + struct sched_attr attr; + unsigned int flags = 0; + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0;//sched_get_priority_max(SCHED_DEADLINE); + + // This creates a .5 ms reservation + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = 100000; + attr.sched_deadline = 500000; + attr.sched_period = 500000; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] main eNB thread: sched_setattr failed\n"); + exit_fun("Nothing to add"); + return &UE_thread_retval; + } + LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %lu started on CPU %d\n", + (unsigned long)gettid(), sched_getcpu()); + +#else + struct sched_param sp; + sp.sched_priority = sched_get_priority_max(SCHED_FIFO); + pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp); +#endif + + // Lock memory from swapping. This is a process wide call (not constraint to this thread). + mlockall(MCL_CURRENT | MCL_FUTURE); + + printf("waiting for sync (UE_thread)\n"); + pthread_mutex_lock(&sync_mutex); + printf("Locked sync_mutex, waiting (UE_thread)\n"); + + while (sync_var<0) + pthread_cond_wait(&sync_cond, &sync_mutex); + + pthread_mutex_unlock(&sync_mutex); + printf("unlocked sync_mutex, waiting (UE_thread)\n"); + + printf("starting UE thread\n"); + +#ifdef NAS_UE + message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE); + itti_send_msg_to_task (TASK_NAS_UE, INSTANCE_DEFAULT, message_p); +#endif + + while (!oai_exit) { + + if (UE->is_synchronized == 0) { + + if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) { + LOG_E( PHY, "[SCHED][UE] verror locking mutex for UE initial synch thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + + int instance_cnt_synch = UE->proc.instance_cnt_synch; + + if (pthread_mutex_unlock(&UE->proc.mutex_synch) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE initial synch thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + + if (instance_cnt_synch < 0) { // we can invoke the synch + // grab 10 ms of signal and wakeup synch thread + for (int i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void*)&rxdata[i][0]; + + if (UE->mode != loop_through_memory) { + rxs = openair0.trx_read_func(&openair0, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti*10, + UE->frame_parms.nb_antennas_rx); + } + instance_cnt_synch = ++UE->proc.instance_cnt_synch; + if (instance_cnt_synch == 0) { + if (pthread_cond_signal(&UE->proc.cond_synch) != 0) { + LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + } else { + LOG_E( PHY, "[SCHED][UE] UE sync thread busy!!\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + } // + else { + // grab 10 ms of signal into dummy buffer + + if (UE->mode != loop_through_memory) { + for (int i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void*)&dummy_rx[i][0]; + for (int sf=0;sf<10;sf++) + rxs = openair0.trx_read_func(&openair0, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti, + UE->frame_parms.nb_antennas_rx); + } + } + + } // UE->is_synchronized==0 + else { + if (start_rx_stream==0) { + start_rx_stream=1; + if (UE->mode != loop_through_memory) { + LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); + rxs = openair0.trx_read_func(&openair0, + ×tamp, + (void**)rxdata, + UE->rx_offset, + UE->frame_parms.nb_antennas_rx); + + if (rxs != UE->rx_offset) { + exit_fun("problem in rx"); + return &UE_thread_retval; + } + UE->rx_offset=0; + } //UE->mode != loop_through_memory + else + rt_sleep_ns(1000000); + // read in first symbol (to process one subframe we need symbol 0 - 14 and 1st symbol of next subframe + rxs = openair0.trx_read_func(&openair0, + ×tamp, + (void**)rxdata, + UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, + UE->frame_parms.nb_antennas_rx); + }// start_rx_stream==0 + + if (UE->mode != loop_through_memory) { + for (int sf=0;sf<10;sf++) + for (int i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void*)&dummy_rx[i][sf*UE->frame_parms.samples_per_tti]; + + rxs = openair0.trx_read_func(&openair0, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti, + UE->frame_parms.nb_antennas_rx); + } + + } // UE->is_synchronized==1 + + } // while !oai_exit +} // UE_thread + +/* +void *UE_thread_old(void *arg) { UNUSED(arg) static int UE_thread_retval; @@ -1176,6 +1186,7 @@ void *UE_thread(void *arg) int first_rx = 0; RTIME T0; unsigned int rxs; + void* rxp[2]; openair0_timestamp timestamp; @@ -1254,9 +1265,7 @@ void *UE_thread(void *arg) for (int i=0; iframe_parms.nb_antennas_rx; i++) rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i]; - /* if (dummy_dump == 0) - printf("writing %d samples to %d (first_rx %d)\n",spp - ((first_rx==1) ? rx_off_diff : 0),rxpos,first_rx);*/ - + if (UE->mode != loop_through_memory) { rxs = openair0.trx_read_func(&openair0, ×tamp, @@ -1342,7 +1351,7 @@ void *UE_thread(void *arg) if (instance_cnt_rx == 0) { LOG_D(HW,"signalling rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - if (pthread_cond_signal(&UE->cond_rx) != 0) { + if (pthread_cond_signal(&UE->proc.cond_rx) != 0) { LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" ); exit_fun("nothing to add"); return &UE_thread_retval; @@ -1538,7 +1547,7 @@ void *UE_thread(void *arg) return &UE_thread_retval; } - +*/ /*! * \brief Initialize the UE theads. @@ -1561,23 +1570,21 @@ void init_UE_threads(void) #endif // the threads are not yet active, therefore access is allowed without locking - UE->instance_cnt_tx = -1; - UE->instance_cnt_rx = -1; - UE->instance_cnt_synch = -1; - pthread_mutex_init(&UE->mutex_tx,NULL); - pthread_mutex_init(&UE->mutex_rx,NULL); - pthread_mutex_init(&UE->mutex_synch,NULL); - pthread_cond_init(&UE->cond_tx,NULL); - pthread_cond_init(&UE->cond_rx,NULL); - pthread_cond_init(&UE->cond_synch,NULL); - pthread_create(&UE->thread_tx,NULL,UE_thread_tx,(void*)UE); - pthread_setname_np( UE->thread_tx, "UE_thread_tx" ); - pthread_create(&UE->thread_rx,NULL,UE_thread_rx,(void*)UE); - pthread_setname_np( UE->thread_rx, "UE_thread_rx" ); - pthread_create(&UE->thread_synch,NULL,UE_thread_synch,(void*)UE); - pthread_setname_np( UE->thread_synch, "UE_thread_synch" ); - UE->frame_tx = 0; - UE->frame_rx = 0; + UE->proc.proc_rxtx[0].instance_cnt_rxtx = -1; + UE->proc.proc_rxtx[1].instance_cnt_rxtx = -1; + UE->proc.instance_cnt_synch = -1; + pthread_mutex_init(&UE->proc.proc_rxtx[0].mutex_rxtx,NULL); + pthread_mutex_init(&UE->proc.proc_rxtx[1].mutex_rxtx,NULL); + pthread_mutex_init(&UE->proc.mutex_synch,NULL); + pthread_cond_init(&UE->proc.proc_rxtx[0].cond_rxtx,NULL); + pthread_cond_init(&UE->proc.proc_rxtx[1].cond_rxtx,NULL); + pthread_cond_init(&UE->proc.cond_synch,NULL); + pthread_create(&UE->proc.proc_rxtx[0].pthread_rxtx,NULL,UE_thread_rxn_txnp4,(void*)&UE->proc.proc_rxtx[0]); + pthread_setname_np( UE->proc.proc_rxtx[0].pthread_rxtx, "UE_thread_rxn_txnp4_even" ); + pthread_create(&UE->proc.proc_rxtx[1].pthread_rxtx,NULL,UE_thread_rxn_txnp4,(void*)&UE->proc.proc_rxtx[1]); + pthread_setname_np( UE->proc.proc_rxtx[1].pthread_rxtx, "UE_thread_rxn_txnp4_odd" ); + pthread_create(&UE->proc.pthread_synch,NULL,UE_thread_synch,(void*)UE); + pthread_setname_np( UE->proc.pthread_synch, "UE_thread_synch" ); } From 55c194b07dc9a344347d0283bac79cc983e2a2e4 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 1 Jul 2016 19:29:02 +0200 Subject: [PATCH 093/340] added mobipass interface and tested sending dummy and starting stream, no reply yet --- cmake_targets/CMakeLists.txt | 1 + openair2/ENB_APP/enb_config.c | 4 +++- openair2/ENB_APP/enb_config.h | 1 + targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 10 ++++++++-- .../ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c | 16 ++++++++++++++++ targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 5 +++++ targets/RT/USER/lte-enb.c | 18 ++++++++++++++---- targets/RT/USER/lte-softmodem.c | 2 ++ 8 files changed, 50 insertions(+), 7 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 56759ae0e5..f96c63f2bb 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -963,6 +963,7 @@ set(PHY_SRC ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/print_stats.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/initial_sync.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_mobipass_tools.c ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 5bc0088ed5..d67c6eb6d7 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -298,7 +298,7 @@ void enb_config_display(void) printf( "\ttx_scheduling_advance :\t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_scheduling_advance); printf( "\ttx_sample_advance : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_sample_advance); printf( "\tiq_txshift : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].iq_txshift); - printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : (enb_properties.properties[i]->rrh_gw_config[j].rawif4 == 1)? "RAW_IF4" : (enb_properties.properties[i]->rrh_gw_config[j].udpif4 == 1)? "UDP_IF4" : "UDP"); + printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : (enb_properties.properties[i]->rrh_gw_config[j].rawif4 == 1)? "RAW_IF4" : (enb_properties.properties[i]->rrh_gw_config[j].udpif4 == 1)? "UDP_IF4" : (enb_properties.properties[i]->rrh_gw_config[j].rawif5_mobipass == 1)? "RAW_IF5_MOBIPASS" : "UDP"); if (enb_properties.properties[i]->rrh_gw_config[j].exmimo == 1) { printf( "\tRF target : \tEXMIMO:\n\n"); } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_b200 == 1) { @@ -2246,6 +2246,8 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udpif4 = 1; } else if (strcmp(tr_preference, "raw_if4") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rawif4 = 1; + } else if (strcmp(tr_preference, "raw_if5_mobipass") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rawif5_mobipass = 1; } else {//if (strcmp(preference, "no") == 0) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index e53921b4d0..716d400178 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -88,6 +88,7 @@ typedef struct rrh_gw_config_s { uint16_t remote_port; uint8_t udpif4; uint8_t rawif4; + uint8_t rawif5_mobipass; int tx_scheduling_advance; int tx_sample_advance; int iq_txshift; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 13dfe574c2..17a9a677e0 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -53,6 +53,7 @@ #include "ethernet_lib.h" #include "if_defs.h" #include "openair1/PHY/LTE_TRANSPORT/if4_tools.h" +#include "openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h" #define DEBUG 0 @@ -123,8 +124,11 @@ int eth_socket_init_raw(openair0_device *device) { /* Construct the Ethernet header */ ether_aton_r(local_mac, (struct ether_addr *)(&(eth->eh.ether_shost))); ether_aton_r(remote_mac, (struct ether_addr *)(&(eth->eh.ether_dhost))); - eth->eh.ether_type = htons((short)device->openair0_cfg->my_port); - +// if (((*) device->priv)->flags == ETH_RAW_IF5_MOBIPASS) { + eth->eh.ether_type = htons(0xbffe); +// } else { +// eth->eh.ether_type = htons((short)device->openair0_cfg->my_port); +// } printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5]); return 0; @@ -214,6 +218,8 @@ int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks); } else if (flags == IF4_PULFFT) { packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); + } else if (flags == IF5_MOBIPASS) { + packet_size = RAW_IF5_MOBIPASS_SIZE_BYTES; } else { packet_size = RAW_IF4_PRACH_SIZE_BYTES; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 5802b1569f..81e3d7b558 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -88,6 +88,17 @@ int trx_eth_start(openair0_device *device) { } else if (eth->flags == ETH_UDP_IF4_MODE) { + } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + if (eth_socket_init_raw(device)!=0) return -1; + /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ + //if (device->host_type == BBU_HOST) { + //if(eth_set_dev_conf_raw_IF4(device)!=0) return -1; + //} else { + //if(eth_get_dev_conf_raw_IF4(device)!=0) return -1; +// + /* adjust MTU wrt number of samples per packet */ + // if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; + } else { if (eth_socket_init_udp(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ @@ -334,6 +345,8 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth eth->flags = ETH_RAW_IF4_MODE; } else if (eth_params->transp_preference == 2) { eth->flags = ETH_UDP_IF4_MODE; + } else if (eth_params->transp_preference == 4) { + eth->flags = ETH_RAW_IF5_MOBIPASS; } else { printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference); eth->flags = ETH_RAW_MODE; @@ -361,6 +374,9 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth } else if (eth->flags == ETH_RAW_IF4_MODE) { device->trx_write_func = trx_eth_write_raw_IF4; device->trx_read_func = trx_eth_read_raw_IF4; + } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + device->trx_write_func = trx_eth_write_raw_IF4; + device->trx_read_func = trx_eth_read_raw_IF4; } else { //device->trx_write_func = trx_eth_write_udp_IF4; //device->trx_read_func = trx_eth_read_udp_IF4; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 030bfda147..e17890836b 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -46,6 +46,7 @@ #define ETH_RAW_MODE 1 #define ETH_UDP_IF4_MODE 2 #define ETH_RAW_IF4_MODE 3 +#define ETH_RAW_IF5_MOBIPASS 4 // Time domain RRH packet sizes #define MAC_HEADER_SIZE_BYTES (sizeof(struct ether_header)) @@ -61,3 +62,7 @@ #define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + PRACH_BLOCK_SIZE_BYTES) + +// Mobipass packet sizes +#define RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES 1280 +#define RAW_IF5_MOBIPASS_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 6eb916c41b..1fcd9bb61c 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -69,6 +69,7 @@ //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all #include "PHY/LTE_TRANSPORT/if4_tools.h" +#include "PHY/LTE_TRANSPORT/if5_mobipass_tools.h" #include "PHY/extern.h" #include "SCHED/extern.h" @@ -547,7 +548,7 @@ static void* eNB_thread_rxtx( void* param ) { } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { /// **** trx_write_func to IF device **** /// - + // send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, 0); } else { /// **** send_IF4 of txdataF to RRU **** /// @@ -624,10 +625,11 @@ static void* eNB_thread_rx_common( void* param ) { eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - + + uint8_t seqno=0; FILE *rx_time_file = NULL; char rx_time_name[101]; - //int i; + int i; struct timespec wait; wait.tv_sec=0; @@ -762,7 +764,15 @@ static void* eNB_thread_rx_common( void* param ) { if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) LOG_E(HW,"Could not start the RF device\n"); } - + + // proc->proc_rxtx[0].timestamp_tx = 0; + // seqno = send_IF5(eNB, &proc->proc_rxtx[0], 0); + + // for (i=0; i<1000;i++) { + // seqno = send_IF5(eNB, &proc->proc_rxtx[0], seqno); + // proc->proc_rxtx[0].timestamp_tx += 7680*2; + // } + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, 0 ); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 4447999bfd..656c22ced3 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1071,6 +1071,8 @@ static void get_options (int argc, char **argv) (eth_params+j)->transp_preference = ETH_RAW_IF4_MODE; } else if (enb_properties->properties[i]->rrh_gw_config[j].udpif4 == 1) { (eth_params+j)->transp_preference = ETH_UDP_IF4_MODE; + } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif5_mobipass == 1) { + (eth_params+j)->transp_preference = ETH_RAW_IF5_MOBIPASS; } else { (eth_params+j)->transp_preference = ETH_UDP_MODE; } From 5ae509b2dee39e75dec8b24152b45eda3a678712 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 1 Jul 2016 19:30:18 +0200 Subject: [PATCH 094/340] if5_mobipass tools --- .../PHY/LTE_TRANSPORT/if5_mobipass_tools.c | 65 +++++++++++++++++++ .../PHY/LTE_TRANSPORT/if5_mobipass_tools.h | 26 ++++++++ 2 files changed, 91 insertions(+) create mode 100644 openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c create mode 100644 openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h diff --git a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c new file mode 100644 index 0000000000..2306fef39b --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c @@ -0,0 +1,65 @@ + +#include + +#include "PHY/defs.h" +#include "PHY/LTE_TRANSPORT/if5_mobipass_tools.h" + +#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" + + +uint8_t send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t init_seq) { + + uint8_t seqno=init_seq; + void *txp[2]; + void *tx_buffer=NULL; + __m128i *data_block=NULL,*main_data_block=NULL; + + __m128i *txp128; + __m128i t0, t1; + + uint16_t packet_id=0, i; + uint16_t db_fulllength = 640; + + tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (__m128i *)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4); + main_data_block = data_block; + + header->flags = 0; + header->fifo_status = 0; + header->ack = 0; + header->seqno = seqno; + header->rsvd = 0; + + txp[0] = (void*)&eNB->common_vars.txdata[0][0][proc->subframe_tx*eNB->frame_parms.samples_per_tti]; + txp128 = (__m128i *) txp[0]; + + for (packet_id=0; packet_id<(7680*2)/640; packet_id++) { + header->time_stamp = proc->timestamp_tx + packet_id*640; + data_block = main_data_block; + + for (i=0; i>3; i+=2) { + t0 = _mm_srli_epi16(*txp128++, 4); + t1 = _mm_srli_epi16(*txp128++, 4); + + *data_block++ = _mm_packs_epi16(t0, t1); + } + + // Write the packet to the fronthaul + if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, + packet_id, + &tx_buffer, + db_fulllength, + 1, + IF5_MOBIPASS)) < 0) { + perror("ETHERNET write for IF5_MOBIPASS\n"); + } + + header->seqno += 1; + } + + seqno = header->seqno; + free(tx_buffer); + return(seqno); +} + diff --git a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h new file mode 100644 index 0000000000..307742dc1e --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h @@ -0,0 +1,26 @@ + +#include +#include "PHY/defs.h" + +#define IF5_MOBIPASS 0x0050 + +struct IF5_mobipass_header { + /// Type + uint16_t flags; + /// Sub-Type + uint16_t fifo_status; + /// Reserved + uint8_t seqno; + + uint8_t ack; + + uint32_t rsvd; + /// Frame Status + uint32_t time_stamp; + +} __attribute__ ((__packed__)); + +typedef struct IF5_mobipass_header IF5_mobipass_header_t; +#define sizeof_IF5_mobipass_header_t 14 + +uint8_t send_IF5(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint8_t); From cfd45a1d9e84b1af8ac6356632fa7bb629c83b91 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 4 Jul 2016 17:42:31 +0200 Subject: [PATCH 095/340] small fixes and mid save --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 - openair1/PHY/LTE_TRANSPORT/if4_tools.h | 3 +- .../PHY/LTE_TRANSPORT/if5_mobipass_tools.c | 67 ++++++++++++++----- .../PHY/LTE_TRANSPORT/if5_mobipass_tools.h | 59 +++++++++++++--- openair1/SCHED/phy_procedures_lte_eNb.c | 15 ++++- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 8 +-- targets/RT/USER/lte-enb.c | 16 ++--- 7 files changed, 123 insertions(+), 47 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index b71365d6fc..1a1178ee6f 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -38,8 +38,6 @@ * \warning */ -#include - #include "PHY/defs.h" #include "PHY/LTE_TRANSPORT/if4_tools.h" #include "PHY/TOOLS/ALAW/alaw_lut.h" diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 18ff2bb8f8..a885d28ec2 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -38,7 +38,6 @@ * \warning */ -#include #include "PHY/defs.h" /// Macro for IF4 packet type @@ -57,7 +56,7 @@ struct IF4_header { /// Frame Status uint32_t frame_status; -}; +} __attribute__ ((__packed__)); typedef struct IF4_header IF4_header_t; #define sizeof_IF4_header_t 12 diff --git a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c index 2306fef39b..d38dfb76a5 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c @@ -1,5 +1,42 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom -#include + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/*! \file PHY/LTE_TRANSPORT/if5_mobipass_tools.c +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ #include "PHY/defs.h" #include "PHY/LTE_TRANSPORT/if5_mobipass_tools.h" @@ -7,36 +44,35 @@ #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" -uint8_t send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t init_seq) { +void send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t *seqno) { - uint8_t seqno=init_seq; - void *txp[2]; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + void *txp[fp->nb_antennas_tx]; void *tx_buffer=NULL; - __m128i *data_block=NULL,*main_data_block=NULL; + __m128i *data_block=NULL, *data_block_head=NULL; __m128i *txp128; __m128i t0, t1; uint16_t packet_id=0, i; - uint16_t db_fulllength = 640; + uint16_t db_fulllength=640; tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (__m128i *)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4); - main_data_block = data_block; + data_block_head = (__m128i *)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4); header->flags = 0; header->fifo_status = 0; + header->seqno = *seqno; header->ack = 0; - header->seqno = seqno; - header->rsvd = 0; + header->word0 = 0; txp[0] = (void*)&eNB->common_vars.txdata[0][0][proc->subframe_tx*eNB->frame_parms.samples_per_tti]; txp128 = (__m128i *) txp[0]; - for (packet_id=0; packet_id<(7680*2)/640; packet_id++) { - header->time_stamp = proc->timestamp_tx + packet_id*640; - data_block = main_data_block; + for (packet_id=0; packet_id<(fp->samples_per_tti*2)/db_fulllength; packet_id++) { + header->time_stamp = proc->timestamp_tx + packet_id * db_fulllength; + data_block = data_block_head; for (i=0; i>3; i+=2) { t0 = _mm_srli_epi16(*txp128++, 4); @@ -58,8 +94,7 @@ uint8_t send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t init_seq) { header->seqno += 1; } - seqno = header->seqno; + *seqno = header->seqno; free(tx_buffer); - return(seqno); + return; } - diff --git a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h index 307742dc1e..e9bc26f9a6 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h @@ -1,26 +1,65 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/*! \file PHY/LTE_TRANSPORT/if5_mobipass_tools.h +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ #include #include "PHY/defs.h" -#define IF5_MOBIPASS 0x0050 +#define IF5_MOBIPASS 0xbffe struct IF5_mobipass_header { - /// Type + /// uint16_t flags; - /// Sub-Type + /// uint16_t fifo_status; - /// Reserved + /// uint8_t seqno; - + /// uint8_t ack; - - uint32_t rsvd; - /// Frame Status + /// + uint32_t word0; + /// uint32_t time_stamp; - + } __attribute__ ((__packed__)); typedef struct IF5_mobipass_header IF5_mobipass_header_t; #define sizeof_IF5_mobipass_header_t 14 -uint8_t send_IF5(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint8_t); +void send_IF5(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint8_t*); diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index e5b93dc6ac..a81e9dcfad 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2524,6 +2524,10 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl uint16_t packet_type; uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; + + struct timespec time_req, time_rem; + time_req.tv_sec = 0; + time_req.tv_nsec = 900000; if (subframe==9) { subframe=0; @@ -2583,7 +2587,16 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } else if(eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF /// **** trx_read_func from IF device **** /// - + nanosleep(&time_req, &time_rem); + + proc->timestamp_rx += fp->samples_per_tti; + + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 17a9a677e0..bf5554fd26 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -124,11 +124,11 @@ int eth_socket_init_raw(openair0_device *device) { /* Construct the Ethernet header */ ether_aton_r(local_mac, (struct ether_addr *)(&(eth->eh.ether_shost))); ether_aton_r(remote_mac, (struct ether_addr *)(&(eth->eh.ether_dhost))); -// if (((*) device->priv)->flags == ETH_RAW_IF5_MOBIPASS) { + if (eth->flags == ETH_RAW_IF5_MOBIPASS) { eth->eh.ether_type = htons(0xbffe); -// } else { -// eth->eh.ether_type = htons((short)device->openair0_cfg->my_port); -// } + } else { + eth->eh.ether_type = htons((short)device->openair0_cfg->my_port); + } printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eth->eh.ether_shost[0],eth->eh.ether_shost[1],eth->eh.ether_shost[2],eth->eh.ether_shost[3],eth->eh.ether_shost[4],eth->eh.ether_shost[5]); return 0; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 1fcd9bb61c..de37789c3d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -302,6 +302,8 @@ static void* eNB_thread_rxtx( void* param ) { uint16_t packet_type; uint32_t symbol_number=0; + uint8_t seqno=0; + if (opp_enabled == 1) { snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf", "eNB"); tx_time_file = fopen(tx_time_name,"w"); @@ -548,8 +550,8 @@ static void* eNB_thread_rxtx( void* param ) { } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { /// **** trx_write_func to IF device **** /// - // send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, 0); - + send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, &seqno); + } else { /// **** send_IF4 of txdataF to RRU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); @@ -626,10 +628,8 @@ static void* eNB_thread_rx_common( void* param ) { PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - uint8_t seqno=0; FILE *rx_time_file = NULL; char rx_time_name[101]; - int i; struct timespec wait; wait.tv_sec=0; @@ -764,14 +764,6 @@ static void* eNB_thread_rx_common( void* param ) { if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) LOG_E(HW,"Could not start the RF device\n"); } - - // proc->proc_rxtx[0].timestamp_tx = 0; - // seqno = send_IF5(eNB, &proc->proc_rxtx[0], 0); - - // for (i=0; i<1000;i++) { - // seqno = send_IF5(eNB, &proc->proc_rxtx[0], seqno); - // proc->proc_rxtx[0].timestamp_tx += 7680*2; - // } // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { From 9c1a6fc16e18d980b3c46d5b59de49e3418526f2 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 5 Jul 2016 17:54:35 +0200 Subject: [PATCH 096/340] rru recv frame no fix --- targets/RT/USER/lte-enb.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index de37789c3d..7f8988dd0d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -495,12 +495,11 @@ static void* eNB_thread_rxtx( void* param ) { /// **** recv_IF4 of txdataF from RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1) { + do { recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); - } + } while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); - // Check the recv frame/subframe } } From ba11fc848dd749aad66be45f7a4343e739fcfd93 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 5 Jul 2016 18:01:41 +0200 Subject: [PATCH 097/340] keep alaw lut and remove other code --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 +- openair1/PHY/TOOLS/ALAW/companders.c | 139 ------------- openair1/PHY/TOOLS/ALAW/companders.h | 90 --------- openair1/PHY/TOOLS/ALAW/compandit.c | 128 ------------ openair1/PHY/TOOLS/ALAW/readme-companders.txt | 185 ------------------ openair1/PHY/TOOLS/{ALAW => }/alaw_lut.h | 0 6 files changed, 1 insertion(+), 543 deletions(-) delete mode 100644 openair1/PHY/TOOLS/ALAW/companders.c delete mode 100644 openair1/PHY/TOOLS/ALAW/companders.h delete mode 100644 openair1/PHY/TOOLS/ALAW/compandit.c delete mode 100644 openair1/PHY/TOOLS/ALAW/readme-companders.txt rename openair1/PHY/TOOLS/{ALAW => }/alaw_lut.h (100%) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 1a1178ee6f..587d139422 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -40,7 +40,7 @@ #include "PHY/defs.h" #include "PHY/LTE_TRANSPORT/if4_tools.h" -#include "PHY/TOOLS/ALAW/alaw_lut.h" +#include "PHY/TOOLS/alaw_lut.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" diff --git a/openair1/PHY/TOOLS/ALAW/companders.c b/openair1/PHY/TOOLS/ALAW/companders.c deleted file mode 100644 index 566c7d6cf3..0000000000 --- a/openair1/PHY/TOOLS/ALAW/companders.c +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @companders.c - implementation - * - * @copy Copyright (C) <2012> - * @author M A Chatterjee - * @version 1.01 M. A. Chatterjee, cleaned up naming - * - * This file contains integer math compander functions for analog/audio representations on - * embedded systems. Linear2Alaw derived from Mark Spencer, Sun Microsystem and from - * the A Law specification - * - * @license: - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - */ - -#include "companders.h" - -DIO_s8 DIO_LinearToALaw(DIO_s16 sample) -{ - const DIO_s16 cClip = 32635; - const static DIO_s8 LogTable[128] = - { - 1,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - }; - - DIO_s32 sign, exponent, mantissa; - DIO_s8 compandedValue; - - sample = (sample ==-32768) ? -32767 : sample; - sign = ((~sample) >> 8) & 0x80; - if (!sign) - sample = (short)-sample; - if (sample > cClip) - sample = cClip; - if (sample >= 256) - { - exponent = (int)LogTable[(sample >> 8) & 0x7F]; - mantissa = (sample >> (exponent + 3) ) & 0x0F; - compandedValue = ((exponent << 4) | mantissa); - } - else - { - compandedValue = (unsigned char)(sample >> 4); - } - compandedValue ^= (sign ^ 0x55); - return compandedValue; -} - -DIO_s16 DIO_ALawToLinear(DIO_s8 aLawByte) -{ - const static DIO_s16 ALawDecompTable[256]={ - 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, - 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, - 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, - 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, - 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, - 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, - 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, - 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, - 344, 328, 376, 360, 280, 264, 312, 296, - 472, 456, 504, 488, 408, 392, 440, 424, - 88, 72, 120, 104, 24, 8, 56, 40, - 216, 200, 248, 232, 152, 136, 184, 168, - 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, - 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, - 688, 656, 752, 720, 560, 528, 624, 592, - 944, 912, 1008, 976, 816, 784, 880, 848, - -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, - -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, - -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, - -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, - -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944, - -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136, - -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472, - -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568, - -344, -328, -376, -360, -280, -264, -312, -296, - -472, -456, -504, -488, -408, -392, -440, -424, - -88, -72, -120, -104, -24, -8, -56, -40, - -216, -200, -248, -232, -152, -136, -184, -168, - -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, - -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, - -688, -656, -752, -720, -560, -528, -624, -592, - -944, -912, -1008, -976, -816, -784, -880, -848}; - DIO_s16 addr = ((DIO_s16)aLawByte)+128; // done for compilers with poor expr type enforcement - return ALawDecompTable[addr]; -} - -// see companders.h -// fixed-radix IIR averager implementation supporting arbitrarily chosen windows -DIO_s32 DIO_IIRavgFR (DIO_s32 prevAvg, DIO_u16 windowLen, DIO_s16 newSample, DIO_u8 radix) -{ - DIO_s32 iirAvg=0; - iirAvg = ((prevAvg * (windowLen-1)) + (DIO_I2FR(newSample,radix)))/windowLen; - return iirAvg; -} - -// see companders.h -// fixed-radix IIR averager implementation using power-of-2 sized windows -// and only shift operations for cpu efficiency -DIO_s32 DIO_IIRavgPower2FR (DIO_s32 prevAvg, DIO_u8 windowLenInBits, DIO_s16 newSample, DIO_u8 radix) -{ - DIO_s32 iirAvg=0; - iirAvg = (((prevAvg<>windowLenInBits; - return iirAvg; -} - - -#ifdef MAIN - -int main(int argc, char* argv[]) -{ - - - - return 0; -} - -#endif diff --git a/openair1/PHY/TOOLS/ALAW/companders.h b/openair1/PHY/TOOLS/ALAW/companders.h deleted file mode 100644 index 4d1ab33f19..0000000000 --- a/openair1/PHY/TOOLS/ALAW/companders.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @companders.h - header definition file for embedded companding routines - * - * @copy Copyright (C) <2001-2012> - * @author M A Chatterjee - * @version 1.01 M. A. Chatterjee, cleaned up naming - * - * This file contains integer math settable fixed point radix math routines for - * use on systems in which floating point is not desired or unavailable. - * - * @license: - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - */ - -#ifndef __DIO_Compand_h__ -#define __DIO_Compand_h__ - -#ifdef __cplusplus -extern "C" -{ -#endif - -//"DIO" prefixes are to assist in prevent name collisions if global namespace is used. - -//typedefs ... change for platform dependant register size -// u/s = unsigned/signed 8/16/32 = num of bits -// keywords "int" and "long" in C/C++ are platform dependant -typedef unsigned char DIO_u8 ; -typedef signed char DIO_s8 ; -typedef unsigned short DIO_u16 ; -typedef signed short DIO_s16 ; -typedef unsigned long DIO_u32 ; -typedef signed long DIO_s32 ; - -// macros for converting from Fixed-Radix to integer, vice-versa -// r represents radix precision in bits, converts to/from integer w truncation -#define DIO_I2FR(x,r) ((x)<<(r)) -#define DIO_FR2I(x,r) ((x)>>(r)) - - -// convert FR to double, this is for debug only and WILL NOT compile under many embedded systems. -// use this in test harnesses. Since this is a macro if its not used it won't expand / link -#define DIO_FR2D(x,r) ((double)(((double)(x))/((double)(1<<(r))))) - -//convert signed linear 16 bit sample to an 8 bit A-Law companded sample -DIO_s8 DIO_LinearToALaw(DIO_s16 sample); - -//convert 8bit Alaw companded representation back to linear 16 bit -DIO_s16 DIO_ALawToLinear(DIO_s8 aLawByte); - - -//DC Offset correction for integer companders -//IIR: y_0=(y_1*(w-1)+x_0)/(w) -//where w is the window length -//below are fixed radix precision IIR averagers which allow runtime tradeoffs for windowLen & precision -//Note that (windowLen)*(1< - * @author M A Chatterjee - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - */ - -#include -#include - - -#include "companders.h" - - -//=============================================== -//main program for testing the functions -int main (int argc, char *argv[]) -{ - int ret_val = 0; - int i=0,j=0; - printf("\n============================================================\n"); - printf("compandit library quikie program\n"); - printf("M. A. Chatterjee (c) 2012\n\n"); - printf("These routines were developed for use on embedded projects\n"); - printf("for more info see the accompanying compand.txt\n"); - printf("\n"); - - //uncomment to - //show how linear-->alaw-->linear-->alaw progression / quantization error works - /* - - { - char alaw=0,alaw2; - short rev=0; - - for (i= -32768; i <= 32767; i++) - { - alaw = DIO_LinearToALaw((short)i); - rev = DIO_ALawToLinear(alaw); - alaw2 =DIO_LinearToALaw(rev); - if (alaw != alaw2) - printf("***********"); - printf("%7d %7d %7d %7d\n",i,(int)alaw,(int)rev,(int)alaw2); - } - } - - - // IIR averager examples - //IIR window length of 8 samples, using fractional precision of 4 bits - { - int a3=0, a4=0; - unsigned char rad=4; //4 bits fixed-radix fractional precision - printf(" index wave IIRav(i) IIRav(f) IIRavP2(i) IIRavP2(f)\n"); - for (i=0; i < 300; i++) - { - j=(i&0x3f)-20; // triangle wave with range -20 to + 43 - a3= DIO_IIRavgFR(a3,8,j,rad); - a4= DIO_IIRavgPower2FR(a4,3,j,rad); - printf("%6d %6d %6d %9.4f %6d %9.4f \n",i,j, - DIO_FR2I(a3,rad),DIO_FR2D(a3,rad) ,DIO_FR2I(a4,rad),DIO_FR2D(a4,rad)); - } - } - //IIR window length of 64 samples - { - int a3=0, a4=0; - unsigned char rad=6; //rad is the number of bits of precision - printf(" index wave IIRav(i) IIRav(f) IIRavP2(i) IIRavP2(f)\n"); - for (i=0; i < 300; i++) - { - j=(i&0x3f)-20; // triangle wave with range -20 to + 43 - a3= DIO_IIRavgFR(a3,64,j,rad); - a4= DIO_IIRavgPower2FR(a4,6,j,rad); - printf("%6d %6d %6d %9.4f %6d %9.4f \n",i,j, - DIO_FR2I(a3,rad),DIO_FR2D(a3,rad) ,DIO_FR2I(a4,rad),DIO_FR2D(a4,rad)); - } - } - // */ - //Typical microcontroller application. See readme-companders.txt - // the input here simulates an A/D which has a range 0..3.3V mapped as 12 bits (0..4095) - // with a DC bias of 1.55V ==> (1.55/3.3)*4095 counts = 1923 counts - - //now window length of 256 is used for rejecting the resistor bias. at 8KHz this window - // would be approx 8000/256 ~= 31 Hz (not quite but explaining Z xforms is beyond what - // can be explained in this small space.) - //we seed the DC average at 3.3/2 = 1.65V (we guess its in the middle) and let the long window - //length hone in on the correct value. (1.65V/3.3V) *4095 = 2048 counts - { - int actualDCbias =1923; - int calculatedDCbias =2048; //2048 is our initial estimate as outlined above - unsigned char windowLenPow2InBits = 8; // 8 bit long window = 256 sample long window - unsigned char rad=6; //rad is the number of bits of precision - - calculatedDCbias = DIO_I2FR(calculatedDCbias,rad); - printf(" index wave actDCbias calcDCbias calcDCbias(f) alaw\n"); - for (i=0; i < 1000; i++) // if 8000 hz sample rate this represents the number of samples captured - { - j=(((i&0x3f)<<1)-63)+1923; // triangle wave w range 0..127 with a bias set at actualDCbias - calculatedDCbias = DIO_IIRavgPower2FR(calculatedDCbias,windowLenPow2InBits,j,rad); - printf("%6d %6d %6d %6d %9.4f %3d\n",i,j,actualDCbias, - DIO_FR2I(calculatedDCbias,rad),DIO_FR2D(calculatedDCbias,rad), - (int)(DIO_LinearToALaw(j-DIO_FR2I(calculatedDCbias,rad)) )); - } - } - printf("\n"); - return ret_val; -} - diff --git a/openair1/PHY/TOOLS/ALAW/readme-companders.txt b/openair1/PHY/TOOLS/ALAW/readme-companders.txt deleted file mode 100644 index dbedc91788..0000000000 --- a/openair1/PHY/TOOLS/ALAW/readme-companders.txt +++ /dev/null @@ -1,185 +0,0 @@ -/** - * @readme-companders.txt - using compander.c / .h and related functions - * - * @copy Copyright (C) <2001-2012> - * @author M A Chatterjee - * - * This document is a brief overview of the simple compander library with - * a small introductory disucssion about fixed radix math IIRs for microcontrollers - * - * @license: - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - */ - -Welcome... - -The accompanying companders.c contains a small set of functions written in C using only integer math for companding operations. I developed this several years ago for use in several embedded interized math projects and this small, slightly cleaned up version is made available for the public here. It worked very well on M*CORE, 80x86 and ARM processors for small embedded systems. - -usage: -#include "companders.h" -no other dependancies are required. -compile and link companders.c - - -*********************** -About companding... - -Companding is a special type of lossy compression in which linear format samples are converted to logarithmic representation in order to preserve dynamic range of the original linear sample at the expense of uniform precision. Companding is an old method and is free of patents (all have expired). - -Theory of how companding works: -Suppose that we have a signed 16 bit linear sample in 2's complement math. The range of this sample can vary from -32768 to + 32767 in integer steps. Now lets put the constraint that we only have 8 bits with which to represent the data not the full 16 bits of the original linear number. A simple way to preserve high order information would be to linearly truncate off the lower 8 bits giving us a signed number from -128 to +127. We could make a mental note to keep track of the fact that we lost the lower 8 bits and so when use this representation we multiply by 8 bits (or 256) to preserve the input range. -so: --128 * 256 = -32768 --127 * 256 = -32512 -... - -1 * 256 = -256 - 0 * 256 = 0 - 1 * 256 = 256 - 2 * 256 = 512 -... - 126 * 256 = 32256 - 127 * 256 = 32512 - - Notice that the steps between these linearly rounded off samples are quite large. This truncated 8 bit representation would be very good at representing a linear quantity system such as linear displacement transducer which moves through its whole range as part of normal operation (like a door). but terrible at logarithmic phenomonen such as audio. Audio information tends to be grouped around zero with occaisonaly peaks of loudness. So with linear quantization soft audio would be lost due to the large quanitization steps at low volumes. To address this companders were developed for use in landline telephony for compressing audio data logarithmically instead of linearly. Hence we use more bits for audio samples near zero and less with audio samples near the integer max extremes. - -A-Law and it cousin mu-Law are companders. Rather than represent samples in linear steps the more bits are allocated to samples near zero while larger magnitude (positive or negative) samples are represented with proportionately larger interval sizes. - -Differential encoding (taking the difference of neighboring samples) can greatly help with compressing data to where we "have more bits" as well, provided samples rates are fast enough. Telephony typically operated with 8 bit non-differential (companded) samples at 8KHz. - -In A-Law the following table (in bits) shows how a 13 bit signed linear integer is companded in to A-Law: -(source is Sun microsystems, a similar table is on wikipedia or the G.711 specification). - - * Linear Input Code Compressed Code - * ------------------------ --------------- - * 0000000wxyza 000wxyz - * 0000001wxyza 001wxyz - * 000001wxyzab 010wxyz - * 00001wxyzabc 011wxyz - * 0001wxyzabcd 100wxyz - * 001wxyzabcde 101wxyz - * 01wxyzabcdef 110wxyz - * 1wxyzabcdefg 111wxyz - - - About this library: - - This free library supports A-Law and IIR averages. A-Law is used for the companding while the IIR averagers can be used for for embedded ADCs where the zero point is set loosely. Since the companders are sensitive, and allocate more bits, to values near zero its important to define a good zero. For example a microcontroller has a pin with an ADC which is fed digitized audio signal. The smallest value for the microtroncoller is 0V = 0x00 and the 3.3V = 0x3ff for 10 effective bits of resolution. A resisitive analog divider is used to center the ADC near the half-input range or about 1.6V while the audio is capacitively coupled as shown here: - - +3.3V - | - R - | - uC_ADC_Pin-----------C----audio_input - | - R - | - GND - - However cheap resistors have tolerances 5 to 10%, so the setpoint voltage could easily be anywhere from 1.4 to 1.8V. To address this software should read the ADC before audio is coming in and determine the actual DC bias voltage set by the resistors. Then when audio is coming in this value is subtracted from the ADC input to give a signed number which is fed to the LinearToAlaw encoder. - - If it not easily possible to turn off the analog / audio source then the long term DC average can be inferred by using one of the IIR functions included here with a long window length (perhaps 2000 samples if sampling at 8 KHz or about 1/4 second). These IIR functions are cheap to run in realtime even with reasonably high sample rates as they take little memory and are simple integer-math IIRs. - - About the Fixed Radix (FR) Math IIR averages - -The (Infinite Impulse Reponse) IIR functions included here use fixed radix math to represent fractional parts of an integer. By providing a settable radix (amount of bits devoted to fractional resolution), the programmer can make tradeoffs between resolution and dynamic range. The larger the radix specified the more bits that will be used in the fractional portion of the representation, which for smaller window sizes may not by necessary. There are more comprehensive ways to deal with fractional representation in binary systems (floating point, bigNum / arbitrary length registers, separation of numerator/denomators etc) but these incur much larger compute/code/memory overhead. The simple system used here avoids the need for testing for overflow/underflow which allows for low foot print code/cpu/memory bandwidth. - - To calculate how many bits of fractional part while preventing overflow use the following formulas: - -Nb = number of bits in use = ceiling(log2(highest_number_represented)) - -radix = 32-Nb(sample_resolution)-Nb(WindowLength)-2 - -for example if you have a ADC generating counts from 0 to 1023 then the Nb(ADC-range) = - Nb = ceiling(log2(1023)) = 10 bits - -If you use a DC average window length of 2000 - Nb = ceiling(log2(2000)) = 11 bits - -so the max radix that should be specified is: - radix = 32 - 10 - 11 - 2 = 32 - 23 = 9 bits - -with 9 bits in the radix fractional precision of 512 units per integer (e.g 1/512) is possible. The "2" in for formula comes from reserving bits for the sign bit and the additional operation in averager. - -The function DIO_s32 DIO_IIRavgFR() allows any integer length window size to be used, while the function DIO_IIRavgPower2FR() specifies window lengths in powers of two but all calculations are based on shift operations which can be significantly faster on lower end microprocessors. - - - -Embedded Systems - -Now back to an embedded microcontroller example. It has a ADC which maps the voltage on 1 pin from 0-3.3V in to 0-4095 counts (12 bit). We capacitively couple the input voltage and use the bias resistors to set mid point in the center of the range. Lets say the the our resistors set the bias at 1.55V. This equals our "zero point". Below this point is negative from the incoming capacitively coupled audio and above this is positive. - -Our "guess" as to the bias = both resistors are the same = (3.3V/2) =1.65V = (1.65V)/(4095 counts/3.3V)= 2048 counts - -Resistor actual set bias "zero point" = 1.55V = (1.55V) *(4095 counts/3.3V)) = 1923 counts -We want this to be "zero" we use for the companded A/D process. - -To do this we start our ADC to periodically sample for sometime before we start "recording" audio. We will feed the ADC values in to our IIR average to find the actual zero point. Note that even when we decide not to "record" we still can still run the A/D and IIR averager so its adapting to the real zero point. - - - -//C-like psuedo code - -#include "companders.h" - -static volatile int32 gIIRavg= 2048; // global static var holds DC average -static volatile int gDoSomethingWithCompandedValue=0; -void processAudioSample() //interrupt handler -{ - short adcValue; - char aLawValue; - - //read the raw uncorrected sample - adcValue= inputPin.read_u16(); // read a 16 bit unsigned sample - - // this updates the IIR average everytime the adc returns a sample - gIIRavg = DIO_IIRavgPower2FR(gIIRavg,11,adcValue,8); - - //now compute companded value with DC offset correction - if (gDoSomethingWithCompandedValue) - { - aLawValue = DIO_LinearToALaw(adcValue-DIO_FR2I(gIIRavg)); - doSomethingWithALaw(aLawValue); // store it to a buffer, send it etc - } -} - -main() -{ - gDoSomethingWithCompandedValue=0; - inputPin.attachInterrupt(&processAudioSample,8000); //attach interrupt handler, 8000 Hz sample rate - - // ... somepoint later in the code - - inputPin.start(); // start the averager - - // ... some time later - gDoSomethingWithCompandedValue=1; //now the interrupt routine will call the doSomethingWithALaw() function - - // ... some time later - gDoSomethingWithCompandedValue=0; //we're no longer collecting ALaw companded date, but we're - // still running the IIR averager - - -} - -Finally, it can be in some systems that we can't turn off the audio input source it may be hard wired to some sensor or mic or perhaps the A/D center bias circuit (the 2 resistors) always is on when the audio is on. In this case running the IIR with a long filter length all the time can remove the bias even when the audio is running. For example in an 8KHz sampling system with an IIR length of 1024 is about 1/8 of a second or a cutoff freq well below 10Hz and costs almost nothing to run. - - - diff --git a/openair1/PHY/TOOLS/ALAW/alaw_lut.h b/openair1/PHY/TOOLS/alaw_lut.h similarity index 100% rename from openair1/PHY/TOOLS/ALAW/alaw_lut.h rename to openair1/PHY/TOOLS/alaw_lut.h From c32304afbf62be70b61e83ae7d340b0e80767f42 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Wed, 6 Jul 2016 01:34:12 +0530 Subject: [PATCH 098/340] allow rf and if for eNB build --- cmake_targets/build_oai | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 28ded73d7b..ceb3400d0e 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -296,9 +296,6 @@ function main() { if [ "$HW" = "None" -a "$TP" = "None" ] ; then echo_fatal "Define a local radio head (e.g. -w EXMIMO) or a transport protocol (e.g. -t ETHERNET) to communicate with a remote radio head!" fi - if [ "$HW" != "None" -a "$TP" != "None" ] ; then - echo_fatal "Currently eNB can not support simultaniously local and remote radio heads!!" - fi if [ "$HW" = "None" ] ; then echo_info "No radio head has been selected (HW set to $HW)" fi From 622f91735155fac1ebbed5204697091a574b6a98 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Wed, 6 Jul 2016 03:02:53 +0530 Subject: [PATCH 099/340] adjust spp for whole number per subframe --- .../ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 81e3d7b558..0ec8971ba8 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -83,7 +83,7 @@ int trx_eth_start(openair0_device *device) { if(eth_get_dev_conf_raw_IF4(device)!=0) return -1; } /* adjust MTU wrt number of samples per packet */ - if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; + if(ethernet_tune (device,MTU_SIZE,RAW_IF4_PRACH_SIZE_BYTES)!=0) return -1; } else if (eth->flags == ETH_UDP_IF4_MODE) { @@ -107,8 +107,6 @@ int trx_eth_start(openair0_device *device) { } else { if(eth_get_dev_conf_udp(device)!=0) return -1; } - /* adjust MTU wrt number of samples per packet */ - //if(ethernet_tune (device,MTU_SIZE,UDP_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; } /* apply additional configuration */ if(ethernet_tune (device, SND_BUF_SIZE,2000000000)!=0) return -1; @@ -386,8 +384,6 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth device->priv = eth; /* device specific */ - //openair0_cfg[0].txlaunch_wait = 0;//manage when TX processing is triggered - //openair0_cfg[0].txlaunch_wait_slotcount = 0; //manage when TX processing is triggered openair0_cfg[0].iq_rxrescale = 15;//rescale iqs openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; @@ -397,19 +393,19 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth /*Note scheduling advance values valid only for case 7680000 */ switch ((int)openair0_cfg[0].sample_rate) { case 30720000: - openair0_cfg[0].samples_per_packet = 4096; + openair0_cfg[0].samples_per_packet = 3840; break; case 23040000: - openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].samples_per_packet = 2880; break; case 15360000: - openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].samples_per_packet = 1920; break; case 7680000: - openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].samples_per_packet = 960; break; case 1920000: - openair0_cfg[0].samples_per_packet = 256; + openair0_cfg[0].samples_per_packet = 240; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); From 8dcc3ddb4d7aac790d3867e63c04026f67e137c7 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 6 Jul 2016 09:56:13 +0200 Subject: [PATCH 100/340] if_defs and eth_lib .h cleanup --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 1 - openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c | 1 - targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 3 --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 1 - targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c | 1 - targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 3 +++ 6 files changed, 3 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 587d139422..a0e4d2e3f7 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -39,7 +39,6 @@ */ #include "PHY/defs.h" -#include "PHY/LTE_TRANSPORT/if4_tools.h" #include "PHY/TOOLS/alaw_lut.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" diff --git a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c index d38dfb76a5..ab60c2fb0f 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c @@ -39,7 +39,6 @@ */ #include "PHY/defs.h" -#include "PHY/LTE_TRANSPORT/if5_mobipass_tools.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index bf5554fd26..699d15350b 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -51,9 +51,6 @@ #include "common_lib.h" #include "ethernet_lib.h" -#include "if_defs.h" -#include "openair1/PHY/LTE_TRANSPORT/if4_tools.h" -#include "openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h" #define DEBUG 0 diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index 55b5e08535..a9706c73bd 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -52,7 +52,6 @@ #include "common_lib.h" #include "ethernet_lib.h" -#include "if_defs.h" #define DEBUG 0 struct sockaddr_in dest_addr[MAX_INST]; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 0ec8971ba8..f29375dac3 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -51,7 +51,6 @@ #include "common_lib.h" #include "ethernet_lib.h" -#include "if_defs.h" int num_devices_eth = 0; struct sockaddr_in dest_addr[MAX_INST]; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index e17890836b..86f580d911 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -41,6 +41,9 @@ #include #include +#include "PHY/LTE_TRANSPORT/if4_tools.h" +#include "PHY/LTE_TRANSPORT/if5_mobipass_tools.h" + // ETH transport preference modes #define ETH_UDP_MODE 0 #define ETH_RAW_MODE 1 From b5fbdbe252734c0725f6251d8e0e626f7bd1814e Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 6 Jul 2016 12:23:00 +0200 Subject: [PATCH 101/340] test if5 send from BBU with new spp --- cmake_targets/CMakeLists.txt | 2 +- .../PHY/LTE_TRANSPORT/if5_mobipass_tools.c | 99 ----------- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 165 ++++++++++++++++++ .../{if5_mobipass_tools.h => if5_tools.h} | 7 +- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 2 +- targets/RT/USER/lte-enb.c | 4 +- 6 files changed, 174 insertions(+), 105 deletions(-) delete mode 100644 openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c create mode 100644 openair1/PHY/LTE_TRANSPORT/if5_tools.c rename openair1/PHY/LTE_TRANSPORT/{if5_mobipass_tools.h => if5_tools.h} (90%) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index f96c63f2bb..a39cf35f6a 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -963,7 +963,7 @@ set(PHY_SRC ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/print_stats.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/initial_sync.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_mobipass_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c diff --git a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c deleted file mode 100644 index ab60c2fb0f..0000000000 --- a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.c +++ /dev/null @@ -1,99 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file PHY/LTE_TRANSPORT/if5_mobipass_tools.c -* \brief -* \author S. Sandeep Kumar, Raymond Knopp -* \date 2016 -* \version 0.1 -* \company Eurecom -* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr -* \note -* \warning -*/ - -#include "PHY/defs.h" - -#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" - - -void send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t *seqno) { - - LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - void *txp[fp->nb_antennas_tx]; - void *tx_buffer=NULL; - __m128i *data_block=NULL, *data_block_head=NULL; - - __m128i *txp128; - __m128i t0, t1; - - uint16_t packet_id=0, i; - uint16_t db_fulllength=640; - - tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); - IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block_head = (__m128i *)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4); - - header->flags = 0; - header->fifo_status = 0; - header->seqno = *seqno; - header->ack = 0; - header->word0 = 0; - - txp[0] = (void*)&eNB->common_vars.txdata[0][0][proc->subframe_tx*eNB->frame_parms.samples_per_tti]; - txp128 = (__m128i *) txp[0]; - - for (packet_id=0; packet_id<(fp->samples_per_tti*2)/db_fulllength; packet_id++) { - header->time_stamp = proc->timestamp_tx + packet_id * db_fulllength; - data_block = data_block_head; - - for (i=0; i>3; i+=2) { - t0 = _mm_srli_epi16(*txp128++, 4); - t1 = _mm_srli_epi16(*txp128++, 4); - - *data_block++ = _mm_packs_epi16(t0, t1); - } - - // Write the packet to the fronthaul - if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, - packet_id, - &tx_buffer, - db_fulllength, - 1, - IF5_MOBIPASS)) < 0) { - perror("ETHERNET write for IF5_MOBIPASS\n"); - } - - header->seqno += 1; - } - - *seqno = header->seqno; - free(tx_buffer); - return; -} diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c new file mode 100644 index 0000000000..ffa1df5863 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -0,0 +1,165 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/*! \file PHY/LTE_TRANSPORT/if5_tools.c +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +#include "PHY/defs.h" + +#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" + + +void send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t *seqno, uint16_t packet_type) { + + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + void *txp[fp->nb_antennas_tx]; + void *tx_buffer=NULL; + + uint16_t packet_id=0, i=0; + + if (packet_type == IF5_RRH_GW) { + + unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; + unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; + + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] = (void*)&eNB->common_vars.txdata[0][i][proc->subframe_tx*fp->samples_per_tti]; + + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + eNB->ifdevice.trx_write_func(&eNB->ifdevice, + (proc->timestamp_tx-eNB->ifdevice.openair0_cfg->tx_sample_advance + packet_id*spp_eth), + txp, + spp_eth, + fp->nb_antennas_tx, + 0); + } + + printf("SPP = %d and packet_id %d\n", spp_eth, packet_id); + + } else if (packet_type == IF5_MOBIPASS) { + + uint16_t db_fulllength=640; + + __m128i *data_block=NULL, *data_block_head=NULL; + + __m128i *txp128; + __m128i t0, t1; + + tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block_head = (__m128i *)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4); + + header->flags = 0; + header->fifo_status = 0; + header->seqno = *seqno; + header->ack = 0; + header->word0 = 0; + + txp[0] = (void*)&eNB->common_vars.txdata[0][0][proc->subframe_tx*eNB->frame_parms.samples_per_tti]; + txp128 = (__m128i *) txp[0]; + + for (packet_id=0; packet_id<(fp->samples_per_tti*2)/db_fulllength; packet_id++) { + header->time_stamp = proc->timestamp_tx + packet_id * db_fulllength; + data_block = data_block_head; + + for (i=0; i>3; i+=2) { + t0 = _mm_srli_epi16(*txp128++, 4); + t1 = _mm_srli_epi16(*txp128++, 4); + + *data_block++ = _mm_packs_epi16(t0, t1); + } + + // Write the packet to the fronthaul + if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, + packet_id, + &tx_buffer, + db_fulllength, + 1, + IF5_MOBIPASS)) < 0) { + perror("ETHERNET write for IF5_MOBIPASS\n"); + } + + header->seqno += 1; + } + *seqno = header->seqno; + } else { + AssertFatal(1==0, "send_IF5 - Unknown packet_type %x", packet_type); + } + + free(tx_buffer); + return; +} + + +void recv_IF5(PHY_VARS_eNB *eNB, eNB_proc_t *proc, uint16_t packet_type) { + + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + void *rxp[fp->nb_antennas_rx]; + void *rx_buffer=NULL; + + uint16_t packet_id=0, i=0; + + if (packet_type == IF5_RRH_GW) { + + unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; + unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; + + openair0_timestamp timestamp[spsf / spp_eth]; + + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][proc->subframe_rx*fp->samples_per_tti]; + + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + eNB->ifdevice.trx_read_func(&eNB->ifdevice, + ×tamp[packet_id], + rxp, + spp_eth, + fp->nb_antennas_rx); + } + +// proc->timestamp_rx = timestamp[0]; + + } else if (packet_type == IF5_MOBIPASS) { + + + } else { + AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type); + } + + free(rx_buffer); + return; +} diff --git a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h b/openair1/PHY/LTE_TRANSPORT/if5_tools.h similarity index 90% rename from openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h rename to openair1/PHY/LTE_TRANSPORT/if5_tools.h index e9bc26f9a6..07d6865a54 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_mobipass_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.h @@ -27,7 +27,7 @@ *******************************************************************************/ -/*! \file PHY/LTE_TRANSPORT/if5_mobipass_tools.h +/*! \file PHY/LTE_TRANSPORT/if5_tools.h * \brief * \author S. Sandeep Kumar, Raymond Knopp * \date 2016 @@ -41,6 +41,7 @@ #include #include "PHY/defs.h" +#define IF5_RRH_GW 0x0022 #define IF5_MOBIPASS 0xbffe struct IF5_mobipass_header { @@ -62,4 +63,6 @@ struct IF5_mobipass_header { typedef struct IF5_mobipass_header IF5_mobipass_header_t; #define sizeof_IF5_mobipass_header_t 14 -void send_IF5(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint8_t*); +void send_IF5(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint8_t*, uint16_t); + +void recv_IF5(PHY_VARS_eNB*, eNB_proc_t*, uint16_t); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 86f580d911..8fb84e37fc 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -42,7 +42,7 @@ #include #include "PHY/LTE_TRANSPORT/if4_tools.h" -#include "PHY/LTE_TRANSPORT/if5_mobipass_tools.h" +#include "PHY/LTE_TRANSPORT/if5_tools.h" // ETH transport preference modes #define ETH_UDP_MODE 0 diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 7f8988dd0d..9111fe42c6 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -69,7 +69,7 @@ //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all #include "PHY/LTE_TRANSPORT/if4_tools.h" -#include "PHY/LTE_TRANSPORT/if5_mobipass_tools.h" +#include "PHY/LTE_TRANSPORT/if5_tools.h" #include "PHY/extern.h" #include "SCHED/extern.h" @@ -549,7 +549,7 @@ static void* eNB_thread_rxtx( void* param ) { } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { /// **** trx_write_func to IF device **** /// - send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, &seqno); + send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, &seqno, IF5_RRH_GW); } else { /// **** send_IF4 of txdataF to RRU **** /// From 25952d4450d432fdf155b200525fca8124a0e809 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 6 Jul 2016 17:08:26 +0200 Subject: [PATCH 102/340] added node fn RRU_IF5, split points and vcd logging --- openair1/PHY/defs.h | 7 ++-- openair1/SCHED/phy_procedures_lte_eNb.c | 18 ++++++++-- openair2/UTIL/LOG/vcd_signal_dumper.c | 6 ++-- openair2/UTIL/LOG/vcd_signal_dumper.h | 6 ++-- targets/RT/USER/lte-enb.c | 35 +++++++++++++----- targets/RT/USER/lte-softmodem.c | 47 ++++++++----------------- 6 files changed, 67 insertions(+), 52 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 70a661adf0..f9a4596129 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -158,10 +158,11 @@ enum transmission_access_mode { CBA_ACCESS}; typedef enum { - eNodeB_3GPP=0, // classical eNodeB function + eNodeB_3GPP=0, // classical eNodeB function eNodeB_3GPP_BBU, // eNodeB with NGFI IF5 - NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) - NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) + NGFI_RRU_IF5, // NGFI_RRU with IF5 + NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) + NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) } eNB_func_t; typedef struct UE_SCAN_INFO_s { diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index a81e9dcfad..db069c6440 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2546,7 +2546,8 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) - if ((eNB->node_function == NGFI_RRU_IF4) || + if ((eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == NGFI_RRU_IF5) || (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF for (i=0; inb_antennas_rx; i++) @@ -2586,7 +2587,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); } else if(eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF - /// **** trx_read_func from IF device **** /// + /// **** recv_IF5 of rxdata from RRH **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); + nanosleep(&time_req, &time_rem); proc->timestamp_rx += fp->samples_per_tti; @@ -2598,7 +2603,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); } - + + if (eNB->node_function == NGFI_RRU_IF5) { + /// **** send_IF5 of rxdata to BBU **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); + //send_IF5(eNB, proc, ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); + + } if ((eNB->node_function == NGFI_RRU_IF4) || (eNB->node_function == eNodeB_3GPP) || diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 73abd5d698..8fe33fefd5 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -331,9 +331,11 @@ const char* eurecomFunctionsNames[] = { "itti_relay_thread", "test", - /* IF4 signals */ + /* IF4/IF5 signals */ "send_if4", - "recv_if4" + "recv_if4", + "send_if5", + "recv_if5" }; struct vcd_module_s vcd_modules[VCD_SIGNAL_DUMPER_MODULE_END] = { diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index b6d0072603..7bcdc5733b 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -308,10 +308,12 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_RELAY_THREAD, VCD_SIGNAL_DUMPER_FUNCTIONS_TEST, - /* IF4 signals */ + /* IF4/IF5 signals */ VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, - + VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, + VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, + VCD_SIGNAL_DUMPER_FUNCTIONS_LAST, VCD_SIGNAL_DUMPER_FUNCTIONS_END = VCD_SIGNAL_DUMPER_FUNCTIONS_LAST, } vcd_signal_dump_functions; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 9111fe42c6..0668764edd 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -436,7 +436,9 @@ static void* eNB_thread_rxtx( void* param ) { if (oai_exit) break; // UE-specific RX processing for subframe n - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { + if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); // this is the ue-specific processing for the subframe and can be multi-threaded later phy_procedures_eNB_uespec_RX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay ); @@ -474,7 +476,9 @@ static void* eNB_thread_rxtx( void* param ) { if (oai_exit) break; - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { + if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) { phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay, NULL ); /* we're done, let the next one proceed */ @@ -491,8 +495,7 @@ static void* eNB_thread_rxtx( void* param ) { exit_fun("nothing to add"); break; } - } else { - + } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) { /// **** recv_IF4 of txdataF from RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); do { @@ -500,11 +503,19 @@ static void* eNB_thread_rxtx( void* param ) { } while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5) { + /// **** recv_IF5 of txdata from BBU **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); + //recv_IF5(); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); + } } // eNodeB_3GPP, _BBU and RRU create txdata - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) { + if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); @@ -526,8 +537,9 @@ static void* eNB_thread_rxtx( void* param ) { // eNodeB_3GPP, RRU write to RF device - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP || - PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) { + if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5)) { // Transmit TX buffer based on timestamp from RX VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers @@ -548,14 +560,17 @@ static void* eNB_thread_rxtx( void* param ) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { - /// **** trx_write_func to IF device **** /// + /// **** send_IF5 of txdata to RRH **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, &seqno, IF5_RRH_GW); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); } else { /// **** send_IF4 of txdataF to RRU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + } if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { @@ -759,7 +774,9 @@ static void* eNB_thread_rx_common( void* param ) { } // Start RF device for this CC - if (eNB->node_function == eNodeB_3GPP || eNB->node_function == NGFI_RRU_IF4) { + if ((eNB->node_function == eNodeB_3GPP) || + (eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == NGFI_RRU_IF5)) { if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) LOG_E(HW,"Could not start the RF device\n"); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 656c22ced3..887f95a111 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -385,9 +385,11 @@ void help (void) { printf(" --ue-txgain set UE TX gain\n"); printf(" --ue-scan_carrier set UE to scan around carrier\n"); printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); - printf(" --RCC run using NGFI RCC node function\n"); - printf(" --RRU run using NGFI RRU node function\n"); + printf(" --RCC run using NGFI RCC node function IF4 split\n"); + printf(" --RRU run using NGFI RRU node function IF4 split\n"); printf(" --eNB run using 3GPP eNB node function\n"); + printf(" --BBU run using 3GPP eNB node function with IF5 split\n"); + printf(" --RRH run using RRH node function with IF5 split\n"); printf(" -C Set the downlink frequency for all component carriers\n"); printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); @@ -687,7 +689,8 @@ static void get_options (int argc, char **argv) LONG_OPTION_RCC, LONG_OPTION_RRU, LONG_OPTION_ENB, - LONG_OPTION_ENB_BBU + LONG_OPTION_ENB_BBU, + LONG_OPTION_RRH #if T_TRACER , LONG_OPTION_T_PORT, @@ -715,6 +718,7 @@ static void get_options (int argc, char **argv) {"RRU", no_argument, NULL, LONG_OPTION_RRU}, {"eNB", no_argument, NULL, LONG_OPTION_ENB}, {"BBU", no_argument, NULL, LONG_OPTION_ENB_BBU}, + {"RRH", no_argument, NULL, LONG_OPTION_RRH}, #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, @@ -821,6 +825,10 @@ static void get_options (int argc, char **argv) case LONG_OPTION_ENB_BBU: node_function = eNodeB_3GPP_BBU; break; + + case LONG_OPTION_RRH: + node_function = NGFI_RRU_IF5; + break; #if T_TRACER case LONG_OPTION_T_PORT: { @@ -1649,7 +1657,7 @@ int main( int argc, char **argv ) openair0_cfg[0].log_level = glog_level; for (CC_id=0; CC_idrfdevice.host_type = RRH_HOST; PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST; } else { @@ -1670,39 +1678,12 @@ int main( int argc, char **argv ) openair0.type = NONE_DEV; /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ openair0.transp_type = NONE_TP; - - // Legacy BBU - RRH init - //int returns=-1; - ///* BBU can have either a local or a remote radio head */ - //if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active - load library of radio head and initiate it - //if (mode!=loop_through_memory) { - //returns=openair0_device_load(&openair0, &openair0_cfg[0]); - //printf("openair0_device_init returns %d\n",returns); - //if (returns<0) { - //printf("Exiting, cannot initialize device\n"); - //exit(-1); - //} - //} - //else if (mode==loop_through_memory) { - //} - //} else { //remote radio head active - load library of transport protocol and initiate it - //if (mode!=loop_through_memory) { - //returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params); - //printf("openair0_transport_init returns %d\n",returns); - //if (returns<0) { - //printf("Exiting, cannot initialize transport protocol\n"); - //exit(-1); - //} - //} - //else if (mode==loop_through_memory) { - //} - //} - + int returns=-1; // Handle spatially distributed MIMO antenna ports // Load RF device and initialize - if (node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { + if (node_function == NGFI_RRU_IF5 || node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { for (CC_id=0; CC_idrfdevice), &openair0_cfg[0]); From f57a8b8c8f5891f126ce36e7433e355598629cc2 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 6 Jul 2016 18:28:57 +0200 Subject: [PATCH 103/340] changes to send/recv if5 --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 73 ++++++++++++++++++------- openair1/PHY/LTE_TRANSPORT/if5_tools.h | 7 ++- openair1/SCHED/phy_procedures_lte_eNb.c | 5 +- targets/RT/USER/lte-enb.c | 4 +- 4 files changed, 62 insertions(+), 27 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index ffa1df5863..afbe33bd7f 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -43,35 +43,47 @@ #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" -void send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t *seqno, uint16_t packet_type) { +void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe, uint8_t *seqno, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - void *txp[fp->nb_antennas_tx]; + void *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; void *tx_buffer=NULL; uint16_t packet_id=0, i=0; - if (packet_type == IF5_RRH_GW) { - + if (packet_type == IF5_RRH_GW_DL) { unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; for (i=0; i < fp->nb_antennas_tx; i++) - txp[i] = (void*)&eNB->common_vars.txdata[0][i][proc->subframe_tx*fp->samples_per_tti]; + txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { eNB->ifdevice.trx_write_func(&eNB->ifdevice, - (proc->timestamp_tx-eNB->ifdevice.openair0_cfg->tx_sample_advance + packet_id*spp_eth), - txp, + (proc_timestamp - eNB->ifdevice.openair0_cfg->tx_sample_advance + packet_id*spp_eth), + (txp + packet_id*spp_eth), spp_eth, fp->nb_antennas_tx, 0); } - printf("SPP = %d and packet_id %d\n", spp_eth, packet_id); - - } else if (packet_type == IF5_MOBIPASS) { + } else if (packet_type == IF5_RRH_GW_UL) { + unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; + unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; + + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + eNB->ifdevice.trx_write_func(&eNB->ifdevice, + (proc_timestamp + packet_id*spp_eth), + (rxp + packet_id*spp_eth), + spp_eth, + fp->nb_antennas_rx, + 0); + } + + } else if (packet_type == IF5_MOBIPASS) { uint16_t db_fulllength=640; __m128i *data_block=NULL, *data_block_head=NULL; @@ -89,11 +101,11 @@ void send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t *seqno, uint16_t header->ack = 0; header->word0 = 0; - txp[0] = (void*)&eNB->common_vars.txdata[0][0][proc->subframe_tx*eNB->frame_parms.samples_per_tti]; + txp[0] = (void*)&eNB->common_vars.txdata[0][0][subframe*eNB->frame_parms.samples_per_tti]; txp128 = (__m128i *) txp[0]; for (packet_id=0; packet_id<(fp->samples_per_tti*2)/db_fulllength; packet_id++) { - header->time_stamp = proc->timestamp_tx + packet_id * db_fulllength; + header->time_stamp = proc_timestamp + packet_id*db_fulllength; data_block = data_block_head; for (i=0; i>3; i+=2) { @@ -116,6 +128,7 @@ void send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t *seqno, uint16_t header->seqno += 1; } *seqno = header->seqno; + } else { AssertFatal(1==0, "send_IF5 - Unknown packet_type %x", packet_type); } @@ -125,34 +138,52 @@ void send_IF5(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t *seqno, uint16_t } -void recv_IF5(PHY_VARS_eNB *eNB, eNB_proc_t *proc, uint16_t packet_type) { +void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subframe, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - void *rxp[fp->nb_antennas_rx]; + void *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; void *rx_buffer=NULL; uint16_t packet_id=0, i=0; - if (packet_type == IF5_RRH_GW) { - + if (packet_type == IF5_RRH_GW_DL) { + unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; + unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; + + openair0_timestamp timestamp[spsf / spp_eth]; + + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti]; + + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + eNB->ifdevice.trx_read_func(&eNB->ifdevice, + ×tamp[packet_id], + (txp + packet_id*spp_eth), + spp_eth, + fp->nb_antennas_tx); + } + + *proc_timestamp = timestamp[0]; + + } else if (packet_type == IF5_RRH_GW_UL) { unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; openair0_timestamp timestamp[spsf / spp_eth]; for (i=0; i < fp->nb_antennas_rx; i++) - rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][proc->subframe_rx*fp->samples_per_tti]; + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], - rxp, + (rxp + packet_id*spp_eth), spp_eth, fp->nb_antennas_rx); } - -// proc->timestamp_rx = timestamp[0]; - + + *proc_timestamp = timestamp[0]; + } else if (packet_type == IF5_MOBIPASS) { diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.h b/openair1/PHY/LTE_TRANSPORT/if5_tools.h index 07d6865a54..f46897cc51 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.h @@ -41,7 +41,8 @@ #include #include "PHY/defs.h" -#define IF5_RRH_GW 0x0022 +#define IF5_RRH_GW_DL 0x0022 +#define IF5_RRH_GW_UL 0x0023 #define IF5_MOBIPASS 0xbffe struct IF5_mobipass_header { @@ -63,6 +64,6 @@ struct IF5_mobipass_header { typedef struct IF5_mobipass_header IF5_mobipass_header_t; #define sizeof_IF5_mobipass_header_t 14 -void send_IF5(PHY_VARS_eNB*, eNB_rxtx_proc_t*, uint8_t*, uint16_t); +void send_IF5(PHY_VARS_eNB*, openair0_timestamp, int, uint8_t*, uint16_t); -void recv_IF5(PHY_VARS_eNB*, eNB_proc_t*, uint16_t); +void recv_IF5(PHY_VARS_eNB*, openair0_timestamp*, int, uint16_t); diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index db069c6440..725bc60715 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -45,6 +45,7 @@ #include "SCHED/extern.h" #include "PHY/LTE_TRANSPORT/if4_tools.h" +#include "PHY/LTE_TRANSPORT/if5_tools.h" #ifdef EMOS #include "SCHED/phy_procedures_emos.h" @@ -2521,6 +2522,8 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl int prach_rx; + uint8_t seqno=0; + uint16_t packet_type; uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; @@ -2607,7 +2610,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (eNB->node_function == NGFI_RRU_IF5) { /// **** send_IF5 of rxdata to BBU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); - //send_IF5(eNB, proc, ); + send_IF5(eNB, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); } diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 0668764edd..ce4504ff0d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -506,7 +506,7 @@ static void* eNB_thread_rxtx( void* param ) { } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5) { /// **** recv_IF5 of txdata from BBU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); - //recv_IF5(); + recv_IF5(PHY_vars_eNB_g[0][proc->CC_id], &proc->timestamp_tx, proc->subframe_tx, IF5_RRH_GW_DL); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); } @@ -562,7 +562,7 @@ static void* eNB_thread_rxtx( void* param ) { } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { /// **** send_IF5 of txdata to RRH **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); - send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, &seqno, IF5_RRH_GW); + send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); } else { From 9cbf5819c143926a071142a097b8da06f9df8710 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Thu, 7 Jul 2016 11:27:50 +0200 Subject: [PATCH 104/340] fixes from bbu/rrh trial run --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 20 ++++++++++--- openair1/SCHED/phy_procedures_lte_eNb.c | 38 ++++++++++++++++--------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index afbe33bd7f..9fdd67c09e 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -59,9 +59,12 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] += packet_id*spp_eth; + eNB->ifdevice.trx_write_func(&eNB->ifdevice, (proc_timestamp - eNB->ifdevice.openair0_cfg->tx_sample_advance + packet_id*spp_eth), - (txp + packet_id*spp_eth), + txp, spp_eth, fp->nb_antennas_tx, 0); @@ -75,9 +78,12 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] += packet_id*spp_eth; + eNB->ifdevice.trx_write_func(&eNB->ifdevice, (proc_timestamp + packet_id*spp_eth), - (rxp + packet_id*spp_eth), + rxp, spp_eth, fp->nb_antennas_rx, 0); @@ -156,9 +162,12 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] += packet_id*spp_eth; + eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], - (txp + packet_id*spp_eth), + txp, spp_eth, fp->nb_antennas_tx); } @@ -175,9 +184,12 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + for (i=0; i < fp->nb_antennas_tx; i++) + rxp[i] += packet_id*spp_eth; + eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], - (rxp + packet_id*spp_eth), + rxp, spp_eth, fp->nb_antennas_rx); } diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 725bc60715..478ae20c30 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2592,29 +2592,33 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } else if(eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF /// **** recv_IF5 of rxdata from RRH **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); - + recv_IF5(eNB, &proc->timestamp_rx, proc->subframe_rx, IF5_RRH_GW_UL); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); - nanosleep(&time_req, &time_rem); - - proc->timestamp_rx += fp->samples_per_tti; + //nanosleep(&time_req, &time_rem); + //proc->timestamp_rx += fp->samples_per_tti; proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + if (proc->first_rx == 0) { + if (proc->subframe_rx != subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + //exit_fun("Exiting"); + } + if (proc->frame_rx != frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + //exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + } + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); } - if (eNB->node_function == NGFI_RRU_IF5) { - /// **** send_IF5 of rxdata to BBU **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); - send_IF5(eNB, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); - - } - if ((eNB->node_function == NGFI_RRU_IF4) || (eNB->node_function == eNodeB_3GPP) || (eNB->node_function == eNodeB_3GPP_BBU)) { // front-end processing @@ -2679,6 +2683,12 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } } + } else if (eNB->node_function == NGFI_RRU_IF5) { + /// **** send_IF5 of rxdata to BBU **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); + send_IF5(eNB, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); + } else if (eNB->node_function == NGFI_RCC_IF4) { /// **** recv_IF4 of rxdataF from RRU **** /// /// **** recv_IF4 of rxsigF from RRU **** /// @@ -2734,11 +2744,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (proc->first_rx == 0) { if (proc->subframe_rx != subframe){ LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); -// exit_fun("Exiting"); + //exit_fun("Exiting"); } if (proc->frame_rx != frame) { LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - // exit_fun("Exiting"); + //exit_fun("Exiting"); } } else { proc->first_rx = 0; From 49e6a2b72048d5f27fc01bb1ec671a6e34b57e7f Mon Sep 17 00:00:00 2001 From: Aikaterini Trilyraki Date: Thu, 7 Jul 2016 17:15:10 +0200 Subject: [PATCH 105/340] add T for all lcids --- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 4e6cb5d2dc..d8514b905e 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -945,7 +945,9 @@ schedule_ue_spec( MBMS_FLAG_NO, lcid, (char*)&dlsch_buffer[sdu_length_total]); - + T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP), + T_INT(harq_pid), T_INT(lcid), T_INT(sdu_lengths[num_sdus])); + LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n",module_idP,sdu_lengths[num_sdus],lcid); sdu_lcids[num_sdus] = lcid; sdu_length_total += sdu_lengths[num_sdus]; @@ -1096,7 +1098,7 @@ schedule_ue_spec( "[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n", module_idP,frameP, UE_id, CC_id, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset, ue_sched_ctl->ta_update,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch); - } + } //#endif #ifdef DEBUG_eNB_SCHEDULER LOG_T(MAC,"[eNB %d] First 16 bytes of DLSCH : \n"); From 5f0e15a4b854643c03f9e8ca7c0a38afbdb841f4 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Thu, 7 Jul 2016 19:05:14 +0200 Subject: [PATCH 106/340] save for switching pc --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 16 ++++++++-------- targets/RT/USER/lte-enb.c | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index a0e4d2e3f7..e7c3294ce8 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -210,8 +210,11 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ *subframe = ((packet_header->frame_status)>>22)&0x000f; if (*packet_type == IF4_PDLFFT) { + // Find and return symbol_number + *symbol_number = ((packet_header->frame_status)>>26)&0x000f; + // Calculate from received packet - slotoffsetF = (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; // Do decompression of the two parts and generate txdataF @@ -222,13 +225,13 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ txdataF[0][slotoffsetF+element_id] = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ]; txdataF[0][slotoffsetF+element_id] |= alaw2lin[ (data_block[element_id+db_halflength]>>8) ]<<16; } - + + } else if (*packet_type == IF4_PULFFT) { // Find and return symbol_number *symbol_number = ((packet_header->frame_status)>>26)&0x000f; - - } else if (*packet_type == IF4_PULFFT) { + // Calculate from received packet - slotoffsetF = (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; // Do decompression of the two parts and generate rxdataF @@ -240,9 +243,6 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ rxdataF[0][slotoffsetF+element_id] |= alaw2lin[ (data_block[element_id+db_halflength]>>8) ]<<16; } - // Find and return symbol_number - *symbol_number = ((packet_header->frame_status)>>26)&0x000f; - } else if (*packet_type == IF4_PRACH) { // FIX: hard coded prach samples length db_fulllength = 839*2; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index ce4504ff0d..29122757b0 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -501,6 +501,14 @@ static void* eNB_thread_rxtx( void* param ) { do { recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); } while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1); + + if (proc->subframe_tx == 0 && proc->frame_tx == 0) { + write_output("eNBtxsigF.m","txF",PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdataF[0][0], + PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti * PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.ofdm_symbol_size, + 1,1); + exit(1); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5) { @@ -570,6 +578,13 @@ static void* eNB_thread_rxtx( void* param ) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + + if (proc->subframe_tx == 0 && proc->frame_tx == 0) { + write_output("fr_bf_comp.m","txF",PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdataF[0][0], + PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti * PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.ofdm_symbol_size, + 1,1); + exit(1); + } } From e5b1953140748f88f56978355094dd38e5cb33f0 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 7 Jul 2016 21:40:30 +0200 Subject: [PATCH 107/340] minor change in schduler logging for DRB --- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 4e6cb5d2dc..2742f2f087 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -935,7 +935,7 @@ schedule_ue_spec( if (rlc_status.bytes_in_buffer > 0) { - LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting %d bytes from RLC (lcid %d total hdr len %d)\n", + LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting %d bytes from RLC (lcid %d total hdr len %d)\n", module_idP,frameP,TBS-header_len_dcch-sdu_length_total-header_len_dtch,lcid, header_len_dtch); sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, rnti, From 6b278cb4b74355a32985fecc10eee3b2e2335f54 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 8 Jul 2016 01:13:35 +0200 Subject: [PATCH 108/340] minor modifications to test case config --- cmake_targets/autotests/test_case_list.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index d427a6b340..b14ef9fc05 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1252,7 +1252,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W @@ -1266,7 +1266,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 34M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 5 lo -s -i 1 -f m -u throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -1287,7 +1287,7 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 75 lo -c 192.172.0.2 -b 34Mbits/s -i 1 -f m -u False @@ -3198,7 +3198,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W @@ -3213,7 +3213,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 35M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -3233,7 +3233,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 75 lo -c 192.172.0.2 -b 34Mbits/s -i 1 -f m -u False From 6e7e43f47550b060051a667b1085454a108d575d Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 8 Jul 2016 12:09:55 +0200 Subject: [PATCH 109/340] disable wireshark logging --- cmake_targets/autotests/test_case_list.xml | 288 ++++++++++----------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index b14ef9fc05..b7d12d25ef 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -956,7 +956,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -993,7 +993,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -1031,7 +1031,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1068,7 +1068,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -1105,7 +1105,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1142,7 +1142,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -1179,7 +1179,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1198,7 +1198,7 @@ False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec /tmp @@ -1252,7 +1252,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1268,7 +1268,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 5 lo -s -i 1 -f m -u - throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1325,7 +1325,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1342,7 +1342,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1400,7 +1400,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1437,7 +1437,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.2TX.2RX @@ -1475,7 +1475,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1511,7 +1511,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=2.0Mbits/sec max=2.0Mbits/sec average=2.0Mbits/sec + throughput_test min=0.0Mbits/sec max=2.0Mbits/sec average=2.0Mbits/sec False USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.2TX.2RX @@ -1548,7 +1548,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1585,7 +1585,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=4.0Mbits/sec max=4.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=4.0Mbits/sec average=4.0Mbits/sec False USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.2TX.2RX @@ -1622,7 +1622,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1639,7 +1639,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1696,7 +1696,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1713,7 +1713,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1770,7 +1770,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1787,7 +1787,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1846,7 +1846,7 @@ sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1892,7 +1892,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.OAI_EPC_local.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -1930,7 +1930,7 @@ sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1976,7 +1976,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.OAI_EPC_local.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -2014,7 +2014,7 @@ sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2060,7 +2060,7 @@ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.OAI_EPC_local.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -2098,7 +2098,7 @@ sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2115,7 +2115,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=10.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec + throughput_test min=00.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -2182,7 +2182,7 @@ sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2199,7 +2199,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=20.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec + throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -2266,7 +2266,7 @@ sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2283,7 +2283,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=40.0Mbits/sec max=42.0Mbits/sec average=44.0Mbits/sec + throughput_test min=0.0Mbits/sec max=42.0Mbits/sec average=44.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -2350,7 +2350,7 @@ sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2406,7 +2406,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.OAI_EPC_remote.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -2444,7 +2444,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2500,7 +2500,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.OAI_EPC_remote.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -2538,7 +2538,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2594,7 +2594,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.OAI_EPC_remote.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -2632,7 +2632,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2649,7 +2649,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 10M -R - throughput_test min=9.0Mbits/sec max=9Mbits/sec average=9Mbits/sec + throughput_test min=0.0Mbits/sec max=9Mbits/sec average=9Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -2726,7 +2726,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2743,7 +2743,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 10M -R - throughput_test min=9Mbits/sec max=9Mbits/sec average=9Mbits/sec + throughput_test min=0.0Mbits/sec max=9Mbits/sec average=9Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -2820,7 +2820,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2837,7 +2837,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 9M -R - throughput_test min=9Mbits/sec max=9Mbits/sec average=9Mbits/sec + throughput_test min=0.0Mbits/sec max=9Mbits/sec average=9Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -2912,7 +2912,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -2948,7 +2948,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m -u - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPx310.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -2984,7 +2984,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3020,7 +3020,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPx310.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -3055,7 +3055,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3092,7 +3092,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPx310.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -3127,7 +3127,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3146,7 +3146,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec /tmp @@ -3198,7 +3198,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3217,7 +3217,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec /tmp @@ -3269,7 +3269,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3288,7 +3288,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec /tmp @@ -3343,7 +3343,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3389,7 +3389,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPx310.OAI_EPC_remote.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -3426,7 +3426,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3472,7 +3472,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPx310.OAI_EPC_remote.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -3507,7 +3507,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3553,7 +3553,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPx310.OAI_EPC_remote.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -3588,7 +3588,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3605,7 +3605,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=10.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec + throughput_test min=00.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -3669,7 +3669,7 @@ c sleep 15;$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf $OPENAIR_TESTDIR/enb.conf sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3686,7 +3686,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=20.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec + throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -3750,7 +3750,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3767,7 +3767,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=20.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec + throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -3831,7 +3831,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -3867,7 +3867,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False EXMIMO.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -3903,7 +3903,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -3940,7 +3940,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False EXMIMO.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -3975,7 +3975,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4012,7 +4012,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False EXMIMO.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -4047,7 +4047,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4066,7 +4066,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec /tmp @@ -4118,7 +4118,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4137,7 +4137,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec /tmp @@ -4189,7 +4189,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4208,7 +4208,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec /tmp @@ -4262,7 +4262,7 @@ c sleep 15;$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4309,7 +4309,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False EXMIMO.OAI_EPC_remote.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -4346,7 +4346,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4392,7 +4392,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False EXMIMO.OAI_EPC_remote.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -4427,7 +4427,7 @@ c sleep 15;$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4473,7 +4473,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False EXMIMO.OAI_EPC_remote.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -4508,7 +4508,7 @@ c sleep 15;$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4525,7 +4525,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=10.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec + throughput_test min=00.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4589,7 +4589,7 @@ c sleep 15;$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4606,7 +4606,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=20.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec + throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4670,7 +4670,7 @@ c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4687,7 +4687,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=20.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec + throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4755,7 +4755,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf @@ -4792,7 +4792,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False BladeRF.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -4831,7 +4831,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf @@ -4868,7 +4868,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False BladeRF.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -4906,7 +4906,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf @@ -4943,7 +4943,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False BladeRF.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -4981,7 +4981,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf @@ -5000,7 +5000,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec /tmp @@ -5055,7 +5055,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf @@ -5071,7 +5071,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5129,7 +5129,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf @@ -5146,7 +5146,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5204,7 +5204,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini @@ -5241,7 +5241,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False LMSSDR.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -5280,7 +5280,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini @@ -5317,7 +5317,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False LMSSDR.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -5355,7 +5355,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_20MHz_rx19dB_txfull.ini + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_20MHz_rx19dB_txfull.ini @@ -5392,7 +5392,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False LMSSDR.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -5430,7 +5430,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini @@ -5449,7 +5449,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec /tmp @@ -5504,7 +5504,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini @@ -5520,7 +5520,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5578,7 +5578,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_20MHz_rx19dB_txfull.ini + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf --rf-config-file $OPENAIR_DIR/targets/ARCH/LMSSDR/enb_sodera_highband_20MHz_rx19dB_txfull.ini @@ -5595,7 +5595,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5655,7 +5655,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -5702,7 +5702,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX @@ -5743,7 +5743,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -5788,7 +5788,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX @@ -5828,7 +5828,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -5873,7 +5873,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX @@ -5913,7 +5913,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -5940,7 +5940,7 @@ c False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec /tmp @@ -5997,7 +5997,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -6021,7 +6021,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6081,7 +6081,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf @@ -6106,7 +6106,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - throughput_test min=10.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6164,7 +6164,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -6201,7 +6201,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=5.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec False USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.Band_7.UL.1TX.1RX @@ -6239,7 +6239,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -6276,7 +6276,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=10.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec False USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.Band_7.UL.1TX.1RX @@ -6313,7 +6313,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -6350,7 +6350,7 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False USRPb210.ALU_EPC.SonyExperiaM4.20MHz.FDD.Band_7.UL.1TX.1RX @@ -6387,7 +6387,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -6404,7 +6404,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m - throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue @@ -6461,7 +6461,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -6478,7 +6478,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m - throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue @@ -6535,7 +6535,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -6552,7 +6552,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m - throughput_test min=10.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue From f9fda301fd7ecf9b0235c2e08410314ae0256fc4 Mon Sep 17 00:00:00 2001 From: Aikaterini Trilyraki Date: Fri, 8 Jul 2016 12:37:55 +0200 Subject: [PATCH 110/340] adding two rules for run_enb_ue_virt_s1 script to resolve the issue of data path with simulated UE (contributed by A. Ksentini) --- cmake_targets/tools/run_enb_ue_virt_s1 | 3 +++ openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cmake_targets/tools/run_enb_ue_virt_s1 b/cmake_targets/tools/run_enb_ue_virt_s1 index 8f7255332a..4e2f61e915 100755 --- a/cmake_targets/tools/run_enb_ue_virt_s1 +++ b/cmake_targets/tools/run_enb_ue_virt_s1 @@ -257,6 +257,9 @@ function main() ip rule add fwmark 1 table lte ifconfig oip1 up ip route add default dev oip1 table lte + # the actual IP address depends on the EPC/MME config file for address pool + ip route add from 192.188.0.0/24 table lte + ip route add to 192.188.0.0/24 table lte exe_arguments="$exe_arguments -s15 -AAWGN -y1 -b1 -u1 -Q0" diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index d8514b905e..8be6e6b918 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -935,7 +935,7 @@ schedule_ue_spec( if (rlc_status.bytes_in_buffer > 0) { - LOG_I(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting %d bytes from RLC (lcid %d total hdr len %d)\n", + LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting %d bytes from RLC (lcid %d total hdr len %d)\n", module_idP,frameP,TBS-header_len_dcch-sdu_length_total-header_len_dtch,lcid, header_len_dtch); sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, rnti, From 8934fed89ee0361416717fb72766a1a37991a5a2 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 8 Jul 2016 17:01:06 +0200 Subject: [PATCH 111/340] fixed issue with offset and sign extension --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 93 ++++++++----------- openair1/PHY/TOOLS/alaw_lut.h | 10 +- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 2 +- 3 files changed, 45 insertions(+), 60 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index e7c3294ce8..cf1776754c 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -29,11 +29,11 @@ /*! \file PHY/LTE_TRANSPORT/if4_tools.c * \brief -* \author Fredrik Skretteberg, Tobias Schuster, Mauricio Gunther, S. Sandeep Kumar, Raymond Knopp +* \author S. Sandeep Kumar, Raymond Knopp * \date 2016 * \version 0.1 * \company Eurecom -* \email: knopp@eurecom.fr +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr * \note * \warning */ @@ -44,7 +44,6 @@ #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" -// --- Careful to handle buffer memory --- RAW/UDP modes --- PRACH variables and data void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int k) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; @@ -56,35 +55,33 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int slotoffsetF=0, blockoffsetF=0; void *tx_buffer=NULL; - int16_t *data_block=NULL; + uint16_t *data_block=NULL, *i=NULL; if (packet_type == IF4_PDLFFT) { db_fulllength = 12*fp->N_RB_DL; db_halflength = (db_fulllength)>>1; slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; - blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(int16_t)); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(uint16_t)); IF4_header_t *dl_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); gen_IF4_dl_header(dl_header, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - // Do compression of the two parts and generate data blocks + for (element_id=0; element_id>16) + 32768 ]<<8; - - data_block[element_id+db_halflength] = lin2alaw[ (txdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; - data_block[element_id+db_halflength] |= lin2alaw[ (txdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; + i = (uint16_t*) &txdataF[0][blockoffsetF+element_id]; + data_block[element_id] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); + + i = (uint16_t*) &txdataF[0][slotoffsetF+element_id]; + data_block[element_id+db_halflength] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); } - // Update information in generated packet dl_header->frame_status &= ~(0x000f<<26); dl_header->frame_status |= (symbol_id&0x000f)<<26; - // Write the packet to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, symbol_id, &tx_buffer, @@ -101,29 +98,27 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, db_fulllength = 12*fp->N_RB_UL; db_halflength = (db_fulllength)>>1; slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; - blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(int16_t)); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(uint16_t)); IF4_header_t *ul_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); gen_IF4_ul_header(ul_header, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { - // Do compression of the two parts and generate data blocks - rxdataF + for (element_id=0; element_id>16) + 32768 ]<<8; - - data_block[element_id+db_halflength] = lin2alaw[ (rxdataF[0][slotoffsetF+element_id] & 0xffff) + 32768 ]; - data_block[element_id+db_halflength] |= lin2alaw[ (rxdataF[0][slotoffsetF+element_id]>>16) + 32768 ]<<8; + i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id]; + data_block[element_id] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); + + i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id]; + data_block[element_id+db_halflength] = ((uint16_t) lin2alaw[*i]) | (lin2alaw[*(i+1)]<<8); } - // Update information in generated packet ul_header->frame_status &= ~(0x000f<<26); ul_header->frame_status |= (symbol_id&0x000f)<<26; - // Write the packet(s) to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, symbol_id, &tx_buffer, @@ -142,7 +137,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(int16_t)); IF4_header_t *prach_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); gen_IF4_prach_header(prach_header, frame, subframe); @@ -155,7 +150,6 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, // prachoffsetF += 2; //} - // Write the packet to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, symbol_id, &tx_buffer, @@ -192,9 +186,8 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ void *rx_buffer=NULL; IF4_header_t *packet_header=NULL; - int16_t *data_block=NULL; + uint16_t *data_block=NULL, *i=NULL; - // Read packet(s) from the fronthaul if (eNB->ifdevice.trx_read_func(&eNB->ifdevice, (int64_t*) packet_type, &rx_buffer, @@ -204,43 +197,41 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ } packet_header = (IF4_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); - data_block = (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t); + data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t); *frame = ((packet_header->frame_status)>>6)&0xffff; *subframe = ((packet_header->frame_status)>>22)&0x000f; if (*packet_type == IF4_PDLFFT) { - // Find and return symbol_number *symbol_number = ((packet_header->frame_status)>>26)&0x000f; - // Calculate from received packet slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; - blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; - - // Do decompression of the two parts and generate txdataF + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; + for (element_id=0; element_id>8) ]<<16; + i = (uint16_t*) &txdataF[0][blockoffsetF+element_id]; + *i = alaw2lin[ (data_block[element_id] & 0xff) ]; + *(i+1) = alaw2lin[ (data_block[element_id]>>8) ]; - txdataF[0][slotoffsetF+element_id] = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ]; - txdataF[0][slotoffsetF+element_id] |= alaw2lin[ (data_block[element_id+db_halflength]>>8) ]<<16; + i = (uint16_t*) &txdataF[0][slotoffsetF+element_id]; + *i = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ]; + *(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ]; } } else if (*packet_type == IF4_PULFFT) { - // Find and return symbol_number *symbol_number = ((packet_header->frame_status)>>26)&0x000f; - // Calculate from received packet slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; - blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - // Do decompression of the two parts and generate rxdataF for (element_id=0; element_id>8) ]<<16; + i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id]; + *i = alaw2lin[ (data_block[element_id] & 0xff) ]; + *(i+1) = alaw2lin[ (data_block[element_id]>>8) ]; - rxdataF[0][slotoffsetF+element_id] = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ]; - rxdataF[0][slotoffsetF+element_id] |= alaw2lin[ (data_block[element_id+db_halflength]>>8) ]<<16; + i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id]; + *i = alaw2lin[ (data_block[element_id+db_halflength] & 0xff) ]; + *(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ]; } } else if (*packet_type == IF4_PRACH) { @@ -260,11 +251,9 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ void gen_IF4_dl_header(IF4_header_t *dl_packet, int frame, int subframe) { - // Set Type and Sub-Type dl_packet->type = IF4_PACKET_TYPE; dl_packet->sub_type = IF4_PDLFFT; - // Reset frame status dl_packet->rsvd = 0; // Set frame status @@ -276,11 +265,9 @@ void gen_IF4_dl_header(IF4_header_t *dl_packet, int frame, int subframe) { void gen_IF4_ul_header(IF4_header_t *ul_packet, int frame, int subframe) { - // Set Type and Sub-Type ul_packet->type = IF4_PACKET_TYPE; ul_packet->sub_type = IF4_PULFFT; - // Leave reserved as it is ul_packet->rsvd = 0; // Set frame status @@ -292,11 +279,9 @@ void gen_IF4_ul_header(IF4_header_t *ul_packet, int frame, int subframe) { void gen_IF4_prach_header(IF4_header_t *prach_packet, int frame, int subframe) { - // Set Type and Sub-Type prach_packet->type = IF4_PACKET_TYPE; prach_packet->sub_type = IF4_PRACH; - // Leave reserved as it is prach_packet->rsvd = 0; // Set LTE Prach configuration diff --git a/openair1/PHY/TOOLS/alaw_lut.h b/openair1/PHY/TOOLS/alaw_lut.h index bcb9bea790..52ff6d87da 100644 --- a/openair1/PHY/TOOLS/alaw_lut.h +++ b/openair1/PHY/TOOLS/alaw_lut.h @@ -39,9 +39,9 @@ */ // Linear to ALaw -// 16 bit signed integer to 8 bit unsigned integer -const uint8_t lin2alaw[65536] = {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170}; - +// 16 bit signed integer (typecasted as uint16_t) to 8 bit unsigned integer +const uint8_t lin2alaw[65536] = {213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85}; + // ALaw to Linear -// 8 bit unsigned integer to 16 bit signed integer -const int16_t alaw2lin[256] = {-5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472, -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, -344, -328, -376, -360, -280, -264, -312, -296, -472, -456, -504, -488, -408, -392, -440, -424, -88, -72, -120, -104, -24, -8, -56, -40, -216, -200, -248, -232, -152, -136, -184, -168, -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, -688, -656, -752, -720, -560, -528, -624, -592, -944, -912, -1008, -976, -816, -784, -880, -848, 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296, 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56, 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976, 816, 784, 880, 848}; +// 8 bit unsigned integer to 16 bit signed integer (typecasted as uint16_t) +const uint16_t alaw2lin[256] = {60032, 60288, 59520, 59776, 61056, 61312, 60544, 60800, 57984, 58240, 57472, 57728, 59008, 59264, 58496, 58752, 62784, 62912, 62528, 62656, 63296, 63424, 63040, 63168, 61760, 61888, 61504, 61632, 62272, 62400, 62016, 62144, 43520, 44544, 41472, 42496, 47616, 48640, 45568, 46592, 35328, 36352, 33280, 34304, 39424, 40448, 37376, 38400, 54528, 55040, 53504, 54016, 56576, 57088, 55552, 56064, 50432, 50944, 49408, 49920, 52480, 52992, 51456, 51968, 65192, 65208, 65160, 65176, 65256, 65272, 65224, 65240, 65064, 65080, 65032, 65048, 65128, 65144, 65096, 65112, 65448, 65464, 65416, 65432, 65512, 65528, 65480, 65496, 65320, 65336, 65288, 65304, 65384, 65400, 65352, 65368, 64160, 64224, 64032, 64096, 64416, 64480, 64288, 64352, 63648, 63712, 63520, 63584, 63904, 63968, 63776, 63840, 64848, 64880, 64784, 64816, 64976, 65008, 64912, 64944, 64592, 64624, 64528, 64560, 64720, 64752, 64656, 64688, 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296, 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56, 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976, 816, 784, 880, 848}; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 8fb84e37fc..038129cf36 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -59,7 +59,7 @@ #define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) // Packet sizes for IF4 interface format -#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(int16_t)*scaled_nblocks) +#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks) #define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839*2) // FIX hard coded prach size (uncompressed) #define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) From a3c41ed7ffae6e76b97bdbf8daeb65b2165c4298 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 8 Jul 2016 19:43:09 +0200 Subject: [PATCH 112/340] remove writeop, rru tx works --- targets/RT/USER/lte-enb.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 29122757b0..2a45832d45 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -502,13 +502,6 @@ static void* eNB_thread_rxtx( void* param ) { recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); } while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1); - if (proc->subframe_tx == 0 && proc->frame_tx == 0) { - write_output("eNBtxsigF.m","txF",PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdataF[0][0], - PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti * PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.ofdm_symbol_size, - 1,1); - exit(1); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5) { @@ -579,13 +572,6 @@ static void* eNB_thread_rxtx( void* param ) { send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); - if (proc->subframe_tx == 0 && proc->frame_tx == 0) { - write_output("fr_bf_comp.m","txF",PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdataF[0][0], - PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti * PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.ofdm_symbol_size, - 1,1); - exit(1); - } - } if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { From 142c02a5b83caa5cf9f2f3772d8d33bbb40d8d4a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 12 Jul 2016 11:18:05 +0200 Subject: [PATCH 113/340] small fix in CMakeLists.txt to avoid inclusion of unwanted files --- cmake_targets/CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 67cc6cfc3a..09d5322a69 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -929,7 +929,14 @@ add_library(SECU_CN ${SECU_CN_SRC}) # Scheduler ################################" -file(GLOB SCHED_SRC ${OPENAIR1_DIR}/SCHED/*.c) +set(SCHED_SRC + ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_eNb.c + ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_ue.c + ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c + ${OPENAIR1_DIR}/SCHED/phy_mac_stub.c + ${OPENAIR1_DIR}/SCHED/pucch_pc.c + ${OPENAIR1_DIR}/SCHED/pusch_pc.c +) add_library(SCHED_LIB ${SCHED_SRC}) # Layer 1 From 0789ee95602731130b5c2819b56952040bbc4333 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 12 Jul 2016 17:58:02 +0200 Subject: [PATCH 114/340] ifdevice tx/rx buffer per cc --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 37 ++++++++----------- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 2 + openair1/PHY/defs.h | 3 +- openair1/SCHED/phy_procedures_lte_eNb.c | 7 ---- targets/ARCH/COMMON/common_lib.h | 8 ++++ targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 19 ++++------ targets/RT/USER/lte-enb.c | 12 ++++++ 7 files changed, 47 insertions(+), 41 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index cf1776754c..0fb5404538 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -49,12 +49,12 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; int16_t **rxsigF = eNB->prach_vars.rxsigF; + void *tx_buffer = eNB->ifbuffer.tx; uint16_t symbol_id=0, element_id=0; uint16_t db_fulllength, db_halflength; int slotoffsetF=0, blockoffsetF=0; - void *tx_buffer=NULL; uint16_t *data_block=NULL, *i=NULL; if (packet_type == IF4_PDLFFT) { @@ -63,7 +63,6 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(uint16_t)); IF4_header_t *dl_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); @@ -100,7 +99,6 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(uint16_t)); IF4_header_t *ul_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); @@ -135,21 +133,15 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, // FIX: hard coded prach samples length db_fulllength = 839*2; - tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + db_fulllength*sizeof(int16_t)); IF4_header_t *prach_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); gen_IF4_prach_header(prach_header, frame, subframe); - // Generate uncompressed data blocks - memcpy(data_block, (rxsigF[0]+k), db_fulllength*sizeof(int16_t)); - - //for (element_id=0; element_idifdevice.trx_write_func(&eNB->ifdevice, symbol_id, &tx_buffer, @@ -162,7 +154,6 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, AssertFatal(1==0, "send_IF4 - Unknown packet_type %x", packet_type); } - free(tx_buffer); return; } @@ -172,6 +163,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; int16_t **rxsigF = eNB->prach_vars.rxsigF; + void *rx_buffer = eNB->ifbuffer.rx; uint16_t element_id; uint16_t db_fulllength, db_halflength; @@ -184,7 +176,6 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ } db_halflength = db_fulllength>>1; - void *rx_buffer=NULL; IF4_header_t *packet_header=NULL; uint16_t *data_block=NULL, *i=NULL; @@ -238,14 +229,14 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ // FIX: hard coded prach samples length db_fulllength = 839*2; - // Generate uncompressed data blocks - memcpy((rxsigF[0]+slotoffsetF), data_block, db_fulllength*sizeof(int16_t)); + memcpy((&rxsigF[0][0]), + (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t), + db_fulllength*sizeof(int16_t)); } else { AssertFatal(1==0, "recv_IF4 - Unknown packet_type %x", *packet_type); } - free(rx_buffer); return; } @@ -260,7 +251,6 @@ void gen_IF4_dl_header(IF4_header_t *dl_packet, int frame, int subframe) { dl_packet->frame_status = 0; dl_packet->frame_status |= (frame&0xffff)<<6; dl_packet->frame_status |= (subframe&0x000f)<<22; - } @@ -274,7 +264,6 @@ void gen_IF4_ul_header(IF4_header_t *ul_packet, int frame, int subframe) { ul_packet->frame_status = 0; ul_packet->frame_status |= (frame&0xffff)<<6; ul_packet->frame_status |= (subframe&0x000f)<<22; - } @@ -288,5 +277,11 @@ void gen_IF4_prach_header(IF4_header_t *prach_packet, int frame, int subframe) { prach_packet->frame_status = 0; prach_packet->frame_status |= (frame&0xffff)<<6; prach_packet->frame_status |= (subframe&0x000f)<<22; - } + + +void malloc_IF4_buffer(PHY_VARS_eNB *eNB) { + // Keep the size large enough + eNB->ifbuffer.tx = malloc(RAW_IF4_PRACH_SIZE_BYTES); + eNB->ifbuffer.rx = malloc(RAW_IF4_PRACH_SIZE_BYTES); +} diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index a885d28ec2..7276d97efa 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -70,3 +70,5 @@ void gen_IF4_prach_header(IF4_header_t*, int, int); void send_IF4(PHY_VARS_eNB*, int, int, uint16_t, int); void recv_IF4(PHY_VARS_eNB*, int*, int*, uint16_t*, uint32_t*); + +void malloc_IF4_buffer(PHY_VARS_eNB*); diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index f9a4596129..e1b2627c09 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -514,7 +514,8 @@ typedef struct PHY_VARS_eNB_s { /// RF and Interface devices per CC openair0_device rfdevice; openair0_device ifdevice; - // *** Handle spatially distributed MIMO antenna ports + /// Pointer for ifdevice buffer struct + if_buffer_t ifbuffer; } PHY_VARS_eNB; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 478ae20c30..789ebc1427 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2527,10 +2527,6 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl uint16_t packet_type; uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; - - struct timespec time_req, time_rem; - time_req.tv_sec = 0; - time_req.tv_nsec = 900000; if (subframe==9) { subframe=0; @@ -2594,9 +2590,6 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); recv_IF5(eNB, &proc->timestamp_rx, proc->subframe_rx, IF5_RRH_GW_UL); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); - - //nanosleep(&time_req, &time_rem); - //proc->timestamp_rx += fp->samples_per_tti; proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 6e112f5e43..c371e12520 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -236,6 +236,14 @@ typedef struct { } eth_params_t; +typedef struct { + //! Tx buffer for if device + void *tx; + //! Rx buffer for if device + void *rx; +} if_buffer_t; + + /*!\brief structure holds the parameters to configure USRP devices */ struct openair0_device_t { /*!brief Module ID of this device */ diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 699d15350b..faf19c9fda 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -312,13 +312,11 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t; - void *test_buffer = (void*)malloc(packet_size); - - IF4_header_t *test_header = (IF4_header_t*)(test_buffer + MAC_HEADER_SIZE_BYTES); + ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t; + IF4_header_t *test_header = (IF4_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES); bytes_received = recv(eth->sockfd[Mod_id], - test_buffer, + buff[0], packet_size, MSG_PEEK); if (bytes_received ==-1) { @@ -336,11 +334,7 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, } else { packet_size = RAW_IF4_PRACH_SIZE_BYTES; } - - buff[0] = (void*)malloc(packet_size); - - bytes_received = 0; - + while(bytes_received < packet_size) { bytes_received = recv(eth->sockfd[Mod_id], buff[0], @@ -357,7 +351,6 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, } eth->rx_nsamps = nsamps; - free(test_buffer); return(bytes_received); } @@ -394,7 +387,8 @@ int eth_set_dev_conf_raw(openair0_device *device) { -int eth_set_dev_conf_raw_IF4(openair0_device *device) { +int eth_set_dev_conf_raw_IF4(openair0_device *device) { + // use for cc_id info int Mod_id = device->Mod_id; eth_state_t *eth = (eth_state_t*)device->priv; @@ -455,6 +449,7 @@ int eth_get_dev_conf_raw(openair0_device *device) { int eth_get_dev_conf_raw_IF4(openair0_device *device) { + // use for cc_id info eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 2a45832d45..df40cca1ce 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -768,6 +768,18 @@ static void* eNB_thread_rx_common( void* param ) { wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif + // Create buffer for IF device and free when stopping + if (eNB->node_function == NGFI_RCC_IF4 || eNB->node_function == NGFI_RRU_IF4) { + malloc_IF4_buffer(eNB); + + } else if (eNB->node_function == NGFI_RRU_IF5 || eNB->node_function == eNodeB_3GPP_BBU) { + //malloc_IF5_buffer(eNB); + + } else { + eNB->ifbuffer.tx = NULL; + eNB->ifbuffer.rx = NULL; + } + // Start IF device for this CC if (eNB->node_function != eNodeB_3GPP) { if (eNB->ifdevice.trx_start_func(&eNB->ifdevice) != 0 ) From b804f1e47e61c83874102a634755b48519b226c9 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 13 Jul 2016 19:33:40 +0200 Subject: [PATCH 115/340] send correct timing --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 9fdd67c09e..545c892c2a 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -63,7 +63,7 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe txp[i] += packet_id*spp_eth; eNB->ifdevice.trx_write_func(&eNB->ifdevice, - (proc_timestamp - eNB->ifdevice.openair0_cfg->tx_sample_advance + packet_id*spp_eth), + (proc_timestamp + packet_id*spp_eth), txp, spp_eth, fp->nb_antennas_tx, From 7e2a39733e3086aa5a97a97fe363d3d3c58b90dd Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 15 Jul 2016 00:04:04 -0700 Subject: [PATCH 116/340] modifications for oaisim. oaisim_noS1 compiles at this point. --- openair1/PHY/LTE_TRANSPORT/dci.c | 6 +- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 42 +- openair1/PHY/LTE_TRANSPORT/initial_sync.c | 3 +- openair1/PHY/LTE_TRANSPORT/pbch.c | 9 +- openair1/PHY/LTE_TRANSPORT/proto.h | 5 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 9 +- openair1/SCHED/phy_procedures_lte_eNb.c | 36 +- openair1/SCHED/phy_procedures_lte_ue.c | 5 +- .../SIMULATION/ETH_TRANSPORT/emu_transport.c | 45 +- targets/SIMU/USER/channel_sim.c | 26 +- targets/SIMU/USER/oaisim.c | 794 +++++++----------- targets/SIMU/USER/oaisim_functions.c | 62 +- 12 files changed, 432 insertions(+), 610 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index f5e0a987f7..0117c8e7d2 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -2390,14 +2390,14 @@ uint8_t generate_dci_top_emul(PHY_VARS_eNB *phy_vars_eNB, if (dci_alloc[n_dci].format > 0) { // exclude the uplink dci if (dci_alloc[n_dci].rnti == SI_RNTI) { - dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch_eNB_SI; + dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch_SI; eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[n_dci_dl] = 0;//SI; eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl] = 0; eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl] = dlsch_eNB->harq_processes[0]->TBS>>3; LOG_D(PHY,"[DCI][EMUL]SI tbs is %d and dci index %d harq pid is %d \n",eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl],n_dci_dl, eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl]); } else if (dci_alloc[n_dci_dl].ra_flag == 1) { - dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch_eNB_ra; + dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch_ra; eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[n_dci_dl] = 1;//RA; eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl] = 0; eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl] = dlsch_eNB->harq_processes[0]->TBS>>3; @@ -2406,7 +2406,7 @@ uint8_t generate_dci_top_emul(PHY_VARS_eNB *phy_vars_eNB, } else { ue_id = find_ue(dci_alloc[n_dci_dl].rnti,PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]); DevAssert( ue_id != (uint8_t)-1 ); - dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch_eNB[ue_id][0]; + dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch[ue_id][0]; eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[n_dci_dl] = 2;//TB0; eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl] = dlsch_eNB->current_harq_pid; diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 17180af613..b6fcfbb1e8 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -832,7 +832,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, // may not be necessary for PMCH?? for (eNB_id2=0; eNB_id2lte_frame_parms.Nid_cell == phy_vars_ue->lte_frame_parms.Nid_cell) + if (PHY_vars_eNB_g[eNB_id2][CC_id]->frame_parms.Nid_cell == phy_vars_ue->frame_parms.Nid_cell) break; } @@ -847,9 +847,9 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, switch (dlsch_id) { - case PDSCH_SI: // SI - dlsch_ue = phy_vars_ue->dlsch_ue_SI[eNB_id]; - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_SI; + case SI_PDSCH: // SI + dlsch_ue = phy_vars_ue->dlsch_SI[eNB_id]; + dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_SI; // printf("Doing SI: TBS %d\n",dlsch_ue->harq_processes[0]->TBS>>3); memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3); #ifdef DEBUG_DLSCH_DECODING @@ -863,9 +863,9 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, return(1); break; - case PDSCH_RA: // RA - dlsch_ue = phy_vars_ue->dlsch_ue_ra[eNB_id]; - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_ra; + case RA_PDSCH: // RA + dlsch_ue = phy_vars_ue->dlsch_ra[eNB_id]; + dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_ra; memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3); #ifdef DEBUG_DLSCH_DECODING LOG_D(PHY,"RA Decoded\n"); @@ -879,11 +879,11 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, break; case PDSCH: // TB0 - dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][0]; + dlsch_ue = phy_vars_ue->dlsch[eNB_id][0]; harq_pid = dlsch_ue->current_harq_pid; - ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->lte_ue_pdcch_vars[(uint32_t)eNB_id]->crnti,PHY_vars_eNB_g[eNB_id2][CC_id]); + ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->pdcch_vars[(uint32_t)eNB_id]->crnti,PHY_vars_eNB_g[eNB_id2][CC_id]); DevAssert( ue_id != (uint32_t)-1 ); - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB[ue_id][0]; + dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch[ue_id][0]; #ifdef DEBUG_DLSCH_DECODING @@ -918,18 +918,18 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, dlsch_ue->harq_ack[subframe].ack = 0; dlsch_ue->harq_ack[subframe].harq_id = harq_pid; dlsch_ue->harq_ack[subframe].send_harq_status = 1; - dlsch->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations; + dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations; return(1+dlsch_ue->max_turbo_iterations); } break; - case 3: { // TB1 - dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][1]; + case PDSCH1: { // TB1 + dlsch_ue = phy_vars_ue->dlsch[eNB_id][1]; harq_pid = dlsch_ue->current_harq_pid; - int8_t UE_id = find_ue( phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, PHY_vars_eNB_g[eNB_id2][CC_id] ); + int8_t UE_id = find_ue( phy_vars_ue->pdcch_vars[eNB_id]->crnti, PHY_vars_eNB_g[eNB_id2][CC_id] ); DevAssert( UE_id != -1 ); - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB[UE_id][1]; + dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch[UE_id][1]; // reset HARQ dlsch_ue->harq_processes[harq_pid]->status = SCH_IDLE; dlsch_ue->harq_processes[harq_pid]->round = 0; @@ -945,8 +945,8 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, case PMCH: // PMCH - dlsch_ue = phy_vars_ue->dlsch_ue_MCH[eNB_id]; - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_MCH; + dlsch_ue = phy_vars_ue->dlsch_MCH[eNB_id]; + dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_MCH; LOG_D(PHY,"decoding pmch emul (size is %d, enb %d %d)\n", dlsch_ue->harq_processes[0]->TBS>>3, eNB_id, eNB_id2); #ifdef DEBUG_DLSCH_DECODING @@ -968,20 +968,20 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, memcpy(dlsch_ue->harq_processes[0]->b, dlsch_eNB->harq_processes[0]->b, dlsch_ue->harq_processes[0]->TBS>>3); - dlsch->last_iteration_cnt = 1; + dlsch_ue->last_iteration_cnt = 1; return(1); } else { // retransmission - dlsch->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations; + dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations; return(1+dlsch_ue->max_turbo_iterations); } break; default: - dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][0]; + dlsch_ue = phy_vars_ue->dlsch[eNB_id][0]; LOG_E(PHY,"dlsch_decoding_emul: FATAL, unknown DLSCH_id %d\n",dlsch_id); - dlsch->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations; + dlsch_ue->last_iteration_cnt = 1+dlsch_ue->max_turbo_iterations; return(1+dlsch_ue->max_turbo_iterations); } diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index bec0c424ed..71372d9e59 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -516,12 +516,13 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode) phich_string[ue->frame_parms.phich_config_common.phich_resource], ue->frame_parms.nb_antennas_tx_eNB); +#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n", ue->Mod_id, ue->proc.proc_rxtx[0].frame_rx, openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset, ue->common_vars.freq_offset); - +#endif } else { #ifdef DEBUG_INITIAL_SYNC LOG_I(PHY,"[UE%d] Initial sync : PBCH not ok\n",ue->Mod_id); diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c index b7b7149c62..2213ca4da2 100755 --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -1053,9 +1053,10 @@ uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue, double bler=0.0;//, x=0.0; double sinr=0.0; - uint16_t nb_rb = phy_vars_ue->lte_frame_parms.N_RB_DL; + uint16_t nb_rb = phy_vars_ue->frame_parms.N_RB_DL; int16_t f; uint8_t CC_id=phy_vars_ue->CC_id; + int frame_rx = phy_vars_ue->proc.proc_rxtx[0].frame_rx; // compute effective sinr // TODO: adapt this to varible bandwidth @@ -1074,10 +1075,10 @@ uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue, sinr, bler); - if (pbch_phase == (phy_vars_ue->frame_rx % 4)) { + if (pbch_phase == (frame_rx % 4)) { if (uniformrandom() >= bler) { - memcpy(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output,PHY_vars_eNB_g[eNB_id][CC_id]->pbch_pdu,PBCH_PDU_SIZE); - return(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_tx_eNB); + memcpy(phy_vars_ue->pbch_vars[eNB_id]->decoded_output,PHY_vars_eNB_g[eNB_id][CC_id]->pbch_pdu,PBCH_PDU_SIZE); + return(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.nb_antennas_tx_eNB); } else return(-1); } else diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 547dd86a9c..6993dd18c0 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -1039,7 +1039,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, uint8_t subframe, - uint8_t dlsch_id, + PDSCH_t dlsch_id, uint8_t eNB_id); /** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation. It performs @@ -1539,7 +1539,8 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, uint8_t llr8_flag); uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t UE_index, + eNB_rxtx_proc_t *proc, + uint8_t UE_index, uint16_t *crnti); void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 02bf98c372..6ed0f91101 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -1520,16 +1520,9 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, #endif for (UE_id=0; UE_idlte_ue_pdcch_vars[0]->crnti) + if (rnti == PHY_vars_UE_g[UE_id][CC_id]->pdcch_vars[0]->crnti) break; - /* - msg("[PHY] EMUL eNB %d ulsch_decoding_emul : subframe ue id %d crnti %x nb ue %d\n", - eNB->Mod_id, - UE_id, - PHY_vars_UE_g[UE_id]->lte_ue_pdcch_vars[0]->crnti, - NB_UE_INST); - */ } if (UE_id==NB_UE_INST) { diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 79a6a1d0b7..653b5aeb1e 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2119,6 +2119,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq #ifdef PHY_ABSTRACTION else { metric0_SR = rx_pucch_emul(eNB, + proc, UE_id, pucch_format1, 0, @@ -2192,11 +2193,12 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq } else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(eNB,UE_id, + metric0 = rx_pucch_emul(eNB, + proc, + UE_id, pucch_format1a, 0, - pucch_payload0, - subframe); + pucch_payload0); #endif } @@ -2251,11 +2253,11 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(eNB,UE_id, + metric0 = rx_pucch_emul(eNB,proc, + UE_id, format, 0, - pucch_payload0, - subframe); + pucch_payload0); #endif } } else { //using n1_pucch0/n1_pucch1 resources @@ -2283,11 +2285,12 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(eNB,UE_id, + metric0 = rx_pucch_emul(eNB, + proc, + UE_id, format, 0, - pucch_payload0, - subframe); + pucch_payload0); #endif } } @@ -2307,13 +2310,12 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq PUCCH1a_THRES); else { #ifdef PHY_ABSTRACTION - metric1 = rx_pucch_emul(eNB,UE_id, + metric1 = rx_pucch_emul(eNB, + proc, + UE_id, format, 1, - pucch_payload1, - subframe); - - + pucch_payload1); #endif } } @@ -2389,7 +2391,6 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p #ifdef PHY_ABSTRACTION else { rx_ulsch_emul(eNB,proc, - subframe, eNB->UE_stats[UE_id].sector, // this is the effective sector id UE_id); } @@ -2407,6 +2408,7 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p #ifdef PHY_ABSTRACTION else { ret = ulsch_decoding_emul(eNB, + proc, UE_id, &rnti); } @@ -2909,7 +2911,6 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const #ifdef PHY_ABSTRACTION else { rx_ulsch_emul(eNB,proc, - subframe, eNB->UE_stats[i].sector, // this is the effective sector id i); } @@ -2930,7 +2931,8 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const #ifdef PHY_ABSTRACTION else { - ret = ulsch_decoding_emul(eNB,proc, + ret = ulsch_decoding_emul(eNB, + proc, i, &rnti); } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 4f1cc56f80..38609c6f43 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1209,8 +1209,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin format, ue->frame_parms.pucch_config_common.nCS_AN, pucch_ack_payload, - SR_payload, - subframe_tx); + SR_payload); #endif } } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC @@ -2503,7 +2502,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, #ifdef PHY_ABSTRACTION ret = dlsch_decoding_emul(ue, subframe_rx, - dlsch, + pdsch, eNB_id); #endif } diff --git a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c index ec15e7c668..d2ae35b29a 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c @@ -348,7 +348,7 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot switch (eNB_transport_info[enb_id][CC_id].dlsch_type[n_dci_dl]) { case 0: //SI: - memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB_SI->harq_processes[0]->b, + memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_SI->harq_processes[0]->b, &eNB_transport_info[enb_id][CC_id].transport_blocks[payload_offset], eNB_transport_info[enb_id][CC_id].tbs[n_dci_dl]); #ifdef DEBUG_EMU @@ -358,7 +358,7 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot break; case 1: //RA: - memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB_ra->harq_processes[0]->b, + memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_ra->harq_processes[0]->b, &eNB_transport_info[enb_id][CC_id].transport_blocks[payload_offset], eNB_transport_info[enb_id][CC_id].tbs[n_dci_dl]); #ifdef DEBUG_EMU @@ -370,9 +370,9 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot case 2://TB0: harq_pid = eNB_transport_info[enb_id][CC_id].harq_pid[n_dci_dl]; ue_id = eNB_transport_info[enb_id][CC_id].ue_id[n_dci_dl]; - PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB[ue_id][0]->rnti= + PHY_vars_eNB_g[enb_id][CC_id]->dlsch[ue_id][0]->rnti= eNB_transport_info[enb_id][CC_id].dci_alloc[n_dci_dl].rnti; - dlsch_eNB = PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB[ue_id][0]; + dlsch_eNB = PHY_vars_eNB_g[enb_id][CC_id]->dlsch[ue_id][0]; #ifdef DEBUG_EMU LOG_D(EMU, " enb_id %d ue id is %d rnti is %x dci index %d, harq_pid %d tbs %d \n", @@ -393,9 +393,9 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot case 3://TB1: harq_pid = eNB_transport_info[enb_id][CC_id].harq_pid[n_dci_dl]; ue_id = eNB_transport_info[enb_id][CC_id].ue_id[n_dci_dl]; - PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB[ue_id][1]->rnti= + PHY_vars_eNB_g[enb_id][CC_id]->dlsch[ue_id][1]->rnti= eNB_transport_info[enb_id][CC_id].dci_alloc[n_dci_dl].rnti; - dlsch_eNB = PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB[ue_id][1]; + dlsch_eNB = PHY_vars_eNB_g[enb_id][CC_id]->dlsch[ue_id][1]; memcpy(dlsch_eNB->harq_processes[harq_pid]->b, &eNB_transport_info[enb_id][CC_id].transport_blocks[payload_offset], @@ -403,7 +403,7 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot break; case 5: - memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB_MCH->harq_processes[0]->b, + memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_MCH->harq_processes[0]->b, &eNB_transport_info[enb_id][CC_id].transport_blocks[payload_offset], eNB_transport_info[enb_id][CC_id].tbs[n_dci_dl]); #ifdef DEBUG_EMU @@ -491,52 +491,45 @@ void fill_phy_ue_vars(unsigned int ue_id, uint8_t CC_id,unsigned int last_slot) #endif for (n_enb = 0; n_enb < UE_transport_info[ue_id][CC_id].num_eNB; n_enb++) { -#ifdef DEBUG_EMU - /* LOG_D(EMU,"Setting ulsch vars for ue %d rnti %x harq pid is %d \n", - ue_id, UE_transport_info[ue_id][CC_id].rnti[n_enb], - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]); - */ -#endif + rnti = UE_transport_info[ue_id][CC_id].rnti[n_enb]; enb_id = UE_transport_info[ue_id][CC_id].eNB_id[n_enb]; - PHY_vars_UE_g[ue_id][CC_id]->lte_ue_pdcch_vars[enb_id]->crnti=rnti; + PHY_vars_UE_g[ue_id][CC_id]->pdcch_vars[enb_id]->crnti=rnti; harq_pid = UE_transport_info[ue_id][CC_id].harq_pid[n_enb]; - //ulsch = PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]; - - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o_RI[0] = + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o_RI[0] = ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_ri & 0x1; - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o_RI[1] = + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o_RI[1] = (ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_ri>>1) & 0x1; - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o_ACK[0]= + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o_ACK[0]= ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_ack & 0x1; - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o_ACK[1]= + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o_ACK[1]= (ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_ack>>1) & 0x1; //*(uint32_t *)ulsch->o = ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_uci; if ((last_slot % 2) == 1) { - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->O = + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->O = ue_cntl_delay[ue_id][CC_id][last_slot%2].length_uci; - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->uci_format = + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->uci_format = ue_cntl_delay[ue_id][CC_id][last_slot%2].uci_format; - memcpy(PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o, + memcpy(PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o, ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_uci, MAX_CQI_BYTES); - ulsch = PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]; + ulsch = PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]; // if (((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1) LOG_D(EMU, "[UE %d] subframe %d last slot %d copy the payload from eNB %d to UE %d with harq id %d cqi (val %d, length %d) \n", ue_id, subframe, last_slot, enb_id, ue_id, harq_pid, ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1, - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->O); + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->O); } - memcpy(PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->harq_processes[harq_pid]->b, + memcpy(PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->harq_processes[harq_pid]->b, UE_transport_info[ue_id][CC_id].transport_blocks, UE_transport_info[ue_id][CC_id].tbs[enb_id]); diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index 187f1109c0..5970adfa5f 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -130,7 +130,7 @@ void do_DL_sig(double **r_re0,double **r_im0, // find out which eNB the UE is attached to for (eNB_id=0; eNB_idlte_ue_pdcch_vars[0]->crnti,PHY_vars_eNB_g[eNB_id][CC_id])>=0) { + if (find_ue(PHY_vars_UE_g[UE_id][CC_id]->pdcch_vars[0]->crnti,PHY_vars_eNB_g[eNB_id][CC_id])>=0) { // UE with UE_id is connected to eNb with eNB_id att_eNB_id=eNB_id; LOG_D(OCM,"A: UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id); @@ -165,7 +165,7 @@ void do_DL_sig(double **r_re0,double **r_im0, //dlsch_abstraction(PHY_vars_UE_g[UE_id]->sinr_dB, rb_alloc, 8); // fill in perfect channel estimates channel_desc_t *desc1 = eNB2UE[att_eNB_id][UE_id][CC_id]; - int32_t **dl_channel_est = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.dl_ch_estimates[0]; + int32_t **dl_channel_est = PHY_vars_UE_g[UE_id][CC_id]->common_vars.dl_ch_estimates[0]; // double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0); double scale = pow(10.0,(frame_parms->pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB)/20.0); LOG_D(OCM,"scale =%lf (%d dB)\n",scale,(int) (20*log10(scale))); @@ -201,13 +201,13 @@ void do_DL_sig(double **r_re0,double **r_im0, // calculate the SNR for the attached eNB (this assumes eNB always uses PMI stored in eNB_UE_stats; to be improved) init_snr(eNB2UE[att_eNB_id][UE_id][CC_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB, &PHY_vars_UE_g[UE_id][CC_id]->N0, - PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id][CC_id]->eNB_UE_stats[UE_id].DL_pmi_single, - PHY_vars_eNB_g[att_eNB_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off,PHY_vars_eNB_g[att_eNB_id][CC_id]->lte_frame_parms.N_RB_DL); + PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id][CC_id]->UE_stats[UE_id].DL_pmi_single, + PHY_vars_eNB_g[att_eNB_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off,PHY_vars_eNB_g[att_eNB_id][CC_id]->frame_parms.N_RB_DL); // calculate sinr here for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { if (att_eNB_id != eNB_id) { - calculate_sinr(eNB2UE[eNB_id][UE_id][CC_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB,PHY_vars_eNB_g[att_eNB_id][CC_id]->lte_frame_parms.N_RB_DL); + calculate_sinr(eNB2UE[eNB_id][UE_id][CC_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB,PHY_vars_eNB_g[att_eNB_id][CC_id]->frame_parms.N_RB_DL); } } } // hold channel @@ -233,7 +233,7 @@ void do_DL_sig(double **r_re0,double **r_im0, // eNB2UE[eNB_id][UE_id]->path_loss_dB) <= -107.0) // break; - txdata = PHY_vars_eNB_g[eNB_id][CC_id]->lte_eNB_common_vars.txdata[0]; + txdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.txdata[0]; slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1)); tx_pwr = dac_fixed_gain(s_re, @@ -355,7 +355,7 @@ void do_DL_sig(double **r_re0,double **r_im0, LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1); #endif - rxdata = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.rxdata; + rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata; slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); adc(r_re, @@ -463,12 +463,6 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double #endif } else { //without abstraction - /* - for (UE_id=0;UE_idlte_ue_common_vars.txdataF,PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata,next_slot,&PHY_vars_UE_g[UE_id]->lte_frame_parms); - } - */ - for (eNB_id=0; eNB_idsamples_per_tti>>1); i++) { @@ -481,7 +475,7 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double // Compute RX signal for eNB = eNB_id for (UE_id=0; UE_idlte_ue_common_vars.txdata; + txdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.txdata; slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1)); @@ -571,14 +565,14 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double nb_antennas_rx, frame_parms->samples_per_tti>>1, 1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns) - (double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_eNB_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) + (double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) #ifdef DEBUG_SIM rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1); #endif - rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->lte_eNB_common_vars.rxdata[0]; + rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.rxdata[0]; slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); adc(r_re, diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index adfa4ab545..2472328c76 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -25,17 +25,17 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - *******************************************************************************/ +*******************************************************************************/ /*! \file oaisim.c -* \brief oaisim top level -* \author Navid Nikaein -* \date 2013-2015 -* \version 1.0 -* \company Eurecom -* \email: openair_tech@eurecom.fr -* \note -* \warning -*/ + * \brief oaisim top level + * \author Navid Nikaein + * \date 2013-2015 + * \version 1.0 + * \company Eurecom + * \email: openair_tech@eurecom.fr + * \note + * \warning + */ #include #include @@ -116,11 +116,11 @@ char smbv_ip[16]; #include "T.h" /* - DCI0_5MHz_TDD0_t UL_alloc_pdu; - DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu; - DCI2_5MHz_2A_L10PRB_TDD_t DLSCH_alloc_pdu1; - DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2; - */ + DCI0_5MHz_TDD0_t UL_alloc_pdu; + DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu; + DCI2_5MHz_2A_L10PRB_TDD_t DLSCH_alloc_pdu1; + DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2; +*/ #define UL_RB_ALLOC computeRIV(lte_frame_parms->N_RB_UL,0,24) #define CCCH_RB_ALLOC computeRIV(lte_frame_parms->N_RB_UL,0,3) @@ -352,8 +352,8 @@ int omv_write(int pfd, node_list* enb_node_list, node_list* ue_node_list, Data_F omv_data.geo[i].Neighbor[omv_data.geo[i].Neighbors] = j; omv_data.geo[i].Neighbors++; LOG_D( - OMG, - "[eNB %d][UE %d] is_UE_active(i,j) %d geo (x%d, y%d) num neighbors %d\n", i, j-NB_eNB_INST, is_UE_active(i,j-NB_eNB_INST), omv_data.geo[i].x, omv_data.geo[i].y, omv_data.geo[i].Neighbors); + OMG, + "[eNB %d][UE %d] is_UE_active(i,j) %d geo (x%d, y%d) num neighbors %d\n", i, j-NB_eNB_INST, is_UE_active(i,j-NB_eNB_INST), omv_data.geo[i].x, omv_data.geo[i].y, omv_data.geo[i].Neighbors); } } } @@ -388,8 +388,8 @@ int omv_write(int pfd, node_list* enb_node_list, node_list* ue_node_list, Data_F omv_data.geo[i].Neighbor[omv_data.geo[i].Neighbors] = j; omv_data.geo[i].Neighbors++; LOG_D( - OMG, - "[UE %d][eNB %d] is_UE_active %d geo (x%d, y%d) num neighbors %d\n", i-NB_eNB_INST, j, is_UE_active(j,i-NB_eNB_INST), omv_data.geo[i].x, omv_data.geo[i].y, omv_data.geo[i].Neighbors); + OMG, + "[UE %d][eNB %d] is_UE_active %d geo (x%d, y%d) num neighbors %d\n", i-NB_eNB_INST, j, is_UE_active(j,i-NB_eNB_INST), omv_data.geo[i].x, omv_data.geo[i].y, omv_data.geo[i].Neighbors); } } } @@ -441,16 +441,14 @@ l2l1_task (void *args_p) int CC_id; // Framing variables - int32_t slot, last_slot, next_slot; + int32_t sf; #ifdef Rel10 relaying_type_t r_type = no_relay; // no relaying #endif - - lte_subframe_t direction; - + char fname[64], vname[64]; - int sf; + protocol_ctxt_t ctxt; //#ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) @@ -478,22 +476,7 @@ l2l1_task (void *args_p) char eNB_stats_th_filename[255]; #endif - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) - for (eNB_inst = 0; eNB_inst < NB_eNB_INST; eNB_inst++) { - for (sf = 0; sf < 10; sf++) { - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].frame_tx = 0; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].frame_rx = 0; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].subframe_tx = (sf + 1) - % 10; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].subframe_rx = (sf + 9) - % 10; - } - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[0].frame_rx = 1023; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[9].frame_tx = 1; - } - - //#ifdef XFORMS if (xforms==1) { xargv[0] = xname; fl_initialize (&xargc, xargv, NULL, 0, 0); @@ -520,7 +503,7 @@ l2l1_task (void *args_p) } } - //#endif + #ifdef PRINT_STATS @@ -689,55 +672,34 @@ l2l1_task (void *args_p) omv_write (pfd[1], enb_node_list, ue_node_list, omv_data); } -#endif -#ifdef DEBUG_OMG - /* - if ((((int) oai_emulation.info.time_s) % 100) == 0) { - for (UE_inst = oai_emulation.info.first_ue_local; UE_inst < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_inst++) { - get_node_position (UE, UE_inst); - } - } - */ #endif update_ocm (); - for (slot = 0; slot < 20; slot++) { - if (slot % 2 == 0) - start_meas (&oaisim_stats_f); + for (sf = 0; sf < 10; sf++) { + start_meas (&oaisim_stats_f); wait_for_slot_isr (); #if defined(ENABLE_ITTI) - itti_update_lte_time(frame % MAX_FRAME_NUMBER, slot); + itti_update_lte_time(frame % MAX_FRAME_NUMBER, sf<<1); #endif - last_slot = (slot - 1) % 20; - - if (last_slot < 0) - last_slot += 20; - - next_slot = (slot + 1) % 20; - - oai_emulation.info.time_ms = frame * 10 + (slot >> 1); - - direction = subframe_select (frame_parms[0], next_slot >> 1); + oai_emulation.info.time_ms = frame * 10 + sf; #ifdef PROC - if(Channel_Flag==1) - Channel_Func(s_re2,s_im2,r_re2,r_im2,r_re02,r_im02,r_re0_d,r_im0_d,r_re0_u,r_im0_u,eNB2UE,UE2eNB,enb_data,ue_data,abstraction_flag,frame_parms,slot); + if(Channel_Flag==1) + Channel_Func(s_re2,s_im2,r_re2,r_im2,r_re02,r_im02,r_re0_d,r_im0_d,r_re0_u,r_im0_u,eNB2UE,UE2eNB,enb_data,ue_data,abstraction_flag,frame_parms,sf<<1); - if(Channel_Flag==0) + if(Channel_Flag==0) #endif - { + { // SUBFRAME INNER PART #if defined(ENABLE_ITTI) log_set_instance_type (LOG_INSTANCE_ENB); #endif - // if ((next_slot % 2) == 0) - if ((slot & 1) == 0) - clear_eNB_transport_info (oai_emulation.info.nb_enb_local); + clear_eNB_transport_info (oai_emulation.info.nb_enb_local); for (eNB_inst = oai_emulation.info.first_enb_local; (eNB_inst @@ -745,41 +707,50 @@ l2l1_task (void *args_p) + oai_emulation.info.nb_enb_local)); eNB_inst++) { if (oai_emulation.info.cli_start_enb[eNB_inst] != 0) { - if ((slot & 1) == 0) { - T(T_ENB_MASTER_TICK, T_INT(eNB_inst), T_INT(frame % 1024), T_INT(slot/2)); - LOG_D(EMU, - "PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d) TDD %d/%d Nid_cell %d\n", - eNB_inst, - frame % MAX_FRAME_NUMBER, - slot, - PHY_vars_eNB_g[eNB_inst][0]->proc[slot >> 1].subframe_tx, - PHY_vars_eNB_g[eNB_inst][0]->proc[slot >> 1].subframe_rx, - PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.frame_type, - PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.tdd_config, - PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.Nid_cell); - } + + T(T_ENB_MASTER_TICK, T_INT(eNB_inst), T_INT(frame % 1024), T_INT(sf)); + LOG_D(EMU, + "PHY procedures eNB %d for frame %d, subframe %d TDD %d/%d Nid_cell %d\n", + eNB_inst, + frame % MAX_FRAME_NUMBER, + sf, + PHY_vars_eNB_g[eNB_inst][0]->frame_parms.frame_type, + PHY_vars_eNB_g[eNB_inst][0]->frame_parms.tdd_config, + PHY_vars_eNB_g[eNB_inst][0]->frame_parms.Nid_cell); + #ifdef OPENAIR2 - //Application: traffic gen + //Application: traffic gen update_otg_eNB (eNB_inst, oai_emulation.info.time_ms); //IP/OTG to PDCP and PDCP to IP operation // pdcp_run (frame, 1, 0, eNB_inst); //PHY_vars_eNB_g[eNB_id]->Mod_id #endif - // PHY_vars_eNB_g[eNB_id]->frame = frame; - if ((slot & 1) == 0) - phy_procedures_eNB_lte (slot >> 1, - PHY_vars_eNB_g[eNB_inst], - abstraction_flag, no_relay, - NULL); + CC_id=0; + PHY_vars_eNB_g[eNB_inst][CC_id]->proc.frame_rx = frame; + PHY_vars_eNB_g[eNB_inst][CC_id]->proc.subframe_rx = sf; + PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1].frame_rx = frame; + PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1].subframe_rx = sf; + PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1].subframe_tx = (sf+4)%10; + PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1].frame_tx = (sf<6) ? frame : frame+1; + phy_procedures_eNB_common_RX(PHY_vars_eNB_g[eNB_inst][CC_id], + abstraction_flag); + phy_procedures_eNB_uespec_RX(PHY_vars_eNB_g[eNB_inst][CC_id], + &PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1], + abstraction_flag, + no_relay); + phy_procedures_eNB_TX(PHY_vars_eNB_g[eNB_inst][CC_id], + &PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1], + 0,no_relay,NULL); + #ifdef PRINT_STATS - if(last_slot==9 && frame%10==0) + if((sf==9) && frame%10==0) if(eNB_avg_thr) - fprintf(eNB_avg_thr,"%d %d\n",PHY_vars_eNB_g[eNB_inst][0]->proc[slot>>1].frame_tx, - (PHY_vars_eNB_g[eNB_inst][0]->total_system_throughput)/((PHY_vars_eNB_g[eNB_inst][0]->proc[slot>>1].frame_tx+1)*10)); + fprintf(eNB_avg_thr,"%d %d\n",PHY_vars_eNB_g[eNB_inst][0]->proc.proc_rxtx[sf&1].frame_tx, + (PHY_vars_eNB_g[eNB_inst][0]->total_system_throughput)/((PHY_vars_eNB_g[eNB_inst][0]->proc.proc_rxtx[sf&1].frame_tx+1)*10)); if (eNB_stats[eNB_inst]) { len = dump_eNB_stats(PHY_vars_eNB_g[eNB_inst][0], stats_buffer, 0); @@ -800,7 +771,7 @@ l2l1_task (void *args_p) #endif #endif } - } + }// eNB_inst loop // Call ETHERNET emulation here //emu_transport (frame, last_slot, next_slot, direction, oai_emulation.info.frame_type, ethernet_flag); @@ -809,9 +780,7 @@ l2l1_task (void *args_p) log_set_instance_type (LOG_INSTANCE_UE); #endif - if ((next_slot % 2) == 0) - // if ((slot&1) == 0) - clear_UE_transport_info (oai_emulation.info.nb_ue_local); + clear_UE_transport_info (oai_emulation.info.nb_ue_local); for (UE_inst = oai_emulation.info.first_ue_local; (UE_inst < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local)); @@ -823,435 +792,302 @@ l2l1_task (void *args_p) if (frame >= (UE_inst * 20)) // activate UE only after 20*UE_id frames so that different UEs turn on separately #endif - { - LOG_D(EMU, - "PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n", - UE_inst, frame % MAX_FRAME_NUMBER, slot, next_slot >> 1, - last_slot >> 1); + { // UE_PROCEDURES + LOG_D(EMU, + "PHY procedures UE %d for frame %d, subframe %d\n", + UE_inst, frame % MAX_FRAME_NUMBER, sf); - if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] - != NOT_SYNCHED) { - if (frame > 0) { - PHY_vars_UE_g[UE_inst][0]->frame_rx = frame % MAX_FRAME_NUMBER; - PHY_vars_UE_g[UE_inst][0]->slot_rx = last_slot; - PHY_vars_UE_g[UE_inst][0]->slot_tx = next_slot; - - if (next_slot > 1) - PHY_vars_UE_g[UE_inst][0]->frame_tx = frame % MAX_FRAME_NUMBER; - else - PHY_vars_UE_g[UE_inst][0]->frame_tx = (frame + 1) % MAX_FRAME_NUMBER; + if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] + != NOT_SYNCHED) { + if (frame > 0) { + PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1].frame_rx = frame % MAX_FRAME_NUMBER; + PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1].subframe_rx = sf; + PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1].frame_tx = ((sf<6) ? frame : frame+1)% MAX_FRAME_NUMBER; + PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1].subframe_tx = (sf+4)%10; #ifdef OPENAIR2 - //Application - update_otg_UE (UE_inst, oai_emulation.info.time_ms); + //Application + update_otg_UE (UE_inst, oai_emulation.info.time_ms); - //Access layer - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE_inst, 0, ENB_FLAG_NO, NOT_A_RNTI, frame % MAX_FRAME_NUMBER, next_slot); - pdcp_run (&ctxt); + //Access layer + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE_inst, 0, ENB_FLAG_NO, NOT_A_RNTI, frame % MAX_FRAME_NUMBER, sf); + pdcp_run (&ctxt); #endif - for (CC_id = 0; CC_id < MAX_NUM_CCs; - CC_id++) { - phy_procedures_UE_lte ( - PHY_vars_UE_g[UE_inst][CC_id], - 0, abstraction_flag, - normal_txrx, no_relay, - NULL); - } + for (CC_id = 0; CC_id < MAX_NUM_CCs; + CC_id++) { + phy_procedures_UE_RX(PHY_vars_UE_g[UE_inst][CC_id], + &PHY_vars_UE_g[UE_inst][CC_id]->proc.proc_rxtx[sf&1], + 0, abstraction_flag, + normal_txrx, no_relay, + NULL); + phy_procedures_UE_TX(PHY_vars_UE_g[UE_inst][CC_id], + &PHY_vars_UE_g[UE_inst][CC_id]->proc.proc_rxtx[sf&1], + 0, + abstraction_flag, + normal_txrx, + no_relay); + } - ue_data[UE_inst]->tx_power_dBm = - PHY_vars_UE_g[UE_inst][0]->tx_power_dBm; - } - } else { - if (abstraction_flag == 1) { - LOG_E(EMU, - "sync not supported in abstraction mode (UE%d,mode%d)\n", - UE_inst, - PHY_vars_UE_g[UE_inst][0]->UE_mode[0]); - exit (-1); - } + ue_data[UE_inst]->tx_power_dBm = + PHY_vars_UE_g[UE_inst][0]->tx_power_dBm; + } + } else { + if (abstraction_flag == 1) { + LOG_E(EMU, + "sync not supported in abstraction mode (UE%d,mode%d)\n", + UE_inst, + PHY_vars_UE_g[UE_inst][0]->UE_mode[0]); + exit (-1); + } - if ((frame > 0) - && (last_slot - == (LTE_SLOTS_PER_FRAME - - 2))) { - initial_sync (PHY_vars_UE_g[UE_inst][0], - normal_txrx); + if ((frame > 0) + && (sf==9)){ - /* - write_output("dlchan00.m","dlch00",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - if (PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx>1) - write_output("dlchan01.m","dlch01",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][1][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - write_output("dlchan10.m","dlch10",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][2][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - if (PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx>1) - write_output("dlchan11.m","dlch11",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][3][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - write_output("rxsig.m","rxs",PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[0],PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*10,1,1); - write_output("rxsigF.m","rxsF",PHY_vars_UE_g[0]->lte_ue_common_vars.rxdataF[0],2*PHY_vars_UE_g[0]->lte_frame_parms.symbols_per_tti*PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size,2,1); - write_output("pbch_rxF_ext0.m","pbch_ext0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_ext[0],6*12*4,1,1); - write_output("pbch_rxF_comp0.m","pbch_comp0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0],6*12*4,1,1); - write_output("pbch_rxF_llr.m","pbch_llr",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); - */ - } - } + initial_sync (PHY_vars_UE_g[UE_inst][0], + normal_txrx); + + /* + write_output("dlchan00.m","dlch00",&(PHY_vars_UE_g[0]->common_vars.dl_ch_estimates[0][0][0]),(6*(PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size)),1,1); + if (PHY_vars_UE_g[0]->frame_parms.nb_antennas_rx>1) + write_output("dlchan01.m","dlch01",&(PHY_vars_UE_g[0]->common_vars.dl_ch_estimates[0][1][0]),(6*(PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size)),1,1); + write_output("dlchan10.m","dlch10",&(PHY_vars_UE_g[0]->common_vars.dl_ch_estimates[0][2][0]),(6*(PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size)),1,1); + if (PHY_vars_UE_g[0]->frame_parms.nb_antennas_rx>1) + write_output("dlchan11.m","dlch11",&(PHY_vars_UE_g[0]->common_vars.dl_ch_estimates[0][3][0]),(6*(PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size)),1,1); + write_output("rxsig.m","rxs",PHY_vars_UE_g[0]->common_vars.rxdata[0],PHY_vars_UE_g[0]->frame_parms.samples_per_tti*10,1,1); + write_output("rxsigF.m","rxsF",PHY_vars_UE_g[0]->common_vars.rxdataF[0],2*PHY_vars_UE_g[0]->frame_parms.symbols_per_tti*PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size,2,1); + write_output("pbch_rxF_ext0.m","pbch_ext0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_ext[0],6*12*4,1,1); + write_output("pbch_rxF_comp0.m","pbch_comp0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0],6*12*4,1,1); + write_output("pbch_rxF_llr.m","pbch_llr",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); + */ + } + } #ifdef PRINT_STATS - if(last_slot==2 && frame%10==0) { - if (UE_stats_th[UE_inst]) { - fprintf(UE_stats_th[UE_inst],"%d %d\n",frame % MAX_FRAME_NUMBER, PHY_vars_UE_g[UE_inst][0]->bitrate[0]/1000); - } - } + if((sf==1) && frame%10==0) { + if (UE_stats_th[UE_inst]) { + fprintf(UE_stats_th[UE_inst],"%d %d\n",frame % MAX_FRAME_NUMBER, PHY_vars_UE_g[UE_inst][0]->bitrate[0]/1000); + } + } - if (UE_stats[UE_inst]) { - len = dump_ue_stats (PHY_vars_UE_g[UE_inst][0], stats_buffer, 0, normal_txrx, 0); - rewind (UE_stats[UE_inst]); - fwrite (stats_buffer, 1, len, UE_stats[UE_inst]); - fflush(UE_stats[UE_inst]); - } + if (UE_stats[UE_inst]) { + len = dump_ue_stats (PHY_vars_UE_g[UE_inst][0], &PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1],stats_buffer, 0, normal_txrx, 0); + rewind (UE_stats[UE_inst]); + fwrite (stats_buffer, 1, len, UE_stats[UE_inst]); + fflush(UE_stats[UE_inst]); + } #endif - } + } // UE_PROCEDURES } - } + } // UE_inst -#ifdef Rel10 - - for (RN_id=oai_emulation.info.first_rn_local; - RN_idframe = frame % MAX_FRAME_NUMBER; - - if ( oai_emulation.info.frame_type == 0) { - // RN == UE - if (frame>0) { - if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] != NOT_SYNCHED) { - LOG_D(EMU,"[RN %d] PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n", - RN_id, UE_inst, frame, slot, next_slot >> 1,last_slot>>1); - PHY_vars_UE_g[UE_inst][0]->frame_rx = frame % MAX_FRAME_NUMBER; - PHY_vars_UE_g[UE_inst][0]->slot_rx = last_slot; - PHY_vars_UE_g[UE_inst][0]->slot_tx = next_slot; - - if (next_slot>1) PHY_vars_UE_g[UE_inst][0]->frame_tx = frame % MAX_FRAME_NUMBER; - else PHY_vars_UE_g[UE_inst][0]->frame_tx = (frame+1) % MAX_FRAME_NUMBER; - - phy_procedures_UE_lte (PHY_vars_UE_g[UE_inst][0], 0, abstraction_flag,normal_txrx, - r_type, PHY_vars_RN_g[RN_id]); - } else if (last_slot == (LTE_SLOTS_PER_FRAME-2)) { - initial_sync(PHY_vars_UE_g[UE_inst][0],normal_txrx); - } - } - - // RN == eNB - LOG_D(EMU,"[RN %d] PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d)\n", - RN_id, eNB_inst, frame % MAX_FRAME_NUMBER, slot, next_slot >> 1,last_slot>>1); - phy_procedures_eNB_lte(slot>>1, PHY_vars_eNB_g[eNB_inst], abstraction_flag, - r_type, PHY_vars_RN_g[RN_id]); - } else { - LOG_E(EMU,"TDD is not supported for multicast relaying %d\n", r_type); - exit(-1); - } - } - -#endif - emu_transport (frame % MAX_FRAME_NUMBER, last_slot, next_slot, direction, + emu_transport (frame % MAX_FRAME_NUMBER, sf<<1, ((sf+4)%10)<<1, subframe_select(&PHY_vars_eNB_g[0][0]->frame_parms,sf), oai_emulation.info.frame_type[0], ethernet_flag); - if ((direction == SF_DL) - || (frame_parms[0]->frame_type == FDD)) { - // consider only sec id 0 - /* for (eNB_id=0;eNB_idlte_eNB_common_vars.txdataF[0], - PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0], - frame,next_slot, - frame_parms); - } - }*/ - start_meas (&dl_chan_stats); + start_meas (&dl_chan_stats); + + for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + //#warning figure out what to do with UE frame_parms during initial_sync + do_DL_sig (r_re0, + r_im0, + r_re, + r_im, + s_re, + s_im, + eNB2UE, + enb_data, + ue_data, + PHY_vars_eNB_g[0][CC_id]->proc.proc_rxtx[sf&1].subframe_tx<<1, + abstraction_flag, + &PHY_vars_eNB_g[0][CC_id]->frame_parms, + UE_inst, CC_id); + do_DL_sig (r_re0, + r_im0, + r_re, + r_im, + s_re, + s_im, + eNB2UE, + enb_data, + ue_data, + (PHY_vars_eNB_g[0][CC_id]->proc.proc_rxtx[sf&1].subframe_tx<<1)+1, + abstraction_flag, + &PHY_vars_eNB_g[0][CC_id]->frame_parms, + UE_inst, CC_id); + } - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { -//#warning figure out what to do with UE frame_parms during initial_sync - do_DL_sig (r_re0, - r_im0, - r_re, - r_im, - s_re, - s_im, - eNB2UE, - enb_data, - ue_data, - next_slot, - abstraction_flag, - &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - UE_inst, CC_id); - } + stop_meas (&dl_chan_stats); + - stop_meas (&dl_chan_stats); - } + start_meas (&ul_chan_stats); + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + //#warning figure out what to do with UE frame_parms during initial_sync + do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, + enb_data, ue_data, + PHY_vars_UE_g[0][CC_id]->proc.proc_rxtx[sf&1].subframe_tx<<1, + abstraction_flag, + &PHY_vars_eNB_g[0][CC_id]->frame_parms, + frame % MAX_FRAME_NUMBER, CC_id); + do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, + enb_data, ue_data, + (PHY_vars_UE_g[0][CC_id]->proc.proc_rxtx[sf&1].subframe_tx<<1)+1, + abstraction_flag, + &PHY_vars_eNB_g[0][CC_id]->frame_parms, + frame % MAX_FRAME_NUMBER, CC_id); + } + + stop_meas (&ul_chan_stats); - if ((direction == SF_UL) || (frame_parms[0]->frame_type == 0)) { //if ((subframe<2) || (subframe>4)) - start_meas (&ul_chan_stats); - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { -//#warning figure out what to do with UE frame_parms during initial_sync - do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, - enb_data, ue_data, next_slot, - abstraction_flag, - &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - frame % MAX_FRAME_NUMBER, CC_id); - } - - stop_meas (&ul_chan_stats); - /* - int ccc; - fprintf(SINRpost,"SINRdb For eNB New Subframe : \n "); - for(ccc = 0 ; ccc<301; ccc++) - { - fprintf(SINRpost,"_ %f ", SINRpost_eff[ccc]); - } - fprintf(SINRpost,"SINRdb For eNB : %f \n ", SINRpost_eff[ccc]); - */ - } - - if ((direction == SF_S)) { //it must be a special subframe - if (next_slot % 2 == 0) { //DL part - /* for (eNB_id=0;eNB_idlte_eNB_common_vars.txdataF[0], - PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0], - frame,next_slot, - frame_parms); - } - }*/ - start_meas (&dl_chan_stats); - - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { -//#warning check dimensions of r_reN,r_imN for multiple CCs - do_DL_sig (r_re0, - r_im0, - r_re, - r_im, - s_re, - s_im, - eNB2UE, - enb_data, - ue_data, - next_slot, - abstraction_flag, - &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - UE_inst, CC_id); - } - - stop_meas (&dl_chan_stats); - /* - for (aarx=0;aarxnb_rx;aarx++) - for (aatx=0;aatxnb_tx;aatx++) - for (k=0;kchannel_length;k++) - printf("SB(%d,%d,%d)->(%f,%f)\n",k,aarx,aatx,UE2eNB[1][0]->ch[aarx+(aatx*UE2eNB[1][0]->nb_rx)][k].r,UE2eNB[1][0]->ch[aarx+(aatx*UE2eNB[1][0]->nb_rx)][k].i); - */ - } else { // UL part - start_meas (&ul_chan_stats); - - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { -//#warning check dimensions of r_reN,r_imN for multiple CCs - do_UL_sig (r_re0, - r_im0, - r_re, - r_im, - s_re, - s_im, - UE2eNB, - enb_data, - ue_data, - next_slot, - abstraction_flag, - &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - frame % MAX_FRAME_NUMBER, CC_id); - } - - stop_meas (&ul_chan_stats); - - /* int ccc; - fprintf(SINRpost,"SINRdb For eNB New Subframe : \n "); - for(ccc = 0 ; ccc<301; ccc++) - { - fprintf(SINRpost,"_ %f ", SINRpost_eff[ccc]); - } - fprintf(SINRpost,"SINRdb For eNB : %f \n ", SINRpost_eff[ccc]); - } - */ - } - } - - if ((last_slot == 1) && ((frame % MAX_FRAME_NUMBER) == 0) && (abstraction_flag == 0) - && (oai_emulation.info.n_frames == 1)) { - - write_output ("dlchan0.m", - "dlch0", - &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]), - (6 - * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), - 1, 1); - write_output ("dlchan1.m", - "dlch1", - &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[1][0][0]), - (6 - * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), - 1, 1); - write_output ("dlchan2.m", - "dlch2", - &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[2][0][0]), - (6 - * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), - 1, 1); - write_output ("pbch_rxF_comp0.m", - "pbch_comp0", - PHY_vars_UE_g[0][0]->lte_ue_pbch_vars[0]->rxdataF_comp[0], - 6 * 12 * 4, 1, 1); - write_output ("pbch_rxF_llr.m", "pbch_llr", - PHY_vars_UE_g[0][0]->lte_ue_pbch_vars[0]->llr, - (frame_parms[0]->Ncp == 0) ? 1920 : 1728, 1, - 4); - } - - /* - if ((last_slot==1) && (frame==1)) { - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0",PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0],300*(-(PHY_vars_UE->lte_frame_parms.Ncp*2)+14),1,1); - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); - } - */ - } // if Channel_Flag==0 - - if (slot % 2 == 1) - stop_meas (&oaisim_stats_f); - } //end of slot + if ((sf == 0) && ((frame % MAX_FRAME_NUMBER) == 0) && (abstraction_flag == 0) + && (oai_emulation.info.n_frames == 1)) { + + write_output ("dlchan0.m", + "dlch0", + &(PHY_vars_UE_g[0][0]->common_vars.dl_ch_estimates[0][0][0]), + (6 + * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), + 1, 1); + write_output ("dlchan1.m", + "dlch1", + &(PHY_vars_UE_g[0][0]->common_vars.dl_ch_estimates[1][0][0]), + (6 + * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), + 1, 1); + write_output ("dlchan2.m", + "dlch2", + &(PHY_vars_UE_g[0][0]->common_vars.dl_ch_estimates[2][0][0]), + (6 + * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), + 1, 1); + write_output ("pbch_rxF_comp0.m", + "pbch_comp0", + PHY_vars_UE_g[0][0]->pbch_vars[0]->rxdataF_comp[0], + 6 * 12 * 4, 1, 1); + write_output ("pbch_rxF_llr.m", "pbch_llr", + PHY_vars_UE_g[0][0]->pbch_vars[0]->llr, + (frame_parms[0]->Ncp == 0) ? 1920 : 1728, 1, + 4); + } + + stop_meas (&oaisim_stats_f); + } // SUBFRAME INNER PART + } + if ((frame >= 10) && (frame <= 11) && (abstraction_flag == 0) #ifdef PROC - &&(Channel_Flag==0) + &&(Channel_Flag==0) #endif - ) { + ) { sprintf (fname, "UEtxsig%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "txs%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_UE_g[0][0]->lte_ue_common_vars.txdata[0], - PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti - * 10, - 1, 1); + vname, + PHY_vars_UE_g[0][0]->common_vars.txdata[0], + PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti + * 10, + 1, 1); sprintf (fname, "eNBtxsig%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "txs%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdata[0][0], - PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti - * 10, - 1, 1); + vname, + PHY_vars_eNB_g[0][0]->common_vars.txdata[0][0], + PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti + * 10, + 1, 1); sprintf (fname, "eNBtxsigF%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "txsF%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdataF[0][0], - PHY_vars_eNB_g[0][0]->lte_frame_parms.symbols_per_tti - * PHY_vars_eNB_g[0][0]->lte_frame_parms.ofdm_symbol_size, - 1, 1); + vname, + PHY_vars_eNB_g[0][0]->common_vars.txdataF[0][0], + PHY_vars_eNB_g[0][0]->frame_parms.symbols_per_tti + * PHY_vars_eNB_g[0][0]->frame_parms.ofdm_symbol_size, + 1, 1); sprintf (fname, "UErxsig%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "rxs%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_UE_g[0][0]->lte_ue_common_vars.rxdata[0], - PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti - * 10, - 1, 1); + vname, + PHY_vars_UE_g[0][0]->common_vars.rxdata[0], + PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti + * 10, + 1, 1); sprintf (fname, "eNBrxsig%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "rxs%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.rxdata[0][0], - PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti - * 10, - 1, 1); + vname, + PHY_vars_eNB_g[0][0]->common_vars.rxdata[0][0], + PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti + * 10, + 1, 1); } - + //#ifdef XFORMS if (xforms==1) { - eNB_inst = 0; + eNB_inst = 0; + + for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { + for (CC_id=0;CC_idlte_frame_parms); + smbv_write_config_from_frame_parms(smbv_fname, &PHY_vars_eNB_g[0][0]->frame_parms); #endif // add events to future event list: Currently not used @@ -1862,38 +1698,38 @@ oai_shutdown (void) if (abstraction_flag == 0 && Channel_Flag==0 && Process_Flag==0) #else - if (abstraction_flag == 0) + if (abstraction_flag == 0) #endif - { - /* - #ifdef IFFT_FPGA - free(txdataF2[0]); - free(txdataF2[1]); - free(txdataF2); - free(txdata[0]); - free(txdata[1]); - free(txdata); - #endif - */ + { + /* + #ifdef IFFT_FPGA + free(txdataF2[0]); + free(txdataF2[1]); + free(txdataF2); + free(txdata[0]); + free(txdata[1]); + free(txdata); + #endif + */ - for (int i = 0; i < 2; i++) { - free (s_re[i]); - free (s_im[i]); - free (r_re[i]); - free (r_im[i]); - } + for (int i = 0; i < 2; i++) { + free (s_re[i]); + free (s_im[i]); + free (r_re[i]); + free (r_im[i]); + } - free (s_re); - free (s_im); - free (r_re); - free (r_im); - s_re = 0; - s_im = 0; - r_re = 0; - r_im = 0; + free (s_re); + free (s_im); + free (r_re); + free (r_im); + s_re = 0; + s_im = 0; + r_re = 0; + r_im = 0; - lte_sync_time_free (); - } + lte_sync_time_free (); + } // added for PHY abstraction if (oai_emulation.info.ocm_enabled == 1) { @@ -1961,3 +1797,5 @@ get_OAI_emulation () { return &oai_emulation; } + + diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 922114aa8e..5a970ca038 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -958,21 +958,21 @@ void init_openair1(void) PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK; PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_RI_Index = beta_RI; PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI; - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.p_b = (frame_parms[CC_id]->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_A = rho_B + PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.pdsch_config_common.p_b = (frame_parms[CC_id]->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_A = rho_B PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK; PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = beta_RI; PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI; - PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.pdsch_config_common.p_b = (frame_parms[CC_id]->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_A = rho_B + PHY_vars_UE_g[UE_id][CC_id]->frame_parms.pdsch_config_common.p_b = (frame_parms[CC_id]->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_A = rho_B } } } printf ("AFTER init: MAX_NUM_CCs %d, Nid_cell %d frame_type %d,tdd_config %d\n", MAX_NUM_CCs, - PHY_vars_eNB_g[0][0]->lte_frame_parms.Nid_cell, - PHY_vars_eNB_g[0][0]->lte_frame_parms.frame_type, - PHY_vars_eNB_g[0][0]->lte_frame_parms.tdd_config); + PHY_vars_eNB_g[0][0]->frame_parms.Nid_cell, + PHY_vars_eNB_g[0][0]->frame_parms.frame_type, + PHY_vars_eNB_g[0][0]->frame_parms.tdd_config); number_of_cards = 1; @@ -993,12 +993,12 @@ void init_openair1(void) for (UE_id=0; UE_iduse_ia_receiver = 0; - if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.frame_type == TDD) { - if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 100) + if (PHY_vars_UE_g[UE_id][CC_id]->frame_parms.frame_type == TDD) { + if (PHY_vars_UE_g[UE_id][CC_id]->frame_parms.N_RB_DL == 100) PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624; - else if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 50) + else if (PHY_vars_UE_g[UE_id][CC_id]->frame_parms.N_RB_DL == 50) PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624/2; - else if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 25) + else if (PHY_vars_UE_g[UE_id][CC_id]->frame_parms.N_RB_DL == 25) PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624/4; } else { PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 0; @@ -1006,12 +1006,12 @@ void init_openair1(void) } for (eNB_id=0; eNB_idlte_frame_parms.frame_type == TDD) { - if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 100) + if (PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.frame_type == TDD) { + if (PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.N_RB_DL == 100) PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624; - else if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 50) + else if (PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.N_RB_DL == 50) PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624/2; - else if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 25) + else if (PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.N_RB_DL == 25) PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624/4; } else { PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 0; @@ -1048,7 +1048,7 @@ void init_openair1(void) else PHY_vars_UE_g[UE_id][CC_id]->mac_enabled=1; - PHY_vars_UE_g[UE_id][CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235 + UE_id; + PHY_vars_UE_g[UE_id][CC_id]->pdcch_vars[0]->crnti = 0x1235 + UE_id; PHY_vars_UE_g[UE_id][CC_id]->current_dlsch_cqi[0] = 10; LOG_I(EMU, "UE %d mode is initialized to %d\n", UE_id, PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] ); @@ -1077,7 +1077,7 @@ void init_openair2(void) //#warning "eNB index is hard coded to zero" for (CC_id=0; CC_idlte_frame_parms, + l2_init (&PHY_vars_eNB_g[0][CC_id]->frame_parms, oai_emulation.info.eMBMS_active_state, NULL, oai_emulation.info.cba_group_active, @@ -1167,8 +1167,8 @@ void init_ocm(void) map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option), eNB_id, UE_id); /* if (oai_emulation.info.transmission_mode == 5) - eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE_g[UE_id]->lte_frame_parms.nb_antennas_rx, + eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id]->frame_parms.nb_antennas_tx, + PHY_vars_UE_g[UE_id]->frame_parms.nb_antennas_rx, (UE_id == 0)? Rice1_corr : Rice1_anticorr, oai_emulation.environment_system_config.system_bandwidth_MB, forgetting_factor, @@ -1179,11 +1179,11 @@ void init_ocm(void) */ eNB2UE[eNB_id][UE_id][CC_id] = - new_channel_desc_scm(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.nb_antennas_rx, + new_channel_desc_scm(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.nb_antennas_tx, + PHY_vars_UE_g[UE_id][CC_id]->frame_parms.nb_antennas_rx, map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option), - N_RB2sampling_rate(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.N_RB_DL), forgetting_factor, 0, 0); @@ -1192,11 +1192,11 @@ void init_ocm(void) map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, eNB_id); UE2eNB[UE_id][eNB_id][CC_id] = - new_channel_desc_scm(PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.nb_antennas_tx, - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_rx, + new_channel_desc_scm(PHY_vars_UE_g[UE_id][CC_id]->frame_parms.nb_antennas_tx, + PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.nb_antennas_rx, map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option), - N_RB2sampling_rate(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_UL), - N_RB2channel_bandwidth(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_UL), + N_RB2sampling_rate(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.N_RB_UL), + N_RB2channel_bandwidth(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.N_RB_UL), forgetting_factor, 0, 0); @@ -1265,7 +1265,7 @@ void update_ocm() int CC_id; for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) - enb_data[eNB_id]->tx_power_dBm = PHY_vars_eNB_g[eNB_id][0]->lte_frame_parms.pdsch_config_common.referenceSignalPower; + enb_data[eNB_id]->tx_power_dBm = PHY_vars_eNB_g[eNB_id][0]->frame_parms.pdsch_config_common.referenceSignalPower; for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id][0]->tx_power_dBm; @@ -1315,16 +1315,16 @@ void update_ocm() //pathloss: -132.24 dBm/15kHz RE + target SNR - eNB TX power per RE if (eNB_id == (UE_id % NB_eNB_INST)) { - eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -132.24 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; + eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -132.24 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.pdsch_config_common.referenceSignalPower; + UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.pdsch_config_common.referenceSignalPower; } else { - eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; + eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.pdsch_config_common.referenceSignalPower; + UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.pdsch_config_common.referenceSignalPower; } LOG_I(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",eNB_id,UE_id,CC_id, eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB, - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,snr_dB); + PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.pdsch_config_common.referenceSignalPower,snr_dB); // printf("[SIM] Path loss from UE %d to eNB %d => %f dB\n",UE_id,eNB_id,UE2eNB[UE_id][eNB_id]->path_loss_dB); } } From 29fdf1a35a7c49fd1b3d9be1e206c5b3b99f87cb Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 17 Jul 2016 22:50:24 +0200 Subject: [PATCH 117/340] modifications for UE on ExpressMIMO2, validation on USRP. Only RX path is activated. --- openair2/UTIL/LOG/vcd_signal_dumper.c | 19 +- openair2/UTIL/LOG/vcd_signal_dumper.h | 19 +- targets/ARCH/COMMON/common_lib.h | 3 +- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 224 +++++++++++++----- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h | 1 + targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 2 +- targets/RT/USER/lte-softmodem.c | 20 +- targets/RT/USER/lte-ue.c | 70 ++++-- targets/RT/USER/ue_usrp.gtkw | 35 +-- 9 files changed, 263 insertions(+), 130 deletions(-) diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 8fe33fefd5..a643874444 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -81,12 +81,14 @@ const char* eurecomVariablesNames[] = { "subframe_number_RX_eNB", "runtime_TX_eNB", "runtime_RX_eNB", - "frame_number_TX_UE", - "frame_number_RX_UE", - "slot_number_TX_UE", - "slot_number_RX_UE", - "subframe_number_TX_UE", - "subframe_number_RX_UE", + "frame_number_TX0_UE", + "frame_number_TX1_UE", + "frame_number_RX0_UE", + "frame_number_RX1_UE", + "subframe_TX0_UE", + "subframe_TX1_UE", + "subframe_RX0_UE", + "subframe_RX1_UE", "missed_slot_enb", "daq_mbox", "rx_offset_mbox", @@ -187,8 +189,9 @@ const char* eurecomFunctionsNames[] = { "eNB_thread_rxtx1", "eNB_thread_rx", "eNB_thread_prach", - "ue_thread_tx", - "ue_thread_rx", + "ue_thread_synch", + "ue_thread_rxtx0", + "ue_thread_rxtx1", /* RRH signals */ "eNB_tx", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 7bcdc5733b..cd1b86fbd9 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -53,12 +53,14 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, - VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_UE, - VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_UE, - VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_TX_UE, - VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_RX_UE, - VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_UE, - VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_UE, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_UE, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_UE, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_UE, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX1_UE, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_UE, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX1_UE, VCD_SIGNAL_DUMPER_VARIABLES_MISSED_SLOTS_ENB, VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, VCD_SIGNAL_DUMPER_VARIABLES_UE_OFFSET_MBOX, @@ -161,8 +163,9 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX1, VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_PRACH, - VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_TX, - VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, + VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_SYNCH, + VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX0, + VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX1, /* RRH signals */ VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TX, diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index c371e12520..70f098217a 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -326,9 +326,8 @@ struct openair0_device_t { void (*trx_end_func)(openair0_device *device); /*! \brief Stop operation of the transceiver - * \param card RF Card to use */ - int (*trx_stop_func)(int card); + int (*trx_stop_func)(openair0_device *device); /* Functions API related to UE*/ diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 582a2f75d2..736e126ccb 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -67,6 +67,7 @@ #define max(a,b) ((a)>(b) ? (a) : (b)) +//#define DEBUG_EXMIMO exmimo_pci_interface_bot_virtual_t openair0_exmimo_pci[MAX_CARDS]; // contains userspace pointers for each card @@ -306,7 +307,7 @@ static void *watchdog_thread(void *arg) { wait.tv_sec=0; - wait.tv_nsec=5000000L; + wait.tv_nsec=50000000L; /* Set affinity mask to include CPUs 1 to MAX_CPUS */ /* CPU 0 is reserved for UHD threads */ @@ -410,6 +411,8 @@ static void *watchdog_thread(void *arg) { } first_acquisition=1; + printf("Locking watchdog for first acquisition\n"); + pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); // main loop to keep up with DMA transfers from exmimo2 int cnt_diff0=0; @@ -428,19 +431,22 @@ static void *watchdog_thread(void *arg) { } exm->last_mbox = mbox; - pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); + if (first_acquisition==0) + pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); + exm->ts += (diff*exm->samples_per_frame/150) ; - if (first_acquisition==1) //set last read to a closest subframe boundary - exm->last_ts_rx = (exm->ts/(exm->samples_per_frame/10))*(exm->samples_per_frame/10); - if ((diff > 16)&&(first_acquisition==0)) {// we're too late so exit + if ((exm->daq_state == running) && + (diff > 16)&& + (first_acquisition==0)) {// we're too late so exit exm->watchdog_exit = 1; printf("exiting, too late to keep up\n"); } first_acquisition=0; - if (diff == 0) { + if ((exm->daq_state == running) && + (diff == 0)) { cnt_diff0++; if (cnt_diff0 == 10) { exm->watchdog_exit = 1; @@ -450,13 +456,19 @@ static void *watchdog_thread(void *arg) { else cnt_diff0=0; - if (exm->ts - exm->last_ts_rx > exm->samples_per_frame) { + if ((exm->daq_state == running) && + (exm->wait_first_read==0) && + (exm->ts - exm->last_ts_rx > exm->samples_per_frame)) { exm->watchdog_exit = 1; - printf("RX Overflow, exiting\n"); + printf("RX Overflow, exiting (TS %llu, TS last read %llu)\n", + exm->ts,exm->last_ts_rx); } // printf("ts %lu, last_ts_rx %lu, mbox %d, diff %d\n",exm->ts, exm->last_ts_rx,mbox,diff); pthread_mutex_unlock(&exm->watchdog_mutex); } + else { + first_acquisition=1; + } rt_sleep(&sleep_time,250000L); } @@ -487,9 +499,10 @@ int trx_exmimo_start(openair0_device *device) { exmimo_state_t *exm=device->priv; printf("Starting ...\n"); + openair0_config(device->openair0_cfg,0); openair0_start_rt_acquisition(0); exm->daq_state = running; - + exm->wait_first_read = 1; return(0); } @@ -498,6 +511,8 @@ int trx_exmimo_write(openair0_device *device,openair0_timestamp ptimestamp, void return(0); } + + int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { exmimo_state_t *exm=device->priv; @@ -505,57 +520,134 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi openair0_timestamp old_ts=0,ts,diff; struct timespec sleep_time; unsigned long tv_nsec; - // int i; + int i; struct timespec wait; + int n,n1,n2,ntot,first_len; + int ret; wait.tv_sec=0; - wait.tv_nsec=5000000L; + wait.tv_nsec=50000000L; if (exm->watchdog_exit == 1) return(0); - pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); - ts = exm->ts; - pthread_mutex_unlock(&exm->watchdog_mutex); - while ((ts < exm->last_ts_rx + nsamps) && - (exm->watchdog_exit==0)) { + if (exm->daq_state == idle) { + tv_nsec=(unsigned long)((double)(nsamps)*1e9/cfg->sample_rate); + return(0); + } + ret = pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); - diff = exm->last_ts_rx+nsamps - ts; // difference in samples between current timestamp and last RX received sample - // go to sleep until we should have enough samples (1024 for a bit more) -#ifdef DEBUG_EXMIMO - printf("Reading %d samples, ts %lu, last_ts_rx %lu (%lu) => sleeping %u us\n",nsamps,ts,exm->last_ts_rx,exm->last_ts_rx+nsamps, - (unsigned int)((double)(diff+1024)*1e6/cfg->sample_rate)); + + switch (ret) { + case EINVAL: +#ifdef DEBUG_EXMIMO + printf("trx_exmimo_read: mutex_timedlock returned EINVAL\n"); #endif - tv_nsec=(unsigned long)((double)(diff+3840)*1e9/cfg->sample_rate); - // tv_nsec = 500000L; - old_ts = ts; - rt_sleep(&sleep_time,tv_nsec); -#ifdef DEBUG_EXMIMO - printf("back\n"); + return(0); + break; + case ETIMEDOUT: +#ifdef DEBUG_EXMIMO + printf("trx_exmimo_read: mutex_timedlock returned ETIMEDOUT\n"); #endif - // get new timestamp, in case we have to sleep again - pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); - ts = exm->ts; - pthread_mutex_unlock(&exm->watchdog_mutex); - if (old_ts == ts) { - printf("ts stopped, returning\n"); - return(0); - } + return(0); + break; + case EAGAIN: +#ifdef DEBUG_EXMIMO + printf("trx_exmimo_read: mutex_timedlock returned EAGAIN\n"); +#endif + return(0); + break; + case EDEADLK: +#ifdef DEBUG_EXMIMO + printf("trx_exmimo_read: mutex_timedlock returned EDEADLK\n"); +#endif + return(0); + break; + } + ts = exm->ts; + if (exm->wait_first_read==1) { + exm->wait_first_read=0; + exm->last_ts_rx = ts; } - /* - if (cfg->mmapped_dma == 0) { // if buff is not the dma buffer, do a memcpy, otherwise do nothing - for (i=0;ilast_ts_rx % exm->samples_per_frame), - nsamps*sizeof(int)); - - } - }*/ + pthread_mutex_unlock(&exm->watchdog_mutex); + // dump_frame_parms(frame_parms[0]); - *ptimestamp=exm->last_ts_rx; - exm->last_ts_rx += nsamps; + if (nsamps > (exm->samples_per_frame>>1)) { + n1 = nsamps>>1; + n2 = nsamps-n1; + } + else { + n1=nsamps; + n2=0; + } + +#ifdef DEBUG_EXMIMO + printf("Reading %d samples, ts %lu (%d), last_ts_rx %lu (%lu)\n",nsamps,ts,ts%exm->samples_per_frame,exm->last_ts_rx,exm->last_ts_rx+nsamps); +#endif + for (n=n1,ntot=0;ntotlast_ts_rx + n) && + (exm->watchdog_exit==0)) { + + diff = exm->last_ts_rx+n - ts; // difference in samples between current timestamp and last RX received sample + // go to sleep until we should have enough samples (1024 for a bit more) +#ifdef DEBUG_EXMIMO + printf("portion %d samples, ts %lu, last_ts_rx %lu (%lu) => sleeping %u us\n",n,ts,exm->last_ts_rx,exm->last_ts_rx+n, + (unsigned int)((double)(diff+1024)*1e6/cfg->sample_rate)); +#endif + tv_nsec=(unsigned long)((double)(diff+3840)*1e9/cfg->sample_rate); + // tv_nsec = 500000L; + old_ts = ts; + rt_sleep(&sleep_time,tv_nsec); +#ifdef DEBUG_EXMIMO + printf("back\n"); +#endif + // get new timestamp, in case we have to sleep again + pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); + ts = exm->ts; + pthread_mutex_unlock(&exm->watchdog_mutex); + if (old_ts == ts) { + printf("ts stopped, returning\n"); + return(0); + } + } + + + + if (cfg->mmapped_dma == 0) { // if buff is not the dma buffer, do a memcpy, otherwise do nothing + for (i=0;ilast_ts_rx % exm->samples_per_frame)); +#endif + if ((n+(exm->last_ts_rx%exm->samples_per_frame))samples_per_frame) { + memcpy(buff[i]+(ntot*sizeof(int)), + (void*)(openair0_exmimo_pci[0].adc_head[i]+(exm->last_ts_rx % exm->samples_per_frame)), + n*sizeof(int)); + } + else { + first_len = (exm->samples_per_frame-(exm->last_ts_rx%exm->samples_per_frame)); +#ifdef DEBUG_EXMIMO + printf("split: first_len %d, remainder %d\n",first_len,n-first_len); +#endif + memcpy(buff[i]+(ntot*sizeof(int)), + (void*)(openair0_exmimo_pci[0].adc_head[i]+(exm->last_ts_rx % exm->samples_per_frame)), + first_len*sizeof(int)); + memcpy(buff[i]+(ntot+first_len)*sizeof(int), + (void*)openair0_exmimo_pci[0].adc_head[i], + (n-first_len)*sizeof(int)); + } + } + } + pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); + exm->last_ts_rx += n; + pthread_mutex_unlock(&exm->watchdog_mutex); + if (n==n1) { + *ptimestamp=exm->last_ts_rx; + } + ntot+=n; + } + + return(nsamps); @@ -582,14 +674,21 @@ int trx_exmimo_reset_stats(openair0_device* device) { } -int trx_exmimo_stop(int card) { +int trx_exmimo_stop(openair0_device* device) { + + exmimo_state_t *exm=device->priv; + + printf("Stopping ...\n"); + exm->daq_state = idle; + openair0_stop(0); return(0); } -int trx_exmimo_set_freq(openair0_device* device, openair0_config_t *openair0_cfg1,int exmimo_dump_config) { +int trx_exmimo_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { + openair0_set_frequencies(device,openair0_cfg,0); return(0); } @@ -663,7 +762,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { device->openair0_cfg = openair0_cfg; device->priv = (void *)exm; - openair0_config(openair0_cfg,0); + create_watchdog(device); @@ -684,6 +783,7 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) int resampling_factor=2; int rx_filter=RXLPF25, tx_filter=TXLPF25; int ACTIVE_RF=0; + int i; exmimo_config_t *p_exmimo_config; exmimo_id_t *p_exmimo_id; @@ -713,7 +813,7 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) /* device specific */ openair0_cfg[card].iq_txshift = 4;//shift openair0_cfg[card].iq_rxrescale = 15;//rescale iqs - openair0_cfg[card].mmapped_dma = 1; + if (openair0_cfg[card].sample_rate==30.72e6) { resampling_factor = 0; @@ -761,6 +861,12 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg[card].tx_freq[ant]; p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg[card].tx_gain[ant]; printf("openair0 : programming card %d TX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); + + printf("Setting TX buffer to all-RX\n"); + + for (i=0;i<307200;i++) { + ((uint32_t*)openair0_exmimo_pci[card].dac_head[ant])[i] = 0x00010001; + } } if (openair0_cfg[card].rx_freq[ant]>0) { @@ -813,7 +919,7 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) p_exmimo_config->rf.rf_local[ant] = rf_local[ant]; p_exmimo_config->rf.rf_rxdc[ant] = rf_rxdc[ant]; - if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 850000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 865000000)) { + if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 790000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 865000000)) { p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal_850[ant]; p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD; } else if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 1900000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 2000000000)) { @@ -826,7 +932,7 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) } if (openair0_cfg[card].duplex_mode==duplex_mode_FDD) { - p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD; + p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD;// + TXRXSWITCH_LSB + TXRXSWITCH_LSB + ACTIVE_RF+ ACTIVE_RF; printf("!!!!!setting FDD (tdd_config=%d)\n",p_exmimo_config->framing.tdd_config); } else { @@ -857,6 +963,9 @@ int openair0_reconfig(openair0_config_t *openair0_cfg) return(-1); } +#ifdef DEBUG_EXMIMO + printf("Reconfiguration of gains/frequencies\n"); +#endif for (card=0; cardrf.rf_freq_tx[ant] = (unsigned int)openair0_cfg[card].tx_freq[ant]; p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg[card].tx_gain[ant]; - printf("openair0 : programming TX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); +#ifdef DEBUG_EXMIMO + printf("openair0 - %d : programming TX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); +#endif } if (openair0_cfg[card].rx_freq[ant]) { p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg[card].rx_freq[ant]; p_exmimo_config->rf.rx_gain[ant][0] = (unsigned int)openair0_cfg[card].rx_gain[ant]; - printf("openair0 : programming RX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); - +#ifdef DEBUG_EXMIMO + printf("openair0 - %d : programming RX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); +#endif switch (openair0_cfg[card].rxg_mode[ant]) { default: case max_gain: diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h index a2f37b09dc..f9428c8519 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h @@ -58,6 +58,7 @@ typedef struct { struct sched_param watchdog_sched_param; pthread_mutex_t watchdog_mutex; int watchdog_exit; + int wait_first_read; exmimo_daq_state_t daq_state; openair0_timestamp ts; openair0_timestamp last_ts_rx; diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 20a191a06c..d8a65dc2ca 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -377,7 +377,7 @@ int trx_usrp_set_gains(openair0_device* device, /*! \brief Stop USRP * \param card refers to the hardware index to use */ -int trx_usrp_stop(int card) { +int trx_usrp_stop(openair0_device* device) { return(0); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index eb32a90b9c..c8b8eea760 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1514,6 +1514,11 @@ int main( int argc, char **argv ) for (card=0; cardN_RB_DL == 100) { if (frame_parms[0]->threequarter_fs) { openair0_cfg[card].sample_rate=23.04e6; @@ -1796,14 +1801,7 @@ int main( int argc, char **argv ) exit(-1); } - printf("Setting UE buffer to all-RX\n"); - // Set LSBs for antenna switch (ExpressMIMO) - for (CC_id=0; CC_idsamples_per_tti*10; i++) - for (aa=0; aanb_antennas_tx; aa++) - UE[CC_id]->common_vars.txdata[aa][i] = 0x00010001; - } if (input_fd) { printf("Reading in from file to antenna buffer %d\n",0); @@ -1905,18 +1903,12 @@ int main( int argc, char **argv ) else init_eNB(node_function); // Sleep to allow all threads to setup - sleep(1); + sleep(3); // *** Handle per CC_id openair0 -#ifndef USRP_DEBUG - if ((UE_flag==1) && (mode!=loop_through_memory)) - if (openair0.trx_start_func(&openair0) != 0 ) - LOG_E(HW,"Could not start the device\n"); - -#endif printf("Sending sync to all threads\n"); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index b94c48e734..4fa06f1bc8 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -297,14 +297,7 @@ static void *UE_thread_synch(void *arg) #endif - pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_sync_thread)\n"); - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - - pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex (UE_sync_thread)\n"); printf("starting UE synch thread (IC %d)\n",UE->proc.instance_cnt_synch); ind = 0; @@ -344,6 +337,10 @@ static void *UE_thread_synch(void *arg) openair0_cfg[0].rx_freq[i] = downlink_frequency[0][i]; openair0_cfg[0].tx_freq[i] = downlink_frequency[0][i]+uplink_frequency_offset[0][i]; openair0_cfg[0].autocal[i] = 1; + if (uplink_frequency_offset[0][i] != 0) // + openair0_cfg[0].duplex_mode = duplex_mode_FDD; + else //FDD + openair0_cfg[0].duplex_mode = duplex_mode_TDD; } sync_mode = pbch; @@ -365,6 +362,19 @@ static void *UE_thread_synch(void *arg) } + if (openair0.trx_start_func(&openair0) != 0 ) { + LOG_E(HW,"Could not start the device\n"); + oai_exit=1; + } + pthread_mutex_lock(&sync_mutex); + printf("Locked sync_mutex, waiting (UE_sync_thread)\n"); + + while (sync_var<0) + pthread_cond_wait(&sync_cond, &sync_mutex); + + pthread_mutex_unlock(&sync_mutex); + printf("Started device, unlocked sync_mutex (UE_sync_thread)\n"); + while (oai_exit==0) { if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) { @@ -385,7 +395,7 @@ static void *UE_thread_synch(void *arg) return &UE_thread_synch_retval; } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH, 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_SYNCH, 1 ); switch (sync_mode) { case pss: @@ -474,11 +484,15 @@ static void *UE_thread_synch(void *arg) break; } - openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); + //openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); //openair0.trx_set_gains_func(&openair0,&openair0_cfg[0]); - //openair0.trx_stop_func(0); + openair0.trx_stop_func(&openair0); sleep(1); init_frame_parms(&UE->frame_parms,1); + if (openair0.trx_start_func(&openair0) != 0 ) { + LOG_E(HW,"Could not start the device\n"); + oai_exit=1; + } } else { UE->is_synchronized = 1; @@ -546,7 +560,7 @@ static void *UE_thread_synch(void *arg) openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+freq_offset; openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+freq_offset; - openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); + openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; @@ -554,10 +568,12 @@ static void *UE_thread_synch(void *arg) } } + // openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); + if (UE->UE_scan_carrier==1) { - for (i=0;iproc.mutex_synch) != 0) { LOG_E( PHY, "[SCHED][UE] error locking mutex for UE synch\n" ); @@ -587,7 +600,7 @@ static void *UE_thread_synch(void *arg) return &UE_thread_synch_retval; } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_SYNCH, 0 ); } // while !oai_exit return &UE_thread_synch_retval; @@ -923,7 +936,11 @@ static void *UE_thread_rxn_txnp4(void *arg) return &UE_thread_rx_retval; } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX0+(proc->subframe_rx&1), 1 ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_UE+(proc->subframe_rx&1), proc->subframe_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_UE+(proc->subframe_tx&1), proc->subframe_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE+(proc->subframe_rx&1), proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE+(proc->subframe_tx&1), proc->frame_tx ); if ((subframe_select( &UE->frame_parms, proc->subframe_rx) == SF_DL) || (UE->frame_parms.frame_type == FDD) || @@ -955,8 +972,8 @@ static void *UE_thread_rxn_txnp4(void *arg) UE->UE_mode[0] = PRACH; } } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX0+(proc->subframe_rx&1), 0 ); + if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" ); @@ -1114,6 +1131,7 @@ void *UE_thread(void *arg) { for (int i=0; iframe_parms.nb_antennas_rx; i++) rxp[i] = (void*)&dummy_rx[i][0]; for (int sf=0;sf<10;sf++) { + // printf("Reading dummy sf %d\n",sf); rxs = openair0.trx_read_func(&openair0, ×tamp, rxp, @@ -1164,7 +1182,6 @@ void *UE_thread(void *arg) { }// start_rx_stream==0 else { - // printf("Frame %d, rx_offset %d (diff %d, timer %d)\n",UE->proc.proc_rxtx[0].frame_rx,UE->rx_offset,rx_off_diff,rx_correction_timer); UE->proc.proc_rxtx[0].frame_rx++; UE->proc.proc_rxtx[1].frame_rx++; @@ -1172,6 +1189,7 @@ void *UE_thread(void *arg) { for (int i=0; iframe_parms.nb_antennas_rx; i++) rxp[i] = (void*)&rxdata[i][UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti)]; // grab signal for subframe + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); if (UE->mode != loop_through_memory) { if (sf<9) { rxs = openair0.trx_read_func(&openair0, @@ -1196,7 +1214,7 @@ void *UE_thread(void *arg) { rx_off_diff = 0; } } - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); // operate on thread sf mod 2 UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[sf&1]; @@ -1650,8 +1668,8 @@ void *UE_thread_old(void *arg) /*! * \brief Initialize the UE theads. * Creates the UE threads: - * - UE_thread_tx - * - UE_thread_rx + * - UE_thread_rxtx0 + * - UE_thread_rxtx1 * - UE_thread_synch * and the locking between them. */ @@ -1751,6 +1769,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, free( phy_vars_ue[CC_id]->common_vars.rxdata[i] ); rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); phy_vars_ue[CC_id]->common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD + printf("rxdata[%d] : %p\n",i,rxdata[i]); } for (i=0; inb_antennas_tx; i++) { @@ -1758,6 +1777,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, free( phy_vars_ue[CC_id]->common_vars.txdata[i] ); txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); phy_vars_ue[CC_id]->common_vars.txdata[i] = txdata[i]; + printf("txdata[%d] : %p\n",i,txdata[i]); } // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.rxdata[x] diff --git a/targets/RT/USER/ue_usrp.gtkw b/targets/RT/USER/ue_usrp.gtkw index 81940b5643..becc47ea0b 100644 --- a/targets/RT/USER/ue_usrp.gtkw +++ b/targets/RT/USER/ue_usrp.gtkw @@ -1,12 +1,12 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Sun Mar 20 18:27:06 2016 +[*] Sun Jul 17 20:46:59 2016 [*] [dumpfile] "/tmp/openair_dump_UE.vcd" -[dumpfile_mtime] "Sun Mar 20 18:14:17 2016" -[dumpfile_size] 92262400 -[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/ue_usrp.gtkw" -[timestart] 30032830000 +[dumpfile_mtime] "Sun Jul 17 20:46:29 2016" +[dumpfile_size] 10932224 +[savefile] "/home/fourmi/openairinterface5g/targets/RT/USER/ue_usrp.gtkw" +[timestart] 11696930000 [size] 1215 640 [pos] 105 102 *-22.292629 30041590000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 @@ -19,22 +19,25 @@ variables.hw_subframe[63:0] @28 functions.trx_read functions.trx_write +functions.ue_thread_synch +functions.ue_thread_rxtx0 @24 -variables.subframe_number_RX_UE[63:0] -variables.subframe_number_TX_UE[63:0] +variables.subframe_RX0_UE[63:0] +variables.subframe_TX0_UE[63:0] +variables.frame_number_RX0_UE[63:0] +variables.frame_number_TX0_UE[63:0] @28 -functions.ue_thread_rx -functions.ue_thread_tx -@420 -variables.ue_inst_cnt_rx[63:0] -variables.ue_inst_cnt_tx[63:0] +functions.ue_thread_rxtx1 +@24 +variables.subframe_RX1_UE[63:0] +variables.subframe_TX1_UE[63:0] +@25 +variables.frame_number_RX1_UE[63:0] +@24 +variables.frame_number_TX1_UE[63:0] @28 functions.phy_procedures_ue_rx functions.phy_procedures_ue_tx -@24 -variables.frame_number_RX_UE[63:0] -variables.frame_number_TX_UE[63:0] -@28 functions.ue_slot_fep functions.lte_ue_measurement_procedures functions.ue_rrc_measurements From fa4cfad5cb83068957c48e05a552876e006fccaa Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 19 Jul 2016 15:53:19 +0200 Subject: [PATCH 118/340] add mmapped-dma option for lte-softmodem --- targets/RT/USER/lte-softmodem.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index c8b8eea760..eedc641574 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -169,6 +169,7 @@ volatile int oai_exit = 0; static char UE_flag=0; +unsigned int mmapped_dma=0; //static uint8_t eNB_id=0,UE_id=0; static char threequarter_fs=0; @@ -385,11 +386,12 @@ void help (void) { printf(" --ue-txgain set UE TX gain\n"); printf(" --ue-scan_carrier set UE to scan around carrier\n"); printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); + printf(" --mmapped-dma sets flag for improved EXMIMO UE performance\n"); printf(" --RCC run using NGFI RCC node function IF4 split\n"); printf(" --RRU run using NGFI RRU node function IF4 split\n"); printf(" --eNB run using 3GPP eNB node function\n"); printf(" --BBU run using 3GPP eNB node function with IF5 split\n"); - printf(" --RRH run using RRH node function with IF5 split\n"); + printf(" --RRH run using RRH node function with IF5 split\n"); printf(" -C Set the downlink frequency for all component carriers\n"); printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); @@ -686,6 +688,7 @@ static void get_options (int argc, char **argv) LONG_OPTION_DUMP_FRAME, LONG_OPTION_LOOPMEMORY, LONG_OPTION_PHYTEST, + LONG_OPTION_MMAPPED_DMA, LONG_OPTION_RCC, LONG_OPTION_RRU, LONG_OPTION_ENB, @@ -714,6 +717,7 @@ static void get_options (int argc, char **argv) {"ue-dump-frame", no_argument, NULL, LONG_OPTION_DUMP_FRAME}, {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY}, {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST}, + {"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA}, {"RCC", no_argument, NULL, LONG_OPTION_RCC}, {"RRU", no_argument, NULL, LONG_OPTION_RRU}, {"eNB", no_argument, NULL, LONG_OPTION_ENB}, @@ -810,6 +814,10 @@ static void get_options (int argc, char **argv) phy_test = 1; break; + case LONG_OPTION_MMAPPED_DMA: + mmapped_dma = 1; + break; + case LONG_OPTION_RCC: node_function = NGFI_RCC_IF4; break; @@ -829,7 +837,7 @@ static void get_options (int argc, char **argv) case LONG_OPTION_RRH: node_function = NGFI_RRU_IF5; break; - + #if T_TRACER case LONG_OPTION_T_PORT: { extern int T_port; @@ -1514,10 +1522,7 @@ int main( int argc, char **argv ) for (card=0; cardN_RB_DL == 100) { if (frame_parms[0]->threequarter_fs) { From bbe47d6fb5765de9bb8fc6270e8973bd9577581b Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 20 Jul 2016 12:55:12 +0200 Subject: [PATCH 119/340] some additions to config files, needs merge --- openair1/PHY/defs.h | 5 ++++ openair2/ENB_APP/enb_config.c | 51 ++++++++++++++++++++++++++++++----- openair2/ENB_APP/enb_config.h | 4 ++- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index e1b2627c09..8232900c9f 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -164,6 +164,11 @@ typedef enum { NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) } eNB_func_t; + +typedef enum { + synch_to_device=0, + synch_to_other +} eNB_timing_t; typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index d67c6eb6d7..c7a74277bf 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -73,6 +73,9 @@ #define ENB_CONFIG_STRING_COMPONENT_CARRIERS "component_carriers" +#define ENB_CONFIG_STRING_CC_NODE_FUNCTION "node_function" +#define ENB_CONFIG_STRING_CC_NODE_TIMING "node_timing" + #define ENB_CONFIG_STRING_FRAME_TYPE "frame_type" #define ENB_CONFIG_STRING_TDD_CONFIG "tdd_config" #define ENB_CONFIG_STRING_TDD_CONFIG_S "tdd_config_s" @@ -316,6 +319,10 @@ void enb_config_display(void) } for (j=0; j< enb_properties.properties[i]->nb_cc; j++) { + // CC_ID node function/timing + printf( "\tnode_function for CC %d:\t%d:\n",j,enb_properties.properties[i]->cc_node_function[j]); + printf( "\tnode_timing for CC %d:\t%d:\n",j,enb_properties.properties[i]->cc_node_timing[j]); + printf( "\teutra band for CC %d: \t%"PRId16":\n",j,enb_properties.properties[i]->eutra_band[j]); printf( "\tdownlink freq for CC %d: \t%"PRIu64":\n",j,enb_properties.properties[i]->downlink_frequency[j]); printf( "\tuplink freq offset for CC %d: \t%"PRId32":\n",j,enb_properties.properties[i]->uplink_frequency_offset[j]); @@ -324,7 +331,7 @@ void enb_config_display(void) printf( "\tN_RB_DL for CC %d:\t%"PRId16":\n",j,enb_properties.properties[i]->N_RB_DL[j]); printf( "\tnb_antennas_tx for CC %d:\t%d:\n",j,enb_properties.properties[i]->nb_antennas_tx[j]); printf( "\tnb_antennas_rx for CC %d:\t%d:\n",j,enb_properties.properties[i]->nb_antennas_rx[j]); - + // RACH-Config printf( "\trach_numberOfRA_Preambles for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_numberOfRA_Preambles[j]); printf( "\trach_preamblesGroupAConfig for CC %d:\t%d:\n",j,enb_properties.properties[i]->rach_preamblesGroupAConfig[j]); @@ -409,17 +416,17 @@ void enb_config_display(void) printf( "\tue_TimersAndConstants_t310 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_t310[j]); printf( "\tue_TimersAndConstants_n310 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_n310[j]); printf( "\tue_TimersAndConstants_t311 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_t311[j]); - printf( "\tue_TimersAndConstants_n311 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_n311[j]); + printf( "\tue_TimersAndConstants_n311 for CC %d:\t%ld:\n\n",j,enb_properties.properties[i]->ue_TimersAndConstants_n311[j]); } for (j=0; j < enb_properties.properties[i]->num_otg_elements; j++) { - printf( "\n\tOTG Destination UE ID: \t%"PRIu16, enb_properties.properties[i]->otg_ue_id[j]); + printf( "\tOTG Destination UE ID: \t%"PRIu16, enb_properties.properties[i]->otg_ue_id[j]); printf( "\n\tOTG App Type: \t%"PRIu8, enb_properties.properties[i]->otg_app_type[j]); printf( "\n\tOTG Background Traffic: \t%s\n", (enb_properties.properties[i]->otg_bg_traffic[j]==1) ? "Enabled" : "Disabled"); } - printf( "\n\tGlobal log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->glog_level)); + printf( "\tGlobal log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->glog_level)); printf( "\tHW log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->hw_log_level)); printf( "\tPHY log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->phy_log_level)); printf( "\tMAC log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->mac_log_level)); @@ -511,6 +518,10 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) int j = 0; int parse_errors = 0; libconfig_int enb_id = 0; + + const char* cc_node_function = NULL; + const char* cc_node_timing = NULL; + const char* cell_type = NULL; const char* tac = 0; const char* enb_name = NULL; @@ -787,7 +798,9 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) component_carrier = config_setting_get_elem(setting_component_carriers, j); //printf("Component carrier %d\n",component_carrier); - if (!(config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_FRAME_TYPE, &frame_type) + if (!(config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_CC_NODE_FUNCTION, &cc_node_function) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_CC_NODE_TIMING, &cc_node_timing) + && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_FRAME_TYPE, &frame_type) && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TDD_CONFIG, &tdd_config) && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TDD_CONFIG_S, &tdd_config_s) && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PREFIX_TYPE, &prefix_type) @@ -865,6 +878,32 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->nb_cc++; + if (strcmp(cc_node_function, "eNodeB_3GPP") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_function[j] = eNodeB_3GPP; + } else if (strcmp(cc_node_function, "eNodeB_3GPP_BBU") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_function[j] = eNodeB_3GPP_BBU; + } else if (strcmp(cc_node_function, "NGFI_RCC_IF4") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RCC_IF4; + } else if (strcmp(cc_node_function, "NGFI_RRU_IF4") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF4; + } else if (strcmp(cc_node_function, "NGFI_RRU_IF5") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF5; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for node_function choice: eNodeB_3GPP or eNodeB_3GPP_BBU or NGFI_IF4_RCC or NGFI_IF4_RRU or NGFI_IF5_RRU !\n", + lib_config_file_name_pP, i, cc_node_function); + } + + if (strcmp(cc_node_timing, "SYNCH_TO_DEVICE") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_timing[j] = synch_to_device; + } else if (strcmp(cc_node_timing, "SYNCH_TO_OTHER") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_timing[j] = synch_to_other; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for node_function choice: SYNCH_TO_DEVICE or SYNCH_TO_OTHER !\n", + lib_config_file_name_pP, i, cc_node_timing); + } + enb_properties.properties[enb_properties_index]->tdd_config[j] = tdd_config; AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!", @@ -888,7 +927,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", lib_config_file_name_pP, i, prefix_type); } - + enb_properties.properties[enb_properties_index]->eutra_band[j] = eutra_band; enb_properties.properties[enb_properties_index]->downlink_frequency[j] = (uint32_t) downlink_frequency; enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset; diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 716d400178..3feeb5e828 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -45,6 +45,7 @@ #include "platform_types.h" #include "platform_constants.h" #include "PHY/impl_defs_lte.h" +#include "PHY/defs.h" #include "s1ap_messages_types.h" #ifdef CMAKER #include "SystemInformationBlockType2.h" @@ -129,6 +130,8 @@ typedef struct Enb_properties_s { /* Physical parameters */ int16_t nb_cc; + eNB_func_t cc_node_function[1+MAX_NUM_CCs]; + eNB_timing_t cc_node_timing[1+MAX_NUM_CCs]; lte_frame_type_t frame_type[1+MAX_NUM_CCs]; uint8_t tdd_config[1+MAX_NUM_CCs]; uint8_t tdd_config_s[1+MAX_NUM_CCs]; @@ -202,7 +205,6 @@ typedef struct Enb_properties_s { long ue_TimersAndConstants_n310[1+MAX_NUM_CCs]; long ue_TimersAndConstants_n311[1+MAX_NUM_CCs]; - long srb1_timer_poll_retransmit; long srb1_timer_reordering; long srb1_timer_status_prohibit; From 07b3a0a9d10689bd77f29ff7835657b1460e632b Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 20 Jul 2016 19:56:17 +0200 Subject: [PATCH 120/340] prach data seems ok but no rx yet --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 +- openair1/PHY/LTE_TRANSPORT/prach.c | 36 ++++++++++++++++++++++++- openair1/SCHED/phy_procedures_lte_eNb.c | 9 +++---- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 0fb5404538..572bcd73b7 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -139,7 +139,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, gen_IF4_prach_header(prach_header, frame, subframe); memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t), - (&rxsigF[0][0]+k), + (&rxsigF[0][k]), db_fulllength*sizeof(int16_t)); if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 4634be7321..752aee11cd 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1104,7 +1104,12 @@ void rx_prach(PHY_VARS_eNB *eNB, for (aa=0; aacommon_vars.rxdata[0][aa][subframe*eNB->frame_parms.samples_per_tti-eNB->N_TA_offset]; } - + + int energy = dB_fixed(signal_energy(prach[0], eNB->frame_parms.samples_per_tti)); + //if (energy >= 45) { + // printf("prach subframe energy %d\n",energy); + //} + // First compute physical root sequence if (restricted_set == 0) { if (Ncs_config>15) { @@ -1285,7 +1290,36 @@ void rx_prach(PHY_VARS_eNB *eNB, send_IF4(eNB, eNB->proc.frame_rx, eNB->proc.subframe_rx, IF4_PRACH, k); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + energy = dB_fixed(signal_energy(&rxsigF[0][k], 839)); + if (energy >=45) { + printf(" prach freq-domain energy %d\n",eNB->proc.frame_rx, energy); + //write_output("beforecomp.m","rxF",&rxsigF[0][k],839*2,1,0); + //exit(1); + } + return; + } else if (eNB->node_function == NGFI_RCC_IF4) { + k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; + + if (k<0) { + k+=(eNB->frame_parms.ofdm_symbol_size); + } + + k*=12; + k+=13; + k*=2; + + // Adjust received rxsigF offset + memmove((&rxsigF[0][k]), + (&rxsigF[0][0]), + 839*2*sizeof(int16_t)); + + energy = dB_fixed(signal_energy(&rxsigF[0][k], 839)); + if (energy >=45) { + printf(" prach freq-domain energy %d\n",eNB->proc.frame_rx, energy); + //write_output("aftercomp.m","rxF",&rxsigF[0][k],839*2,1,0); + //exit(1); + } } // in case of RCC and prach received rx_thread wakes up prach diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 79a6a1d0b7..9262afcdb9 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2641,11 +2641,12 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); - if (eNB->node_function == NGFI_RRU_IF4 && is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)<=0) { + if (eNB->node_function == NGFI_RRU_IF4) { /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - send_IF4(eNB, frame, subframe, IF4_PULFFT, 0); + send_IF4(eNB, proc->frame_rx, proc->subframe_rx, IF4_PULFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + } /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) @@ -2735,7 +2736,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } } - } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); + } while(symbol_mask != symbol_mask_full); if (proc->first_rx == 0) { if (proc->subframe_rx != subframe){ @@ -2753,8 +2754,6 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); - - // Tobi aka mr monaco: ETH } else { // should not get here AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); From af489a783bbe378a2025af1721c9aff0bb60c31f Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 20 Jul 2016 16:32:38 -0700 Subject: [PATCH 121/340] addition of asynchronous RX threads and inter CC synchronization --- openair1/PHY/defs.h | 61 ++-- openair1/SCHED/phy_procedures_lte_eNb.c | 237 +++----------- targets/RT/USER/lte-enb.c | 405 +++++++++++++++++++----- targets/SIMU/USER/oaisim_functions.c | 11 - 4 files changed, 408 insertions(+), 306 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index e1b2627c09..e280b3f625 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -165,6 +165,12 @@ typedef enum { NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) } eNB_func_t; +typedef enum { + synch_to_ext_device=0, // synch to RF or Ethernet device + synch_to_other // synch to another source (timer, other CC_id) +} eNB_timing_t; + + typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals int32_t amp[3][10]; @@ -211,7 +217,7 @@ typedef struct { struct sched_param sched_param_rxtx; } eNB_rxtx_proc_t; /// Context data structure for eNB subframe processing -typedef struct { +typedef struct eNB_proc_t_s { /// Component Carrier index uint8_t CC_id; /// thread index @@ -226,29 +232,46 @@ typedef struct { int frame_rx; /// frame to act upon for PRACH int frame_prach; + /// \brief Instance count for FH processing thread. + /// \internal This variable is protected by \ref mutex_FH. + int instance_cnt_FH; /// \brief Instance count for rx processing thread. /// \internal This variable is protected by \ref mutex_prach. int instance_cnt_prach; - /// pthread structure for rx processing thread - pthread_t pthread_rx; + /// pthread structure for FH processing thread + pthread_t pthread_FH; + /// pthread structure for asychronous RX processing thread + pthread_t pthread_asynch_rx; /// flag to indicate first RX acquisition int first_rx; - /// pthread attributes for rx processing thread - pthread_attr_t attr_rx; + /// pthread attributes for FH processing thread + pthread_attr_t attr_FH; /// pthread attributes for prach processing thread pthread_attr_t attr_prach; - /// scheduling parameters for rx thread - struct sched_param sched_param_rx; + /// pthread attributes for asynchronous RX thread + pthread_attr_t attr_asynch_rx; + /// scheduling parameters for FH thread + struct sched_param sched_param_FH; /// scheduling parameters for prach thread struct sched_param sched_param_prach; - /// condition variable for prach processing thread + /// scheduling parameters for asynch_rx thread + struct sched_param sched_param_asynch_rx; + /// condition variable for FH thread pthread_t pthread_prach; - /// condition variable for rx processing thread; + /// condition variable for FH thread + pthread_cond_t cond_FH; + /// condition variable for PRACH processing thread; pthread_cond_t cond_prach; - /// mutex for tx processing thread + /// mutex for FH + pthread_mutex_t mutex_FH; + /// mutex for PRACH thread pthread_mutex_t mutex_prach; /// set of scheduling variables RXn-TXnp4 threads eNB_rxtx_proc_t proc_rxtx[2]; + /// number of slave threads + int num_slaves; + /// array of pointers to slaves + struct eNB_proc_t_s **slave_proc; } eNB_proc_t; @@ -311,6 +334,7 @@ typedef struct PHY_VARS_eNB_s { uint8_t CC_id; eNB_proc_t proc; eNB_func_t node_function; + eNB_timing_t node_timing; uint8_t local_flag; uint32_t rx_total_gain_dB; LTE_DL_FRAME_PARMS frame_parms; @@ -456,11 +480,6 @@ typedef struct PHY_VARS_eNB_s { time_stats_t phy_proc; time_stats_t phy_proc_tx; time_stats_t phy_proc_rx; - /* - time_stats_t phy_proc_sf[10]; // for each subframe - time_stats_t phy_proc_tx_sf[10]; - time_stats_t phy_proc_rx_sf[10]; - */ time_stats_t rx_prach; time_stats_t ofdm_mod_stats; @@ -505,11 +524,6 @@ typedef struct PHY_VARS_eNB_s { int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240]; int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240]; int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240]; -#if ENABLE_RAL - hash_table_t *ral_thresholds_timed; - SLIST_HEAD(ral_thresholds_gen_poll_enb_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX]; - SLIST_HEAD(ral_thresholds_lte_poll_enb_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX]; -#endif /// RF and Interface devices per CC openair0_device rfdevice; @@ -520,13 +534,6 @@ typedef struct PHY_VARS_eNB_s { } PHY_VARS_eNB; #define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg -//#define debug_msg msg - -/* -typedef enum { - max_gain=0,med_gain,byp_gain -} rx_gain_t; -*/ /// Top-level PHY Data Structure for UE typedef struct { diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 653b5aeb1e..1a1c2f4ad0 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2519,29 +2519,17 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl int i,l; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - void *rxp[fp->nb_antennas_rx]; - unsigned int rxs; + eNB_proc_t *proc = &eNB->proc; int subframe = proc->subframe_rx; int frame = proc->frame_rx; - int prach_rx; - uint8_t seqno=0; - uint16_t packet_type; - uint32_t symbol_number=0; - uint32_t symbol_mask, symbol_mask_full; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); - if (subframe==9) { - subframe=0; - frame++; - frame&=1023; - } else { - subframe++; - } + - // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_COMMON_RX,1); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC @@ -2549,77 +2537,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl #endif if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) - - if ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == NGFI_RRU_IF5) || - (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF - for (i=0; inb_antennas_rx; i++) - rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, - &proc->timestamp_rx, - rxp, - fp->samples_per_tti, - fp->nb_antennas_rx); - proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - - if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - exit_fun("Exiting"); - } - if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - exit_fun("Exiting"); - } - } else { - proc->first_rx = 0; - } - - // printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); - - if (rxs != fp->samples_per_tti) - exit_fun( "problem receiving samples" ); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - - } else if(eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF - /// **** recv_IF5 of rxdata from RRH **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); - recv_IF5(eNB, &proc->timestamp_rx, proc->subframe_rx, IF5_RRH_GW_UL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); - - proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - - if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - //exit_fun("Exiting"); - } - if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - //exit_fun("Exiting"); - } - } else { - proc->first_rx = 0; - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); - } - if ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == eNodeB_3GPP) || - (eNB->node_function == eNodeB_3GPP_BBU)) { // front-end processing + (eNB->node_function == eNodeB_3GPP) || + (eNB->node_function == eNodeB_3GPP_BBU)) { // front-end processing // now do common RX processing for first slot in subframe VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); @@ -2641,131 +2563,61 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl 0 ); } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); - if (eNB->node_function == NGFI_RRU_IF4 && is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)<=0) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); + + if (eNB->node_function == NGFI_RRU_IF4) { /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(eNB, frame, subframe, IF4_PULFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); } - /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) - // check if we have to detect PRACH first - if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) { - // wake up thread for PRACH RX - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); - exit_fun( "error locking mutex_prach" ); - return; - } - - int cnt_prach = ++proc->instance_cnt_prach; - // set timing for prach thread - proc->frame_prach = proc->frame_rx; - proc->subframe_prach = proc->subframe_rx; - - pthread_mutex_unlock( &proc->mutex_prach ); - - if (cnt_prach == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc->cond_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); - exit_fun( "ERROR pthread_cond_signal" ); - return; - } - } else { - LOG_W( PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,cnt_prach); - exit_fun( "PRACH thread busy" ); - return; - } - } - } else if (eNB->node_function == NGFI_RRU_IF5) { + } + else if (eNB->node_function == NGFI_RRU_IF5) { /// **** send_IF5 of rxdata to BBU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); send_IF5(eNB, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); - - } else if (eNB->node_function == NGFI_RCC_IF4) { - /// **** recv_IF4 of rxdataF from RRU **** /// - /// **** recv_IF4 of rxsigF from RRU **** /// - // get frame/subframe information from IF4 interface - // timed loop (200 us) - - symbol_number = 0; - symbol_mask = 0; - symbol_mask_full = (1<symbols_per_tti)-1; - prach_rx = 0; - - do { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - recv_IF4(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); - - if (packet_type == IF4_PULFFT) { - symbol_mask = symbol_mask | (1<mutex_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); - exit_fun( "error locking mutex_prach" ); - return; - } - - int cnt_prach = ++proc->instance_cnt_prach; - // set timing for prach thread - proc->frame_prach = proc->frame_rx; - proc->subframe_prach = proc->subframe_rx; - - pthread_mutex_unlock( &proc->mutex_prach ); - - if (cnt_prach == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc->cond_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); - exit_fun( "ERROR pthread_cond_signal" ); - return; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", frame); - exit_fun( "PRACH thread busy" ); - return; - } - } - - } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); - - if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - //exit_fun("Exiting"); - } - if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - //exit_fun("Exiting"); - } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); + } + + /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) + // check if we have to detect PRACH first + if ((eNB->node_function != NGFI_RRU_IF5) && + (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0)) { // any other node must call prach procedure + // wake up thread for PRACH RX + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); + exit_fun( "error locking mutex_prach" ); + return; + } + + int cnt_prach = ++proc->instance_cnt_prach; + // set timing for prach thread + proc->frame_prach = proc->frame_rx; + proc->subframe_prach = proc->subframe_rx; + + pthread_mutex_unlock( &proc->mutex_prach ); + + if (cnt_prach == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } } else { - proc->first_rx = 0; + LOG_W( PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,cnt_prach); + exit_fun( "PRACH thread busy" ); + return; } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); - - // Tobi aka mr monaco: ETH - - } else { // should not get here - AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); } - } else { // grab transport channel information from network interface } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); } @@ -2784,7 +2636,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); @@ -3346,7 +3198,8 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const phy_procedures_emos_eNB_RX(subframe,eNB); #endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); + stop_meas(&eNB->phy_proc_rx); } diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index bb00aced66..c16fbb5e8d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -435,14 +435,16 @@ static void* eNB_thread_rxtx( void* param ) { if (oai_exit) break; + // Common procedures + phy_procedures_eNB_common_RX(PHY_vars_eNB_g[0][proc->CC_id], 0); + // UE-specific RX processing for subframe n if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); + // this is the ue-specific processing for the subframe and can be multi-threaded later phy_procedures_eNB_uespec_RX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); } // TX processing for subframe n+4 @@ -629,23 +631,122 @@ static void wait_system_ready (char *message, volatile int *start_flag) { } #endif - /*! - * \brief The RX common thread of eNB. + * \brief The Asynchronous RX FH thread of RAU/RCC/eNB. + * This handles the RX FH for an asynchronous RRU/UE * \param param is a \ref eNB_proc_t structure which contains the info what to process. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -static void* eNB_thread_rx_common( void* param ) { - - static int eNB_thread_rx_status; +static void* eNB_thread_asynch_rx( void* param ) { eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + openair0_timestamp timestamp_rx; + int frame_rx,subframe_rx; + int first_rx = 1; + uint16_t packet_type; + uint32_t symbol_number=0; + uint32_t symbol_mask, symbol_mask_full; + int prach_rx; + + if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF + /// **** recv_IF5 of rxdata from RRH **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); + recv_IF5(eNB, ×tamp_rx, subframe_rx++, IF5_RRH_GW_UL); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); + if (first_rx == 1) { + first_rx = 0; + subframe_rx = (timestamp_rx/fp->samples_per_tti)%10; + } + else { + // check timestamp + if ((timestamp_rx - proc->timestamp_rx) < (2*fp->samples_per_tti)) + printf("RX overflow ...\n"); + + } + } // eNodeB_3GPP_BBU + else if (eNB->node_function == NGFI_RCC_IF4) { + /// **** recv_IF4 of rxdataF from RRU **** /// + /// **** recv_IF4 of rxsigF from RRU **** /// + // get frame/subframe information from IF4 interface + // timed loop (200 us) + + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + prach_rx = 0; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); + recv_IF4(eNB, &frame_rx, &subframe_rx, &packet_type, &symbol_number); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + + if (packet_type == IF4_PULFFT) { + symbol_mask = symbol_mask | (1<first_rx == 0) { + if (subframe_rx < proc->subframe_rx+2){ + LOG_E(PHY,"RX overflow (proc->subframe_rx %d, subframe_rx %d)\n",proc->subframe_rx,subframe_rx); + } + } else { + proc->first_rx = 0; + } + } // node_timing == synch_to_externs, node_function = NGFI_IF4 + else { // should not get here + AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); + } + +} + +/*! + * \brief The Fronthaul thread of RRU/RAU/RCC/eNB + * In the case of RRU/eNB, handles interface with external RF + * In the case of RAU/RCC, handles fronthaul interface with RRU/RAU + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread_FH( void* param ) { + + static int eNB_thread_FH_status; + + eNB_proc_t *proc = (eNB_proc_t*)param; + PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + void *rxp[fp->nb_antennas_rx]; + unsigned int rxs; FILE *rx_time_file = NULL; char rx_time_name[101]; struct timespec wait; + int i; + int prach_rx; + + + + uint16_t packet_type; + uint32_t symbol_number=0; + uint32_t symbol_mask, symbol_mask_full; + + int subframe = proc->subframe_rx; + int frame = proc->frame_rx; + if (subframe==9) { + subframe=0; + frame++; + frame&=1023; + } else { + subframe++; + } wait.tv_sec=0; wait.tv_nsec=5000000L; @@ -655,7 +756,7 @@ static void* eNB_thread_rx_common( void* param ) { rx_time_file = fopen(rx_time_name,"w"); } // set default return value - eNB_thread_rx_status = 0; + eNB_thread_FH_status = 0; MSC_START_USE(); @@ -678,7 +779,7 @@ static void* eNB_thread_rx_common( void* param ) { if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB RX sched_setattr failed\n"); - return &eNB_thread_rx_status; + return &eNB_thread_FH_status; } LOG_I( HW, "[SCHED] eNB RX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); @@ -796,32 +897,205 @@ static void* eNB_thread_rx_common( void* param ) { // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, 0 ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); - start_meas( &softmodem_stats_rx_sf ); if (oai_exit) break; - if ((((fp->frame_type == TDD )&&(subframe_select(fp,proc->subframe_rx)==SF_UL)) || - (fp->frame_type == FDD))) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); - // this spawns the prach inside and updates the frame and subframe counters - phy_procedures_eNB_common_RX(eNB, 0); + + if ((eNB->node_timing == synch_to_other) && + ((eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == NGFI_RRU_IF5) || + (eNB->node_function == eNodeB_3GPP))) { // This case is for synchronization to another thread + //wait for event + + // how long should we wait here, for MOBIPASS this could be long + // if (pthread_mutex_timedlock(&proc->mutex_FH,&wait) != 0) { + if (pthread_mutex_lock(&proc->mutex_FH) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for FH\n"); + exit_fun( "error locking mutex" ); + break; + } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); + while (proc->instance_cnt_FH < 0) { + // most of the time the thread is waiting here + // proc->instance_cnt_prach is -1 + pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); // this unlocks mutex_rxtx while waiting and then locks it again + } + + proc->instance_cnt_FH++; + + + } + // Remaining cases are all for synchronization on FH interface + else if ((eNB->node_timing == synch_to_ext_device) && + ((eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == NGFI_RRU_IF5) || + (eNB->node_function == eNodeB_3GPP))) { // acquisition from RF + + for (i=0; inb_antennas_rx; i++) + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &proc->timestamp_rx, + rxp, + fp->samples_per_tti, + fp->nb_antennas_rx); + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + + if (proc->first_rx == 0) { + if (proc->subframe_rx != subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + exit_fun("Exiting"); + } + if (proc->frame_rx != frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + } + + // printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); + + if (rxs != fp->samples_per_tti) + exit_fun( "problem receiving samples" ); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + + } // node_timing==synch_to_ext_device && node_function == RRU || eNodeB + else if ((eNB->node_timing == synch_to_ext_device) && + (eNB->node_function == eNodeB_3GPP_BBU)) { // acquisition from IF + /// **** recv_IF5 of rxdata from RRH **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); + recv_IF5(eNB, &proc->timestamp_rx, proc->subframe_rx, IF5_RRH_GW_UL); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); + + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + if (proc->first_rx == 0) { + if (proc->subframe_rx != subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + //exit_fun("Exiting"); + } + if (proc->frame_rx != frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + //exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); + } // eNodeB_3GPP_BBU && node_timing == synch_to_ext_device + + else if ((eNB->node_timing == synch_to_ext_device) && + (eNB->node_function == NGFI_RCC_IF4)) { + /// **** recv_IF4 of rxdataF from RRU **** /// + /// **** recv_IF4 of rxsigF from RRU **** /// + // get frame/subframe information from IF4 interface + // timed loop (200 us) + + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + prach_rx = 0; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); + recv_IF4(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + + if (packet_type == IF4_PULFFT) { + symbol_mask = symbol_mask | (1<first_rx == 0) { + if (proc->subframe_rx != subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + //exit_fun("Exiting"); + } + if (proc->frame_rx != frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + //exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); + + + } // node_timing == synch_to_externs, node_function = NGFI_IF4 + else { // should not get here + AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); } + // At this point, all information for subframe has been received on FH interface + // If this proc is to provide synchronization, do so + for (i=0;inum_slaves;i++) { + eNB_proc_t *slave_proc = proc->slave_proc[i]; + // wake up slave FH thread + // lock the FH mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&slave_proc->mutex_FH,&wait) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)\n",proc->CC_id,slave_proc->CC_id); + exit_fun( "error locking mutex_rxtx" ); + break; + } + int cnt_slave = ++slave_proc->instance_cnt_FH; + slave_proc->frame_rx = proc->frame_rx; + slave_proc->subframe_rx = proc->subframe_rx; + slave_proc->timestamp_rx = proc->timestamp_rx; + + pthread_mutex_unlock( &slave_proc->mutex_FH ); + + if (cnt_slave == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&slave_proc->cond_FH) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB CCid %d, slave CCid %d\n",proc->CC_id,slave_proc->CC_id); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_rxtx %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); + exit_fun( "TX thread busy" ); + break; + } + } + + // wake up RXn_TXnp4 thread for the subframe // choose even or odd thread for RXn-TXnp4 processing eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[proc->subframe_rx&1]; // wake up TX for subframe n+4 // lock the TX mutex and make sure the thread is ready if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc_rxtx->instance_cnt_rxtx ); + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", proc_rxtx->subframe_rx&1,proc_rxtx->instance_cnt_rxtx ); exit_fun( "error locking mutex_rxtx" ); break; } int cnt_rxtx = ++proc_rxtx->instance_cnt_rxtx; + // We have just received and processed the common part of a subframe, say n. // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired // transmitted timestamp of the next TX slot (first). @@ -865,12 +1139,20 @@ static void* eNB_thread_rx_common( void* param ) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); } - - printf( "Exiting eNB thread rx_common\n"); + if (eNB->node_timing == synch_to_ext_device) { + proc->instance_cnt_FH--; + + if (pthread_mutex_unlock(&proc->mutex_FH) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for FH\n"); + exit_fun( "error unlocking mutex" ); + } + } + + printf( "Exiting FH thread \n"); - eNB_thread_rx_status = 0; - return &eNB_thread_rx_status; + eNB_thread_FH_status = 0; + return &eNB_thread_FH_status; } @@ -1070,9 +1352,9 @@ void init_eNB_proc(void) { pthread_attr_setschedparam (&proc_rxtx[1].attr_rxtx, &proc_rxtx[1].sched_param_rxtx); pthread_attr_setschedpolicy (&proc_rxtx[1].attr_rxtx, SCHED_FIFO); - proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_rx, &proc->sched_param_rx); - pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO); + proc->sched_param_FH.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_FH, &proc->sched_param_FH); + pthread_attr_setschedpolicy (&proc->attr_FH, SCHED_FIFO); proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); @@ -1083,6 +1365,7 @@ void init_eNB_proc(void) { proc_rxtx[0].instance_cnt_rxtx = -1; proc_rxtx[1].instance_cnt_rxtx = -1; proc->instance_cnt_prach = -1; + proc->instance_cnt_FH = -1; proc->CC_id = CC_id; proc->first_rx=4; @@ -1093,24 +1376,30 @@ void init_eNB_proc(void) { pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); pthread_cond_init( &proc->cond_prach, NULL); + pthread_cond_init( &proc->cond_FH, NULL); #ifndef DEADLINE_SCHEDULER pthread_create( &proc_rxtx[0].pthread_rxtx, &proc_rxtx[0].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[0] ); pthread_create( &proc_rxtx[1].pthread_rxtx, &proc_rxtx[1].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[1] ); - pthread_create( &proc->pthread_rx, &proc->attr_rx, eNB_thread_rx_common, &eNB->proc ); + pthread_create( &proc->pthread_FH, &proc->attr_FH, eNB_thread_FH, &eNB->proc ); pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); + if (eNB->node_timing == synch_to_other) + pthread_create( &proc->pthread_asynch_rx, &proc->attr_asynch_rx, eNB_thread_asynch_rx, &eNB->proc ); #else pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); - pthread_create( &proc->pthread_rx, NULL, eNB_thread_rx_common, &eNB->proc ); + pthread_create( &proc->pthread_FH, NULL, eNB_thread_FH, &eNB->proc ); pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); + if (eNB->node_timing == synch_to_other) + pthread_create( &proc->pthread_asynch_rx, NULL, eNB_thread_asynch_rx, &eNB->proc ); + #endif char name[16]; snprintf( name, sizeof(name), "RXTX0 %d", i ); pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); snprintf( name, sizeof(name), "RXTX1 %d", i ); pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); - snprintf( name, sizeof(name), "RX %d", i ); - pthread_setname_np( proc->pthread_rx, name ); + snprintf( name, sizeof(name), "FH %d", i ); + pthread_setname_np( proc->pthread_FH, name ); } /* setup PHY proc TX sync mechanism */ @@ -1142,63 +1431,27 @@ void kill_eNB_proc(void) { proc_rxtx[0].instance_cnt_rxtx = 0; // FIXME data race! proc_rxtx[1].instance_cnt_rxtx = 0; // FIXME data race! proc->instance_cnt_prach = 0; + proc->instance_cnt_FH = 0; pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); pthread_cond_signal( &proc_rxtx[1].cond_rxtx ); pthread_cond_signal( &proc->cond_prach ); + pthread_cond_signal( &proc->cond_FH ); pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); - pthread_join( proc->pthread_rx, (void**)&status ); + pthread_join( proc->pthread_FH, (void**)&status ); + pthread_mutex_destroy( &proc->mutex_FH ); + pthread_cond_destroy( &proc->cond_FH ); + + pthread_join( proc->pthread_prach, (void**)&status ); + pthread_mutex_destroy( &proc->mutex_prach ); + pthread_cond_destroy( &proc->cond_prach ); - - int result,i; + int i; for (i=0;i<2;i++) { pthread_join( proc_rxtx[i].pthread_rxtx, (void**)&status ); - -#ifdef DEBUG_THREADS - - if (result != 0) { - printf( "Error joining thread.\n" ); - } else { - if (status) { - printf( "status %d\n", *status ); - } else { - printf( "The thread was killed. No status available.\n" ); - } - } -#else - UNUSED(result); -#endif - pthread_mutex_destroy( &proc_rxtx[i].mutex_rxtx ); pthread_cond_destroy( &proc_rxtx[i].cond_rxtx ); } - -#ifdef DEBUG_THREADS - printf( "Killing RX CC_id %d thread\n", CC_id); -#endif - -#ifdef DEBUG_THREADS - printf( "Joining eNB RX CC_id %d thread ...\n", CC_id); -#endif - - result = pthread_join( proc->pthread_rx, (void**)&status ); - -#ifdef DEBUG_THREADS - if (result != 0) { - printf( "Error joining thread.\n" ); - } else { - if (status) { - printf( "status %d\n", *status ); - } else { - printf( "The thread was killed. No status available.\n" ); - } - } -#else - UNUSED(result); -#endif - - pthread_mutex_destroy( &proc->mutex_prach ); - pthread_cond_destroy( &proc->cond_prach ); } } diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 5a970ca038..867d578ce9 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1166,17 +1166,6 @@ void init_ocm(void) LOG_D(OCM,"Initializing channel (%s, %d) from eNB %d to UE %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option, map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option), eNB_id, UE_id); - /* if (oai_emulation.info.transmission_mode == 5) - eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id]->frame_parms.nb_antennas_tx, - PHY_vars_UE_g[UE_id]->frame_parms.nb_antennas_rx, - (UE_id == 0)? Rice1_corr : Rice1_anticorr, - oai_emulation.environment_system_config.system_bandwidth_MB, - forgetting_factor, - 0, - 0); - - else - */ eNB2UE[eNB_id][UE_id][CC_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.nb_antennas_tx, From 6a120cf286dd36b3f2d1a906ade8aea349629021 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 22 Jul 2016 15:40:47 +0200 Subject: [PATCH 122/340] fixes for reading cc_synch --- openair1/PHY/defs.h | 8 ------- openair2/ENB_APP/enb_config.c | 40 +++++++++++++++++++++++------------ openair2/ENB_APP/enb_config.h | 1 + 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 4c46674ecb..f876860a55 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -170,7 +170,6 @@ typedef enum { synch_to_other // synch to another source (timer, other CC_id) } eNB_timing_t; - typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals int32_t amp[3][10]; @@ -800,11 +799,4 @@ typedef struct { #include "SIMULATION/ETH_TRANSPORT/defs.h" #endif //OPENAIR_LTE - #endif // __PHY_DEFS__H__ - - - - - - diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index c1de6a7935..35d02f8842 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -74,7 +74,8 @@ #define ENB_CONFIG_STRING_COMPONENT_CARRIERS "component_carriers" #define ENB_CONFIG_STRING_CC_NODE_FUNCTION "node_function" -#define ENB_CONFIG_STRING_CC_NODE_TIMING "node_timing" +#define ENB_CONFIG_STRING_CC_NODE_TIMING "node_timing" +#define ENB_CONFIG_STRING_CC_NODE_SYNCH_REF "node_synch_ref" #define ENB_CONFIG_STRING_FRAME_TYPE "frame_type" #define ENB_CONFIG_STRING_TDD_CONFIG "tdd_config" @@ -303,25 +304,26 @@ void enb_config_display(void) printf( "\tiq_txshift : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].iq_txshift); printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : (enb_properties.properties[i]->rrh_gw_config[j].rawif4 == 1)? "RAW_IF4" : (enb_properties.properties[i]->rrh_gw_config[j].udpif4 == 1)? "UDP_IF4" : (enb_properties.properties[i]->rrh_gw_config[j].rawif5_mobipass == 1)? "RAW_IF5_MOBIPASS" : "UDP"); if (enb_properties.properties[i]->rrh_gw_config[j].exmimo == 1) { - printf( "\tRF target : \tEXMIMO:\n\n"); + printf( "\tRF target : \tEXMIMO:\n"); } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_b200 == 1) { - printf( "\tRF target : \tUSRP_B200:\n\n"); + printf( "\tRF target : \tUSRP_B200:\n"); } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_x300 == 1) { - printf( "\tRF target : \tUSRP_X300:\n\n"); + printf( "\tRF target : \tUSRP_X300:\n"); } else if (enb_properties.properties[i]->rrh_gw_config[j].bladerf == 1) { - printf( "\tRF target : \tBLADERF:\n\n"); + printf( "\tRF target : \tBLADERF:\n"); } else if (enb_properties.properties[i]->rrh_gw_config[j].lmssdr == 1) { - printf( "\tRF target : \tLMSSDR:\n\n"); + printf( "\tRF target : \tLMSSDR:\n"); } else { - printf( "\tRF target : \tNONE:\n\n"); + printf( "\tRF target : \tNONE:\n"); } } } for (j=0; j< enb_properties.properties[i]->nb_cc; j++) { // CC_ID node function/timing - printf( "\tnode_function for CC %d:\t%d:\n",j,enb_properties.properties[i]->cc_node_function[j]); - printf( "\tnode_timing for CC %d:\t%d:\n",j,enb_properties.properties[i]->cc_node_timing[j]); + printf( "\n\tnode_function for CC %d: \t%d:\n",j,enb_properties.properties[i]->cc_node_function[j]); + printf( "\tnode_timing for CC %d: \t%d:\n",j,enb_properties.properties[i]->cc_node_timing[j]); + printf( "\tnode_synch_ref for CC %d: \t%d:\n",j,enb_properties.properties[i]->cc_node_synch_ref[j]); printf( "\teutra band for CC %d: \t%"PRId16":\n",j,enb_properties.properties[i]->eutra_band[j]); printf( "\tdownlink freq for CC %d: \t%"PRIu64":\n",j,enb_properties.properties[i]->downlink_frequency[j]); @@ -416,17 +418,17 @@ void enb_config_display(void) printf( "\tue_TimersAndConstants_t310 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_t310[j]); printf( "\tue_TimersAndConstants_n310 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_n310[j]); printf( "\tue_TimersAndConstants_t311 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_t311[j]); - printf( "\tue_TimersAndConstants_n311 for CC %d:\t%ld:\n\n",j,enb_properties.properties[i]->ue_TimersAndConstants_n311[j]); + printf( "\tue_TimersAndConstants_n311 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_n311[j]); } for (j=0; j < enb_properties.properties[i]->num_otg_elements; j++) { - printf( "\tOTG Destination UE ID: \t%"PRIu16, enb_properties.properties[i]->otg_ue_id[j]); + printf( "\n\tOTG Destination UE ID: \t%"PRIu16, enb_properties.properties[i]->otg_ue_id[j]); printf( "\n\tOTG App Type: \t%"PRIu8, enb_properties.properties[i]->otg_app_type[j]); printf( "\n\tOTG Background Traffic: \t%s\n", (enb_properties.properties[i]->otg_bg_traffic[j]==1) ? "Enabled" : "Disabled"); } - printf( "\tGlobal log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->glog_level)); + printf( "\n\tGlobal log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->glog_level)); printf( "\tHW log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->hw_log_level)); printf( "\tPHY log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->phy_log_level)); printf( "\tMAC log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->mac_log_level)); @@ -521,6 +523,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) const char* cc_node_function = NULL; const char* cc_node_timing = NULL; + int cc_node_synch_ref = 0; const char* cell_type = NULL; const char* tac = 0; @@ -800,6 +803,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) //printf("Component carrier %d\n",component_carrier); if (!(config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_CC_NODE_FUNCTION, &cc_node_function) && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_CC_NODE_TIMING, &cc_node_timing) + && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_CC_NODE_SYNCH_REF, &cc_node_synch_ref) && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_FRAME_TYPE, &frame_type) && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TDD_CONFIG, &tdd_config) && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TDD_CONFIG_S, &tdd_config_s) @@ -894,9 +898,9 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) lib_config_file_name_pP, i, cc_node_function); } - if (strcmp(cc_node_timing, "SYNCH_TO_DEVICE") == 0) { + if (strcmp(cc_node_timing, "synch_to_ext_device") == 0) { enb_properties.properties[enb_properties_index]->cc_node_timing[j] = synch_to_ext_device; - } else if (strcmp(cc_node_timing, "SYNCH_TO_OTHER") == 0) { + } else if (strcmp(cc_node_timing, "synch_to_other") == 0) { enb_properties.properties[enb_properties_index]->cc_node_timing[j] = synch_to_other; } else { AssertError (0, parse_errors ++, @@ -904,6 +908,14 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) lib_config_file_name_pP, i, cc_node_timing); } + if ((cc_node_synch_ref >= -1) && (cc_node_synch_ref < num_component_carriers)) { + enb_properties.properties[enb_properties_index]->cc_node_synch_ref[j] = (int16_t) cc_node_synch_ref; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for node_synch_ref choice: valid CC_id or -1 !\n", + lib_config_file_name_pP, i, cc_node_synch_ref); + } + enb_properties.properties[enb_properties_index]->tdd_config[j] = tdd_config; AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!", diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 3feeb5e828..6a8483c3d0 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -132,6 +132,7 @@ typedef struct Enb_properties_s { int16_t nb_cc; eNB_func_t cc_node_function[1+MAX_NUM_CCs]; eNB_timing_t cc_node_timing[1+MAX_NUM_CCs]; + int16_t cc_node_synch_ref[1+MAX_NUM_CCs]; lte_frame_type_t frame_type[1+MAX_NUM_CCs]; uint8_t tdd_config[1+MAX_NUM_CCs]; uint8_t tdd_config_s[1+MAX_NUM_CCs]; From 631b4cacf41a8a205d9606d554daf26577531c3c Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 22 Jul 2016 16:51:37 +0200 Subject: [PATCH 123/340] read node fn, timing from config data --- targets/RT/USER/lte-enb.c | 12 +-- targets/RT/USER/lte-softmodem.c | 131 +++++++------------------------- 2 files changed, 35 insertions(+), 108 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 3317d289e0..1f80e17502 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -157,7 +157,7 @@ static struct { void exit_fun(const char* s); -void init_eNB(eNB_func_t node_function); +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[]); void stop_eNB(void); @@ -1577,13 +1577,15 @@ void print_opp_meas(void) { } -void init_eNB(eNB_func_t node_function) { +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[]) { int CC_id; - for (CC_id=0;CC_idnode_function = node_function; - + for (CC_id=0;CC_idnode_function = node_function[CC_id]; + PHY_vars_eNB_g[0][CC_id]->node_timing = node_timing[CC_id]; + } + init_eNB_proc(); sleep(1); LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index eedc641574..42cefe4154 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -119,7 +119,7 @@ unsigned short config_frames[4] = {2,9,11,13}; // In lte-enb.c extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); -extern void init_eNB(eNB_func_t); +extern void init_eNB(eNB_func_t *, eNB_timing_t *); extern void stop_eNB(void); extern void kill_eNB_proc(void); @@ -229,7 +229,9 @@ int otg_enabled; static LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; -eNB_func_t node_function=eNodeB_3GPP; +eNB_func_t node_function[MAX_NUM_CCs]; +eNB_timing_t node_timing[MAX_NUM_CCs]; +int16_t node_synch_ref[MAX_NUM_CCs]; uint32_t target_dl_mcs = 28; //maximum allowed mcs uint32_t target_ul_mcs = 20; @@ -237,8 +239,6 @@ uint32_t timing_advance = 0; uint8_t exit_missed_slots=1; uint64_t num_missed_slots=0; // counter for the number of missed slots - - extern void reset_opp_meas(void); extern void print_opp_meas(void); int transmission_mode=1; @@ -387,11 +387,6 @@ void help (void) { printf(" --ue-scan_carrier set UE to scan around carrier\n"); printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); printf(" --mmapped-dma sets flag for improved EXMIMO UE performance\n"); - printf(" --RCC run using NGFI RCC node function IF4 split\n"); - printf(" --RRU run using NGFI RRU node function IF4 split\n"); - printf(" --eNB run using 3GPP eNB node function\n"); - printf(" --BBU run using 3GPP eNB node function with IF5 split\n"); - printf(" --RRH run using RRH node function with IF5 split\n"); printf(" -C Set the downlink frequency for all component carriers\n"); printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); @@ -688,12 +683,7 @@ static void get_options (int argc, char **argv) LONG_OPTION_DUMP_FRAME, LONG_OPTION_LOOPMEMORY, LONG_OPTION_PHYTEST, - LONG_OPTION_MMAPPED_DMA, - LONG_OPTION_RCC, - LONG_OPTION_RRU, - LONG_OPTION_ENB, - LONG_OPTION_ENB_BBU, - LONG_OPTION_RRH + LONG_OPTION_MMAPPED_DMA #if T_TRACER , LONG_OPTION_T_PORT, @@ -718,11 +708,6 @@ static void get_options (int argc, char **argv) {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY}, {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST}, {"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA}, - {"RCC", no_argument, NULL, LONG_OPTION_RCC}, - {"RRU", no_argument, NULL, LONG_OPTION_RRU}, - {"eNB", no_argument, NULL, LONG_OPTION_ENB}, - {"BBU", no_argument, NULL, LONG_OPTION_ENB_BBU}, - {"RRH", no_argument, NULL, LONG_OPTION_RRH}, #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, @@ -817,26 +802,6 @@ static void get_options (int argc, char **argv) case LONG_OPTION_MMAPPED_DMA: mmapped_dma = 1; break; - - case LONG_OPTION_RCC: - node_function = NGFI_RCC_IF4; - break; - - case LONG_OPTION_RRU: - node_function = NGFI_RRU_IF4; - break; - - case LONG_OPTION_ENB: - node_function = eNodeB_3GPP; - break; - - case LONG_OPTION_ENB_BBU: - node_function = eNodeB_3GPP_BBU; - break; - - case LONG_OPTION_RRH: - node_function = NGFI_RRU_IF5; - break; #if T_TRACER case LONG_OPTION_T_PORT: { @@ -1116,6 +1081,10 @@ static void get_options (int argc, char **argv) } for (CC_id=0; CC_idproperties[i]->cc_node_function[CC_id]; + node_timing[CC_id] = enb_properties->properties[i]->cc_node_timing[CC_id]; + node_synch_ref[CC_id] = enb_properties->properties[i]->cc_node_synch_ref[CC_id]; + frame_parms[CC_id]->frame_type = enb_properties->properties[i]->frame_type[CC_id]; frame_parms[CC_id]->tdd_config = enb_properties->properties[i]->tdd_config[CC_id]; frame_parms[CC_id]->tdd_config_S = enb_properties->properties[i]->tdd_config_s[CC_id]; @@ -1668,7 +1637,7 @@ int main( int argc, char **argv ) if (UE_flag == 0) { for (CC_id=0; CC_idrfdevice.host_type = RRH_HOST; PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST; } else { @@ -1683,69 +1652,39 @@ int main( int argc, char **argv ) openair0.type = NONE_DEV; /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ openair0.transp_type = NONE_TP; - - // Legacy BBU - RRH init - //int returns=-1; - ///* BBU can have either a local or a remote radio head */ - //if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active - load library of radio head and initiate it - //if (mode!=loop_through_memory) { - //returns=openair0_device_load(&openair0, &openair0_cfg[0]); - //printf("openair0_device_init returns %d\n",returns); - //if (returns<0) { - //printf("Exiting, cannot initialize device\n"); - //exit(-1); - //} - //} - //else if (mode==loop_through_memory) { - //} - //} else { //remote radio head active - load library of transport protocol and initiate it - //if (mode!=loop_through_memory) { - //returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params); - //printf("openair0_transport_init returns %d\n",returns); - //if (returns<0) { - //printf("Exiting, cannot initialize transport protocol\n"); - //exit(-1); - //} - //} - //else if (mode==loop_through_memory) { - //} - //} - + int returns=-1; - // Handle spatially distributed MIMO antenna ports // Load RF device and initialize - if (node_function == NGFI_RRU_IF5 || node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { - for (CC_id=0; CC_idrfdevice), &openair0_cfg[0]) : - openair0_device_load(&openair0, &openair0_cfg[0]); - + returns = (UE_flag == 0) ? + openair0_device_load(&(PHY_vars_eNB_g[0][CC_id]->rfdevice), &openair0_cfg[0]) : + openair0_device_load(&openair0, &openair0_cfg[0]); printf("openair0_device_init returns %d for CC_id %d\n",returns,CC_id); if (returns<0) { - printf("Exiting, cannot initialize device\n"); - exit(-1); + printf("Exiting, cannot initialize device\n"); + exit(-1); } - } - else if (mode==loop_through_memory) { + } else if (mode==loop_through_memory) { + } } } // Load transport protocol and initialize - - if ((UE_flag==0) && (node_function != eNodeB_3GPP)){ - for (CC_id=0; CC_idifdevice), &openair0_cfg[0], (eth_params+CC_id)); + returns = openair0_transport_load(&(PHY_vars_eNB_g[0][CC_id]->ifdevice), &openair0_cfg[0], (eth_params+CC_id)); printf("openair0_transport_init returns %d for CC_id %d\n",returns,CC_id); if (returns<0) { - printf("Exiting, cannot initialize transport protocol\n"); - exit(-1); + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); } - } - else if (mode==loop_through_memory) { + } else if (mode==loop_through_memory) { + } } } @@ -1783,7 +1722,6 @@ int main( int argc, char **argv ) number_of_cards = 1; - for(CC_id=0; CC_id Date: Fri, 22 Jul 2016 18:51:04 +0200 Subject: [PATCH 124/340] eNB tx working --- targets/RT/USER/lte-enb.c | 165 +++++++++++++++++--------------------- 1 file changed, 72 insertions(+), 93 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 1f80e17502..1355bb5a2a 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -496,7 +496,7 @@ static void* eNB_thread_rxtx( void* param ) { LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc\n"); exit_fun("nothing to add"); break; - } + } } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) { /// **** recv_IF4 of txdataF from RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); @@ -604,10 +604,8 @@ static void* eNB_thread_rxtx( void* param ) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); - printf( "Exiting eNB thread RXn_TXnp4\n"); - eNB_thread_rxtx_status = 0; return &eNB_thread_rxtx_status; } @@ -679,7 +677,6 @@ static void* eNB_thread_asynch_rx( void* param ) { prach_rx = 0; do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); recv_IF4(eNB, &frame_rx, &subframe_rx, &packet_type, &symbol_number); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); @@ -690,10 +687,7 @@ static void* eNB_thread_asynch_rx( void* param ) { } else if (packet_type == IF4_PRACH) { // wake up thread for PRACH RX prach_rx = 1; - } - - - + } } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); if (proc->first_rx == 0) { @@ -732,16 +726,12 @@ static void* eNB_thread_FH( void* param ) { int i; int prach_rx; - - uint16_t packet_type; uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; - int subframe = proc->subframe_rx; - int frame = proc->frame_rx; - - + int subframe=0, frame=0; + wait.tv_sec=0; wait.tv_nsec=5000000L; @@ -835,7 +825,7 @@ static void* eNB_thread_FH( void* param ) { exit_fun("Error getting thread priority"); } - LOG_I(HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), + LOG_I(HW, "[SCHED][eNB] FH thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -849,7 +839,7 @@ static void* eNB_thread_FH( void* param ) { mlockall(MCL_CURRENT | MCL_FUTURE); // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads - printf( "waiting for sync (eNB_thread_rx_common)\n"); + printf( "waiting for sync (eNB_thread_FH)\n"); pthread_mutex_lock( &sync_mutex ); while (sync_var<0) @@ -892,76 +882,75 @@ static void* eNB_thread_FH( void* param ) { // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { - if (oai_exit) break; - + if (oai_exit) break; + // This case is for synchronization to another thread if ((eNB->node_timing == synch_to_other) && - ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == NGFI_RRU_IF5) || - (eNB->node_function == eNodeB_3GPP))) { // This case is for synchronization to another thread + ((eNB->node_function == NGFI_RCC_IF4) || + (eNB->node_function == eNodeB_3GPP_BBU))) { //wait for event // how long should we wait here, for MOBIPASS this could be long // if (pthread_mutex_timedlock(&proc->mutex_FH,&wait) != 0) { if (pthread_mutex_lock(&proc->mutex_FH) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for FH\n"); - exit_fun( "error locking mutex" ); - break; + LOG_E( PHY, "[SCHED][eNB] error locking mutex for FH\n"); + exit_fun( "error locking mutex" ); + break; } while (proc->instance_cnt_FH < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_prach is -1 - pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); // this unlocks mutex_rxtx while waiting and then locks it again - } - + // most of the time the thread is waiting here + // proc->instance_cnt_prach is -1 + pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); // this unlocks mutex_rxtx while waiting and then locks it again + } proc->instance_cnt_FH++; - } // Remaining cases are all for synchronization on FH interface else if ((eNB->node_timing == synch_to_ext_device) && - ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == NGFI_RRU_IF5) || - (eNB->node_function == eNodeB_3GPP))) { // acquisition from RF + ((eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == NGFI_RRU_IF5) || + (eNB->node_function == eNodeB_3GPP))) { // acquisition from RF for (i=0; inb_antennas_rx; i++) - rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - // sanitycheck if (subframe==9) { - subframe=0; - frame++; - frame&=1023; + subframe=0; + frame++; + frame&=1023; } else { - subframe++; + subframe++; } rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, - &proc->timestamp_rx, - rxp, - fp->samples_per_tti, - fp->nb_antennas_rx); + &proc->timestamp_rx, + rxp, + fp->samples_per_tti, + fp->nb_antennas_rx); + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ + if (proc->subframe_rx != subframe){ LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); exit_fun("Exiting"); - } + } + if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - exit_fun("Exiting"); - } + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } } else { proc->first_rx = 0; + frame = proc->frame_rx; + subframe = proc->subframe_rx; } - // printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); @@ -974,7 +963,7 @@ static void* eNB_thread_FH( void* param ) { } // node_timing==synch_to_ext_device && node_function == RRU || eNodeB else if ((eNB->node_timing == synch_to_ext_device) && - (eNB->node_function == eNodeB_3GPP_BBU)) { // acquisition from IF + (eNB->node_function == eNodeB_3GPP_BBU)) { // acquisition from IF /// **** recv_IF5 of rxdata from RRH **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); recv_IF5(eNB, &proc->timestamp_rx, proc->subframe_rx, IF5_RRH_GW_UL); @@ -982,30 +971,30 @@ static void* eNB_thread_FH( void* param ) { proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - + if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - //exit_fun("Exiting"); - } - if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - //exit_fun("Exiting"); - } + if (proc->subframe_rx != subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + exit_fun("Exiting"); + } + + if (proc->frame_rx != frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } } else { - proc->first_rx = 0; - } + proc->first_rx = 0; + } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); + } // eNodeB_3GPP_BBU && node_timing == synch_to_ext_device - else if ((eNB->node_timing == synch_to_ext_device) && - (eNB->node_function == NGFI_RCC_IF4)) { + (eNB->node_function == NGFI_RCC_IF4)) { /// **** recv_IF4 of rxdataF from RRU **** /// /// **** recv_IF4 of rxsigF from RRU **** /// - // get frame/subframe information from IF4 interface // timed loop (200 us) symbol_number = 0; @@ -1014,7 +1003,6 @@ static void* eNB_thread_FH( void* param ) { prach_rx = 0; do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); recv_IF4(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); @@ -1025,10 +1013,7 @@ static void* eNB_thread_FH( void* param ) { } else if (packet_type == IF4_PRACH) { // wake up thread for PRACH RX prach_rx = 1; - } - - - + } } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); if (proc->first_rx == 0) { @@ -1047,7 +1032,6 @@ static void* eNB_thread_FH( void* param ) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); - } // node_timing == synch_to_externs, node_function = NGFI_IF4 else { // should not get here @@ -1061,10 +1045,11 @@ static void* eNB_thread_FH( void* param ) { // wake up slave FH thread // lock the FH mutex and make sure the thread is ready if (pthread_mutex_timedlock(&slave_proc->mutex_FH,&wait) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)\n",proc->CC_id,slave_proc->CC_id); - exit_fun( "error locking mutex_rxtx" ); - break; + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)\n",proc->CC_id,slave_proc->CC_id); + exit_fun( "error locking mutex_rxtx" ); + break; } + int cnt_slave = ++slave_proc->instance_cnt_FH; slave_proc->frame_rx = proc->frame_rx; slave_proc->subframe_rx = proc->subframe_rx; @@ -1073,16 +1058,16 @@ static void* eNB_thread_FH( void* param ) { pthread_mutex_unlock( &slave_proc->mutex_FH ); if (cnt_slave == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&slave_proc->cond_FH) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB CCid %d, slave CCid %d\n",proc->CC_id,slave_proc->CC_id); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&slave_proc->cond_FH) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB CCid %d, slave CCid %d\n",proc->CC_id,slave_proc->CC_id); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } } else { - LOG_W( PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_rxtx %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); - exit_fun( "TX thread busy" ); - break; + LOG_W( PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_rxtx %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); + exit_fun( "TX thread busy" ); + break; } } @@ -1102,7 +1087,7 @@ static void* eNB_thread_FH( void* param ) { // We have just received and processed the common part of a subframe, say n. // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired // transmitted timestamp of the next TX slot (first). - // The last (TS_rx mod samples_pexr_frame) was n*samples_per_tti, + // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, // and proc->subframe_tx = proc->subframe_rx+3 proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); @@ -1124,14 +1109,13 @@ static void* eNB_thread_FH( void* param ) { LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, cnt_rxtx ); exit_fun( "TX thread busy" ); break; - } - + } stop_meas( &softmodem_stats_rxtx_sf ); #ifdef DEADLINE_SCHEDULER if (opp_enabled){ - if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); + if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); } } #endif // DEADLINE_SCHEDULER @@ -1152,7 +1136,6 @@ static void* eNB_thread_FH( void* param ) { } printf( "Exiting FH thread \n"); - eNB_thread_FH_status = 0; return &eNB_thread_FH_status; @@ -1167,8 +1150,6 @@ static void* eNB_thread_FH( void* param ) { static void* eNB_thread_prach( void* param ) { static int eNB_thread_prach_status; - - eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id]; @@ -1315,10 +1296,8 @@ static void* eNB_thread_prach( void* param ) { } } - printf( "Exiting eNB thread PRACH\n"); - eNB_thread_prach_status = 0; return &eNB_thread_prach_status; } From 2e29052ff47b0a75f850cebed1ce07e378de8a40 Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Fri, 22 Jul 2016 19:35:52 +0200 Subject: [PATCH 125/340] correct logging for common/uespec --- openair1/SCHED/phy_procedures_lte_eNb.c | 53 +++++++++++-------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index ecaeb20fa8..28098406f2 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2517,31 +2517,29 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) { - int i,l; + int l; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; eNB_proc_t *proc = &eNB->proc; - int subframe = proc->subframe_rx; - int frame = proc->frame_rx; + + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; uint8_t seqno=0; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); - - start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_common_RX(%d)\n",eNB->Mod_id,frame,subframe); #endif - if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) - + if (abstraction_flag==0) { if ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == eNodeB_3GPP) || - (eNB->node_function == eNodeB_3GPP_BBU)) { // front-end processing + (eNB->node_function == eNodeB_3GPP) || + (eNB->node_function == eNodeB_3GPP_BBU)) { // front-end processing // now do common RX processing for first slot in subframe VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); @@ -2564,7 +2562,6 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl ); } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); if (eNB->node_function == NGFI_RRU_IF4) { @@ -2572,10 +2569,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(eNB, proc->frame_rx, proc->subframe_rx, IF4_PULFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); - - } - - + } } else if (eNB->node_function == NGFI_RRU_IF5) { /// **** send_IF5 of rxdata to BBU **** /// @@ -2587,12 +2581,12 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) // check if we have to detect PRACH first if ((eNB->node_function != NGFI_RRU_IF5) && - (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0)) { // any other node must call prach procedure + (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0)) { // any other node must call prach procedure // wake up thread for PRACH RX if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); - exit_fun( "error locking mutex_prach" ); - return; + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); + exit_fun( "error locking mutex_prach" ); + return; } int cnt_prach = ++proc->instance_cnt_prach; @@ -2603,18 +2597,19 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl pthread_mutex_unlock( &proc->mutex_prach ); if (cnt_prach == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc->cond_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); - exit_fun( "ERROR pthread_cond_signal" ); - return; - } + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } } else { - LOG_W( PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,cnt_prach); - exit_fun( "PRACH thread busy" ); - return; + LOG_W( PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,cnt_prach); + exit_fun( "PRACH thread busy" ); + return; } } + } else { // grab transport channel information from network interface } @@ -2641,7 +2636,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe); + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_uespec_RX(%d)\n",eNB->Mod_id,frame, subframe); #endif T(T_ENB_PHY_UL_TICK, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe)); From 6e4d361eb3af7d7bbae93c5c4bd00862f76e04af Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 23 Jul 2016 01:17:59 -0700 Subject: [PATCH 126/340] commit before merge --- cmake_targets/CMakeLists.txt | 6 + openair1/PHY/defs.h | 12 +- openair1/PHY/extern.h | 3 + openair1/PHY/vars.h | 3 + openair1/SCHED/phy_procedures_lte_eNb.c | 96 ----- openair2/UTIL/OCG/OCG.h | 2 + ...enb.band7.generic.oaisim.local_no_mme.conf | 2 + targets/RT/USER/lte-enb.c | 273 +++++++++----- targets/RT/USER/lte-softmodem.c | 76 ++-- targets/RT/USER/lte-ue.c | 343 +++++------------- targets/SIMU/USER/oaisim.c | 186 +++------- targets/SIMU/USER/oaisim_functions.c | 22 +- 12 files changed, 388 insertions(+), 636 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index a39cf35f6a..56ff74b8d3 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1736,6 +1736,9 @@ add_executable(oaisim ${s1ap_h} ${x2ap_h} ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_TARGETS}/RT/USER/lte-ue.c + ${OPENAIR_TARGETS}/RT/USER/lte-enb.c + ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/SIMU/USER/channel_sim.c ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c ${OPENAIR_TARGETS}/SIMU/USER/oaisim_config.c @@ -1779,6 +1782,9 @@ add_executable(oaisim_nos1 ${s1ap_h} ${x2ap_h} ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_TARGETS}/RT/USER/lte-ue.c + ${OPENAIR_TARGETS}/RT/USER/lte-enb.c + ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/SIMU/USER/channel_sim.c ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c ${OPENAIR_TARGETS}/SIMU/USER/oaisim_config.c diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 4c46674ecb..e4386c8fdf 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -171,6 +171,7 @@ typedef enum { } eNB_timing_t; + typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals int32_t amp[3][10]; @@ -310,10 +311,16 @@ typedef struct { uint8_t CC_id; /// Last RX timestamp openair0_timestamp timestamp_rx; + /// pthread attributes for main UE thread + pthread_attr_t attr_ue; + /// scheduling parameters for main UE thread + struct sched_param sched_param_ue; + /// pthread descriptor main UE thread + pthread_t pthread_ue; /// \brief Instance count for synch thread. /// \internal This variable is protected by \ref mutex_synch. int instance_cnt_synch; - /// pthread attributes for prach processing thread + /// pthread attributes for synch processing thread pthread_attr_t attr_synch; /// scheduling parameters for synch thread struct sched_param sched_param_synch; @@ -770,6 +777,9 @@ typedef struct { time_stats_t dlsch_tc_intl2_stats; time_stats_t tx_prach; + /// RF and Interface devices per CC + openair0_device rfdevice; + #if ENABLE_RAL hash_table_t *ral_thresholds_timed; SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX]; diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h index 4c9e2706c7..2144c4f01d 100755 --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -111,6 +111,9 @@ extern double p_qam64[8]; extern double beta1_dlsch[6][MCS_COUNT]; extern double beta2_dlsch[6][MCS_COUNT]; +extern char eNB_functions[5][20]; +extern char eNB_timing[2][20]; + #endif /*__PHY_EXTERN_H__ */ diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h index 3d940d4a94..85bfe7a2a6 100755 --- a/openair1/PHY/vars.h +++ b/openair1/PHY/vars.h @@ -139,6 +139,9 @@ double beta2_dlsch[6][MCS_COUNT] = { {2.52163, 0.83231, 0.77472, 1.36536, 1.1682 */ +char eNB_functions[5][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RRU_IF5","NGFI_RRU_IF4","NGFI_RCC_IF4"}; +char eNB_timing[2][20]={"synch_to_ext_device","synch_to_other"}; + #endif /*__PHY_VARS_H__ */ diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index ecaeb20fa8..43edfa807d 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -3236,99 +3236,3 @@ int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, r return do_proc; } #endif -/* -void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t abstraction_flag, - relaying_type_t r_type, PHY_VARS_RN *rn) -{ -#if defined(ENABLE_ITTI) - MessageDef *msg_p; - const char *msg_name; - instance_t instance; - unsigned int Mod_id; - int result; -#endif - - - int CC_id=0; - - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, eNB[0]->proc[subframe].frame_tx); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1); - start_meas(&eNB[0]->phy_proc); - -#if defined(ENABLE_ITTI) - - do { - // Checks if a message has been sent to PHY sub-task - itti_poll_msg (TASK_PHY_ENB, &msg_p); - - if (msg_p != NULL) { - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); - Mod_id = instance; - - switch (ITTI_MSG_ID(msg_p)) { - - // Messages from eNB app - case PHY_CONFIGURATION_REQ: - LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name); - // TODO - - break; - - default: - LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name); - break; - } - - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - } - } while(msg_p != NULL); - -#endif - - - for (CC_id=0; CC_idframe_parms.frame_type == TDD)&& - (subframe_select(&eNB[CC_id]->frame_parms,eNB[CC_id]->proc[0].subframe_tx)==SF_DL))|| - (eNB[CC_id]->frame_parms.frame_type == FDD))) { -#ifdef Rel10 - - if (phy_procedures_RN_eNB_TX(eNB[CC_id]->proc[0].subframe_rx, eNB[CC_id]->proc[0].subframe_tx, r_type) != 0 ) -#endif - phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn); - } - - if ((((eNB[CC_id]->frame_parms.frame_type == TDD )&& - (subframe_select(&eNB[CC_id]->frame_parms,eNB[CC_id]->proc[0].subframe_rx)==SF_UL)) || - (eNB[CC_id]->frame_parms.frame_type == FDD))) { - phy_procedures_eNB_RX(subframe,eNB[CC_id],abstraction_flag,r_type); - } - - if (subframe_select(&eNB[CC_id]->frame_parms,eNB[CC_id]->proc[0].subframe_tx)==SF_S) { -#ifdef Rel10 - - if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 ) -#endif - phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn); - } - - if ((subframe_select(&eNB[CC_id]->frame_parms,eNB[CC_id]->proc[0].subframe_rx)==SF_S)) { - phy_procedures_eNB_S_RX(subframe,eNB[CC_id],abstraction_flag,r_type); - } - - eNB[CC_id]->proc[0].frame_tx++; - eNB[CC_id]->proc[0].frame_rx++; - - if (eNB[CC_id]->proc[0].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h - eNB[CC_id]->proc[0].frame_tx-=MAX_FRAME_NUMBER; - - if (eNB[CC_id]->proc[0].frame_rx>=MAX_FRAME_NUMBER) - eNB[CC_id]->proc[0].frame_rx-=MAX_FRAME_NUMBER; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0); - stop_meas(&eNB[0]->phy_proc); -} -*/ diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h index cf96de7963..c47cc8e8c7 100644 --- a/openair2/UTIL/OCG/OCG.h +++ b/openair2/UTIL/OCG/OCG.h @@ -707,6 +707,8 @@ typedef struct { // phy related params unsigned int n_frames; unsigned int n_frames_flag; // if set, then let the emulation goes to infinity + node_function_t node_function[MAX_NUM_CCs]; + node_timing_t node_timing[MAX_NUM_CCS]; unsigned char frame_type[MAX_NUM_CCs]; //! LTE frame type (TDD=1, FDD=0). \note this should be converted to \ref lte_frame_type_t (header file reorganization needed) char * frame_type_name[MAX_NUM_CCs]; unsigned char tdd_config[MAX_NUM_CCs]; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf index 50cb6747ac..3ec8ea01da 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf @@ -23,6 +23,8 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "SYNCH_TO_OTHER"; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 3317d289e0..ba7921e408 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -157,7 +157,7 @@ static struct { void exit_fun(const char* s); -void init_eNB(eNB_func_t node_function); +void init_eNB(eNB_func_t node_function,int nb_inst); void stop_eNB(void); @@ -350,7 +350,7 @@ static void* eNB_thread_rxtx( void* param ) { /* Set affinity mask to include CPUs 1 to MAX_CPUS */ /* CPU 0 is reserved for UHD threads */ - /* CPU 1 is reserved for all TX threads */ + /* CPU 1 is reserved for all RX_TX threads */ /* Enable CPU Affinity only if number of CPUs >2 */ CPU_ZERO(&cpuset); @@ -398,7 +398,7 @@ static void* eNB_thread_rxtx( void* param ) { exit_fun("Error getting thread priority"); } - LOG_I(HW, "[SCHED][eNB] TX thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), + LOG_I(HW, "[SCHED][eNB] RXn_TXnp4 thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -644,12 +644,103 @@ static void* eNB_thread_asynch_rx( void* param ) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; openair0_timestamp timestamp_rx; int frame_rx,subframe_rx; - int first_rx = 1; + static int first_rx = 1; uint16_t packet_type; uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; int prach_rx; +#ifdef DEADLINE_SCHEDULER + struct sched_attr attr; + unsigned int flags = 0; + uint64_t runtime = 870000 ; + uint64_t deadline = 1 * 1000000; + uint64_t period = 1 * 10000000; // each rx thread has a period of 10ms from the starting point + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = runtime; + attr.sched_deadline = deadline; + attr.sched_period = period; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] eNB FH sched_setattr failed\n"); + return &eNB_thread_FH_status; + } + + LOG_I( HW, "[SCHED] eNB asynch RX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); +#else // LOW_LATENCY + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD */ + /* CPU 1 is reserved for all TX threads */ + /* CPU 2..MAX_CPUS is reserved for all RX threads */ + /* Set CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); +#ifdef CPU_AFFINITY + if (get_nprocs() >2) { + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) { + perror( "pthread_setaffinity_np"); + exit_fun (" Error setting processor affinity :"); + } + } +#endif //CPU_AFFINITY + /* Check the actual affinity mask assigned to the thread */ + + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) { + perror ("pthread_getaffinity_np"); + exit_fun (" Error getting processor affinity :"); + } + memset(cpu_affinity,0, sizeof(cpu_affinity)); + + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + memset(&sparam, 0 , sizeof (sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); + + policy = SCHED_FIFO ; + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + + memset(&sparam, 0 , sizeof (sparam)); + + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) { + perror("pthread_getschedparam"); + exit_fun("Error getting thread priority"); + } + + LOG_I(HW, "[SCHED][eNB] eNB asynch RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, cpu_affinity); + + +#endif // DEADLINE_SCHEDULER + if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF /// **** recv_IF5 of rxdata from RRH **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); @@ -772,11 +863,11 @@ static void* eNB_thread_FH( void* param ) { attr.sched_period = period; if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB RX sched_setattr failed\n"); + perror("[SCHED] eNB FH sched_setattr failed\n"); return &eNB_thread_FH_status; } - LOG_I( HW, "[SCHED] eNB RX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB FH deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); #else // LOW_LATENCY int policy, s, j; struct sched_param sparam; @@ -835,7 +926,7 @@ static void* eNB_thread_FH( void* param ) { exit_fun("Error getting thread priority"); } - LOG_I(HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), + LOG_I(HW, "[SCHED][eNB] FH thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : (policy == SCHED_OTHER) ? "SCHED_OTHER" : @@ -848,8 +939,8 @@ static void* eNB_thread_FH( void* param ) { mlockall(MCL_CURRENT | MCL_FUTURE); - // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads - printf( "waiting for sync (eNB_thread_rx_common)\n"); + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe + printf( "waiting for sync (eNB_thread_FH)\n"); pthread_mutex_lock( &sync_mutex ); while (sync_var<0) @@ -1080,8 +1171,8 @@ static void* eNB_thread_FH( void* param ) { break; } } else { - LOG_W( PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_rxtx %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); - exit_fun( "TX thread busy" ); + LOG_W( PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_FH %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); + exit_fun( "FH thread busy" ); break; } } @@ -1324,91 +1415,94 @@ static void* eNB_thread_prach( void* param ) { } -void init_eNB_proc(void) { +void init_eNB_proc(int nb_inst) { int i; int CC_id; PHY_VARS_eNB *eNB; eNB_proc_t *proc; eNB_rxtx_proc_t *proc_rxtx; + int inst; - for (CC_id=0; CC_idproc; - proc_rxtx = proc->proc_rxtx; + for (inst = 0; inst < nb_inst; inst++) { + for (CC_id=0; CC_idnode_function],eNB_timing[eNB->node_timing]); + proc = &eNB->proc; + proc_rxtx = proc->proc_rxtx; #ifndef DEADLINE_SCHEDULER - /* - pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] ); - if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0) - perror("[ENB_PROC_TX] setting thread stack size failed\n"); - - pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] ); - if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0) - perror("[ENB_PROC_RX] setting thread stack size failed\n"); - */ - // set the kernel scheduling policy and priority - proc_rxtx[0].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc_rxtx[0].attr_rxtx, &proc_rxtx[0].sched_param_rxtx); - pthread_attr_setschedpolicy (&proc_rxtx[0].attr_rxtx, SCHED_FIFO); - proc_rxtx[1].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc_rxtx[1].attr_rxtx, &proc_rxtx[1].sched_param_rxtx); - pthread_attr_setschedpolicy (&proc_rxtx[1].attr_rxtx, SCHED_FIFO); - - proc->sched_param_FH.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_FH, &proc->sched_param_FH); - pthread_attr_setschedpolicy (&proc->attr_FH, SCHED_FIFO); - - proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); - pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO); - - printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); + /* + pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] ); + if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0) + perror("[ENB_PROC_TX] setting thread stack size failed\n"); + + pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] ); + if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0) + perror("[ENB_PROC_RX] setting thread stack size failed\n"); + */ + // set the kernel scheduling policy and priority + proc_rxtx[0].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc_rxtx[0].attr_rxtx, &proc_rxtx[0].sched_param_rxtx); + pthread_attr_setschedpolicy (&proc_rxtx[0].attr_rxtx, SCHED_FIFO); + proc_rxtx[1].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc_rxtx[1].attr_rxtx, &proc_rxtx[1].sched_param_rxtx); + pthread_attr_setschedpolicy (&proc_rxtx[1].attr_rxtx, SCHED_FIFO); + + proc->sched_param_FH.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_FH, &proc->sched_param_FH); + pthread_attr_setschedpolicy (&proc->attr_FH, SCHED_FIFO); + + proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); + pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO); + + printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); #endif - proc_rxtx[0].instance_cnt_rxtx = -1; - proc_rxtx[1].instance_cnt_rxtx = -1; - proc->instance_cnt_prach = -1; - proc->instance_cnt_FH = -1; - proc->CC_id = CC_id; - - proc->first_rx=4; - - pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); - pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); - pthread_mutex_init( &proc->mutex_prach, NULL); - pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); - pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); - pthread_cond_init( &proc->cond_prach, NULL); - pthread_cond_init( &proc->cond_FH, NULL); + proc_rxtx[0].instance_cnt_rxtx = -1; + proc_rxtx[1].instance_cnt_rxtx = -1; + proc->instance_cnt_prach = -1; + proc->instance_cnt_FH = -1; + proc->CC_id = CC_id; + + proc->first_rx=4; + + pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); + pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); + pthread_mutex_init( &proc->mutex_prach, NULL); + pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); + pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); + pthread_cond_init( &proc->cond_prach, NULL); + pthread_cond_init( &proc->cond_FH, NULL); #ifndef DEADLINE_SCHEDULER - pthread_create( &proc_rxtx[0].pthread_rxtx, &proc_rxtx[0].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[0] ); - pthread_create( &proc_rxtx[1].pthread_rxtx, &proc_rxtx[1].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[1] ); - pthread_create( &proc->pthread_FH, &proc->attr_FH, eNB_thread_FH, &eNB->proc ); - pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); - if (eNB->node_timing == synch_to_other) - pthread_create( &proc->pthread_asynch_rx, &proc->attr_asynch_rx, eNB_thread_asynch_rx, &eNB->proc ); + pthread_create( &proc_rxtx[0].pthread_rxtx, &proc_rxtx[0].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, &proc_rxtx[1].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[1] ); + pthread_create( &proc->pthread_FH, &proc->attr_FH, eNB_thread_FH, &eNB->proc ); + pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); + if (eNB->node_timing == synch_to_other) + pthread_create( &proc->pthread_asynch_rx, &proc->attr_asynch_rx, eNB_thread_asynch_rx, &eNB->proc ); #else - pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); - pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); - pthread_create( &proc->pthread_FH, NULL, eNB_thread_FH, &eNB->proc ); - pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); - if (eNB->node_timing == synch_to_other) - pthread_create( &proc->pthread_asynch_rx, NULL, eNB_thread_asynch_rx, &eNB->proc ); - + pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); + pthread_create( &proc->pthread_FH, NULL, eNB_thread_FH, &eNB->proc ); + pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); + if (eNB->node_timing == synch_to_other) + pthread_create( &proc->pthread_asynch_rx, NULL, eNB_thread_asynch_rx, &eNB->proc ); + #endif - char name[16]; - snprintf( name, sizeof(name), "RXTX0 %d", i ); - pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); - snprintf( name, sizeof(name), "RXTX1 %d", i ); - pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); - snprintf( name, sizeof(name), "FH %d", i ); - pthread_setname_np( proc->pthread_FH, name ); + char name[16]; + snprintf( name, sizeof(name), "RXTX0 %d", i ); + pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); + snprintf( name, sizeof(name), "RXTX1 %d", i ); + pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); + snprintf( name, sizeof(name), "FH %d", i ); + pthread_setname_np( proc->pthread_FH, name ); + } + + /* setup PHY proc TX sync mechanism */ + pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); + pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL); + sync_phy_proc.phy_proc_CC_id = 0; } - - /* setup PHY proc TX sync mechanism */ - pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); - pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL); - sync_phy_proc.phy_proc_CC_id = 0; } @@ -1577,14 +1671,15 @@ void print_opp_meas(void) { } -void init_eNB(eNB_func_t node_function) { + void init_eNB(eNB_func_t node_function,int nb_inst) { int CC_id; - - for (CC_id=0;CC_idnode_function = node_function; - - init_eNB_proc(); + int inst; + for (inst=0;instnode_function = node_function; + + init_eNB_proc(nb_inst); sleep(1); LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index eedc641574..d17f7b8599 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -119,14 +119,14 @@ unsigned short config_frames[4] = {2,9,11,13}; // In lte-enb.c extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); -extern void init_eNB(eNB_func_t); +extern void init_eNB(eNB_func_t,int); extern void stop_eNB(void); extern void kill_eNB_proc(void); // In lte-ue.c extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); extern void fill_ue_band_info(void); -extern void init_UE(void); +extern void init_UE(int); #ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) @@ -284,9 +284,6 @@ eth_params_t *eth_params; openair0_config_t openair0_cfg[MAX_CARDS]; -// Change to openair_global to handle UE -openair0_device openair0; - double cpuf; char uecap_xer[1024],uecap_xer_in=0; @@ -1677,40 +1674,15 @@ int main( int argc, char **argv ) } } } - /* device host type is set*/ - openair0.host_type = BBU_HOST; - /* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */ - openair0.type = NONE_DEV; - /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ - openair0.transp_type = NONE_TP; - - // Legacy BBU - RRH init - //int returns=-1; - ///* BBU can have either a local or a remote radio head */ - //if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active - load library of radio head and initiate it - //if (mode!=loop_through_memory) { - //returns=openair0_device_load(&openair0, &openair0_cfg[0]); - //printf("openair0_device_init returns %d\n",returns); - //if (returns<0) { - //printf("Exiting, cannot initialize device\n"); - //exit(-1); - //} - //} - //else if (mode==loop_through_memory) { - //} - //} else { //remote radio head active - load library of transport protocol and initiate it - //if (mode!=loop_through_memory) { - //returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params); - //printf("openair0_transport_init returns %d\n",returns); - //if (returns<0) { - //printf("Exiting, cannot initialize transport protocol\n"); - //exit(-1); - //} - //} - //else if (mode==loop_through_memory) { - //} - //} - + else { + /* device host type is set*/ + PHY_vars_UE_g[0][0]->rfdevice.host_type = BBU_HOST; + /* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */ + PHY_vars_UE_g[0][0]->rfdevice.type = NONE_DEV; + /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ + PHY_vars_UE_g[0][0]->rfdevice.transp_type = NONE_TP; + } + int returns=-1; // Handle spatially distributed MIMO antenna ports @@ -1720,7 +1692,7 @@ int main( int argc, char **argv ) if (mode!=loop_through_memory) { returns= (UE_flag == 0) ? openair0_device_load(&(PHY_vars_eNB_g[0][CC_id]->rfdevice), &openair0_cfg[0]) : - openair0_device_load(&openair0, &openair0_cfg[0]); + openair0_device_load(&(PHY_vars_UE_g[0][CC_id]->rfdevice), &openair0_cfg[0]); printf("openair0_device_init returns %d for CC_id %d\n",returns,CC_id); if (returns<0) { @@ -1904,8 +1876,8 @@ int main( int argc, char **argv ) // start the main thread - if (UE_flag == 1) init_UE(); - else init_eNB(node_function); + if (UE_flag == 1) init_UE(1); + else init_eNB(node_function,1); // Sleep to allow all threads to setup sleep(3); @@ -1978,16 +1950,18 @@ int main( int argc, char **argv ) pthread_mutex_destroy(&sync_mutex); // *** Handle per CC_id openair0 - if (UE_flag==1) - openair0.trx_end_func(&openair0); - - for(CC_id=0; CC_idrfdevice.trx_end_func) - PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice); - if (PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func) - PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice); + if (UE_flag==1) { + if (PHY_vars_UE_g[0][0]->rfdevice.trx_end_func) + PHY_vars_UE_g[0][0]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][0]->rfdevice); + } + else { + for(CC_id=0; CC_idrfdevice.trx_end_func) + PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice); + if (PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func) + PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice); + } } - if (ouput_vcd) VCD_SIGNAL_DUMPER_CLOSE(); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 4fa06f1bc8..73e9197588 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -92,9 +92,9 @@ typedef enum { si=2 } sync_mode_t; -void init_UE_threads(void); +void init_UE_threads(int nb_inst); void *UE_thread(void *arg); -void init_UE(void); +void init_UE(int nb_inst); extern pthread_cond_t sync_cond; extern pthread_mutex_t sync_mutex; @@ -105,8 +105,6 @@ extern openair0_config_t openair0_cfg[MAX_CARDS]; extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; extern openair0_rf_map rf_map[MAX_NUM_CCs]; - -extern openair0_device openair0; extern int oai_exit; extern int32_t **rxdata; @@ -176,21 +174,26 @@ pthread_t main_ue_thread; pthread_attr_t attr_UE_thread; struct sched_param sched_param_UE_thread; -void init_UE() { +void init_UE(int nb_inst) { int error_code; - - printf("Intializing UE Threads ...\n"); - init_UE_threads(); - sleep(1); - error_code = pthread_create(&main_ue_thread, &attr_UE_thread, UE_thread, NULL); - - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code); - return; - } else { - LOG_D( HW, "[lte-softmodem.c] Allocate UE_thread successful\n" ); - pthread_setname_np( main_ue_thread, "main UE" ); + int inst; + PHY_VARS_UE *UE; + + for (inst=0;instproc.pthread_ue, &UE->proc.attr_ue, UE_thread, NULL); + + if (error_code!= 0) { + LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code); + return; + } else { + LOG_D(HW, "[lte-softmodem.c] Allocate UE_thread successful\n" ); + pthread_setname_np( UE->proc.pthread_ue, "main UE" ); + } } printf("UE threads created\n"); @@ -362,7 +365,7 @@ static void *UE_thread_synch(void *arg) } - if (openair0.trx_start_func(&openair0) != 0 ) { + if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { LOG_E(HW,"Could not start the device\n"); oai_exit=1; } @@ -484,12 +487,12 @@ static void *UE_thread_synch(void *arg) break; } - //openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); - //openair0.trx_set_gains_func(&openair0,&openair0_cfg[0]); - openair0.trx_stop_func(&openair0); + //UE->rfdevice.trx_set_freq_func(&openair0,&openair0_cfg[0],0); + //UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]); + UE->rfdevice.trx_stop_func(&UE->rfdevice); sleep(1); init_frame_parms(&UE->frame_parms,1); - if (openair0.trx_start_func(&openair0) != 0 ) { + if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { LOG_E(HW,"Could not start the device\n"); oai_exit=1; } @@ -568,7 +571,7 @@ static void *UE_thread_synch(void *arg) } } - // openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); + // UE->rfdevice.trx_set_freq_func(&openair0,&openair0_cfg[0],0); if (UE->UE_scan_carrier==1) { for (i=0;iinstance_cnt_tx=-1; - -#ifdef DEADLINE_SCHEDULER - - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - // This creates a 1ms reservation every 10ms period - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = 900000; // each tx thread requires .5ms to finish its job - attr.sched_deadline = 1000000; // each tx thread will finish within 1ms - attr.sched_period = 1000000; // each tx thread has a period of 1ms from the starting point - - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] UE_thread_tx thread: sched_setattr failed\n"); - return &UE_thread_tx_retval; - } - -#else - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - // Set affinity mask to include CPUs 1 to MAX_CPUS - // CPU 0 is reserved for UHD threads - CPU_ZERO(&cpuset); - - #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } -#endif - - // Check the actual affinity mask assigned to the thread - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity, 0 , sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - LOG_I( HW, "[SCHED][UE] Started UE thread TX on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); - - -#endif - - printf("waiting for sync (UE_thread_tx)\n"); - - pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_thread_tx)\n"); - - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - - pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex, waiting (UE_thread_tx)\n"); - - printf("Starting UE TX thread\n"); - - // Lock memory from swapping. This is a process wide call (not constraint to this thread). - mlockall(MCL_CURRENT | MCL_FUTURE); - - while (!oai_exit) { - - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX\n" ); - exit_fun("nothing to add"); - return &UE_thread_tx_retval; - } - - while (UE->instance_cnt_tx < 0) { - // most of the time, the thread is waiting here - pthread_cond_wait( &UE->cond_tx, &UE->mutex_tx ); - } - - if (pthread_mutex_unlock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX\n" ); - exit_fun("nothing to add"); - return &UE_thread_tx_retval; - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_TX, 1 ); - - if ((subframe_select( &UE->frame_parms, UE->slot_tx>>1 ) == SF_UL) || - (UE->frame_parms.frame_type == FDD)) { - phy_procedures_UE_TX( UE, 0, 0, UE->mode, no_relay ); - } - - if ((subframe_select( &UE->frame_parms, UE->slot_tx>>1 ) == SF_S) && - ((UE->slot_tx&1) == 1)) { - phy_procedures_UE_S_TX( UE, 0, 0, no_relay ); - } - - UE->slot_tx += 2; - - if (UE->slot_tx >= 20) { - UE->slot_tx -= 20; - UE->frame_tx++; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_UE, UE->frame_tx ); - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_UE, UE->slot_tx>>1 ); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_TX, 0 ); - - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_tx_retval; - } - - UE->instance_cnt_tx--; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, UE->instance_cnt_tx); - - if (pthread_mutex_unlock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_tx_retval; - } - - } - - return &UE_thread_tx_retval; -} -*/ /*! @@ -804,7 +621,7 @@ static void *UE_thread_tx(void *arg) static void *UE_thread_rxn_txnp4(void *arg) { - static int UE_thread_rx_retval; + static int UE_thread_rxtx_retval; UE_rxtx_proc_t *proc = (UE_rxtx_proc_t *)arg; int ret; PHY_VARS_UE *UE=PHY_vars_UE_g[0][proc->CC_id]; @@ -828,8 +645,8 @@ static void *UE_thread_rxn_txnp4(void *arg) attr.sched_period = 1000000; // each rx thread has a period of 1ms from the starting point if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] UE_thread_rx : sched_setattr failed\n"); - return &UE_thread_rx_retval; + perror("[SCHED] UE_thread_rxtx : sched_setattr failed\n"); + return &UE_thread_rxtx_retval; } #else @@ -914,15 +731,15 @@ static void *UE_thread_rxn_txnp4(void *arg) pthread_cond_wait(&sync_cond, &sync_mutex); pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex, waiting (UE_thread_rx)\n"); + printf("unlocked sync_mutex, waiting (UE_thread_rxtx)\n"); printf("Starting UE RXN_TXNP4 thread\n"); while (!oai_exit) { if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" ); + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" ); exit_fun("nothing to add"); - return &UE_thread_rx_retval; + return &UE_thread_rxtx_retval; } while (proc->instance_cnt_rxtx < 0) { @@ -933,7 +750,7 @@ static void *UE_thread_rxn_txnp4(void *arg) if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXn_TXnp4\n" ); exit_fun("nothing to add"); - return &UE_thread_rx_retval; + return &UE_thread_rxtx_retval; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX0+(proc->subframe_rx&1), 1 ); @@ -976,23 +793,23 @@ static void *UE_thread_rxn_txnp4(void *arg) if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" ); + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" ); exit_fun("noting to add"); - return &UE_thread_rx_retval; + return &UE_thread_rxtx_retval; } proc->instance_cnt_rxtx--; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, proc->instance_cnt_rxtx); if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" ); + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXTX\n" ); exit_fun("noting to add"); - return &UE_thread_rx_retval; + return &UE_thread_rxtx_retval; } } // thread finished - return &UE_thread_rx_retval; + return &UE_thread_rxtx_retval; } @@ -1105,11 +922,11 @@ void *UE_thread(void *arg) { rxp[i] = (void*)&rxdata[i][0]; if (UE->mode != loop_through_memory) { - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - UE->frame_parms.samples_per_tti*10, - UE->frame_parms.nb_antennas_rx); + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti*10, + UE->frame_parms.nb_antennas_rx); } instance_cnt_synch = ++UE->proc.instance_cnt_synch; if (instance_cnt_synch == 0) { @@ -1132,11 +949,11 @@ void *UE_thread(void *arg) { rxp[i] = (void*)&dummy_rx[i][0]; for (int sf=0;sf<10;sf++) { // printf("Reading dummy sf %d\n",sf); - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - UE->frame_parms.samples_per_tti, - UE->frame_parms.nb_antennas_rx); + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti, + UE->frame_parms.nb_antennas_rx); } } } @@ -1147,11 +964,11 @@ void *UE_thread(void *arg) { start_rx_stream=1; if (UE->mode != loop_through_memory) { LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); - rxs = openair0.trx_read_func(&openair0, - ×tamp, - (void**)rxdata, - UE->rx_offset, - UE->frame_parms.nb_antennas_rx); + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + (void**)rxdata, + UE->rx_offset, + UE->frame_parms.nb_antennas_rx); if (rxs != UE->rx_offset) { exit_fun("problem in rx"); return &UE_thread_retval; @@ -1161,11 +978,11 @@ void *UE_thread(void *arg) { UE->proc.proc_rxtx[1].frame_rx++; // read in first symbol - rxs = openair0.trx_read_func(&openair0, - ×tamp, - (void**)rxdata, - UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, - UE->frame_parms.nb_antennas_rx); + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + (void**)rxdata, + UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, + UE->frame_parms.nb_antennas_rx); slot_fep(UE, 0, 0, @@ -1192,21 +1009,21 @@ void *UE_thread(void *arg) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); if (UE->mode != loop_through_memory) { if (sf<9) { - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - UE->frame_parms.samples_per_tti, - UE->frame_parms.nb_antennas_rx); + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti, + UE->frame_parms.nb_antennas_rx); } else { - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, - UE->frame_parms.nb_antennas_rx); + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, + UE->frame_parms.nb_antennas_rx); // read in first symbol of next frame and adjust for timing drift - rxs = openair0.trx_read_func(&openair0, + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp1, (void**)rxdata, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, @@ -1383,7 +1200,7 @@ void *UE_thread_old(void *arg) if (UE->mode != loop_through_memory) { - rxs = openair0.trx_read_func(&openair0, + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, rxp, spp - ((first_rx==1) ? rx_off_diff : 0), @@ -1413,7 +1230,7 @@ void *UE_thread_old(void *arg) for (int i=0; iframe_parms.nb_antennas_tx; i++) txp[i] = (void*)&txdata[i][txpos]; - openair0.trx_write_func(&openair0, + UE->rfdevice.trx_write_func(&openair0, (timestamp+openair0_cfg[0].tx_scheduling_advance-openair0_cfg[0].tx_sample_advance), txp, spp - ((first_rx==1) ? rx_off_diff : 0), @@ -1612,7 +1429,7 @@ void *UE_thread_old(void *arg) #ifndef USRP_DEBUG if (UE->mode != loop_through_memory) { LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); - rxs = openair0.trx_read_func(&openair0, + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, (void**)rxdata, UE->rx_offset, @@ -1673,16 +1490,18 @@ void *UE_thread_old(void *arg) * - UE_thread_synch * and the locking between them. */ -void init_UE_threads(void) +void init_UE_threads(int inst) { - PHY_VARS_UE *UE = PHY_vars_UE_g[0][0]; - - pthread_attr_init (&attr_UE_thread); - pthread_attr_setstacksize(&attr_UE_thread,8192);//5*PTHREAD_STACK_MIN); + PHY_VARS_UE *UE; + + UE = PHY_vars_UE_g[inst][0]; + pthread_attr_init (&UE->proc.attr_ue); + pthread_attr_setstacksize(&UE->proc.attr_ue,8192);//5*PTHREAD_STACK_MIN); + #ifndef LOWLATENCY - sched_param_UE_thread.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_setschedparam(&attr_UE_thread,&sched_param_UE_thread); + UE->proc.sched_param_ue.sched_priority = sched_get_priority_max(SCHED_FIFO); + pthread_attr_setschedparam(&UE->proc.attr_ue,&sched_param_UE_thread); #endif // the threads are not yet active, therefore access is allowed without locking diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 2472328c76..f59c7d7f54 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -61,22 +61,15 @@ #include "LAYER2/MAC/proto.h" #include "LAYER2/MAC/vars.h" #include "pdcp.h" -#ifndef CELLULAR #include "RRC/LITE/vars.h" -#endif -#include "PHY_INTERFACE/vars.h" -//#endif #include "RRC/NAS/nas_config.h" -#ifdef IFFT_FPGA -//#include "PHY/LTE_REFSIG/mod_table.h" -#endif //IFFT_FPGA #include "SCHED/defs.h" #include "SCHED/vars.h" -//#ifdef XFORMS + #include "PHY/TOOLS/lte_phy_scope.h" -//#endif + #ifdef SMBV // Rohde&Schwarz SMBV100A vector signal generator @@ -143,6 +136,28 @@ channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs]; //Added for PHY abstraction node_desc_t *enb_data[NUMBER_OF_eNB_MAX]; node_desc_t *ue_data[NUMBER_OF_UE_MAX]; + +pthread_cond_t sync_cond; +pthread_mutex_t sync_mutex; +int sync_var; + + +openair0_config_t openair0_cfg[MAX_CARDS]; +uint32_t downlink_frequency[MAX_NUM_CCs][4]; +int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; +openair0_rf_map rf_map[MAX_NUM_CCs]; + +#if defined(ENABLE_ITTI) +volatile int start_eNB = 0; +volatile int start_UE = 0; +#endif +volatile int oai_exit = 0; + + +//int32_t **rxdata; +//int32_t **txdata; + + // Added for PHY abstraction extern node_list* ue_node_list; extern node_list* enb_node_list; @@ -164,6 +179,9 @@ extern uint16_t Nid_cell; extern LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; +extern Enb_properties_array_t enb_properties; + + //#ifdef XFORMS int otg_enabled; int xforms=0; @@ -728,23 +746,32 @@ l2l1_task (void *args_p) #endif CC_id=0; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc.frame_rx = frame; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc.subframe_rx = sf; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1].frame_rx = frame; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1].subframe_rx = sf; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1].subframe_tx = (sf+4)%10; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1].frame_tx = (sf<6) ? frame : frame+1; - phy_procedures_eNB_common_RX(PHY_vars_eNB_g[eNB_inst][CC_id], - abstraction_flag); - phy_procedures_eNB_uespec_RX(PHY_vars_eNB_g[eNB_inst][CC_id], - &PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1], - abstraction_flag, - no_relay); - phy_procedures_eNB_TX(PHY_vars_eNB_g[eNB_inst][CC_id], - &PHY_vars_eNB_g[eNB_inst][CC_id]->proc.proc_rxtx[sf&1], - 0,no_relay,NULL); + // trigger synch event to RAN FH thread for CC_id + eNB_proc_t *proc = &PHY_vars_eNB_g[eNB_inst][CC_id]->proc; + if (pthread_mutex_lock(&proc->mutex_FH) != 0) { + LOG_E( PHY, "error locking mutex for FH\n"); + exit_fun( "error locking mutex" ); + break; + } + int cnt_FH = ++proc->instance_cnt_FH; + proc->frame_rx = frame; + proc->subframe_rx = sf; + proc->timestamp_rx += PHY_vars_eNB_g[eNB_inst][CC_id]->frame_parms.samples_per_tti; + + if (proc->instance_cnt_FH == 0) { + if (pthread_cond_signal(&proc->cond_FH) != 0) { + LOG_E(PHY,"ERROR pthread_cond_signal for eNB FH CCid %d\n",proc->CC_id); + exit_fun("ERROR pthread_cond_signal"); + break; + } + } + else { + LOG_W(PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_FH %d)\n",proc->instance_cnt_FH); + exit_fun("FH thread busy"); + break; + } #ifdef PRINT_STATS if((sf==9) && frame%10==0) @@ -780,109 +807,9 @@ l2l1_task (void *args_p) log_set_instance_type (LOG_INSTANCE_UE); #endif + /* clear_UE_transport_info (oai_emulation.info.nb_ue_local); - for (UE_inst = oai_emulation.info.first_ue_local; - (UE_inst < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local)); - UE_inst++) { - if (oai_emulation.info.cli_start_ue[UE_inst] != 0) { -#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) - -#else - - if (frame >= (UE_inst * 20)) // activate UE only after 20*UE_id frames so that different UEs turn on separately -#endif - { // UE_PROCEDURES - LOG_D(EMU, - "PHY procedures UE %d for frame %d, subframe %d\n", - UE_inst, frame % MAX_FRAME_NUMBER, sf); - - if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] - != NOT_SYNCHED) { - if (frame > 0) { - PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1].frame_rx = frame % MAX_FRAME_NUMBER; - PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1].subframe_rx = sf; - PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1].frame_tx = ((sf<6) ? frame : frame+1)% MAX_FRAME_NUMBER; - PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1].subframe_tx = (sf+4)%10; - -#ifdef OPENAIR2 - //Application - update_otg_UE (UE_inst, oai_emulation.info.time_ms); - - //Access layer - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE_inst, 0, ENB_FLAG_NO, NOT_A_RNTI, frame % MAX_FRAME_NUMBER, sf); - pdcp_run (&ctxt); -#endif - - for (CC_id = 0; CC_id < MAX_NUM_CCs; - CC_id++) { - phy_procedures_UE_RX(PHY_vars_UE_g[UE_inst][CC_id], - &PHY_vars_UE_g[UE_inst][CC_id]->proc.proc_rxtx[sf&1], - 0, abstraction_flag, - normal_txrx, no_relay, - NULL); - phy_procedures_UE_TX(PHY_vars_UE_g[UE_inst][CC_id], - &PHY_vars_UE_g[UE_inst][CC_id]->proc.proc_rxtx[sf&1], - 0, - abstraction_flag, - normal_txrx, - no_relay); - } - - ue_data[UE_inst]->tx_power_dBm = - PHY_vars_UE_g[UE_inst][0]->tx_power_dBm; - } - } else { - if (abstraction_flag == 1) { - LOG_E(EMU, - "sync not supported in abstraction mode (UE%d,mode%d)\n", - UE_inst, - PHY_vars_UE_g[UE_inst][0]->UE_mode[0]); - exit (-1); - } - - if ((frame > 0) - && (sf==9)){ - - initial_sync (PHY_vars_UE_g[UE_inst][0], - normal_txrx); - - /* - write_output("dlchan00.m","dlch00",&(PHY_vars_UE_g[0]->common_vars.dl_ch_estimates[0][0][0]),(6*(PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size)),1,1); - if (PHY_vars_UE_g[0]->frame_parms.nb_antennas_rx>1) - write_output("dlchan01.m","dlch01",&(PHY_vars_UE_g[0]->common_vars.dl_ch_estimates[0][1][0]),(6*(PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size)),1,1); - write_output("dlchan10.m","dlch10",&(PHY_vars_UE_g[0]->common_vars.dl_ch_estimates[0][2][0]),(6*(PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size)),1,1); - if (PHY_vars_UE_g[0]->frame_parms.nb_antennas_rx>1) - write_output("dlchan11.m","dlch11",&(PHY_vars_UE_g[0]->common_vars.dl_ch_estimates[0][3][0]),(6*(PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size)),1,1); - write_output("rxsig.m","rxs",PHY_vars_UE_g[0]->common_vars.rxdata[0],PHY_vars_UE_g[0]->frame_parms.samples_per_tti*10,1,1); - write_output("rxsigF.m","rxsF",PHY_vars_UE_g[0]->common_vars.rxdataF[0],2*PHY_vars_UE_g[0]->frame_parms.symbols_per_tti*PHY_vars_UE_g[0]->frame_parms.ofdm_symbol_size,2,1); - write_output("pbch_rxF_ext0.m","pbch_ext0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_ext[0],6*12*4,1,1); - write_output("pbch_rxF_comp0.m","pbch_comp0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0],6*12*4,1,1); - write_output("pbch_rxF_llr.m","pbch_llr",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); - */ - } - } - -#ifdef PRINT_STATS - - if((sf==1) && frame%10==0) { - if (UE_stats_th[UE_inst]) { - fprintf(UE_stats_th[UE_inst],"%d %d\n",frame % MAX_FRAME_NUMBER, PHY_vars_UE_g[UE_inst][0]->bitrate[0]/1000); - } - } - - if (UE_stats[UE_inst]) { - len = dump_ue_stats (PHY_vars_UE_g[UE_inst][0], &PHY_vars_UE_g[UE_inst][0]->proc.proc_rxtx[sf&1],stats_buffer, 0, normal_txrx, 0); - rewind (UE_stats[UE_inst]); - fwrite (stats_buffer, 1, len, UE_stats[UE_inst]); - fflush(UE_stats[UE_inst]); - } - -#endif - } // UE_PROCEDURES - } - } // UE_inst - emu_transport (frame % MAX_FRAME_NUMBER, sf<<1, ((sf+4)%10)<<1, subframe_select(&PHY_vars_eNB_g[0][0]->frame_parms,sf), oai_emulation.info.frame_type[0], ethernet_flag); @@ -942,6 +869,7 @@ l2l1_task (void *args_p) stop_meas (&ul_chan_stats); + */ if ((sf == 0) && ((frame % MAX_FRAME_NUMBER) == 0) && (abstraction_flag == 0) && (oai_emulation.info.n_frames == 1)) { @@ -1200,7 +1128,7 @@ main (int argc, char **argv) // oai performance profiler is enabled if (oai_emulation.info.opp_enabled == 1) - reset_opp_meas (); + reset_opp_meas_oaisim (); init_time (); @@ -1242,7 +1170,7 @@ main (int argc, char **argv) } void -reset_opp_meas (void) +reset_opp_meas_oaisim (void) { uint8_t eNB_id = 0, UE_id = 0; @@ -1383,7 +1311,7 @@ reset_opp_meas (void) } void -print_opp_meas (void) +print_opp_meas_oaisim (void) { uint8_t eNB_id = 0, UE_id = 0; @@ -1687,7 +1615,7 @@ oai_shutdown (void) kpi_gen (); } if (oai_emulation.info.opp_enabled == 1) - print_opp_meas (); + print_opp_meas_oaisim (); // relase all rx state if (ethernet_flag == 1) { diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 867d578ce9..c8f42dfdd8 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -772,12 +772,13 @@ void get_simulation_options(int argc, char *argv[]) AssertFatal (oai_emulation.info.nb_enb_local <= enb_properties->number, "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!", conf_config_file_name, oai_emulation.info.nb_enb_local, enb_properties->number); - + /* Update some simulation parameters */ oai_emulation.info.frame_type[0] = enb_properties->properties[0]->frame_type[0]; oai_emulation.info.tdd_config[0] = enb_properties->properties[0]->tdd_config[0]; oai_emulation.info.tdd_config_S[0] = enb_properties->properties[0]->tdd_config_s[0]; oai_emulation.info.extended_prefix_flag[0] = enb_properties->properties[0]->prefix_type[0]; + } free(conf_config_file_name); @@ -1016,23 +1017,26 @@ void init_openair1(void) } else { PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 0; } - } - } + } // eNB_id + } // CC_id - for (eNB_id=0; eNB_idmac_enabled=0; else PHY_vars_eNB_g[eNB_id][CC_id]->mac_enabled=1; } + } + + init_eNB(eNodeB_3GPP,NB_eNB_INST); // init_ue_status(); - for (UE_id=0; UE_idtx_power_max_dBm=23; - + PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB=100; // update UE_mode for each eNB_id not just 0 @@ -1065,8 +1069,10 @@ void init_openair1(void) #endif + } // CC_id + } // UE_id + init_UE(NB_UE_INST); } -} void init_openair2(void) { From e0f0072023d8f17a4320adaa4531d8cf54104e45 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 24 Jul 2016 01:21:35 -0700 Subject: [PATCH 127/340] oaisim with interfaces for lte-ue/lte-enb threading compiles and runs. --- openair2/ENB_APP/enb_config.c | 5 +- openair2/UTIL/OCG/OCG.h | 5 +- targets/ARCH/COMMON/common_lib.h | 3 + ...enb.band7.generic.oaisim.local_no_mme.conf | 7 +- targets/RT/USER/lte-enb.c | 224 ++++---- targets/RT/USER/lte-softmodem.c | 8 +- targets/SIMU/USER/channel_sim.c | 535 ++++++++---------- targets/SIMU/USER/oaisim.c | 4 +- targets/SIMU/USER/oaisim.h | 10 +- targets/SIMU/USER/oaisim_functions.c | 133 ++++- 10 files changed, 508 insertions(+), 426 deletions(-) diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 35d02f8842..cecdf623ef 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -59,6 +59,7 @@ #include "sctp_default_values.h" #include "SystemInformationBlockType2.h" #include "LAYER2/MAC/extern.h" +#include "PHY/extern.h" #define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" @@ -321,8 +322,8 @@ void enb_config_display(void) for (j=0; j< enb_properties.properties[i]->nb_cc; j++) { // CC_ID node function/timing - printf( "\n\tnode_function for CC %d: \t%d:\n",j,enb_properties.properties[i]->cc_node_function[j]); - printf( "\tnode_timing for CC %d: \t%d:\n",j,enb_properties.properties[i]->cc_node_timing[j]); + printf( "\n\tnode_function for CC %d: \t%s:\n",j,eNB_functions[enb_properties.properties[i]->cc_node_function[j]]); + printf( "\tnode_timing for CC %d: \t%s:\n",j,eNB_timing[enb_properties.properties[i]->cc_node_timing[j]]); printf( "\tnode_synch_ref for CC %d: \t%d:\n",j,enb_properties.properties[i]->cc_node_synch_ref[j]); printf( "\teutra band for CC %d: \t%"PRId16":\n",j,enb_properties.properties[i]->eutra_band[j]); diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h index c47cc8e8c7..55b55c7e5f 100644 --- a/openair2/UTIL/OCG/OCG.h +++ b/openair2/UTIL/OCG/OCG.h @@ -44,6 +44,7 @@ #ifndef __OCG_H__ #define __OCG_H__ +#include "PHY/defs.h" #include "PHY/impl_defs_top.h" #include "platform_types.h" @@ -707,8 +708,8 @@ typedef struct { // phy related params unsigned int n_frames; unsigned int n_frames_flag; // if set, then let the emulation goes to infinity - node_function_t node_function[MAX_NUM_CCs]; - node_timing_t node_timing[MAX_NUM_CCS]; + eNB_func_t node_function[MAX_NUM_CCs]; + eNB_timing_t node_timing[MAX_NUM_CCs]; unsigned char frame_type[MAX_NUM_CCs]; //! LTE frame type (TDD=1, FDD=0). \note this should be converted to \ref lte_frame_type_t (header file reorganization needed) char * frame_type_name[MAX_NUM_CCs]; unsigned char tdd_config[MAX_NUM_CCs]; diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 70f098217a..17d1f7b180 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -248,6 +248,9 @@ typedef struct { struct openair0_device_t { /*!brief Module ID of this device */ int Mod_id; + + /*!brief Component Carrier ID of this device */ + int CC_id; /*!brief Type of this device */ dev_type_t type; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf index 3ec8ea01da..ad3bcfcf92 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf @@ -24,7 +24,8 @@ eNBs = component_carriers = ( { node_function = "eNodeB_3GPP"; - node_timing = "SYNCH_TO_OTHER"; + node_timing = "synch_to_other"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -37,8 +38,8 @@ eNBs = Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; - tx_gain = 25; - rx_gain = 20; + tx_gain = 25; + rx_gain = 20; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 2ec507e4c3..177291596b 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -157,8 +157,8 @@ static struct { void exit_fun(const char* s); -void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[]); -void stop_eNB(void); +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst); +void stop_eNB(int nb_inst); void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { @@ -647,6 +647,8 @@ static void* eNB_thread_asynch_rx( void* param ) { uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; int prach_rx; + int dummy_rx[fp->nb_antennas_rx][fp->samples_per_tti]; + int rxs; #ifdef DEADLINE_SCHEDULER struct sched_attr attr; @@ -739,7 +741,34 @@ static void* eNB_thread_asynch_rx( void* param ) { #endif // DEADLINE_SCHEDULER - if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF + + mlockall(MCL_CURRENT | MCL_FUTURE); + + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe + printf( "waiting for sync (eNB_thread_asynch_rx)\n"); + pthread_mutex_lock( &sync_mutex ); + + while (sync_var<0) + pthread_cond_wait( &sync_cond, &sync_mutex ); + + pthread_mutex_unlock(&sync_mutex); + + printf( "got sync (eNB_thread_asynch_rx)\n" ); + + if (eNB->node_function == eNodeB_3GPP) { // acquisition from RF + + if (eNB->rfdevice.trx_read_func) + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &proc->timestamp_rx, + (void**)dummy_rx, + fp->samples_per_tti, + fp->nb_antennas_rx); + else { + printf("eNB asynch RX\n"); + sleep(1); + } + } + else if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF /// **** recv_IF5 of rxdata from RRH **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); recv_IF5(eNB, ×tamp_rx, subframe_rx++, IF5_RRH_GW_UL); @@ -938,7 +967,7 @@ static void* eNB_thread_FH( void* param ) { pthread_mutex_unlock(&sync_mutex); - printf( "got sync (eNB_thread)\n" ); + printf( "got sync (eNB_thread FH)\n" ); #if defined(ENABLE_ITTI) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); @@ -1394,108 +1423,106 @@ static void* eNB_thread_prach( void* param ) { } -void init_eNB_proc(int nb_inst) { +void init_eNB_proc(int inst) { int i; int CC_id; PHY_VARS_eNB *eNB; eNB_proc_t *proc; eNB_rxtx_proc_t *proc_rxtx; - int inst; - - for (inst = 0; inst < nb_inst; inst++) { - for (CC_id=0; CC_idnode_function],eNB_timing[eNB->node_timing]); - proc = &eNB->proc; - proc_rxtx = proc->proc_rxtx; + + for (CC_id=0; CC_idnode_function],eNB_timing[eNB->node_timing]); + proc = &eNB->proc; + proc_rxtx = proc->proc_rxtx; #ifndef DEADLINE_SCHEDULER - /* - pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] ); - if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0) - perror("[ENB_PROC_TX] setting thread stack size failed\n"); - - pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] ); - if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0) - perror("[ENB_PROC_RX] setting thread stack size failed\n"); - */ - // set the kernel scheduling policy and priority - proc_rxtx[0].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc_rxtx[0].attr_rxtx, &proc_rxtx[0].sched_param_rxtx); - pthread_attr_setschedpolicy (&proc_rxtx[0].attr_rxtx, SCHED_FIFO); - proc_rxtx[1].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc_rxtx[1].attr_rxtx, &proc_rxtx[1].sched_param_rxtx); - pthread_attr_setschedpolicy (&proc_rxtx[1].attr_rxtx, SCHED_FIFO); - - proc->sched_param_FH.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_FH, &proc->sched_param_FH); - pthread_attr_setschedpolicy (&proc->attr_FH, SCHED_FIFO); - - proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); - pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO); - - printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); -#endif - proc_rxtx[0].instance_cnt_rxtx = -1; - proc_rxtx[1].instance_cnt_rxtx = -1; - proc->instance_cnt_prach = -1; - proc->instance_cnt_FH = -1; - proc->CC_id = CC_id; - - proc->first_rx=4; - - pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); - pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); - pthread_mutex_init( &proc->mutex_prach, NULL); - pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); - pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); - pthread_cond_init( &proc->cond_prach, NULL); - pthread_cond_init( &proc->cond_FH, NULL); -#ifndef DEADLINE_SCHEDULER - pthread_create( &proc_rxtx[0].pthread_rxtx, &proc_rxtx[0].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[0] ); - pthread_create( &proc_rxtx[1].pthread_rxtx, &proc_rxtx[1].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[1] ); - pthread_create( &proc->pthread_FH, &proc->attr_FH, eNB_thread_FH, &eNB->proc ); - pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); - if (eNB->node_timing == synch_to_other) - pthread_create( &proc->pthread_asynch_rx, &proc->attr_asynch_rx, eNB_thread_asynch_rx, &eNB->proc ); -#else - pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); - pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); - pthread_create( &proc->pthread_FH, NULL, eNB_thread_FH, &eNB->proc ); - pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); - if (eNB->node_timing == synch_to_other) - pthread_create( &proc->pthread_asynch_rx, NULL, eNB_thread_asynch_rx, &eNB->proc ); - -#endif - char name[16]; - snprintf( name, sizeof(name), "RXTX0 %d", i ); - pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); - snprintf( name, sizeof(name), "RXTX1 %d", i ); - pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); - snprintf( name, sizeof(name), "FH %d", i ); - pthread_setname_np( proc->pthread_FH, name ); - } + /* + pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] ); + if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0) + perror("[ENB_PROC_TX] setting thread stack size failed\n"); + + pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] ); + if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0) + perror("[ENB_PROC_RX] setting thread stack size failed\n"); + */ + // set the kernel scheduling policy and priority + proc_rxtx[0].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc_rxtx[0].attr_rxtx, &proc_rxtx[0].sched_param_rxtx); + pthread_attr_setschedpolicy (&proc_rxtx[0].attr_rxtx, SCHED_FIFO); + proc_rxtx[1].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc_rxtx[1].attr_rxtx, &proc_rxtx[1].sched_param_rxtx); + pthread_attr_setschedpolicy (&proc_rxtx[1].attr_rxtx, SCHED_FIFO); - /* setup PHY proc TX sync mechanism */ - pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); - pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL); - sync_phy_proc.phy_proc_CC_id = 0; + proc->sched_param_FH.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_FH, &proc->sched_param_FH); + pthread_attr_setschedpolicy (&proc->attr_FH, SCHED_FIFO); + + proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; + pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); + pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO); + + printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); +#endif + proc_rxtx[0].instance_cnt_rxtx = -1; + proc_rxtx[1].instance_cnt_rxtx = -1; + proc->instance_cnt_prach = -1; + proc->instance_cnt_FH = -1; + proc->CC_id = CC_id; + + proc->first_rx=4; + + pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); + pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); + pthread_mutex_init( &proc->mutex_prach, NULL); + pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); + pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); + pthread_cond_init( &proc->cond_prach, NULL); + pthread_cond_init( &proc->cond_FH, NULL); +#ifndef DEADLINE_SCHEDULER + pthread_create( &proc_rxtx[0].pthread_rxtx, &proc_rxtx[0].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, &proc_rxtx[1].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[1] ); + pthread_create( &proc->pthread_FH, &proc->attr_FH, eNB_thread_FH, &eNB->proc ); + pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); + if (eNB->node_timing == synch_to_other) + pthread_create( &proc->pthread_asynch_rx, &proc->attr_asynch_rx, eNB_thread_asynch_rx, &eNB->proc ); +#else + pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); + pthread_create( &proc->pthread_FH, NULL, eNB_thread_FH, &eNB->proc ); + pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); + if (eNB->node_timing == synch_to_other) + pthread_create( &proc->pthread_asynch_rx, NULL, eNB_thread_asynch_rx, &eNB->proc ); + +#endif + char name[16]; + snprintf( name, sizeof(name), "RXTX0 %d", i ); + pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); + snprintf( name, sizeof(name), "RXTX1 %d", i ); + pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); + snprintf( name, sizeof(name), "FH %d", i ); + pthread_setname_np( proc->pthread_FH, name ); } + + /* setup PHY proc TX sync mechanism */ + pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); + pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL); + sync_phy_proc.phy_proc_CC_id = 0; } + /*! * \brief Terminate eNB TX and RX threads. */ -void kill_eNB_proc(void) { +void kill_eNB_proc(int inst) { int *status; PHY_VARS_eNB *eNB; eNB_proc_t *proc; eNB_rxtx_proc_t *proc_rxtx; for (int CC_id=0; CC_idproc; proc_rxtx = &proc->proc_rxtx[0]; @@ -1650,16 +1677,21 @@ void print_opp_meas(void) { } -void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[]) { + void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst) { int CC_id; - - for (CC_id=0;CC_idnode_function = node_function[CC_id]; - PHY_vars_eNB_g[0][CC_id]->node_timing = node_timing[CC_id]; - } + int inst; - init_eNB_proc(); + for (inst=0;instnode_function = node_function[CC_id]; + PHY_vars_eNB_g[inst][CC_id]->node_timing = node_timing[CC_id]; + LOG_I(PHY,"Initializing eNB %d CC_id %d : (%s,%s)\n",inst,CC_id,eNB_functions[node_function[CC_id]],eNB_timing[node_timing[CC_id]]); + } + + init_eNB_proc(inst); + } + sleep(1); LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); @@ -1677,7 +1709,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[]) { } -void stop_eNB() { +void stop_eNB(int nb_inst) { /* #ifdef DEBUG_THREADS @@ -1702,6 +1734,8 @@ void stop_eNB() { #endif // DEBUG_THREADS */ - printf("Killing eNB processing threads\n"); - kill_eNB_proc(); + for (int inst=0;instnb_rx; // number of rx antennas at UE uint8_t nb_antennas_tx = eNB2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB - //LTE_DL_FRAME_PARMS *fp; - // int subframe_sched = ((next_slot>>1) == 0) ? 9 : ((next_slot>>1)-1); + double s_re[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + double s_im[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + double r_re0[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + double r_im0[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + - - if (next_slot==0) + if (subframe==0) hold_channel = 0; else hold_channel = 1; @@ -186,19 +192,6 @@ void do_DL_sig(double **r_re0,double **r_im0, } } - /* - if(PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id]>=5) - { - lte_ue_measurements(PHY_vars_UE_g[UE_id], - ((next_slot-1)>>1)*frame_parms->samples_per_tti, - 1, - abstraction_flag); - - PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE_g[UE_id]->PHY_measurements,0); - // printf("pmi_alloc in channel sim: %d",PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc); - } - */ - // calculate the SNR for the attached eNB (this assumes eNB always uses PMI stored in eNB_UE_stats; to be improved) init_snr(eNB2UE[att_eNB_id][UE_id][CC_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB, &PHY_vars_UE_g[UE_id][CC_id]->N0, PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id][CC_id]->UE_stats[UE_id].DL_pmi_single, @@ -214,52 +207,44 @@ void do_DL_sig(double **r_re0,double **r_im0, } else { //abstraction_flag - /* - Call do_OFDM_mod from phy_procedures_eNB_TX function - */ - // printf("r_re[0] %p\n",r_re[0]); - for (aa=0; aasamples_per_tti>>1)*sizeof(double)); - memset((void*)r_im[aa],0,(frame_parms->samples_per_tti>>1)*sizeof(double)); + + pthread_mutex_lock(&eNB_output_mutex[UE_id]); + if (eNB_output_mask[UE_id] == 0) { // This is the first eNodeB for this UE, clear the buffer + + for (aa=0; aasamples_per_tti)*sizeof(double)); + memset((void*)r_im_DL[UE_id][aa],0,(frame_parms->samples_per_tti)*sizeof(double)); + } } + pthread_mutex_unlock(&eNB_output_mutex[UE_id]); - /* - for (i=0;i<16;i++) - printf("%f, %X\n",r_re[aa][i],(unsigned long long)r_re[aa][i]); - */ for (eNB_id=0; eNB_idtx_power_dBm + - // eNB2UE[eNB_id][UE_id]->path_loss_dB) <= -107.0) - // break; - txdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.txdata[0]; - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); - slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1)); - tx_pwr = dac_fixed_gain(s_re, - s_im, + sf_offset = subframe*frame_parms->samples_per_tti; + tx_pwr = dac_fixed_gain((double**)s_re, + (double**)s_im, txdata, - slot_offset, + sf_offset, nb_antennas_tx, - frame_parms->samples_per_tti>>1, - slot_offset_meas, + frame_parms->samples_per_tti, + sf_offset, frame_parms->ofdm_symbol_size, 14, - // enb_data[eNB_id]->tx_power_dBm); frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE frame_parms->N_RB_DL*12); #ifdef DEBUG_SIM - LOG_D(OCM,"[SIM][DL] eNB %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for slot %d (subframe %d)\n", + LOG_D(OCM,"[SIM][DL] eNB %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n", eNB_id,CC_id, 10*log10(tx_pwr), frame_parms->pdsch_config_common.referenceSignalPower, - next_slot, - next_slot>>1); + subframe); + #endif //eNB2UE[eNB_id][UE_id]->path_loss_dB = 0; - multipath_channel(eNB2UE[eNB_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0, - frame_parms->samples_per_tti>>1,hold_channel); + multipath_channel(eNB2UE[eNB_id][UE_id][CC_id],(double**)s_re,(double**)s_im,(double**)r_re0,(double**)r_im0, + frame_parms->samples_per_tti,hold_channel); #ifdef DEBUG_SIM rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id][CC_id]->ch[0], eNB2UE[eNB_id][UE_id][CC_id]->channel_length)*eNB2UE[eNB_id][UE_id][CC_id]->channel_length; @@ -281,17 +266,17 @@ void do_DL_sig(double **r_re0,double **r_im0, eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB); #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx, + rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0,nb_antennas_rx, frame_parms->ofdm_symbol_size, - slot_offset_meas)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for slot %d (subframe %d)\n",UE_id, + sf_offset)/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for subframe %d\n",UE_id, 10*log10(rx_pwr), - 10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),next_slot,next_slot>>1); + 10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),subframe); LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (noise) -132 dBm/RE (N0fs = %.1f dBm, N0B = %.1f dBm) for slot %d (subframe %d)\n", UE_id, 10*log10(eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate*1e6)-174, 10*log10(eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate*1e6*12*frame_parms->N_RB_DL/(double)frame_parms->ofdm_symbol_size)-174, - next_slot,next_slot>>1); + subframe); #endif if (eNB2UE[eNB_id][UE_id][CC_id]->first_run == 1) @@ -300,96 +285,85 @@ void do_DL_sig(double **r_re0,double **r_im0, // RF model #ifdef DEBUG_SIM - LOG_D(OCM,"[SIM][DL] UE %d (CCid %d): rx_gain %d dB (-ADC %f) for slot %d (subframe %d)\n",UE_id,CC_id,PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB, - PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB-66.227,next_slot,next_slot>>1); + LOG_D(OCM,"[SIM][DL] UE %d (CCid %d): rx_gain %d dB (-ADC %f) for subframe %d\n",UE_id,CC_id,PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB, + PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB-66.227,subframe); #endif - /* - rf_rx(r_re0, - r_im0, - NULL, - NULL, - 0, - nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 1e3/eNB2UE[eNB_id][UE_id]->BW, // sampling time (ns) - 0.0, // freq offset (Hz) (-20kHz..20kHz) - 0.0, // drift (Hz) NOT YET IMPLEMENTED - ue_data[UE_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED - (double)PHY_vars_UE_g[UE_id]->rx_total_gain_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) - 200.0, // IP3_dBm (dBm) - &eNB2UE[eNB_id][UE_id]->ip, // initial phase - 30.0e3, // pn_cutoff (kHz) - -500.0, // pn_amp (dBc) default: 50 - 0.0, // IQ imbalance (dB), - 0.0); // IQ phase imbalance (rad) - */ - rf_rx_simple(r_re0, - r_im0, + rf_rx_simple((double**)r_re0, + (double**)r_im0, nb_antennas_rx, - frame_parms->samples_per_tti>>1, + frame_parms->samples_per_tti, 1e3/eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate, // sampling time (ns) (double)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re0,r_im0, + rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0, nb_antennas_rx, frame_parms->ofdm_symbol_size, - slot_offset_meas)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dBm/RE for slot %d (subframe %d)\n", + sf_offset)/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dBm/RE for subframe %d\n", UE_id,eNB_id, - 10*log10(rx_pwr),next_slot,next_slot>>1); + 10*log10(rx_pwr),subframe); #endif - - for (i=0; i<(frame_parms->samples_per_tti>>1); i++) { + + pthread_mutex_lock(&eNB_output_mutex[UE_id]); + for (i=0; isamples_per_tti; i++) { for (aa=0; aaofdm_symbol_size,slot_offset_meas)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1); + rx_pwr = signal_energy_fp((double**)r_re_DL[UE_id],(double**)r_im_DL[UE_id],nb_antennas_rx,frame_parms->ofdm_symbol_size,sf_offset)/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for subframe %d\n",UE_id,10*log10(rx_pwr),subframe); #endif - - rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata; - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); - - adc(r_re, - r_im, - 0, - slot_offset, - rxdata, - nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 12); - + + rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata; + sf_offset = subframe*frame_parms->samples_per_tti; + + adc((double**)r_re_DL[UE_id], + (double**)r_im_DL[UE_id], + 0, + sf_offset, + rxdata, + nb_antennas_rx, + frame_parms->samples_per_tti, + 12); + #ifdef DEBUG_SIM - rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->ofdm_symbol_size)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for slot %d (subframe %d), writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1,rxdata); + rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->ofdm_symbol_size)/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for subframe %d, writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,subframe,rxdata); #else - UNUSED_VARIABLE(rx_pwr2); - UNUSED_VARIABLE(tx_pwr); - UNUSED_VARIABLE(rx_pwr); + UNUSED_VARIABLE(rx_pwr2); + UNUSED_VARIABLE(tx_pwr); + UNUSED_VARIABLE(rx_pwr); #endif - //}// UE_index loop + + } // eNB_output_mask + pthread_mutex_unlock(&eNB_output_mutex[UE_id]); + } // eNB_id + } } -void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs], - node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame,uint8_t CC_id) +void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs], + node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX], + uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, + uint32_t frame,int eNB_id,uint8_t CC_id) { int32_t **txdata,**rxdata; #ifdef PHY_ABSTRACTION_UL int32_t att_eNB_id=-1; #endif - uint8_t eNB_id=0,UE_id=0; + uint8_t UE_id=0; uint8_t nb_antennas_rx = UE2eNB[0][0][CC_id]->nb_rx; // number of rx antennas at eNB uint8_t nb_antennas_tx = UE2eNB[0][0][CC_id]->nb_tx; // number of tx antennas at UE @@ -397,7 +371,7 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double double tx_pwr, rx_pwr; int32_t rx_pwr2; uint32_t i,aa; - uint32_t slot_offset,slot_offset_meas; + uint32_t sf_offset; uint8_t hold_channel=0; @@ -408,192 +382,149 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double int ulnbrb2 ; int ulfrrb2 ; uint8_t harq_pid; - int subframe = (next_slot>>1); #endif - - /* - if (next_slot==4) - hold_channel = 0; - else - hold_channel = 1; - */ + double s_re[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double s_im[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double r_re0[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double r_im0[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; if (abstraction_flag!=0) { #ifdef PHY_ABSTRACTION_UL - for (eNB_id=0; eNB_idN_RB_UL,frame_parms->N_RB_UL*12+1); - - // REceived power at the eNB - rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0], - UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][att_eNB_id][CC_id]->channel_length; // calculate the rx power at the eNB - } - - // write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1); - if(subframe>1 && subframe <5) { - harq_pid = subframe2harq_pid(frame_parms,frame,subframe); - ul_nb_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->nb_rb; - ul_fr_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->first_rb; - } - - if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1)) { - number_rb_ul = ul_nb_rb; - first_rbUL = ul_fr_rb; - init_snr_up(UE2eNB[UE_id][att_eNB_id][CC_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id][CC_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id][CC_id]->N0,ul_nb_rb,ul_fr_rb); - - } - } //UE_id - } //eNB_id + for (UE_id=0; UE_idN_RB_UL,frame_parms->N_RB_UL*12+1); + + // REceived power at the eNB + rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0], + UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][att_eNB_id][CC_id]->channel_length; // calculate the rx power at the eNB + } + + // write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1); + if(subframe>1 && subframe <5) { + harq_pid = subframe2harq_pid(frame_parms,frame,subframe); + ul_nb_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->nb_rb; + ul_fr_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->first_rb; + } + + if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1)) { + number_rb_ul = ul_nb_rb; + first_rbUL = ul_fr_rb; + init_snr_up(UE2eNB[UE_id][att_eNB_id][CC_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id][CC_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id][CC_id]->N0,ul_nb_rb,ul_fr_rb); + + } + } //UE_id #else - /* the following functions are not needed */ - /* - if (abstraction_flag!=0) { - for (eNB_id=0;eNB_idN_RB_UL,2); - } - } - } - */ + #endif } else { //without abstraction - for (eNB_id=0; eNB_idsamples_per_tti>>1); i++) { - for (aa=0; aasamples_per_tti; i++) { + for (aa=0; aacommon_vars.txdata; + sf_offset = subframe*frame_parms->samples_per_tti; + + if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm + + UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB) <= -125.0) { + // don't simulate a UE that is too weak + } else { + + tx_pwr = dac_fixed_gain((double**)s_re, + (double**)s_im, + txdata, + sf_offset, + nb_antennas_tx, + frame_parms->samples_per_tti, + sf_offset, + frame_parms->ofdm_symbol_size, + 14, + (double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE), + PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE); // This make the previous argument the total power + LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for subframe %d (sf_offset %d)\n", + UE_id, + 10*log10(tx_pwr), + PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm, + PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE, + subframe,sf_offset); + + + multipath_channel(UE2eNB[UE_id][eNB_id][CC_id],(double**)s_re,(double**)s_im,(double**)r_re0,(double**)r_im0, + frame_parms->samples_per_tti,hold_channel); + - txdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.txdata; - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); - slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1)); + rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0], + UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][eNB_id][CC_id]->channel_length; - if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm + - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB) <= -125.0) { - - // don't simulate a UE that is too weak - } else { - - tx_pwr = dac_fixed_gain(s_re, - s_im, - txdata, - slot_offset, - nb_antennas_tx, - frame_parms->samples_per_tti>>1, - slot_offset_meas, - frame_parms->ofdm_symbol_size, - 14, - (double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE), - PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE); // This make the previous argument the total power - //ue_data[UE_id]->tx_power_dBm); - //#ifdef DEBUG_SIM - LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n", - UE_id, - 10*log10(tx_pwr), - PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm, - PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE, - next_slot,next_slot>>1,slot_offset,slot_offset_meas); - //#endif - - multipath_channel(UE2eNB[UE_id][eNB_id][CC_id],s_re,s_im,r_re0,r_im0, - frame_parms->samples_per_tti>>1,hold_channel); - - //#ifdef DEBUG_SIM - rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0], - UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][eNB_id][CC_id]->channel_length; - LOG_D(OCM,"[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d,length %d, PL %f)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr), - hold_channel,UE2eNB[UE_id][eNB_id][CC_id]->channel_length, - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB); - //#endif - - //#ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti>>1,0); - LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for slot %d (subframe %d), sptti %d\n", - eNB_id,10*log10(rx_pwr),rx_pwr,next_slot,next_slot>>1,frame_parms->samples_per_tti); - //#endif - - - if (UE2eNB[UE_id][eNB_id][CC_id]->first_run == 1) - UE2eNB[UE_id][eNB_id][CC_id]->first_run = 0; - - - - for (aa=0; aasamples_per_tti>>1); i++) { - r_re[aa][i]+=r_re0[aa][i]; - r_im[aa][i]+=r_im0[aa][i]; - } - } - } - } //UE_id - - // RF model - /* - rf_rx(r_re0, - r_im0, - NULL, - NULL, - 0, - frame_parms->nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 1e3/UE2eNB[UE_id][eNB_id]->BW, // sampling time (ns) - 0.0, // freq offset (Hz) (-20kHz..20kHz) - 0.0, // drift (Hz) NOT YET IMPLEMENTED - enb_data[eNB_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED - (double)PHY_vars_eNB_g[eNB_id]->rx_total_gain_eNB_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) - 200.0, // IP3_dBm (dBm) - &UE2eNB[UE_id][eNB_id]->ip, // initial phase - 30.0e3, // pn_cutoff (kHz) - -500.0, // pn_amp (dBc) default: 50 - 0.0, // IQ imbalance (dB), - 0.0); // IQ phase imbalance (rad) - */ - - rf_rx_simple(r_re, - r_im, - nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns) - (double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) + LOG_D(OCM,"[SIM][UL] subframe %d Channel UE %d => eNB %d : %f dB (hold %d,length %d, PL %f)\n",subframe,UE_id,eNB_id,10*log10(rx_pwr), + hold_channel,UE2eNB[UE_id][eNB_id][CC_id]->channel_length, + UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB); + rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0,nb_antennas_rx,frame_parms->samples_per_tti,0); + LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for subframe %d, sptti %d\n", + eNB_id,10*log10(rx_pwr),rx_pwr,subframe,frame_parms->samples_per_tti); + + + if (UE2eNB[UE_id][eNB_id][CC_id]->first_run == 1) + UE2eNB[UE_id][eNB_id][CC_id]->first_run = 0; + + + pthread_mutex_lock(&UE_output_mutex[eNB_id]); + for (aa=0; aasamples_per_tti; i++) { + r_re_UL[eNB_id][aa][i]+=r_re0[aa][i]; + r_im_UL[eNB_id][aa][i]+=r_im0[aa][i]; + } + } + pthread_mutex_unlock(&UE_output_mutex[eNB_id]); + } + } //UE_id + + rf_rx_simple((double**)r_re_UL[eNB_id], + (double**)r_im_UL[eNB_id], + nb_antennas_rx, + frame_parms->samples_per_tti, + 1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns) + (double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) + #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1); + rx_pwr = signal_energy_fp((double**)r_re_UL[eNB_id],(double**)r_im_UL[eNB_id],nb_antennas_rx,frame_parms->samples_per_tti,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d\n",10*log10(rx_pwr),subframe); #endif - - rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.rxdata[0]; - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); - - adc(r_re, - r_im, - 0, - slot_offset, - rxdata, - nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 12); - + + rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.rxdata[0]; + sf_offset = subframe*frame_parms->samples_per_tti; + + adc((double**)r_re_UL[eNB_id], + (double**)r_im_UL[eNB_id], + 0, + sf_offset, + rxdata, + nb_antennas_rx, + frame_parms->samples_per_tti, + 12); + #ifdef DEBUG_SIM - rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d)\n",eNB_id,10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1); + rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->samples_per_tti)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for subframe %d\n",eNB_id,10*log10((double)rx_pwr2),rx_pwr2,subframe); #else - UNUSED_VARIABLE(tx_pwr); - UNUSED_VARIABLE(rx_pwr); - UNUSED_VARIABLE(rx_pwr2); + UNUSED_VARIABLE(tx_pwr); + UNUSED_VARIABLE(rx_pwr); + UNUSED_VARIABLE(rx_pwr2); #endif - - } // eNB_id + } // abstraction_flag==0 } @@ -604,29 +535,13 @@ void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ** int i; - *s_re = malloc(2*sizeof(double*)); - *s_im = malloc(2*sizeof(double*)); - *r_re = malloc(2*sizeof(double*)); - *r_im = malloc(2*sizeof(double*)); - *r_re0 = malloc(2*sizeof(double*)); - *r_im0 = malloc(2*sizeof(double*)); + memset(eNB_output_mask,0,sizeof(int)*NUMBER_OF_UE_MAX); + for (i=0;iframe_rx = frame; proc->subframe_rx = sf; proc->timestamp_rx += PHY_vars_eNB_g[eNB_inst][CC_id]->frame_parms.samples_per_tti; + pthread_mutex_unlock( &proc->mutex_FH ); - if (proc->instance_cnt_FH == 0) { + if (cnt_FH == 0) { if (pthread_cond_signal(&proc->cond_FH) != 0) { LOG_E(PHY,"ERROR pthread_cond_signal for eNB FH CCid %d\n",proc->CC_id); exit_fun("ERROR pthread_cond_signal"); diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h index 6fb16b82db..47eefe472c 100644 --- a/targets/SIMU/USER/oaisim.h +++ b/targets/SIMU/USER/oaisim.h @@ -50,11 +50,13 @@ eNB_MAC_INST* get_eNB_mac_inst(module_id_t module_idP); OAI_Emulation* get_OAI_emulation(void); void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0); -void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs], - node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t,uint8_t); +void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs], + node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX], + uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, + uint32_t frame,int eNB_id,uint8_t CC_id); -void do_DL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs], - node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id); +void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs], + node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id); void init_ue(node_desc_t *ue_data, UE_Antenna ue_ant);//Abstraction changes void init_enb(node_desc_t *enb_data, eNB_Antenna enb_ant);//Abstraction changes diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 8148730a24..c4a70f8716 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -173,6 +173,12 @@ extern time_stats_t ul_chan_stats; extern int xforms; +extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; +extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; + +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst); +void stop_eNB(int nb_inst); + void get_simulation_options(int argc, char *argv[]) { int option; @@ -774,11 +780,15 @@ void get_simulation_options(int argc, char *argv[]) conf_config_file_name, oai_emulation.info.nb_enb_local, enb_properties->number); /* Update some simulation parameters */ - oai_emulation.info.frame_type[0] = enb_properties->properties[0]->frame_type[0]; - oai_emulation.info.tdd_config[0] = enb_properties->properties[0]->tdd_config[0]; - oai_emulation.info.tdd_config_S[0] = enb_properties->properties[0]->tdd_config_s[0]; + oai_emulation.info.frame_type[0] = enb_properties->properties[0]->frame_type[0]; + oai_emulation.info.tdd_config[0] = enb_properties->properties[0]->tdd_config[0]; + oai_emulation.info.tdd_config_S[0] = enb_properties->properties[0]->tdd_config_s[0]; oai_emulation.info.extended_prefix_flag[0] = enb_properties->properties[0]->prefix_type[0]; + oai_emulation.info.node_function[0] = enb_properties->properties[0]->cc_node_function[0]; + oai_emulation.info.node_timing[0] = enb_properties->properties[0]->cc_node_timing[0]; + downlink_frequency[0][0] = enb_properties->properties[0]->downlink_frequency[0]; + uplink_frequency_offset[0][0] = enb_properties->properties[0]->uplink_frequency_offset[0]; } free(conf_config_file_name); @@ -939,6 +949,119 @@ void init_seed(uint8_t set_seed) } } +int eNB_trx_start(openair0_device *device) { + return(0); +} + +void eNB_trx_end(openair0_device *device) { + return; +} + +int eNB_trx_stop(openair0_device *device) { + return(0); +} +int UE_trx_start(openair0_device *device) { + return(0); +} +int UE_trx_end(openair0_device *device) { + return(0); +} +int UE_trx_stop(openair0_device *device) { + return(0); +} +int eNB_trx_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dummy) { + return(0); +} +int eNB_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) { + return(0); +} +int UE_trx_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dummy) { + return(0); +} +int UE_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) { + return(0); +} + +int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + return(0); +} + +int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + return(0); +} + +int eNB_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int eNB_id = device->Mod_id; + int CC_id = device->CC_id; + int UE_id; + int subframe = (timestamp/PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti)%10; + + for (UE_id=0;UE_id<=NB_UE_INST;UE_id++) { + do_DL_sig(eNB2UE, + enb_data, + ue_data, + subframe, + 0, //abstraction_flag, + &PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms, + UE_id, + CC_id); + } + return(0); +} + +int UE_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int UE_id = device->Mod_id; + int CC_id = device->CC_id; + int eNB_id; + int subframe = (timestamp/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10; + + for (eNB_id=0;eNB_id<=NB_eNB_INST;eNB_id++) { + do_UL_sig(UE2eNB, + enb_data, + ue_data, + subframe, + 0, // abstraction_flag + &PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms, + 0, // frame is only used for abstraction + eNB_id, + CC_id); + } + return(0); +} + +void init_devices(void){ + + module_id_t UE_id, eNB_id; + uint8_t CC_id; + + for (CC_id=0; CC_idrfdevice.Mod_id = eNB_id; + PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.CC_id = CC_id; + PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_start_func = eNB_trx_start; + PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_read_func = eNB_trx_read; + PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_write_func = eNB_trx_write; + PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_end_func = eNB_trx_end; + PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_stop_func = eNB_trx_stop; + PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_set_freq_func = eNB_trx_set_freq; + PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_set_gains_func = eNB_trx_set_gains; + } + for (UE_id=0;UE_idrfdevice.Mod_id = UE_id; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.CC_id = CC_id; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_start_func = UE_trx_start; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_read_func = UE_trx_read; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_write_func = UE_trx_write; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_end_func = UE_trx_end; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_stop_func = UE_trx_stop; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_set_freq_func = UE_trx_set_freq; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_set_gains_func = UE_trx_set_gains; + } + } +} + void init_openair1(void) { module_id_t UE_id, eNB_id; @@ -1029,7 +1152,9 @@ void init_openair1(void) } } - init_eNB(eNodeB_3GPP,NB_eNB_INST); + init_devices (); + + init_eNB(oai_emulation.info.node_function,oai_emulation.info.node_timing,NB_eNB_INST); // init_ue_status(); for (UE_id=0; UE_id Date: Sun, 24 Jul 2016 02:31:29 -0700 Subject: [PATCH 128/340] bug fixes from Laurent on IF5 interface. 8-bit conversion for Mobipass. --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 545c892c2a..052e4d9174 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -46,8 +46,8 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe, uint8_t *seqno, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - void *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; - void *tx_buffer=NULL; + int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; + int32_t *tx_buffer=NULL; uint16_t packet_id=0, i=0; @@ -115,8 +115,8 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe data_block = data_block_head; for (i=0; i>3; i+=2) { - t0 = _mm_srli_epi16(*txp128++, 4); - t1 = _mm_srli_epi16(*txp128++, 4); + t0 = _mm_srai_epi16(*txp128++, 4); + t1 = _mm_srai_epi16(*txp128++, 4); *data_block++ = _mm_packs_epi16(t0, t1); } @@ -147,8 +147,8 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subframe, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - void *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; - void *rx_buffer=NULL; + int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; + uint16_t packet_id=0, i=0; @@ -203,6 +203,5 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type); } - free(rx_buffer); return; } From e035bc3e1c45a5aa386535a0ebac661961c1e778 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 24 Jul 2016 17:37:22 +0200 Subject: [PATCH 129/340] Result of testing as eNodeB. modifications for .vcd logging, bugfix in eNB_thread_FH (subframe counter), update of .conf file for new threading parameters. Updates to gtkwave configuration file for new threading. --- openair1/SCHED/phy_procedures_lte_eNb.c | 12 +++--- openair2/UTIL/LOG/vcd_signal_dumper.c | 24 +++++++----- openair2/UTIL/LOG/vcd_signal_dumper.h | 18 +++++---- .../CONF/enb.band7.tm1.50PRB.usrpb210.conf | 3 ++ targets/RT/USER/eNB_usrp.gtkw | 37 +++++++++++-------- targets/RT/USER/lte-enb.c | 29 +++++++-------- targets/RT/USER/lte-softmodem.c | 1 + 7 files changed, 70 insertions(+), 54 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index ca7b5ec559..6966c3cb90 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1105,7 +1105,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, uint8_t smbv_alloc_cnt = 1; #endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+(subframe&1),1); start_meas(&eNB->phy_proc_tx); for (i=0; iphy_proc_tx); } @@ -2515,7 +2515,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl uint8_t seqno=0; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 1 ); start_meas(&eNB->phy_proc_rx); @@ -2602,7 +2602,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 0 ); } @@ -2621,7 +2621,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+(subframe&1), 1 ); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_uespec_RX(%d)\n",eNB->Mod_id,frame, subframe); @@ -3183,7 +3183,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const phy_procedures_emos_eNB_RX(subframe,eNB); #endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+(subframe&1), 0 ); stop_meas(&eNB->phy_proc_rx); diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index a643874444..db00a8c35f 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -75,10 +75,14 @@ struct vcd_module_s { } vcd_module_s; const char* eurecomVariablesNames[] = { - "frame_number_TX_eNB", - "frame_number_RX_eNB", - "subframe_number_TX_eNB", - "subframe_number_RX_eNB", + "frame_number_TX0_eNB", + "frame_number_TX1_eNB", + "frame_number_RX0_eNB", + "frame_number_RX1_eNB", + "subframe_number_TX0_eNB", + "subframe_number_TX1_eNB", + "subframe_number_RX0_eNB", + "subframe_number_RX1_eNB", "runtime_TX_eNB", "runtime_RX_eNB", "frame_number_TX0_UE", @@ -187,8 +191,6 @@ const char* eurecomFunctionsNames[] = { "trx_write", "eNB_thread_rxtx0", "eNB_thread_rxtx1", - "eNB_thread_rx", - "eNB_thread_prach", "ue_thread_synch", "ue_thread_rxtx0", "ue_thread_rxtx1", @@ -213,10 +215,12 @@ const char* eurecomFunctionsNames[] = { "lte_ue_measurement_procedures", "lte_ue_pdcch_procedures", "lte_ue_pbch_procedures", - "phy_procedures_eNb_tx", - "phy_procedures_eNb_rx", - "phy_procedures_eNb_rx_common", - "phy_procedures_eNb_rx_uespec", + "phy_procedures_eNb_tx0", + "phy_procedures_eNb_tx1", + "phy_procedures_eNb_rx_common0", + "phy_procedures_eNb_rx_common1", + "phy_procedures_eNb_rx_uespec0", + "phy_procedures_eNb_rx_uespec1", "phy_eNB_slot_fep", "phy_procedures_ue_tx", "phy_procedures_ue_rx", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 1b72002f25..433d155a6c 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -47,10 +47,14 @@ /* WARNING: if you edit the enums below, update also string definitions in vcd_signal_dumper.c */ typedef enum { - VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB = 0, - VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, - VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_ENB, - VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB = 0, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX1_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_ENB, + VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX1_ENB, VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE, @@ -161,8 +165,6 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0, VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX1, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX, - VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_PRACH, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_SYNCH, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX0, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX1, @@ -188,9 +190,11 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX, - VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX1, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON1, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC1, VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index d00482edca..b6ba5213ef 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/RT/USER/eNB_usrp.gtkw b/targets/RT/USER/eNB_usrp.gtkw index 474d2d1cf3..44401bd25e 100644 --- a/targets/RT/USER/eNB_usrp.gtkw +++ b/targets/RT/USER/eNB_usrp.gtkw @@ -1,17 +1,17 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Sun May 29 20:10:01 2016 +[*] Sun Jul 24 14:21:37 2016 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Sun May 29 20:07:25 2016" -[dumpfile_size] 16398004 +[dumpfile_mtime] "Sun Jul 24 14:18:00 2016" +[dumpfile_size] 7104337 [savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw" -[timestart] 10806270000 +[timestart] 10621768000 [size] 1535 724 [pos] 309 0 -*-18.793451 10806918339 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +*-19.793451 29026062100 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [sst_width] 284 -[signals_width] 254 +[signals_width] 262 [sst_expanded] 1 [sst_vpaned_height] 294 @28 @@ -20,19 +20,24 @@ functions.trx_write @24 variables.trx_ts[63:0] variables.trx_tst[63:0] -variables.frame_number_TX_eNB[63:0] -variables.frame_number_RX_eNB[63:0] -variables.subframe_number_TX_eNB[63:0] -variables.subframe_number_RX_eNB[63:0] @28 -functions.eNB_thread_rx0 -functions.eNB_thread_tx0 -functions.phy_procedures_eNb_tx +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +@25 +variables.subframe_number_TX1_eNB[63:0] +@28 functions.phy_enb_sfgen -@29 functions.phy_eNB_slot_fep -@28 -functions.phy_procedures_eNb_rx functions.phy_enb_prach_rx @24 variables.dci_info[63:0] diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 177291596b..ff302ec80d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -435,6 +435,9 @@ static void* eNB_thread_rxtx( void* param ) { if (oai_exit) break; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB+(proc->subframe_rx&1), proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_ENB+(proc->subframe_rx&1), proc->subframe_rx ); + // Common procedures phy_procedures_eNB_common_RX(PHY_vars_eNB_g[0][proc->CC_id], 0); @@ -473,8 +476,8 @@ static void* eNB_thread_rxtx( void* param ) { exit_fun("nothing to add"); } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_ENB, proc->subframe_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+(proc->subframe_tx&1), proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+(proc->subframe_tx&1), proc->subframe_tx ); if (oai_exit) break; @@ -1004,6 +1007,14 @@ static void* eNB_thread_FH( void* param ) { if (oai_exit) break; + if (subframe==9) { + subframe=0; + frame++; + frame&=1023; + } else { + subframe++; + } + // This case is for synchronization to another thread if ((eNB->node_timing == synch_to_other) && ((eNB->node_function == NGFI_RCC_IF4) || @@ -1037,13 +1048,7 @@ static void* eNB_thread_FH( void* param ) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - if (subframe==9) { - subframe=0; - frame++; - frame&=1023; - } else { - subframe++; - } + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, &proc->timestamp_rx, @@ -1073,8 +1078,6 @@ static void* eNB_thread_FH( void* param ) { //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); if (rxs != fp->samples_per_tti) exit_fun( "problem receiving samples" ); @@ -1107,8 +1110,6 @@ static void* eNB_thread_FH( void* param ) { } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); } // eNodeB_3GPP_BBU && node_timing == synch_to_ext_device else if ((eNB->node_timing == synch_to_ext_device) && @@ -1150,8 +1151,6 @@ static void* eNB_thread_FH( void* param ) { } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); } // node_timing == synch_to_externs, node_function = NGFI_IF4 else { // should not get here diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 8d073d310b..5db0451c4c 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -526,6 +526,7 @@ static void *scope_thread(void *arg) for(UE_id=0; UE_iddlsch[UE_id][0]->rnti>0) && (ue_cnt Date: Mon, 25 Jul 2016 12:04:25 +0200 Subject: [PATCH 130/340] if4 tx works again with FH thread changes --- targets/RT/USER/lte-enb.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index ff302ec80d..427f69180f 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -301,6 +301,7 @@ static void* eNB_thread_rxtx( void* param ) { uint16_t packet_type; uint32_t symbol_number=0; + uint32_t symbol_mask, symbol_mask_full; uint8_t seqno=0; @@ -502,10 +503,16 @@ static void* eNB_thread_rxtx( void* param ) { } } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) { /// **** recv_IF4 of txdataF from RCC **** /// + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<CC_id]->frame_parms.symbols_per_tti)-1; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); do { recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); - } while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1); + symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; } else if (packet_type == IF4_PRACH) { - // wake up thread for PRACH RX - prach_rx = 1; + prach_rx = 0; } - } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); + } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); if (proc->first_rx == 0) { if (subframe_rx < proc->subframe_rx+2){ @@ -1122,32 +1128,33 @@ static void* eNB_thread_FH( void* param ) { symbol_mask = 0; symbol_mask_full = (1<symbols_per_tti)-1; prach_rx = 0; - + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); recv_IF4(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); if (packet_type == IF4_PULFFT) { - symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; } else if (packet_type == IF4_PRACH) { - // wake up thread for PRACH RX - prach_rx = 1; - } - } while( (symbol_mask != symbol_mask_full) && (prach_rx == 0)); + prach_rx = 0; + } + } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); if (proc->first_rx == 0) { if (proc->subframe_rx != subframe){ LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - //exit_fun("Exiting"); + exit_fun("Exiting"); } if (proc->frame_rx != frame) { LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - //exit_fun("Exiting"); + exit_fun("Exiting"); } } else { proc->first_rx = 0; + frame = proc->frame_rx; + subframe = proc->subframe_rx; } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); From 81506be64c4e8876ac46f0fc48ccba6ae855613a Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Mon, 25 Jul 2016 17:40:46 +0200 Subject: [PATCH 131/340] if4 working --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 4 ++-- openair1/PHY/LTE_TRANSPORT/prach.c | 21 +-------------------- targets/RT/USER/lte-enb.c | 2 +- 3 files changed, 4 insertions(+), 23 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 572bcd73b7..d492af16a7 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -96,7 +96,7 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, } else if (packet_type == IF4_PULFFT) { db_fulllength = 12*fp->N_RB_UL; db_halflength = (db_fulllength)>>1; - slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; IF4_header_t *ul_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); @@ -212,7 +212,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ } else if (*packet_type == IF4_PULFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; - slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; for (element_id=0; element_idcommon_vars.rxdata[0][aa][subframe*eNB->frame_parms.samples_per_tti-eNB->N_TA_offset]; } - - int energy = dB_fixed(signal_energy(prach[0], eNB->frame_parms.samples_per_tti)); - //if (energy >= 45) { - // printf("prach subframe energy %d\n",energy); - //} - + // First compute physical root sequence if (restricted_set == 0) { if (Ncs_config>15) { @@ -1290,13 +1285,6 @@ void rx_prach(PHY_VARS_eNB *eNB, send_IF4(eNB, eNB->proc.frame_rx, eNB->proc.subframe_rx, IF4_PRACH, k); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); - energy = dB_fixed(signal_energy(&rxsigF[0][k], 839)); - if (energy >=45) { - printf(" prach freq-domain energy %d\n",eNB->proc.frame_rx, energy); - //write_output("beforecomp.m","rxF",&rxsigF[0][k],839*2,1,0); - //exit(1); - } - return; } else if (eNB->node_function == NGFI_RCC_IF4) { k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; @@ -1313,13 +1301,6 @@ void rx_prach(PHY_VARS_eNB *eNB, memmove((&rxsigF[0][k]), (&rxsigF[0][0]), 839*2*sizeof(int16_t)); - - energy = dB_fixed(signal_energy(&rxsigF[0][k], 839)); - if (energy >=45) { - printf(" prach freq-domain energy %d\n",eNB->proc.frame_rx, energy); - //write_output("aftercomp.m","rxF",&rxsigF[0][k],839*2,1,0); - //exit(1); - } } // in case of RCC and prach received rx_thread wakes up prach diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 427f69180f..6ed97c0f65 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -976,7 +976,7 @@ static void* eNB_thread_FH( void* param ) { pthread_mutex_unlock(&sync_mutex); - printf( "got sync (eNB_thread FH)\n" ); + printf( "got sync (eNB_thread_FH)\n" ); #if defined(ENABLE_ITTI) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); From fb2a4529d556ea7db50aa36884260c363594c7a1 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 25 Jul 2016 21:17:05 +0200 Subject: [PATCH 132/340] updated config files for NGFI RRH interface --- .../CONF/enb.band7.tm1.bladerfx40.conf | 3 +++ .../CONF/enb.band7.tm1.exmimo2.conf | 3 +++ .../CONF/enb.band7.tm1.lmssdr.conf | 3 +++ .../CONF/enb.band7.tm1.usrpb210.conf | 17 ++++++++++------- .../CONF/enb.band7.tm1.usrpx310.conf | 3 +++ 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf index 5a6a9a462b..8ae0ddeb06 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf index f1160e78ca..7bf097875d 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf index 47e2179d18..a407aaecf1 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf index ae2b076a49..21c1a80efc 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -17,12 +17,15 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -31,7 +34,7 @@ eNBs = downlink_frequency = 2660000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; - N_RB_DL = 25; + N_RB_DL = 50; Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; @@ -130,7 +133,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "127.0.0.3"; + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -139,11 +142,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth1"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.147/24"; - ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth1"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.147/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf index d4b88383e2..65f58fe33f 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -22,6 +22,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; From 491c23c3ebebb0b6acdf558088170a8b90720f4e Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 26 Jul 2016 02:37:44 -0700 Subject: [PATCH 133/340] removed a debugging print in dft60 --- openair1/PHY/TOOLS/lte_dfts.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 4fc332704b..00e1b0b5ce 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -6817,7 +6817,7 @@ void dft60(int16_t *x,int16_t *y,unsigned char scale) for (i=0; i<60; i++) { y128[i] = mulhi_int16(y128[i],norm128); - printf("y[%d] = (%d,%d)\n",i,((int16_t*)&y128[i])[0],((int16_t*)&y128[i])[1]); +// printf("y[%d] = (%d,%d)\n",i,((int16_t*)&y128[i])[0],((int16_t*)&y128[i])[1]); } } From 64121aaf15054b797f71610bb7fd4ee229a1e183 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 26 Jul 2016 12:40:52 +0200 Subject: [PATCH 134/340] configuration files, minor changes in RF interface --- targets/ARCH/COMMON/common_lib.h | 2 +- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 35 +++++------- .../CONF/enb.band7.tm1.100PRB.usrpb210.conf | 24 +++++---- .../CONF/enb.band7.tm1.50PRB.usrpb210.conf | 2 +- .../CONF/enb.band7.tm1.usrpb210.conf | 3 ++ targets/RT/USER/lte-enb.c | 53 +++++++++++-------- 6 files changed, 64 insertions(+), 55 deletions(-) diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 17d1f7b180..99350a4c1e 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -152,8 +152,8 @@ typedef struct { int mmapped_dma; //! offset in samples between TX and RX paths int tx_sample_advance; + //! samples per packet on the fronthaul interface int samples_per_packet; - int tx_scheduling_advance; //! number of RX channels (=RX antennas) int rx_num_channels; //! number of TX channels (=TX antennas) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index d8a65dc2ca..fc4f8d5d39 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -172,25 +172,32 @@ static void trx_usrp_end(openair0_device *device) */ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + int ret; usrp_state_t *s = (usrp_state_t*)device->priv; + s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); - + if(flags) s->tx_md.has_time_spec = true; else s->tx_md.has_time_spec = false; - + if (cc>1) { std::vector buff_ptrs; for (int i=0;itx_stream->send(buff_ptrs, nsamps, s->tx_md); + ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md,1e-3); } else - s->tx_stream->send(buff[0], nsamps, s->tx_md); + ret = (int)s->tx_stream->send(buff[0], nsamps, s->tx_md,1e-3); + s->tx_md.start_of_burst = false; - return 0; + if (ret != nsamps) { + printf("[xmit] tx samples %d != %d\n",ret,nsamps); + } + + return ret; } /*! \brief Receive samples from hardware. @@ -551,28 +558,24 @@ extern "C" { openair0_cfg[0].tx_sample_advance = 15; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 15360000: openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 45; openair0_cfg[0].tx_bw = 10e6; openair0_cfg[0].rx_bw = 10e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; break; case 7680000: openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 50; openair0_cfg[0].tx_bw = 5e6; openair0_cfg[0].rx_bw = 5e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; break; case 1920000: openair0_cfg[0].samples_per_packet = 256; openair0_cfg[0].tx_sample_advance = 50; openair0_cfg[0].tx_bw = 1.25e6; openair0_cfg[0].rx_bw = 1.25e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); @@ -607,44 +610,34 @@ extern "C" { switch ((int)openair0_cfg[0].sample_rate) { case 30720000: - s->usrp->set_master_clock_rate(30.72e6); - openair0_cfg[0].samples_per_packet = 4096; + s->usrp->set_master_clock_rate(61.44e6); openair0_cfg[0].tx_sample_advance = 115; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 11*openair0_cfg[0].samples_per_packet; break; case 23040000: s->usrp->set_master_clock_rate(23.04e6); //to be checked - openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 113; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 15360000: s->usrp->set_master_clock_rate(30.72e06); - openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 103; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 10240; break; case 7680000: s->usrp->set_master_clock_rate(30.72e6); - openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 80; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; break; case 1920000: - s->usrp->set_master_clock_rate(7.68e6); - openair0_cfg[0].samples_per_packet = 256; + s->usrp->set_master_clock_rate(30.72e6); openair0_cfg[0].tx_sample_advance = 40; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index 7d34889f67..a2187d402f 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -23,12 +23,15 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2680000000L; + downlink_frequency = 2660000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; @@ -46,7 +49,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; + pdsch_referenceSignalPower = -29; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -64,9 +67,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -100; + pucch_p0_Nominal = -103; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -82,7 +85,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -130,7 +133,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; + mme_ip_address = ( { ipv4 = "127.0.0.3"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -139,11 +142,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; @@ -164,6 +167,5 @@ eNBs = rrc_log_level ="info"; rrc_log_verbosity ="medium"; }; - } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index b6ba5213ef..d2e99a3481 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -25,7 +25,7 @@ eNBs = { node_function = "eNodeB_3GPP"; node_timing = "synch_to_ext_device"; - node_synch_ref = 0; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf index ae2b076a49..c73c4ef809 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index ff302ec80d..93795c7220 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -298,7 +298,8 @@ static void* eNB_thread_rxtx( void* param ) { FILE *tx_time_file = NULL; char tx_time_name[101]; void *txp[PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx]; - + int txs; + uint16_t packet_type; uint32_t symbol_number=0; @@ -553,18 +554,21 @@ static void* eNB_thread_rxtx( void* param ) { for (i=0; iframe_parms.nb_antennas_tx; i++) txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; - // if symb_written < spp ==> error - PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, - (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), - txp, - PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, - PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, - 1); + txs = PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, + (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), + txp, + PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, + PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, + 1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + if (txs != PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti); + exit_fun( "problem transmitting samples" ); + } } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { /// **** send_IF5 of txdata to RRH **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); @@ -651,7 +655,7 @@ static void* eNB_thread_asynch_rx( void* param ) { uint32_t symbol_mask, symbol_mask_full; int prach_rx; int dummy_rx[fp->nb_antennas_rx][fp->samples_per_tti]; - int rxs; + int rxs=0; #ifdef DEADLINE_SCHEDULER struct sched_attr attr; @@ -770,6 +774,9 @@ static void* eNB_thread_asynch_rx( void* param ) { printf("eNB asynch RX\n"); sleep(1); } + if (rxs!=fp->samples_per_tti) { + exit_fun("error receiving samples\n"); + } } else if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF /// **** recv_IF5 of rxdata from RRH **** /// @@ -1031,7 +1038,7 @@ static void* eNB_thread_FH( void* param ) { while (proc->instance_cnt_FH < 0) { // most of the time the thread is waiting here - // proc->instance_cnt_prach is -1 + // proc->instance_cnt_FH is -1 pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); // this unlocks mutex_rxtx while waiting and then locks it again } proc->instance_cnt_FH++; @@ -1243,15 +1250,19 @@ static void* eNB_thread_FH( void* param ) { print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); - } + - if (eNB->node_timing == synch_to_ext_device) { - proc->instance_cnt_FH--; - - if (pthread_mutex_unlock(&proc->mutex_FH) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for FH\n"); - exit_fun( "error unlocking mutex" ); + if (eNB->node_timing == synch_to_ext_device) { + proc->instance_cnt_FH--; + + if (pthread_mutex_unlock(&proc->mutex_FH) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for FH\n"); + exit_fun( "error unlocking mutex" ); + } } + + if (eNB->frame_parms.N_RB_DL==6) + rt_sleep_ns(800000LL); } printf( "Exiting FH thread \n"); @@ -1271,12 +1282,12 @@ static void* eNB_thread_prach( void* param ) { eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id]; - + /* struct timespec wait; wait.tv_sec=0; wait.tv_nsec=5000000L; - + */ // set default return value eNB_thread_prach_status = 0; @@ -1378,7 +1389,7 @@ static void* eNB_thread_prach( void* param ) { if (oai_exit) break; - if (pthread_mutex_timedlock(&proc->mutex_prach,&wait) != 0) { + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH\n"); exit_fun( "error locking mutex" ); break; @@ -1400,7 +1411,7 @@ static void* eNB_thread_prach( void* param ) { prach_procedures(eNB,0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); - if (pthread_mutex_timedlock(&proc->mutex_prach,&wait) != 0) { + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n"); exit_fun( "error locking mutex" ); break; From 986dfecc83b4a5eb372c5ed3d12ff49a44ebc5df Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Tue, 26 Jul 2016 18:56:43 +0200 Subject: [PATCH 135/340] testing if5-rrh_gw tx working --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 57 ++++++++++--------- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 3 - targets/RT/USER/eNB_transport_IQ.c | 3 +- targets/RT/USER/lte-enb.c | 8 +-- 4 files changed, 35 insertions(+), 36 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 052e4d9174..59a3e70cd6 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -50,36 +50,35 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe int32_t *tx_buffer=NULL; uint16_t packet_id=0, i=0; + + uint32_t spp_eth = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_packet; + uint32_t spsf = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10; - if (packet_type == IF5_RRH_GW_DL) { - unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; - unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; - + if (packet_type == IF5_RRH_GW_DL) { + for (i=0; i < fp->nb_antennas_tx; i++) txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { - for (i=0; i < fp->nb_antennas_tx; i++) - txp[i] += packet_id*spp_eth; - + eNB->ifdevice.trx_write_func(&eNB->ifdevice, (proc_timestamp + packet_id*spp_eth), txp, spp_eth, fp->nb_antennas_tx, 0); + + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] += spp_eth; + } } else if (packet_type == IF5_RRH_GW_UL) { - unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; - unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; - + for (i=0; i < fp->nb_antennas_rx; i++) rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { - for (i=0; i < fp->nb_antennas_rx; i++) - rxp[i] += packet_id*spp_eth; eNB->ifdevice.trx_write_func(&eNB->ifdevice, (proc_timestamp + packet_id*spp_eth), @@ -87,6 +86,10 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe spp_eth, fp->nb_antennas_rx, 0); + + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] += spp_eth; + } } else if (packet_type == IF5_MOBIPASS) { @@ -149,49 +152,49 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; - uint16_t packet_id=0, i=0; + + int32_t spp_eth = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_packet; + int32_t spsf = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10; + + openair0_timestamp timestamp[spsf / spp_eth]; if (packet_type == IF5_RRH_GW_DL) { - unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; - unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; - - openair0_timestamp timestamp[spsf / spp_eth]; - + for (i=0; i < fp->nb_antennas_tx; i++) txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { - for (i=0; i < fp->nb_antennas_tx; i++) - txp[i] += packet_id*spp_eth; eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], txp, spp_eth, fp->nb_antennas_tx); + + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] += spp_eth; + } *proc_timestamp = timestamp[0]; - } else if (packet_type == IF5_RRH_GW_UL) { - unsigned int spp_eth = eNB->ifdevice.openair0_cfg->samples_per_packet; - unsigned int spsf = eNB->ifdevice.openair0_cfg->samples_per_frame/10; - - openair0_timestamp timestamp[spsf / spp_eth]; + } else if (packet_type == IF5_RRH_GW_UL) { for (i=0; i < fp->nb_antennas_rx; i++) rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { - for (i=0; i < fp->nb_antennas_tx; i++) - rxp[i] += packet_id*spp_eth; eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], rxp, spp_eth, fp->nb_antennas_rx); + + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] += spp_eth; + } *proc_timestamp = timestamp[0]; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index f29375dac3..252bdbb47c 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -411,7 +411,6 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth exit(-1); break; } - openair0_cfg[0].tx_scheduling_advance = eth_params->tx_scheduling_advance*openair0_cfg[0].samples_per_packet; } device->openair0_cfg=&openair0_cfg[0]; @@ -454,8 +453,6 @@ void dump_dev(openair0_device *device) { printf(" Log level is %i :\n" ,device->openair0_cfg->log_level); printf(" RB number: %i, sample rate: %lf \n" , device->openair0_cfg->num_rb_dl, device->openair0_cfg->sample_rate); - printf(" Scheduling_advance: %i, Sample_advance: %u \n" , - device->openair0_cfg->tx_scheduling_advance, device->openair0_cfg->tx_sample_advance); printf(" BBU configured for %i tx/%i rx channels)\n", device->openair0_cfg->tx_num_channels,device->openair0_cfg->rx_num_channels); printf(" Running flags: %s %s %s\n", diff --git a/targets/RT/USER/eNB_transport_IQ.c b/targets/RT/USER/eNB_transport_IQ.c index 86080c2c33..f09bdcaadc 100644 --- a/targets/RT/USER/eNB_transport_IQ.c +++ b/targets/RT/USER/eNB_transport_IQ.c @@ -710,14 +710,13 @@ static void check_dev_config( rrh_module_t *mod_enb) { printf("\n---------------------RF device configuration parameters---------------------\n"); - printf("\tMod_id=%d\n \tlog level=%d\n \tDL_RB=%d\n \tsamples_per_frame=%d\n \tsample_rate=%f\n \tsamples_per_packet=%d\n \ttx_scheduling_advance=%d\n \ttx_sample_advance=%d\n \trx_num_channels=%d\n \ttx_num_channels=%d\n \trx_freq_0=%f\n \ttx_freq_0=%f\n \trx_freq_1=%f\n \ttx_freq_1=%f\n \trx_freq_2=%f\n \ttx_freq_2=%f\n \trx_freq_3=%f\n \ttx_freq_3=%f\n \trxg_mode=%d\n \trx_gain_0=%f\n \ttx_gain_0=%f\n \trx_gain_1=%f\n \ttx_gain_1=%f\n \trx_gain_2=%f\n \ttx_gain_2=%f\n \trx_gain_3=%f\n \ttx_gain_3=%f\n \trx_gain_offset_2=%f\n \ttx_gain_offset_3=%f\n \trx_bw=%f\n \ttx_bw=%f\n \tautocal=%d\n", + printf("\tMod_id=%d\n \tlog level=%d\n \tDL_RB=%d\n \tsamples_per_frame=%d\n \tsample_rate=%f\n \tsamples_per_packet=%d\n \ttx_sample_advance=%d\n \trx_num_channels=%d\n \ttx_num_channels=%d\n \trx_freq_0=%f\n \ttx_freq_0=%f\n \trx_freq_1=%f\n \ttx_freq_1=%f\n \trx_freq_2=%f\n \ttx_freq_2=%f\n \trx_freq_3=%f\n \ttx_freq_3=%f\n \trxg_mode=%d\n \trx_gain_0=%f\n \ttx_gain_0=%f\n \trx_gain_1=%f\n \ttx_gain_1=%f\n \trx_gain_2=%f\n \ttx_gain_2=%f\n \trx_gain_3=%f\n \ttx_gain_3=%f\n \trx_gain_offset_2=%f\n \ttx_gain_offset_3=%f\n \trx_bw=%f\n \ttx_bw=%f\n \tautocal=%d\n", mod_enb->devs->openair0_cfg->Mod_id, mod_enb->devs->openair0_cfg->log_level, mod_enb->devs->openair0_cfg->num_rb_dl, mod_enb->devs->openair0_cfg->samples_per_frame, mod_enb->devs->openair0_cfg->sample_rate, mod_enb->devs->openair0_cfg->samples_per_packet, - mod_enb->devs->openair0_cfg->tx_scheduling_advance, mod_enb->devs->openair0_cfg->tx_sample_advance, mod_enb->devs->openair0_cfg->rx_num_channels, mod_enb->devs->openair0_cfg->tx_num_channels, diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 0d9002d849..d6103d709e 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1061,8 +1061,6 @@ static void* eNB_thread_FH( void* param ) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - - rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, &proc->timestamp_rx, rxp, @@ -1102,7 +1100,7 @@ static void* eNB_thread_FH( void* param ) { (eNB->node_function == eNodeB_3GPP_BBU)) { // acquisition from IF /// **** recv_IF5 of rxdata from RRH **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); - recv_IF5(eNB, &proc->timestamp_rx, proc->subframe_rx, IF5_RRH_GW_UL); + recv_IF5(eNB, &proc->timestamp_rx, subframe, IF5_RRH_GW_UL); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; @@ -1113,13 +1111,15 @@ static void* eNB_thread_FH( void* param ) { LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); exit_fun("Exiting"); } - + if (proc->frame_rx != frame) { LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); exit_fun("Exiting"); } } else { proc->first_rx = 0; + frame = proc->frame_rx; + subframe = proc->subframe_rx; } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); From 032806725ec79e5b0911d8bab96c7a032bbfb96c Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 27 Jul 2016 08:43:35 +0200 Subject: [PATCH 136/340] moving of trx_write in eNB_thread_FH to avoit conflicts with trx_read --- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- .../CONF/enb.band7.tm1.50PRB.usrpb210.conf | 2 +- .../CONF/enb.band7.tm1.usrpb210.conf | 14 +++---- targets/RT/USER/lte-enb.c | 38 +++++++++++++++++-- targets/RT/USER/lte-softmodem.c | 4 +- 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6966c3cb90..2407061f8e 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1931,7 +1931,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits eNB->UE_stats[(uint32_t)UE_id].sector = 0; - LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", + LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, frame, diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index d2e99a3481..0a9b61546b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -31,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf index 7ec2264444..c73c4ef809 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -17,7 +17,7 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "92"; + mobile_network_code = "93"; ////////// Physical parameters: @@ -34,7 +34,7 @@ eNBs = downlink_frequency = 2660000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; - N_RB_DL = 50; + N_RB_DL = 25; Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; @@ -133,7 +133,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.26"; + mme_ip_address = ( { ipv4 = "127.0.0.3"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -142,11 +142,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth1"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.147/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth1"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.147/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 0d9002d849..fc0b8b8cf5 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -550,6 +550,7 @@ static void* eNB_thread_rxtx( void* param ) { */ + /* // eNodeB_3GPP, RRU write to RF device if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) || @@ -576,13 +577,15 @@ static void* eNB_thread_rxtx( void* param ) { LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti); exit_fun( "problem transmitting samples" ); } - } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { + } + */ + if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { /// **** send_IF5 of txdata to RRH **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); - } else { + } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4) { /// **** send_IF4 of txdataF to RRU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0); @@ -854,8 +857,8 @@ static void* eNB_thread_FH( void* param ) { eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - void *rxp[fp->nb_antennas_rx]; - unsigned int rxs; + void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; + unsigned int rxs,txs; FILE *rx_time_file = NULL; char rx_time_name[101]; struct timespec wait; @@ -1055,7 +1058,34 @@ static void* eNB_thread_FH( void* param ) { ((eNB->node_function == NGFI_RRU_IF4) || (eNB->node_function == NGFI_RRU_IF5) || (eNB->node_function == eNodeB_3GPP))) { // acquisition from RF + + if (proc->first_rx==0) { + + // Transmit TX buffer based on timestamp from RX + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + + for (i=0; iframe_parms.nb_antennas_tx; i++) + txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][((proc->subframe_rx+3)%10)*fp->samples_per_tti]; + + txs = PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, + proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, + txp, + fp->samples_per_tti, + fp->nb_antennas_tx, + 1); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + + if (txs != PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); + exit_fun( "problem transmitting samples" ); + } + } + for (i=0; inb_antennas_rx; i++) rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 5db0451c4c..a3984f75d9 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -525,8 +525,8 @@ static void *scope_thread(void *arg) ue_cnt=0; for(UE_id=0; UE_iddlsch[UE_id][0]->rnti>0) && (ue_cntdlsch[UE_id][0]->rnti>0) && (ue_cnt Date: Wed, 27 Jul 2016 11:36:25 +0200 Subject: [PATCH 137/340] removed debugging trace for Detection of hypothesized PRACH preamble --- openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 2407061f8e..6966c3cb90 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1931,7 +1931,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits eNB->UE_stats[(uint32_t)UE_id].sector = 0; - LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", + LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, frame, From bf6428cf38012b3dab14072bed3e2d69f454b5fa Mon Sep 17 00:00:00 2001 From: Sandeep Kumar Date: Wed, 27 Jul 2016 17:16:05 +0200 Subject: [PATCH 138/340] add rcc/rru conf files --- .../CONF/rcc.band7.tm1.usrpb210.conf | 190 ++++++++++++++++++ .../CONF/rru.band7.tm1.usrpb210.conf | 190 ++++++++++++++++++ 2 files changed, 380 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf new file mode 100644 index 0000000000..20cc9189bb --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RCC_IF4"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth2"; + remote_address = "00:13:95:1f:a0:af"; + local_address = "90:e2:ba:c5:fc:04"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf new file mode 100644 index 0000000000..f828dfb1c7 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF4"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "90:e2:ba:c5:fc:04"; + local_address = "00:13:95:1f:a0:af"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); From a2ea484cd8e2a26b0a90599f6f15e24c8a68f6e9 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 27 Jul 2016 22:59:27 +0200 Subject: [PATCH 139/340] remove gitlab CI detection of error logging --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f2d95d4b7..a7605ea29b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -33,5 +33,4 @@ job1: - sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $EXTERNAL_SHARE_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$EXTERNAL_SHARE_DIR - cat $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml - exce_log=`egrep -i 'warning|error|critical|exception' $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest.log |cat ` - - if [ -n "$exce_log" ]; then echo -e "\e[31mThere are errors in $NFS_TEST_RESULTS_DIR/log/python_autotest.log. Please check the logs\e[0m" ; fi From 60f0d9ad46264c6b57126d78b5b9ead70ad6ff83 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 28 Jul 2016 12:27:54 +0200 Subject: [PATCH 140/340] bugfix --- openair1/SCHED/phy_procedures_lte_eNb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6966c3cb90..3f5c46e9ab 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1249,6 +1249,8 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, // Now loop again over the DCIs for UL configuration for (i=0; iNum_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { + dci_alloc = &DCI_pdu->dci_alloc[i]; + if (dci_alloc->format == format0) { // this is a ULSCH allocation if (eNB->mac_enabled==1) UE_id = find_ue((int16_t)dci_alloc->rnti,eNB); From 313acc6e96ab3fd8a58eb788b8602c59ed234a38 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 28 Jul 2016 15:58:54 +0200 Subject: [PATCH 141/340] fixes for the T --- .../LTE_ESTIMATION/lte_ul_channel_estimation.c | 2 +- openair1/PHY/LTE_TRANSPORT/phich.c | 2 +- openair1/PHY/LTE_TRANSPORT/pucch.c | 4 ++-- openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c | 4 ++-- openair1/SCHED/phy_procedures_lte_eNb.c | 17 +++++++++++------ targets/RT/USER/lte-enb.c | 2 ++ targets/RT/USER/lte-softmodem.c | 5 +++-- 7 files changed, 22 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index 3112350d85..68bbf3e001 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -335,7 +335,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB, #if T_TRACER if (aa == 0) T(T_ENB_PHY_UL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(UE_id), - T_INT(phy_vars_eNB->proc[sched_subframe].frame_rx), T_INT(subframe), + T_INT(proc->frame_rx), T_INT(subframe), T_INT(0), T_BUFFER(ul_ch_estimates_time[0], 512 * 4)); #endif diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index e0aa5d3ee0..d5dff4ef30 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1511,7 +1511,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, if ((ulsch[UE_id]->harq_processes[harq_pid]->dci_alloc == 0) && (ulsch[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) { if (ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) { - T(T_ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION, T_INT(eNB->Mod_id), T_INT(eNB->proc->frame_tx), + T(T_ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(subframe), T_INT(UE_id), T_INT(ulsch[UE_id]->rnti), T_INT(harq_pid)); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n", eNB->Mod_id,harq_pid,proc->frame_tx,subframe); diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index cb7803fbfc..9b9693c82f 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -802,7 +802,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, eNB->pucch1_stats_thres[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres; eNB->pucch1_stats_cnt[UE_id][subframe] = (eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023; - T(T_ENB_PHY_PUCCH_1_ENERGY, T_INT(phy_vars_eNB->Mod_id), T_INT(UE_id), T_INT(frame), T_INT(subframe), + T(T_ENB_PHY_PUCCH_1_ENERGY, T_INT(eNB->Mod_id), T_INT(UE_id), T_INT(frame), T_INT(subframe), T_INT(stat_max), T_INT(sigma2_dB+pucch1_thres)); /* @@ -1047,7 +1047,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; /* frame not available here - set to -1 for the moment */ - T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(phy_vars_eNB->Mod_id), T_INT(UE_id), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im)); + T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(eNB->Mod_id), T_INT(UE_id), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im)); *payload = (stat_re<0) ? 1 : 0; diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index c396cdf6fa..16cd847016 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1842,10 +1842,10 @@ void rx_ulsch(PHY_VARS_eNB *eNB, llrp = (int16_t*)&pusch_vars->llr[0]; - T(T_ENB_PHY_PUSCH_IQ, T_INT(eNB_id), T_INT(UE_id), T_INT(phy_vars_eNB->proc[sched_subframe].frame_rx), + T(T_ENB_PHY_PUSCH_IQ, T_INT(eNB_id), T_INT(UE_id), T_INT(proc->frame_rx), T_INT(subframe), T_INT(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb), T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti), - T_BUFFER(eNB_pusch_vars->rxdataF_comp[eNB_id][0], + T_BUFFER(pusch_vars->rxdataF_comp[eNB_id][0], 2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_tti*2)); for (l=0; lsymbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active; l++) { diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 3f5c46e9ab..314aaa4de9 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -767,6 +767,10 @@ void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC eNB->Mod_id,dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->current_harq_pid,frame,subframe); + T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), + T_INT(dci_alloc->rnti), T_INT(dci_alloc->format), + T_INT(eNB->dlsch[(int)UE_id][0]->current_harq_pid)); + eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE; LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,frame,subframe, @@ -858,6 +862,9 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC else eNB->ulsch[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + T(T_ENB_PHY_ULSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), + T_INT(dci_alloc->rnti), T_INT(harq_pid)); + } void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols,int abstraction_flag) { @@ -997,11 +1004,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *d #ifdef DEBUG_DLSCH LOG_T(PHY,"eNB DLSCH SDU: \n"); - T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), - T_INT(DCI_pdu->dci_alloc[i].rnti), T_INT(DCI_pdu->dci_alloc[i].format), - T_INT(eNB->dlsch[(int)UE_id][0]->current_harq_pid)); - - eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; + //eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe, DCI_pdu->dci_alloc[i].rnti,eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe],DCI_pdu->dci_alloc[i].firstCCE); @@ -1108,6 +1111,8 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+(subframe&1),1); start_meas(&eNB->phy_proc_tx); + T(T_ENB_PHY_DL_TICK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe)); + for (i=0; iMod_id), T_INT(frame), T_INT(subframe)); T(T_ENB_PHY_INPUT_SIGNAL, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(0), - T_BUFFER(&eNB->lte_eNB_common_vars.rxdata[0][0][subframe*eNB->frame_parms.samples_per_tti], + T_BUFFER(&eNB->common_vars.rxdata[0][0][subframe*eNB->frame_parms.samples_per_tti], eNB->frame_parms.samples_per_tti * 4)); eNB->rb_mask_ul[0]=0; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 94afcb15f7..5be00337af 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1201,6 +1201,8 @@ static void* eNB_thread_FH( void* param ) { AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); } + T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); + // At this point, all information for subframe has been received on FH interface // If this proc is to provide synchronization, do so for (i=0;inum_slaves;i++) { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index a3984f75d9..9c3ec6fb99 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -682,11 +682,11 @@ static void get_options (int argc, char **argv) LONG_OPTION_DUMP_FRAME, LONG_OPTION_LOOPMEMORY, LONG_OPTION_PHYTEST, - LONG_OPTION_MMAPPED_DMA + LONG_OPTION_MMAPPED_DMA, #if T_TRACER - , LONG_OPTION_T_PORT, LONG_OPTION_T_NOWAIT, + LONG_OPTION_T_DONT_FORK, #endif }; @@ -710,6 +710,7 @@ static void get_options (int argc, char **argv) #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, + {"T_dont_fork", no_argument, 0, LONG_OPTION_T_DONT_FORK}, #endif {NULL, 0, NULL, 0} }; From f9d43daa3a0df3500e2630c522968baf434f51f3 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 29 Jul 2016 11:39:24 +0200 Subject: [PATCH 142/340] bugfix --- targets/RT/USER/lte-enb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 5be00337af..f18e1090cc 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -109,6 +109,8 @@ unsigned short config_frames[4] = {2,9,11,13}; # endif #endif +#include "T.h" + //#define DEBUG_THREADS 1 //#define USRP_DEBUG 1 From f33e9a702791f949d161e9a0f40fac7a0382b3af Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Fri, 29 Jul 2016 21:56:40 +0200 Subject: [PATCH 143/340] do not exit immediately in case of busy thread 5ms by default, easy to change (change the 10 in the loops) if the behavior is worse than before, do git revert [commit ID] --- openair1/SCHED/phy_procedures_lte_eNb.c | 31 +++++++++++++---------- targets/RT/USER/lte-enb.c | 33 ++++++++++++++----------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 314aaa4de9..6be9ff2080 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2577,6 +2577,17 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl // check if we have to detect PRACH first if ((eNB->node_function != NGFI_RRU_IF5) && (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0)) { // any other node must call prach procedure + /* accept some delay in processing - up to 5ms */ + int i; + for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) { + LOG_W(PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,proc->instance_cnt_prach); + usleep(500); + } + if (proc->instance_cnt_prach == 0) { + exit_fun( "PRACH thread busy" ); + return; + } + // wake up thread for PRACH RX if (pthread_mutex_lock(&proc->mutex_prach) != 0) { LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); @@ -2584,25 +2595,19 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl return; } - int cnt_prach = ++proc->instance_cnt_prach; + ++proc->instance_cnt_prach; // set timing for prach thread proc->frame_prach = proc->frame_rx; proc->subframe_prach = proc->subframe_rx; - pthread_mutex_unlock( &proc->mutex_prach ); - - if (cnt_prach == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc->cond_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); - exit_fun( "ERROR pthread_cond_signal" ); - return; - } - } else { - LOG_W( PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,cnt_prach); - exit_fun( "PRACH thread busy" ); + // the thread can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); return; } + + pthread_mutex_unlock( &proc->mutex_prach ); } } else { // grab transport channel information from network interface diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index f18e1090cc..ac552e82fe 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1242,6 +1242,16 @@ static void* eNB_thread_FH( void* param ) { // choose even or odd thread for RXn-TXnp4 processing eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[proc->subframe_rx&1]; + /* accept some delay in processing - up to 5ms */ + for (i = 0; i < 10 && proc_rxtx->instance_cnt_rxtx == 0; i++) { + LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, proc_rxtx->instance_cnt_rxtx); + usleep(500); + } + if (proc_rxtx->instance_cnt_rxtx == 0) { + exit_fun( "TX thread busy" ); + break; + } + // wake up TX for subframe n+4 // lock the TX mutex and make sure the thread is ready if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) { @@ -1249,7 +1259,8 @@ static void* eNB_thread_FH( void* param ) { exit_fun( "error locking mutex_rxtx" ); break; } - int cnt_rxtx = ++proc_rxtx->instance_cnt_rxtx; + + ++proc_rxtx->instance_cnt_rxtx; // We have just received and processed the common part of a subframe, say n. // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired @@ -1263,20 +1274,14 @@ static void* eNB_thread_FH( void* param ) { proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > 5) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + 4)%10; - pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); - - if (cnt_rxtx == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, cnt_rxtx ); - exit_fun( "TX thread busy" ); + // the thread can now be woken up + if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); break; - } + } + + pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); stop_meas( &softmodem_stats_rxtx_sf ); #ifdef DEADLINE_SCHEDULER From 025f56d28b6c085ef0e4ab433f8c4b08bc72c71a Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 10:28:56 +0200 Subject: [PATCH 144/340] node function interfaces via function pointers. Suggestions from L. Thomas, B. Mongazon, C. Roux. --- openair1/PHY/INIT/lte_init.c | 20 +- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 98 +- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 26 +- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 10 +- openair1/PHY/LTE_TRANSPORT/phich.c | 5 +- openair1/PHY/LTE_TRANSPORT/pmch.c | 8 +- openair1/PHY/LTE_TRANSPORT/prach.c | 12 +- openair1/PHY/LTE_TRANSPORT/proto.h | 9 +- openair1/PHY/defs.h | 40 +- openair1/SCHED/defs.h | 17 +- openair1/SCHED/phy_procedures_lte_eNb.c | 288 +++--- openair2/ENB_APP/enb_config.c | 10 +- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 32 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 32 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 8 +- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 12 +- targets/RT/USER/lte-enb.c | 877 ++++++++++-------- targets/RT/USER/lte-softmodem.c | 8 +- 18 files changed, 788 insertions(+), 724 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index a453b8eb8d..d583381781 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1167,7 +1167,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, frame_parms->phich_config_common.phich_duration); LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_eNB][MOD %02"PRIu8"][]\n", eNB->Mod_id); - if (eNB->node_function != NGFI_RRU_IF4) { + if (eNB->node_function != NGFI_RRU_IF4p5) { lte_gold(frame_parms,eNB->lte_gold_table,frame_parms->Nid_cell); generate_pcfich_reg_mapping(frame_parms); generate_phich_reg_mapping(frame_parms); @@ -1191,12 +1191,12 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, if (abstraction_flag==0) { // TX vars - if (eNB->node_function != NGFI_RCC_IF4) + if (eNB->node_function != NGFI_RCC_IF4p5) common_vars->txdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); common_vars->txdataF[eNB_id] = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); for (i=0; inb_antennas_tx; i++) { - if (eNB->node_function != NGFI_RCC_IF4) + if (eNB->node_function != NGFI_RCC_IF4p5) common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); #ifdef DEBUG_PHY @@ -1208,14 +1208,14 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, } // RX vars - if (eNB->node_function != NGFI_RCC_IF4) { + if (eNB->node_function != NGFI_RCC_IF4p5) { common_vars->rxdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); } common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); for (i=0; inb_antennas_rx; i++) { - if (eNB->node_function != NGFI_RCC_IF4) { + if (eNB->node_function != NGFI_RCC_IF4p5) { common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->samples_per_tti*sizeof(int32_t) ); } @@ -1227,7 +1227,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, #endif } - if (eNB->node_function != NGFI_RRU_IF4) { + if (eNB->node_function != NGFI_RRU_IF4p5) { // Channel estimates for SRS for (UE_id=0; UE_idnode_function != NGFI_RRU_IF4) { + if (eNB->node_function != NGFI_RRU_IF4p5) { generate_ul_ref_sigs_rx(); // SRS @@ -1264,7 +1264,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, // ULSCH VARS, skip if NFGI_RRU_IF4 - if (eNB->node_function!=NGFI_RRU_IF4) + if (eNB->node_function!=NGFI_RRU_IF4p5) prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) ); /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */ @@ -1277,7 +1277,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, #endif } - if (eNB->node_function != NGFI_RRU_IF4) { + if (eNB->node_function != NGFI_RRU_IF4p5) { AssertFatal(frame_parms->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]), "nb_antennas_rx too large"); for (i=0; inb_antennas_rx; i++) { @@ -1399,7 +1399,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration init_prach_tables(839); - } // node_function != NGFI_RRU_IF4 + } // node_function != NGFI_RRU_IF4p5 return (0); } diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index d492af16a7..738fe842b6 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -42,9 +42,9 @@ #include "PHY/TOOLS/alaw_lut.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" +#include "UTIL/LOG/vcd_signal_dumper.h" - -void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int k) { +void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, int k) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; @@ -57,16 +57,18 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, uint16_t *data_block=NULL, *i=NULL; - if (packet_type == IF4_PDLFFT) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); + + if (packet_type == IF4p5_PDLFFT) { db_fulllength = 12*fp->N_RB_DL; db_halflength = (db_fulllength)>>1; slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - IF4_header_t *dl_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); + IF4p5_header_t *dl_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); - gen_IF4_dl_header(dl_header, frame, subframe); + gen_IF4p5_dl_header(dl_header, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { @@ -86,23 +88,23 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, &tx_buffer, db_fulllength, 1, - IF4_PDLFFT)) < 0) { - perror("ETHERNET write for IF4_PDLFFT\n"); + IF4p5_PDLFFT)) < 0) { + perror("ETHERNET write for IF4p5_PDLFFT\n"); } slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; } - } else if (packet_type == IF4_PULFFT) { + } else if (packet_type == IF4p5_PULFFT) { db_fulllength = 12*fp->N_RB_UL; db_halflength = (db_fulllength)>>1; slotoffsetF = 1; blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; - IF4_header_t *ul_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); + IF4p5_header_t *ul_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); - gen_IF4_ul_header(ul_header, frame, subframe); + gen_IF4p5_ul_header(ul_header, frame, subframe); for (symbol_id=0; symbol_idsymbols_per_tti; symbol_id++) { @@ -122,23 +124,23 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, &tx_buffer, db_fulllength, 1, - IF4_PULFFT)) < 0) { - perror("ETHERNET write for IF4_PULFFT\n"); + IF4p5_PULFFT)) < 0) { + perror("ETHERNET write for IF4p5_PULFFT\n"); } slotoffsetF += fp->ofdm_symbol_size; blockoffsetF += fp->ofdm_symbol_size; } - } else if (packet_type == IF4_PRACH) { + } else if (packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length db_fulllength = 839*2; - IF4_header_t *prach_header = (IF4_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t); + IF4p5_header_t *prach_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); - gen_IF4_prach_header(prach_header, frame, subframe); + gen_IF4p5_prach_header(prach_header, frame, subframe); - memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t), + memcpy((int16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t), (&rxsigF[0][k]), db_fulllength*sizeof(int16_t)); @@ -147,18 +149,19 @@ void send_IF4(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type, &tx_buffer, db_fulllength, 1, - IF4_PRACH)) < 0) { - perror("ETHERNET write for IF4_PRACH\n"); + IF4p5_PRACH)) < 0) { + perror("ETHERNET write for IF4p5_PRACH\n"); } } else { - AssertFatal(1==0, "send_IF4 - Unknown packet_type %x", packet_type); + AssertFatal(1==0, "send_IF4p5 - Unknown packet_type %x", packet_type); } - + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); return; } -void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) { +void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int32_t **txdataF = eNB->common_vars.txdataF[0]; int32_t **rxdataF = eNB->common_vars.rxdataF[0]; @@ -168,15 +171,17 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ uint16_t element_id; uint16_t db_fulllength, db_halflength; int slotoffsetF=0, blockoffsetF=0; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - if (eNB->node_function == NGFI_RRU_IF4) { + if (eNB->node_function == NGFI_RRU_IF4p5) { db_fulllength = (12*fp->N_RB_DL); } else { db_fulllength = (12*fp->N_RB_UL); } db_halflength = db_fulllength>>1; - IF4_header_t *packet_header=NULL; + IF4p5_header_t *packet_header=NULL; uint16_t *data_block=NULL, *i=NULL; if (eNB->ifdevice.trx_read_func(&eNB->ifdevice, @@ -187,13 +192,13 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ perror("ETHERNET read"); } - packet_header = (IF4_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); - data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t); + packet_header = (IF4p5_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t); *frame = ((packet_header->frame_status)>>6)&0xffff; *subframe = ((packet_header->frame_status)>>22)&0x000f; - if (*packet_type == IF4_PDLFFT) { + if (*packet_type == IF4p5_PDLFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; @@ -209,7 +214,7 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ *(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ]; } - } else if (*packet_type == IF4_PULFFT) { + } else if (*packet_type == IF4p5_PULFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + 1; @@ -225,25 +230,26 @@ void recv_IF4(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_typ *(i+1) = alaw2lin[ (data_block[element_id+db_halflength]>>8) ]; } - } else if (*packet_type == IF4_PRACH) { + } else if (*packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length db_fulllength = 839*2; memcpy((&rxsigF[0][0]), - (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4_header_t), + (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t), db_fulllength*sizeof(int16_t)); } else { - AssertFatal(1==0, "recv_IF4 - Unknown packet_type %x", *packet_type); + AssertFatal(1==0, "recv_IF4p5 - Unknown packet_type %x", *packet_type); } - + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); return; } -void gen_IF4_dl_header(IF4_header_t *dl_packet, int frame, int subframe) { - dl_packet->type = IF4_PACKET_TYPE; - dl_packet->sub_type = IF4_PDLFFT; +void gen_IF4p5_dl_header(IF4p5_header_t *dl_packet, int frame, int subframe) { + dl_packet->type = IF4p5_PACKET_TYPE; + dl_packet->sub_type = IF4p5_PDLFFT; dl_packet->rsvd = 0; @@ -254,9 +260,9 @@ void gen_IF4_dl_header(IF4_header_t *dl_packet, int frame, int subframe) { } -void gen_IF4_ul_header(IF4_header_t *ul_packet, int frame, int subframe) { - ul_packet->type = IF4_PACKET_TYPE; - ul_packet->sub_type = IF4_PULFFT; +void gen_IF4p5_ul_header(IF4p5_header_t *ul_packet, int frame, int subframe) { + ul_packet->type = IF4p5_PACKET_TYPE; + ul_packet->sub_type = IF4p5_PULFFT; ul_packet->rsvd = 0; @@ -267,9 +273,9 @@ void gen_IF4_ul_header(IF4_header_t *ul_packet, int frame, int subframe) { } -void gen_IF4_prach_header(IF4_header_t *prach_packet, int frame, int subframe) { - prach_packet->type = IF4_PACKET_TYPE; - prach_packet->sub_type = IF4_PRACH; +void gen_IF4p5_prach_header(IF4p5_header_t *prach_packet, int frame, int subframe) { + prach_packet->type = IF4p5_PACKET_TYPE; + prach_packet->sub_type = IF4p5_PRACH; prach_packet->rsvd = 0; @@ -280,8 +286,8 @@ void gen_IF4_prach_header(IF4_header_t *prach_packet, int frame, int subframe) { } -void malloc_IF4_buffer(PHY_VARS_eNB *eNB) { +void malloc_IF4p5_buffer(PHY_VARS_eNB *eNB) { // Keep the size large enough - eNB->ifbuffer.tx = malloc(RAW_IF4_PRACH_SIZE_BYTES); - eNB->ifbuffer.rx = malloc(RAW_IF4_PRACH_SIZE_BYTES); + eNB->ifbuffer.tx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + eNB->ifbuffer.rx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); } diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index 7276d97efa..95798e5bb8 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -41,12 +41,12 @@ #include "PHY/defs.h" /// Macro for IF4 packet type -#define IF4_PACKET_TYPE 0x080A -#define IF4_PULFFT 0x0019 -#define IF4_PDLFFT 0x0020 -#define IF4_PRACH 0x0021 +#define IF4p5_PACKET_TYPE 0x080A +#define IF4p5_PULFFT 0x0019 +#define IF4p5_PDLFFT 0x0020 +#define IF4p5_PRACH 0x0021 -struct IF4_header { +struct IF4p5_header { /// Type uint16_t type; /// Sub-Type @@ -58,17 +58,17 @@ struct IF4_header { } __attribute__ ((__packed__)); -typedef struct IF4_header IF4_header_t; -#define sizeof_IF4_header_t 12 +typedef struct IF4p5_header IF4p5_header_t; +#define sizeof_IF4p5_header_t 12 -void gen_IF4_dl_header(IF4_header_t*, int, int); +void gen_IF4p5_dl_header(IF4p5_header_t*, int, int); -void gen_IF4_ul_header(IF4_header_t*, int, int); +void gen_IF4p5_ul_header(IF4p5_header_t*, int, int); -void gen_IF4_prach_header(IF4_header_t*, int, int); +void gen_IF4p5_prach_header(IF4p5_header_t*, int, int); -void send_IF4(PHY_VARS_eNB*, int, int, uint16_t, int); +void send_IF4p5(PHY_VARS_eNB*, int, int, uint16_t, int); -void recv_IF4(PHY_VARS_eNB*, int*, int*, uint16_t*, uint32_t*); +void recv_IF4p5(PHY_VARS_eNB*, int*, int*, uint16_t*, uint32_t*); -void malloc_IF4_buffer(PHY_VARS_eNB*); +void malloc_IF4p5_buffer(PHY_VARS_eNB*); diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 59a3e70cd6..92d516d7e8 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -41,7 +41,7 @@ #include "PHY/defs.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" - +#include "UTIL/LOG/vcd_signal_dumper.h" void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe, uint8_t *seqno, uint16_t packet_type) { @@ -54,6 +54,8 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe uint32_t spp_eth = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_packet; uint32_t spsf = (uint32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); + if (packet_type == IF5_RRH_GW_DL) { for (i=0; i < fp->nb_antennas_tx; i++) @@ -143,6 +145,8 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe } free(tx_buffer); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); + return; } @@ -158,6 +162,8 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram int32_t spsf = (int32_t) eNB->ifdevice.openair0_cfg->samples_per_frame/10; openair0_timestamp timestamp[spsf / spp_eth]; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); if (packet_type == IF5_RRH_GW_DL) { @@ -205,6 +211,8 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram } else { AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type); } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); return; } diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index d5dff4ef30..b3b4545350 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1424,8 +1424,7 @@ void rx_phich(PHY_VARS_UE *ue, void generate_phich_top(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, int16_t amp, - uint8_t sect_id, - uint8_t abstraction_flag) + uint8_t sect_id) { @@ -1486,7 +1485,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB, ulsch[UE_id]->harq_processes[harq_pid]->first_rb); } - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { generate_phich(frame_parms, amp,//amp*2, nseq_PHICH, diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 325e0918a5..93922207bb 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -190,7 +190,7 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par return(0); } -void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx, int abstraction_flag) +void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx) { LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_MCH; @@ -227,7 +227,7 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx, int abstrac break; } - if (abstraction_flag) { + if (eNB->abstraction_flag) { eNB_transport_info[eNB->Mod_id][eNB->CC_id].cntl.pmch_flag=1; eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_common_dci=0; @@ -286,13 +286,13 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id) } } -void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a,int abstraction_flag) +void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a) { int G; int subframe = proc->subframe_tx; - if (abstraction_flag != 0) { + if (eNB->abstraction_flag != 0) { if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0) printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]); diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 471b572a56..dfdf4ed470 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1183,7 +1183,7 @@ void rx_prach(PHY_VARS_eNB *eNB, if ((eNB->node_function == eNodeB_3GPP) || - (eNB->node_function == NGFI_RRU_IF4)) { // compute the DFTs of the PRACH temporal resources + (eNB->node_function == NGFI_RRU_IF4p5)) { // compute the DFTs of the PRACH temporal resources // Do forward transform for (aa=0; aanode_function == NGFI_RRU_IF4) { + if (eNB->node_function == NGFI_RRU_IF4p5) { k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; if (k<0) { @@ -1281,12 +1281,10 @@ void rx_prach(PHY_VARS_eNB *eNB, k*=2; /// **** send_IF4 of rxsigF to RCC **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - send_IF4(eNB, eNB->proc.frame_rx, eNB->proc.subframe_rx, IF4_PRACH, k); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + send_IF4p5(eNB, eNB->proc.frame_rx, eNB->proc.subframe_rx, IF4p5_PRACH, k); return; - } else if (eNB->node_function == NGFI_RCC_IF4) { + } else if (eNB->node_function == NGFI_RCC_IF4p5) { k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; if (k<0) { @@ -1305,7 +1303,7 @@ void rx_prach(PHY_VARS_eNB *eNB, // in case of RCC and prach received rx_thread wakes up prach - // here onwards is for eNodeB_3GPP or NGFI_RCC_IF4 + // here onwards is for eNodeB_3GPP or NGFI_RCC_IF4p5 preamble_offset_old = 99; diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 6993dd18c0..c3922b13d5 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -232,7 +232,7 @@ int mch_modulation(int32_t **txdataF, @param abstraction_flag */ -void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a,int abstraction_flag); +void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a); /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals) @param phy_vars_eNB Pointer to eNB variables @@ -240,10 +240,8 @@ void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a,in @param mcs MCS for MBSFN @param ndi new data indicator @param rdvix - @param abstraction_flag - */ -void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx,int abstraction_flag); +void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx); /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals) @param phy_vars_ue Pointer to UE variables @@ -1546,8 +1544,7 @@ uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, eNB_rxtx_proc_t *proc, int16_t amp, - uint8_t sect_id, - uint8_t abstraction_flag); + uint8_t sect_id); /* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters. @param phy_vars_ue Pointer to UE variables diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 3b3f277894..7bcc3810ae 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -161,8 +161,9 @@ typedef enum { eNodeB_3GPP=0, // classical eNodeB function eNodeB_3GPP_BBU, // eNodeB with NGFI IF5 NGFI_RRU_IF5, // NGFI_RRU with IF5 - NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) - NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) + NGFI_RRU_IF4p5, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4p5) + NGFI_RCC_IF4p5, // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4p5) + NGFI_RAU_IF4p5 } eNB_func_t; typedef enum { @@ -187,6 +188,20 @@ typedef struct ral_threshold_phy_s { } ral_threshold_phy_t; #endif +/// Top-level PHY Data Structure for RN +typedef struct { + /// Module ID indicator for this instance + uint8_t Mod_id; + uint32_t frame; + // phy_vars_eNB + // phy_vars ue + // cuurently only used to store and forward the PMCH + uint8_t mch_avtive[10]; + uint8_t sync_area[10]; // num SF + LTE_UE_DLSCH_t *dlsch_rn_MCH[10]; + +} PHY_VARS_RN; + /// Context data structure for RX/TX portion of subframe processing typedef struct { /// Component Carrier index @@ -340,6 +355,15 @@ typedef struct PHY_VARS_eNB_s { eNB_proc_t proc; eNB_func_t node_function; eNB_timing_t node_timing; + int abstraction_flag; + void (*do_prach)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc); + void (*fep)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc); + void (*proc_uespec_rx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type); + void (*proc_tx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *rn); + void (*tx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc); + void (*rx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc,int *frame, int *subframe); + int (*start_rf)(struct PHY_VARS_eNB_s *eNB); + int (*start_if)(struct PHY_VARS_eNB_s *eNB); uint8_t local_flag; uint32_t rx_total_gain_dB; LTE_DL_FRAME_PARMS frame_parms; @@ -785,19 +809,7 @@ typedef struct { #endif } PHY_VARS_UE; -/// Top-level PHY Data Structure for RN -typedef struct { - /// Module ID indicator for this instance - uint8_t Mod_id; - uint32_t frame; - // phy_vars_eNB - // phy_vars ue - // cuurently only used to store and forward the PMCH - uint8_t mch_avtive[10]; - uint8_t sync_area[10]; // num SF - LTE_UE_DLSCH_t *dlsch_rn_MCH[10]; -} PHY_VARS_RN; #include "PHY/INIT/defs.h" #include "PHY/LTE_REFSIG/defs.h" diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 279703b78a..a9f8633e30 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -164,20 +164,18 @@ void phy_procedures_UE_S_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abst @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param phy_vars_rn pointer to the RN variables */ -void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); /*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes. @param phy_vars_eNB Pointer to eNB variables on which to act @param proc Pointer to RXn-TXnp4 proc information - @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type); /*! \brief Scheduling for eNB TX procedures in TDD S-subframes. @param phy_vars_eNB Pointer to eNB variables on which to act @param proc Pointer to RXn-TXnp4 proc information - @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ @@ -185,29 +183,26 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *pr @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction */ -void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag); +void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB); /*! \brief Scheduling for eNB TX procedures in TDD S-subframes. @param phy_vars_eNB Pointer to eNB variables on which to act - @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,relaying_type_t r_type); /*! \brief Scheduling for eNB RX procedures in TDD S-subframes. @param phy_vars_eNB Pointer to eNB variables on which to act - @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type); /*! \brief Scheduling for eNB PRACH RX procedures @param phy_vars_eNB Pointer to eNB variables on which to act @param proc Pointer to RXn-TXnp4 proc information - @param abstraction_flag Indicator of PHY abstraction */ -void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag); +void prach_procedures(PHY_VARS_eNB *eNB); /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index. @param frame_parms Pointer to DL frame parameter descriptor diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6be9ff2080..593d2b61fb 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -180,7 +180,7 @@ int32_t add_ue(int16_t rnti, PHY_VARS_eNB *eNB) int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { uint8_t i; - int j,CC_id; + int CC_id; PHY_VARS_eNB *eNB; for (CC_id=0;CC_idsubframe_rx; @@ -305,7 +305,7 @@ void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t abs #endif - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { lte_eNB_I0_measurements(eNB, subframe, 0, @@ -392,7 +392,7 @@ unsigned int taus(void); DCI_PDU DCI_pdu_tmp; -void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, int abstraction_flag,relaying_type_t r_type) { +void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,relaying_type_t r_type) { #ifdef Rel10 @@ -403,7 +403,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, in int subframe = proc->subframe_tx; - if (abstraction_flag==0) { + if (eNB->abstraction_flag==0) { // This is DL-Cell spec pilots in Control region generate_pilots_slot(eNB, eNB->common_vars.txdataF[0], @@ -464,9 +464,9 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, in }// switch if (mch_pduP) { - fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag); + fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0); // Generate PMCH - generate_mch(eNB,proc,(uint8_t*)mch_pduP->payload,abstraction_flag); + generate_mch(eNB,proc,(uint8_t*)mch_pduP->payload); } else { LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",proc->frame_tx,subframe); } @@ -474,7 +474,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn, in #endif } -void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstraction_flag) { +void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; int **txdataF = eNB->common_vars.txdataF[0]; @@ -483,7 +483,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr int frame = proc->frame_tx; // generate Cell-Specific Reference Signals for both slots - if (abstraction_flag==0) { + if (eNB->abstraction_flag==0) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); generate_pilots_slot(eNB, txdataF, @@ -502,7 +502,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr // First half of PSS/SSS (FDD, slot 0) if (subframe == 0) { if ((fp->frame_type == FDD) && - (abstraction_flag==0)) { + (eNB->abstraction_flag==0)) { generate_pss(txdataF, AMP, fp, @@ -585,7 +585,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr /// First half of SSS (TDD, slot 1) if ((fp->frame_type == TDD)&& - (abstraction_flag==0)){ + (eNB->abstraction_flag==0)){ generate_sss(txdataF, AMP, fp, @@ -594,7 +594,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr } /// generate PBCH - if (abstraction_flag==0) { + if (eNB->abstraction_flag==0) { generate_pbch(&eNB->pbch, txdataF, AMP, @@ -611,7 +611,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr } else if ((subframe == 1) && (fp->frame_type == TDD)&& - (abstraction_flag==0)) { + (eNB->abstraction_flag==0)) { generate_pss(txdataF, AMP, fp, @@ -622,7 +622,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr // Second half of PSS/SSS (FDD, slot 10) else if ((subframe == 5) && (fp->frame_type == FDD) && - (abstraction_flag==0)) { + (eNB->abstraction_flag==0)) { generate_pss(txdataF, AMP, &eNB->frame_parms, @@ -639,7 +639,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr // Second-half of SSS (TDD, slot 11) else if ((subframe == 5) && (fp->frame_type == TDD) && - (abstraction_flag==0)) { + (eNB->abstraction_flag==0)) { generate_sss(txdataF, AMP, fp, @@ -650,7 +650,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int abstr // Second half of PSS (TDD, slot 12) else if ((subframe == 6) && (fp->frame_type == TDD) && - (abstraction_flag==0)) { + (eNB->abstraction_flag==0)) { generate_pss(txdataF, AMP, fp, @@ -867,7 +867,7 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC } -void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols,int abstraction_flag) { +void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols) { int frame=proc->frame_tx; int subframe=proc->subframe_tx; @@ -1025,7 +1025,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *d #endif } - if (abstraction_flag==0) { + if (eNB->abstraction_flag==0) { LOG_D(PHY,"Generating DLSCH/PDSCH %d\n",ra_flag); // 36-212 @@ -1083,7 +1083,6 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,LTE_eNB_DLSCH_t *d void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, - uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *rn) { @@ -1145,7 +1144,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, } // clear the transmit data array for the current subframe - if (abstraction_flag==0) { + if (eNB->abstraction_flag==0) { for (aa=0; aanb_antennas_tx_eNB; aa++) { memset(&eNB->common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); @@ -1153,11 +1152,11 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, } if (is_pmch_subframe(frame,subframe,fp)) { - pmch_procedures(eNB,proc,rn,abstraction_flag,r_type); + pmch_procedures(eNB,proc,rn,r_type); } else { // this is not a pmch subframe, so generate PSS/SSS/PBCH - common_signal_procedures(eNB,proc,abstraction_flag); + common_signal_procedures(eNB,proc); } #if defined(SMBV) @@ -1283,7 +1282,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, eNB->num_common_dci[(subframe)&1]=0; } - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) { LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,frame, subframe, @@ -1316,7 +1315,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, if ((eNB->dlsch_SI) && (eNB->dlsch_SI->active == 1)) { - pdsch_procedures(eNB,proc,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,proc,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,num_pdcch_symbols); #if defined(SMBV) @@ -1349,7 +1348,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, eNB->ulsch[(uint32_t)UE_id]->Msg3_frame, eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe); - pdsch_procedures(eNB,proc,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,proc,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,num_pdcch_symbols); eNB->dlsch_ra->active = 0; @@ -1362,7 +1361,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& (eNB->dlsch[(uint8_t)UE_id][0]->active == 1)) { - pdsch_procedures(eNB,proc,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,num_pdcch_symbols,abstraction_flag); + pdsch_procedures(eNB,proc,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,num_pdcch_symbols); } @@ -1385,8 +1384,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, generate_phich_top(eNB, proc, AMP, - 0, - abstraction_flag); + 0); } @@ -1395,24 +1393,6 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, phy_procedures_emos_eNB_TX(subframe, eNB); #endif -#if !(defined(EXMIMO) || defined(OAI_USRP) || defined (CPRIGW)) - - if (abstraction_flag==0) - { - start_meas(&eNB->ofdm_mod_stats); - do_OFDM_mod(eNB->common_vars.txdataF[0], - eNB->common_vars.txdata[0], - frame,subframe<<1, - fp); - do_OFDM_mod(eNB->common_vars.txdataF[0], - eNB->common_vars.txdata[0], - frame,1+(subframe<<1), - fp); - stop_meas(&eNB->ofdm_mod_stats); - } - -#endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+(subframe&1),0); stop_meas(&eNB->phy_proc_tx); @@ -1869,8 +1849,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB, } } -void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) -{ +void prach_procedures(PHY_VARS_eNB *eNB) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint16_t preamble_energy_list[64],preamble_delay_list[64]; @@ -1881,10 +1860,11 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) int frame = eNB->proc.frame_prach; uint8_t CC_id = eNB->CC_id; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); memset(&preamble_energy_list[0],0,64*sizeof(uint16_t)); memset(&preamble_delay_list[0],0,64*sizeof(uint16_t)); - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",eNB->Mod_id, frame,subframe,dB_fixed(signal_energy(&eNB->common_vars.rxdata[0][0][subframe*fp->samples_per_tti],512)) - eNB->rx_total_gain_dB); @@ -1984,9 +1964,10 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag) eNB->Mod_id,frame, subframe); } } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); } -void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; @@ -2059,7 +2040,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq eNB->UE_stats[UE_id].sr_total++; - if (abstraction_flag == 0) + if (eNB->abstraction_flag == 0) metric0_SR = rx_pucch(eNB, pucch_format1, UE_id, @@ -2115,7 +2096,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { @@ -2160,7 +2141,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { @@ -2236,7 +2217,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif - if (abstraction_flag == 0) + if (eNB->abstraction_flag == 0) metric0_SR = rx_pucch(eNB, format, UE_id, @@ -2268,7 +2249,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq // Check n1_pucch0 metric if (n1_pucch0 != -1) { - if (abstraction_flag == 0) + if (eNB->abstraction_flag == 0) metric0 = rx_pucch(eNB, format, UE_id, @@ -2293,7 +2274,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq // Check n1_pucch1 metric if (n1_pucch1 != -1) { - if (abstraction_flag == 0) + if (eNB->abstraction_flag == 0) metric1 = rx_pucch(eNB, format, UE_id, @@ -2350,7 +2331,7 @@ void pucch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq } -void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid,const uint8_t abstraction_flag) { +void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_pid) { uint8_t access_mode; int num_active_cba_groups; @@ -2375,7 +2356,7 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p UE_id, (uint16_t)eNB->ulsch[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[eNB->UE_stats[UE_id].mode]); #endif - if (abstraction_flag==0) { + if (eNB->abstraction_flag==0) { rx_ulsch(eNB,proc, eNB->UE_stats[UE_id].sector, // this is the effective sector id UE_id, @@ -2392,7 +2373,7 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p #endif - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { ret = ulsch_decoding(eNB,proc, UE_id, 0, // control_only_flag @@ -2509,116 +2490,121 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p } - -void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) { +void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { int l; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); + remove_7_5_kHz(eNB,proc->subframe_rx<<1); + remove_7_5_kHz(eNB,1+(proc->subframe_rx<<1)); + for (l=0; lsymbols_per_tti/2; l++) { + slot_fep_ul(fp, + &eNB->common_vars, + l, + proc->subframe_rx<<1, + 0, + 0 + ); + slot_fep_ul(fp, + &eNB->common_vars, + l, + 1+(proc->subframe_rx<<1), + 0, + 0 + ); + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); + + if (eNB->node_function == NGFI_RRU_IF4p5) { + /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); + send_IF4p5(eNB, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT, 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + } +} + +void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { + + uint8_t seqno=0; + + /// **** send_IF5 of rxdata to BBU **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); + send_IF5(eNB, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); + +} + +void do_prach(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { + + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + + // check if we have to detect PRACH first + if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) { + /* accept some delay in processing - up to 5ms */ + int i; + for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) { + LOG_W(PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,proc->instance_cnt_prach); + usleep(500); + } + if (proc->instance_cnt_prach == 0) { + exit_fun( "PRACH thread busy" ); + return; + } + + // wake up thread for PRACH RX + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); + exit_fun( "error locking mutex_prach" ); + return; + } + + ++proc->instance_cnt_prach; + // set timing for prach thread + proc->frame_prach = proc->frame_rx; + proc->subframe_prach = proc->subframe_rx; + + // the thread can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + + pthread_mutex_unlock( &proc->mutex_prach ); + } + +} + +void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ + + eNB_proc_t *proc = &eNB->proc; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - uint8_t seqno=0; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 1 ); start_meas(&eNB->phy_proc_rx); -#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_common_RX(%d)\n",eNB->Mod_id,frame,subframe); -#endif - if (abstraction_flag==0) { - if ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == eNodeB_3GPP) || - (eNB->node_function == eNodeB_3GPP_BBU)) { // front-end processing + if (eNB->fep) eNB->fep(eNB,proc); - // now do common RX processing for first slot in subframe - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); - remove_7_5_kHz(eNB,proc->subframe_rx<<1); - remove_7_5_kHz(eNB,1+(proc->subframe_rx<<1)); - for (l=0; lsymbols_per_tti/2; l++) { - slot_fep_ul(fp, - &eNB->common_vars, - l, - proc->subframe_rx<<1, - 0, - 0 - ); - slot_fep_ul(fp, - &eNB->common_vars, - l, - 1+(proc->subframe_rx<<1), - 0, - 0 - ); - } + if (eNB->do_prach) eNB->do_prach(eNB,proc); + - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); - - if (eNB->node_function == NGFI_RRU_IF4) { - /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - send_IF4(eNB, proc->frame_rx, proc->subframe_rx, IF4_PULFFT, 0); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); - } - } - else if (eNB->node_function == NGFI_RRU_IF5) { - /// **** send_IF5 of rxdata to BBU **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); - send_IF5(eNB, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); - } - - /// **** send_IF4 of prach to RCC **** /// done in prach thread (below) - // check if we have to detect PRACH first - if ((eNB->node_function != NGFI_RRU_IF5) && - (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0)) { // any other node must call prach procedure - /* accept some delay in processing - up to 5ms */ - int i; - for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) { - LOG_W(PHY,"[eNB] Frame %d Subframe %d, eNB PRACH thread busy (IC %d)!!\n", proc->frame_rx,proc->subframe_rx,proc->instance_cnt_prach); - usleep(500); - } - if (proc->instance_cnt_prach == 0) { - exit_fun( "PRACH thread busy" ); - return; - } - - // wake up thread for PRACH RX - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach ); - exit_fun( "error locking mutex_prach" ); - return; - } - - ++proc->instance_cnt_prach; - // set timing for prach thread - proc->frame_prach = proc->frame_rx; - proc->subframe_prach = proc->subframe_rx; - - // the thread can now be woken up - if (pthread_cond_signal(&proc->cond_prach) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); - exit_fun( "ERROR pthread_cond_signal" ); - return; - } - - pthread_mutex_unlock( &proc->mutex_prach ); - } - - } else { // grab transport channel information from network interface - - } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 0 ); } -void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const uint8_t abstraction_flag,const relaying_type_t r_type) +void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type) { //RX processing for ue-specific resources (i UNUSED(r_type); @@ -2664,7 +2650,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const // Do PUCCH processing first for (i=0; ipusch_stats_mcs[i][(frame*10)+subframe] = eNB->ulsch[i]->harq_processes[harq_pid]->mcs; start_meas(&eNB->ulsch_demodulation_stats); - if (abstraction_flag==0) { + if (eNB->abstraction_flag==0) { rx_ulsch(eNB,proc, eNB->UE_stats[i].sector, // this is the effective sector id i, @@ -2770,7 +2756,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const start_meas(&eNB->ulsch_decoding_stats); - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { ret = ulsch_decoding(eNB,proc, i, 0, // control_only_flag @@ -3082,7 +3068,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const } // Msg3_flag == 0 // estimate timing advance for MAC - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { sync_pos = lte_est_timing_advance_pusch(eNB,i); eNB->UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check } @@ -3169,10 +3155,10 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const } // CBA (non-LTE) - cba_procedures(eNB,proc,i,harq_pid,abstraction_flag); + cba_procedures(eNB,proc,i,harq_pid); } // loop i=0 ... NUMBER_OF_UE_MAX-1 - if (abstraction_flag == 0) { + if (eNB->abstraction_flag == 0) { lte_eNB_I0_measurements(eNB, subframe, 0, diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index cecdf623ef..770b4afa25 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -887,10 +887,12 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->cc_node_function[j] = eNodeB_3GPP; } else if (strcmp(cc_node_function, "eNodeB_3GPP_BBU") == 0) { enb_properties.properties[enb_properties_index]->cc_node_function[j] = eNodeB_3GPP_BBU; - } else if (strcmp(cc_node_function, "NGFI_RCC_IF4") == 0) { - enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RCC_IF4; - } else if (strcmp(cc_node_function, "NGFI_RRU_IF4") == 0) { - enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF4; + } else if (strcmp(cc_node_function, "NGFI_RCC_IF4p5") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RCC_IF4p5; + } else if (strcmp(cc_node_function, "NGFI_RAU_IF4p5") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RAU_IF4p5; + } else if (strcmp(cc_node_function, "NGFI_RRU_IF4p5") == 0) { + enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF4p5; } else if (strcmp(cc_node_function, "NGFI_RRU_IF5") == 0) { enb_properties.properties[enb_properties_index]->cc_node_function[j] = NGFI_RRU_IF5; } else { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index faf19c9fda..02ca6ee7eb 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -201,7 +201,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi -int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { +int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { int nblocks = nsamps; int bytes_sent = 0; @@ -211,14 +211,14 @@ int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, ssize_t packet_size; - if (flags == IF4_PDLFFT) { - packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks); - } else if (flags == IF4_PULFFT) { - packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); + if (flags == IF4p5_PDLFFT) { + packet_size = RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PULFFT) { + packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks); } else if (flags == IF5_MOBIPASS) { packet_size = RAW_IF5_MOBIPASS_SIZE_BYTES; } else { - packet_size = RAW_IF4_PRACH_SIZE_BYTES; + packet_size = RAW_IF4p5_PRACH_SIZE_BYTES; } eth->tx_nsamps = nblocks; @@ -304,7 +304,7 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi -int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { +int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { // Read nblocks info from packet itself int nblocks = nsamps; @@ -312,8 +312,8 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t; - IF4_header_t *test_header = (IF4_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES); + ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t; + IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES); bytes_received = recv(eth->sockfd[Mod_id], buff[0], @@ -327,12 +327,12 @@ int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, *timestamp = test_header->sub_type; - if (test_header->sub_type == IF4_PDLFFT) { - packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks); - } else if (test_header->sub_type == IF4_PULFFT) { - packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); + if (test_header->sub_type == IF4p5_PDLFFT) { + packet_size = RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks); + } else if (test_header->sub_type == IF4p5_PULFFT) { + packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks); } else { - packet_size = RAW_IF4_PRACH_SIZE_BYTES; + packet_size = RAW_IF4p5_PRACH_SIZE_BYTES; } while(bytes_received < packet_size) { @@ -387,7 +387,7 @@ int eth_set_dev_conf_raw(openair0_device *device) { -int eth_set_dev_conf_raw_IF4(openair0_device *device) { +int eth_set_dev_conf_raw_IF4p5(openair0_device *device) { // use for cc_id info int Mod_id = device->Mod_id; @@ -448,7 +448,7 @@ int eth_get_dev_conf_raw(openair0_device *device) { } -int eth_get_dev_conf_raw_IF4(openair0_device *device) { +int eth_get_dev_conf_raw_IF4p5(openair0_device *device) { // use for cc_id info eth_state_t *eth = (eth_state_t*)device->priv; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 252bdbb47c..f2c69985bf 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -73,27 +73,27 @@ int trx_eth_start(openair0_device *device) { /* adjust MTU wrt number of samples per packet */ if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; - } else if (eth->flags == ETH_RAW_IF4_MODE) { + } else if (eth->flags == ETH_RAW_IF4p5_MODE) { if (eth_socket_init_raw(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_raw_IF4(device)!=0) return -1; + if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1; } else { - if(eth_get_dev_conf_raw_IF4(device)!=0) return -1; + if(eth_get_dev_conf_raw_IF4p5(device)!=0) return -1; } /* adjust MTU wrt number of samples per packet */ - if(ethernet_tune (device,MTU_SIZE,RAW_IF4_PRACH_SIZE_BYTES)!=0) return -1; + if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; - } else if (eth->flags == ETH_UDP_IF4_MODE) { + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { if (eth_socket_init_raw(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ //if (device->host_type == BBU_HOST) { - //if(eth_set_dev_conf_raw_IF4(device)!=0) return -1; + //if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1; //} else { - //if(eth_get_dev_conf_raw_IF4(device)!=0) return -1; + //if(eth_get_dev_conf_raw_IF4p5(device)!=0) return -1; // /* adjust MTU wrt number of samples per packet */ // if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; @@ -339,9 +339,9 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth } else if (eth_params->transp_preference == 0) { eth->flags = ETH_UDP_MODE; } else if (eth_params->transp_preference == 3) { - eth->flags = ETH_RAW_IF4_MODE; + eth->flags = ETH_RAW_IF4p5_MODE; } else if (eth_params->transp_preference == 2) { - eth->flags = ETH_UDP_IF4_MODE; + eth->flags = ETH_UDP_IF4p5_MODE; } else if (eth_params->transp_preference == 4) { eth->flags = ETH_RAW_IF5_MOBIPASS; } else { @@ -368,15 +368,15 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth } else if (eth->flags == ETH_UDP_MODE) { device->trx_write_func = trx_eth_write_udp; device->trx_read_func = trx_eth_read_udp; - } else if (eth->flags == ETH_RAW_IF4_MODE) { - device->trx_write_func = trx_eth_write_raw_IF4; - device->trx_read_func = trx_eth_read_raw_IF4; + } else if (eth->flags == ETH_RAW_IF4p5_MODE) { + device->trx_write_func = trx_eth_write_raw_IF4p5; + device->trx_read_func = trx_eth_read_raw_IF4p5; } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { - device->trx_write_func = trx_eth_write_raw_IF4; - device->trx_read_func = trx_eth_read_raw_IF4; + device->trx_write_func = trx_eth_write_raw_IF4p5; + device->trx_read_func = trx_eth_read_raw_IF4p5; } else { - //device->trx_write_func = trx_eth_write_udp_IF4; - //device->trx_read_func = trx_eth_read_udp_IF4; + //device->trx_write_func = trx_eth_write_udp_IF4p5; + //device->trx_read_func = trx_eth_read_udp_IF4p5; } eth->if_name[device->Mod_id] = eth_params->local_if_name; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index f7753fb517..3adb0f45cb 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -222,11 +222,11 @@ int eth_set_dev_conf_udp(openair0_device *device); int eth_socket_init_raw(openair0_device *device); int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); -int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); -int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); +int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int eth_get_dev_conf_raw(openair0_device *device); int eth_set_dev_conf_raw(openair0_device *device); -int eth_get_dev_conf_raw_IF4(openair0_device *device); -int eth_set_dev_conf_raw_IF4(openair0_device *device); +int eth_get_dev_conf_raw_IF4p5(openair0_device *device); +int eth_set_dev_conf_raw_IF4p5(openair0_device *device); #endif diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 038129cf36..e118e9f99f 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -47,8 +47,8 @@ // ETH transport preference modes #define ETH_UDP_MODE 0 #define ETH_RAW_MODE 1 -#define ETH_UDP_IF4_MODE 2 -#define ETH_RAW_IF4_MODE 3 +#define ETH_UDP_IF4p5_MODE 2 +#define ETH_RAW_IF4p5_MODE 3 #define ETH_RAW_IF5_MOBIPASS 4 // Time domain RRH packet sizes @@ -58,13 +58,13 @@ #define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) #define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) -// Packet sizes for IF4 interface format +// Packet sizes for IF4p5 interface format #define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks) #define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839*2) // FIX hard coded prach size (uncompressed) -#define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) -#define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) -#define RAW_IF4_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4_header_t + PRACH_BLOCK_SIZE_BYTES) +#define RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4p5_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + PRACH_BLOCK_SIZE_BYTES) // Mobipass packet sizes #define RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES 1280 diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index ac552e82fe..150a29e342 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -173,6 +173,8 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { int len,len2; int16_t *txdata; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); + slot_offset_F = (subframe<<1)*slot_sizeF; slot_offset = subframe*phy_vars_eNB->frame_parms.samples_per_tti; @@ -284,8 +286,101 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { } } } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); } +void tx_fh_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { + uint8_t seqno; + send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL); +} + +void tx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { + send_IF4p5(eNB,proc->frame_tx, proc->subframe_tx, IF4p5_PDLFFT, 0); +} + +void proc_tx_full(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + uint8_t abstraction_flag, + relaying_type_t r_type, + PHY_VARS_RN *rn) { + + phy_procedures_eNB_TX(eNB,proc,r_type,rn); + + /* we're done, let the next one proceed */ + if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc\n"); + exit_fun("nothing to add"); + } + sync_phy_proc.phy_proc_CC_id++; + sync_phy_proc.phy_proc_CC_id %= MAX_NUM_CCs; + pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); + if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc\n"); + exit_fun("nothing to add"); + } + + + do_OFDM_mod_rt(proc->subframe_tx,eNB); + + if (eNB->tx_fh) eNB->tx_fh(eNB,proc); + + + +} + +void proc_tx_rru_if4p5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { + + uint32_t symbol_number=0; + uint32_t symbol_mask, symbol_mask_full; + uint16_t packet_type; + + /// **** recv_IF4 of txdataF from RCC **** /// + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<frame_parms.symbols_per_tti)-1; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); + do { + recv_IF4p5(eNB, &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); + symbol_mask = symbol_mask | (1<subframe_tx, eNB); +} + +void proc_tx_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { + /// **** recv_IF5 of txdata from BBU **** /// + recv_IF5(eNB, &proc->timestamp_tx, proc->subframe_tx, IF5_RRH_GW_DL); +} + +int wait_CCs(eNB_rxtx_proc_t *proc) { + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + if (pthread_mutex_timedlock(&sync_phy_proc.mutex_phy_proc_tx,&wait) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n"); + exit_fun("nothing to add"); + return(-1); + } + + // wait for our turn or oai_exit + while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) { + pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx, + &sync_phy_proc.mutex_phy_proc_tx); + } + + if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX\n"); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} /*! * \brief The RX UE-specific and TX thread of eNB. @@ -297,14 +392,16 @@ static void* eNB_thread_rxtx( void* param ) { static int eNB_thread_rxtx_status; eNB_rxtx_proc_t *proc = (eNB_rxtx_proc_t*)param; + PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + FILE *tx_time_file = NULL; char tx_time_name[101]; - void *txp[PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx]; + void *txp[fp->nb_antennas_tx]; int txs; - uint16_t packet_type; - uint32_t symbol_number=0; - uint32_t symbol_mask, symbol_mask_full; + + uint8_t seqno=0; @@ -435,6 +532,7 @@ static void* eNB_thread_rxtx( void* param ) { } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 1 ); + start_meas( &softmodem_stats_rxtx_sf ); if (oai_exit) break; @@ -443,158 +541,31 @@ static void* eNB_thread_rxtx( void* param ) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_ENB+(proc->subframe_rx&1), proc->subframe_rx ); // Common procedures - phy_procedures_eNB_common_RX(PHY_vars_eNB_g[0][proc->CC_id], 0); - - // UE-specific RX processing for subframe n - if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || - (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || - (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) { - - // this is the ue-specific processing for the subframe and can be multi-threaded later - phy_procedures_eNB_uespec_RX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay ); - } + phy_procedures_eNB_common_RX(eNB); + // Do UE-specific RX processing for subframe n if any + if (eNB->proc_uespec_rx) eNB->proc_uespec_rx(eNB, proc, no_relay ); // TX processing for subframe n+4 - if (((PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.frame_type == TDD) && - ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->frame_parms,proc->subframe_tx) == SF_DL) || - (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->frame_parms,proc->subframe_tx) == SF_S))) || - (PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.frame_type == FDD)) { + if (((fp->frame_type == TDD) && + ((subframe_select(fp,proc->subframe_tx) == SF_DL) || + (subframe_select(fp,proc->subframe_tx) == SF_S))) || + (fp->frame_type == FDD)) { /* run PHY TX procedures the one after the other for all CCs to avoid race conditions * (may be relaxed in the future for performance reasons) */ - - if (pthread_mutex_timedlock(&sync_phy_proc.mutex_phy_proc_tx,&wait) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n"); - exit_fun("nothing to add"); - break; - } - - // wait for our turn or oai_exit - while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) { - pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx, - &sync_phy_proc.mutex_phy_proc_tx); - } - if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX\n"); - exit_fun("nothing to add"); - } + if (wait_CCs(proc)<0) break; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+(proc->subframe_tx&1), proc->frame_tx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+(proc->subframe_tx&1), proc->subframe_tx ); if (oai_exit) break; - - if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || - (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || - (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) { - phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay, NULL ); - /* we're done, let the next one proceed */ - if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc\n"); - exit_fun("nothing to add"); - break; - } - sync_phy_proc.phy_proc_CC_id++; - sync_phy_proc.phy_proc_CC_id %= MAX_NUM_CCs; - pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); - if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc\n"); - exit_fun("nothing to add"); - break; - } - } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) { - /// **** recv_IF4 of txdataF from RCC **** /// - symbol_number = 0; - symbol_mask = 0; - symbol_mask_full = (1<CC_id]->frame_parms.symbols_per_tti)-1; - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - do { - recv_IF4(PHY_vars_eNB_g[0][proc->CC_id], &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); - symbol_mask = symbol_mask | (1<CC_id]->node_function == NGFI_RRU_IF5) { - /// **** recv_IF5 of txdata from BBU **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); - recv_IF5(PHY_vars_eNB_g[0][proc->CC_id], &proc->timestamp_tx, proc->subframe_tx, IF5_RRH_GW_DL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); - - } - } - - // eNodeB_3GPP, _BBU and RRU create txdata - if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || - (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || - (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); - do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); - } - - /* - short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.samples_per_tti]; - int i; - for (i=0;iCC_id]->frame_parms.samples_per_tti*2;i+=8) { - txdata[i] = 2047; - txdata[i+1] = 0; - txdata[i+2] = 0; - txdata[i+3] = 2047; - txdata[i+4] = -2047; - txdata[i+5] = 0; - txdata[i+6] = 0; - txdata[i+7] = -2047; } - */ - - - /* - // eNodeB_3GPP, RRU write to RF device - if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || - (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) || - (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5)) { - // Transmit TX buffer based on timestamp from RX - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - int i; - for (i=0; iframe_parms.nb_antennas_tx; i++) - txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti]; - - txs = PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, - (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance), - txp, - PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti, - PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx, - 1); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); - - if (txs != PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti) { - LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti); - exit_fun( "problem transmitting samples" ); - } - } - */ - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { - /// **** send_IF5 of txdata to RRH **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); - send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); - - } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4) { - /// **** send_IF4 of txdataF to RRU **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); - send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + if (eNB->proc_tx) eNB->proc_tx(eNB, proc, no_relay, NULL ); } + if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc\n"); exit_fun("nothing to add"); @@ -611,13 +582,14 @@ static void* eNB_thread_rxtx( void* param ) { stop_meas( &softmodem_stats_rxtx_sf ); -#ifdef DEADLINE_SCHEDULER if (opp_enabled){ + +#ifdef DEADLINE_SCHEDULER if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); - } + } #endif - + } print_meas_now(&softmodem_stats_rxtx_sf,"eNB_TX_SF",tx_time_file); } @@ -807,10 +779,10 @@ static void* eNB_thread_asynch_rx( void* param ) { } } // eNodeB_3GPP_BBU - else if (eNB->node_function == NGFI_RCC_IF4) { - /// **** recv_IF4 of rxdataF from RRU **** /// - /// **** recv_IF4 of rxsigF from RRU **** /// - // get frame/subframe information from IF4 interface + else if (eNB->node_function == NGFI_RCC_IF4p5) { + /// **** recv_IF4p5 of rxdataF from RRU **** /// + /// **** recv_IF4p5 of rxsigF from RRU **** /// + // get frame/subframe information from IF4p5 interface // timed loop (200 us) symbol_number = 0; @@ -819,14 +791,12 @@ static void* eNB_thread_asynch_rx( void* param ) { prach_rx = 0; do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - recv_IF4(eNB, &frame_rx, &subframe_rx, &packet_type, &symbol_number); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + recv_IF4p5(eNB, &frame_rx, &subframe_rx, &packet_type, &symbol_number); - if (packet_type == IF4_PULFFT) { + if (packet_type == IF4p5_PULFFT) { symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; - } else if (packet_type == IF4_PRACH) { + } else if (packet_type == IF4p5_PRACH) { prach_rx = 0; } } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); @@ -845,6 +815,248 @@ static void* eNB_thread_asynch_rx( void* param ) { } +void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; + unsigned int rxs,txs; + int i; + + if (proc->first_rx==0) { + + // Transmit TX buffer based on timestamp from RX + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + + for (i=0; inb_antennas_tx; i++) + txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+3)%10)*fp->samples_per_tti]; + + txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice, + proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, + txp, + fp->samples_per_tti, + fp->nb_antennas_tx, + 1); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + + + if (txs != fp->samples_per_tti) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); + exit_fun( "problem transmitting samples" ); + } + } + + for (i=0; inb_antennas_rx; i++) + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][*subframe*fp->samples_per_tti]; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &(proc->timestamp_rx), + rxp, + fp->samples_per_tti, + fp->nb_antennas_rx); + + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + if (proc->first_rx == 0) { + if (proc->subframe_rx != *subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + exit_fun("Exiting"); + } + + if (proc->frame_rx != *frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + } + + //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + + if (rxs != fp->samples_per_tti) + exit_fun( "problem receiving samples" ); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + +} + +void rx_fh_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame, int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + recv_IF5(eNB, &proc->timestamp_rx, *subframe, IF5_RRH_GW_UL); + + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + if (proc->first_rx == 0) { + if (proc->subframe_rx != subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + exit_fun("Exiting"); + } + + if (proc->frame_rx != frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + frame = proc->frame_rx; + subframe = proc->subframe_rx; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + +} + +void rx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *subframe,int *frame) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + int prach_rx; + + uint16_t packet_type; + uint32_t symbol_number=0; + uint32_t symbol_mask, symbol_mask_full; + + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + prach_rx = 0; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); + recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + + if (packet_type == IF4p5_PULFFT) { + symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; + } else if (packet_type == IF4p5_PRACH) { + prach_rx = 0; + } + } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); + + if (proc->first_rx == 0) { + if (proc->subframe_rx != *subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + exit_fun("Exiting"); + } + if (proc->frame_rx != *frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + +} + +int wakeup_rxtx(eNB_proc_t *proc,eNB_rxtx_proc_t *proc_rxtx,LTE_DL_FRAME_PARMS *fp) { + + int i; + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + /* accept some delay in processing - up to 5ms */ + for (i = 0; i < 10 && proc_rxtx->instance_cnt_rxtx == 0; i++) { + LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, proc_rxtx->instance_cnt_rxtx); + usleep(500); + } + if (proc_rxtx->instance_cnt_rxtx == 0) { + exit_fun( "TX thread busy" ); + return(-1); + } + + // wake up TX for subframe n+4 + // lock the TX mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", proc_rxtx->subframe_rx&1,proc_rxtx->instance_cnt_rxtx ); + exit_fun( "error locking mutex_rxtx" ); + return(-1); + } + + ++proc_rxtx->instance_cnt_rxtx; + + // We have just received and processed the common part of a subframe, say n. + // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired + // transmitted timestamp of the next TX slot (first). + // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, + // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+3 + proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > 5) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; + proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + 4)%10; + + // the thread can now be woken up + if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return(-1); + } + + pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); + + return(0); +} + +void wakeup_slaves(eNB_proc_t *proc) { + + int i; + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + for (i=0;inum_slaves;i++) { + eNB_proc_t *slave_proc = proc->slave_proc[i]; + // wake up slave FH thread + // lock the FH mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&slave_proc->mutex_FH,&wait) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)\n",proc->CC_id,slave_proc->CC_id); + exit_fun( "error locking mutex_rxtx" ); + break; + } + + int cnt_slave = ++slave_proc->instance_cnt_FH; + slave_proc->frame_rx = proc->frame_rx; + slave_proc->subframe_rx = proc->subframe_rx; + slave_proc->timestamp_rx = proc->timestamp_rx; + + pthread_mutex_unlock( &slave_proc->mutex_FH ); + + if (cnt_slave == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&slave_proc->cond_FH) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB CCid %d, slave CCid %d\n",proc->CC_id,slave_proc->CC_id); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } + } else { + LOG_W( PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_FH %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); + exit_fun( "FH thread busy" ); + break; + } + } +} + /*! * \brief The Fronthaul thread of RRU/RAU/RCC/eNB * In the case of RRU/eNB, handles interface with external RF @@ -859,19 +1071,15 @@ static void* eNB_thread_FH( void* param ) { eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; - unsigned int rxs,txs; + FILE *rx_time_file = NULL; char rx_time_name[101]; - struct timespec wait; - int i; - int prach_rx; - uint16_t packet_type; - uint32_t symbol_number=0; - uint32_t symbol_mask, symbol_mask_full; + int i; int subframe=0, frame=0; + + struct timespec wait; wait.tv_sec=0; wait.tv_nsec=5000000L; @@ -994,32 +1202,16 @@ static void* eNB_thread_FH( void* param ) { wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif - // Create buffer for IF device and free when stopping - if (eNB->node_function == NGFI_RCC_IF4 || eNB->node_function == NGFI_RRU_IF4) { - malloc_IF4_buffer(eNB); - - } else if (eNB->node_function == NGFI_RRU_IF5 || eNB->node_function == eNodeB_3GPP_BBU) { - //malloc_IF5_buffer(eNB); - - } else { - eNB->ifbuffer.tx = NULL; - eNB->ifbuffer.rx = NULL; - } - - // Start IF device for this CC - if (eNB->node_function != eNodeB_3GPP) { - if (eNB->ifdevice.trx_start_func(&eNB->ifdevice) != 0 ) - LOG_E(HW,"Could not start the IF device\n"); - } - - // Start RF device for this CC - if ((eNB->node_function == eNodeB_3GPP) || - (eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == NGFI_RRU_IF5)) { - if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) + // Start RF device if any + if (eNB->start_rf) + if (eNB->start_rf(eNB) != 0) LOG_E(HW,"Could not start the RF device\n"); - } - + + // Start IF device if any + if (eNB->start_if) + if (eNB->start_if(eNB) != 0) + LOG_E(HW,"Could not start the IF device\n"); + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { @@ -1035,7 +1227,7 @@ static void* eNB_thread_FH( void* param ) { // This case is for synchronization to another thread if ((eNB->node_timing == synch_to_other) && - ((eNB->node_function == NGFI_RCC_IF4) || + ((eNB->node_function == NGFI_RCC_IF4p5) || (eNB->node_function == eNodeB_3GPP_BBU))) { //wait for event @@ -1056,232 +1248,24 @@ static void* eNB_thread_FH( void* param ) { } // Remaining cases are all for synchronization on FH interface - else if ((eNB->node_timing == synch_to_ext_device) && - ((eNB->node_function == NGFI_RRU_IF4) || - (eNB->node_function == NGFI_RRU_IF5) || - (eNB->node_function == eNodeB_3GPP))) { // acquisition from RF + else if ((eNB->node_timing == synch_to_ext_device) && + (eNB->rx_fh)) + eNB->rx_fh(eNB,proc,&frame,&subframe); - if (proc->first_rx==0) { - - // Transmit TX buffer based on timestamp from RX - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - - for (i=0; iframe_parms.nb_antennas_tx; i++) - txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][((proc->subframe_rx+3)%10)*fp->samples_per_tti]; - - txs = PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice, - proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, - txp, - fp->samples_per_tti, - fp->nb_antennas_tx, - 1); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - - - - if (txs != PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti) { - LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); - exit_fun( "problem transmitting samples" ); - } - } - - for (i=0; inb_antennas_rx; i++) - rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - - rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, - &proc->timestamp_rx, - rxp, - fp->samples_per_tti, - fp->nb_antennas_rx); - - proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - - if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - exit_fun("Exiting"); - } - - if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - exit_fun("Exiting"); - } - } else { - proc->first_rx = 0; - frame = proc->frame_rx; - subframe = proc->subframe_rx; - } - - //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - - if (rxs != fp->samples_per_tti) - exit_fun( "problem receiving samples" ); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - - } // node_timing==synch_to_ext_device && node_function == RRU || eNodeB - else if ((eNB->node_timing == synch_to_ext_device) && - (eNB->node_function == eNodeB_3GPP_BBU)) { // acquisition from IF - /// **** recv_IF5 of rxdata from RRH **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); - recv_IF5(eNB, &proc->timestamp_rx, subframe, IF5_RRH_GW_UL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); - - proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; - proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - - if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - exit_fun("Exiting"); - } - - if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - exit_fun("Exiting"); - } - } else { - proc->first_rx = 0; - frame = proc->frame_rx; - subframe = proc->subframe_rx; - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - - } // eNodeB_3GPP_BBU && node_timing == synch_to_ext_device - else if ((eNB->node_timing == synch_to_ext_device) && - (eNB->node_function == NGFI_RCC_IF4)) { - /// **** recv_IF4 of rxdataF from RRU **** /// - /// **** recv_IF4 of rxsigF from RRU **** /// - // timed loop (200 us) - - symbol_number = 0; - symbol_mask = 0; - symbol_mask_full = (1<symbols_per_tti)-1; - prach_rx = 0; - - do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); - recv_IF4(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); - - if (packet_type == IF4_PULFFT) { - symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; - } else if (packet_type == IF4_PRACH) { - prach_rx = 0; - } - } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); - - if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); - exit_fun("Exiting"); - } - if (proc->frame_rx != frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); - exit_fun("Exiting"); - } - } else { - proc->first_rx = 0; - frame = proc->frame_rx; - subframe = proc->subframe_rx; - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - - } // node_timing == synch_to_externs, node_function = NGFI_IF4 else { // should not get here - AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); + AssertFatal(1==0, "Unknown fronthaul interface : eNB->node_function %d",eNB->node_function); } T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); // At this point, all information for subframe has been received on FH interface // If this proc is to provide synchronization, do so - for (i=0;inum_slaves;i++) { - eNB_proc_t *slave_proc = proc->slave_proc[i]; - // wake up slave FH thread - // lock the FH mutex and make sure the thread is ready - if (pthread_mutex_timedlock(&slave_proc->mutex_FH,&wait) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)\n",proc->CC_id,slave_proc->CC_id); - exit_fun( "error locking mutex_rxtx" ); - break; - } - - int cnt_slave = ++slave_proc->instance_cnt_FH; - slave_proc->frame_rx = proc->frame_rx; - slave_proc->subframe_rx = proc->subframe_rx; - slave_proc->timestamp_rx = proc->timestamp_rx; - - pthread_mutex_unlock( &slave_proc->mutex_FH ); - - if (cnt_slave == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&slave_proc->cond_FH) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB CCid %d, slave CCid %d\n",proc->CC_id,slave_proc->CC_id); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_FH %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); - exit_fun( "FH thread busy" ); - break; - } - } + wakeup_slaves(proc); // wake up RXn_TXnp4 thread for the subframe // choose even or odd thread for RXn-TXnp4 processing - eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[proc->subframe_rx&1]; - - /* accept some delay in processing - up to 5ms */ - for (i = 0; i < 10 && proc_rxtx->instance_cnt_rxtx == 0; i++) { - LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, proc_rxtx->instance_cnt_rxtx); - usleep(500); - } - if (proc_rxtx->instance_cnt_rxtx == 0) { - exit_fun( "TX thread busy" ); + if (wakeup_rxtx(proc,&proc->proc_rxtx[proc->subframe_rx&1],fp) < 0) break; - } - - // wake up TX for subframe n+4 - // lock the TX mutex and make sure the thread is ready - if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", proc_rxtx->subframe_rx&1,proc_rxtx->instance_cnt_rxtx ); - exit_fun( "error locking mutex_rxtx" ); - break; - } - - ++proc_rxtx->instance_cnt_rxtx; - - // We have just received and processed the common part of a subframe, say n. - // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired - // transmitted timestamp of the next TX slot (first). - // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, - // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, - // and proc->subframe_tx = proc->subframe_rx+3 - proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); - proc_rxtx->frame_rx = proc->frame_rx; - proc_rxtx->subframe_rx = proc->subframe_rx; - proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > 5) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; - proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + 4)%10; - - // the thread can now be woken up - if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - - pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); stop_meas( &softmodem_stats_rxtx_sf ); #ifdef DEADLINE_SCHEDULER @@ -1453,9 +1437,8 @@ static void* eNB_thread_prach( void* param ) { break; } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(eNB,0); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); + + prach_procedures(eNB); if (pthread_mutex_lock(&proc->mutex_prach) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n"); @@ -1732,17 +1715,95 @@ void print_opp_meas(void) { } } +int start_if(PHY_VARS_eNB *eNB) { + return(eNB->ifdevice.trx_start_func(&eNB->ifdevice)); +} - void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst) { +int start_rf(PHY_VARS_eNB *eNB) { + return(eNB->rfdevice.trx_start_func(&eNB->rfdevice)); +} +extern eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc); +extern eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc); +extern do_prach(PHY_VARS_eNB *eNB,eNB_proc_t *proc); + +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst) { + int CC_id; int inst; - + PHY_VARS_eNB *eNB; for (inst=0;instnode_function = node_function[CC_id]; - PHY_vars_eNB_g[inst][CC_id]->node_timing = node_timing[CC_id]; + eNB = PHY_vars_eNB_g[inst][CC_id]; + eNB->node_function = node_function[CC_id]; + eNB->node_timing = node_timing[CC_id]; + eNB->abstraction_flag = 0; LOG_I(PHY,"Initializing eNB %d CC_id %d : (%s,%s)\n",inst,CC_id,eNB_functions[node_function[CC_id]],eNB_timing[node_timing[CC_id]]); + switch (node_function[CC_id]) { + case NGFI_RRU_IF5: + eNB->do_prach = NULL; + eNB->fep = eNB_fep_rru_if5; + eNB->proc_uespec_rx = NULL; + eNB->proc_tx = NULL; + eNB->tx_fh = NULL; + eNB->rx_fh = rx_rf; + eNB->start_rf = start_rf; + eNB->start_if = start_if; + break; + case NGFI_RRU_IF4p5: + eNB->do_prach = do_prach; + eNB->fep = eNB_fep_full; + eNB->proc_uespec_rx = NULL; + eNB->proc_tx = proc_tx_rru_if4p5; + eNB->tx_fh = NULL; + eNB->rx_fh = rx_rf; + eNB->start_rf = start_rf; + eNB->start_if = start_if; + malloc_IF4p5_buffer(eNB); + break; + case eNodeB_3GPP: + eNB->do_prach = do_prach; + eNB->fep = eNB_fep_full; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_full; + eNB->tx_fh = NULL; + eNB->rx_fh = rx_rf; + eNB->start_rf = start_rf; + eNB->start_if = NULL; + break; + case eNodeB_3GPP_BBU: + eNB->do_prach = do_prach; + eNB->fep = eNB_fep_full; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_full; + eNB->tx_fh = tx_fh_if5; + eNB->rx_fh = rx_fh_if5; + eNB->start_rf = NULL; + eNB->start_if = start_if; + break; + case NGFI_RCC_IF4p5: + eNB->do_prach = do_prach; + eNB->fep = eNB_fep_full; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_full; + eNB->tx_fh = tx_fh_if4p5; + eNB->rx_fh = rx_fh_if4p5; + eNB->start_rf = NULL; + eNB->start_if = start_if; + malloc_IF4p5_buffer(eNB); + break; + case NGFI_RAU_IF4p5: + eNB->do_prach = do_prach; + eNB->fep = eNB_fep_full; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_full; + eNB->tx_fh = tx_fh_if4p5; + eNB->rx_fh = rx_fh_if4p5; + eNB->start_rf = NULL; + eNB->start_if = start_if; + malloc_IF4p5_buffer(eNB); + break; + } } init_eNB_proc(inst); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 9c3ec6fb99..38c95a4122 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1056,9 +1056,9 @@ static void get_options (int argc, char **argv) if (enb_properties->properties[i]->rrh_gw_config[j].raw == 1) { (eth_params+j)->transp_preference = ETH_RAW_MODE; } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif4 == 1) { - (eth_params+j)->transp_preference = ETH_RAW_IF4_MODE; + (eth_params+j)->transp_preference = ETH_RAW_IF4p5_MODE; } else if (enb_properties->properties[i]->rrh_gw_config[j].udpif4 == 1) { - (eth_params+j)->transp_preference = ETH_UDP_IF4_MODE; + (eth_params+j)->transp_preference = ETH_UDP_IF4p5_MODE; } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif5_mobipass == 1) { (eth_params+j)->transp_preference = ETH_RAW_IF5_MOBIPASS; } else { @@ -1645,7 +1645,7 @@ int main( int argc, char **argv ) if (UE_flag == 0) { for (CC_id=0; CC_idrfdevice.host_type = RRH_HOST; PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST; } else { @@ -1667,7 +1667,7 @@ int main( int argc, char **argv ) // Load RF device and initialize for (CC_id=0; CC_idrfdevice), &openair0_cfg[0]) : From d6377f1acd1db0348270c15a2ae6a52f9fb409ef Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 10:41:09 +0200 Subject: [PATCH 145/340] correction for RCC/RAU initialization --- targets/RT/USER/lte-enb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 150a29e342..c9df826908 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1783,7 +1783,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case NGFI_RCC_IF4p5: eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; + eNB->fep = NULL; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = tx_fh_if4p5; @@ -1794,7 +1794,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case NGFI_RAU_IF4p5: eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; + eNB->fep = NULL; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = tx_fh_if4p5; From 5309b71e94607509b1f8336aa8b0041308dfa15f Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 12:26:41 +0200 Subject: [PATCH 146/340] more separation for RRU/RCC --- targets/RT/USER/lte-enb.c | 74 ++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index c9df826908..43ae984197 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -298,11 +298,10 @@ void tx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { send_IF4p5(eNB,proc->frame_tx, proc->subframe_tx, IF4p5_PDLFFT, 0); } -void proc_tx_full(PHY_VARS_eNB *eNB, - eNB_rxtx_proc_t *proc, - uint8_t abstraction_flag, - relaying_type_t r_type, - PHY_VARS_RN *rn) { +void proc_tx_high0(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + relaying_type_t r_type, + PHY_VARS_RN *rn) { phy_procedures_eNB_TX(eNB,proc,r_type,rn); @@ -319,16 +318,42 @@ void proc_tx_full(PHY_VARS_eNB *eNB, exit_fun("nothing to add"); } +} +void proc_tx_high(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + relaying_type_t r_type, + PHY_VARS_RN *rn) { + + // do PHY high + proc_tx_high0(eNB,proc,r_type,rn); + + // if TX fronthaul go ahead + if (eNB->tx_fh) eNB->tx_fh(eNB,proc); + +} + +void proc_tx_full(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + relaying_type_t r_type, + PHY_VARS_RN *rn) { + + + // do PHY high + proc_tx_high0(eNB,proc,r_type,rn); + // do OFDM modulation do_OFDM_mod_rt(proc->subframe_tx,eNB); - + // if TX fronthaul go ahead if (eNB->tx_fh) eNB->tx_fh(eNB,proc); } -void proc_tx_rru_if4p5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { +void proc_tx_rru_if4p5(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + relaying_type_t r_type, + PHY_VARS_RN *rn) { uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; @@ -397,13 +422,7 @@ static void* eNB_thread_rxtx( void* param ) { FILE *tx_time_file = NULL; char tx_time_name[101]; - void *txp[fp->nb_antennas_tx]; - int txs; - - - - uint8_t seqno=0; if (opp_enabled == 1) { snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf", "eNB"); @@ -628,6 +647,8 @@ static void wait_system_ready (char *message, volatile int *start_flag) { */ static void* eNB_thread_asynch_rx( void* param ) { + static int eNB_thread_asynch_rx_status; + eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; @@ -813,6 +834,8 @@ static void* eNB_thread_asynch_rx( void* param ) { AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); } + eNB_thread_asynch_rx_status=0; + return(&eNB_thread_asynch_rx_status); } void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { @@ -900,19 +923,19 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame, int *subframe) { proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; if (proc->first_rx == 0) { - if (proc->subframe_rx != subframe){ + if (proc->subframe_rx != *subframe){ LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); exit_fun("Exiting"); } - if (proc->frame_rx != frame) { + if (proc->frame_rx != *frame) { LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); exit_fun("Exiting"); } } else { proc->first_rx = 0; - frame = proc->frame_rx; - subframe = proc->subframe_rx; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); @@ -1075,15 +1098,8 @@ static void* eNB_thread_FH( void* param ) { FILE *rx_time_file = NULL; char rx_time_name[101]; - int i; - int subframe=0, frame=0; - struct timespec wait; - - wait.tv_sec=0; - wait.tv_nsec=5000000L; - if (opp_enabled == 1) { snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf", "eNB"); rx_time_file = fopen(rx_time_name,"w"); @@ -1723,9 +1739,9 @@ int start_rf(PHY_VARS_eNB *eNB) { return(eNB->rfdevice.trx_start_func(&eNB->rfdevice)); } -extern eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc); -extern eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc); -extern do_prach(PHY_VARS_eNB *eNB,eNB_proc_t *proc); +extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc); +extern void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc); +extern void do_prach(PHY_VARS_eNB *eNB,eNB_proc_t *proc); void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst) { @@ -1785,7 +1801,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = do_prach; eNB->fep = NULL; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; - eNB->proc_tx = proc_tx_full; + eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; eNB->rx_fh = rx_fh_if4p5; eNB->start_rf = NULL; @@ -1796,7 +1812,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = do_prach; eNB->fep = NULL; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; - eNB->proc_tx = proc_tx_full; + eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; eNB->rx_fh = rx_fh_if4p5; eNB->start_rf = NULL; From dbae061e72f6db0c2b2ca5642fb26b1ba358beca Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 15:31:45 +0200 Subject: [PATCH 147/340] modifications for if5 --- .../CONF/rcc.band7.tm1.usrpb210.conf | 2 +- .../CONF/rru.band7.tm1.usrpb210.conf | 2 +- targets/RT/USER/lte-enb.c | 129 +++++++++++++----- targets/RT/USER/lte-softmodem.c | 62 +-------- targets/RT/USER/lte-ue.c | 5 + 5 files changed, 107 insertions(+), 93 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf index 20cc9189bb..06ecae228b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf @@ -23,7 +23,7 @@ eNBs = component_carriers = ( { - node_function = "NGFI_RCC_IF4"; + node_function = "NGFI_RCC_IF4p5"; node_timing = "synch_to_ext_device"; node_synch_ref = 0; frame_type = "FDD"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf index f828dfb1c7..5fbdad1fa6 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf @@ -23,7 +23,7 @@ eNBs = component_carriers = ( { - node_function = "NGFI_RRU_IF4"; + node_function = "NGFI_RRU_IF4p5"; node_timing = "synch_to_ext_device"; node_synch_ref = 0; frame_type = "FDD"; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 43ae984197..5f0c033826 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -159,7 +159,7 @@ static struct { void exit_fun(const char* s); -void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst); +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *); void stop_eNB(int nb_inst); @@ -1218,16 +1218,17 @@ static void* eNB_thread_FH( void* param ) { wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif - // Start RF device if any - if (eNB->start_rf) - if (eNB->start_rf(eNB) != 0) - LOG_E(HW,"Could not start the RF device\n"); // Start IF device if any if (eNB->start_if) if (eNB->start_if(eNB) != 0) LOG_E(HW,"Could not start the IF device\n"); + // Start RF device if any + if (eNB->start_rf) + if (eNB->start_rf(eNB) != 0) + LOG_E(HW,"Could not start the RF device\n"); + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { @@ -1743,11 +1744,13 @@ extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc); extern void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc); extern void do_prach(PHY_VARS_eNB *eNB,eNB_proc_t *proc); -void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst) { +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *eth_params) { int CC_id; int inst; PHY_VARS_eNB *eNB; + int ret; + for (inst=0;instnode_timing = node_timing[CC_id]; eNB->abstraction_flag = 0; LOG_I(PHY,"Initializing eNB %d CC_id %d : (%s,%s)\n",inst,CC_id,eNB_functions[node_function[CC_id]],eNB_timing[node_timing[CC_id]]); + switch (node_function[CC_id]) { case NGFI_RRU_IF5: - eNB->do_prach = NULL; - eNB->fep = eNB_fep_rru_if5; - eNB->proc_uespec_rx = NULL; - eNB->proc_tx = NULL; - eNB->tx_fh = NULL; - eNB->rx_fh = rx_rf; - eNB->start_rf = start_rf; - eNB->start_if = start_if; + eNB->do_prach = NULL; + eNB->fep = eNB_fep_rru_if5; + eNB->proc_uespec_rx = NULL; + eNB->proc_tx = proc_tx_rru_if5;; + eNB->tx_fh = NULL; + eNB->rx_fh = rx_rf; + eNB->start_rf = start_rf; + eNB->start_if = start_if; + ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); + if (ret<0) { + printf("Exiting, cannot initialize rf device\n"); + exit(-1); + } + eNB->rfdevice.host_type = RRH_HOST; + eNB->ifdevice.host_type = RRH_HOST; + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } break; case NGFI_RRU_IF4p5: - eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; - eNB->proc_uespec_rx = NULL; - eNB->proc_tx = proc_tx_rru_if4p5; - eNB->tx_fh = NULL; - eNB->rx_fh = rx_rf; - eNB->start_rf = start_rf; - eNB->start_if = start_if; + eNB->do_prach = do_prach; + eNB->fep = eNB_fep_full; + eNB->proc_uespec_rx = NULL; + eNB->proc_tx = proc_tx_rru_if4p5; + eNB->tx_fh = NULL; + eNB->rx_fh = rx_rf; + eNB->start_rf = start_rf; + eNB->start_if = start_if; + ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); + if (ret<0) { + printf("Exiting, cannot initialize rf device\n"); + exit(-1); + } + eNB->rfdevice.host_type = RRH_HOST; + eNB->ifdevice.host_type = RRH_HOST; + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } + malloc_IF4p5_buffer(eNB); + break; case eNodeB_3GPP: - eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; - eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; - eNB->proc_tx = proc_tx_full; - eNB->tx_fh = NULL; - eNB->rx_fh = rx_rf; - eNB->start_rf = start_rf; - eNB->start_if = NULL; + eNB->do_prach = do_prach; + eNB->fep = eNB_fep_full; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_full; + eNB->tx_fh = NULL; + eNB->rx_fh = rx_rf; + eNB->start_rf = start_rf; + eNB->start_if = NULL; + ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); + if (ret<0) { + printf("Exiting, cannot initialize rf device\n"); + exit(-1); + } + eNB->rfdevice.host_type = BBU_HOST; + eNB->ifdevice.host_type = BBU_HOST; break; case eNodeB_3GPP_BBU: eNB->do_prach = do_prach; @@ -1796,6 +1835,15 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->rx_fh = rx_fh_if5; eNB->start_rf = NULL; eNB->start_if = start_if; + eNB->rfdevice.host_type = BBU_HOST; + + eNB->ifdevice.host_type = BBU_HOST; + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } break; case NGFI_RCC_IF4p5: eNB->do_prach = do_prach; @@ -1806,7 +1854,16 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->rx_fh = rx_fh_if4p5; eNB->start_rf = NULL; eNB->start_if = start_if; + eNB->rfdevice.host_type = BBU_HOST; + eNB->ifdevice.host_type = BBU_HOST; + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } malloc_IF4p5_buffer(eNB); + break; case NGFI_RAU_IF4p5: eNB->do_prach = do_prach; @@ -1817,8 +1874,18 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->rx_fh = rx_fh_if4p5; eNB->start_rf = NULL; eNB->start_if = start_if; - malloc_IF4p5_buffer(eNB); + + eNB->rfdevice.host_type = BBU_HOST; + eNB->ifdevice.host_type = BBU_HOST; + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } break; + malloc_IF4p5_buffer(eNB); + } } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 38c95a4122..f2c3614850 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -119,7 +119,7 @@ unsigned short config_frames[4] = {2,9,11,13}; // In lte-enb.c extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); -extern void init_eNB(eNB_func_t *, eNB_timing_t *,int); +extern void init_eNB(eNB_func_t *, eNB_timing_t *,int,eth_params_t *); extern void stop_eNB(int); extern void kill_eNB_proc(void); @@ -1643,64 +1643,6 @@ int main( int argc, char **argv ) openair0_cfg[0].log_level = glog_level; - if (UE_flag == 0) { - for (CC_id=0; CC_idrfdevice.host_type = RRH_HOST; - PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST; - } else { - PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = BBU_HOST; - PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = BBU_HOST; - } - } - } - else { - /* device host type is set*/ - PHY_vars_UE_g[0][0]->rfdevice.host_type = BBU_HOST; - /* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */ - PHY_vars_UE_g[0][0]->rfdevice.type = NONE_DEV; - /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ - PHY_vars_UE_g[0][0]->rfdevice.transp_type = NONE_TP; - } - - int returns=-1; - - // Load RF device and initialize - for (CC_id=0; CC_idrfdevice), &openair0_cfg[0]) : - openair0_device_load(&(PHY_vars_UE_g[0][CC_id]->rfdevice), &openair0_cfg[0]); - - printf("openair0_device_init returns %d for CC_id %d\n",returns,CC_id); - if (returns<0) { - printf("Exiting, cannot initialize device\n"); - exit(-1); - } - } else if (mode==loop_through_memory) { - - } - } - } - - // Load transport protocol and initialize - for (CC_id=0; CC_idifdevice), &openair0_cfg[0], (eth_params+CC_id)); - printf("openair0_transport_init returns %d for CC_id %d\n",returns,CC_id); - if (returns<0) { - printf("Exiting, cannot initialize transport protocol\n"); - exit(-1); - } - } else if (mode==loop_through_memory) { - - } - } - } - - printf("Done initializing RF and IF devices\n"); mac_xface = malloc(sizeof(MAC_xface)); @@ -1854,7 +1796,7 @@ int main( int argc, char **argv ) // start the main thread if (UE_flag == 1) init_UE(1); - else init_eNB(node_function,node_timing,1); + else init_eNB(node_function,node_timing,1,eth_params); // Sleep to allow all threads to setup sleep(3); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 73e9197588..3fda5d735f 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -179,12 +179,17 @@ void init_UE(int nb_inst) { int error_code; int inst; PHY_VARS_UE *UE; + int ret; for (inst=0;instrfdevice), &openair0_cfg[0]); + UE->rfdevice.host_type = BBU_HOST; + UE->rfdevice.type = NONE_DEV; error_code = pthread_create(&UE->proc.pthread_ue, &UE->proc.attr_ue, UE_thread, NULL); if (error_code!= 0) { From 2a621d319cad4cc2dbfe8f275cb8253ed06c8480 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 15:50:05 +0200 Subject: [PATCH 148/340] rcc if5 configuration file --- .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf index 20cc9189bb..bba251f2d9 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf @@ -23,7 +23,7 @@ eNBs = component_carriers = ( { - node_function = "NGFI_RCC_IF4"; + node_function = "NGFI_RCC_IF4p5"; node_timing = "synch_to_ext_device"; node_synch_ref = 0; frame_type = "FDD"; @@ -155,13 +155,13 @@ eNBs = rrh_gw_config = ( { - local_if_name = "eth2"; - remote_address = "00:13:95:1f:a0:af"; - local_address = "90:e2:ba:c5:fc:04"; + local_if_name = "eth0"; + remote_address = "74:d4:35:cc:8d:15"; + local_address = "34:e6:d7:3c:ae:fc"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw_if4"; + tr_preference = "raw_if4p5"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; From 5817a62c37ddb0bfe10af8ecac0552ec45d38410 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 17:02:43 +0200 Subject: [PATCH 149/340] vcd dumping for send/recv IF5 --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 15 +++++++++------ openair2/UTIL/LOG/vcd_signal_dumper.c | 2 ++ openair2/UTIL/LOG/vcd_signal_dumper.h | 2 ++ targets/RT/USER/lte-enb.c | 17 ++++++++++------- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 92d516d7e8..1f3c76ddd4 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -62,14 +62,15 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe txp[i] = (void*)&eNB->common_vars.txdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { - + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); eNB->ifdevice.trx_write_func(&eNB->ifdevice, (proc_timestamp + packet_id*spp_eth), txp, spp_eth, fp->nb_antennas_tx, 0); - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); for (i=0; i < fp->nb_antennas_tx; i++) txp[i] += spp_eth; @@ -82,13 +83,14 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); eNB->ifdevice.trx_write_func(&eNB->ifdevice, (proc_timestamp + packet_id*spp_eth), rxp, spp_eth, fp->nb_antennas_rx, 0); - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); for (i=0; i < fp->nb_antennas_rx; i++) rxp[i] += spp_eth; @@ -172,12 +174,13 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], txp, spp_eth, fp->nb_antennas_tx); - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); for (i=0; i < fp->nb_antennas_tx; i++) txp[i] += spp_eth; @@ -191,13 +194,13 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti]; for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], rxp, spp_eth, fp->nb_antennas_rx); - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); for (i=0; i < fp->nb_antennas_rx; i++) rxp[i] += spp_eth; diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index db00a8c35f..7779fe5290 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -189,6 +189,8 @@ const char* eurecomFunctionsNames[] = { "rt_sleep", "trx_read", "trx_write", + "trx_read_if", + "trx_write_if", "eNB_thread_rxtx0", "eNB_thread_rxtx1", "ue_thread_synch", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 433d155a6c..4c5e5cc1b8 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -163,6 +163,8 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP=0, VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, + VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, + VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0, VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX1, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_SYNCH, diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 5f0c033826..ed8cfefecb 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -291,6 +291,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { void tx_fh_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { uint8_t seqno; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, proc->timestamp_tx&0xffffffff ); send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL); } @@ -847,7 +848,7 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { if (proc->first_rx==0) { - // Transmit TX buffer based on timestamp from RX + // Transmit TX buffer based on timestamp from RX VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers @@ -882,6 +883,8 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { rxp, fp->samples_per_tti, fp->nb_antennas_rx); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; @@ -906,11 +909,11 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - if (rxs != fp->samples_per_tti) - exit_fun( "problem receiving samples" ); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - + if (rxs != fp->samples_per_tti) + exit_fun( "problem receiving samples" ); + + + } void rx_fh_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame, int *subframe) { @@ -1764,7 +1767,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = NULL; eNB->fep = eNB_fep_rru_if5; eNB->proc_uespec_rx = NULL; - eNB->proc_tx = proc_tx_rru_if5;; + eNB->proc_tx = proc_tx_rru_if5; eNB->tx_fh = NULL; eNB->rx_fh = rx_rf; eNB->start_rf = start_rf; From ec209bd43e053e471611015972800251a9004389 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 19:33:39 +0200 Subject: [PATCH 150/340] if5 modifications. Use of asynchronous RX thread for RCC->RRU IF5 link --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 10 +- openair1/PHY/defs.h | 18 ++-- targets/RT/USER/lte-enb.c | 134 ++++++++++++++++--------- 3 files changed, 104 insertions(+), 58 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 1f3c76ddd4..8f5b7b32fe 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -66,7 +66,7 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); eNB->ifdevice.trx_write_func(&eNB->ifdevice, (proc_timestamp + packet_id*spp_eth), - txp, + (void**)txp, spp_eth, fp->nb_antennas_tx, 0); @@ -86,7 +86,7 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); eNB->ifdevice.trx_write_func(&eNB->ifdevice, (proc_timestamp + packet_id*spp_eth), - rxp, + (void**)rxp, spp_eth, fp->nb_antennas_rx, 0); @@ -131,7 +131,7 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe // Write the packet to the fronthaul if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice, packet_id, - &tx_buffer, + (void**)&tx_buffer, db_fulllength, 1, IF5_MOBIPASS)) < 0) { @@ -177,7 +177,7 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], - txp, + (void**)txp, spp_eth, fp->nb_antennas_tx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); @@ -197,7 +197,7 @@ void recv_IF5(PHY_VARS_eNB *eNB, openair0_timestamp *proc_timestamp, int subfram VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); eNB->ifdevice.trx_read_func(&eNB->ifdevice, ×tamp[packet_id], - rxp, + (void**)rxp, spp_eth, fp->nb_antennas_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 7bcc3810ae..8e88fba00d 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -252,10 +252,12 @@ typedef struct eNB_proc_t_s { /// \brief Instance count for rx processing thread. /// \internal This variable is protected by \ref mutex_prach. int instance_cnt_prach; + /// \internal This variable is protected by \ref mutex_asynch_rxtx. + int instance_cnt_asynch_rxtx; /// pthread structure for FH processing thread pthread_t pthread_FH; - /// pthread structure for asychronous RX processing thread - pthread_t pthread_asynch_rx; + /// pthread structure for asychronous RX/TX processing thread + pthread_t pthread_asynch_rxtx; /// flag to indicate first RX acquisition int first_rx; /// pthread attributes for FH processing thread @@ -263,23 +265,27 @@ typedef struct eNB_proc_t_s { /// pthread attributes for prach processing thread pthread_attr_t attr_prach; /// pthread attributes for asynchronous RX thread - pthread_attr_t attr_asynch_rx; + pthread_attr_t attr_asynch_rxtx; /// scheduling parameters for FH thread struct sched_param sched_param_FH; /// scheduling parameters for prach thread struct sched_param sched_param_prach; - /// scheduling parameters for asynch_rx thread - struct sched_param sched_param_asynch_rx; - /// condition variable for FH thread + /// scheduling parameters for asynch_rxtx thread + struct sched_param sched_param_asynch_rxtx; + /// pthread structure for PRACH thread pthread_t pthread_prach; /// condition variable for FH thread pthread_cond_t cond_FH; /// condition variable for PRACH processing thread; pthread_cond_t cond_prach; + /// condition variable for asynch RX/TX thread + pthread_cond_t cond_asynch_rxtx; /// mutex for FH pthread_mutex_t mutex_FH; /// mutex for PRACH thread pthread_mutex_t mutex_prach; + /// mutex for asynch RX/TX thread + pthread_mutex_t mutex_asynch_rxtx; /// set of scheduling variables RXn-TXnp4 threads eNB_rxtx_proc_t proc_rxtx[2]; /// number of slave threads diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index ed8cfefecb..732fec7a4f 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -641,21 +641,22 @@ static void wait_system_ready (char *message, volatile int *start_flag) { #endif /*! - * \brief The Asynchronous RX FH thread of RAU/RCC/eNB. + * \brief The Asynchronous RX/TX FH thread of RAU/RCC/eNB/RRU. * This handles the RX FH for an asynchronous RRU/UE * \param param is a \ref eNB_proc_t structure which contains the info what to process. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -static void* eNB_thread_asynch_rx( void* param ) { +static void* eNB_thread_asynch_rxtx( void* param ) { - static int eNB_thread_asynch_rx_status; + static int eNB_thread_asynch_rxtx_status; eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - openair0_timestamp timestamp_rx; - int frame_rx,subframe_rx; + openair0_timestamp timestamp_rx,timestamp_tx; + int frame_rx,subframe_rx=0,subframe_tx=0; static int first_rx = 1; + static int first_tx = 1; uint16_t packet_type; uint32_t symbol_number=0; uint32_t symbol_mask, symbol_mask_full; @@ -768,40 +769,67 @@ static void* eNB_thread_asynch_rx( void* param ) { printf( "got sync (eNB_thread_asynch_rx)\n" ); - if (eNB->node_function == eNodeB_3GPP) { // acquisition from RF - if (eNB->rfdevice.trx_read_func) - rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, - &proc->timestamp_rx, - (void**)dummy_rx, - fp->samples_per_tti, - fp->nb_antennas_rx); - else { - printf("eNB asynch RX\n"); - sleep(1); + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe + printf( "waiting for devices (eNB_thread_asynch_rx)\n"); + pthread_mutex_lock( &proc->mutex_asynch_rxtx); + + while (proc->instance_cnt_asynch_rxtx<0) + pthread_cond_wait( &proc->cond_asynch_rxtx, &proc->mutex_asynch_rxtx ); + + pthread_mutex_unlock(&proc->mutex_asynch_rxtx); + + printf( "devices ok (eNB_thread_asynch_rx)\n"); + + while (!oai_exit) { + if (eNB->node_function == eNodeB_3GPP) { // acquisition from RF + + if (eNB->rfdevice.trx_read_func) + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &proc->timestamp_rx, + (void**)dummy_rx, + fp->samples_per_tti, + fp->nb_antennas_rx); + else { + printf("eNB asynch RX\n"); + sleep(1); + } + if (rxs!=fp->samples_per_tti) { + exit_fun("error receiving samples\n"); + } } - if (rxs!=fp->samples_per_tti) { - exit_fun("error receiving samples\n"); - } - } - else if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF + else if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF /// **** recv_IF5 of rxdata from RRH **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); - recv_IF5(eNB, ×tamp_rx, subframe_rx++, IF5_RRH_GW_UL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); - if (first_rx == 1) { - first_rx = 0; - subframe_rx = (timestamp_rx/fp->samples_per_tti)%10; - } - else { - // check timestamp - if ((timestamp_rx - proc->timestamp_rx) < (2*fp->samples_per_tti)) - printf("RX overflow ...\n"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); + recv_IF5(eNB, ×tamp_rx, subframe_rx++, IF5_RRH_GW_UL); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); + if (first_rx == 1) { + first_rx = 0; + subframe_rx = (timestamp_rx/fp->samples_per_tti)%10; + } + else { + // check timestamp + if ((timestamp_rx - proc->timestamp_rx) < (2*fp->samples_per_tti)) + printf("RX overflow ...\n"); + + } + } // eNodeB_3GPP_BBU + + else if (eNB->node_function == NGFI_RRU_IF5) { + /// **** recv_IF5 of rxdata from RRH **** /// + subframe_tx = (subframe_tx+1)%10; + + recv_IF5(eNB, ×tamp_tx, subframe_tx, IF5_RRH_GW_DL); + printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); + if (first_tx == 1) { + first_tx = 0; + subframe_tx = (timestamp_tx/fp->samples_per_tti)%10; + + } + } - } // eNodeB_3GPP_BBU - - else if (eNB->node_function == NGFI_RCC_IF4p5) { + else if (eNB->node_function == NGFI_RCC_IF4p5) { /// **** recv_IF4p5 of rxdataF from RRU **** /// /// **** recv_IF4p5 of rxsigF from RRU **** /// // get frame/subframe information from IF4p5 interface @@ -811,10 +839,10 @@ static void* eNB_thread_asynch_rx( void* param ) { symbol_mask = 0; symbol_mask_full = (1<symbols_per_tti)-1; prach_rx = 0; - + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! recv_IF4p5(eNB, &frame_rx, &subframe_rx, &packet_type, &symbol_number); - + if (packet_type == IF4p5_PULFFT) { symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; @@ -834,9 +862,9 @@ static void* eNB_thread_asynch_rx( void* param ) { else { // should not get here AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); } - - eNB_thread_asynch_rx_status=0; - return(&eNB_thread_asynch_rx_status); + } + eNB_thread_asynch_rxtx_status=0; + return(&eNB_thread_asynch_rxtx_status); } void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { @@ -848,16 +876,17 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { if (proc->first_rx==0) { - // Transmit TX buffer based on timestamp from RX + // Transmit TX buffer based on timestamp from RX + printf("trx_write -> USRP TS %llu (sf %d)\n", (proc->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers for (i=0; inb_antennas_tx; i++) - txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+3)%10)*fp->samples_per_tti]; + txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+2)%10)*fp->samples_per_tti]; txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice, - proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, + proc->timestamp_rx+(2*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, txp, fp->samples_per_tti, fp->nb_antennas_tx, @@ -877,7 +906,7 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][*subframe*fp->samples_per_tti]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, &(proc->timestamp_rx), rxp, @@ -888,6 +917,7 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + printf("trx_read <- USRP TS %llu (sf %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->first_rx); if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ @@ -1232,6 +1262,12 @@ static void* eNB_thread_FH( void* param ) { if (eNB->start_rf(eNB) != 0) LOG_E(HW,"Could not start the RF device\n"); + // unlock asnych_rxtx thread + pthread_mutex_lock(&proc->mutex_asynch_rxtx); + proc->instance_cnt_asynch_rxtx=0; + pthread_mutex_unlock(&proc->mutex_asynch_rxtx); + pthread_cond_signal(&proc->cond_asynch_rxtx); + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { @@ -1527,6 +1563,7 @@ void init_eNB_proc(int inst) { proc_rxtx[1].instance_cnt_rxtx = -1; proc->instance_cnt_prach = -1; proc->instance_cnt_FH = -1; + proc->instance_cnt_asynch_rxtx = -1; proc->CC_id = CC_id; proc->first_rx=4; @@ -1534,24 +1571,27 @@ void init_eNB_proc(int inst) { pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); pthread_mutex_init( &proc->mutex_prach, NULL); + pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL); pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); pthread_cond_init( &proc->cond_prach, NULL); pthread_cond_init( &proc->cond_FH, NULL); + pthread_cond_init( &proc->cond_asynch_rxtx, NULL); #ifndef DEADLINE_SCHEDULER pthread_create( &proc_rxtx[0].pthread_rxtx, &proc_rxtx[0].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[0] ); pthread_create( &proc_rxtx[1].pthread_rxtx, &proc_rxtx[1].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[1] ); pthread_create( &proc->pthread_FH, &proc->attr_FH, eNB_thread_FH, &eNB->proc ); pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); - if (eNB->node_timing == synch_to_other) - pthread_create( &proc->pthread_asynch_rx, &proc->attr_asynch_rx, eNB_thread_asynch_rx, &eNB->proc ); + if ((eNB->node_timing == synch_to_other) || + (eNB->node_function == NGFI_RRU_IF5)) + pthread_create( &proc->pthread_asynch_rxtx, &proc->attr_asynch_rxtx, eNB_thread_asynch_rxtx, &eNB->proc ); #else pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); pthread_create( &proc->pthread_FH, NULL, eNB_thread_FH, &eNB->proc ); pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); if (eNB->node_timing == synch_to_other) - pthread_create( &proc->pthread_asynch_rx, NULL, eNB_thread_asynch_rx, &eNB->proc ); + pthread_create( &proc->pthread_asynch_rxtx, NULL, eNB_thread_asynch_rxtx, &eNB->proc ); #endif char name[16]; @@ -1767,7 +1807,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = NULL; eNB->fep = eNB_fep_rru_if5; eNB->proc_uespec_rx = NULL; - eNB->proc_tx = proc_tx_rru_if5; + eNB->proc_tx = NULL; eNB->tx_fh = NULL; eNB->rx_fh = rx_rf; eNB->start_rf = start_rf; From 4b6da53f6d0b311e40b228b4e84d3d2dce15d07f Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 19:41:31 +0200 Subject: [PATCH 151/340] added timeout on ETHERNET recv --- targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index f2c69985bf..d530558816 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -72,7 +72,7 @@ int trx_eth_start(openair0_device *device) { } /* adjust MTU wrt number of samples per packet */ if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; - + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; } else if (eth->flags == ETH_RAW_IF4p5_MODE) { if (eth_socket_init_raw(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ @@ -83,7 +83,8 @@ int trx_eth_start(openair0_device *device) { } /* adjust MTU wrt number of samples per packet */ if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; - + if(ethernet_tune (device,RCV_TIMEOUT,5000)!=0) return -1; + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { @@ -225,15 +226,15 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case RCV_TIMEOUT: - timeout.tv_sec = value/1000000000; - timeout.tv_usec = value%1000000000;//less than rt_period? + timeout.tv_sec = value/1000000; + timeout.tv_usec = value%1000000;//less than rt_period? if (setsockopt(eth->sockfd[Mod_id], SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout))) { perror("[ETHERNET] setsockopt()"); } else { - printf( "receive timeout= %d,%d sec\n",timeout.tv_sec,timeout.tv_usec); + printf( "receive timeout= %u usec\n",timeout.tv_usec); } break; From b2c21c624642462ccd76bee437285846a2b1d91f Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 21:19:26 +0200 Subject: [PATCH 152/340] configuration files for IF5 rru (5,10 MHz) --- .../rru.band7.tm1.50PRB.if5.usrpb210.conf | 190 ++++++++++++++++++ .../CONF/rru.band7.tm1.if5.usrpb210.conf | 190 ++++++++++++++++++ targets/RT/USER/lte-enb.c | 8 +- 3 files changed, 384 insertions(+), 4 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.50PRB.if5.usrpb210.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if5.usrpb210.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.50PRB.if5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.50PRB.if5.usrpb210.conf new file mode 100644 index 0000000000..902420ae08 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.50PRB.if5.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "34:e6:d7:3c:ae:fc"; + local_address = "74:d4:35:cc:8d:15"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if5.usrpb210.conf new file mode 100644 index 0000000000..8e1e1441bf --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if5.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "34:e6:d7:3c:ae:fc"; + local_address = "74:d4:35:cc:8d:15"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 732fec7a4f..da40b58379 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -821,7 +821,7 @@ static void* eNB_thread_asynch_rxtx( void* param ) { subframe_tx = (subframe_tx+1)%10; recv_IF5(eNB, ×tamp_tx, subframe_tx, IF5_RRH_GW_DL); - printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); + // printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); if (first_tx == 1) { first_tx = 0; subframe_tx = (timestamp_tx/fp->samples_per_tti)%10; @@ -877,8 +877,8 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { if (proc->first_rx==0) { // Transmit TX buffer based on timestamp from RX - printf("trx_write -> USRP TS %llu (sf %d)\n", (proc->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + // printf("trx_write -> USRP TS %llu (sf %d)\n", (proc->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(2*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers @@ -917,7 +917,7 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; - printf("trx_read <- USRP TS %llu (sf %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->first_rx); + // printf("trx_read <- USRP TS %llu (sf %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->first_rx); if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ From 56e85db773f3600dd7c7aac0ffcea78c2d493581 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 31 Jul 2016 21:30:13 +0200 Subject: [PATCH 153/340] configuration files for RCC IF5 5,10 MHz --- openair1/PHY/LTE_TRANSPORT/prach.c | 1 + openair1/SCHED/phy_procedures_lte_eNb.c | 2 +- .../rcc.band7.tm1.50PRB.if5.usrpb210.conf | 190 ++++++++++++++++++ .../CONF/rcc.band7.tm1.if5.usrpb210.conf | 190 ++++++++++++++++++ 4 files changed, 382 insertions(+), 1 deletion(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index dfdf4ed470..0adb8685f0 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1183,6 +1183,7 @@ void rx_prach(PHY_VARS_eNB *eNB, if ((eNB->node_function == eNodeB_3GPP) || + (eNB->node_function == eNodeB_3GPP_BBU) || (eNB->node_function == NGFI_RRU_IF4p5)) { // compute the DFTs of the PRACH temporal resources // Do forward transform for (aa=0; aaUE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits eNB->UE_stats[(uint32_t)UE_id].sector = 0; - LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", + LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, eNB->CC_id, frame, diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf new file mode 100644 index 0000000000..4929f39b3b --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if5.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP_BBU"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "74:d4:35:cc:8d:15"; + local_address = "34:e6:d7:3c:ae:fc"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf new file mode 100644 index 0000000000..b9030cf439 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP_BBU"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "74:d4:35:cc:8d:15"; + local_address = "34:e6:d7:3c:ae:fc"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); From 9ec462e8802b5418c31cd0619cc8def512eb73e5 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 1 Aug 2016 20:30:42 +0200 Subject: [PATCH 154/340] debugging for IF4p5 --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 1 + openair1/PHY/defs.h | 8 +- .../CONF/rru.band7.tm1.if4p5.usrpb210.conf | 190 ++++++++++++++++++ targets/RT/USER/lte-enb.c | 38 +--- targets/RT/USER/lte-softmodem.c | 11 +- 5 files changed, 205 insertions(+), 43 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 738fe842b6..217492dba6 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -261,6 +261,7 @@ void gen_IF4p5_dl_header(IF4p5_header_t *dl_packet, int frame, int subframe) { void gen_IF4p5_ul_header(IF4p5_header_t *ul_packet, int frame, int subframe) { + ul_packet->type = IF4p5_PACKET_TYPE; ul_packet->sub_type = IF4p5_PULFFT; diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 8e88fba00d..dd78e575bb 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -160,10 +160,10 @@ enum transmission_access_mode { typedef enum { eNodeB_3GPP=0, // classical eNodeB function eNodeB_3GPP_BBU, // eNodeB with NGFI IF5 - NGFI_RRU_IF5, // NGFI_RRU with IF5 - NGFI_RRU_IF4p5, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4p5) - NGFI_RCC_IF4p5, // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4p5) - NGFI_RAU_IF4p5 + NGFI_RCC_IF4p5, // NGFI_RCC (NGFI radio cloud center) + NGFI_RAU_IF4p5, + NGFI_RRU_IF5, // NGFI_RRU (NGFI remote radio-unit,IF5) + NGFI_RRU_IF4p5 // NGFI_RRU (NGFI remote radio-unit,IF4p5) } eNB_func_t; typedef enum { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf new file mode 100644 index 0000000000..f99cdab2a2 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "34:e6:d7:3c:ae:fc"; + local_address = "74:d4:35:cc:8d:15"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index da40b58379..b0d1eb3d0e 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1248,7 +1248,8 @@ static void* eNB_thread_FH( void* param ) { printf( "got sync (eNB_thread_FH)\n" ); #if defined(ENABLE_ITTI) - wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); + if (eNB->node_function < NGFI_RRU_IF5) + wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif @@ -1938,45 +1939,12 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst sleep(1); LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); - /* - printf("Creating main eNB_thread \n"); - error_code = pthread_create( &main_eNB_thread, &attr_dlsch_threads, eNB_thread, NULL ); - - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code); - } else { - LOG_D( HW, "[lte-softmodem.c] Allocate eNB_thread successful\n" ); - pthread_setname_np( main_eNB_thread, "main eNB" ); - } - */ + } void stop_eNB(int nb_inst) { - /* -#ifdef DEBUG_THREADS - printf("Joining eNB_thread ..."); -#endif - - int *eNB_thread_status_p; - int result = pthread_join( main_eNB_thread, (void**)&eNB_thread_status_p ); - -#ifdef DEBUG_THREADS - if (result != 0) { - printf( "\nError joining main_eNB_thread.\n" ); - } else { - if (eNB_thread_status_p) { - printf( "status %d\n", *eNB_thread_status_p ); - } else { - printf( "The thread was killed. No status available.\n"); - } - } -#else - UNUSED(result); -#endif // DEBUG_THREADS - */ - for (int inst=0;inst Date: Mon, 1 Aug 2016 20:39:01 +0200 Subject: [PATCH 155/340] debugging for IF4p5 --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 3 +- openair2/ENB_APP/enb_config.c | 10 +- openair2/ENB_APP/enb_config.h | 4 +- .../CONF/enb.band7.tm1.exmimo2.conf | 12 +- .../CONF/rcc.band7.tm1.if4p5.usrpb210.conf | 190 ++++++++++++++++++ targets/RT/USER/lte-softmodem.c | 4 +- 6 files changed, 207 insertions(+), 16 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.usrpb210.conf diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 738fe842b6..4a4448ef76 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -197,7 +197,8 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t *frame = ((packet_header->frame_status)>>6)&0xffff; *subframe = ((packet_header->frame_status)>>22)&0x000f; - + + if (*packet_type == IF4p5_PDLFFT) { *symbol_number = ((packet_header->frame_status)>>26)&0x000f; diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 770b4afa25..02e61711b8 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -303,7 +303,7 @@ void enb_config_display(void) printf( "\ttx_scheduling_advance :\t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_scheduling_advance); printf( "\ttx_sample_advance : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_sample_advance); printf( "\tiq_txshift : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].iq_txshift); - printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : (enb_properties.properties[i]->rrh_gw_config[j].rawif4 == 1)? "RAW_IF4" : (enb_properties.properties[i]->rrh_gw_config[j].udpif4 == 1)? "UDP_IF4" : (enb_properties.properties[i]->rrh_gw_config[j].rawif5_mobipass == 1)? "RAW_IF5_MOBIPASS" : "UDP"); + printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : (enb_properties.properties[i]->rrh_gw_config[j].rawif4p5 == 1)? "RAW_IF4p5" : (enb_properties.properties[i]->rrh_gw_config[j].udpif4p5 == 1)? "UDP_IF4p5" : (enb_properties.properties[i]->rrh_gw_config[j].rawif5_mobipass == 1)? "RAW_IF5_MOBIPASS" : "UDP"); if (enb_properties.properties[i]->rrh_gw_config[j].exmimo == 1) { printf( "\tRF target : \tEXMIMO:\n"); } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_b200 == 1) { @@ -2296,10 +2296,10 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; } else if (strcmp(tr_preference, "raw") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; - } else if (strcmp(tr_preference, "udp_if4") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udpif4 = 1; - } else if (strcmp(tr_preference, "raw_if4") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rawif4 = 1; + } else if (strcmp(tr_preference, "udp_if4p5") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udpif4p5 = 1; + } else if (strcmp(tr_preference, "raw_if4p5") == 0) { + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rawif4p5 = 1; } else if (strcmp(tr_preference, "raw_if5_mobipass") == 0) { enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rawif5_mobipass = 1; } else {//if (strcmp(preference, "no") == 0) diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 6a8483c3d0..62418197f0 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -87,8 +87,8 @@ typedef struct rrh_gw_config_s { char *remote_address; uint16_t local_port; uint16_t remote_port; - uint8_t udpif4; - uint8_t rawif4; + uint8_t udpif4p5; + uint8_t rawif4p5; uint8_t rawif5_mobipass; int tx_scheduling_advance; int tx_sample_advance; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf index 7bf097875d..4cec39bdc7 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -134,7 +134,7 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.171"; + mme_ip_address = ( { ipv4 = "127.0.0.3"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -143,17 +143,17 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth2"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.80/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth2"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.80/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; log_config : { - global_log_level ="debug"; + global_log_level ="info"; global_log_verbosity ="medium"; hw_log_level ="info"; hw_log_verbosity ="medium"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.usrpb210.conf new file mode 100644 index 0000000000..e8ffde20b6 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "74:d4:35:cc:8d:15"; + local_address = "34:e6:d7:3c:ae:fc"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index f2c3614850..8ac5a8307f 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1055,9 +1055,9 @@ static void get_options (int argc, char **argv) if (enb_properties->properties[i]->rrh_gw_config[j].raw == 1) { (eth_params+j)->transp_preference = ETH_RAW_MODE; - } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif4 == 1) { + } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif4p5 == 1) { (eth_params+j)->transp_preference = ETH_RAW_IF4p5_MODE; - } else if (enb_properties->properties[i]->rrh_gw_config[j].udpif4 == 1) { + } else if (enb_properties->properties[i]->rrh_gw_config[j].udpif4p5 == 1) { (eth_params+j)->transp_preference = ETH_UDP_IF4p5_MODE; } else if (enb_properties->properties[i]->rrh_gw_config[j].rawif5_mobipass == 1) { (eth_params+j)->transp_preference = ETH_RAW_IF5_MOBIPASS; From 350465fdef1a8be56155f35f2b03ddda52ae08e7 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 3 Aug 2016 21:14:38 +0200 Subject: [PATCH 156/340] fix 20 MHz config file --- .../GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf index 210c7ea740..534ed62dfd 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf @@ -22,6 +22,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; From 714bae4ffd766bb7d17e210dc2be59350c508936 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 3 Aug 2016 21:17:41 +0200 Subject: [PATCH 157/340] minor fix for installation --- cmake_targets/tools/build_helper | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index ac8d9f34c1..c91de1ea77 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -205,10 +205,8 @@ install_gnutls_from_source(){ cd /tmp echo "Downloading gnutls archive" $SUDO rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23 - wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz - if [ $? -ne 0 ]; then + wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz || \ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz - fi if [ ! -f gnutls-3.1.23.tar.xz ]; then echo_error "Could not download gnutls source files" cd - From dc124abbad5d63105c3587f2eb51f3c896bc666a Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 30 Jul 2016 20:57:37 +0200 Subject: [PATCH 158/340] remove nano from test setup --- cmake_targets/autotests/test_case_list.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 2fecd2b292..0bc09f261a 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1,6 +1,6 @@ -mozart tique stevens nano amerique +mozart tique stevens amerique /mnt/sradio/TEST_RESULTS/ https://gitlab.eurecom.fr/oai/openairinterface5g.git https://gitlab.eurecom.fr/oai/openair-cn.git @@ -12,7 +12,7 @@ 36000 010141 0102+ 010304 010305 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015514 015517 015602 015605 015702 015705 015802 015805 015808 015811 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 3 - mozart tique stevens nano amerique + mozart tique stevens amerique compilation Build oaisim.Rel8 From 5056134772bcf574edfc87f66c7c6774fe5d175e Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 4 Aug 2016 00:58:19 +0200 Subject: [PATCH 159/340] debugging of IF4p5 RRU --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 +- openair1/PHY/LTE_TRANSPORT/prach.c | 28 +- openair1/PHY/defs.h | 9 +- openair1/PHY/vars.h | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 21 +- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 3 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 2 +- targets/RT/USER/lte-enb.c | 376 +++++++++++------- targets/RT/USER/lte-softmodem.c | 347 ++++++++-------- targets/SIMU/USER/init_lte.c | 1 + 10 files changed, 464 insertions(+), 327 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 8f01fc5369..655c61c15c 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -133,7 +133,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type } } else if (packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length - db_fulllength = 839*2; + db_fulllength = 840*2; IF4p5_header_t *prach_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 0adb8685f0..df28dfd6fa 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1065,7 +1065,7 @@ void rx_prach(PHY_VARS_eNB *eNB, int i; lte_frame_type_t frame_type = eNB->frame_parms.frame_type; - int subframe = eNB->proc.subframe_rx; + int subframe = eNB->proc.subframe_prach; uint16_t rootSequenceIndex = eNB->frame_parms.prach_config_common.rootSequenceIndex; uint8_t prach_ConfigIndex = eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; uint8_t Ncs_config = eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; @@ -1101,6 +1101,8 @@ void rx_prach(PHY_VARS_eNB *eNB, int fft_size,log2_ifft_size; uint8_t nb_ant_rx = 1; //eNB->frame_parms.nb_antennas_rx; + // int en; + for (aa=0; aacommon_vars.rxdata[0][aa][subframe*eNB->frame_parms.samples_per_tti-eNB->N_TA_offset]; } @@ -1282,8 +1284,11 @@ void rx_prach(PHY_VARS_eNB *eNB, k*=2; /// **** send_IF4 of rxsigF to RCC **** /// - send_IF4p5(eNB, eNB->proc.frame_rx, eNB->proc.subframe_rx, IF4p5_PRACH, k); + send_IF4p5(eNB, eNB->proc.frame_prach, eNB->proc.subframe_prach, IF4p5_PRACH, k); + // en = dB_fixed(signal_energy(&rxsigF[0][k],840)); + // if (en>60) + // printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en); return; } else if (eNB->node_function == NGFI_RCC_IF4p5) { k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; @@ -1469,11 +1474,24 @@ void rx_prach(PHY_VARS_eNB *eNB, #endif // if (aa=1) write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1); }// antennas_rx + #ifdef PRACH_DEBUG - write_output("prach_ifft0.m","prach_t0",prach_ifft[0],2048,1,1); + if (en>40) { + k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; + + if (k<0) + k+=(eNB->frame_parms.ofdm_symbol_size); + + k*=12; + k+=13; + k*=2; + printf("Dumping prach, k = %d (n_ra_prb %d)\n",k,n_ra_prb); + write_output("rxsigF.m","prach_rxF",&rxsigF[0][k],840,1,1); + write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); + write_output("prach_ifft0.m","prach_t0",prach_ifft[0],1024,1,1); + exit(-1); + } #endif - // write_output("prach_ifft1.m","prach_t1",prach_ifft[1],2048,1,1); - } // new dft // check energy in nth time shift diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index dd78e575bb..9b5db4b421 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -260,6 +260,8 @@ typedef struct eNB_proc_t_s { pthread_t pthread_asynch_rxtx; /// flag to indicate first RX acquisition int first_rx; + /// flag to indicate first TX transmission + int first_tx; /// pthread attributes for FH processing thread pthread_attr_t attr_FH; /// pthread attributes for prach processing thread @@ -362,14 +364,15 @@ typedef struct PHY_VARS_eNB_s { eNB_func_t node_function; eNB_timing_t node_timing; int abstraction_flag; - void (*do_prach)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc); - void (*fep)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc); + void (*do_prach)(struct PHY_VARS_eNB_s *eNB); + void (*fep)(struct PHY_VARS_eNB_s *eNB); void (*proc_uespec_rx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type); void (*proc_tx)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *rn); void (*tx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_rxtx_proc_t *proc); - void (*rx_fh)(struct PHY_VARS_eNB_s *eNB,eNB_proc_t *proc,int *frame, int *subframe); + void (*rx_fh)(struct PHY_VARS_eNB_s *eNB,int *frame, int *subframe); int (*start_rf)(struct PHY_VARS_eNB_s *eNB); int (*start_if)(struct PHY_VARS_eNB_s *eNB); + void (*fh_asynch)(struct PHY_VARS_eNB_s *eNB,int *frame, int *subframe); uint8_t local_flag; uint32_t rx_total_gain_dB; LTE_DL_FRAME_PARMS frame_parms; diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h index 85bfe7a2a6..b8cb33239d 100755 --- a/openair1/PHY/vars.h +++ b/openair1/PHY/vars.h @@ -139,7 +139,7 @@ double beta2_dlsch[6][MCS_COUNT] = { {2.52163, 0.83231, 0.77472, 1.36536, 1.1682 */ -char eNB_functions[5][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RRU_IF5","NGFI_RRU_IF4","NGFI_RCC_IF4"}; +char eNB_functions[6][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RCC_IF4p5","NGFI_RAI_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5",}; char eNB_timing[2][20]={"synch_to_ext_device","synch_to_other"}; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6bf9273776..b1c37e9579 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1950,12 +1950,14 @@ void prach_procedures(PHY_VARS_eNB *eNB) { break; } + /* mac_xface->initiate_ra_proc(eNB->Mod_id, eNB->CC_id, frame, preamble_max, preamble_delay_list[preamble_max]*update_TA, 0,subframe,0); + */ } } else { @@ -2490,8 +2492,9 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p } -void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { +void eNB_fep_full(PHY_VARS_eNB *eNB) { + eNB_proc_t *proc = &eNB->proc; int l; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; @@ -2503,7 +2506,7 @@ void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { &eNB->common_vars, l, proc->subframe_rx<<1, - 0, + 0, 0 ); slot_fep_ul(fp, @@ -2519,14 +2522,13 @@ void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { if (eNB->node_function == NGFI_RRU_IF4p5) { /// **** send_IF4 of rxdataF to RCC (no prach now) **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4p5(eNB, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT, 0); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); - } + } } -void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { +void eNB_fep_rru_if5(PHY_VARS_eNB *eNB) { + eNB_proc_t *proc=&eNB->proc; uint8_t seqno=0; /// **** send_IF5 of rxdata to BBU **** /// @@ -2536,8 +2538,9 @@ void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { } -void do_prach(PHY_VARS_eNB *eNB,eNB_proc_t *proc) { +void do_prach(PHY_VARS_eNB *eNB) { + eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; // check if we have to detect PRACH first @@ -2594,9 +2597,9 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_common_RX(%d)\n",eNB->Mod_id,frame,subframe); - if (eNB->fep) eNB->fep(eNB,proc); + if (eNB->fep) eNB->fep(eNB); - if (eNB->do_prach) eNB->do_prach(eNB,proc); + if (eNB->do_prach) eNB->do_prach(eNB); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 02ca6ee7eb..3e06cf0356 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -224,7 +224,8 @@ int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestam eth->tx_nsamps = nblocks; memcpy(buff[0], (void*)ð->eh, MAC_HEADER_SIZE_BYTES); - + + bytes_sent = send(eth->sockfd[Mod_id], buff[0], packet_size, diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index d530558816..869777b6bf 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -83,7 +83,7 @@ int trx_eth_start(openair0_device *device) { } /* adjust MTU wrt number of samples per packet */ if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; - if(ethernet_tune (device,RCV_TIMEOUT,5000)!=0) return -1; + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; } else if (eth->flags == ETH_UDP_IF4p5_MODE) { diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index b0d1eb3d0e..d6e262a4d5 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -365,13 +365,11 @@ void proc_tx_rru_if4p5(PHY_VARS_eNB *eNB, symbol_mask = 0; symbol_mask_full = (1<frame_parms.symbols_per_tti)-1; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); + do { recv_IF4p5(eNB, &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); symbol_mask = symbol_mask | (1<subframe_tx, eNB); } @@ -640,6 +638,151 @@ static void wait_system_ready (char *message, volatile int *start_flag) { } #endif + +// asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU) +void fh_if5_asynch_UL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { + + eNB_proc_t *proc = &eNB->proc; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + recv_IF5(eNB, &proc->timestamp_rx, *subframe, IF5_RRH_GW_UL); + + proc->subframe_rx = (proc->timestamp_rx/fp->samples_per_tti)%10; + proc->frame_rx = (proc->timestamp_rx/(10*fp->samples_per_tti))&1023; + + if (proc->first_rx != 0) { + proc->first_rx = 0; + *subframe = proc->subframe_rx; + *frame = proc->frame_rx; + } + else { + if (proc->subframe_rx != *subframe) { + LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + if (proc->frame_rx != *frame) { + LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->frame_rx,*frame); + exit_fun("Exiting"); + } + } +} // eNodeB_3GPP_BBU + +// asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU) +void fh_if4p5_asynch_UL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + + uint16_t packet_type; + uint32_t symbol_number,symbol_mask,symbol_mask_full,prach_rx; + + + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + prach_rx = 0; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); + if (proc->first_rx != 0) { + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + proc->first_rx = 0; + } + else { + if (proc->frame_rx != *frame) { + LOG_E(PHY,"frame_rx %d is not what we expect %d\n",proc->frame_rx,*frame); + exit_fun("Exiting"); + } + if (proc->subframe_rx != *subframe) { + LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + } + if (packet_type == IF4p5_PULFFT) { + symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; + } else if (packet_type == IF4p5_PRACH) { + prach_rx = 0; + } + } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); + + +} + + +void fh_if5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + int subframe_tx,frame_tx; + openair0_timestamp timestamp_tx; + + recv_IF5(eNB, ×tamp_tx, *subframe, IF5_RRH_GW_DL); + // printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); + + subframe_tx = (timestamp_tx/fp->samples_per_tti)%10; + frame_tx = (timestamp_tx/(fp->samples_per_tti*10))&1023; + + if (proc->first_tx != 0) { + *subframe = subframe_tx; + *frame = frame_tx; + proc->first_tx = 0; + } + else { + if (subframe_tx != *subframe) { + LOG_E(PHY,"subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); + exit_fun("Exiting"); + } + if (frame_tx != *frame) { + LOG_E(PHY,"frame_tx %d is not what we expect %d\n",frame_tx,*frame); + exit_fun("Exiting"); + } + } +} + +void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + + uint16_t packet_type; + uint32_t symbol_number,symbol_mask,symbol_mask_full; + int subframe_tx,frame_tx; + + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + recv_IF4p5(eNB, &frame_tx, &subframe_tx, &packet_type, &symbol_number); + if (proc->first_tx != 0) { + *frame = frame_tx; + *subframe = subframe_tx; + proc->first_tx = 0; + } + else { + if (frame_tx != *frame) { + LOG_E(PHY,"frame_tx %d is not what we expect %d\n",frame_tx,*frame); + exit_fun("Exiting"); + } + if (subframe_tx != *subframe) { + LOG_E(PHY,"subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); + exit_fun("Exiting"); + } + } + if (packet_type == IF4p5_PDLFFT) { + symbol_mask = symbol_mask | (1<CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - openair0_timestamp timestamp_rx,timestamp_tx; - int frame_rx,subframe_rx=0,subframe_tx=0; - static int first_rx = 1; - static int first_tx = 1; - uint16_t packet_type; - uint32_t symbol_number=0; - uint32_t symbol_mask, symbol_mask_full; - int prach_rx; - int dummy_rx[fp->nb_antennas_rx][fp->samples_per_tti]; - int rxs=0; + + int subframe=0, frame=0; + #ifdef DEADLINE_SCHEDULER struct sched_attr attr; @@ -781,94 +917,35 @@ static void* eNB_thread_asynch_rxtx( void* param ) { printf( "devices ok (eNB_thread_asynch_rx)\n"); + while (!oai_exit) { - if (eNB->node_function == eNodeB_3GPP) { // acquisition from RF - - if (eNB->rfdevice.trx_read_func) - rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, - &proc->timestamp_rx, - (void**)dummy_rx, - fp->samples_per_tti, - fp->nb_antennas_rx); - else { - printf("eNB asynch RX\n"); - sleep(1); - } - if (rxs!=fp->samples_per_tti) { - exit_fun("error receiving samples\n"); - } - } - else if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF - /// **** recv_IF5 of rxdata from RRH **** /// - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); - recv_IF5(eNB, ×tamp_rx, subframe_rx++, IF5_RRH_GW_UL); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); - if (first_rx == 1) { - first_rx = 0; - subframe_rx = (timestamp_rx/fp->samples_per_tti)%10; - } - else { - // check timestamp - if ((timestamp_rx - proc->timestamp_rx) < (2*fp->samples_per_tti)) - printf("RX overflow ...\n"); - - } - } // eNodeB_3GPP_BBU + + if (oai_exit) break; + + if (subframe==9) { + subframe=0; + frame++; + frame&=1023; + } else { + subframe++; + } + + if (eNB->fh_asynch) eNB->fh_asynch(eNB,&frame,&subframe); + else AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); - else if (eNB->node_function == NGFI_RRU_IF5) { - /// **** recv_IF5 of rxdata from RRH **** /// - - subframe_tx = (subframe_tx+1)%10; - - recv_IF5(eNB, ×tamp_tx, subframe_tx, IF5_RRH_GW_DL); - // printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); - if (first_tx == 1) { - first_tx = 0; - subframe_tx = (timestamp_tx/fp->samples_per_tti)%10; - - } - - } - else if (eNB->node_function == NGFI_RCC_IF4p5) { - /// **** recv_IF4p5 of rxdataF from RRU **** /// - /// **** recv_IF4p5 of rxsigF from RRU **** /// - // get frame/subframe information from IF4p5 interface - // timed loop (200 us) - - symbol_number = 0; - symbol_mask = 0; - symbol_mask_full = (1<symbols_per_tti)-1; - prach_rx = 0; - - do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! - recv_IF4p5(eNB, &frame_rx, &subframe_rx, &packet_type, &symbol_number); - - if (packet_type == IF4p5_PULFFT) { - symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; - } else if (packet_type == IF4p5_PRACH) { - prach_rx = 0; - } - } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); - - if (proc->first_rx == 0) { - if (subframe_rx < proc->subframe_rx+2){ - LOG_E(PHY,"RX overflow (proc->subframe_rx %d, subframe_rx %d)\n",proc->subframe_rx,subframe_rx); - } - } else { - proc->first_rx = 0; - } - } // node_timing == synch_to_externs, node_function = NGFI_IF4 - else { // should not get here - AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); - } } + eNB_thread_asynch_rxtx_status=0; return(&eNB_thread_asynch_rxtx_status); } -void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { + + + +void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { + + eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; unsigned int rxs,txs; @@ -883,10 +960,10 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { // prepare tx buffer pointers for (i=0; inb_antennas_tx; i++) - txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+2)%10)*fp->samples_per_tti]; + txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+3)%10)*fp->samples_per_tti]; txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice, - proc->timestamp_rx+(2*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, + proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, txp, fp->samples_per_tti, fp->nb_antennas_tx, @@ -946,9 +1023,10 @@ void rx_rf(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { } -void rx_fh_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame, int *subframe) { +void rx_fh_if5(PHY_VARS_eNB *eNB,int *frame, int *subframe) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; recv_IF5(eNB, &proc->timestamp_rx, *subframe, IF5_RRH_GW_UL); @@ -975,7 +1053,9 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame, int *subframe) { } -void rx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *subframe,int *frame) { +void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *subframe,int *frame) { + + eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; @@ -990,9 +1070,7 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *subframe,int *frame) { prach_rx = 0; do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); if (packet_type == IF4p5_PULFFT) { symbol_mask = symbol_mask | (1<proc; + + if (pthread_mutex_lock(&proc->mutex_FH) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for FH Slave\n"); + exit_fun( "error locking mutex" ); + } + + while (proc->instance_cnt_FH < 0) { + pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); + } + proc->instance_cnt_FH++; + + pthread_mutex_unlock( &proc->mutex_FH ); + +} + + int wakeup_rxtx(eNB_proc_t *proc,eNB_rxtx_proc_t *proc_rxtx,LTE_DL_FRAME_PARMS *fp) { int i; @@ -1263,7 +1361,7 @@ static void* eNB_thread_FH( void* param ) { if (eNB->start_rf(eNB) != 0) LOG_E(HW,"Could not start the RF device\n"); - // unlock asnych_rxtx thread + // wakeup asnych_rxtx thread pthread_mutex_lock(&proc->mutex_asynch_rxtx); proc->instance_cnt_asynch_rxtx=0; pthread_mutex_unlock(&proc->mutex_asynch_rxtx); @@ -1274,6 +1372,8 @@ static void* eNB_thread_FH( void* param ) { if (oai_exit) break; + + // this is to check that we are in synch with the fronthaul timing if (subframe==9) { subframe=0; frame++; @@ -1282,36 +1382,10 @@ static void* eNB_thread_FH( void* param ) { subframe++; } - // This case is for synchronization to another thread - if ((eNB->node_timing == synch_to_other) && - ((eNB->node_function == NGFI_RCC_IF4p5) || - (eNB->node_function == eNodeB_3GPP_BBU))) { - //wait for event - - // how long should we wait here, for MOBIPASS this could be long - // if (pthread_mutex_timedlock(&proc->mutex_FH,&wait) != 0) { - if (pthread_mutex_lock(&proc->mutex_FH) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for FH\n"); - exit_fun( "error locking mutex" ); - break; - } - - while (proc->instance_cnt_FH < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_FH is -1 - pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); // this unlocks mutex_rxtx while waiting and then locks it again - } - proc->instance_cnt_FH++; - - } - // Remaining cases are all for synchronization on FH interface - else if ((eNB->node_timing == synch_to_ext_device) && - (eNB->rx_fh)) - eNB->rx_fh(eNB,proc,&frame,&subframe); - - else { // should not get here - AssertFatal(1==0, "Unknown fronthaul interface : eNB->node_function %d",eNB->node_function); - } + + // synchronization on FH interface, acquire signals/data and block + if (eNB->rx_fh) eNB->rx_fh(eNB,&frame,&subframe); + else AssertFatal(1==0, "No fronthaul interface : eNB->node_function %d",eNB->node_function); T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); @@ -1494,7 +1568,7 @@ static void* eNB_thread_prach( void* param ) { break; } - + prach_procedures(eNB); if (pthread_mutex_lock(&proc->mutex_prach) != 0) { @@ -1567,8 +1641,9 @@ void init_eNB_proc(int inst) { proc->instance_cnt_asynch_rxtx = -1; proc->CC_id = CC_id; - proc->first_rx=4; - + proc->first_rx=1; + proc->first_tx=1; + pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); pthread_mutex_init( &proc->mutex_prach, NULL); @@ -1584,7 +1659,8 @@ void init_eNB_proc(int inst) { pthread_create( &proc->pthread_FH, &proc->attr_FH, eNB_thread_FH, &eNB->proc ); pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); if ((eNB->node_timing == synch_to_other) || - (eNB->node_function == NGFI_RRU_IF5)) + (eNB->node_function == NGFI_RRU_IF5) || + (eNB->node_function == NGFI_RRU_IF4p5)) pthread_create( &proc->pthread_asynch_rxtx, &proc->attr_asynch_rxtx, eNB_thread_asynch_rxtx, &eNB->proc ); #else pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); @@ -1784,9 +1860,9 @@ int start_rf(PHY_VARS_eNB *eNB) { return(eNB->rfdevice.trx_start_func(&eNB->rfdevice)); } -extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc); -extern void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_proc_t *proc); -extern void do_prach(PHY_VARS_eNB *eNB,eNB_proc_t *proc); +extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB); +extern void eNB_fep_full(PHY_VARS_eNB *eNB); +extern void do_prach(PHY_VARS_eNB *eNB); void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *eth_params) { @@ -1813,6 +1889,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->rx_fh = rx_rf; eNB->start_rf = start_rf; eNB->start_if = start_if; + eNB->fh_asynch = fh_if5_asynch_DL; ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); if (ret<0) { printf("Exiting, cannot initialize rf device\n"); @@ -1831,9 +1908,10 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = do_prach; eNB->fep = eNB_fep_full; eNB->proc_uespec_rx = NULL; - eNB->proc_tx = proc_tx_rru_if4p5; + eNB->proc_tx = NULL;//proc_tx_rru_if4p5; eNB->tx_fh = NULL; eNB->rx_fh = rx_rf; + eNB->fh_asynch = fh_if4p5_asynch_DL; eNB->start_rf = start_rf; eNB->start_if = start_if; ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); @@ -1862,6 +1940,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->rx_fh = rx_rf; eNB->start_rf = start_rf; eNB->start_if = NULL; + eNB->fh_asynch = NULL; ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); if (ret<0) { printf("Exiting, cannot initialize rf device\n"); @@ -1877,11 +1956,14 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->proc_tx = proc_tx_full; eNB->tx_fh = tx_fh_if5; eNB->rx_fh = rx_fh_if5; + eNB->fh_asynch = (eNB->node_timing == synch_to_other) ? fh_if5_asynch_UL : NULL; + eNB->start_rf = NULL; eNB->start_if = start_if; eNB->rfdevice.host_type = BBU_HOST; eNB->ifdevice.host_type = BBU_HOST; + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); if (ret<0) { @@ -1890,14 +1972,15 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst } break; case NGFI_RCC_IF4p5: - eNB->do_prach = do_prach; - eNB->fep = NULL; - eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; - eNB->proc_tx = proc_tx_high; - eNB->tx_fh = tx_fh_if4p5; - eNB->rx_fh = rx_fh_if4p5; - eNB->start_rf = NULL; - eNB->start_if = start_if; + eNB->do_prach = do_prach; + eNB->fep = NULL; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_high; + eNB->tx_fh = tx_fh_if4p5; + eNB->rx_fh = rx_fh_if4p5; + eNB->start_rf = NULL; + eNB->start_if = start_if; + eNB->fh_asynch = (eNB->node_timing == synch_to_other) ? fh_if4p5_asynch_UL : NULL; eNB->rfdevice.host_type = BBU_HOST; eNB->ifdevice.host_type = BBU_HOST; ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); @@ -1916,6 +1999,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; eNB->rx_fh = rx_fh_if4p5; + eNB->fh_asynch = (eNB->node_timing == synch_to_other) ? fh_if4p5_asynch_UL : NULL; eNB->start_rf = NULL; eNB->start_if = start_if; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index cf5528598f..fc16d11e7d 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1088,6 +1088,8 @@ static void get_options (int argc, char **argv) } for (CC_id=0; CC_idproperties[i]->cc_node_function[CC_id]; node_timing[CC_id] = enb_properties->properties[i]->cc_node_timing[CC_id]; node_synch_ref[CC_id] = enb_properties->properties[i]->cc_node_synch_ref[CC_id]; @@ -1104,6 +1106,13 @@ static void get_options (int argc, char **argv) frame_parms[CC_id]->nb_antennas_tx = enb_properties->properties[i]->nb_antennas_tx[CC_id]; frame_parms[CC_id]->nb_antennas_tx_eNB = enb_properties->properties[i]->nb_antennas_tx[CC_id]; frame_parms[CC_id]->nb_antennas_rx = enb_properties->properties[i]->nb_antennas_rx[CC_id]; + + frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex = enb_properties->properties[i]->prach_config_index[CC_id]; + frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset = enb_properties->properties[i]->prach_freq_offset[CC_id]; + + frame_parms[CC_id]->mode1_flag = (transmission_mode == 1) ? 1 : 0; + frame_parms[CC_id]->threequarter_fs = threequarter_fs; + //} // j } @@ -1182,6 +1191,156 @@ int T_port = 2021; /* default port to listen to to wait for the tracer */ int T_dont_fork = 0; /* default is to fork, see 'T_init' to understand */ #endif +void set_default_frame_parms() { + + int CC_id; + + for (CC_id=0; CC_idframe_type = FDD; + frame_parms[CC_id]->tdd_config = 3; + frame_parms[CC_id]->tdd_config_S = 0; + frame_parms[CC_id]->N_RB_DL = 100; + frame_parms[CC_id]->N_RB_UL = 100; + frame_parms[CC_id]->Ncp = NORMAL; + frame_parms[CC_id]->Ncp_UL = NORMAL; + frame_parms[CC_id]->Nid_cell = 0; + frame_parms[CC_id]->num_MBSFN_config = 0; + frame_parms[CC_id]->nb_antennas_tx_eNB = 1; + frame_parms[CC_id]->nb_antennas_tx = 1; + frame_parms[CC_id]->nb_antennas_rx = 1; + + frame_parms[CC_id]->nushift = 0; + + frame_parms[CC_id]->phich_config_common.phich_resource = oneSixth; + frame_parms[CC_id]->phich_config_common.phich_duration = normal; + // UL RS Config + frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0 + frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 0; + frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; + frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; + + frame_parms[CC_id]->prach_config_common.rootSequenceIndex=22; + frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1; + frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; + frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.highSpeedFlag=0; + frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; + + downlink_frequency[CC_id][0] = 2680000000; // Use float to avoid issue with frequency over 2^31. + downlink_frequency[CC_id][1] = downlink_frequency[CC_id][0]; + downlink_frequency[CC_id][2] = downlink_frequency[CC_id][0]; + downlink_frequency[CC_id][3] = downlink_frequency[CC_id][0]; + //printf("Downlink for CC_id %d frequency set to %u\n", CC_id, downlink_frequency[CC_id][0]); + + } + +} + +void init_openair0() { + + int card; + int i; + + for (card=0; cardN_RB_DL == 100) { + if (frame_parms[0]->threequarter_fs) { + openair0_cfg[card].sample_rate=23.04e6; + openair0_cfg[card].samples_per_frame = 230400; + openair0_cfg[card].tx_bw = 10e6; + openair0_cfg[card].rx_bw = 10e6; + } + else { + openair0_cfg[card].sample_rate=30.72e6; + openair0_cfg[card].samples_per_frame = 307200; + openair0_cfg[card].tx_bw = 10e6; + openair0_cfg[card].rx_bw = 10e6; + } + } else if(frame_parms[0]->N_RB_DL == 50) { + openair0_cfg[card].sample_rate=15.36e6; + openair0_cfg[card].samples_per_frame = 153600; + openair0_cfg[card].tx_bw = 5e6; + openair0_cfg[card].rx_bw = 5e6; + } else if (frame_parms[0]->N_RB_DL == 25) { + openair0_cfg[card].sample_rate=7.68e6; + openair0_cfg[card].samples_per_frame = 76800; + openair0_cfg[card].tx_bw = 2.5e6; + openair0_cfg[card].rx_bw = 2.5e6; + } else if (frame_parms[0]->N_RB_DL == 6) { + openair0_cfg[card].sample_rate=1.92e6; + openair0_cfg[card].samples_per_frame = 19200; + openair0_cfg[card].tx_bw = 1.5e6; + openair0_cfg[card].rx_bw = 1.5e6; + } + + if (frame_parms[0]->frame_type==TDD) + openair0_cfg[card].duplex_mode = duplex_mode_TDD; + else //FDD + openair0_cfg[card].duplex_mode = duplex_mode_FDD; + + + if (local_remote_radio == BBU_REMOTE_RADIO_HEAD) { + openair0_cfg[card].remote_addr = eth_params->remote_addr; + openair0_cfg[card].remote_port = eth_params->remote_port; + openair0_cfg[card].my_addr = eth_params->my_addr; + openair0_cfg[card].my_port = eth_params->my_port; + } + + printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, + ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx), + ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); + openair0_cfg[card].Mod_id = 0; + + if (UE_flag) { + printf("ETHERNET: Configuring UE ETH for %s:%d\n",rrh_UE_ip,rrh_UE_port); + openair0_cfg[card].remote_addr = &rrh_UE_ip[0]; + openair0_cfg[card].remote_port = rrh_UE_port; + } + + openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; + + + openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx)); + openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); + + for (i=0; i<4; i++) { + + if (irx_total_gain_dB; + } + else { + openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB; + } + + + } + + + } +} + int main( int argc, char **argv ) { int i,aa,card=0; @@ -1190,8 +1349,7 @@ int main( int argc, char **argv ) #endif int CC_id; - uint16_t Nid_cell = 0; - uint8_t cooperation_flag=0, abstraction_flag=0; + uint8_t abstraction_flag=0; uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; #if defined (XFORMS) @@ -1211,39 +1369,18 @@ int main( int argc, char **argv ) memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs); set_latency_target(); - // det defaults - for (CC_id=0; CC_idframe_type = FDD; - frame_parms[CC_id]->tdd_config = 3; - frame_parms[CC_id]->tdd_config_S = 0; - frame_parms[CC_id]->N_RB_DL = 100; - frame_parms[CC_id]->N_RB_UL = 100; - frame_parms[CC_id]->Ncp = NORMAL; - frame_parms[CC_id]->Ncp_UL = NORMAL; - frame_parms[CC_id]->Nid_cell = Nid_cell; - frame_parms[CC_id]->num_MBSFN_config = 0; - frame_parms[CC_id]->nb_antennas_tx_eNB = 1; - frame_parms[CC_id]->nb_antennas_tx = 1; - frame_parms[CC_id]->nb_antennas_rx = 1; - } + // set default parameters + set_default_frame_parms(frame_parms); - for (CC_id=0; CC_idnushift = 0; - if (UE_flag==0) { - - } else { - //UE_flag==1 + if (UE_flag==1) { frame_parms[CC_id]->nb_antennas_tx = 1; frame_parms[CC_id]->nb_antennas_rx = 1; frame_parms[CC_id]->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; //initial value overwritten by initial sync later } - - frame_parms[CC_id]->mode1_flag = (transmission_mode == 1) ? 1 : 0; - frame_parms[CC_id]->phich_config_common.phich_resource = oneSixth; - frame_parms[CC_id]->phich_config_common.phich_duration = normal; - // UL RS Config - frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0 - frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 0; - frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; - frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; - frame_parms[CC_id]->threequarter_fs = threequarter_fs; init_ul_hopping(frame_parms[CC_id]); init_frame_parms(frame_parms[CC_id],1); // phy_init_top(frame_parms[CC_id]); @@ -1392,11 +1515,7 @@ int main( int argc, char **argv ) for (CC_id=0; CC_idprach_config_common.rootSequenceIndex=22; - frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1; - frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; - frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.highSpeedFlag=0; - frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; + // prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type); // N_ZC = (prach_fmt <4)?839:139; } @@ -1457,7 +1576,7 @@ int main( int argc, char **argv ) PHY_vars_eNB_g[0] = malloc(sizeof(PHY_VARS_eNB*)); for (CC_id=0; CC_idNid_cell,cooperation_flag,transmission_mode,abstraction_flag); + PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms[CC_id],0,frame_parms[CC_id]->Nid_cell,0,transmission_mode,abstraction_flag); PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id; if (phy_test==1) PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0; @@ -1497,107 +1616,9 @@ int main( int argc, char **argv ) dump_frame_parms(frame_parms[0]); - for (card=0; cardN_RB_DL == 100) { - if (frame_parms[0]->threequarter_fs) { - openair0_cfg[card].sample_rate=23.04e6; - openair0_cfg[card].samples_per_frame = 230400; - openair0_cfg[card].tx_bw = 10e6; - openair0_cfg[card].rx_bw = 10e6; - } - else { - openair0_cfg[card].sample_rate=30.72e6; - openair0_cfg[card].samples_per_frame = 307200; - openair0_cfg[card].tx_bw = 10e6; - openair0_cfg[card].rx_bw = 10e6; - } - } else if(frame_parms[0]->N_RB_DL == 50) { - openair0_cfg[card].sample_rate=15.36e6; - openair0_cfg[card].samples_per_frame = 153600; - openair0_cfg[card].tx_bw = 5e6; - openair0_cfg[card].rx_bw = 5e6; - } else if (frame_parms[0]->N_RB_DL == 25) { - openair0_cfg[card].sample_rate=7.68e6; - openair0_cfg[card].samples_per_frame = 76800; - openair0_cfg[card].tx_bw = 2.5e6; - openair0_cfg[card].rx_bw = 2.5e6; - } else if (frame_parms[0]->N_RB_DL == 6) { - openair0_cfg[card].sample_rate=1.92e6; - openair0_cfg[card].samples_per_frame = 19200; - openair0_cfg[card].tx_bw = 1.5e6; - openair0_cfg[card].rx_bw = 1.5e6; - } - - if (frame_parms[0]->frame_type==TDD) - openair0_cfg[card].duplex_mode = duplex_mode_TDD; - else //FDD - openair0_cfg[card].duplex_mode = duplex_mode_FDD; - - - if (local_remote_radio == BBU_REMOTE_RADIO_HEAD) { - openair0_cfg[card].remote_addr = eth_params->remote_addr; - openair0_cfg[card].remote_port = eth_params->remote_port; - openair0_cfg[card].my_addr = eth_params->my_addr; - openair0_cfg[card].my_port = eth_params->my_port; - } - - printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, - ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx), - ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); - openair0_cfg[card].Mod_id = 0; -#ifdef ETHERNET - - if (UE_flag) { - printf("ETHERNET: Configuring UE ETH for %s:%d\n",rrh_UE_ip,rrh_UE_port); - openair0_cfg[card].remote_addr = &rrh_UE_ip[0]; - openair0_cfg[card].remote_port = rrh_UE_port; - } - - openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; -#endif - - // in the case of the USRP, the following variables need to be initialized before the init - // since the USRP only supports one CC (for the moment), we initialize all the cards with first CC. - // in the case of EXMIMO2, these values are overwirtten in the function setup_eNB/UE_buffer - - openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx)); - openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); - - for (i=0; i<4; i++) { - - if (irx_total_gain_dB; - } - else { - openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB; - } + init_openair0(); - } - - - } #ifndef DEADLINE_SCHEDULER @@ -1644,15 +1665,21 @@ int main( int argc, char **argv ) openair0_cfg[0].log_level = glog_level; - mac_xface = malloc(sizeof(MAC_xface)); + int eMBMS_active=0; - - l2_init(frame_parms[0],eMBMS_active,(uecap_xer_in==1)?uecap_xer:NULL, - 0,// cba_group_active - 0); // HO flag - - mac_xface->macphy_exit = &exit_fun; + if (node_function[0] >=NGFI_RAU_IF4p5) { // don't initialize L2 for RRU + mac_xface = malloc(sizeof(MAC_xface)); + l2_init(frame_parms[0],eMBMS_active,(uecap_xer_in==1)?uecap_xer:NULL, + 0,// cba_group_active + 0); // HO flag + mac_xface->macphy_exit = &exit_fun; + } + else if (node_function[0] == NGFI_RRU_IF4p5) { // Initialize PRACH in this case + + } + + #if defined(ENABLE_ITTI) @@ -1672,7 +1699,7 @@ int main( int argc, char **argv ) printf("Filling UE band info\n"); fill_ue_band_info(); mac_xface->dl_phy_sync_success (0, 0, 0, 1); - } else + } else if (node_function[0]>NGFI_RRU_IF4p5) mac_xface->mrbch_phy_sync_failure (0, 0, 0); } diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index 583891f1ac..756d705870 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -70,6 +70,7 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, NUMBER_OF_UE_MAX, NUMBER_OF_eNB_MAX, NUMBER_OF_HARQ_PID_MAX); LOG_I(PHY,"init eNB: N_RB_DL %d\n", frame_parms->N_RB_DL); LOG_I(PHY,"init eNB: Transmission mode %d\n", transmission_mode); + LOG_I(PHY,"init eNB: prach_config_index %d\n", frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); for (i=0; i Date: Thu, 4 Aug 2016 01:14:33 +0200 Subject: [PATCH 160/340] modifications for RRC IF4p5 --- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 2 +- openair1/PHY/LTE_TRANSPORT/prach.c | 26 ++++++++++++++++--- openair1/SCHED/phy_procedures_lte_eNb.c | 3 ++- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 12 +++++---- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 8 ++++-- targets/RT/USER/lte-enb.c | 14 +++++----- 6 files changed, 45 insertions(+), 20 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 8f01fc5369..fb3e11780f 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -233,7 +233,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t } else if (*packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length - db_fulllength = 839*2; + db_fulllength = 840*2; memcpy((&rxsigF[0][0]), (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t), diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 0adb8685f0..4d29ba55e7 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1101,6 +1101,8 @@ void rx_prach(PHY_VARS_eNB *eNB, int fft_size,log2_ifft_size; uint8_t nb_ant_rx = 1; //eNB->frame_parms.nb_antennas_rx; + // int en; + for (aa=0; aacommon_vars.rxdata[0][aa][subframe*eNB->frame_parms.samples_per_tti-eNB->N_TA_offset]; } @@ -1299,7 +1301,12 @@ void rx_prach(PHY_VARS_eNB *eNB, // Adjust received rxsigF offset memmove((&rxsigF[0][k]), (&rxsigF[0][0]), - 839*2*sizeof(int16_t)); + 839*2*sizeof(int16_t)); + + //en = dB_fixed(signal_energy(&rxsigF[0][k],840)); + // if (en>60) + //printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en); + } // in case of RCC and prach received rx_thread wakes up prach @@ -1470,9 +1477,22 @@ void rx_prach(PHY_VARS_eNB *eNB, // if (aa=1) write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1); }// antennas_rx #ifdef PRACH_DEBUG - write_output("prach_ifft0.m","prach_t0",prach_ifft[0],2048,1,1); + + if (en>40) { + k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; + + if (k<0) + k+=(eNB->frame_parms.ofdm_symbol_size); + + k*=12; + k+=13; + k*=2; + printf("Dumping prach, k = %d (n_ra_prb %d)\n",k,n_ra_prb); + write_output("rxsigF.m","prach_rxF",&rxsigF[0][k],840,1,1); + write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); + write_output("prach_ifft0.m","prach_t0",prach_ifft[0],1024,1,1); + } #endif - // write_output("prach_ifft1.m","prach_t1",prach_ifft[1],2048,1,1); } // new dft diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6bf9273776..8385d97f41 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1949,13 +1949,14 @@ void prach_procedures(PHY_VARS_eNB *eNB) { update_TA = 1; break; } - + mac_xface->initiate_ra_proc(eNB->Mod_id, eNB->CC_id, frame, preamble_max, preamble_delay_list[preamble_max]*update_TA, 0,subframe,0); + } } else { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 02ca6ee7eb..0b73324080 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -274,7 +274,7 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi if (bytes_received ==-1) { eth->num_rx_errors++; - perror("ETHERNET READ: "); + perror("ETHERNET IF5 READ: "); exit(-1); } else { /* store the timestamp value from packet's header */ @@ -314,14 +314,15 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t; IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES); - + + bytes_received = recv(eth->sockfd[Mod_id], buff[0], packet_size, MSG_PEEK); if (bytes_received ==-1) { eth->num_rx_errors++; - perror("ETHERNET READ: "); + perror("ETHERNET IF4p5 READ (header): "); exit(-1); } @@ -334,7 +335,8 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam } else { packet_size = RAW_IF4p5_PRACH_SIZE_BYTES; } - + + while(bytes_received < packet_size) { bytes_received = recv(eth->sockfd[Mod_id], buff[0], @@ -342,7 +344,7 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam 0); if (bytes_received ==-1) { eth->num_rx_errors++; - perror("ETHERNET READ: "); + perror("ETHERNET IF4p5 READ (payload): "); exit(-1); } else { eth->rx_actual_nsamps = bytes_received>>1; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index d530558816..38a6d5a571 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -63,6 +63,7 @@ int trx_eth_start(openair0_device *device) { /* initialize socket */ if (eth->flags == ETH_RAW_MODE) { + printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n"); if (eth_socket_init_raw(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ if (device->host_type == BBU_HOST) { @@ -74,6 +75,8 @@ int trx_eth_start(openair0_device *device) { if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; } else if (eth->flags == ETH_RAW_IF4p5_MODE) { + + printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n"); if (eth_socket_init_raw(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ if (device->host_type == BBU_HOST) { @@ -83,12 +86,13 @@ int trx_eth_start(openair0_device *device) { } /* adjust MTU wrt number of samples per packet */ if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; - if(ethernet_tune (device,RCV_TIMEOUT,5000)!=0) return -1; + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; } else if (eth->flags == ETH_UDP_IF4p5_MODE) { - + printf("Setting ETHERNET to UDP_IF4p5_MODE\n"); } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + printf("Setting ETHERNET to RAW_IF5_MODE\n"); if (eth_socket_init_raw(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ //if (device->host_type == BBU_HOST) { diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index b0d1eb3d0e..231b1bceb0 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -975,7 +975,7 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame, int *subframe) { } -void rx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *subframe,int *frame) { +void rx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *frame,int *subframe) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; @@ -988,27 +988,25 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_proc_t *proc,int *subframe,int *frame) { symbol_mask = 0; symbol_mask_full = (1<symbols_per_tti)-1; prach_rx = 0; - + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); - if (packet_type == IF4p5_PULFFT) { symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; } else if (packet_type == IF4p5_PRACH) { prach_rx = 0; } + } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,*subframe); exit_fun("Exiting"); } if (proc->frame_rx != *frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,*frame); exit_fun("Exiting"); } } else { @@ -1271,7 +1269,7 @@ static void* eNB_thread_FH( void* param ) { // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { - + if (oai_exit) break; if (subframe==9) { From 1ec0c5bf63e6b9a4f6e3fd79eda5fd9897205119 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 4 Aug 2016 16:41:14 +0200 Subject: [PATCH 161/340] modifications for EXMIMO2 targets --- openair1/PHY/INIT/lte_init.c | 13 +- openair1/PHY/defs.h | 3 + openair1/SCHED/phy_procedures_lte_eNb.c | 7 ++ .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 26 ++-- .../CONF/enb.band38.tm1.exmimo2.conf | 7 +- .../CONF/enb.band7.exmimo2.conf | 3 + targets/RT/USER/lte-enb.c | 19 +-- targets/RT/USER/lte-softmodem.c | 114 +++++++++--------- targets/RT/USER/lte-ue.c | 80 ++++++------ 9 files changed, 152 insertions(+), 120 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index d583381781..2fa9c36d69 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -43,10 +43,6 @@ #include "assertions.h" #include -#ifdef EXMIMO -extern openair0_rf_map rf_map[MAX_NUM_CCs]; -#endif - extern uint16_t prach_root_sequence_map0_3[838]; extern uint16_t prach_root_sequence_map4[138]; uint8_t dmrs1_tab[8] = {0,2,3,4,6,8,9,10}; @@ -672,7 +668,7 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, int CC_id) { - //PHY_VARS_eNB *eNB = PHY_vars_eNB_g[Mod_id][CC_id]; + uint8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][0]); struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; //struct RadioResourceConfigCommonSCell_r10 *physicalConfigCommonSCell_r10 = sCellToAddMod_r10->radioResourceConfigCommonSCell_r10; @@ -682,13 +678,14 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, #ifdef EXMIMO #ifdef DRIVER2013 - exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[rf_map[CC_id].card].exmimo_config_ptr; + // exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[rf_map[CC_id].card].exmimo_config_ptr; #endif #endif if ((dl_CarrierFreq_r10>=36000) && (dl_CarrierFreq_r10<=36199)) { carrier_freq_local = 1900000000 + (dl_CarrierFreq_r10-36000)*100000; //band 33 from 3GPP 36.101 v 10.9 Table 5.7.3-1 LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); + /* #ifdef EXMIMO #ifdef DRIVER2013 //carrier_freq[CC_id] = carrier_freq_local; @@ -700,11 +697,12 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, p_exmimo_config->rf.rf_local[rf_map[CC_id].chain] = 8255063; //this should be taken form calibration file p_exmimo_config->rf.rffe_band_mode[rf_map[CC_id].chain] = B19G_TDD; #endif -#endif +#endif*/ } else if ((dl_CarrierFreq_r10>=6150) && (dl_CarrierFreq_r10<=6449)) { carrier_freq_local = 832000000 + (dl_CarrierFreq_r10-6150)*100000; //band 20 from 3GPP 36.101 v 10.9 Table 5.7.3-1 // this is actually for the UL only, but we use it for DL too, since there is no TDD mode for this band LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); +/* #ifdef EXMIMO #ifdef DRIVER2013 //carrier_freq[CC_id] = carrier_freq_local; @@ -717,6 +715,7 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, p_exmimo_config->rf.rffe_band_mode[rf_map[CC_id].chain] = DD_TDD; #endif #endif +*/ } else { LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %d of SCell %d for UE %d not supported\n",Mod_id,/*eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id); } diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 9b5db4b421..46679c7f7c 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -363,6 +363,7 @@ typedef struct PHY_VARS_eNB_s { eNB_proc_t proc; eNB_func_t node_function; eNB_timing_t node_timing; + openair0_rf_map rf_map; int abstraction_flag; void (*do_prach)(struct PHY_VARS_eNB_s *eNB); void (*fep)(struct PHY_VARS_eNB_s *eNB); @@ -579,6 +580,8 @@ typedef struct { uint8_t Mod_id; /// \brief Component carrier ID for this PHY instance uint8_t CC_id; + /// \brief Mapping of CC_id antennas to cards + openair0_rf_map rf_map; //uint8_t local_flag; /// \brief Indicator of current run mode of UE (normal_txrx, rx_calib_ue, no_L2_connect, debug_prach) runmode_t mode; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6fcd41ec28..164c21ce21 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1107,6 +1107,8 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, uint8_t smbv_alloc_cnt = 1; #endif + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_DL)) return; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+(subframe&1),1); start_meas(&eNB->phy_proc_tx); @@ -2582,11 +2584,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ eNB_proc_t *proc = &eNB->proc; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 1 ); start_meas(&eNB->phy_proc_rx); @@ -2620,6 +2625,8 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+(subframe&1), 1 ); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 736e126ccb..17a1d18ce6 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -501,6 +501,7 @@ int trx_exmimo_start(openair0_device *device) { printf("Starting ...\n"); openair0_config(device->openair0_cfg,0); openair0_start_rt_acquisition(0); + printf("Setting state to running\n"); exm->daq_state = running; exm->wait_first_read = 1; return(0); @@ -508,7 +509,8 @@ int trx_exmimo_start(openair0_device *device) { int trx_exmimo_write(openair0_device *device,openair0_timestamp ptimestamp, void **buff, int nsamps, int cc, int flags) { - return(0); + + return(nsamps); } @@ -521,12 +523,12 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi struct timespec sleep_time; unsigned long tv_nsec; int i; - struct timespec wait; int n,n1,n2,ntot,first_len; int ret; - wait.tv_sec=0; - wait.tv_nsec=50000000L; + // struct timespec wait; + // wait.tv_sec=0; + // wait.tv_nsec=50000000L; if (exm->watchdog_exit == 1) return(0); @@ -535,7 +537,6 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi tv_nsec=(unsigned long)((double)(nsamps)*1e9/cfg->sample_rate); return(0); } - ret = pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); switch (ret) { @@ -564,6 +565,9 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi return(0); break; } + + ret = pthread_mutex_lock(&exm->watchdog_mutex); + ts = exm->ts; if (exm->wait_first_read==1) { exm->wait_first_read=0; @@ -603,7 +607,7 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi printf("back\n"); #endif // get new timestamp, in case we have to sleep again - pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); + pthread_mutex_lock(&exm->watchdog_mutex); ts = exm->ts; pthread_mutex_unlock(&exm->watchdog_mutex); if (old_ts == ts) { @@ -638,7 +642,7 @@ int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, voi } } } - pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); + pthread_mutex_lock(&exm->watchdog_mutex); exm->last_ts_rx += n; pthread_mutex_unlock(&exm->watchdog_mutex); if (n==n1) { @@ -712,6 +716,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { exmimo_id_t *p_exmimo_id; int ret; exmimo_state_t *exm = (exmimo_state_t *)malloc(sizeof(exmimo_state_t)); + int card,ant; ret = openair0_open(); @@ -763,6 +768,13 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { device->priv = (void *)exm; + printf("EXMIMO2: Getting addresses for memory-mapped DMA\n"); + for (card=0; cardfirst_rx == 0) { if (proc->subframe_rx != *subframe){ - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,*subframe); exit_fun("Exiting"); } if (proc->frame_rx != *frame) { - LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,*frame); exit_fun("Exiting"); } } else { @@ -1740,7 +1740,7 @@ void kill_eNB_proc(int inst) { Each rf chain is is addressed by the card number and the chain on the card. The rf_map specifies for each CC, on which rf chain the mapping should start. Multiple antennas are mapped to successive RF chains on the same card. */ -int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) { +int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg) { int i, CC_id; int j; @@ -1808,17 +1808,17 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c for (i=0; inb_antennas_rx; i++) { free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); - rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation + rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory - memset(rxdata[i], 0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); + memset(rxdata[i], 0, openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card].samples_per_frame*sizeof(int32_t)); printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->common_vars.rxdata[0][i],rxdata[i],N_TA_offset); } for (i=0; inb_antennas_tx; i++) { free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); - txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation + txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = txdata[i]; - memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); + memset(txdata[i],0, openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card].samples_per_frame*sizeof(int32_t)); printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); } } @@ -2018,6 +2018,11 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst } } + if (setup_eNB_buffers(PHY_vars_eNB_g[inst],&openair0_cfg[inst])!=0) { + printf("Exiting, cannot initialize eNodeB Buffers\n"); + exit(-1); + } + init_eNB_proc(inst); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 38629b8ff4..4849e63807 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -118,13 +118,13 @@ unsigned short config_frames[4] = {2,9,11,13}; #endif // In lte-enb.c -extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); +extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg); extern void init_eNB(eNB_func_t *, eNB_timing_t *,int,eth_params_t *); extern void stop_eNB(int); extern void kill_eNB_proc(void); // In lte-ue.c -extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); +extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg); extern void fill_ue_band_info(void); extern void init_UE(int); @@ -177,7 +177,6 @@ static char threequarter_fs=0; uint32_t downlink_frequency[MAX_NUM_CCs][4]; int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; -openair0_rf_map rf_map[MAX_NUM_CCs]; static char *conf_config_file_name = NULL; #if defined(ENABLE_ITTI) @@ -272,10 +271,10 @@ int16_t osa_log_verbosity = LOG_MED; #endif -#ifdef ETHERNET + char *rrh_UE_ip = "127.0.0.1"; int rrh_UE_port = 51000; -#endif + /* flag set by eNB conf file to specify if the radio head is local or remote (default option is local) */ uint8_t local_remote_radio = BBU_LOCAL_RADIO_HEAD; @@ -1704,60 +1703,7 @@ int main( int argc, char **argv ) mac_xface->mrbch_phy_sync_failure (0, 0, 0); } - number_of_cards = 1; - for(CC_id=0; CC_idhw_timing_advance = timing_advance; -#else - UE[CC_id]->hw_timing_advance = 160; -#endif - } - if (setup_ue_buffers(UE,&openair0_cfg[0],rf_map)!=0) { - printf("Error setting up eNB buffer\n"); - exit(-1); - } - - - - if (input_fd) { - printf("Reading in from file to antenna buffer %d\n",0); - if (fread(UE[0]->common_vars.rxdata[0], - sizeof(int32_t), - frame_parms[0]->samples_per_tti*10, - input_fd) != frame_parms[0]->samples_per_tti*10) - printf("error reading from file\n"); - } - //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; - } else { - - - - if (setup_eNB_buffers(PHY_vars_eNB_g[0],&openair0_cfg[0],rf_map)!=0) { - printf("Error setting up eNB buffer\n"); - exit(-1); - } - - printf("Setting eNB buffer to all-RX\n"); - - // Set LSBs for antenna switch (ExpressMIMO) - for (CC_id=0; CC_idhw_timing_advance = 0; - for (i=0; isamples_per_tti*10; i++) - for (aa=0; aanb_antennas_tx; aa++) - PHY_vars_eNB_g[0][CC_id]->common_vars.txdata[0][aa][i] = 0x00010001; - } - } mlockall(MCL_CURRENT | MCL_FUTURE); @@ -1829,6 +1775,58 @@ int main( int argc, char **argv ) if (UE_flag == 1) init_UE(1); else init_eNB(node_function,node_timing,1,eth_params); // Sleep to allow all threads to setup + + number_of_cards = 1; + + for(CC_id=0; CC_idrf_map.card=0; + PHY_vars_eNB_g[0][CC_id]->rf_map.chain=CC_id+chain_offset; + } + + // connect the TX/RX buffers + if (UE_flag==1) { + + for (CC_id=0;CC_idhw_timing_advance = timing_advance; +#else + UE[CC_id]->hw_timing_advance = 160; +#endif + } + if (setup_ue_buffers(UE,&openair0_cfg[0])!=0) { + printf("Error setting up eNB buffer\n"); + exit(-1); + } + + + + if (input_fd) { + printf("Reading in from file to antenna buffer %d\n",0); + if (fread(UE[0]->common_vars.rxdata[0], + sizeof(int32_t), + frame_parms[0]->samples_per_tti*10, + input_fd) != frame_parms[0]->samples_per_tti*10) + printf("error reading from file\n"); + } + //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; + } else { + + + + + + printf("Setting eNB buffer to all-RX\n"); + + // Set LSBs for antenna switch (ExpressMIMO) + for (CC_id=0; CC_idhw_timing_advance = 0; + for (i=0; isamples_per_tti*10; i++) + for (aa=0; aanb_antennas_tx; aa++) + PHY_vars_eNB_g[0][CC_id]->common_vars.txdata[0][aa][i] = 0x00010001; + } + } sleep(3); diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 3fda5d735f..88bce26d6c 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -104,7 +104,6 @@ extern int sync_var; extern openair0_config_t openair0_cfg[MAX_CARDS]; extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; -extern openair0_rf_map rf_map[MAX_NUM_CCs]; extern int oai_exit; extern int32_t **rxdata; @@ -1559,56 +1558,59 @@ void fill_ue_band_info(void) } #endif -int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) +int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg) { int i, CC_id; LTE_DL_FRAME_PARMS *frame_parms; - - for (CC_id=0; CC_idframe_parms); - } else { - printf("phy_vars_UE[%d] not initialized\n", CC_id); - return(-1); - } + openair0_rf_map *rf_map; - /* - if (frame_parms->frame_type == TDD) { - if (frame_parms->N_RB_DL == 100) + for (CC_id=0; CC_idrf_map; + + if (phy_vars_ue[CC_id]) { + frame_parms = &(phy_vars_ue[CC_id]->frame_parms); + } else { + printf("phy_vars_UE[%d] not initialized\n", CC_id); + return(-1); + } + + /* + if (frame_parms->frame_type == TDD) { + if (frame_parms->N_RB_DL == 100) N_TA_offset = 624; else if (frame_parms->N_RB_DL == 50) - N_TA_offset = 624/2; + N_TA_offset = 624/2; else if (frame_parms->N_RB_DL == 25) - N_TA_offset = 624/4; - } - */ - + N_TA_offset = 624/4; + } + */ + // replace RX signal buffers with mmaped HW versions - rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - printf( "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); - free( phy_vars_ue[CC_id]->common_vars.rxdata[i] ); + rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); + + for (i=0; inb_antennas_rx; i++) { + printf( "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map->card, rf_map->chain+i ); + free( phy_vars_ue[CC_id]->common_vars.rxdata[i] ); rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); phy_vars_ue[CC_id]->common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD printf("rxdata[%d] : %p\n",i,rxdata[i]); - } - - for (i=0; inb_antennas_tx; i++) { - printf( "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); - free( phy_vars_ue[CC_id]->common_vars.txdata[i] ); - txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); - phy_vars_ue[CC_id]->common_vars.txdata[i] = txdata[i]; - printf("txdata[%d] : %p\n",i,txdata[i]); - } - - // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.rxdata[x] - // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.txdata[x] - // be careful when releasing memory! - // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes) - + } + + for (i=0; inb_antennas_tx; i++) { + printf( "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map->card, rf_map->chain+i ); + free( phy_vars_ue[CC_id]->common_vars.txdata[i] ); + txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); + phy_vars_ue[CC_id]->common_vars.txdata[i] = txdata[i]; + printf("txdata[%d] : %p\n",i,txdata[i]); + } + + // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.rxdata[x] + // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.txdata[x] + // be careful when releasing memory! + // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes) + } return 0; From 6e1d81bef32f7e6a9002b8a5f363b32cb7f31db0 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 4 Aug 2016 18:19:54 +0200 Subject: [PATCH 162/340] band 38 tx gain exmimo2 --- .../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.exmimo2.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.exmimo2.conf index d4300301f8..3c608776d6 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.exmimo2.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.exmimo2.conf @@ -38,7 +38,7 @@ eNBs = Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; - tx_gain = 25; + tx_gain = 10;//25; rx_gain = 120; prach_root = 0; prach_config_index = 0; From 3608e5bc9e84bb0b95ab2181b628abc40ad0df15 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 4 Aug 2016 19:13:48 +0200 Subject: [PATCH 163/340] Gitlab CI: fix for 20MHz tests --- cmake_targets/autotests/test_case_list.xml | 112 ++++++++++++--------- 1 file changed, 62 insertions(+), 50 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index e50c651fa3..11a0c172db 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010304 010305 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015514 015517 015602 015605 015702 015705 015802 015805 015808 015811 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 + 010141 0102+ 010304 010305 0104+ 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 3 mozart tique stevens amerique @@ -1078,7 +1078,7 @@ lte-softmodem - calisson + tique stevens amerique 390 @@ -1090,15 +1090,16 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.147/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.147/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c @@ -1120,7 +1121,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14M -B 192.172.0.2 @@ -1298,7 +1299,7 @@ lte-softmodem - calisson + tique stevens amerique 390 @@ -1312,13 +1313,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.147/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.147/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c @@ -1340,9 +1342,9 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m - throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + throughput_test min=0.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1361,7 +1363,7 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33M -i 1 -f m -u False @@ -1966,7 +1968,7 @@ lte-softmodem - calisson + tique stevens amerique 390 @@ -1980,13 +1982,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.147/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.147/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c @@ -2186,7 +2189,7 @@ lte-softmodem - calisson + tique stevens amerique 390 @@ -2200,13 +2203,14 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.147/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.147/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c @@ -3485,6 +3489,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 @@ -3513,7 +3518,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 17Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 17Mbits/s @@ -3699,6 +3704,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 @@ -3747,7 +3753,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s False @@ -3913,6 +3919,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 @@ -4127,6 +4134,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 @@ -4175,7 +4183,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 75 lo -c 192.172.0.2 + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 False @@ -7156,7 +7164,7 @@ c lte-softmodem - calisson + tique stevens amerique 390 @@ -7168,15 +7176,16 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.147/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.147/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c @@ -7198,7 +7207,7 @@ c sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 @@ -7378,7 +7387,7 @@ c lte-softmodem - calisson + tique stevens amerique 390 @@ -7390,15 +7399,16 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.147/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.147/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c @@ -7441,7 +7451,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 40Mbits/s -i 1 -f m -u + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33M -i 1 -f m -u False @@ -7601,7 +7611,7 @@ c lte-softmodem - calisson + tique stevens amerique 390 @@ -7613,15 +7623,16 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.147/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.147/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c @@ -7823,7 +7834,7 @@ c lte-softmodem - calisson + tique stevens amerique 390 @@ -7835,15 +7846,16 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.147/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.147/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c From 8014a94020693ba21f0ed3a53d399af12da1e271 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 5 Aug 2016 09:58:57 +0200 Subject: [PATCH 164/340] IF4p5 with UDP. --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 19 +--- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 103 +++++++++++++++++- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 41 ++++--- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 5 +- targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 3 + 5 files changed, 133 insertions(+), 38 deletions(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index cfff2158a7..126030d3d4 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -65,23 +65,18 @@ int eth_socket_init_raw(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; const char *local_mac, *remote_mac; - int local_port=0, remote_port=0; int sock_dom=0; int sock_type=0; int sock_proto=0; if (device->host_type == RRH_HOST ) { /* RRH doesn't know remote MAC(will be retrieved from first packet send from BBU) and remote port(don't care) */ local_mac = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; remote_mac = malloc(ETH_ALEN); - memset(remote_mac,0,ETH_ALEN); - remote_port = 0; + memset((void*)remote_mac,0,ETH_ALEN); printf("[%s] local MAC addr %s remote MAC addr %s\n","RRH", local_mac,remote_mac); } else { local_mac = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; remote_mac = device->openair0_cfg->remote_addr; - remote_port = device->openair0_cfg->remote_port; printf("[%s] local MAC addr %s remote MAC addr %s\n","BBU", local_mac,remote_mac); } @@ -182,7 +177,7 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi printf("------- TX ------: nu=%x an_id=%d ts%d bytes_sent=%d\n", *(uint8_t *)(buff2+ETH_ALEN), *(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t)), - *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)), + *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)), bytes_sent); dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, RAW_PACKET_SIZE_BYTES(nsamps), TX_FLAG); #endif @@ -343,10 +338,10 @@ int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestam buff[0], packet_size, 0); - if (bytes_received ==-1) { - eth->num_rx_errors++; - perror("ETHERNET IF4p5 READ (payload): "); - exit(-1); + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("ETHERNET IF4p5 READ (payload): "); + exit(-1); } else { eth->rx_actual_nsamps = bytes_received>>1; eth->rx_count++; @@ -425,7 +420,6 @@ int eth_get_dev_conf_raw(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - char str[INET_ADDRSTRLEN]; void *msg; ssize_t msg_len; @@ -456,7 +450,6 @@ int eth_get_dev_conf_raw_IF4p5(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - char str[INET_ADDRSTRLEN]; void *msg; ssize_t msg_len; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index a9706c73bd..863b0d02d2 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -63,7 +63,7 @@ uint16_t pck_seq_num = 1; uint16_t pck_seq_num_cur=0; uint16_t pck_seq_num_prev=0; - int eth_socket_init_udp(openair0_device *device) { +int eth_socket_init_udp(openair0_device *device) { int i = 0; eth_state_t *eth = (eth_state_t*)device->priv; @@ -138,6 +138,103 @@ uint16_t pck_seq_num_prev=0; return 0; } +int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + + // Read nblocks info from packet itself + int nblocks = nsamps; + int bytes_received=0; + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; + + ssize_t packet_size = sizeof_IF4p5_header_t; + IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0]); + + + bytes_received = recvfrom(eth->sockfd[Mod_id], + buff[0], + packet_size, + 0, + (struct sockaddr *)&dest_addr[Mod_id], + (socklen_t *)&addr_len[Mod_id]); + + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("ETHERNET IF4p5 READ (header): "); + exit(-1); + } + + *timestamp = test_header->sub_type; + + if (test_header->sub_type == IF4p5_PDLFFT) { + packet_size = UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks); + } else if (test_header->sub_type == IF4p5_PULFFT) { + packet_size = UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks); + } else { + packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; + } + + + while(bytes_received < packet_size) { + bytes_received = recvfrom(eth->sockfd[Mod_id], + buff[0], + packet_size, + 0, + (struct sockaddr *)&dest_addr[Mod_id], + (socklen_t *)&addr_len[Mod_id]); + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("ETHERNET IF4p5 READ (payload): "); + exit(-1); + } else { + eth->rx_actual_nsamps = bytes_received>>1; + eth->rx_count++; + } + } + + eth->rx_nsamps = nsamps; + return(bytes_received); +} + +int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int nblocks = nsamps; + int bytes_sent = 0; + + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; + + ssize_t packet_size; + + if (flags == IF4p5_PDLFFT) { + packet_size = UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PULFFT) { + packet_size = UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks); + } else { + printf("trx_eth_write_udp_IF4p5: unknown flags %d\n",flags); + return(-1); + } + + eth->tx_nsamps = nblocks; + + bytes_sent = sendto(eth->sockfd[Mod_id], + buff[0], + packet_size, + 0, + (struct sockaddr*)&dest_addr[Mod_id], + addr_len[Mod_id]); + + if (bytes_sent == -1) { + eth->num_tx_errors++; + perror("ETHERNET WRITE: "); + exit(-1); + } else { + eth->tx_actual_nsamps = bytes_sent>>1; + eth->tx_count++; + } + + return (bytes_sent); +} + int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags) { int bytes_sent=0; @@ -216,7 +313,7 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi int bytes_received=0; eth_state_t *eth = (eth_state_t*)device->priv; - openair0_timestamp prev_timestamp = -1; + // openair0_timestamp prev_timestamp = -1; int Mod_id = device->Mod_id; int rcvfrom_flag =0; int block_cnt=0; @@ -298,7 +395,7 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi pck_seq_num_cur = *(uint16_t *)buff2; //printf("cur=%d prev=%d buff=%d\n",pck_seq_num_cur,pck_seq_num_prev,*(uint16_t *)(buff2)); if ( ( pck_seq_num_cur != (pck_seq_num_prev + 1) ) && !((pck_seq_num_prev==75) && (pck_seq_num_cur==1 ))){ - printf("out of order packet received1! %d|%d|%d\n",pck_seq_num_cur,pck_seq_num_prev, *timestamp); + printf("out of order packet received1! %d|%d|%d\n",pck_seq_num_cur,pck_seq_num_prev,(int)*timestamp); } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM,pck_seq_num_cur); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,pck_seq_num_prev); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index e5d606f2d7..6079781ba1 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -90,19 +90,15 @@ int trx_eth_start(openair0_device *device) { if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; } else if (eth->flags == ETH_UDP_IF4p5_MODE) { printf("Setting ETHERNET to UDP_IF4p5_MODE\n"); - + if (eth_socket_init_udp(device)!=0) return -1; + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_udp(device)!=0) return -1; + } else { + if(eth_get_dev_conf_udp(device)!=0) return -1; + } } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { printf("Setting ETHERNET to RAW_IF5_MODE\n"); if (eth_socket_init_raw(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - //if (device->host_type == BBU_HOST) { - //if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1; - //} else { - //if(eth_get_dev_conf_raw_IF4p5(device)!=0) return -1; -// - /* adjust MTU wrt number of samples per packet */ - // if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; - } else { if (eth_socket_init_udp(device)!=0) return -1; /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ @@ -171,7 +167,7 @@ int trx_eth_reply(openair0_device *device, void *msg, ssize_t msg_len) { -int trx_eth_stop(int card) { +int trx_eth_stop(openair0_device *device) { return(0); } @@ -199,11 +195,11 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { struct timeval timeout; struct ifreq ifr; char system_cmd[256]; - char* if_name=DEFAULT_IF; - struct in_addr ia; - struct if_nameindex *ids; + // char* if_name=DEFAULT_IF; + // struct in_addr ia; + // struct if_nameindex *ids; int ret=0; - int i=0; + // int i=0; /****************** socket level options ************************/ switch(option) { @@ -238,7 +234,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { (char *)&timeout,sizeof(timeout))) { perror("[ETHERNET] setsockopt()"); } else { - printf( "receive timeout= %u usec\n",timeout.tv_usec); + printf( "receive timeout= %u usec\n",(unsigned int)timeout.tv_usec); } break; @@ -251,7 +247,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { (char *)&timeout,sizeof(timeout))) { perror("[ETHERNET] setsockopt()"); } else { - printf( "send timeout= %d,%d sec\n",timeout.tv_sec,timeout.tv_usec); + printf( "send timeout= %d,%d sec\n",(int)timeout.tv_sec,(int)timeout.tv_usec); } break; @@ -311,7 +307,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case RING_PAR: - ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s rx %d tx %d",eth->if_name[Mod_id],value); + ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s val %d",eth->if_name[Mod_id],value); if (ret > 0) { ret=system(system_cmd); if (ret == -1) { @@ -376,6 +372,9 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth } else if (eth->flags == ETH_RAW_IF4p5_MODE) { device->trx_write_func = trx_eth_write_raw_IF4p5; device->trx_read_func = trx_eth_read_raw_IF4p5; + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { + device->trx_write_func = trx_eth_write_udp_IF4p5; + device->trx_read_func = trx_eth_read_udp_IF4p5; } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { device->trx_write_func = trx_eth_write_raw_IF4p5; device->trx_read_func = trx_eth_read_raw_IF4p5; @@ -460,7 +459,7 @@ void dump_dev(openair0_device *device) { device->openair0_cfg->num_rb_dl, device->openair0_cfg->sample_rate); printf(" BBU configured for %i tx/%i rx channels)\n", device->openair0_cfg->tx_num_channels,device->openair0_cfg->rx_num_channels); - printf(" Running flags: %s %s %s\n", + printf(" Running flags: %s %s (\n", ((eth->flags & ETH_RAW_MODE) ? "RAW socket mode - ":""), ((eth->flags & ETH_UDP_MODE) ? "UDP socket mode - ":"")); printf(" Number of iqs dumped when displaying packets: %i\n\n",eth->iqdumpcnt); @@ -470,14 +469,14 @@ void dump_dev(openair0_device *device) { void inline dump_txcounters(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; printf(" Ethernet device interface %i, tx counters:\n" ,device->openair0_cfg->Mod_id); - printf(" Sent packets: %llu send errors: %i\n", eth->tx_count, eth->num_tx_errors); + printf(" Sent packets: %llu send errors: %i\n", (long long unsigned int)eth->tx_count, eth->num_tx_errors); } void inline dump_rxcounters(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; printf(" Ethernet device interface %i rx counters:\n" ,device->openair0_cfg->Mod_id); - printf(" Received packets: %llu missed packets errors: %i\n", eth->rx_count, eth->num_underflows); + printf(" Received packets: %llu missed packets errors: %i\n", (long long unsigned int)eth->rx_count, eth->num_underflows); } void inline dump_buff(openair0_device *device, char *buff,unsigned int tx_rx_flag, int nsamps) { diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 3adb0f45cb..0d80dbd023 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -176,9 +176,10 @@ typedef struct { void dump_packet(char *title, unsigned char* pkt, int bytes, unsigned int tx_rx_flag); unsigned short calc_csum (unsigned short *buf, int nwords); void dump_dev(openair0_device *device); -void inline dump_buff(openair0_device *device, char *buff,unsigned int tx_rx_flag,int nsamps); +/*void inline dump_buff(openair0_device *device, char *buff,unsigned int tx_rx_flag,int nsamps); void inline dump_rxcounters(openair0_device *device); void inline dump_txcounters(openair0_device *device); +*/ void dump_iqs(char * buff, int iq_cnt); @@ -224,6 +225,8 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); +int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int eth_get_dev_conf_raw(openair0_device *device); int eth_set_dev_conf_raw(openair0_device *device); int eth_get_dev_conf_raw_IF4p5(openair0_device *device); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index e118e9f99f..855ff49704 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -65,6 +65,9 @@ #define RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4p5_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + PRACH_BLOCK_SIZE_BYTES) +#define UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks) (sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define UDP_IF4p5_PRACH_SIZE_BYTES (sizeof_IF4p5_header_t + PRACH_BLOCK_SIZE_BYTES) // Mobipass packet sizes #define RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES 1280 From 121e33e608773baefeb5245a4b7cbd1b2f997629 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 5 Aug 2016 03:21:34 -0700 Subject: [PATCH 165/340] minor changes in dlsim. --- openair1/SIMULATION/LTE_PHY/dlsim.c | 7 ++++--- targets/RT/USER/lte-enb.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 23a453b941..f7824773e0 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -2515,8 +2515,9 @@ int main(int argc, char **argv) proc_eNB->subframe_tx = subframe; - - phy_procedures_eNB_TX(eNB,proc_eNB,0,no_relay,NULL); + eNB->abstraction_flag=0; + + phy_procedures_eNB_TX(eNB,proc_eNB,no_relay,NULL); start_meas(&eNB->ofdm_mod_stats); @@ -2538,7 +2539,7 @@ int main(int argc, char **argv) proc_eNB->subframe_tx = subframe+1; - phy_procedures_eNB_TX(eNB,proc_eNB,0,no_relay,NULL); + phy_procedures_eNB_TX(eNB,proc_eNB,no_relay,NULL); do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], eNB->common_vars.txdata[eNB_id], diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index ed8cfefecb..b5cdf68934 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -682,7 +682,7 @@ static void* eNB_thread_asynch_rx( void* param ) { if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB FH sched_setattr failed\n"); - return &eNB_thread_FH_status; + return &eNB_thread_asynch_rx_status; } LOG_I( HW, "[SCHED] eNB asynch RX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); From 6da3f494f4daaf0696a929746807e6768164122f Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Fri, 5 Aug 2016 15:26:36 +0200 Subject: [PATCH 166/340] update nettle to new interface, update deadline scheduler option (doesnt compile without this), update build/install script to use regular nettle and gnutls in ubuntu 16.04 (should also be fine with 14.04 up-to-date), update init_exmimo2 for ubuntu 16.04) --- cmake_targets/tools/build_helper | 11 ++++++++--- cmake_targets/tools/init_exmimo2 | 8 -------- openair2/UTIL/OSA/osa_stream_eea.c | 2 +- openair3/SECU/nas_stream_eea2.c | 2 +- openair3/TEST/test_aes128_ctr_decrypt.c | 2 +- targets/RT/USER/lte-enb.c | 18 ++++++++++-------- 6 files changed, 21 insertions(+), 22 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 4738acb7f3..8dbdd33823 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -386,9 +386,14 @@ check_install_oai_software() { $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so # First we remove gnutls/nettle installation and then install from sources - $SUDO apt-get remove -y libgnutls-dev nettle-dev nettle-bin - install_nettle_from_source - install_gnutls_from_source + v=$(lsb_release -ris | tr -d '\n') + if [ "$v" == Ubuntu16.04 ] ; then + $SUDO apt-get install libgnutls-dev nettle-dev nettle-bin + else + $SUDO apt-get remove -y libgnutls-dev nettle-dev nettle-bin + install_nettle_from_source + install_gnutls_from_source + fi install_asn1c_from_source } diff --git a/cmake_targets/tools/init_exmimo2 b/cmake_targets/tools/init_exmimo2 index 66eedf93dd..363e42ea25 100755 --- a/cmake_targets/tools/init_exmimo2 +++ b/cmake_targets/tools/init_exmimo2 @@ -71,15 +71,7 @@ if [ ! -e /dev/openair0 ]; then sudo chmod a+rw /dev/openair0 fi -DEVICE=`echo $PCI | awk -F\" '{print $(NF-1)}' | awk '{print $2}'` -DEVICE_SWID=${DEVICE:2:2} -if [ $DEVICE_SWID == '0a' ]; then - echo "Using firware version 10" $OPENAIR_DIR/targets/bin/updatefw -s 0x43fffff0 -b -f $OPENAIR_TARGETS/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/sdr_expressmimo2_v10 -else - echo 'No corresponding firmware found' - return -fi } main "$@" diff --git a/openair2/UTIL/OSA/osa_stream_eea.c b/openair2/UTIL/OSA/osa_stream_eea.c index 8e346631ec..acd341232e 100644 --- a/openair2/UTIL/OSA/osa_stream_eea.c +++ b/openair2/UTIL/OSA/osa_stream_eea.c @@ -199,7 +199,7 @@ int stream_encrypt_eea2(stream_cipher_t *stream_cipher, uint8_t **out) } #endif - nettle_aes128.set_encrypt_key(ctx, stream_cipher->key_length, + nettle_aes128.set_encrypt_key(ctx, stream_cipher->key); nettle_ctr_crypt(ctx, nettle_aes128.encrypt, diff --git a/openair3/SECU/nas_stream_eea2.c b/openair3/SECU/nas_stream_eea2.c index 25ef340f4e..799aaaf432 100644 --- a/openair3/SECU/nas_stream_eea2.c +++ b/openair3/SECU/nas_stream_eea2.c @@ -85,7 +85,7 @@ int nas_stream_encrypt_eea2(nas_stream_cipher_t *stream_cipher, uint8_t *out) } #endif - nettle_aes128.set_encrypt_key(ctx, stream_cipher->key_length, + nettle_aes128.set_encrypt_key(ctx, stream_cipher->key); nettle_ctr_crypt(ctx, nettle_aes128.encrypt, diff --git a/openair3/TEST/test_aes128_ctr_decrypt.c b/openair3/TEST/test_aes128_ctr_decrypt.c index f3740b48ff..251f80fa70 100644 --- a/openair3/TEST/test_aes128_ctr_decrypt.c +++ b/openair3/TEST/test_aes128_ctr_decrypt.c @@ -48,7 +48,7 @@ void test_uncipher_ctr(const struct nettle_cipher *cipher, const uint8_t *key, uint8_t *data = malloc(length); uint8_t *ctr = malloc(cipher->block_size); - cipher->set_encrypt_key(ctx, key_length, key); + cipher->set_encrypt_key(ctx, key); memcpy(ctr, ictr, cipher->block_size); ctr_crypt(ctx, cipher->encrypt, diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 7381e37bff..ae781092f0 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -157,6 +157,8 @@ static struct { volatile uint8_t phy_proc_CC_id; } sync_phy_proc; +extern double cpuf; + void exit_fun(const char* s); void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *); @@ -432,6 +434,10 @@ static void* eNB_thread_rxtx( void* param ) { MSC_START_USE(); + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; #ifdef DEADLINE_SCHEDULER struct sched_attr attr; @@ -462,10 +468,6 @@ static void* eNB_thread_rxtx( void* param ) { struct sched_param sparam; char cpu_affinity[1024]; cpu_set_t cpuset; - struct timespec wait; - - wait.tv_sec=0; - wait.tv_nsec=5000000L; /* Set affinity mask to include CPUs 1 to MAX_CPUS */ /* CPU 0 is reserved for UHD threads */ @@ -819,7 +821,7 @@ static void* eNB_thread_asynch_rxtx( void* param ) { if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB FH sched_setattr failed\n"); - return &eNB_thread_FH_status; + return &eNB_thread_asynch_rxtx_status; } LOG_I( HW, "[SCHED] eNB asynch RX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); @@ -1403,7 +1405,7 @@ static void* eNB_thread_FH( void* param ) { #ifdef DEADLINE_SCHEDULER if (opp_enabled){ if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); } } #endif // DEADLINE_SCHEDULER @@ -1664,8 +1666,8 @@ void init_eNB_proc(int inst) { (eNB->node_function == NGFI_RRU_IF4p5)) pthread_create( &proc->pthread_asynch_rxtx, &proc->attr_asynch_rxtx, eNB_thread_asynch_rxtx, &eNB->proc ); #else - pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); - pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); + pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &proc_rxtx[1] ); pthread_create( &proc->pthread_FH, NULL, eNB_thread_FH, &eNB->proc ); pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); if (eNB->node_timing == synch_to_other) From a0170b8e0f8a2c8b794f613e85f4051947aebdad Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 5 Aug 2016 09:34:45 -0700 Subject: [PATCH 167/340] more cleanup for lte-enb.c --- targets/RT/USER/lte-enb.c | 720 +++++++++-------------------------- targets/RT/USER/rt_wrapper.c | 11 +- targets/RT/USER/rt_wrapper.h | 29 +- 3 files changed, 202 insertions(+), 558 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 36eba0efe3..d55c2d0586 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -163,6 +163,163 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst void stop_eNB(int nb_inst); +inline void thread_top_init(char *thread_name, + uint64_t runtime, + uint64_t deadline, + uint64_t period) { + + MSC_START_USE(); + +#ifdef DEADLINE_SCHEDULER + struct sched_attr attr; + + unsigned int flags = 0; + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = runtime; + attr.sched_deadline = deadline; + attr.sched_period = period; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] eNB tx thread: sched_setattr failed\n"); + return &eNB_thread_rxtx_status; + } + + LOG_I( HW, "[SCHED] eNB RXn-TXnp4 deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); + +#else //LOW_LATENCY + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD threads */ + /* CPU 1 is reserved for all RX_TX threads */ + /* Enable CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); + +#ifdef CPU_AFFINITY + if (get_nprocs() > 2) + { + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun("Error setting processor affinity"); + } + } +#endif //CPU_AFFINITY + + /* Check the actual affinity mask assigned to the thread */ + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) { + perror( "pthread_getaffinity_np"); + exit_fun("Error getting processor affinity "); + } + memset(cpu_affinity,0,sizeof(cpu_affinity)); + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + memset(&sparam, 0, sizeof(sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; + policy = SCHED_FIFO ; + + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) { + perror("pthread_getschedparam : "); + exit_fun("Error getting thread priority"); + } + + LOG_I(HW, "[SCHED][eNB] %s started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",thread_name,sched_getcpu(),gettid(), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, cpu_affinity ); + +#endif //LOW_LATENCY + + mlockall(MCL_CURRENT | MCL_FUTURE); + +} + +inline void wait_sync(char *thread_name) { + + printf( "waiting for sync (%s)\n",thread_name); + pthread_mutex_lock( &sync_mutex ); + + while (sync_var<0) + pthread_cond_wait( &sync_cond, &sync_mutex ); + + pthread_mutex_unlock(&sync_mutex); + + printf( "got sync (%s)\n", thread_name); + +} + +inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + if (pthread_mutex_timedlock(mutex,&wait) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + + while (*instance_cnt < 0) { + // most of the time the thread is waiting here + // proc->instance_cnt_rxtx is -1 + pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again + } + + if (pthread_mutex_unlock(mutex) != 0) { + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} + +inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) { + + if (pthread_mutex_lock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + + *instance_cnt=*instance_cnt-1; + + if (pthread_mutex_unlock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} + void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { unsigned int aa,slot_offset, slot_offset_F; @@ -419,135 +576,19 @@ static void* eNB_thread_rxtx( void* param ) { PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - FILE *tx_time_file = NULL; - char tx_time_name[101]; + char thread_name[100]; + - - if (opp_enabled == 1) { - snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf", "eNB"); - tx_time_file = fopen(tx_time_name,"w"); - } // set default return value eNB_thread_rxtx_status = 0; - MSC_START_USE(); - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - - unsigned int flags = 0; - uint64_t runtime = 850000 ; - uint64_t deadline = 1 * 1000000 ; // each tx thread will finish within 1ms - uint64_t period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = runtime; - attr.sched_deadline = deadline; - attr.sched_period = period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - return &eNB_thread_rxtx_status; - } - - LOG_I( HW, "[SCHED] eNB RXn-TXnp4 deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); - -#else //LOW_LATENCY - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - struct timespec wait; - - wait.tv_sec=0; - wait.tv_nsec=5000000L; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ - /* CPU 1 is reserved for all RX_TX threads */ - /* Enable CPU Affinity only if number of CPUs >2 */ - CPU_ZERO(&cpuset); - -#ifdef CPU_AFFINITY - if (get_nprocs() > 2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } -#endif //CPU_AFFINITY - - /* Check the actual affinity mask assigned to the thread */ - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity,0,sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0, sizeof(sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - } - - LOG_I(HW, "[SCHED][eNB] RXn_TXnp4 thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - sparam.sched_priority, cpu_affinity ); - -#endif //LOW_LATENCY - - mlockall(MCL_CURRENT | MCL_FUTURE); + sprintf(thread_name,"RXn_TXnp4_%d\n",&eNB->proc.proc_rxtx[0] == proc ? 0 : 1); + thread_top_init(thread_name,850000L,1000000L,2000000L); while (!oai_exit) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); - if (pthread_mutex_timedlock(&proc->mutex_rxtx,&wait) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RXn-TXnp4\n"); - exit_fun("nothing to add"); - break; - } - - while (proc->instance_cnt_rxtx < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_rxtx is -1 - pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx ); // this unlocks mutex_rxtx while waiting and then locks it again - } - - if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { - LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX\n"); - exit_fun("nothing to add"); - break; - } + if (wait_on_condition(&proc->mutex_rxtx,&proc->cond_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 1 ); @@ -583,33 +624,10 @@ static void* eNB_thread_rxtx( void* param ) { } - - if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc\n"); - exit_fun("nothing to add"); - break; - } - - proc->instance_cnt_rxtx--; - - if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc\n"); - exit_fun("nothing to add"); - break; - } + if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break; stop_meas( &softmodem_stats_rxtx_sf ); - - if (opp_enabled){ - -#ifdef DEADLINE_SCHEDULER - if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); - } -#endif - } - print_meas_now(&softmodem_stats_rxtx_sf,"eNB_TX_SF",tx_time_file); - } + } // while !oai_exit VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); @@ -795,125 +813,20 @@ static void* eNB_thread_asynch_rxtx( void* param ) { eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; - LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + int subframe=0, frame=0; - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - uint64_t runtime = 870000 ; - uint64_t deadline = 1 * 1000000; - uint64_t period = 1 * 10000000; // each rx thread has a period of 10ms from the starting point - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = runtime; - attr.sched_deadline = deadline; - attr.sched_period = period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB FH sched_setattr failed\n"); - return &eNB_thread_asynch_rx_status; - } - - LOG_I( HW, "[SCHED] eNB asynch RX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); -#else // LOW_LATENCY - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD */ - /* CPU 1 is reserved for all TX threads */ - /* CPU 2..MAX_CPUS is reserved for all RX threads */ - /* Set CPU Affinity only if number of CPUs >2 */ - CPU_ZERO(&cpuset); -#ifdef CPU_AFFINITY - if (get_nprocs() >2) { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror( "pthread_setaffinity_np"); - exit_fun (" Error setting processor affinity :"); - } - } -#endif //CPU_AFFINITY - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror ("pthread_getaffinity_np"); - exit_fun (" Error getting processor affinity :"); - } - memset(cpu_affinity,0, sizeof(cpu_affinity)); - - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); - - policy = SCHED_FIFO ; - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - - memset(&sparam, 0 , sizeof (sparam)); - - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) { - perror("pthread_getschedparam"); - exit_fun("Error getting thread priority"); - } - - LOG_I(HW, "[SCHED][eNB] eNB asynch RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - sparam.sched_priority, cpu_affinity); - - -#endif // DEADLINE_SCHEDULER - - - mlockall(MCL_CURRENT | MCL_FUTURE); + thread_top_init("thread_asynch",870000L,1000000L,1000000L); // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe - printf( "waiting for sync (eNB_thread_asynch_rx)\n"); - pthread_mutex_lock( &sync_mutex ); - - while (sync_var<0) - pthread_cond_wait( &sync_cond, &sync_mutex ); - - pthread_mutex_unlock(&sync_mutex); - - printf( "got sync (eNB_thread_asynch_rx)\n" ); + wait_sync("thread_asynch"); // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe printf( "waiting for devices (eNB_thread_asynch_rx)\n"); - pthread_mutex_lock( &proc->mutex_asynch_rxtx); - while (proc->instance_cnt_asynch_rxtx<0) - pthread_cond_wait( &proc->cond_asynch_rxtx, &proc->mutex_asynch_rxtx ); - - pthread_mutex_unlock(&proc->mutex_asynch_rxtx); + wait_on_condition(&proc->mutex_asynch_rxtx,&proc->cond_asynch_rxtx,&proc->instance_cnt_asynch_rxtx,"thread_asynch"); printf( "devices ok (eNB_thread_asynch_rx)\n"); @@ -1105,17 +1018,11 @@ void rx_fh_slave(PHY_VARS_eNB *eNB,int *frame,int *subframe) { // it just waits for an external event. The actual rx_rh is handle by the asynchronous RX thread eNB_proc_t *proc=&eNB->proc; - if (pthread_mutex_lock(&proc->mutex_FH) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for FH Slave\n"); - exit_fun( "error locking mutex" ); - } - - while (proc->instance_cnt_FH < 0) { - pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); - } - proc->instance_cnt_FH++; - - pthread_mutex_unlock( &proc->mutex_FH ); + if (wait_on_condition(&proc->mutex_FH,&proc->cond_FH,&proc->instance_cnt_FH,"rx_fh_slave") < 0) + return; + + release_thread(&proc->mutex_FH,&proc->instance_cnt_FH,"rx_fh_slave"); + } @@ -1219,6 +1126,7 @@ void wakeup_slaves(eNB_proc_t *proc) { * \param param is a \ref eNB_proc_t structure which contains the info what to process. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ + static void* eNB_thread_FH( void* param ) { static int eNB_thread_FH_status; @@ -1227,131 +1135,20 @@ static void* eNB_thread_FH( void* param ) { PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; - FILE *rx_time_file = NULL; - char rx_time_name[101]; - int subframe=0, frame=0; - if (opp_enabled == 1) { - snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf", "eNB"); - rx_time_file = fopen(rx_time_name,"w"); - } // set default return value eNB_thread_FH_status = 0; - MSC_START_USE(); + thread_top_init("eNB_thread_FH",870000,1000000,1000000); -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - uint64_t runtime = 870000 ; - uint64_t deadline = 1 * 1000000; - uint64_t period = 1 * 10000000; // each rx thread has a period of 10ms from the starting point - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; + wait_sync("eNB_thread_FH"); - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = runtime; - attr.sched_deadline = deadline; - attr.sched_period = period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB FH sched_setattr failed\n"); - return &eNB_thread_FH_status; - } - - LOG_I( HW, "[SCHED] eNB FH deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); -#else // LOW_LATENCY - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD */ - /* CPU 1 is reserved for all TX threads */ - /* CPU 2..MAX_CPUS is reserved for all RX threads */ - /* Set CPU Affinity only if number of CPUs >2 */ - CPU_ZERO(&cpuset); -#ifdef CPU_AFFINITY - if (get_nprocs() >2) { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror( "pthread_setaffinity_np"); - exit_fun (" Error setting processor affinity :"); - } - } -#endif //CPU_AFFINITY - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror ("pthread_getaffinity_np"); - exit_fun (" Error getting processor affinity :"); - } - memset(cpu_affinity,0, sizeof(cpu_affinity)); - - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); - - policy = SCHED_FIFO ; - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - - memset(&sparam, 0 , sizeof (sparam)); - - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) { - perror("pthread_getschedparam"); - exit_fun("Error getting thread priority"); - } - - LOG_I(HW, "[SCHED][eNB] FH thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - sparam.sched_priority, cpu_affinity); - - -#endif // DEADLINE_SCHEDULER - - - mlockall(MCL_CURRENT | MCL_FUTURE); - - // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe - printf( "waiting for sync (eNB_thread_FH)\n"); - pthread_mutex_lock( &sync_mutex ); - - while (sync_var<0) - pthread_cond_wait( &sync_cond, &sync_mutex ); - - pthread_mutex_unlock(&sync_mutex); - - printf( "got sync (eNB_thread_FH)\n" ); - #if defined(ENABLE_ITTI) if (eNB->node_function < NGFI_RRU_IF5) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif - // Start IF device if any if (eNB->start_if) if (eNB->start_if(eNB) != 0) @@ -1362,7 +1159,7 @@ static void* eNB_thread_FH( void* param ) { if (eNB->start_rf(eNB) != 0) LOG_E(HW,"Could not start the RF device\n"); - // wakeup asnych_rxtx thread + // wakeup asnych_rxtx thread because the devices are ready at this point pthread_mutex_lock(&proc->mutex_asynch_rxtx); proc->instance_cnt_asynch_rxtx=0; pthread_mutex_unlock(&proc->mutex_asynch_rxtx); @@ -1371,10 +1168,8 @@ static void* eNB_thread_FH( void* param ) { // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices while (!oai_exit) { - if (oai_exit) break; - - - // this is to check that we are in synch with the fronthaul timing + // these are local subframe/frame counters to check that we are in synch with the fronthaul timing. + // They are set on the first rx/tx in the underly FH routines. if (subframe==9) { subframe=0; frame++; @@ -1399,30 +1194,7 @@ static void* eNB_thread_FH( void* param ) { if (wakeup_rxtx(proc,&proc->proc_rxtx[proc->subframe_rx&1],fp) < 0) break; - stop_meas( &softmodem_stats_rxtx_sf ); -#ifdef DEADLINE_SCHEDULER - if (opp_enabled){ - if(softmodem_stats_rxtx_sf.diff_now/(cpuf) > attr.sched_runtime) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB, (softmodem_stats_rxtx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0); - } - } -#endif // DEADLINE_SCHEDULER - print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); - - print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); - - - if (eNB->node_timing == synch_to_ext_device) { - proc->instance_cnt_FH--; - - if (pthread_mutex_unlock(&proc->mutex_FH) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for FH\n"); - exit_fun( "error unlocking mutex" ); - } - } - + // artifical sleep for very slow fronthaul if (eNB->frame_parms.N_RB_DL==6) rt_sleep_ns(800000LL); } @@ -1444,147 +1216,21 @@ static void* eNB_thread_prach( void* param ) { eNB_proc_t *proc = (eNB_proc_t*)param; PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id]; - /* - struct timespec wait; - wait.tv_sec=0; - wait.tv_nsec=5000000L; - */ // set default return value eNB_thread_prach_status = 0; - MSC_START_USE(); - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - uint64_t runtime = 870000 ; - uint64_t deadline = 1 * 1000000; - uint64_t period = 1 * 10000000; // each prach thread has a period of 10ms from the starting point - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = runtime; - attr.sched_deadline = deadline; - attr.sched_period = period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB PRACH sched_setattr failed\n"); - return &eNB_thread_prach_status; - } - - LOG_I( HW, "[SCHED] eNB PRACH deadline thread (TID %ld) started on CPU %d\n", 0, gettid(), sched_getcpu() ); -#else // LOW_LATENCY - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD */ - /* CPU 1 is reserved for all TX threads */ - /* CPU 2..MAX_CPUS is reserved for all RX threads */ - /* Set CPU Affinity only if number of CPUs >2 */ - CPU_ZERO(&cpuset); -#ifdef CPU_AFFINITY - if (get_nprocs() >2) { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror( "pthread_setaffinity_np"); - exit_fun (" Error setting processor affinity :"); - } - } -#endif //CPU_AFFINITY - - /* Check the actual affinity mask assigned to the thread */ - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror ("pthread_getaffinity_np"); - exit_fun (" Error getting processor affinity :"); - } - memset(cpu_affinity,0, sizeof(cpu_affinity)); - - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-2; - - policy = SCHED_FIFO ; - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - - memset(&sparam, 0 , sizeof (sparam)); - - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) { - perror("pthread_getschedparam"); - exit_fun("Error getting thread priority"); - } - - LOG_I(HW, "[SCHED][eNB] PRACH thread started on CPU %d TID %ld, IC %d, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(),proc->instance_cnt_prach, - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - sparam.sched_priority, cpu_affinity); - -#endif // DEADLINE_SCHEDULER - - mlockall(MCL_CURRENT | MCL_FUTURE); + thread_top_init("eNB_thread_prach",500000L,1000000L,20000000L); while (!oai_exit) { if (oai_exit) break; - - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH\n"); - exit_fun( "error locking mutex" ); - break; - } - while (proc->instance_cnt_prach < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_prach is -1 - pthread_cond_wait( &proc->cond_prach, &proc->mutex_prach ); // this unlocks mutex_rxtx while waiting and then locks it again - } - - if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB PRACH\n"); - exit_fun( "error unlocking mutex" ); - break; - } - + if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"eNB_prach_thread") < 0) break; prach_procedures(eNB); - if (pthread_mutex_lock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n"); - exit_fun( "error locking mutex" ); - break; - } - - proc->instance_cnt_prach--; - - if (pthread_mutex_unlock(&proc->mutex_prach) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n"); - exit_fun( "error unlocking mutex" ); - break; - } + if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"eNB_prach_thread") < 0) break; } printf( "Exiting eNB thread PRACH\n"); diff --git a/targets/RT/USER/rt_wrapper.c b/targets/RT/USER/rt_wrapper.c index ed9eb4e798..d80de635a6 100644 --- a/targets/RT/USER/rt_wrapper.c +++ b/targets/RT/USER/rt_wrapper.c @@ -78,8 +78,6 @@ void set_latency_target(void) { } -#ifndef RTAI - struct timespec interval, next, now, res; clockid_t clock_id = CLOCK_MONOTONIC; //other options are CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID RTIME rt_get_time_ns (void) @@ -257,12 +255,7 @@ int sched_getattr(pid_t pid,struct sched_attr *attr,unsigned int size, unsigned #endif -#else -int rt_sleep_ns(RTIME x) -{ - rt_sleep(nano2count(x)); - return(0); -} -#endif + + diff --git a/targets/RT/USER/rt_wrapper.h b/targets/RT/USER/rt_wrapper.h index d67632054b..ae668945fe 100644 --- a/targets/RT/USER/rt_wrapper.h +++ b/targets/RT/USER/rt_wrapper.h @@ -28,7 +28,7 @@ *******************************************************************************/ /*! \file rt_wrapper.h -* \brief provides a wrapper for the timing function for real-time opeartions depending on weather RTAI is used or not. It also implements an API for the SCHED_DEADLINE kernel scheduler. +* \brief provides a wrapper for the timing function for real-time opeartions. It also implements an API for the SCHED_DEADLINE kernel scheduler. * \author F. Kaltenberger and Navid Nikaein * \date 2013 * \version 0.1 @@ -39,9 +39,8 @@ */ -void set_latency_target(void); -#ifndef RTAI +#define _GNU_SOURCE #include #include #include @@ -52,11 +51,26 @@ void set_latency_target(void); #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "UTIL/LOG/log_extern.h" +#include "msc.h" #define RTIME long long int #define rt_printk printf +void set_latency_target(void); + RTIME rt_get_time_ns (void); int rt_sleep_ns (RTIME x); @@ -115,12 +129,3 @@ int sched_getattr(pid_t pid,struct sched_attr *attr,unsigned int size, unsigned #define gettid() syscall(__NR_gettid) // for gettid -#else -#include -#include -#include -#include - -int rt_sleep_ns(RTIME x); - -#endif From f3e084e005fd3bc7562ec5aabdc2adaa3be2c037 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 5 Aug 2016 15:41:34 -0700 Subject: [PATCH 168/340] single-thread. --- openair1/PHY/defs.h | 7 + openair1/SCHED/phy_procedures_lte_eNb.c | 28 ++- targets/RT/USER/lte-enb.c | 245 +++++++++++++++--------- targets/RT/USER/lte-softmodem.c | 16 +- 4 files changed, 190 insertions(+), 106 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 46679c7f7c..8a6c827ff8 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -256,6 +256,8 @@ typedef struct eNB_proc_t_s { int instance_cnt_asynch_rxtx; /// pthread structure for FH processing thread pthread_t pthread_FH; + /// pthread structure for eNB single processing thread + pthread_t pthread_single; /// pthread structure for asychronous RX/TX processing thread pthread_t pthread_asynch_rxtx; /// flag to indicate first RX acquisition @@ -264,12 +266,16 @@ typedef struct eNB_proc_t_s { int first_tx; /// pthread attributes for FH processing thread pthread_attr_t attr_FH; + /// pthread attributes for single eNB processing thread + pthread_attr_t attr_single; /// pthread attributes for prach processing thread pthread_attr_t attr_prach; /// pthread attributes for asynchronous RX thread pthread_attr_t attr_asynch_rxtx; /// scheduling parameters for FH thread struct sched_param sched_param_FH; + /// scheduling parameters for single eNB thread + struct sched_param sched_param_single; /// scheduling parameters for prach thread struct sched_param sched_param_prach; /// scheduling parameters for asynch_rxtx thread @@ -363,6 +369,7 @@ typedef struct PHY_VARS_eNB_s { eNB_proc_t proc; eNB_func_t node_function; eNB_timing_t node_timing; + int single_thread_flag; openair0_rf_map rf_map; int abstraction_flag; void (*do_prach)(struct PHY_VARS_eNB_s *eNB); diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 164c21ce21..0623ae02d5 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2583,30 +2583,27 @@ void do_prach(PHY_VARS_eNB *eNB) { void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ - eNB_proc_t *proc = &eNB->proc; - LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; - - const int subframe = proc->subframe_rx; - const int frame = proc->frame_rx; - + eNB_proc_t *proc = &eNB->proc; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; + int offset = (proc == &eNB->proc.proc_rxtx[0]) ? 0 : 1; if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 1 ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB+offset, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_ENB+offset, proc->subframe_rx ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+offset, 1 ); start_meas(&eNB->phy_proc_rx); - - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_common_RX(%d)\n",eNB->Mod_id,frame,subframe); if (eNB->fep) eNB->fep(eNB); if (eNB->do_prach) eNB->do_prach(eNB); - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+(subframe&1), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON+offset, 0 ); } @@ -2623,11 +2620,12 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; const int subframe = proc->subframe_rx; - const int frame = proc->frame_rx; + const int frame = proc->frame_rx; + int offset = (proc == &eNB->proc.proc_rxtx[0]) ? 0 : 1; if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+(subframe&1), 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+offset, 1 ); start_meas(&eNB->phy_proc_rx); #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_uespec_RX(%d)\n",eNB->Mod_id,frame, subframe); @@ -3189,7 +3187,7 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const phy_procedures_emos_eNB_RX(subframe,eNB); #endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+(subframe&1), 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+offset, 0 ); stop_meas(&eNB->phy_proc_rx); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index d55c2d0586..3d6bb61c0e 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -159,14 +159,14 @@ static struct { void exit_fun(const char* s); -void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *); +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *,int); void stop_eNB(int nb_inst); -inline void thread_top_init(char *thread_name, - uint64_t runtime, - uint64_t deadline, - uint64_t period) { +static inline void thread_top_init(char *thread_name, + uint64_t runtime, + uint64_t deadline, + uint64_t period) { MSC_START_USE(); @@ -261,7 +261,7 @@ inline void thread_top_init(char *thread_name, } -inline void wait_sync(char *thread_name) { +static inline void wait_sync(char *thread_name) { printf( "waiting for sync (%s)\n",thread_name); pthread_mutex_lock( &sync_mutex ); @@ -275,7 +275,7 @@ inline void wait_sync(char *thread_name) { } -inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { +static inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { struct timespec wait; @@ -302,7 +302,7 @@ inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *in return(0); } -inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) { +static inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) { if (pthread_mutex_lock(mutex) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); @@ -461,6 +461,11 @@ void proc_tx_high0(PHY_VARS_eNB *eNB, relaying_type_t r_type, PHY_VARS_RN *rn) { + int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_rx ); + phy_procedures_eNB_TX(eNB,proc,r_type,rn); /* we're done, let the next one proceed */ @@ -483,6 +488,7 @@ void proc_tx_high(PHY_VARS_eNB *eNB, relaying_type_t r_type, PHY_VARS_RN *rn) { + // do PHY high proc_tx_high0(eNB,proc,r_type,rn); @@ -517,6 +523,11 @@ void proc_tx_rru_if4p5(PHY_VARS_eNB *eNB, uint32_t symbol_mask, symbol_mask_full; uint16_t packet_type; + int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_rx ); + /// **** recv_IF4 of txdataF from RCC **** /// symbol_number = 0; symbol_mask = 0; @@ -532,6 +543,10 @@ void proc_tx_rru_if4p5(PHY_VARS_eNB *eNB, } void proc_tx_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { + int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_rx ); /// **** recv_IF5 of txdata from BBU **** /// recv_IF5(eNB, &proc->timestamp_tx, proc->subframe_tx, IF5_RRH_GW_DL); } @@ -563,6 +578,34 @@ int wait_CCs(eNB_rxtx_proc_t *proc) { return(0); } +static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_name) { + + start_meas(&softmodem_stats_rxtx_sf); + // **************************************** + // Common RX procedures subframe n + phy_procedures_eNB_common_RX(eNB); + + // UE-specific RX processing for subframe n + if (eNB->proc_uespec_rx) eNB->proc_uespec_rx(eNB, proc, no_relay ); + + // ***************************************** + // TX processing for subframe n+4 + // run PHY TX procedures the one after the other for all CCs to avoid race conditions + // (may be relaxed in the future for performance reasons) + // ***************************************** + if (wait_CCs(proc)<0) return(-1); + + if (oai_exit) return(-1); + + if (eNB->proc_tx) eNB->proc_tx(eNB, proc, no_relay, NULL ); + + if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) return(-1); + + stop_meas( &softmodem_stats_rxtx_sf ); + + return(0); +} + /*! * \brief The RX UE-specific and TX thread of eNB. * \param param is a \ref eNB_proc_t structure which contains the info what to process. @@ -574,7 +617,6 @@ static void* eNB_thread_rxtx( void* param ) { eNB_rxtx_proc_t *proc = (eNB_rxtx_proc_t*)param; PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; - LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; char thread_name[100]; @@ -592,41 +634,12 @@ static void* eNB_thread_rxtx( void* param ) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 1 ); - start_meas( &softmodem_stats_rxtx_sf ); + if (oai_exit) break; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB+(proc->subframe_rx&1), proc->frame_rx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_ENB+(proc->subframe_rx&1), proc->subframe_rx ); + if (rxtx(eNB,proc,thread_name) < 0) break; - // Common procedures - phy_procedures_eNB_common_RX(eNB); - // Do UE-specific RX processing for subframe n if any - if (eNB->proc_uespec_rx) eNB->proc_uespec_rx(eNB, proc, no_relay ); - - // TX processing for subframe n+4 - if (((fp->frame_type == TDD) && - ((subframe_select(fp,proc->subframe_tx) == SF_DL) || - (subframe_select(fp,proc->subframe_tx) == SF_S))) || - (fp->frame_type == FDD)) { - /* run PHY TX procedures the one after the other for all CCs to avoid race conditions - * (may be relaxed in the future for performance reasons) - */ - - if (wait_CCs(proc)<0) break; - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+(proc->subframe_tx&1), proc->frame_tx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+(proc->subframe_tx&1), proc->subframe_tx ); - - if (oai_exit) break; - - if (eNB->proc_tx) eNB->proc_tx(eNB, proc, no_relay, NULL ); - - } - - if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break; - - stop_meas( &softmodem_stats_rxtx_sf ); } // while !oai_exit VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); @@ -1239,6 +1252,84 @@ static void* eNB_thread_prach( void* param ) { return &eNB_thread_prach_status; } +static void* eNB_thread_single( void* param ) { + + static int eNB_thread_single_status; + + eNB_proc_t *proc = (eNB_proc_t*)param; + eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[0]; + PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; + + int subframe=0, frame=0; + + // set default return value + eNB_thread_single_status = 0; + + thread_top_init("eNB_thread_single",870000,1000000,1000000); + + wait_sync("eNB_thread_single"); + +#if defined(ENABLE_ITTI) + if (eNB->node_function < NGFI_RRU_IF5) + wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); +#endif + + // Start IF device if any + if (eNB->start_if) + if (eNB->start_if(eNB) != 0) + LOG_E(HW,"Could not start the IF device\n"); + + // Start RF device if any + if (eNB->start_rf) + if (eNB->start_rf(eNB) != 0) + LOG_E(HW,"Could not start the RF device\n"); + + // wakeup asnych_rxtx thread because the devices are ready at this point + pthread_mutex_lock(&proc->mutex_asynch_rxtx); + proc->instance_cnt_asynch_rxtx=0; + pthread_mutex_unlock(&proc->mutex_asynch_rxtx); + pthread_cond_signal(&proc->cond_asynch_rxtx); + + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices + while (!oai_exit) { + + // these are local subframe/frame counters to check that we are in synch with the fronthaul timing. + // They are set on the first rx/tx in the underly FH routines. + if (subframe==9) { + subframe=0; + frame++; + frame&=1023; + } else { + subframe++; + } + + + // synchronization on FH interface, acquire signals/data and block + if (eNB->rx_fh) eNB->rx_fh(eNB,&frame,&subframe); + else AssertFatal(1==0, "No fronthaul interface : eNB->node_function %d",eNB->node_function); + + T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); + + // At this point, all information for subframe has been received on FH interface + // If this proc is to provide synchronization, do so + wakeup_slaves(proc); + + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10; + proc_rxtx->frame_tx = (proc->frame_rx < 6) ? proc->frame_rx : (proc->frame_rx+1); + + if (rxtx(eNB,proc_rxtx,"eNB_thread_single") < 0) break; + } + + + printf( "Exiting eNB_single thread \n"); + + eNB_thread_single_status = 0; + return &eNB_thread_single_status; + +} + void init_eNB_proc(int inst) { @@ -1247,40 +1338,14 @@ void init_eNB_proc(int inst) { PHY_VARS_eNB *eNB; eNB_proc_t *proc; eNB_rxtx_proc_t *proc_rxtx; - + pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL; + for (CC_id=0; CC_idnode_function],eNB_timing[eNB->node_timing]); proc = &eNB->proc; + proc_rxtx = proc->proc_rxtx; -#ifndef DEADLINE_SCHEDULER - /* - pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] ); - if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0) - perror("[ENB_PROC_TX] setting thread stack size failed\n"); - - pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] ); - if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0) - perror("[ENB_PROC_RX] setting thread stack size failed\n"); - */ - // set the kernel scheduling policy and priority - proc_rxtx[0].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc_rxtx[0].attr_rxtx, &proc_rxtx[0].sched_param_rxtx); - pthread_attr_setschedpolicy (&proc_rxtx[0].attr_rxtx, SCHED_FIFO); - proc_rxtx[1].sched_param_rxtx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc_rxtx[1].attr_rxtx, &proc_rxtx[1].sched_param_rxtx); - pthread_attr_setschedpolicy (&proc_rxtx[1].attr_rxtx, SCHED_FIFO); - - proc->sched_param_FH.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_FH, &proc->sched_param_FH); - pthread_attr_setschedpolicy (&proc->attr_FH, SCHED_FIFO); - - proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&proc->attr_prach, &proc->sched_param_prach); - pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO); - - printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i); -#endif proc_rxtx[0].instance_cnt_rxtx = -1; proc_rxtx[1].instance_cnt_rxtx = -1; proc->instance_cnt_prach = -1; @@ -1293,31 +1358,38 @@ void init_eNB_proc(int inst) { pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); - pthread_mutex_init( &proc->mutex_prach, NULL); - pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL); pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); + + pthread_mutex_init( &proc->mutex_prach, NULL); + pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL); + pthread_cond_init( &proc->cond_prach, NULL); pthread_cond_init( &proc->cond_FH, NULL); pthread_cond_init( &proc->cond_asynch_rxtx, NULL); #ifndef DEADLINE_SCHEDULER - pthread_create( &proc_rxtx[0].pthread_rxtx, &proc_rxtx[0].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[0] ); - pthread_create( &proc_rxtx[1].pthread_rxtx, &proc_rxtx[1].attr_rxtx, eNB_thread_rxtx, &proc_rxtx[1] ); - pthread_create( &proc->pthread_FH, &proc->attr_FH, eNB_thread_FH, &eNB->proc ); - pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc ); + attr0 = &proc_rxtx[0].attr_rxtx; + attr1 = &proc_rxtx[1].attr_rxtx; + attr_FH = &proc->attr_FH; + attr_prach = &proc->attr_prach; + attr_asynch = &proc->attr_asynch_rxtx; + attr_single = &proc->attr_single; +#endif + + if (eNB->single_thread_flag==0) { + pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, &proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] ); + pthread_create( &proc->pthread_FH, attr_FH, eNB_thread_FH, &eNB->proc ); + } + else + pthread_create(&proc->pthread_single, attr_single, eNB_thread_single, &eNB->proc); + + pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, &eNB->proc ); if ((eNB->node_timing == synch_to_other) || (eNB->node_function == NGFI_RRU_IF5) || (eNB->node_function == NGFI_RRU_IF4p5)) - pthread_create( &proc->pthread_asynch_rxtx, &proc->attr_asynch_rxtx, eNB_thread_asynch_rxtx, &eNB->proc ); -#else - pthread_create( &proc_rxtx[0].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[0] ); - pthread_create( &proc_rxtx[1].pthread_rxtx, NULL, eNB_thread_rxtx, &eNB->proc_rxtx[1] ); - pthread_create( &proc->pthread_FH, NULL, eNB_thread_FH, &eNB->proc ); - pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc ); - if (eNB->node_timing == synch_to_other) - pthread_create( &proc->pthread_asynch_rxtx, NULL, eNB_thread_asynch_rxtx, &eNB->proc ); - -#endif + pthread_create( &proc->pthread_asynch_rxtx, attr_asynch, eNB_thread_asynch_rxtx, &eNB->proc ); + char name[16]; snprintf( name, sizeof(name), "RXTX0 %d", i ); pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); @@ -1511,7 +1583,7 @@ extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB); extern void eNB_fep_full(PHY_VARS_eNB *eNB); extern void do_prach(PHY_VARS_eNB *eNB); -void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *eth_params) { +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *eth_params,int single_thread_flag) { int CC_id; int inst; @@ -1524,6 +1596,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->node_function = node_function[CC_id]; eNB->node_timing = node_timing[CC_id]; eNB->abstraction_flag = 0; + eNB->single_thread_flag = single_thread_flag; LOG_I(PHY,"Initializing eNB %d CC_id %d : (%s,%s)\n",inst,CC_id,eNB_functions[node_function[CC_id]],eNB_timing[node_timing[CC_id]]); switch (node_function[CC_id]) { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 4849e63807..852147f462 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -119,7 +119,7 @@ unsigned short config_frames[4] = {2,9,11,13}; // In lte-enb.c extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg); -extern void init_eNB(eNB_func_t *, eNB_timing_t *,int,eth_params_t *); +extern void init_eNB(eNB_func_t *, eNB_timing_t *,int,eth_params_t *,int); extern void stop_eNB(int); extern void kill_eNB_proc(void); @@ -163,14 +163,14 @@ uint16_t runtime_phy_tx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, volatile int start_eNB = 0; volatile int start_UE = 0; #endif -volatile int oai_exit = 0; +volatile int oai_exit = 0; -static char UE_flag=0; +static char UE_flag=0; unsigned int mmapped_dma=0; -//static uint8_t eNB_id=0,UE_id=0; +int single_thread_flag=0; static char threequarter_fs=0; @@ -682,6 +682,7 @@ static void get_options (int argc, char **argv) LONG_OPTION_LOOPMEMORY, LONG_OPTION_PHYTEST, LONG_OPTION_MMAPPED_DMA, + LONG_OPTION_SINGLE_THREAD, #if T_TRACER LONG_OPTION_T_PORT, LONG_OPTION_T_NOWAIT, @@ -706,6 +707,7 @@ static void get_options (int argc, char **argv) {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY}, {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST}, {"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA}, + {"single-thread", no_argument, NULL, LONG_OPTION_SINGLE_THREAD}, #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, @@ -802,6 +804,10 @@ static void get_options (int argc, char **argv) case LONG_OPTION_MMAPPED_DMA: mmapped_dma = 1; break; + + case LONG_OPTION_SINGLE_THREAD: + single_thread_flag = 1; + break; #if T_TRACER case LONG_OPTION_T_PORT: { @@ -1773,7 +1779,7 @@ int main( int argc, char **argv ) // start the main thread if (UE_flag == 1) init_UE(1); - else init_eNB(node_function,node_timing,1,eth_params); + else init_eNB(node_function,node_timing,1,eth_params,single_thread_flag); // Sleep to allow all threads to setup number_of_cards = 1; From 5055e3e6882217935919c5be0d3355b7f0ca8930 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 6 Aug 2016 01:50:08 +0200 Subject: [PATCH 169/340] bugfixing for single-thread and cleanup --- openair1/SCHED/phy_procedures_lte_eNb.c | 5 +++-- targets/RT/USER/lte-enb.c | 26 +++++++++++++++---------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 0623ae02d5..8d54e92834 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1104,7 +1104,8 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, #if defined(SMBV) // counts number of allocations in subframe // there is at least one allocation for PDCCH - uint8_t smbv_alloc_cnt = 1; + uint8_t smbv_alloc_cnt = 1;Exiting eNB thread RXn_TXnp4 + #endif if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_DL)) return; @@ -2587,7 +2588,7 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB){ LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - int offset = (proc == &eNB->proc.proc_rxtx[0]) ? 0 : 1; + int offset = (eNB->single_thread_flag==1) ? 0 : (subframe&1); if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 3d6bb61c0e..832e35465e 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -464,7 +464,7 @@ void proc_tx_high0(PHY_VARS_eNB *eNB, int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_tx ); phy_procedures_eNB_TX(eNB,proc,r_type,rn); @@ -526,7 +526,7 @@ void proc_tx_rru_if4p5(PHY_VARS_eNB *eNB, int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_tx ); /// **** recv_IF4 of txdataF from RCC **** /// symbol_number = 0; @@ -546,7 +546,7 @@ void proc_tx_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_tx ); /// **** recv_IF5 of txdata from BBU **** /// recv_IF5(eNB, &proc->timestamp_tx, proc->subframe_tx, IF5_RRH_GW_DL); } @@ -1317,7 +1317,7 @@ static void* eNB_thread_single( void* param ) { proc_rxtx->subframe_rx = proc->subframe_rx; proc_rxtx->frame_rx = proc->frame_rx; proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10; - proc_rxtx->frame_tx = (proc->frame_rx < 6) ? proc->frame_rx : (proc->frame_rx+1); + proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1); if (rxtx(eNB,proc_rxtx,"eNB_thread_single") < 0) break; } @@ -1391,12 +1391,18 @@ void init_eNB_proc(int inst) { pthread_create( &proc->pthread_asynch_rxtx, attr_asynch, eNB_thread_asynch_rxtx, &eNB->proc ); char name[16]; - snprintf( name, sizeof(name), "RXTX0 %d", i ); - pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); - snprintf( name, sizeof(name), "RXTX1 %d", i ); - pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); - snprintf( name, sizeof(name), "FH %d", i ); - pthread_setname_np( proc->pthread_FH, name ); + if (eNB->single_thread_flag == 0) { + snprintf( name, sizeof(name), "RXTX0 %d", i ); + pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); + snprintf( name, sizeof(name), "RXTX1 %d", i ); + pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); + snprintf( name, sizeof(name), "FH %d", i ); + pthread_setname_np( proc->pthread_FH, name ); + } + else { + snprintf( name, sizeof(name), " %d", i ); + pthread_setname_np( proc->pthread_single, name ); + } } /* setup PHY proc TX sync mechanism */ From b9e550812a1dcd61d22299640e252d4318306c77 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 6 Aug 2016 19:28:45 +0200 Subject: [PATCH 170/340] addition of handling of UE list MAC when RRC cannot add a UE context. --- openair1/PHY/INIT/lte_init.c | 22 +++++++++---------- .../LAYER2/MAC/eNB_scheduler_primitives.c | 16 ++++++++++++++ openair2/RRC/LITE/rrc_eNB.c | 3 ++- .../CONF/enb.band7.tm1.100PRB.usrpb210.conf | 2 +- .../CONF/enb.band7.tm1.50PRB.usrpb210.conf | 2 +- targets/RT/USER/lte-enb.c | 10 ++++----- 6 files changed, 36 insertions(+), 19 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 2fa9c36d69..4386ca5d47 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -965,7 +965,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, int i,j,k; int eNB_id; - msg("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx); + printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx); LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST); // many memory allocation sizes are hard coded @@ -1199,8 +1199,8 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]); - msg("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%d bytes)\n", + printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]); + printf("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%d bytes)\n", eNB_id,i,common_vars->txdataF[eNB_id][i], FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); #endif @@ -1221,8 +1221,8 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti) ); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata[eNB_id][i]); - msg("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i]); + printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata[eNB_id][i]); + printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i]); #endif } @@ -1272,7 +1272,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, for (i=0; inb_antennas_rx; i++) { prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( frame_parms->ofdm_symbol_size*12*2*sizeof(int16_t) ); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]); + printf("[openair][LTE_PHY][INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]); #endif } @@ -1282,7 +1282,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, for (i=0; inb_antennas_rx; i++) { prach_vars->prach_ifft[i] = (int16_t*)malloc16_clear(1024*2*sizeof(int16_t)); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] prach_vars->prach_ifft[%d] = %p\n",i,prach_vars->prach_ifft[i]); + printf("[openair][LTE_PHY][INIT] prach_vars->prach_ifft[%d] = %p\n",i,prach_vars->prach_ifft[i]); #endif } @@ -1365,11 +1365,11 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, if (eNB->dl_precoder_SeNB[eNB_id]) { #ifdef DEBUG_PHY - msg("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id, + printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id, eNB->dl_precoder_SeNB[eNB_id]); #endif } else { - msg("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id); + printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id); return(-1); } @@ -1378,12 +1378,12 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, if (eNB->dl_precoder_SeNB[eNB_id][j]) { #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j, + printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j, eNB->dl_precoder_SeNB[eNB_id][j]); #endif memset(eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(eNB->frame_parms.ofdm_symbol_size)); } else { - msg("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j); + printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j); return(-1); } } //for(j=...nb_antennas_tx diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index b78856b15c..41f8d35327 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -367,6 +367,22 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) mac_phy_remove_ue(mod_idP,rntiP); + // check if this has an RA process active + RA_TEMPLATE *RA_template; + for (i=0;iRA_active == TRUE) && + (RA_template->rnti == rntiP)){ + RA_template->RA_active=FALSE; + RA_template->generate_rar=0; + RA_template->generate_Msg4=0; + RA_template->wait_ack_Msg4=0; + RA_template->timing_offset=0; + RA_template->RRC_timer=20; + RA_template->rnti = 0; + break; + } + } if (ret == 0) { return (0); } diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 59ee560b8a..ed1f18db27 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -3880,6 +3880,7 @@ rrc_eNB_decode_ccch( LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Can't create new context for UE random UE identity (0x%" PRIx64 ")\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), random_value); + rrc_mac_remove_ue(ctxt_pP->module_id,ctxt_pP->rnti); return -1; } } @@ -4220,7 +4221,7 @@ rrc_eNB_decode_dcch( #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRC Security Mode Complete\n"); - for (i = 0; i < sdu_sizeP; i++) { + for (i = 0; i < sdu_sizeP; i++) eNB->pusch_vars[UE_id]{ LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index a2187d402f..8144147ea5 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -31,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2660000000L; + downlink_frequency = 2645000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index 0a9b61546b..d2e99a3481 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -31,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2680000000L; + downlink_frequency = 2660000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 832e35465e..a3dc3179d3 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -876,20 +876,20 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; unsigned int rxs,txs; int i; - + int tx_sfoffset = (eNB->single_thread_flag == 1) ? 3 : 3; if (proc->first_rx==0) { // Transmit TX buffer based on timestamp from RX // printf("trx_write -> USRP TS %llu (sf %d)\n", (proc->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(2*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers for (i=0; inb_antennas_tx; i++) - txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+3)%10)*fp->samples_per_tti]; + txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+tx_sfoffset)%10)*fp->samples_per_tti]; txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice, - proc->timestamp_rx+(3*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, + proc->timestamp_rx+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, txp, fp->samples_per_tti, fp->nb_antennas_tx, @@ -1317,7 +1317,7 @@ static void* eNB_thread_single( void* param ) { proc_rxtx->subframe_rx = proc->subframe_rx; proc_rxtx->frame_rx = proc->frame_rx; proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10; - proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1); + proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1)&1023; if (rxtx(eNB,proc_rxtx,"eNB_thread_single") < 0) break; } From a483534f9ab32ce03a46efa24890f759c9fd96c6 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 6 Aug 2016 20:01:29 +0200 Subject: [PATCH 171/340] rru configuration files for if4p5 (50/100 PRBs). rru gtkwave configuration files. --- .../rru.band7.tm1.if4p5.100PRB.usrpb210.conf | 190 ++++++++++++++++++ .../rru.band7.tm1.if4p5.50PRB.usrpb210.conf | 190 ++++++++++++++++++ targets/RT/USER/rru_if4p5_usrp.gtkw | 160 +++++++++++++++ targets/RT/USER/rru_if5_usrp.gtkw | 161 +++++++++++++++ 4 files changed, 701 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.100PRB.usrpb210.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf create mode 100644 targets/RT/USER/rru_if4p5_usrp.gtkw create mode 100644 targets/RT/USER/rru_if5_usrp.gtkw diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.100PRB.usrpb210.conf new file mode 100644 index 0000000000..b1c4298104 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.100PRB.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "34:e6:d7:3c:ae:fc"; + local_address = "74:d4:35:cc:8d:15"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf new file mode 100644 index 0000000000..831010a89a --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf @@ -0,0 +1,190 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "34:e6:d7:3c:ae:fc"; + local_address = "74:d4:35:cc:8d:15"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/RT/USER/rru_if4p5_usrp.gtkw b/targets/RT/USER/rru_if4p5_usrp.gtkw new file mode 100644 index 0000000000..df8de754db --- /dev/null +++ b/targets/RT/USER/rru_if4p5_usrp.gtkw @@ -0,0 +1,160 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Mon Aug 1 18:43:22 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Mon Aug 1 18:41:49 2016" +[dumpfile_size] 22622 +[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/rru_if4p5_usrp.gtkw" +[timestart] 0 +[size] 1301 716 +[pos] 309 0 +*-19.793451 29983948856 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@28 +functions.trx_read +functions.trx_write +functions.trx_write_if +functions.send_if4 +functions.trx_read_if +@29 +functions.recv_if4 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@28 +functions.phy_enb_sfgen +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +@24 +variables.dci_info[63:0] +variables.ue0_BO[63:0] +@420 +variables.ue0_BSR[63:0] +variables.ue0_timing_advance[63:0] +@28 +functions.macxface_initiate_ra_proc +functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 +functions.macxface_SR_indication +@420 +variables.ue0_SR_ENERGY[63:0] +variables.ue0_SR_THRES[63:0] +@28 +functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] +@420 +variables.ue0_rssi0[63:0] +variables.ue0_MCS0[63:0] +variables.ue0_RB0[63:0] +@24 +variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] +@28 +functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] +@420 +variables.ue0_rssi1[63:0] +variables.ue0_MCS1[63:0] +variables.ue0_RB1[63:0] +@24 +variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] +@28 +functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] +@420 +variables.ue0_rssi2[63:0] +variables.ue0_MCS2[63:0] +variables.ue0_RB2[63:0] +@24 +variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] +@28 +functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] +@420 +variables.ue0_rssi3[63:0] +variables.ue0_MCS3[63:0] +variables.ue0_RB3[63:0] +@24 +variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] +@28 +functions.phy_enb_ulsch_decoding4 +@420 +variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 +variables.ue0_MCS4[63:0] +variables.ue0_RB4[63:0] +@24 +variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] +@28 +functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] +@420 +variables.ue0_rssi5[63:0] +variables.ue0_MCS5[63:0] +variables.ue0_RB5[63:0] +@24 +variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] +@28 +functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] +@420 +variables.ue0_rssi6[63:0] +variables.ue0_MCS6[63:0] +variables.ue0_RB6[63:0] +@24 +variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] +@28 +functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] +@420 +variables.ue0_rssi7[63:0] +variables.ue0_MCS7[63:0] +variables.ue0_RB7[63:0] +@24 +variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] +@28 +functions.phy_enb_prach_rx +functions.phy_eNB_dlsch_encoding +functions.phy_eNB_dlsch_modulation +functions.phy_eNB_dlsch_scrambling +functions.phy_enb_pdcch_tx +functions.phy_enb_rs_tx +functions.rrc_mac_config_req +functions.rlc_data_req +functions.udp_enb_task +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rru_if5_usrp.gtkw b/targets/RT/USER/rru_if5_usrp.gtkw new file mode 100644 index 0000000000..ff0c116434 --- /dev/null +++ b/targets/RT/USER/rru_if5_usrp.gtkw @@ -0,0 +1,161 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sun Jul 31 17:45:23 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sun Jul 31 17:44:51 2016" +[dumpfile_size] 26766405 +[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/rru_if5_usrp.gtkw" +[timestart] 0 +[size] 1301 716 +[pos] 309 0 +*-19.793451 29983948856 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@28 +functions.trx_read +functions.trx_write +functions.send_if5 +@29 +functions.trx_write_if +@28 +functions.recv_if5 +functions.trx_read_if +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@28 +functions.phy_enb_sfgen +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +@24 +variables.dci_info[63:0] +variables.ue0_BO[63:0] +@420 +variables.ue0_BSR[63:0] +variables.ue0_timing_advance[63:0] +@28 +functions.macxface_initiate_ra_proc +functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 +functions.macxface_SR_indication +@420 +variables.ue0_SR_ENERGY[63:0] +variables.ue0_SR_THRES[63:0] +@28 +functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] +@420 +variables.ue0_rssi0[63:0] +variables.ue0_MCS0[63:0] +variables.ue0_RB0[63:0] +@24 +variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] +@28 +functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] +@420 +variables.ue0_rssi1[63:0] +variables.ue0_MCS1[63:0] +variables.ue0_RB1[63:0] +@24 +variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] +@28 +functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] +@420 +variables.ue0_rssi2[63:0] +variables.ue0_MCS2[63:0] +variables.ue0_RB2[63:0] +@24 +variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] +@28 +functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] +@420 +variables.ue0_rssi3[63:0] +variables.ue0_MCS3[63:0] +variables.ue0_RB3[63:0] +@24 +variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] +@28 +functions.phy_enb_ulsch_decoding4 +@420 +variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 +variables.ue0_MCS4[63:0] +variables.ue0_RB4[63:0] +@24 +variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] +@28 +functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] +@420 +variables.ue0_rssi5[63:0] +variables.ue0_MCS5[63:0] +variables.ue0_RB5[63:0] +@24 +variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] +@28 +functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] +@420 +variables.ue0_rssi6[63:0] +variables.ue0_MCS6[63:0] +variables.ue0_RB6[63:0] +@24 +variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] +@28 +functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] +@420 +variables.ue0_rssi7[63:0] +variables.ue0_MCS7[63:0] +variables.ue0_RB7[63:0] +@24 +variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] +@28 +functions.phy_enb_prach_rx +functions.phy_eNB_dlsch_encoding +functions.phy_eNB_dlsch_modulation +functions.phy_eNB_dlsch_scrambling +functions.phy_enb_pdcch_tx +functions.phy_enb_rs_tx +functions.rrc_mac_config_req +functions.rlc_data_req +functions.udp_enb_task +[pattern_trace] 1 +[pattern_trace] 0 From f000cec33f958a16b4fc6074e7251d0dc5a2a2c9 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 6 Aug 2016 20:47:50 +0200 Subject: [PATCH 172/340] configuration file changes. --- openair1/SCHED/phy_procedures_lte_eNb.c | 6 ++++-- .../GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf | 2 +- ...1.if4p5.usrpb210.conf => rcc.band7.tm1.if4p5.25PRB.conf} | 0 targets/RT/USER/lte-enb.c | 3 +-- 4 files changed, 6 insertions(+), 5 deletions(-) rename targets/PROJECTS/GENERIC-LTE-EPC/CONF/{rcc.band7.tm1.if4p5.usrpb210.conf => rcc.band7.tm1.if4p5.25PRB.conf} (100%) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 8d54e92834..52820350f4 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1101,6 +1101,8 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; DCI_ALLOC_t *dci_alloc=(DCI_ALLOC_t *)NULL; + int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + #if defined(SMBV) // counts number of allocations in subframe // there is at least one allocation for PDCCH @@ -1110,7 +1112,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_DL)) return; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+(subframe&1),1); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1); start_meas(&eNB->phy_proc_tx); T(T_ENB_PHY_DL_TICK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe)); @@ -1396,7 +1398,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, phy_procedures_emos_eNB_TX(subframe, eNB); #endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+(subframe&1),0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0); stop_meas(&eNB->phy_proc_tx); } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index 0a9b61546b..d2e99a3481 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -31,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2680000000L; + downlink_frequency = 2660000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf similarity index 100% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.usrpb210.conf rename to targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.25PRB.conf diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 832e35465e..e5b7e25623 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1317,8 +1317,7 @@ static void* eNB_thread_single( void* param ) { proc_rxtx->subframe_rx = proc->subframe_rx; proc_rxtx->frame_rx = proc->frame_rx; proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10; - proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1); - + proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1)&1023; if (rxtx(eNB,proc_rxtx,"eNB_thread_single") < 0) break; } From f52cbeeb9597312e4ca1afc37290225ca6656e8f Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 7 Aug 2016 06:00:54 -0700 Subject: [PATCH 173/340] update of ulsim to use phy_procedures --- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 88 ++-- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 50 +- openair1/SCHED/phy_procedures_lte_ue.c | 2 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 448 +++++++----------- 5 files changed, 253 insertions(+), 337 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index d673e12d38..dbe06ea6ba 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -44,7 +44,7 @@ #include "PHY/vars.h" #endif #include "assertions.h" - + //#define DEBUG_DCI uint32_t localRIV2alloc_LUT6[32]; @@ -1216,7 +1216,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - // msg("DCI: Setting subframe_tx for subframe %d\n",subframe); + // printf("DCI: Setting subframe_tx for subframe %d\n",subframe); dlsch[0]->subframe_tx[subframe] = 1; conv_rballoc(rah, @@ -4467,7 +4467,7 @@ int generate_ue_dlsch_params_from_dci(int frame, dlsch0_harq->Qm = (mcs-28)<<1; else LOG_E(PHY,"invalid mcs %d\n",mcs); - // msg("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS); + // printf("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS); dlsch[0]->current_harq_pid = harq_pid; dlsch[0]->active = 1; @@ -4735,7 +4735,7 @@ int generate_ue_dlsch_params_from_dci(int frame, dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; /* if (dlsch0_harq->mcs>20) { - msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); + printf("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); return(-1); } */ @@ -5411,7 +5411,7 @@ int generate_ue_dlsch_params_from_dci(int frame, /* if (dlsch0_harq->mcs>20) { - msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); + printf("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); return(-1); } */ @@ -5437,7 +5437,7 @@ int generate_ue_dlsch_params_from_dci(int frame, // Fix this tpmi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tpmi; - // msg("ue: tpmi %d\n",tpmi); + // printf("ue: tpmi %d\n",tpmi); switch (tpmi) { case 0 : @@ -5556,9 +5556,9 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t /* #ifdef DEBUG_DCI if (frame_parms->frame_type == TDD) - msg("dci_tools.c: subframe2_harq_pid, subframe %d for TDD configuration %d\n",subframe,frame_parms->tdd_config); + printf("dci_tools.c: subframe2_harq_pid, subframe %d for TDD configuration %d\n",subframe,frame_parms->tdd_config); else - msg("dci_tools.c: subframe2_harq_pid, subframe %d for FDD \n",subframe); + printf("dci_tools.c: subframe2_harq_pid, subframe %d for FDD \n",subframe); #endif */ if (frame_parms->frame_type == FDD) { @@ -5734,7 +5734,7 @@ uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_subba pmivect |= (pmiq<<(2*i)); } else { // This needs to be done properly!!! - msg("PMI feedback for rank>1 not supported!\n"); + printf("PMI feedback for rank>1 not supported!\n"); pmivect = 0; } } @@ -5928,7 +5928,7 @@ uint32_t fill_subband_cqi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t trans_mo void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t harq_pid,int N_RB_DL,uint16_t rnti, uint8_t trans_mode, double sinr_eff) { - // msg("[PHY][UE] Filling CQI for eNB %d, meas->wideband_cqi_tot[%d] %d\n", + // printf("[PHY][UE] Filling CQI for eNB %d, meas->wideband_cqi_tot[%d] %d\n", // eNB_id,eNB_id,meas->wideband_cqi_tot[eNB_id]); double sinr_tmp; uint8_t *o = ulsch->o; @@ -6288,7 +6288,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, RIV_max = RIV_max25; ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT25[rballoc]; ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT25[rballoc]; - // printf("***********rballoc %d, first_rb %d, nb_rb %d\n",rballoc,ulsch->harq_processes[harq_pid]->first_rb,ulsch->harq_processes[harq_pid]->nb_rb); + // printf("***********rballoc %d, first_rb %d, nb_rb %d (dci %p)\n",rballoc,ulsch->harq_processes[harq_pid]->first_rb,ulsch->harq_processes[harq_pid]->nb_rb,dci_pdu); break; case 50: @@ -6409,7 +6409,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->rnti = rnti; } - // msg("[PHY][UE] DCI format 0: harq_pid %d nb_rb %d, rballoc %d\n",harq_pid,ulsch->harq_processes[harq_pid]->nb_rb, + // printf("[PHY][UE] DCI format 0: harq_pid %d nb_rb %d, rballoc %d\n",harq_pid,ulsch->harq_processes[harq_pid]->nb_rb, // ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc); //Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1) if(cshift == 0) @@ -7007,21 +7007,21 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, // ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift; #ifdef DEBUG_DCI - msg("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); - msg("Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid); - msg("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round); - msg("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); - msg("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); - msg("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O); + printf("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); + printf("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); + printf("Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid); + printf("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round); + printf("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); + printf("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); + printf("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O); if (frame_parms->frame_type == TDD) - msg("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai); + printf("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai); else - msg("Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK); + printf("Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK); - msg("Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch); - msg("Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); + printf("Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch); + printf("Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); #else UNUSED_VARIABLE(dai); #endif @@ -7066,7 +7066,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, // uint32_t type; #ifdef DEBUG_DCI - LOG_D(PHY,"filling eNB ulsch params for rnti %x, dci format %d, dci %x, subframe %d\n", + printf("filling eNB ulsch params for rnti %x, dci format %d, dci %x, subframe %d\n", rnti,dci_format,*(uint32_t*)dci_pdu,subframe); #endif @@ -7200,7 +7200,7 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, } #ifdef DEBUG_DCI - LOG_D(PHY,"generate_eNB_ulsch_params_from_dci: subframe %d, rnti %x,harq_pid %d,cqi_req %d\n",subframe,rnti,harq_pid,cqi_req); + printf("generate_eNB_ulsch_params_from_dci: subframe %d, rnti %x,harq_pid %d,cqi_req %d\n",subframe,rnti,harq_pid,cqi_req); #endif ulsch->harq_processes[harq_pid]->dci_alloc = 1; @@ -7641,15 +7641,15 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, //ulsch->n_DMRS2 = cshift; #ifdef DEBUG_DCI - msg("ulsch (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("ulsch (eNB): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); - msg("ulsch (eNB): harq_pid %d\n",harq_pid); - msg("ulsch (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round); - msg("ulsch (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); - msg("ulsch (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); - msg("ulsch (eNB): Or1 %d\n",ulsch->harq_processes[harq_pid]->Or1); - msg("ulsch (eNB): Nsymb_pusch %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch); - msg("ulsch (eNB): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); + printf("ulsch (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); + printf("ulsch (eNB): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); + printf("ulsch (eNB): harq_pid %d\n",harq_pid); + printf("ulsch (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round); + printf("ulsch (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); + printf("ulsch (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); + printf("ulsch (eNB): Or1 %d\n",ulsch->harq_processes[harq_pid]->Or1); + printf("ulsch (eNB): Nsymb_pusch %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch); + printf("ulsch (eNB): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); #else UNUSED_VARIABLE(dai); #endif @@ -7782,7 +7782,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id) break; default: - msg("Problem in SINR Calculation for TM5 \n"); + printf("Problem in SINR Calculation for TM5 \n"); break; }//switch(qq) }//a_rx @@ -7848,7 +7848,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id) break; default: - msg("Problem in SINR Calculation for TM6 \n"); + printf("Problem in SINR Calculation for TM6 \n"); break; }//switch(qq) }//a_rx @@ -7860,7 +7860,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id) break; default: - msg("Problem in SINR Calculation for CQI \n"); + printf("Problem in SINR Calculation for CQI \n"); break; } @@ -7929,7 +7929,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id) 3) + p_qam64[5]*pow(I_qam64_avg,2) + p_qam64[6]*I_qam64_avg + p_qam64[7]); sinr_eff = cmax3(sinr_eff_qpsk,sinr_eff_qam16,sinr_eff_qam64); - //msg("SINR_Eff = %e\n",sinr_eff); + //printf("SINR_Eff = %e\n",sinr_eff); return(sinr_eff); } @@ -7948,20 +7948,20 @@ main() rah = 0; rballoc = 0x1fff; - msg("rballoc 0 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 0 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rah = 1; rballoc = 0x1678; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rballoc = 0xfffc; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rballoc = 0xfffd; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rballoc = 0xffff; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rballoc = 0xfffe; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); } #endif diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 16cd847016..e673513f49 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -739,7 +739,7 @@ void ulsch_extract_rbs_single(int32_t **rxdataF, nb_rb1 = cmin(cmax((int)(frame_parms->N_RB_UL) - (int)(2*first_rb),(int)0),(int)(2*nb_rb)); // 2 times no. RBs before the DC nb_rb2 = 2*nb_rb - nb_rb1; // 2 times no. RBs after the DC - + #ifdef DEBUG_ULSCH printf("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2); #endif diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 52820350f4..6053a151a4 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2346,10 +2346,11 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p int ret=0; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + if (eNB->ulsch[UE_id]==NULL) return; + num_active_cba_groups = eNB->ulsch[UE_id]->num_active_cba_groups; - - if ((eNB->ulsch[UE_id]) && - (num_active_cba_groups > 0) && + + if ((num_active_cba_groups > 0) && (eNB->ulsch[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && (eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { rnti=0; @@ -2462,7 +2463,8 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p UE_id % eNB->ulsch[UE_id]->num_active_cba_groups, eNB->ulsch[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); // detect if there is a CBA collision - if (eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) { + if ((eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) && + (eNB->mac_enabled==1)) { mac_xface->rx_sdu(eNB->Mod_id, eNB->CC_id, frame,subframe, @@ -2502,6 +2504,7 @@ void eNB_fep_full(PHY_VARS_eNB *eNB) { LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); + start_meas(&eNB->ofdm_demod_stats); remove_7_5_kHz(eNB,proc->subframe_rx<<1); remove_7_5_kHz(eNB,1+(proc->subframe_rx<<1)); for (l=0; lsymbols_per_tti/2; l++) { @@ -2520,6 +2523,7 @@ void eNB_fep_full(PHY_VARS_eNB *eNB) { 0 ); } + stop_meas(&eNB->ofdm_demod_stats); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); @@ -2626,10 +2630,11 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const const int frame = proc->frame_rx; int offset = (proc == &eNB->proc.proc_rxtx[0]) ? 0 : 1; + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC+offset, 1 ); - start_meas(&eNB->phy_proc_rx); + #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_uespec_RX(%d)\n",eNB->Mod_id,frame, subframe); #endif @@ -2920,14 +2925,15 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const eNB->UE_stats[i].ulsch_consecutive_errors++; // indicate error to MAC - mac_xface->rx_sdu(eNB->Mod_id, - eNB->CC_id, - frame,subframe, - eNB->ulsch[i]->rnti, - NULL, - 0, - harq_pid, - &eNB->ulsch[i]->Msg3_flag); + if (eNB->mac_enabled == 1) + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, + frame,subframe, + eNB->ulsch[i]->rnti, + NULL, + 0, + harq_pid, + &eNB->ulsch[i]->Msg3_flag); } } } // ulsch in error @@ -2987,15 +2993,15 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", eNB->Mod_id, frame,harq_pid,i); - - mac_xface->rx_sdu(eNB->Mod_id, - eNB->CC_id, - frame,subframe, - eNB->ulsch[i]->rnti, - eNB->ulsch[i]->harq_processes[harq_pid]->b, - eNB->ulsch[i]->harq_processes[harq_pid]->TBS>>3, - harq_pid, - &eNB->ulsch[i]->Msg3_flag); + if (eNB->mac_enabled) + mac_xface->rx_sdu(eNB->Mod_id, + eNB->CC_id, + frame,subframe, + eNB->ulsch[i]->rnti, + eNB->ulsch[i]->harq_processes[harq_pid]->b, + eNB->ulsch[i]->harq_processes[harq_pid]->TBS>>3, + harq_pid, + &eNB->ulsch[i]->Msg3_flag); // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI) if (eNB->ulsch[i]->Msg3_flag == 0 ) { diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 38609c6f43..2612302d54 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -828,7 +828,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB int i; int aa; int tx_amp; - uint8_t ulsch_input_buffer[2700] __attribute__ ((aligned(16))); + uint8_t ulsch_input_buffer[5477] __attribute__ ((aligned(32))); uint8_t access_mode; // get harq_pid from subframe relationship diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 135ad59037..47565f4e0c 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -85,6 +85,93 @@ double t_rx_min = 1000000000; /*!< \brief initial min process time for tx */ int n_tx_dropped = 0; /*!< \brief initial max process time for tx */ int n_rx_dropped = 0; /*!< \brief initial max process time for rx */ + +void fill_ulsch_dci(PHY_VARS_eNB *eNB,void *UL_dci,int first_rb,int nb_rb,int mcs,int ndi,int cqi_flag) { + + switch (eNB->frame_parms.N_RB_UL) { + case 6: + break; + + case 25: + if (eNB->frame_parms.frame_type == TDD) { + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->type = 0; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + //printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci); + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->mcs = mcs; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->ndi = ndi; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->TPC = 0; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->cshift = 0; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->dai = 1; + } else { + ((DCI0_5MHz_FDD_t*)UL_dci)->type = 0; + ((DCI0_5MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + // printf("nb_rb %d/%d, rballoc %d (dci %x) (dcip %p)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci,UL_dci); + ((DCI0_5MHz_FDD_t*)UL_dci)->mcs = mcs; + ((DCI0_5MHz_FDD_t*)UL_dci)->ndi = ndi; + ((DCI0_5MHz_FDD_t*)UL_dci)->TPC = 0; + ((DCI0_5MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_5MHz_FDD_t*)UL_dci)->cshift = 0; + } + + break; + + case 50: + if (eNB->frame_parms.frame_type == TDD) { + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->type = 0; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci); + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->mcs = mcs; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->ndi = ndi; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->TPC = 0; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->cshift = 0; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->dai = 1; + } else { + ((DCI0_10MHz_FDD_t*)UL_dci)->type = 0; + ((DCI0_10MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + //printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci); + ((DCI0_10MHz_FDD_t*)UL_dci)->mcs = mcs; + ((DCI0_10MHz_FDD_t*)UL_dci)->ndi = ndi; + ((DCI0_10MHz_FDD_t*)UL_dci)->TPC = 0; + ((DCI0_10MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_10MHz_FDD_t*)UL_dci)->cshift = 0; + } + + break; + + case 100: + if (eNB->frame_parms.frame_type == TDD) { + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->type = 0; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci); + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->mcs = mcs; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->ndi = ndi; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->TPC = 0; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->cshift = 0; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->dai = 1; + } else { + ((DCI0_20MHz_FDD_t*)UL_dci)->type = 0; + ((DCI0_20MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + // printf("nb_rb %d/%d, rballoc %d (dci %x) (UL_dci %p)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci,(void*)UL_dci); + ((DCI0_20MHz_FDD_t*)UL_dci)->mcs = mcs; + ((DCI0_20MHz_FDD_t*)UL_dci)->ndi = ndi; + ((DCI0_20MHz_FDD_t*)UL_dci)->TPC = 0; + ((DCI0_20MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_20MHz_FDD_t*)UL_dci)->cshift = 0; + } + + break; + + default: + break; + } + +} + +extern void eNB_fep_full(PHY_VARS_eNB *eNB); + int main(int argc, char **argv) { @@ -190,6 +277,8 @@ int main(int argc, char **argv) int nb_rb_set = 0; int threequarter_fs=0; + int ndi; + opp_enabled=1; // to enable the time meas cpu_freq_GHz = (double)get_cpu_freq_GHz(); @@ -488,16 +577,6 @@ int main(int argc, char **argv) snr1 = snr0+snr_int; printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - /* - txdataF = (int **)malloc16(2*sizeof(int*)); - txdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - txdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - txdata = (int **)malloc16(2*sizeof(int*)); - txdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ - frame_parms = &eNB->frame_parms; txdata = UE->common_vars.txdata; @@ -539,32 +618,6 @@ int main(int argc, char **argv) } } - /* - if(abstx) { - sprintf(fperen_name,"ULchan_estims_F_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz); - fperen = fopen(fperen_name,"a+"); - fprintf(fperen,"chest_f = ["); - fclose(fperen); - - sprintf(fmageren_name,"ChanMag_F_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz); - fmageren = fopen(fmageren_name,"a+"); - fprintf(fmageren,"mag_f = ["); - fclose(fmageren); - - sprintf(flogeren_name,"Log2Max_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz); - flogeren = fopen(flogeren_name,"a+"); - fprintf(flogeren,"mag_f = ["); - fclose(flogeren); - } - */ - - /* - sprintf(ftxlev_name,"txlevel_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz); - ftxlev = fopen(ftxlev_name,"a+"); - fprintf(ftxlev,"txlev = ["); - fclose(ftexlv); - */ - if(abstx) { // CSV file sprintf(csv_fname,"EULdataout_tx%d_mcs%d_nbrb%d_chan%d_nsimus%d_eren.m",transmission_mode,mcs,nb_rb,chMod,n_frames); @@ -581,10 +634,6 @@ int main(int argc, char **argv) s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // r_re0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // bzero(r_re0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // r_im0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // bzero(r_im0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); } @@ -660,85 +709,6 @@ int main(int argc, char **argv) } - switch (eNB->frame_parms.N_RB_UL) { - case 6: - break; - - case 25: - if (eNB->frame_parms.frame_type == TDD) { - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->cshift = 0; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; - } else { - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->cshift = 0; - } - - break; - - case 50: - if (eNB->frame_parms.frame_type == TDD) { - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->cshift = 0; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; - } else { - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - //printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->cshift = 0; - } - - break; - - case 100: - if (eNB->frame_parms.frame_type == TDD) { - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->cshift = 0; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; - } else { - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->cshift = 0; - } - - break; - - default: - break; - } UE->measurements.rank[0] = 0; @@ -753,16 +723,21 @@ int main(int argc, char **argv) UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; + + UE->mac_enabled=0; - eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1]; + eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1]; + UE_rxtx_proc_t *proc_rxtx_ue = &UE->proc.proc_rxtx[subframe&1]; proc_rxtx->frame_rx=1; proc_rxtx->subframe_rx=subframe; proc_rxtx->frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe); proc_rxtx->subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe); - UE->frame_tx = proc_rxtx->frame_rx; - UE->frame_rx = proc_rxtx->frame_tx; + proc_rxtx_ue->frame_tx = proc_rxtx->frame_rx; + proc_rxtx_ue->frame_rx = proc_rxtx->frame_tx; + proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx; + proc_rxtx_ue->subframe_rx = proc_rxtx->subframe_tx; printf("Init UL hopping UE\n"); init_ul_hopping(&UE->frame_parms); @@ -774,11 +749,13 @@ int main(int argc, char **argv) UE->ulsch_Msg3_active[eNB_id] = 0; UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1; + /* generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu, 14, proc_rxtx->subframe_tx, format0, UE, + proc_rxtx_ue, SI_RNTI, 0, P_RNTI, @@ -798,6 +775,7 @@ int main(int argc, char **argv) P_RNTI, CBA_RNTI, srs_flag); + */ coded_bits_per_codeword = nb_rb * (12 * get_Qm_ul(mcs)) * nsymb; @@ -845,7 +823,7 @@ int main(int argc, char **argv) //randominit(0); - harq_pid = subframe2harq_pid(&UE->frame_parms,UE->frame_tx,subframe); + harq_pid = subframe2harq_pid(&UE->frame_parms,proc_rxtx_ue->frame_tx,subframe); input_buffer_length = UE->ulsch[0]->harq_processes[harq_pid]->TBS/8; input_buffer = (unsigned char *)memalign(32,input_buffer_length+64); // printf("UL frame %d/subframe %d, harq_pid %d\n",UE->frame,subframe,harq_pid); @@ -927,7 +905,7 @@ int main(int argc, char **argv) reset_meas(&eNB->ulsch_tc_intl1_stats); reset_meas(&eNB->ulsch_tc_intl2_stats); - // initialization + // initialization struct list time_vector_tx; initialize(&time_vector_tx); struct list time_vector_tx_ifft; @@ -946,32 +924,50 @@ int main(int argc, char **argv) struct list time_vector_rx_dec; initialize(&time_vector_rx_dec); + ndi=0; for (trials = 0; trialsframe++; // eNB->frame++; - + ndi = (1-ndi); fflush(stdout); round=0; while (round < 4) { eNB->ulsch[0]->harq_processes[harq_pid]->round=round; UE->ulsch[0]->harq_processes[harq_pid]->round=round; - // printf("Trial %d : Round %d ",trials,round); + // printf("Trial %d : Round %d (subframe %d, frame %d)\n",trials,round,proc_rxtx_ue->subframe_rx,proc_rxtx_ue->frame_rx); round_trials[round]++; - if (round == 0) { - //eNB->ulsch[0]->harq_processes[harq_pid]->Ndi = 1; - eNB->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1; - //UE->ulsch[0]->harq_processes[harq_pid]->Ndi = 1; - UE->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1; - } else { - //eNB->ulsch[0]->harq_processes[harq_pid]->Ndi = 0; - eNB->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1; - //UE->ulsch[0]->harq_processes[harq_pid]->Ndi = 0; - UE->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1; - } + fill_ulsch_dci(eNB,(void*)&UL_alloc_pdu,first_rb,nb_rb,mcs,ndi,cqi_flag); + + UE->ulsch_Msg3_active[eNB_id] = 0; + UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1; + generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu, + 14, + proc_rxtx->subframe_tx, + format0, + UE, + proc_rxtx_ue, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + 0, + srs_flag); + + generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx, + (void *)&UL_alloc_pdu, + 14, + format0, + 0, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + srs_flag); + eNB->ulsch[0]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; ///////////////////// if (abstx) { @@ -991,26 +987,24 @@ int main(int argc, char **argv) if (input_fdUL == NULL) { - start_meas(&UE->phy_proc_tx); + eNB->proc.frame_rx = 1; + eNB->proc.subframe_rx = subframe; + proc_rxtx_ue->frame_tx = proc_rxtx->frame_rx; + proc_rxtx_ue->frame_rx = proc_rxtx->frame_tx; + proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx; + proc_rxtx_ue->subframe_rx = proc_rxtx->subframe_tx; -#ifdef OFDMA_ULSCH + phy_procedures_UE_TX(UE,proc_rxtx_ue,0,0,normal_txrx,no_relay); + /* if (srs_flag) generate_srs_tx(UE,0,AMP,subframe); - generate_drs_pusch(UE,0,AMP,subframe,first_rb,nb_rb,0); - -#else - - if (srs_flag) - generate_srs_tx(UE,0,AMP,subframe); - - generate_drs_pusch(UE,0, + generate_drs_pusch(UE,proc_rxtx_ue,0, AMP,subframe, UE->ulsch[0]->harq_processes[harq_pid]->first_rb, UE->ulsch[0]->harq_processes[harq_pid]->nb_rb, 0); -#endif if ((cqi_flag == 1) && (n_frames == 1) ) { printf("CQI information (O %d) %d %d\n",UE->ulsch[0]->O, @@ -1037,27 +1031,17 @@ int main(int argc, char **argv) stop_meas(&UE->ulsch_encoding_stats); start_meas(&UE->ulsch_modulation_stats); -#ifdef OFDMA_ULSCH ulsch_modulation(UE->common_vars.txdataF,AMP, - UE->frame_tx,subframe,&UE->frame_parms,UE->ulsch[0]); -#else - // printf("Generating PUSCH in subframe %d with amp %d, nb_rb %d\n",subframe,AMP,nb_rb); - ulsch_modulation(UE->common_vars.txdataF,AMP, - UE->frame_tx,subframe,&UE->frame_parms, + proc_rxtx_ue->frame_tx,subframe,&UE->frame_parms, UE->ulsch[0]); -#endif stop_meas(&UE->ulsch_modulation_stats); + */ - if (n_frames==1) { - write_output("txsigF0UL.m","txsF0", &UE->common_vars.txdataF[0][eNB->frame_parms.ofdm_symbol_size*nsymb*subframe],eNB->frame_parms.ofdm_symbol_size*nsymb,1, - 1); - //write_output("txsigF1.m","txsF1", UE->common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - } - tx_lev=0; - start_meas(&UE->ofdm_mod_stats); - for (aa=0; aa<1; aa++) { + + /* + for (aa=0; aa<1; aa++) { if (frame_parms->Ncp == EXTENDED) PHY_ofdm_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], // output @@ -1071,20 +1055,24 @@ int main(int argc, char **argv) nsymb, frame_parms); -#ifndef OFDMA_ULSCH + apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1); apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1)); -#endif - stop_meas(&UE->ofdm_mod_stats); - stop_meas(&UE->phy_proc_tx); - tx_lev += signal_energy(&txdata[aa][eNB->frame_parms.samples_per_tti*subframe], - eNB->frame_parms.samples_per_tti); +*/ + tx_lev = signal_energy(&UE->common_vars.txdata[0][eNB->frame_parms.samples_per_tti*subframe], + eNB->frame_parms.samples_per_tti); + + + if (n_frames==1) { + write_output("txsigF0UL.m","txsF0", &UE->common_vars.txdataF[0][eNB->frame_parms.ofdm_symbol_size*nsymb*subframe],eNB->frame_parms.ofdm_symbol_size*nsymb,1, + 1); + //write_output("txsigF1.m","txsF1", UE->common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); } - } // input_fd == NULL - - + + } // input_fd == NULL + tx_lev_dB = (unsigned int) dB_fixed_times10(tx_lev); if (n_frames==1) { @@ -1100,7 +1088,8 @@ int main(int argc, char **argv) // compute tx_gain to achieve target SNR (per resource element!) tx_gain = sqrt(pow(10.0,.1*(N0+SNR))*(nb_rb*12/(double)UE->frame_parms.ofdm_symbol_size)/(double)tx_lev); - if (n_frames==1) + + if (n_frames==1) printf("tx_lev = %d (%d.%d dB,%f), gain %f\n",tx_lev,tx_lev_dB/10,tx_lev_dB,10*log10((double)tx_lev),10*log10(tx_gain)); @@ -1117,8 +1106,8 @@ int main(int argc, char **argv) for (i=0; iframe_parms.samples_per_tti; i++) { for (aa=0; aa<1; aa++) { - s_re[aa][i] = ((double)(((short *)&txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)]); - s_im[aa][i] = ((double)(((short *)&txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)+1]); + s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)]); + s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)+1]); } } @@ -1191,74 +1180,13 @@ int main(int argc, char **argv) //write_output("rxsig1UL.m","rxs1", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); } -#ifndef OFDMA_ULSCH - remove_7_5_kHz(eNB,subframe<<1); - remove_7_5_kHz(eNB,1+(subframe<<1)); - // write_output("rxsig0_75.m","rxs0_75", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); - // write_output("rxsig1_75.m","rxs1_75", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); -#endif + eNB->fep = eNB_fep_full; + eNB->do_prach = NULL; - start_meas(&eNB->phy_proc_rx); - start_meas(&eNB->ofdm_demod_stats); - lte_eNB_I0_measurements(eNB, - subframe, - 0, - 1); + phy_procedures_eNB_common_RX(eNB); + phy_procedures_eNB_uespec_RX(eNB,proc_rxtx,no_relay); - for (l=subframe*UE->frame_parms.symbols_per_tti; l<((1+subframe)*UE->frame_parms.symbols_per_tti); l++) { - - slot_fep_ul(&eNB->frame_parms, - &eNB->common_vars, - l%(eNB->frame_parms.symbols_per_tti/2), - l/(eNB->frame_parms.symbols_per_tti/2), - 0, - 0); - } - - stop_meas(&eNB->ofdm_demod_stats); - - eNB->ulsch[0]->cyclicShift = cyclic_shift;// cyclic shift for DMRS - - /* - if(abstx) { - namepointer_log2 = &flogeren_name; - namepointer_chMag = &fmageren_name; - //namepointer_txlev = &ftxlev; - } - */ - - start_meas(&eNB->ulsch_demodulation_stats); - rx_ulsch(eNB,proc_rxtx, - 0, // this is the effective sector id - 0, // this is the UE_id - eNB->ulsch, - cooperation_flag); - stop_meas(&eNB->ulsch_demodulation_stats); - - /* - if(abstx) { - namepointer_chMag = NULL; - - if(trials==0 && round==0 && SNR==snr0) { - char* namepointer ; - namepointer = &fperen_name; - write_output(namepointer, "xxx" ,eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300,1,10); - namepointer = NULL ; - // flagMag = 1; - } - } - */ - - start_meas(&eNB->ulsch_decoding_stats); - - ret= ulsch_decoding(eNB,proc_rxtx, - 0, // UE_id - control_only_flag, - 1, // Nbundled - llr8_flag); - stop_meas(&eNB->ulsch_decoding_stats); - stop_meas(&eNB->phy_proc_rx); if (cqi_flag > 0) { cqi_error = 0; @@ -1289,11 +1217,13 @@ int main(int argc, char **argv) // printf("ulsch_coding: O[%d] %d\n",i,o_flip[i]); + + // if (ret <= eNB->ulsch[0]->max_turbo_iterations) { + + if (eNB->ulsch[0]->harq_processes[harq_pid]->round == 0) { - if (ret <= eNB->ulsch[0]->max_turbo_iterations) { - - avg_iter += ret; - iter_trials++; + // avg_iter += ret; + iter_trials++; if (n_frames==1) { printf("No ULSCH errors found, o_ACK[0]= %d, cqi_crc_status=%d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0],eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status); @@ -1308,7 +1238,7 @@ int main(int argc, char **argv) round=5; } else { - avg_iter += ret-1; + // avg_iter += ret-1; iter_trials++; errs[round]++; @@ -1342,6 +1272,8 @@ int main(int argc, char **argv) printf("ULSCH in error in round %d\n",round); } } // ulsch error + + } // round // printf("\n"); @@ -1757,7 +1689,7 @@ int main(int argc, char **argv) if (((double)errs[0]/(round_trials[0]))<1e-2) break; - } // SNR + } // SNR // @@ -1767,30 +1699,8 @@ int main(int argc, char **argv) }//ch realization - /* - if(abstx) { - fperen = fopen(fperen_name,"a+"); - fprintf(fperen,"];\n"); - fclose(fperen); - fmageren = fopen(fmageren_name,"a+"); - fprintf(fmageren,"];\n"); - fclose(fmageren); - - flogeren = fopen(flogeren_name,"a+"); - fprintf(flogeren,"];\n"); - fclose(flogeren); - } - */ - - // ftxlev = fopen(ftxlev_name,"a+"); - //fprintf(ftxlev,"];\n"); - //fclose(ftxlev); - - - // write_output("chestim_f_dene.m","chestf",ulchestim_f_all,300*12,2,1);*/ - - if(abstx) { // ABSTRACTION + if (abstx) { // ABSTRACTION fprintf(csv_fdUL,"];"); fclose(csv_fdUL); } From e64af6597ac52d5d97b1c3d2d472ba1fd3f9bd75 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 7 Aug 2016 09:47:42 -0700 Subject: [PATCH 174/340] testing of low-level parallelization of FEP in eNodeB RX. --- openair1/PHY/defs.h | 12 ++ openair1/SCHED/phy_procedures_lte_eNb.c | 152 ++++++++++++++++++++++++ openair1/SIMULATION/LTE_PHY/ulsim.c | 10 +- targets/RT/USER/lte-enb.c | 21 ++-- 4 files changed, 185 insertions(+), 10 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 8a6c827ff8..5fdd88cd23 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -246,6 +246,8 @@ typedef struct eNB_proc_t_s { int frame_rx; /// frame to act upon for PRACH int frame_prach; + /// \internal This variable is protected by \ref mutex_fep. + int instance_cnt_fep; /// \brief Instance count for FH processing thread. /// \internal This variable is protected by \ref mutex_FH. int instance_cnt_FH; @@ -264,6 +266,8 @@ typedef struct eNB_proc_t_s { int first_rx; /// flag to indicate first TX transmission int first_tx; + /// pthread attributes for parallel fep thread + pthread_attr_t attr_fep; /// pthread attributes for FH processing thread pthread_attr_t attr_FH; /// pthread attributes for single eNB processing thread @@ -272,6 +276,8 @@ typedef struct eNB_proc_t_s { pthread_attr_t attr_prach; /// pthread attributes for asynchronous RX thread pthread_attr_t attr_asynch_rxtx; + /// scheduling parameters for parallel fep thread + struct sched_param sched_param_fep; /// scheduling parameters for FH thread struct sched_param sched_param_FH; /// scheduling parameters for single eNB thread @@ -280,14 +286,20 @@ typedef struct eNB_proc_t_s { struct sched_param sched_param_prach; /// scheduling parameters for asynch_rxtx thread struct sched_param sched_param_asynch_rxtx; + /// pthread structure for parallel fep thread + pthread_t pthread_fep; /// pthread structure for PRACH thread pthread_t pthread_prach; + /// condition variable for parallel fep thread + pthread_cond_t cond_fep; /// condition variable for FH thread pthread_cond_t cond_FH; /// condition variable for PRACH processing thread; pthread_cond_t cond_prach; /// condition variable for asynch RX/TX thread pthread_cond_t cond_asynch_rxtx; + /// mutex for parallel fep thread + pthread_mutex_t mutex_fep; /// mutex for FH pthread_mutex_t mutex_FH; /// mutex for PRACH thread diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 6053a151a4..be7aedca65 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2497,6 +2497,158 @@ void cba_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,int UE_id,int harq_p } +typedef struct { + PHY_VARS_eNB *eNB; + int slot; +} fep_task; + +void fep0(PHY_VARS_eNB *eNB,int slot) { + + eNB_proc_t *proc = &eNB->proc; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + int l; + + remove_7_5_kHz(eNB,(slot&1)+(proc->subframe_rx<<1)); + for (l=0; lsymbols_per_tti/2; l++) { + slot_fep_ul(fp, + &eNB->common_vars, + l, + (slot&1)+(proc->subframe_rx<<1), + 0, + 0 + ); + } +} + +static inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) { + + if (pthread_mutex_lock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + + *instance_cnt=*instance_cnt-1; + + if (pthread_mutex_unlock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} + +static inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { + + if (pthread_mutex_lock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + + while (*instance_cnt < 0) { + // most of the time the thread is waiting here + // proc->instance_cnt_rxtx is -1 + pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again + } + + if (pthread_mutex_unlock(mutex) != 0) { + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} + +extern int oai_exit; + + +static void *fep_thread(void *param) { + + PHY_VARS_eNB *eNB = (PHY_VARS_eNB *)param; + eNB_proc_t *proc = &eNB->proc; + while (!oai_exit) { + printf("Waiting for parallel FEP signal\n"); + if (wait_on_condition(&proc->mutex_fep,&proc->cond_fep,&proc->instance_cnt_fep,"fep thread")<0) break; + printf("Running parallel FEP on first slot\n"); + fep0(eNB,0); + if (release_thread(&proc->mutex_fep,&proc->instance_cnt_fep,"fep thread")<0) break; + } + return(NULL); +} + +void init_fep_thread(PHY_VARS_eNB *eNB,pthread_attr_t *attr_fep) { + + eNB_proc_t *proc = &eNB->proc; + + proc->instance_cnt_fep = -1; + + pthread_mutex_init( &proc->mutex_fep, NULL); + pthread_cond_init( &proc->cond_fep, NULL); + + pthread_create(&proc->pthread_fep, attr_fep, fep_thread, (void*)eNB); + +} + +void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { + + eNB_proc_t *proc = &eNB->proc; + struct timespec wait; + int wait_cnt=0; + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); + start_meas(&eNB->ofdm_demod_stats); + + printf("Running 2 thread FEP\n"); + + if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { + printf("[eNB] ERROR pthread_mutex_lock for fep thread %d (IC %d)\n", proc->instance_cnt_fep); + exit_fun( "error locking mutex_fep" ); + return; + } + + if (proc->instance_cnt_fep==0) { + printf("[eNB] FEP thread busy\n"); + exit_fun("FEP thread busy"); + pthread_mutex_unlock( &proc->mutex_fep ); + return; + } + + ++proc->instance_cnt_fep; + + printf("[eNB] waking up FEP thread\n"); + if (pthread_cond_signal(&proc->cond_fep) != 0) { + printf("[eNB] ERROR pthread_cond_signal for fep thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + + pthread_mutex_unlock( &proc->mutex_fep ); + + // call second slot in this symbol + printf("Calling FEP for 2nd slot\n"); + fep0(eNB,1); + + if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { + printf("[eNB] ERROR pthread_mutex_lock for fep thread %d (IC %d)\n", proc->instance_cnt_fep); + exit_fun( "error locking mutex_fep" ); + return; + } + while (proc->instance_cnt_fep==0) { + wait_cnt++; + if (wait_cnt>10000) + break; + }; + + pthread_mutex_unlock( &proc->mutex_fep ); + if (wait_cnt>10000) { + printf("[eNB] parallel FEP didn't finish\n"); + exit_fun( "error" ); + } +} + void eNB_fep_full(PHY_VARS_eNB *eNB) { eNB_proc_t *proc = &eNB->proc; diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 47565f4e0c..70510cbc04 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -85,6 +85,8 @@ double t_rx_min = 1000000000; /*!< \brief initial min process time for tx */ int n_tx_dropped = 0; /*!< \brief initial max process time for tx */ int n_rx_dropped = 0; /*!< \brief initial max process time for rx */ +int oai_exit = 0; + void fill_ulsch_dci(PHY_VARS_eNB *eNB,void *UL_dci,int first_rb,int nb_rb,int mcs,int ndi,int cqi_flag) { @@ -171,6 +173,7 @@ void fill_ulsch_dci(PHY_VARS_eNB *eNB,void *UL_dci,int first_rb,int nb_rb,int mc } extern void eNB_fep_full(PHY_VARS_eNB *eNB); +extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB); int main(int argc, char **argv) { @@ -688,6 +691,8 @@ int main(int argc, char **argv) eNB->ulsch[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0); UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); + init_fep_thread(eNB,&eNB->proc.attr_fep); + // Create transport channel structures for 2 transport blocks (MIMO) for (i=0; i<2; i++) { eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0); @@ -1181,7 +1186,7 @@ int main(int argc, char **argv) } - eNB->fep = eNB_fep_full; + eNB->fep = eNB_fep_full_2thread; eNB->do_prach = NULL; phy_procedures_eNB_common_RX(eNB); @@ -1700,6 +1705,9 @@ int main(int argc, char **argv) }//ch realization + oai_exit=1; + pthread_cond_signal(&eNB->proc.cond_fep); + if (abstx) { // ABSTRACTION fprintf(csv_fdUL,"];"); fclose(csv_fdUL); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index b614ca131d..d4f83d5a2c 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1329,6 +1329,7 @@ static void* eNB_thread_single( void* param ) { } +extern void init_fep_thread(PHY_VARS_eNB *, pthread_attr_t *); void init_eNB_proc(int inst) { @@ -1337,7 +1338,7 @@ void init_eNB_proc(int inst) { PHY_VARS_eNB *eNB; eNB_proc_t *proc; eNB_rxtx_proc_t *proc_rxtx; - pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL; + pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL,*attr_fep=NULL; for (CC_id=0; CC_idproc_rxtx; proc_rxtx[0].instance_cnt_rxtx = -1; proc_rxtx[1].instance_cnt_rxtx = -1; - proc->instance_cnt_prach = -1; - proc->instance_cnt_FH = -1; + proc->instance_cnt_prach = -1; + proc->instance_cnt_FH = -1; proc->instance_cnt_asynch_rxtx = -1; - proc->CC_id = CC_id; + proc->CC_id = CC_id; proc->first_rx=1; proc->first_tx=1; @@ -1373,6 +1374,7 @@ void init_eNB_proc(int inst) { attr_prach = &proc->attr_prach; attr_asynch = &proc->attr_asynch_rxtx; attr_single = &proc->attr_single; + attr_fep = &proc->attr_fep; #endif if (eNB->single_thread_flag==0) { @@ -1380,9 +1382,10 @@ void init_eNB_proc(int inst) { pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] ); pthread_create( &proc->pthread_FH, attr_FH, eNB_thread_FH, &eNB->proc ); } - else + else { pthread_create(&proc->pthread_single, attr_single, eNB_thread_single, &eNB->proc); - + init_fep_thread(eNB,attr_fep); + } pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, &eNB->proc ); if ((eNB->node_timing == synch_to_other) || (eNB->node_function == NGFI_RRU_IF5) || @@ -1631,7 +1634,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case NGFI_RRU_IF4p5: eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; + eNB->fep = (eNB->single_thread_flag == 0) ? NB_fep_full : eNB_fep_full_2thread; eNB->proc_uespec_rx = NULL; eNB->proc_tx = NULL;//proc_tx_rru_if4p5; eNB->tx_fh = NULL; @@ -1658,7 +1661,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP: eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; + eNB->fep = (eNB->single_thread_flag == 0) ? NB_fep_full : eNB_fep_full_2thread; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = NULL; @@ -1676,7 +1679,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP_BBU: eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; + eNB->fep = (eNB->single_thread_flag == 0) ? NB_fep_full : eNB_fep_full_2thread; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = tx_fh_if5; From 5b9f4714a9e7670baf5982f9387c5760263933aa Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 7 Aug 2016 09:51:01 -0700 Subject: [PATCH 175/340] added unitary_defs.h --- openair1/SIMULATION/LTE_PHY/unitary_defs.h | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 openair1/SIMULATION/LTE_PHY/unitary_defs.h diff --git a/openair1/SIMULATION/LTE_PHY/unitary_defs.h b/openair1/SIMULATION/LTE_PHY/unitary_defs.h new file mode 100644 index 0000000000..1e1c66130a --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/unitary_defs.h @@ -0,0 +1,9 @@ +openair0_device openair0; + +void exit_fun(const char *s) { exit(-1); } + +extern unsigned int dlsch_tbs25[27][25],TBStable[27][110]; +extern unsigned char offset_mumimo_llr_drange_fix; + +extern unsigned short dftsizes[33]; +extern short *ul_ref_sigs[30][2][33]; From 12801c599153587ff19145fdf76f1685f92b3da7 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 7 Aug 2016 19:25:50 +0200 Subject: [PATCH 176/340] switch for parallel FEP on ulsim. Deactivated for real-time operation. --- openair1/SCHED/phy_procedures_lte_eNb.c | 11 ++++------- openair1/SIMULATION/LTE_PHY/dlsim.c | 2 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 10 ++++------ openair1/SIMULATION/LTE_PHY/unitary_defs.h | 1 + targets/RT/USER/lte-enb.c | 6 +++--- 5 files changed, 13 insertions(+), 17 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index be7aedca65..980fa3335a 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2568,9 +2568,7 @@ static void *fep_thread(void *param) { PHY_VARS_eNB *eNB = (PHY_VARS_eNB *)param; eNB_proc_t *proc = &eNB->proc; while (!oai_exit) { - printf("Waiting for parallel FEP signal\n"); if (wait_on_condition(&proc->mutex_fep,&proc->cond_fep,&proc->instance_cnt_fep,"fep thread")<0) break; - printf("Running parallel FEP on first slot\n"); fep0(eNB,0); if (release_thread(&proc->mutex_fep,&proc->instance_cnt_fep,"fep thread")<0) break; } @@ -2601,8 +2599,6 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); start_meas(&eNB->ofdm_demod_stats); - printf("Running 2 thread FEP\n"); - if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { printf("[eNB] ERROR pthread_mutex_lock for fep thread %d (IC %d)\n", proc->instance_cnt_fep); exit_fun( "error locking mutex_fep" ); @@ -2618,7 +2614,7 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { ++proc->instance_cnt_fep; - printf("[eNB] waking up FEP thread\n"); + if (pthread_cond_signal(&proc->cond_fep) != 0) { printf("[eNB] ERROR pthread_cond_signal for fep thread\n"); exit_fun( "ERROR pthread_cond_signal" ); @@ -2628,7 +2624,6 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { pthread_mutex_unlock( &proc->mutex_fep ); // call second slot in this symbol - printf("Calling FEP for 2nd slot\n"); fep0(eNB,1); if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { @@ -2643,10 +2638,12 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { }; pthread_mutex_unlock( &proc->mutex_fep ); - if (wait_cnt>10000) { + if (wait_cnt>1000000) { printf("[eNB] parallel FEP didn't finish\n"); exit_fun( "error" ); } + + stop_meas(&eNB->ofdm_demod_stats); } void eNB_fep_full(PHY_VARS_eNB *eNB) { diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index f7824773e0..fb6a9d0288 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should haeve received a copy of the GNU General Public License along with OpenAirInterface.The full GNU General Public License is included in this distribution in the file called "COPYING". If not, see . diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 70510cbc04..48b3f8cec1 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -85,8 +85,6 @@ double t_rx_min = 1000000000; /*!< \brief initial min process time for tx */ int n_tx_dropped = 0; /*!< \brief initial max process time for tx */ int n_rx_dropped = 0; /*!< \brief initial max process time for rx */ -int oai_exit = 0; - void fill_ulsch_dci(PHY_VARS_eNB *eNB,void *UL_dci,int first_rb,int nb_rb,int mcs,int ndi,int cqi_flag) { @@ -276,7 +274,7 @@ int main(int argc, char **argv) char channel_model_input[10]; uint8_t max_turbo_iterations=4; - uint8_t llr8_flag=0; + uint8_t parallel_flag=0; int nb_rb_set = 0; int threequarter_fs=0; @@ -534,7 +532,7 @@ int main(int argc, char **argv) break; case 'L': - llr8_flag=1; + parallel_flag=1; break; case 'I': @@ -691,7 +689,7 @@ int main(int argc, char **argv) eNB->ulsch[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0); UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); - init_fep_thread(eNB,&eNB->proc.attr_fep); + if (parallel_flag == 1) init_fep_thread(eNB,&eNB->proc.attr_fep); // Create transport channel structures for 2 transport blocks (MIMO) for (i=0; i<2; i++) { @@ -1186,7 +1184,7 @@ int main(int argc, char **argv) } - eNB->fep = eNB_fep_full_2thread; + eNB->fep = (parallel_flag == 1) ? eNB_fep_full_2thread : eNB_fep_full; eNB->do_prach = NULL; phy_procedures_eNB_common_RX(eNB); diff --git a/openair1/SIMULATION/LTE_PHY/unitary_defs.h b/openair1/SIMULATION/LTE_PHY/unitary_defs.h index 1e1c66130a..6fefc47a72 100644 --- a/openair1/SIMULATION/LTE_PHY/unitary_defs.h +++ b/openair1/SIMULATION/LTE_PHY/unitary_defs.h @@ -1,4 +1,5 @@ openair0_device openair0; +int oai_exit=0; void exit_fun(const char *s) { exit(-1); } diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index d4f83d5a2c..8781869e17 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1634,7 +1634,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case NGFI_RRU_IF4p5: eNB->do_prach = do_prach; - eNB->fep = (eNB->single_thread_flag == 0) ? NB_fep_full : eNB_fep_full_2thread; + eNB->fep = eNB_fep_full; eNB->proc_uespec_rx = NULL; eNB->proc_tx = NULL;//proc_tx_rru_if4p5; eNB->tx_fh = NULL; @@ -1661,7 +1661,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP: eNB->do_prach = do_prach; - eNB->fep = (eNB->single_thread_flag == 0) ? NB_fep_full : eNB_fep_full_2thread; + eNB->fep = eNB_fep_full; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = NULL; @@ -1679,7 +1679,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP_BBU: eNB->do_prach = do_prach; - eNB->fep = (eNB->single_thread_flag == 0) ? NB_fep_full : eNB_fep_full_2thread; + eNB->fep = eNB_fep_full; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = tx_fh_if5; From 018fb07187299a67bd65423c5d6c1d9d5bcf8a73 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 7 Aug 2016 19:40:53 +0200 Subject: [PATCH 177/340] fixed affinity code (FH on CPU0, others on CPU 1-3) --- targets/RT/USER/lte-enb.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 8781869e17..e1129edb20 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -164,6 +164,7 @@ void stop_eNB(int nb_inst); static inline void thread_top_init(char *thread_name, + int affinity, uint64_t runtime, uint64_t deadline, uint64_t period) { @@ -207,7 +208,10 @@ static inline void thread_top_init(char *thread_name, #ifdef CPU_AFFINITY if (get_nprocs() > 2) { - for (j = 1; j < get_nprocs(); j++) + if (affinity == 0) + CPU_SET(0,&cpuset); + else + for (j = 1; j < get_nprocs(); j++) CPU_SET(j, &cpuset); s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); if (s != 0) @@ -625,7 +629,7 @@ static void* eNB_thread_rxtx( void* param ) { eNB_thread_rxtx_status = 0; sprintf(thread_name,"RXn_TXnp4_%d\n",&eNB->proc.proc_rxtx[0] == proc ? 0 : 1); - thread_top_init(thread_name,850000L,1000000L,2000000L); + thread_top_init(thread_name,1,850000L,1000000L,2000000L); while (!oai_exit) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); @@ -830,7 +834,7 @@ static void* eNB_thread_asynch_rxtx( void* param ) { int subframe=0, frame=0; - thread_top_init("thread_asynch",870000L,1000000L,1000000L); + thread_top_init("thread_asynch",1,870000L,1000000L,1000000L); // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe @@ -1153,7 +1157,7 @@ static void* eNB_thread_FH( void* param ) { // set default return value eNB_thread_FH_status = 0; - thread_top_init("eNB_thread_FH",870000,1000000,1000000); + thread_top_init("eNB_thread_FH",0,870000,1000000,1000000); wait_sync("eNB_thread_FH"); @@ -1233,7 +1237,7 @@ static void* eNB_thread_prach( void* param ) { // set default return value eNB_thread_prach_status = 0; - thread_top_init("eNB_thread_prach",500000L,1000000L,20000000L); + thread_top_init("eNB_thread_prach",1,500000L,1000000L,20000000L); while (!oai_exit) { @@ -1265,7 +1269,7 @@ static void* eNB_thread_single( void* param ) { // set default return value eNB_thread_single_status = 0; - thread_top_init("eNB_thread_single",870000,1000000,1000000); + thread_top_init("eNB_thread_single",0,870000,1000000,1000000); wait_sync("eNB_thread_single"); From 857af54015d4749385e912f8d067bb25cc4d7f96 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 8 Aug 2016 00:08:43 +0200 Subject: [PATCH 178/340] usrp 20 MHz on 30.72 master clock. fixed memory leak in prach.c for 20 MHz with 3/4 sampling. added default attributes to threads in lte-enb.c --- openair1/PHY/LTE_TRANSPORT/prach.c | 26 +++++++++++++++----- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 2 +- targets/RT/USER/lte-enb.c | 8 ++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index b24535c43a..cab6544b62 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1161,6 +1161,9 @@ void rx_prach(PHY_VARS_eNB *eNB, break; } + if (eNB->frame_parms.threequarter_fs == 1) + Ncp=(Ncp*3)>>2; + switch (eNB->frame_parms.N_RB_UL) { case 6: Ncp>>=4; @@ -1258,13 +1261,24 @@ void rx_prach(PHY_VARS_eNB *eNB, break; case 100: - if (prach_fmt == 4) { - dft4096(prach2,rxsigF[aa],1); + if (eNB->frame_parms.threequarter_fs==0) { + if (prach_fmt == 4) { + dft4096(prach2,rxsigF[aa],1); + } else { + dft24576(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft24576(prach2+49152,rxsigF[aa]+49152); + } } else { - dft24576(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft24576(prach2+49152,rxsigF[aa]+49152); + if (prach_fmt == 4) { + dft3072(prach2,rxsigF[aa]); + } else { + dft18432(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft18432(prach2+36864,rxsigF[aa]+36864); + } } break; diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index fc4f8d5d39..b8e9b21866 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -610,7 +610,7 @@ extern "C" { switch ((int)openair0_cfg[0].sample_rate) { case 30720000: - s->usrp->set_master_clock_rate(61.44e6); + s->usrp->set_master_clock_rate(30.72e6); openair0_cfg[0].tx_sample_advance = 115; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index e1129edb20..51ea3709e1 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1371,6 +1371,14 @@ void init_eNB_proc(int inst) { pthread_cond_init( &proc->cond_prach, NULL); pthread_cond_init( &proc->cond_FH, NULL); pthread_cond_init( &proc->cond_asynch_rxtx, NULL); + + pthread_attr_init( &proc->attr_FH); + pthread_attr_init( &proc->attr_prach); + pthread_attr_init( &proc->attr_asynch_rxtx); + pthread_attr_init( &proc->attr_single); + pthread_attr_init( &proc->attr_fep); + pthread_attr_init( &proc_rxtx[0].attr_rxtx); + pthread_attr_init( &proc_rxtx[1].attr_rxtx); #ifndef DEADLINE_SCHEDULER attr0 = &proc_rxtx[0].attr_rxtx; attr1 = &proc_rxtx[1].attr_rxtx; From f7bb8a964dbde9a759e8c2cc420469998d50b4de Mon Sep 17 00:00:00 2001 From: Anta Huang Date: Wed, 10 Aug 2016 10:38:17 +0200 Subject: [PATCH 179/340] To get oaisim work with OAI EPC - fix the run_enb_ue_virt_s1 script - change the Ki value back to the one used --- cmake_targets/tools/run_enb_ue_virt_s1 | 2 +- openair3/NAS/UE/API/USIM/usim_api.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake_targets/tools/run_enb_ue_virt_s1 b/cmake_targets/tools/run_enb_ue_virt_s1 index 8f7255332a..9f325c7243 100755 --- a/cmake_targets/tools/run_enb_ue_virt_s1 +++ b/cmake_targets/tools/run_enb_ue_virt_s1 @@ -252,7 +252,7 @@ function main() # Check table 200 lte in /etc/iproute2/rt_tables fgrep lte /etc/iproute2/rt_tables > /dev/null if [ $? -ne 0 ]; then - bash -c echo "200 lte " >> /etc/iproute2/rt_tables + echo "200 lte " >> /etc/iproute2/rt_tables fi ip rule add fwmark 1 table lte ifconfig oip1 up diff --git a/openair3/NAS/UE/API/USIM/usim_api.c b/openair3/NAS/UE/API/USIM/usim_api.c index fe8dc8b350..807ee46724 100644 --- a/openair3/NAS/UE/API/USIM/usim_api.c +++ b/openair3/NAS/UE/API/USIM/usim_api.c @@ -77,7 +77,8 @@ Description Implements the API used by the NAS layer to read/write * Subscriber authentication security key */ #define USIM_API_K_SIZE 16 -#define USIM_API_K_VALUE "fec86ba6eb707ed08905757b1bb44b8f" +//#define USIM_API_K_VALUE "fec86ba6eb707ed08905757b1bb44b8f" +#define USIM_API_K_VALUE "8BAF473F2F8FD09487CCCBD7097C6862" static uint8_t _usim_api_k[USIM_API_K_SIZE]; From 8d057b80e247d28aa80ea030f3468fd1f35bb363 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 12 Aug 2016 10:54:58 +0200 Subject: [PATCH 180/340] add helper for three quarter sampling for 20 MHz --- targets/RT/USER/lte-softmodem.c | 1 + 1 file changed, 1 insertion(+) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 852147f462..f3e51890f1 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -401,6 +401,7 @@ void help (void) { printf(" -W Enable L2 wireshark messages on localhost \n"); printf(" -V Enable VCD (generated file will be located atopenair_dump_eNB.vcd, read it with target/RT/USER/eNB.gtkw\n"); printf(" -x Set the transmission mode, valid options: 1 \n"); + printf(" -E Apply three-quarter of sampling frequency, 23.04 Msps to reduce the data rate on USB/PCIe transfers (only valid for 20 MHz)\n"); #if T_TRACER printf(" --T_port [port] use given port\n"); printf(" --T_nowait don't wait for tracer, start immediately\n"); From 8788b311e98b003b06bedfc0d5137b9c630a8043 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 12 Aug 2016 17:26:04 +0200 Subject: [PATCH 181/340] added some helper message to lte-softmodem --- targets/RT/USER/lte-softmodem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index f3e51890f1..b9d6907c8e 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -382,7 +382,8 @@ void help (void) { printf(" --ue-txgain set UE TX gain\n"); printf(" --ue-scan_carrier set UE to scan around carrier\n"); printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); - printf(" --mmapped-dma sets flag for improved EXMIMO UE performance\n"); + printf(" --mmapped-dma sets flag for improved EXMIMO UE performance\n"); + printf(" --single-thread runs lte-softmodem in only one thread\n"); printf(" -C Set the downlink frequency for all component carriers\n"); printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); From e1aed5af9aecab110c4b558fd1e113f15609bd61 Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Tue, 16 Aug 2016 08:42:35 +0200 Subject: [PATCH 182/340] fix nettle, gnutls to use latest API version, fix eth_raw interface with errno==EAGAIN --- cmake_targets/tools/build_helper | 61 -- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 1 + .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 744 +++++++++--------- 3 files changed, 373 insertions(+), 433 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 8dbdd33823..19ebe9e30f 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -172,57 +172,6 @@ compilations() { # External packages installers ############################################ -install_nettle_from_source() { - nettle_install_log=$OPENAIR_DIR/cmake_targets/log/nettle_install_log.txt - echo_info "\nInstalling Nettle. The log file for nettle installation is here: $nettle_install_log " - ( - cd /tmp - echo "Downloading nettle archive" - $SUDO rm -rf /tmp/nettle-2.5.tar.gz* /tmp/nettle-2.5 - wget https://ftp.gnu.org/gnu/nettle/nettle-2.5.tar.gz - if [ $? -ne 0 ]; then - wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz - fi - if [ ! -f nettle-2.5.tar.gz ]; then - echo_error "Could not download nettle source files" - cd - - return - fi - tar -xzf nettle-2.5.tar.gz - cd nettle-2.5/ - ./configure --disable-openssl --enable-shared --prefix=/usr - echo "Compiling nettle" - make -j`nproc` - make check - $SUDO make install - ) >& $nettle_install_log -} - -install_gnutls_from_source(){ - gnutls_install_log=$OPENAIR_DIR/cmake_targets/log/gnutls_install_log.txt - echo_info "\nInstalling Gnutls. The log file for Gnutls installation is here: $gnutls_install_log " - ( - cd /tmp - echo "Downloading gnutls archive" - $SUDO rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23 - wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz || \ - wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz - if [ ! -f gnutls-3.1.23.tar.xz ]; then - echo_error "Could not download gnutls source files" - cd - - return - fi - tar -xJf gnutls-3.1.23.tar.xz - cd gnutls-3.1.23/ - ./configure --prefix=/usr - echo "Compiling gnutls" - make -j`nproc` - $SUDO make install - )>& $gnutls_install_log -} - - - check_install_usrp_uhd_driver(){ #first we remove old installation $SUDO apt-get remove -y uhd || true @@ -384,17 +333,7 @@ check_install_oai_software() { wget $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so - - # First we remove gnutls/nettle installation and then install from sources - v=$(lsb_release -ris | tr -d '\n') - if [ "$v" == Ubuntu16.04 ] ; then $SUDO apt-get install libgnutls-dev nettle-dev nettle-bin - else - $SUDO apt-get remove -y libgnutls-dev nettle-dev nettle-bin - install_nettle_from_source - install_gnutls_from_source - fi - install_asn1c_from_source } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 126030d3d4..5de8c9a4f3 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -271,6 +271,7 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi if (bytes_received ==-1) { eth->num_rx_errors++; perror("ETHERNET IF5 READ: "); + if (errno == EAGAIN) continue; exit(-1); } else { /* store the timestamp value from packet's header */ diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index 6079781ba1..d2bc98d776 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -26,7 +26,7 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE *******************************************************************************/ -/*! \file ethernet_lib.c +/*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp * \date 2015 @@ -34,7 +34,7 @@ * \company Eurecom * \maintainer: navid.nikaein@eurecom.fr * \note - * \warning + * \warning */ #include @@ -59,366 +59,366 @@ int dest_addr_len[MAX_INST]; int trx_eth_start(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - - /* initialize socket */ - if (eth->flags == ETH_RAW_MODE) { - printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n"); - if (eth_socket_init_raw(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_raw(device)!=0) return -1; - } else { - if(eth_get_dev_conf_raw(device)!=0) return -1; - } - /* adjust MTU wrt number of samples per packet */ - if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; - if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; - } else if (eth->flags == ETH_RAW_IF4p5_MODE) { + eth_state_t *eth = (eth_state_t*)device->priv; - printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n"); - if (eth_socket_init_raw(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1; - } else { - if(eth_get_dev_conf_raw_IF4p5(device)!=0) return -1; - } - /* adjust MTU wrt number of samples per packet */ - if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; + /* initialize socket */ + if (eth->flags == ETH_RAW_MODE) { + printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n"); + if (eth_socket_init_raw(device)!=0) return -1; + /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_raw(device)!=0) return -1; + } else { + if(eth_get_dev_conf_raw(device)!=0) return -1; + } + /* adjust MTU wrt number of samples per packet */ + if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + } else if (eth->flags == ETH_RAW_IF4p5_MODE) { - if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; - } else if (eth->flags == ETH_UDP_IF4p5_MODE) { - printf("Setting ETHERNET to UDP_IF4p5_MODE\n"); - if (eth_socket_init_udp(device)!=0) return -1; - if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_udp(device)!=0) return -1; + printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n"); + if (eth_socket_init_raw(device)!=0) return -1; + /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1; + } else { + if(eth_get_dev_conf_raw_IF4p5(device)!=0) return -1; + } + /* adjust MTU wrt number of samples per packet */ + if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; + + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { + printf("Setting ETHERNET to UDP_IF4p5_MODE\n"); + if (eth_socket_init_udp(device)!=0) return -1; + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_udp(device)!=0) return -1; + } else { + if(eth_get_dev_conf_udp(device)!=0) return -1; + } + } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + printf("Setting ETHERNET to RAW_IF5_MODE\n"); + if (eth_socket_init_raw(device)!=0) return -1; } else { - if(eth_get_dev_conf_udp(device)!=0) return -1; + if (eth_socket_init_udp(device)!=0) return -1; + /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ + if (device->host_type == BBU_HOST) { + if(eth_set_dev_conf_udp(device)!=0) return -1; + } else { + if(eth_get_dev_conf_udp(device)!=0) return -1; + } } - } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { - printf("Setting ETHERNET to RAW_IF5_MODE\n"); - if (eth_socket_init_raw(device)!=0) return -1; - } else { - if (eth_socket_init_udp(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - if (device->host_type == BBU_HOST) { - if(eth_set_dev_conf_udp(device)!=0) return -1; - } else { - if(eth_get_dev_conf_udp(device)!=0) return -1; - } - } - /* apply additional configuration */ - if(ethernet_tune (device, SND_BUF_SIZE,2000000000)!=0) return -1; - if(ethernet_tune (device, RCV_BUF_SIZE,2000000000)!=0) return -1; - - return 0; + /* apply additional configuration */ + if(ethernet_tune (device, SND_BUF_SIZE,2000000000)!=0) return -1; + if(ethernet_tune (device, RCV_BUF_SIZE,2000000000)!=0) return -1; + + return 0; } void trx_eth_end(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; - /* destroys socket only for the processes that call the eth_end fuction-- shutdown() for beaking the pipe */ - if ( close(eth->sockfd[Mod_id]) <0 ) { - perror("ETHERNET: Failed to close socket"); - exit(0); - } else { - printf("[%s] socket for mod_id %d has been successfully closed.\n",(device->host_type == BBU_HOST)? "BBU":"RRH",Mod_id); - } - + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; + /* destroys socket only for the processes that call the eth_end fuction-- shutdown() for beaking the pipe */ + if ( close(eth->sockfd[Mod_id]) <0 ) { + perror("ETHERNET: Failed to close socket"); + exit(0); + } else { + printf("[%s] socket for mod_id %d has been successfully closed.\n",(device->host_type == BBU_HOST)? "BBU":"RRH",Mod_id); + } + } int trx_eth_request(openair0_device *device, void *msg, ssize_t msg_len) { - int Mod_id = device->Mod_id; - eth_state_t *eth = (eth_state_t*)device->priv; - - /* BBU sends a message to RRH */ - if (sendto(eth->sockfd[Mod_id],msg,msg_len,0,(struct sockaddr *)&dest_addr[Mod_id],dest_addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } - - return 0; + int Mod_id = device->Mod_id; + eth_state_t *eth = (eth_state_t*)device->priv; + + /* BBU sends a message to RRH */ + if (sendto(eth->sockfd[Mod_id],msg,msg_len,0,(struct sockaddr *)&dest_addr[Mod_id],dest_addr_len[Mod_id])==-1) { + perror("ETHERNET: "); + exit(0); + } + + return 0; } int trx_eth_reply(openair0_device *device, void *msg, ssize_t msg_len) { - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id = device->Mod_id; - /* RRH receives from BBU a message */ - if (recvfrom(eth->sockfd[Mod_id], - msg, - msg_len, - 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&dest_addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } - - return 0; + /* RRH receives from BBU a message */ + if (recvfrom(eth->sockfd[Mod_id], + msg, + msg_len, + 0, + (struct sockaddr *)&dest_addr[Mod_id], + (socklen_t *)&dest_addr_len[Mod_id])==-1) { + perror("ETHERNET: "); + exit(0); + } + + return 0; } int trx_eth_stop(openair0_device *device) { - return(0); + return(0); } int trx_eth_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { - return(0); + return(0); } int trx_eth_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { - return(0); + return(0); } int trx_eth_get_stats(openair0_device* device) { - return(0); + return(0); } int trx_eth_reset_stats(openair0_device* device) { - return(0); + return(0); } int ethernet_tune(openair0_device *device, unsigned int option, int value) { - - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id=device->Mod_id; - struct timeval timeout; - struct ifreq ifr; - char system_cmd[256]; - // char* if_name=DEFAULT_IF; - // struct in_addr ia; - // struct if_nameindex *ids; - int ret=0; - // int i=0; - - /****************** socket level options ************************/ - switch(option) { - case SND_BUF_SIZE: /* transmit socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], - SOL_SOCKET, - SO_SNDBUF, - &value,sizeof(value))) { - perror("[ETHERNET] setsockopt()"); - } else { - printf("send buffer size= %d bytes\n",value); - } - break; - - case RCV_BUF_SIZE: /* receive socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], - SOL_SOCKET, - SO_RCVBUF, - &value,sizeof(value))) { - perror("[ETHERNET] setsockopt()"); - } else { - printf("receive bufffer size= %d bytes\n",value); - } - break; - - case RCV_TIMEOUT: - timeout.tv_sec = value/1000000; - timeout.tv_usec = value%1000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], - SOL_SOCKET, - SO_RCVTIMEO, - (char *)&timeout,sizeof(timeout))) { - perror("[ETHERNET] setsockopt()"); - } else { - printf( "receive timeout= %u usec\n",(unsigned int)timeout.tv_usec); - } - break; - - case SND_TIMEOUT: - timeout.tv_sec = value/1000000000; - timeout.tv_usec = value%1000000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], - SOL_SOCKET, - SO_SNDTIMEO, - (char *)&timeout,sizeof(timeout))) { - perror("[ETHERNET] setsockopt()"); - } else { - printf( "send timeout= %d,%d sec\n",(int)timeout.tv_sec,(int)timeout.tv_usec); - } - break; - - + + eth_state_t *eth = (eth_state_t*)device->priv; + int Mod_id=device->Mod_id; + struct timeval timeout; + struct ifreq ifr; + char system_cmd[256]; + // char* if_name=DEFAULT_IF; + // struct in_addr ia; + // struct if_nameindex *ids; + int ret=0; + // int i=0; + + /****************** socket level options ************************/ + switch(option) { + case SND_BUF_SIZE: /* transmit socket buffer size */ + if (setsockopt(eth->sockfd[Mod_id], + SOL_SOCKET, + SO_SNDBUF, + &value,sizeof(value))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf("send buffer size= %d bytes\n",value); + } + break; + + case RCV_BUF_SIZE: /* receive socket buffer size */ + if (setsockopt(eth->sockfd[Mod_id], + SOL_SOCKET, + SO_RCVBUF, + &value,sizeof(value))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf("receive bufffer size= %d bytes\n",value); + } + break; + + case RCV_TIMEOUT: + timeout.tv_sec = value/1000000; + timeout.tv_usec = value%1000000;//less than rt_period? + if (setsockopt(eth->sockfd[Mod_id], + SOL_SOCKET, + SO_RCVTIMEO, + (char *)&timeout,sizeof(timeout))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf( "receive timeout= %u usec\n",(unsigned int)timeout.tv_usec); + } + break; + + case SND_TIMEOUT: + timeout.tv_sec = value/1000000000; + timeout.tv_usec = value%1000000000;//less than rt_period? + if (setsockopt(eth->sockfd[Mod_id], + SOL_SOCKET, + SO_SNDTIMEO, + (char *)&timeout,sizeof(timeout))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf( "send timeout= %d,%d sec\n",(int)timeout.tv_sec,(int)timeout.tv_usec); + } + break; + + /******************* interface level options *************************/ - case MTU_SIZE: /* change MTU of the eth interface */ - ifr.ifr_addr.sa_family = AF_INET; - strncpy(ifr.ifr_name,eth->if_name[Mod_id], sizeof(ifr.ifr_name)); - ifr.ifr_mtu =value; - if (ioctl(eth->sockfd[Mod_id],SIOCSIFMTU,(caddr_t)&ifr) < 0 ) - perror ("[ETHERNET] Can't set the MTU"); - else - printf("[ETHERNET] %s MTU size has changed to %d\n",eth->if_name[Mod_id],ifr.ifr_mtu); - break; - - case TX_Q_LEN: /* change TX queue length of eth interface */ - ifr.ifr_addr.sa_family = AF_INET; - strncpy(ifr.ifr_name,eth->if_name[Mod_id], sizeof(ifr.ifr_name)); - ifr.ifr_qlen =value; - if (ioctl(eth->sockfd[Mod_id],SIOCSIFTXQLEN,(caddr_t)&ifr) < 0 ) - perror ("[ETHERNET] Can't set the txqueuelen"); - else - printf("[ETHERNET] %s txqueuelen size has changed to %d\n",eth->if_name[Mod_id],ifr.ifr_qlen); - break; - + case MTU_SIZE: /* change MTU of the eth interface */ + ifr.ifr_addr.sa_family = AF_INET; + strncpy(ifr.ifr_name,eth->if_name[Mod_id], sizeof(ifr.ifr_name)); + ifr.ifr_mtu =value; + if (ioctl(eth->sockfd[Mod_id],SIOCSIFMTU,(caddr_t)&ifr) < 0 ) + perror ("[ETHERNET] Can't set the MTU"); + else + printf("[ETHERNET] %s MTU size has changed to %d\n",eth->if_name[Mod_id],ifr.ifr_mtu); + break; + + case TX_Q_LEN: /* change TX queue length of eth interface */ + ifr.ifr_addr.sa_family = AF_INET; + strncpy(ifr.ifr_name,eth->if_name[Mod_id], sizeof(ifr.ifr_name)); + ifr.ifr_qlen =value; + if (ioctl(eth->sockfd[Mod_id],SIOCSIFTXQLEN,(caddr_t)&ifr) < 0 ) + perror ("[ETHERNET] Can't set the txqueuelen"); + else + printf("[ETHERNET] %s txqueuelen size has changed to %d\n",eth->if_name[Mod_id],ifr.ifr_qlen); + break; + /******************* device level options *************************/ - case COALESCE_PAR: - ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -C %s rx-usecs %d",eth->if_name[Mod_id],value); - if (ret > 0) { - ret=system(system_cmd); - if (ret == -1) { - fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); - } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); - } - printf("[ETHERNET] Coalesce parameters %s\n",system_cmd); - } else { - perror("[ETHERNET] Can't set coalesce parameters\n"); + case COALESCE_PAR: + ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -C %s rx-usecs %d",eth->if_name[Mod_id],value); + if (ret > 0) { + ret=system(system_cmd); + if (ret == -1) { + fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); + } else { + printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + } + printf("[ETHERNET] Coalesce parameters %s\n",system_cmd); + } else { + perror("[ETHERNET] Can't set coalesce parameters\n"); + } + break; + + case PAUSE_PAR: + if (value==1) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg off rx off tx off",eth->if_name[Mod_id]); + else if (value==0) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg on rx on tx on",eth->if_name[Mod_id]); + else break; + if (ret > 0) { + ret=system(system_cmd); + if (ret == -1) { + fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); + } else { + printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + } + printf("[ETHERNET] Pause parameters %s\n",system_cmd); + } else { + perror("[ETHERNET] Can't set pause parameters\n"); + } + break; + + case RING_PAR: + ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s val %d",eth->if_name[Mod_id],value); + if (ret > 0) { + ret=system(system_cmd); + if (ret == -1) { + fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); + } else { + printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + } + printf("[ETHERNET] Ring parameters %s\n",system_cmd); + } else { + perror("[ETHERNET] Can't set ring parameters\n"); + } + break; + + default: + break; } - break; - - case PAUSE_PAR: - if (value==1) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg off rx off tx off",eth->if_name[Mod_id]); - else if (value==0) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg on rx on tx on",eth->if_name[Mod_id]); - else break; - if (ret > 0) { - ret=system(system_cmd); - if (ret == -1) { - fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); - } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); - } - printf("[ETHERNET] Pause parameters %s\n",system_cmd); - } else { - perror("[ETHERNET] Can't set pause parameters\n"); - } - break; - - case RING_PAR: - ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s val %d",eth->if_name[Mod_id],value); - if (ret > 0) { - ret=system(system_cmd); - if (ret == -1) { - fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); - } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); - } - printf("[ETHERNET] Ring parameters %s\n",system_cmd); - } else { - perror("[ETHERNET] Can't set ring parameters\n"); - } - break; - - default: - break; - } - - return 0; + + return 0; } int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params ) { - eth_state_t *eth = (eth_state_t*)malloc(sizeof(eth_state_t)); - memset(eth, 0, sizeof(eth_state_t)); + eth_state_t *eth = (eth_state_t*)malloc(sizeof(eth_state_t)); + memset(eth, 0, sizeof(eth_state_t)); - if (eth_params->transp_preference == 1) { - eth->flags = ETH_RAW_MODE; - } else if (eth_params->transp_preference == 0) { - eth->flags = ETH_UDP_MODE; - } else if (eth_params->transp_preference == 3) { - eth->flags = ETH_RAW_IF4p5_MODE; - } else if (eth_params->transp_preference == 2) { - eth->flags = ETH_UDP_IF4p5_MODE; - } else if (eth_params->transp_preference == 4) { - eth->flags = ETH_RAW_IF5_MOBIPASS; - } else { - printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference); - eth->flags = ETH_RAW_MODE; - } - - printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); - device->Mod_id = num_devices_eth++; - device->transp_type = ETHERNET_TP; - device->trx_start_func = trx_eth_start; - device->trx_request_func = trx_eth_request; - device->trx_reply_func = trx_eth_reply; - device->trx_get_stats_func = trx_eth_get_stats; - device->trx_reset_stats_func = trx_eth_reset_stats; - device->trx_end_func = trx_eth_end; - device->trx_stop_func = trx_eth_stop; - device->trx_set_freq_func = trx_eth_set_freq; - device->trx_set_gains_func = trx_eth_set_gains; - - if (eth->flags == ETH_RAW_MODE) { - device->trx_write_func = trx_eth_write_raw; - device->trx_read_func = trx_eth_read_raw; - } else if (eth->flags == ETH_UDP_MODE) { - device->trx_write_func = trx_eth_write_udp; - device->trx_read_func = trx_eth_read_udp; - } else if (eth->flags == ETH_RAW_IF4p5_MODE) { - device->trx_write_func = trx_eth_write_raw_IF4p5; - device->trx_read_func = trx_eth_read_raw_IF4p5; - } else if (eth->flags == ETH_UDP_IF4p5_MODE) { - device->trx_write_func = trx_eth_write_udp_IF4p5; - device->trx_read_func = trx_eth_read_udp_IF4p5; - } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { - device->trx_write_func = trx_eth_write_raw_IF4p5; - device->trx_read_func = trx_eth_read_raw_IF4p5; - } else { - //device->trx_write_func = trx_eth_write_udp_IF4p5; - //device->trx_read_func = trx_eth_read_udp_IF4p5; - } - - eth->if_name[device->Mod_id] = eth_params->local_if_name; - device->priv = eth; - - /* device specific */ - openair0_cfg[0].iq_rxrescale = 15;//rescale iqs - openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift - openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; - - /* RRH does not have any information to make this configuration atm */ - if (device->host_type == BBU_HOST) { - /*Note scheduling advance values valid only for case 7680000 */ - switch ((int)openair0_cfg[0].sample_rate) { - case 30720000: - openair0_cfg[0].samples_per_packet = 3840; - break; - case 23040000: - openair0_cfg[0].samples_per_packet = 2880; - break; - case 15360000: - openair0_cfg[0].samples_per_packet = 1920; - break; - case 7680000: - openair0_cfg[0].samples_per_packet = 960; - break; - case 1920000: - openair0_cfg[0].samples_per_packet = 240; - break; - default: - printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; + if (eth_params->transp_preference == 1) { + eth->flags = ETH_RAW_MODE; + } else if (eth_params->transp_preference == 0) { + eth->flags = ETH_UDP_MODE; + } else if (eth_params->transp_preference == 3) { + eth->flags = ETH_RAW_IF4p5_MODE; + } else if (eth_params->transp_preference == 2) { + eth->flags = ETH_UDP_IF4p5_MODE; + } else if (eth_params->transp_preference == 4) { + eth->flags = ETH_RAW_IF5_MOBIPASS; + } else { + printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference); + eth->flags = ETH_RAW_MODE; } - } - - device->openair0_cfg=&openair0_cfg[0]; - return 0; + + printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); + device->Mod_id = num_devices_eth++; + device->transp_type = ETHERNET_TP; + device->trx_start_func = trx_eth_start; + device->trx_request_func = trx_eth_request; + device->trx_reply_func = trx_eth_reply; + device->trx_get_stats_func = trx_eth_get_stats; + device->trx_reset_stats_func = trx_eth_reset_stats; + device->trx_end_func = trx_eth_end; + device->trx_stop_func = trx_eth_stop; + device->trx_set_freq_func = trx_eth_set_freq; + device->trx_set_gains_func = trx_eth_set_gains; + + if (eth->flags == ETH_RAW_MODE) { + device->trx_write_func = trx_eth_write_raw; + device->trx_read_func = trx_eth_read_raw; + } else if (eth->flags == ETH_UDP_MODE) { + device->trx_write_func = trx_eth_write_udp; + device->trx_read_func = trx_eth_read_udp; + } else if (eth->flags == ETH_RAW_IF4p5_MODE) { + device->trx_write_func = trx_eth_write_raw_IF4p5; + device->trx_read_func = trx_eth_read_raw_IF4p5; + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { + device->trx_write_func = trx_eth_write_udp_IF4p5; + device->trx_read_func = trx_eth_read_udp_IF4p5; + } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + device->trx_write_func = trx_eth_write_raw_IF4p5; + device->trx_read_func = trx_eth_read_raw_IF4p5; + } else { + //device->trx_write_func = trx_eth_write_udp_IF4p5; + //device->trx_read_func = trx_eth_read_udp_IF4p5; + } + + eth->if_name[device->Mod_id] = eth_params->local_if_name; + device->priv = eth; + + /* device specific */ + openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift + openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; + + /* RRH does not have any information to make this configuration atm */ + if (device->host_type == BBU_HOST) { + /*Note scheduling advance values valid only for case 7680000 */ + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + openair0_cfg[0].samples_per_packet = 3840; + break; + case 23040000: + openair0_cfg[0].samples_per_packet = 2880; + break; + case 15360000: + openair0_cfg[0].samples_per_packet = 1920; + break; + case 7680000: + openair0_cfg[0].samples_per_packet = 960; + break; + case 1920000: + openair0_cfg[0].samples_per_packet = 240; + break; + default: + printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + } + + device->openair0_cfg=&openair0_cfg[0]; + return 0; } @@ -426,85 +426,85 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth * DEBUGING-RELATED FUNCTIONS * **************************************************************************************************************************/ void dump_packet(char *title, unsigned char* pkt, int bytes, unsigned int tx_rx_flag) { - - static int numSend = 1; - static int numRecv = 1; - int num, k; - char tmp[48]; - unsigned short int cksum; - - num = (tx_rx_flag)? numSend++:numRecv++; - for (k = 0; k < 24; k++) sprintf(tmp+k, "%02X", pkt[k]); - cksum = calc_csum((unsigned short *)pkt, bytes>>2); - printf("%s-%s (%06d): %s 0x%04X\n", title,(tx_rx_flag)? "TX":"RX", num, tmp, cksum); + + static int numSend = 1; + static int numRecv = 1; + int num, k; + char tmp[48]; + unsigned short int cksum; + + num = (tx_rx_flag)? numSend++:numRecv++; + for (k = 0; k < 24; k++) sprintf(tmp+k, "%02X", pkt[k]); + cksum = calc_csum((unsigned short *)pkt, bytes>>2); + printf("%s-%s (%06d): %s 0x%04X\n", title,(tx_rx_flag)? "TX":"RX", num, tmp, cksum); } unsigned short calc_csum (unsigned short *buf, int nwords) { - - unsigned long sum; - for (sum = 0; nwords > 0; nwords--) - sum += *buf++; - sum = (sum >> 16) + (sum & 0xffff); - sum += (sum >> 16); - return ~sum; + + unsigned long sum; + for (sum = 0; nwords > 0; nwords--) + sum += *buf++; + sum = (sum >> 16) + (sum & 0xffff); + sum += (sum >> 16); + return ~sum; } void dump_dev(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - - printf("Ethernet device interface %i configuration:\n" ,device->openair0_cfg->Mod_id); - printf(" Log level is %i :\n" ,device->openair0_cfg->log_level); - printf(" RB number: %i, sample rate: %lf \n" , - device->openair0_cfg->num_rb_dl, device->openair0_cfg->sample_rate); - printf(" BBU configured for %i tx/%i rx channels)\n", - device->openair0_cfg->tx_num_channels,device->openair0_cfg->rx_num_channels); - printf(" Running flags: %s %s (\n", - ((eth->flags & ETH_RAW_MODE) ? "RAW socket mode - ":""), - ((eth->flags & ETH_UDP_MODE) ? "UDP socket mode - ":"")); - printf(" Number of iqs dumped when displaying packets: %i\n\n",eth->iqdumpcnt); - + eth_state_t *eth = (eth_state_t*)device->priv; + + printf("Ethernet device interface %i configuration:\n" ,device->openair0_cfg->Mod_id); + printf(" Log level is %i :\n" ,device->openair0_cfg->log_level); + printf(" RB number: %i, sample rate: %lf \n" , + device->openair0_cfg->num_rb_dl, device->openair0_cfg->sample_rate); + printf(" BBU configured for %i tx/%i rx channels)\n", + device->openair0_cfg->tx_num_channels,device->openair0_cfg->rx_num_channels); + printf(" Running flags: %s %s (\n", + ((eth->flags & ETH_RAW_MODE) ? "RAW socket mode - ":""), + ((eth->flags & ETH_UDP_MODE) ? "UDP socket mode - ":"")); + printf(" Number of iqs dumped when displaying packets: %i\n\n",eth->iqdumpcnt); + } void inline dump_txcounters(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - printf(" Ethernet device interface %i, tx counters:\n" ,device->openair0_cfg->Mod_id); - printf(" Sent packets: %llu send errors: %i\n", (long long unsigned int)eth->tx_count, eth->num_tx_errors); + eth_state_t *eth = (eth_state_t*)device->priv; + printf(" Ethernet device interface %i, tx counters:\n" ,device->openair0_cfg->Mod_id); + printf(" Sent packets: %llu send errors: %i\n", (long long unsigned int)eth->tx_count, eth->num_tx_errors); } void inline dump_rxcounters(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - printf(" Ethernet device interface %i rx counters:\n" ,device->openair0_cfg->Mod_id); - printf(" Received packets: %llu missed packets errors: %i\n", (long long unsigned int)eth->rx_count, eth->num_underflows); -} + eth_state_t *eth = (eth_state_t*)device->priv; + printf(" Ethernet device interface %i rx counters:\n" ,device->openair0_cfg->Mod_id); + printf(" Received packets: %llu missed packets errors: %i\n", (long long unsigned int)eth->rx_count, eth->num_underflows); +} void inline dump_buff(openair0_device *device, char *buff,unsigned int tx_rx_flag, int nsamps) { - - char *strptr; - eth_state_t *eth = (eth_state_t*)device->priv; - /*need to add ts number of iqs in printf need to fix dump iqs call */ - strptr = (( tx_rx_flag == TX_FLAG) ? "TX" : "RX"); - printf("\n %s, nsamps=%i \n" ,strptr,nsamps); - - if (tx_rx_flag == 1) { - dump_txcounters(device); - printf(" First %i iqs of TX buffer\n",eth->iqdumpcnt); - dump_iqs(buff,eth->iqdumpcnt); - } else { - dump_rxcounters(device); - printf(" First %i iqs of RX buffer\n",eth->iqdumpcnt); - dump_iqs(buff,eth->iqdumpcnt); - } - + + char *strptr; + eth_state_t *eth = (eth_state_t*)device->priv; + /*need to add ts number of iqs in printf need to fix dump iqs call */ + strptr = (( tx_rx_flag == TX_FLAG) ? "TX" : "RX"); + printf("\n %s, nsamps=%i \n" ,strptr,nsamps); + + if (tx_rx_flag == 1) { + dump_txcounters(device); + printf(" First %i iqs of TX buffer\n",eth->iqdumpcnt); + dump_iqs(buff,eth->iqdumpcnt); + } else { + dump_rxcounters(device); + printf(" First %i iqs of RX buffer\n",eth->iqdumpcnt); + dump_iqs(buff,eth->iqdumpcnt); + } + } void dump_iqs(char * buff, int iq_cnt) { - int i; - for (i=0;i Date: Sat, 20 Aug 2016 01:02:43 +0200 Subject: [PATCH 183/340] add compilation test cases for RRU/RCC NGFI --- cmake_targets/autotests/README.txt | 17 +++-- cmake_targets/autotests/test_case_list.xml | 79 ++++++++++++++++++++++ 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt index cf1e28dd05..245b235ebf 100644 --- a/cmake_targets/autotests/README.txt +++ b/cmake_targets/autotests/README.txt @@ -16,17 +16,22 @@ Obj.# Case# Test# Description 01 01 20 Build lte-softmodem.USRP.Rel10 01 01 21 Build lte-softmodem.EXMIMO.Rel10 01 01 22 Build lte-softmodem.BLADERF.Rel10 -01 01 23 Build lte-softmodem.ETHERNET.Rel10 +01 01 23 Build lte-softmodem.ETHERNET.Rel10 (RCC) 01 01 24 Build lte-softmodem.LMSSDR.Rel10 01 01 30 Build (dlsim.Rel10 + ulsim.Rel10 + pucchsim.Rel10 + prachsim.Rel10 + pdcchsim.Rel10 + pbchsim.Rel10 + mbmssim.Rel10 secu_knas_encrypt_eia1.Rel10 secu_kenb.Rel10 aes128_ctr_encrypt.Rel10 aes128_ctr_decrypt.Rel10 secu_knas_encrypt_eea2.Rel10 secu_knas.Rel10 secu_knas_encrypt_eea1.Rel10 kdf.Rel10 aes128_cmac_encrypt.Rel10 secu_knas_encrypt_eia2.Rel10) -01 01 40 Build RRH Gateway for USRP (Rel 10) -01 01 41 Build RRH Gateway for EXMIMO (Rel 10) -01 01 42 Build RRH Gateway for BLADERF (Rel 10) -01 01 43 Build RRH Gateway for LMSSDR (Rel 10) +01 01 40 Build RRH Gateway (time domain) for USRP (Rel 10) +01 01 41 Build RRH Gateway (time domain) for EXMIMO (Rel 10) +01 01 42 Build RRH Gateway (time domain) for BLADERF (Rel 10) +01 01 43 Build RRH Gateway (time domain) for LMSSDR (Rel 10) + +01 01 50 Build RRU (NGFI) for USRP (Rel 10) w/ ETHERNET transport +01 01 51 Build RRU (NGFI) for EXMIMO (Rel 10) w/ ETHERNET transport +01 01 52 Build RRU (NGFI) for BLADERF (Rel 10) w/ ETHERNET transport +01 01 53 Build RRU (NGFI) for LMSSDR (Rel 10) w/ ETHERNET transport 01 02 Run OAISIM-NOS1 Rel10 (TDD + 5MHz/10MHz/20MHz + TM 1,2), and check the operation @@ -249,4 +254,4 @@ Obj.# Case# Test# Description #TODO: Add test cases for 10,20 MHz #TODO: Add test cases for TDD/FDD #TODO: Test and compile seperately for Rel8/Rel10 -#TODO: Case03.py eMBMS test case \ No newline at end of file +#TODO: Case03.py eMBMS test case diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 28556445e9..f26c937135 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -381,6 +381,85 @@ 1 + + compilation + Build RRU (NGFI) for USRP (Rel 10) w/ ETHERNET transport + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -t ETHERNET -c + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/lte_build_oai/liboai_usrpdevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + + + + RRU.USRP.Rel10 + 1 + + + + compilation + Build RRU (NGFI) for EXMIMO (Rel 10) w/ ETHERNET transport + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w EXMIMO -t ETHNERNET -c + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/CMakeFiles/openair_rf/openair_rf.ko + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/updatefw + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/oarf_config_exmimo.oct + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_exmimodevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + + + + RRU.EXMIMO.Rel10 + 1 + + + + compilation + Build RRU (NGFI) for BLADERF (Rel 10) w/ ETHERNET transport + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w BLADERF -t ETHERNET -c + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_bladerfdevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + + + + RRU.BLADERF.Rel10 + 1 + + + + compilation + Build RRU (NGFI) for LMSSDR (Rel 10) w/ ETHERNET transport + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w LMSSDR -t ETHERNET -c + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_lmssdrdevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + + + + RRH.LMSSDR.Rel10 + 1 + + execution Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit From 4f2e5d359aa2eacb50f75e24c13e20cb6c2d2e12 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 20 Aug 2016 01:33:48 +0200 Subject: [PATCH 184/340] minor fix for type for RRU/RCC compile tests --- cmake_targets/autotests/test_case_list.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index f26c937135..800b41a8b8 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -388,7 +388,7 @@ $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -t ETHERNET -c $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - $OPENAIR_DIR/cmake_targets/lte_build_oai/liboai_usrpdevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_usrpdevif.so $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash @@ -405,7 +405,7 @@ Build RRU (NGFI) for EXMIMO (Rel 10) w/ ETHERNET transport $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -t ETHNERNET -c + --eNB -w EXMIMO -t ETHERNET -c $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem $OPENAIR_DIR/cmake_targets/lte_build_oai/build/CMakeFiles/openair_rf/openair_rf.ko $OPENAIR_DIR/cmake_targets/lte_build_oai/build/updatefw @@ -456,7 +456,7 @@ - RRH.LMSSDR.Rel10 + RRU.LMSSDR.Rel10 1 From 022ab574d2ccd17f8988221fcbbed3040a07b521 Mon Sep 17 00:00:00 2001 From: nikaeinn Date: Mon, 22 Aug 2016 17:20:00 +0200 Subject: [PATCH 185/340] fix the issue with the number of pending mme/s1ap connections --- openair2/COMMON/platform_types.h | 2 + openair2/ENB_APP/enb_app.c | 2 + openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 56 +++++++------ openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 2 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 5 +- openair3/S1AP/s1ap_eNB.c | 83 +++++++++++++------ .../S1AP/s1ap_eNB_management_procedures.c | 64 ++++++++++++++ .../S1AP/s1ap_eNB_management_procedures.h | 4 + 8 files changed, 165 insertions(+), 53 deletions(-) diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h index 6f7722316f..709ecfd9b2 100755 --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -68,6 +68,7 @@ typedef uint32_t frame_t; typedef int32_t sframe_t; typedef uint32_t sub_frame_t; typedef uint8_t module_id_t; +typedef uint8_t configured_t; typedef uint8_t eNB_index_t; typedef uint16_t ue_id_t; typedef int16_t smodule_id_t; @@ -215,6 +216,7 @@ typedef struct protocol_ctxt_s { frame_t frame; /*!< \brief LTE frame number.*/ sub_frame_t subframe; /*!< \brief LTE sub frame number.*/ eNB_index_t eNB_index; /*!< \brief valid for UE indicating the index of connected eNB(s) */ + configured_t configured; /*!< \brief flag indicating whether the instance is configured or not */ } protocol_ctxt_t; // warning time hardcoded #define PROTOCOL_CTXT_TIME_MILLI_SECONDS(CtXt_h) ((CtXt_h)->frame*10+(CtXt_h)->subframe) diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 6d95c215db..87383f5834 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -255,6 +255,8 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con str = inet_ntoa(addr); strcpy(s1ap_register_eNB->enb_ip_address.ipv4_address, str); + LOG_I(ENB_APP,"[eNB %d] eNB_app_register for instance %d\n", enb_id, ENB_MODULE_ID_TO_INSTANCE(enb_id)); + itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); register_enb_pending++; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 7b5bec0e22..e0b993891f 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -29,8 +29,9 @@ /*! \file pdcp.c * \brief pdcp interface with RLC - * \author Lionel GAUTHIER and Navid Nikaein + * \author Navid Nikaein and Lionel GAUTHIER * \date 2009-2012 + * \email navid.nikaein@eurecom.fr * \version 1.0 */ @@ -83,7 +84,7 @@ extern int otg_enabled; * code at targets/TEST/PDCP/test_pdcp.c:test_pdcp_data_req() */ boolean_t pdcp_data_req( - const protocol_ctxt_t* const ctxt_pP, + protocol_ctxt_t* ctxt_pP, const srb_flag_t srb_flagP, const rb_id_t rb_idP, const mui_t muiP, @@ -105,7 +106,6 @@ boolean_t pdcp_data_req( rlc_op_status_t rlc_status; boolean_t ret = TRUE; - hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_IN); @@ -116,28 +116,6 @@ boolean_t pdcp_data_req( T(T_ENB_PDCP_DL, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->rnti), T_INT(rb_idP), T_INT(sdu_buffer_sizeP)); #endif - if (modeP == PDCP_TRANSMISSION_MODE_TRANSPARENT) { - AssertError (rb_idP < NB_RB_MBMS_MAX, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, NB_RB_MBMS_MAX, ctxt_pP->module_id, ctxt_pP->rnti); - } else { - if (srb_flagP) { - AssertError (rb_idP < 3, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, 3, ctxt_pP->module_id, ctxt_pP->rnti); - } else { - AssertError (rb_idP < maxDRB, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, maxDRB, ctxt_pP->module_id, ctxt_pP->rnti); - } - } - - key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, rb_idP, srb_flagP); - h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); - - if (h_rc != HASH_TABLE_OK) { - if (modeP != PDCP_TRANSMISSION_MODE_TRANSPARENT) { - LOG_W(PDCP, PROTOCOL_CTXT_FMT" Instance is not configured for rb_id %d Ignoring SDU...\n", - PROTOCOL_CTXT_ARGS(ctxt_pP), - rb_idP); - return FALSE; - } - } - if (sdu_buffer_sizeP == 0) { LOG_W(PDCP, "Handed SDU is of size 0! Ignoring...\n"); return FALSE; @@ -153,14 +131,40 @@ boolean_t pdcp_data_req( // XXX What does following call do? mac_xface->macphy_exit("PDCP sdu buffer size > MAX_IP_PACKET_SIZE"); } + + if (modeP == PDCP_TRANSMISSION_MODE_TRANSPARENT) { + AssertError (rb_idP < NB_RB_MBMS_MAX, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, NB_RB_MBMS_MAX, ctxt_pP->module_id, ctxt_pP->rnti); + } else { + if (srb_flagP) { + AssertError (rb_idP < 3, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, 3, ctxt_pP->module_id, ctxt_pP->rnti); + } else { + AssertError (rb_idP < maxDRB, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, maxDRB, ctxt_pP->module_id, ctxt_pP->rnti); + } + } + key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, rb_idP, srb_flagP); + h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); + + if (h_rc != HASH_TABLE_OK) { + if (modeP != PDCP_TRANSMISSION_MODE_TRANSPARENT) { + if ((ctxt_pP->configured == 0) && (ctxt_pP->frame%10 == 0)) + LOG_W(PDCP, PROTOCOL_CTXT_FMT" Instance is not configured for rb_id %d Ignoring SDU...\n", + PROTOCOL_CTXT_ARGS(ctxt_pP), + rb_idP); + ctxt_pP->configured=0; + return FALSE; + } + }else{ + // instance for a given RB is configured + ctxt_pP->configured=1; + } + if (ctxt_pP->enb_flag == ENB_FLAG_NO) { start_meas(&eNB_pdcp_stats[ctxt_pP->module_id].data_req); } else { start_meas(&UE_pdcp_stats[ctxt_pP->module_id].data_req); } - // PDCP transparent mode for MBMS traffic if (modeP == PDCP_TRANSMISSION_MODE_TRANSPARENT) { diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index 9e5b15f5a3..52322b1348 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -221,7 +221,7 @@ typedef struct pdcp_mbms_s { * @ingroup _pdcp */ public_pdcp(boolean_t pdcp_data_req( - const protocol_ctxt_t* const ctxt_pP, + protocol_ctxt_t* ctxt_pP, const srb_flag_t srb_flagP, const rb_id_t rb_id, const mui_t muiP, diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index 4b97b8918b..390ad5a48d 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -29,9 +29,10 @@ /*! \file pdcp_fifo.c * \brief pdcp interface with linux IP interface, have a look at http://man7.org/linux/man-pages/man7/netlink.7.html for netlink - * \author Lionel GAUTHIER and Navid Nikaein - * \date 2009 + * \author Navid Nikaein and Lionel GAUTHIER + * \date 2009 - 2016 * \version 0.5 + * \email navid.nikaein@eurecom.fr * \warning This component can be runned only in user-space * @ingroup pdcp */ diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index 2003b957fb..b55ba32142 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -113,7 +113,8 @@ static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, MessageDef *message_p = NULL; sctp_new_association_req_t *sctp_new_association_req_p = NULL; s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL; - + struct s1ap_eNB_mme_data_s *mme = NULL; + DevAssert(instance_p != NULL); DevAssert(mme_ip_address != NULL); @@ -134,27 +135,58 @@ static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, memcpy(&sctp_new_association_req_p->local_address, local_ip_addr, sizeof(*local_ip_addr)); + + S1AP_INFO("[eNB %d] check the mme registration state\n",instance_p->instance); + + mme = s1ap_eNB_get_MME_from_instance(instance_p); - /* Create new MME descriptor */ - s1ap_mme_data_p = calloc(1, sizeof(*s1ap_mme_data_p)); - DevAssert(s1ap_mme_data_p != NULL); + if ( mme == NULL ) { + + /* Create new MME descriptor */ + s1ap_mme_data_p = calloc(1, sizeof(*s1ap_mme_data_p)); + DevAssert(s1ap_mme_data_p != NULL); + + s1ap_mme_data_p->cnx_id = s1ap_eNB_fetch_add_global_cnx_id(); + sctp_new_association_req_p->ulp_cnx_id = s1ap_mme_data_p->cnx_id; + + s1ap_mme_data_p->assoc_id = -1; + s1ap_mme_data_p->s1ap_eNB_instance = instance_p; + + STAILQ_INIT(&s1ap_mme_data_p->served_gummei); + + /* Insert the new descriptor in list of known MME + * but not yet associated. + */ + RB_INSERT(s1ap_mme_map, &instance_p->s1ap_mme_head, s1ap_mme_data_p); + s1ap_mme_data_p->state = S1AP_ENB_STATE_WAITING; + instance_p->s1ap_mme_nb ++; + instance_p->s1ap_mme_pending_nb ++; + } else if (mme->state == S1AP_ENB_STATE_WAITING) { + instance_p->s1ap_mme_pending_nb ++; + sctp_new_association_req_p->ulp_cnx_id = mme->cnx_id; - s1ap_mme_data_p->cnx_id = s1ap_eNB_fetch_add_global_cnx_id(); - sctp_new_association_req_p->ulp_cnx_id = s1ap_mme_data_p->cnx_id; - - s1ap_mme_data_p->assoc_id = -1; - s1ap_mme_data_p->s1ap_eNB_instance = instance_p; - - STAILQ_INIT(&s1ap_mme_data_p->served_gummei); - - /* Insert the new descriptor in list of known MME - * but not yet associated. - */ - RB_INSERT(s1ap_mme_map, &instance_p->s1ap_mme_head, s1ap_mme_data_p); - s1ap_mme_data_p->state = S1AP_ENB_STATE_WAITING; - instance_p->s1ap_mme_nb ++; - instance_p->s1ap_mme_pending_nb ++; + S1AP_INFO("[eNB %d] MME already registered, retrive the data (state %d, cnx %d, mme_nb %d, mme_pending_nb %d)\n", + instance_p->instance, + mme->state, mme->cnx_id, + instance_p->s1ap_mme_nb, instance_p->s1ap_mme_pending_nb); + /*s1ap_mme_data_p->cnx_id = mme->cnx_id; + sctp_new_association_req_p->ulp_cnx_id = mme->cnx_id; + + s1ap_mme_data_p->assoc_id = -1; + s1ap_mme_data_p->s1ap_eNB_instance = instance_p; + */ + } else { + + S1AP_WARN("[eNB %d] MME already registered but not in the waiting state, retrive the data (state %d, cnx %d, mme_nb %d, mme_pending_nb %d)\n", + instance_p->instance, + mme->state, mme->cnx_id, + instance_p->s1ap_mme_nb, instance_p->s1ap_mme_pending_nb); + + } + + S1AP_DEBUG("s1ap mme nb %d\n", instance_p->s1ap_mme_nb); + itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p); } @@ -163,13 +195,14 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t * { s1ap_eNB_instance_t *new_instance; uint8_t index; - + DevAssert(s1ap_register_eNB != NULL); /* Look if the provided instance already exists */ new_instance = s1ap_eNB_get_instance(instance); - - if (new_instance != NULL) { + + + if (new_instance != NULL) { /* Checks if it is a retry on the same eNB */ DevCheck(new_instance->eNB_id == s1ap_register_eNB->eNB_id, new_instance->eNB_id, s1ap_register_eNB->eNB_id, 0); DevCheck(new_instance->cell_type == s1ap_register_eNB->cell_type, new_instance->cell_type, s1ap_register_eNB->cell_type, 0); @@ -199,7 +232,7 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t * /* Add the new instance to the list of eNB (meaningfull in virtual mode) */ s1ap_eNB_insert_new_instance(new_instance); - S1AP_DEBUG("Registered new eNB[%d] and %s eNB id %u\n", + S1AP_INFO("Registered new eNB[%d] and %s eNB id %u\n", instance, s1ap_register_eNB->cell_type == CELL_MACRO_ENB ? "macro" : "home", s1ap_register_eNB->eNB_id); @@ -211,7 +244,7 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t * /* Trying to connect to provided list of MME ip address */ for (index = 0; index < s1ap_register_eNB->nb_mme; index++) { s1ap_eNB_register_mme(new_instance, - &s1ap_register_eNB->mme_ip_address[index], + &s1ap_register_eNB->mme_ip_address[index], &s1ap_register_eNB->enb_ip_address, s1ap_register_eNB->sctp_in_streams, s1ap_register_eNB->sctp_out_streams); @@ -228,6 +261,8 @@ void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa instance_p = s1ap_eNB_get_instance(instance); DevAssert(instance_p != NULL); + S1AP_WARN("s1ap cnx_id %d\n", sctp_new_association_resp->ulp_cnx_id); + s1ap_mme_data_p = s1ap_eNB_get_MME(instance_p, -1, sctp_new_association_resp->ulp_cnx_id); DevAssert(s1ap_mme_data_p != NULL); diff --git a/openair3/S1AP/s1ap_eNB_management_procedures.c b/openair3/S1AP/s1ap_eNB_management_procedures.c index eb30a8dada..d521b7b7d3 100644 --- a/openair3/S1AP/s1ap_eNB_management_procedures.c +++ b/openair3/S1AP/s1ap_eNB_management_procedures.c @@ -27,6 +27,15 @@ *******************************************************************************/ +/*! \file s1ap_eNB_management_procedures.c + * \brief S1AP eNB task + * \author S. Roux and Navid Nikaein + * \date 2010 - 2016 + * \email: navid.nikaein@eurecom.fr + * \version 1.0 + * @ingroup _s1ap + */ + #include #include #include @@ -116,6 +125,23 @@ struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME( return NULL; } +struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME_from_instance( + s1ap_eNB_instance_t *instance_p) +{ + + struct s1ap_eNB_mme_data_s *mme = NULL; + struct s1ap_eNB_mme_data_s *mme_next = NULL; + + for (mme = RB_MIN(s1ap_mme_map, &instance_p->s1ap_mme_head); mme!=NULL ; mme = mme_next) { + mme_next = RB_NEXT(s1ap_mme_map, &instance_p->s1ap_mme_head, mme); + if (mme->s1ap_eNB_instance == instance_p) { + return mme; + } + } + + return NULL; +} + s1ap_eNB_instance_t *s1ap_eNB_get_instance(instance_t instance) { s1ap_eNB_instance_t *temp = NULL; @@ -130,3 +156,41 @@ s1ap_eNB_instance_t *s1ap_eNB_get_instance(instance_t instance) return NULL; } + +void s1ap_eNB_remove_mme_desc(s1ap_eNB_instance_t * instance) +{ + + struct s1ap_eNB_mme_data_s *mme = NULL; + struct s1ap_eNB_mme_data_s *mmeNext = NULL; + struct plmn_identity_s* plmnInfo; + struct served_group_id_s* groupInfo; + struct served_gummei_s* gummeiInfo; + struct mme_code_s* mmeCode; + + for (mme = RB_MIN(s1ap_mme_map, &instance->s1ap_mme_head); mme; mme = mmeNext) { + mmeNext = RB_NEXT(s1ap_mme_map, &instance->s1ap_mme_head, mme); + RB_REMOVE(s1ap_mme_map, &instance->s1ap_mme_head, mme); + while (!STAILQ_EMPTY(&mme->served_gummei)) { + gummeiInfo = STAILQ_FIRST(&mme->served_gummei); + STAILQ_REMOVE_HEAD(&mme->served_gummei, next); + + while (!STAILQ_EMPTY(&gummeiInfo->served_plmns)) { + plmnInfo = STAILQ_FIRST(&gummeiInfo->served_plmns); + STAILQ_REMOVE_HEAD(&gummeiInfo->served_plmns, next); + free(plmnInfo); + } + while (!STAILQ_EMPTY(&gummeiInfo->served_group_ids)) { + groupInfo = STAILQ_FIRST(&gummeiInfo->served_group_ids); + STAILQ_REMOVE_HEAD(&gummeiInfo->served_group_ids, next); + free(groupInfo); + } + while (!STAILQ_EMPTY(&gummeiInfo->mme_codes)) { + mmeCode = STAILQ_FIRST(&gummeiInfo->mme_codes); + STAILQ_REMOVE_HEAD(&gummeiInfo->mme_codes, next); + free(mmeCode); + } + free(gummeiInfo); + } + free(mme); + } +} diff --git a/openair3/S1AP/s1ap_eNB_management_procedures.h b/openair3/S1AP/s1ap_eNB_management_procedures.h index 2e00add882..0fd9f84053 100644 --- a/openair3/S1AP/s1ap_eNB_management_procedures.h +++ b/openair3/S1AP/s1ap_eNB_management_procedures.h @@ -34,6 +34,10 @@ struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME( s1ap_eNB_instance_t *instance_p, int32_t assoc_id, uint16_t cnx_id); +struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME_from_instance(s1ap_eNB_instance_t *instance_p); + +void s1ap_eNB_remove_mme_desc(s1ap_eNB_instance_t * instance); + void s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); s1ap_eNB_instance_t *s1ap_eNB_get_instance(uint8_t mod_id); From ea57f56466b92b87e94835ff6ec009aefbc8ea91 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 22 Aug 2016 19:18:58 +0200 Subject: [PATCH 186/340] merge selected commits from enhancement-10-harmony-rgu test branch --- cmake_targets/CMakeLists.txt | 1 + .../autotests/run_exec_lte-softmodem_tests.py | 7 ++ cmake_targets/autotests/test_case_list.xml | 30 ++++----- cmake_targets/autotests/tools/run_gdb | 4 ++ cmake_targets/build_oai | 32 +++++---- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 67 ++++++++++++++++--- 6 files changed, 104 insertions(+), 37 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 553309f237..2b164efe69 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -126,6 +126,7 @@ endmacro(add_list_string_option) if (CMAKE_BUILD_TYPE STREQUAL "") set(CMAKE_BUILD_TYPE "RelWithDebInfo") endif() +message("CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}") add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." Debug Release RelWithDebInfo MinSizeRel) Message("Architecture is ${CMAKE_SYSTEM_PROCESSOR}") diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index 10f02ecfb8..791ceb97bb 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -1020,6 +1020,13 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , run_result=0 run_result_string = ' RUN_'+str(run) + ' = FAIL(Thread_Busy)' + #If there is Segmentation fault, we mark the test case as failure as most likely eNB crashed + cmd = "grep -ilr \"segmentation fault\" " + logdir_local_testcase + " | cat " + cmd_out = subprocess.check_output ([cmd], shell=True) + if len(cmd_out) !=0: + run_result=0 + run_result_string = ' RUN_'+str(run) + ' = FAIL(SEGFAULT)' + run_result_string = run_result_string + tput_run_string test_result=test_result & run_result diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 800b41a8b8..a36390d8cf 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1,6 +1,6 @@ -mozart hutch starsky stevens amerique calisson nano qseven +mozart hutch starsky stevens amerique calisson nano /mnt/sradio/TEST_RESULTS/ https://gitlab.eurecom.fr/oai/openairinterface5g.git https://gitlab.eurecom.fr/oai/openair-cn.git @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010304 010305 0104+ 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 + 010141 0102+ 010304 010305 0104+ 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 3 mozart hutch starsky stevens amerique calisson nano @@ -3437,7 +3437,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3509,7 +3509,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3581,7 +3581,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3653,7 +3653,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3724,7 +3724,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3796,7 +3796,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3867,7 +3867,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3939,7 +3939,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -4011,7 +4011,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -4083,7 +4083,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -4154,7 +4154,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -4226,7 +4226,7 @@ c --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -4299,7 +4299,7 @@ c --eNB -w USRP -x -c sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf $OPENAIR_TESTDIR/enb.conf - $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf diff --git a/cmake_targets/autotests/tools/run_gdb b/cmake_targets/autotests/tools/run_gdb index aeb46bc398..a12d6ce21d 100755 --- a/cmake_targets/autotests/tools/run_gdb +++ b/cmake_targets/autotests/tools/run_gdb @@ -35,6 +35,10 @@ $SUDO echo "set pagination off" >> $gdb_file $SUDO echo "handle SIG33 pass nostop noprint" >> $gdb_file $SUDO echo "echo backtrace:\n" >> $gdb_file $SUDO echo "backtrace full" >> $gdb_file +$SUDO echo "echo \n\nVariables:\n" >> $gdb_file +$SUDO echo "info variables" >> $gdb_file +$SUDO echo "echo \n\nlocals:\n" >> $gdb_file +$SUDO echo "info locals" >> $gdb_file $SUDO echo "echo \n\nregisters:\n" >> $gdb_file $SUDO echo "info registers" >> $gdb_file $SUDO echo "echo \n\ncurrent instructions:\n" >> $gdb_file diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 7ff2673b6b..967c92f557 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -61,6 +61,7 @@ TEST_CASE_GROUP="" BUILD_DOXYGEN=0 T_TRACER="False" DISABLE_HARDWARE_DEPENDENCY="False" +CMAKE_BUILD_TYPE="" trap handle_ctrl_c INT function print_help() { @@ -82,7 +83,7 @@ Options --install-optional-packages Install useful but not mandatory packages such as valgrind -g | --run-with-gdb - Add debugging symbols to compilation directives + Add debugging symbols to compilation directives. It also disables any compiler optimization. -h | --help Print this help --eNB @@ -170,7 +171,8 @@ function main() { shift;; -g | --run-with-gdb) GDB=1 - echo_info "Will Compile with gdb symbols" + CMAKE_BUILD_TYPE="Debug" + echo_info "Will Compile with gdb symbols and disable compiler optimization" shift;; --eNB) eNB=1 @@ -443,6 +445,7 @@ function main() { if [ "$NOS1" = "1" ] ; then cat $DIR/$lte_build_dir/CMakeLists.template >> $cmake_file fi + echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file echo "set ( XFORMS $XFORMS )" >> $cmake_file echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file @@ -568,6 +571,8 @@ function main() { cp $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 $dbin fi + # oaisim compilation + ############### if [ "$oaisim" = "1" ] ; then dconf=$OPENAIR_DIR/targets/bin if [ "$NOS1" = "1" ] ; then @@ -581,6 +586,7 @@ function main() { echo_info "Compiling $oaisim_exec ($oaisim_build_dir)" cmake_file=$DIR/$oaisim_build_dir/CMakeLists.txt cp $DIR/$oaisim_build_dir/CMakeLists.template $cmake_file + echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file echo "set ( XFORMS $XFORMS )" >> $cmake_file echo "set ( PRINT_STATS $PRINT_STATS )" >> $cmake_file @@ -649,9 +655,10 @@ function main() { cmake_file=$DIR/oaisim_mme_build_oai/CMakeLists.txt cp $DIR/oaisim_mme_build_oai/CMakeLists.template $cmake_file - echo "set(XFORMS $XFORMS )" >> $cmake_file - echo "set(RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file - echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file + echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file + echo "set ( XFORMS $XFORMS )" >> $cmake_file + echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file + echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file echo "set ( T_TRACER $T_TRACER )" >> $cmake_file echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file #[ "$CLEAN" = "1" ] && rm -rf $DIR/oaisim_mme_build_oai/build @@ -676,13 +683,14 @@ function main() { mkdir -p $DIR/$rrh_build_dir/build cmake_file=$DIR/$rrh_build_dir/CMakeLists.txt echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file - echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file - echo "set(ENABLE_ITTI False )" >> $cmake_file - echo "set(RF_BOARD \"${HW}\")" >> $cmake_file - echo "set(TRANSP_PRO \"${TP}\")" >> $cmake_file - echo 'set(PACKAGE_NAME "\"rrh_gw\"")' >> $cmake_file - echo "set (DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )" >>$cmake_file - echo "set (CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file + echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file + echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file + echo "set ( ENABLE_ITTI False )" >> $cmake_file + echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file + echo "set ( TRANSP_PRO \"${TP}\")" >> $cmake_file + echo 'set ( PACKAGE_NAME "\"rrh_gw\"")' >> $cmake_file + echo "set ( DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )" >>$cmake_file + echo "set ( CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file echo "set ( T_TRACER $T_TRACER )" >> $cmake_file echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file cd $DIR/$rrh_build_dir/build diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index b8e9b21866..f2cc289ed7 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -45,7 +45,7 @@ #include #include #include - +#include #include "common_lib.h" #ifdef __SSE4_1__ # include @@ -172,7 +172,13 @@ static void trx_usrp_end(openair0_device *device) */ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { - int ret; + static long long int loop=0; + static long time_min=0, time_max=0, time_avg=0; + struct timespec tp_start, tp_end; + long time_diff; + clock_gettime(CLOCK_MONOTONIC_RAW, &tp_start); + + int ret=0, ret_i=0; usrp_state_t *s = (usrp_state_t*)device->priv; s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); @@ -196,7 +202,21 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, if (ret != nsamps) { printf("[xmit] tx samples %d != %d\n",ret,nsamps); } - + + clock_gettime(CLOCK_MONOTONIC_RAW, &tp_end); + time_diff = (tp_end.tv_sec - tp_start.tv_sec) *1E09 + (tp_end.tv_nsec - tp_start.tv_nsec); + if (time_min==0 ||loop==1 || time_min > time_diff) + time_min=time_diff; + if (time_max==0 ||loop==1 || time_max < time_diff) + time_max=time_diff; + if (time_avg ==0 ||loop==1) + time_avg= time_diff; + else + time_avg=(time_diff+time_avg) /2.0; + + if ( loop%10000 ==0) + printf("\n usrp_write: min(ns)=%d, max(ns)=%d, avg(ns)=%d", (int)time_min, (int)time_max,(int)time_avg); + loop++; return ret; } @@ -213,6 +233,11 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, */ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + static long long int loop=0; + static long time_min=0, time_max=0, time_avg=0; + struct timespec tp_start, tp_end; + long time_diff; + clock_gettime(CLOCK_MONOTONIC_RAW, &tp_start); usrp_state_t *s = (usrp_state_t*)device->priv; int samples_received=0,i,j; int nsamps2; // aligned to upper 32 or 16 byte boundary @@ -293,7 +318,20 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); *ptimestamp = s->rx_timestamp; - return samples_received; + clock_gettime(CLOCK_MONOTONIC_RAW, &tp_end); + time_diff = (tp_end.tv_sec - tp_start.tv_sec) *1E09 + (tp_end.tv_nsec - tp_start.tv_nsec); + if (time_min==0 ||loop==1 || time_min > time_diff) + time_min=time_diff; + if (time_max==0 || loop==1|| time_max < time_diff) + time_max=time_diff; + if (time_avg ==0 ||loop==1) + time_avg= time_diff; + else + time_avg=(time_diff+time_avg) /2.0; + if ( loop % 10000==0) + printf("\n usrp_read: min(ns)=%d, max(ns)=%d, avg(ns)=%d", (int)time_min, (int)time_max,(int)time_avg); + loop++; + return samples_received; } /*! \brief Get current timestamp of USRP @@ -500,6 +538,7 @@ extern "C" { // Initialize USRP device + device->openair0_cfg = openair0_cfg; std::string args = "type=b200"; @@ -523,6 +562,8 @@ extern "C" { // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); + args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096"; + uhd::device_addrs_t device_adds = uhd::device::find(args); if(device_adds.size() == 0) @@ -554,25 +595,25 @@ extern "C" { switch ((int)openair0_cfg[0].sample_rate) { case 30720000: // from usrp_time_offset - openair0_cfg[0].samples_per_packet = 2048; + //openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 15; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; break; case 15360000: - openair0_cfg[0].samples_per_packet = 2048; + //openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 45; openair0_cfg[0].tx_bw = 10e6; openair0_cfg[0].rx_bw = 10e6; break; case 7680000: - openair0_cfg[0].samples_per_packet = 1024; + //openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 50; openair0_cfg[0].tx_bw = 5e6; openair0_cfg[0].rx_bw = 5e6; break; case 1920000: - openair0_cfg[0].samples_per_packet = 256; + //openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 50; openair0_cfg[0].tx_bw = 1.25e6; openair0_cfg[0].rx_bw = 1.25e6; @@ -585,7 +626,7 @@ extern "C" { } else { printf("Found USRP B200"); - args += ",num_recv_frames=256" ; + args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096" ; s->usrp = uhd::usrp::multi_usrp::make(args); // s->usrp->set_rx_subdev_spec(rx_subdev); @@ -611,30 +652,35 @@ extern "C" { switch ((int)openair0_cfg[0].sample_rate) { case 30720000: s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 115; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; break; case 23040000: s->usrp->set_master_clock_rate(23.04e6); //to be checked + //openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 113; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; break; case 15360000: s->usrp->set_master_clock_rate(30.72e06); + //openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 103; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; break; case 7680000: s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 80; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; break; case 1920000: s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 40; openair0_cfg[0].tx_bw = 20e6; openair0_cfg[0].rx_bw = 20e6; @@ -758,7 +804,8 @@ extern "C" { device->trx_stop_func = trx_usrp_stop; device->trx_set_freq_func = trx_usrp_set_freq; device->trx_set_gains_func = trx_usrp_set_gains; - + device->openair0_cfg = openair0_cfg; + s->sample_rate = openair0_cfg[0].sample_rate; // TODO: // init tx_forward_nsamps based usrp_time_offset ex From c73535b439c372ce49b90b824a1d259328dd6042 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 22 Aug 2016 19:21:41 +0200 Subject: [PATCH 187/340] minor type for test_case_list.xml --- cmake_targets/autotests/test_case_list.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index a36390d8cf..b60e95c2a3 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -3393,7 +3393,6 @@ c sudo mkdir -p /usr/local/etc/oai/freeDiamter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth0 add 192.172.0.1 sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc From 6d3928739353cebe3924e7f36f0b5b1c8c2e5e6c Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 22 Aug 2016 20:16:55 +0200 Subject: [PATCH 188/340] minor type for syntax error --- targets/RT/USER/lte-enb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 51ea3709e1..f8249b755d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -188,7 +188,7 @@ static inline void thread_top_init(char *thread_name, if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - return &eNB_thread_rxtx_status; + exit_fun("Error setting deadline scheduler"); } LOG_I( HW, "[SCHED] eNB RXn-TXnp4 deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); From 94801f7966109dcbe7126493bdbc9714d7938f7e Mon Sep 17 00:00:00 2001 From: nikaeinn Date: Tue, 23 Aug 2016 13:29:38 +0200 Subject: [PATCH 189/340] add more memory blocks for RLC and remove some logs in S1AP --- openair2/UTIL/MEM/mem_block.h | 2 +- openair3/S1AP/s1ap_eNB.c | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/openair2/UTIL/MEM/mem_block.h b/openair2/UTIL/MEM/mem_block.h index edcb147cee..d15d729bdd 100755 --- a/openair2/UTIL/MEM/mem_block.h +++ b/openair2/UTIL/MEM/mem_block.h @@ -75,7 +75,7 @@ public_mem_block(void check_mem_area (void);) private_mem_block(void check_free_mem_block (mem_block_t * leP);) # endif #ifdef USER_MODE -# define MEM_SCALE /*MAX_RG */ MAX_MOBILES_PER_ENB +# define MEM_SCALE MAX_MOBILES_PER_ENB*NB_RB_MAX #else # ifdef NODE_RG # define MEM_SCALE 2 diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index b55ba32142..4a4ee47e1e 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -185,8 +185,6 @@ static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, } - S1AP_DEBUG("s1ap mme nb %d\n", instance_p->s1ap_mme_nb); - itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p); } @@ -261,8 +259,6 @@ void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa instance_p = s1ap_eNB_get_instance(instance); DevAssert(instance_p != NULL); - S1AP_WARN("s1ap cnx_id %d\n", sctp_new_association_resp->ulp_cnx_id); - s1ap_mme_data_p = s1ap_eNB_get_MME(instance_p, -1, sctp_new_association_resp->ulp_cnx_id); DevAssert(s1ap_mme_data_p != NULL); From 1309358bb5980a143e6ba5f79eb78f2177dc0259 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 24 Aug 2016 23:14:44 -0700 Subject: [PATCH 190/340] changes for oaisim to function with new threading architecture and trx_read/trx_write emulation. Tested for 5/10 MHz TM1. Multiple-antenna mode fails. --- cmake_targets/tools/build_helper | 2 +- openair1/PHY/INIT/lte_init.c | 3 +- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 5 + openair1/PHY/TOOLS/defs.h | 4 +- openair1/PHY/TOOLS/signal_energy.c | 2 +- openair1/PHY/defs.h | 6 +- openair1/PHY/extern.h | 2 +- openair1/SCHED/phy_procedures_lte_ue.c | 53 +++--- openair1/SIMULATION/RF/adc.c | 4 +- openair1/SIMULATION/RF/dac.c | 8 +- openair1/SIMULATION/RF/defs.h | 16 +- openair1/SIMULATION/RF/rf.c | 4 +- openair1/SIMULATION/TOOLS/defs.h | 16 +- openair1/SIMULATION/TOOLS/multipath_channel.c | 16 +- ...enb.band7.generic.oaisim.local_no_mme.conf | 2 +- targets/RT/USER/lte-enb.c | 22 ++- targets/RT/USER/lte-ue.c | 38 +++- targets/SIMU/USER/channel_sim.c | 15 +- targets/SIMU/USER/oaisim.c | 87 ++++++--- targets/SIMU/USER/oaisim_config.c | 2 +- targets/SIMU/USER/oaisim_functions.c | 174 ++++++++++++++---- 21 files changed, 324 insertions(+), 157 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 4738acb7f3..514d7748ac 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -179,7 +179,7 @@ install_nettle_from_source() { cd /tmp echo "Downloading nettle archive" $SUDO rm -rf /tmp/nettle-2.5.tar.gz* /tmp/nettle-2.5 - wget https://ftp.gnu.org/gnu/nettle/nettle-2.5.tar.gz + wget http://ftp.nluug.nl/gnu/nettle/nettle-2.5.tar.gz if [ $? -ne 0 ]; then wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz fi diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 4386ca5d47..259a7ba77a 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -988,7 +988,8 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, ue->total_received_bits[eNB_id] = 0; } - ue->tx_power_dBm=-127; + for (i=0;i<10;i++) + ue->tx_power_dBm[i]=-127; if (abstraction_flag == 0) { diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index b78a7e24fd..c2be7ad1bd 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -30,6 +30,8 @@ #include "PHY/defs.h" #include "PHY/extern.h" +#include "UTIL/LOG/vcd_signal_dumper.h" + #define DEBUG_PHY // Adjust location synchronization point to account for drift @@ -48,6 +50,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, int diff; short Re,Im,ncoef; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN); + ncoef = 32767 - coef; #ifdef DEBUG_PHY @@ -98,6 +102,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp); #endif //DEBUG_PHY + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); } diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 8d30a7ea10..3a8a58b6f2 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -296,10 +296,10 @@ int32_t subcarrier_energy(int32_t *,uint32_t, int32_t* subcarrier_energy, uint16 */ int32_t signal_energy_nodc(int32_t *,uint32_t); -/*!\fn double signal_energy_fp(double **, double **,uint32_t, uint32_t,uint32_t); +/*!\fn double signal_energy_fp(double s_re[2][30720], double s_im[2][30720],uint32_t, uint32_t,uint32_t); \brief Computes the signal energy per subcarrier */ -double signal_energy_fp(double **s_re, double **s_im, uint32_t nb_antennas, uint32_t length,uint32_t offset); +double signal_energy_fp(double s_re[2][30720], double s_im[2][30720], uint32_t nb_antennas, uint32_t length,uint32_t offset); /*!\fn double signal_energy_fp2(struct complex *, uint32_t); \brief Computes the signal energy per subcarrier diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c index 373fdc0d90..afd1c727f3 100755 --- a/openair1/PHY/TOOLS/signal_energy.c +++ b/openair1/PHY/TOOLS/signal_energy.c @@ -255,7 +255,7 @@ int32_t signal_energy_nodc(int32_t *input,uint32_t length) } #endif -double signal_energy_fp(double **s_re,double **s_im,uint32_t nb_antennas,uint32_t length,uint32_t offset) +double signal_energy_fp(double s_re[2][30720],double s_im[2][30720],uint32_t nb_antennas,uint32_t length,uint32_t offset) { int32_t aa,i; diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 5fdd88cd23..c4c37d2b72 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -612,6 +612,8 @@ typedef struct { int is_synchronized; /// Data structure for UE process scheduling UE_proc_t proc; + /// Flag to indicate the UE shouldn't do timing correction at all + int no_timing_correction; /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna) uint32_t tx_total_gain_dB; /// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card. @@ -623,9 +625,9 @@ typedef struct { /// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime) uint32_t rx_gain_byp[4]; /// \brief Current transmit power - int8_t tx_power_dBm; + int8_t tx_power_dBm[10]; /// \brief Total number of REs in current transmission - int tx_total_RE; + int tx_total_RE[10]; /// \brief Maximum transmit power int8_t tx_power_max_dBm; /// \brief Number of eNB seen by UE diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h index 2144c4f01d..8a5bf5e8f5 100755 --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -111,7 +111,7 @@ extern double p_qam64[8]; extern double beta1_dlsch[6][MCS_COUNT]; extern double beta2_dlsch[6][MCS_COUNT]; -extern char eNB_functions[5][20]; +extern char eNB_functions[6][20]; extern char eNB_timing[2][20]; diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 2612302d54..58bbcc8ac0 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -718,7 +718,7 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin frame_tx, eNB_id, subframe_tx); - // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); + LOG_D(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[ue->Mod_id].radioResourceConfigCommon); } } @@ -744,17 +744,17 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin ue->prach_resources[eNB_id]->ra_RNTI); if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) { - ue->tx_power_dBm = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id); + ue->tx_power_dBm[subframe_tx] = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id); } else { - ue->tx_power_dBm = ue->tx_power_max_dBm; + ue->tx_power_dBm[subframe_tx] = ue->tx_power_max_dBm; ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; } - ue->tx_total_RE = 96; + ue->tx_total_RE[subframe_tx] = 96; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm, + ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm[subframe_tx], ue->tx_power_max_dBm, ue->frame_parms.N_RB_UL, 6); @@ -766,7 +766,7 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin ue->Mod_id, proc->frame_rx, proc->subframe_tx, - ue->tx_power_dBm, + ue->tx_power_dBm[subframe_tx], ue->prach_vars[eNB_id]->amp); @@ -778,7 +778,7 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n", ue->Mod_id, get_PL(ue->Mod_id,ue->CC_id,eNB_id), - ue->tx_power_dBm, + ue->tx_power_dBm[subframe_tx], dB_fixed(prach_power), ue->prach_vars[eNB_id]->amp); } else { @@ -1036,15 +1036,15 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB if (abstraction_flag == 0) { if (ue->mac_enabled==1) { pusch_power_cntl(ue,proc,eNB_id,1, abstraction_flag); - ue->tx_power_dBm = ue->ulsch[eNB_id]->Po_PUSCH; + ue->tx_power_dBm[subframe_tx] = ue->ulsch[eNB_id]->Po_PUSCH; } else { - ue->tx_power_dBm = ue->tx_power_max_dBm; + ue->tx_power_dBm[subframe_tx] = ue->tx_power_max_dBm; } - ue->tx_total_RE = nb_rb*12; + ue->tx_total_RE[subframe_tx] = nb_rb*12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(ue->tx_power_dBm, + tx_amp = get_tx_amp(ue->tx_power_dBm[, ue->tx_power_max_dBm, ue->frame_parms.N_RB_UL, nb_rb); @@ -1052,7 +1052,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB tx_amp = AMP; #endif LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n", - Mod_id,harq_pid,frame_tx,subframe_tx,ue->tx_power_dBm,ue->tx_power_max_dBm, tx_amp); + Mod_id,harq_pid,frame_tx,subframe_tx,ue->tx_power_dBm[subframe_tx],ue->tx_power_max_dBm, tx_amp); start_meas(&ue->ulsch_modulation_stats); ulsch_modulation(ue->common_vars.txdataF, tx_amp, @@ -1156,8 +1156,8 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin else { Po_PUCCH = ue->tx_power_max_dBm; } - ue->tx_power_dBm = Po_PUCCH; - ue->tx_total_RE = 12; + ue->tx_power_dBm[subframe_tx] = Po_PUCCH; + ue->tx_total_RE[subframe_tx] = 12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) tx_amp = get_tx_amp(Po_PUCCH, @@ -1220,8 +1220,8 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin else { Po_PUCCH = ue->tx_power_max_dBm; } - ue->tx_power_dBm = Po_PUCCH; - ue->tx_total_RE = 12; + ue->tx_power_dBm[subframe_tx] = Po_PUCCH; + ue->tx_total_RE[subframe_tx] = 12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) tx_amp = get_tx_amp(Po_PUCCH, @@ -1286,7 +1286,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui //phy_procedures_emos_UE_TX(next_slot); #endif - ue->tx_power_dBm=-127; + ue->tx_power_dBm[subframe_tx]=-127; if (abstraction_flag==0) { for (aa=0; aanb_antennas_tx; aa++) { @@ -1391,6 +1391,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui (ue->frame_parms.prach_config_common.prach_Config_enabled==1)) { // check if we have PRACH opportunity + if (is_prach_subframe(&ue->frame_parms,frame_tx,subframe_tx)) { ue_prach_procedures(ue,proc,eNB_id,abstraction_flag,mode); @@ -1484,17 +1485,17 @@ void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN); + eNB_id = 0; - if (abstraction_flag == 0) - lte_adjust_synch(&ue->frame_parms, - ue, - eNB_id, - 0, - 16384); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); + if (abstraction_flag == 0) { + if (ue->no_timing_correction==0) + lte_adjust_synch(&ue->frame_parms, + ue, + eNB_id, + 0, + 16384); + } } diff --git a/openair1/SIMULATION/RF/adc.c b/openair1/SIMULATION/RF/adc.c index 6dc1c7f8e6..3f89a3cfe5 100755 --- a/openair1/SIMULATION/RF/adc.c +++ b/openair1/SIMULATION/RF/adc.c @@ -26,8 +26,8 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE *******************************************************************************/ -void adc(double **r_re, - double **r_im, +void adc(double r_re[2][30720], + double r_im[2][30720], unsigned int input_offset, unsigned int output_offset, unsigned int **output, diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c index 22e286a496..ba67eb1f32 100755 --- a/openair1/SIMULATION/RF/dac.c +++ b/openair1/SIMULATION/RF/dac.c @@ -31,8 +31,8 @@ #include #include "PHY/TOOLS/defs.h" -void dac(double **s_re, - double **s_im, +void dac(double s_re[2][30720], + double s_im[2][30720], uint32_t **input, uint32_t input_offset, uint32_t nb_tx_antennas, @@ -81,8 +81,8 @@ void dac(double **s_re, } } -double dac_fixed_gain(double **s_re, - double **s_im, +double dac_fixed_gain(double s_re[2][30720], + double s_im[2][30720], uint32_t **input, uint32_t input_offset, uint32_t nb_tx_antennas, diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/defs.h index 984dfa6ca8..4bd9528dae 100644 --- a/openair1/SIMULATION/RF/defs.h +++ b/openair1/SIMULATION/RF/defs.h @@ -64,16 +64,16 @@ void rf_rx(double **r_re, double IQ_imb_dB, double IQ_phase); -void rf_rx_simple(double **r_re, - double **r_im, +void rf_rx_simple(double r_re[2][30720], + double r_im[2][30720], unsigned int nb_rx_antennas, unsigned int length, double s_time, double rx_gain_dB); -void adc(double **r_re, - double **r_im, +void adc(double r_re[2][30720], + double r_im[2][30720], unsigned int input_offset, unsigned int output_offset, int **output, @@ -81,8 +81,8 @@ void adc(double **r_re, unsigned int length, unsigned char B); -void dac(double **s_re, - double **s_im, +void dac(double s_re[2][30720], + double s_im[2][30720], int **input, unsigned int input_offset, unsigned int nb_tx_antennas, @@ -92,8 +92,8 @@ void dac(double **s_re, unsigned int meas_length, unsigned int meas_offset); -double dac_fixed_gain(double **s_re, - double **s_im, +double dac_fixed_gain(double s_re[2][30720], + double s_im[2][30720], int **input, unsigned int input_offset, unsigned int nb_tx_antennas, diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c index 1f240595aa..2bcb64727d 100644 --- a/openair1/SIMULATION/RF/rf.c +++ b/openair1/SIMULATION/RF/rf.c @@ -206,8 +206,8 @@ void rf_rx(double **r_re, } } -void rf_rx_simple(double **r_re, - double **r_im, +void rf_rx_simple(double r_re[2][30720], + double r_im[2][30720], unsigned int nb_rx_antennas, unsigned int length, double s_time, diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h index c72ea743b1..536655340b 100644 --- a/openair1/SIMULATION/TOOLS/defs.h +++ b/openair1/SIMULATION/TOOLS/defs.h @@ -219,10 +219,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, int random_channel(channel_desc_t *desc, uint8_t abstraction_flag); /**\fn void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, + double tx_sig_re[2][30720], + double tx_sig_im[2][30720], + double rx_sig_re[2][30720], + double rx_sig_im[2][30720], uint32_t length, uint8_t keep_channel) @@ -237,10 +237,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag); */ void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, + double tx_sig_re[2][30720], + double tx_sig_im[2][30720], + double rx_sig_re[2][30720], + double rx_sig_im[2][30720], uint32_t length, uint8_t keep_channel); /* diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c index 9a72ca6423..aae9e974a7 100644 --- a/openair1/SIMULATION/TOOLS/multipath_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_channel.c @@ -44,10 +44,10 @@ uint8_t multipath_channel_nosigconv(channel_desc_t *desc) //#define CHANNEL_SSE #ifdef CHANNEL_SSE void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, + double tx_sig_re[2][30720], + double tx_sig_im[2][30720], + double rx_sig_re[2][30720], + double rx_sig_im[2][30720], uint32_t length, uint8_t keep_channel) { @@ -150,10 +150,10 @@ void multipath_channel(channel_desc_t *desc, #else void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, + double tx_sig_re[2][30720], + double tx_sig_im[2][30720], + double rx_sig_re[2][30720], + double rx_sig_im[2][30720], uint32_t length, uint8_t keep_channel) { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf index ad3bcfcf92..3504adfff0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf @@ -24,7 +24,7 @@ eNBs = component_carriers = ( { node_function = "eNodeB_3GPP"; - node_timing = "synch_to_other"; + node_timing = "synch_to_ext_device"; node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 51ea3709e1..cddef6ccc8 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -191,7 +191,7 @@ static inline void thread_top_init(char *thread_name, return &eNB_thread_rxtx_status; } - LOG_I( HW, "[SCHED] eNB RXn-TXnp4 deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB %s deadline thread (TID %ld) started on CPU %d\n", gettid(), thread_name,sched_getcpu() ); #else //LOW_LATENCY int policy, s, j; @@ -654,7 +654,7 @@ static void* eNB_thread_rxtx( void* param ) { return &eNB_thread_rxtx_status; } -#if defined(ENABLE_ITTI) +#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) /* Wait for eNB application initialization to be complete (eNB registration to MME) */ static void wait_system_ready (char *message, volatile int *start_flag) { @@ -1032,7 +1032,7 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { void rx_fh_slave(PHY_VARS_eNB *eNB,int *frame,int *subframe) { // This case is for synchronization to another thread - // it just waits for an external event. The actual rx_rh is handle by the asynchronous RX thread + // it just waits for an external event. The actual rx_fh is handle by the asynchronous RX thread eNB_proc_t *proc=&eNB->proc; if (wait_on_condition(&proc->mutex_FH,&proc->cond_FH,&proc->instance_cnt_FH,"rx_fh_slave") < 0) @@ -1129,7 +1129,7 @@ void wakeup_slaves(eNB_proc_t *proc) { break; } } else { - LOG_W( PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_FH %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); + LOG_W( PHY,"[eNB] Frame %d, slave CC_id %d thread busy!! (cnt_FH %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); exit_fun( "FH thread busy" ); break; } @@ -1161,7 +1161,7 @@ static void* eNB_thread_FH( void* param ) { wait_sync("eNB_thread_FH"); -#if defined(ENABLE_ITTI) +#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) if (eNB->node_function < NGFI_RRU_IF5) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif @@ -1273,7 +1273,7 @@ static void* eNB_thread_single( void* param ) { wait_sync("eNB_thread_single"); -#if defined(ENABLE_ITTI) +#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) if (eNB->node_function < NGFI_RRU_IF5) wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); #endif @@ -1307,6 +1307,7 @@ static void* eNB_thread_single( void* param ) { subframe++; } + LOG_D(PHY,"eNB Fronthaul thread, frame %d, subframe %d\n",frame,subframe); // synchronization on FH interface, acquire signals/data and block if (eNB->rx_fh) eNB->rx_fh(eNB,&frame,&subframe); @@ -1314,6 +1315,7 @@ static void* eNB_thread_single( void* param ) { T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); + // At this point, all information for subframe has been received on FH interface // If this proc is to provide synchronization, do so wakeup_slaves(proc); @@ -1546,17 +1548,17 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c for (i=0; inb_antennas_rx; i++) { free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); - rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation + rxdata[i] = (int32_t*)(32 + malloc16(32+frame_parms->samples_per_tti*10*sizeof(int32_t))); // FIXME broken memory allocation phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory - memset(rxdata[i], 0, openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card].samples_per_frame*sizeof(int32_t)); + memset(rxdata[i], 0, frame_parms->samples_per_tti*10*sizeof(int32_t)); printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->common_vars.rxdata[0][i],rxdata[i],N_TA_offset); } for (i=0; inb_antennas_tx; i++) { free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); - txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation + txdata[i] = (int32_t*)(32 + malloc16(32 + frame_parms->samples_per_tti*10*sizeof(int32_t))); // FIXME broken memory allocation phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = txdata[i]; - memset(txdata[i],0, openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card].samples_per_frame*sizeof(int32_t)); + memset(txdata[i],0, frame_parms->samples_per_tti*10*sizeof(int32_t)); printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); } } diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 88bce26d6c..c33005ebab 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -793,6 +793,16 @@ static void *UE_thread_rxn_txnp4(void *arg) UE->UE_mode[0] = PRACH; } } + + if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_UL) || + (UE->frame_parms.frame_type == FDD) || + (subframe_select( &UE->frame_parms, proc->subframe_tx ) == SF_S)) { + + if (UE->mode != loop_through_memory) { + phy_procedures_UE_TX(UE,proc,0,0,normal_txrx,no_relay); + } + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX0+(proc->subframe_rx&1), 0 ); @@ -967,15 +977,18 @@ void *UE_thread(void *arg) { if (start_rx_stream==0) { start_rx_stream=1; if (UE->mode != loop_through_memory) { - LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); - rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, - ×tamp, - (void**)rxdata, - UE->rx_offset, - UE->frame_parms.nb_antennas_rx); - if (rxs != UE->rx_offset) { - exit_fun("problem in rx"); - return &UE_thread_retval; + + if (UE->no_timing_correction==0) { + LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + (void**)rxdata, + UE->rx_offset, + UE->frame_parms.nb_antennas_rx); + if (rxs != UE->rx_offset) { + exit_fun("problem in rx"); + return &UE_thread_retval; + } } UE->rx_offset=0; UE->proc.proc_rxtx[0].frame_rx++; @@ -1049,10 +1062,15 @@ void *UE_thread(void *arg) { int instance_cnt_rxtx = ++proc->instance_cnt_rxtx; proc->subframe_rx=sf; proc->subframe_tx=(sf+4)%10; - proc->frame_tx = proc->frame_rx + (proc->subframe_rx>5)?1:0; + proc->frame_tx = proc->frame_rx + ((proc->subframe_rx>5)?1:0); proc->timestamp_tx = timestamp+(4*UE->frame_parms.samples_per_tti)-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0; + if (sf != (timestamp/UE->frame_parms.samples_per_tti)%10) { + LOG_E(PHY,"steady-state UE_thread error : frame_rx %d, subframe_rx %d, frame_tx %d, subframe_tx %d, rx subframe %d\n",proc->frame_rx,proc->subframe_rx,proc->frame_tx,proc->subframe_tx,(timestamp/UE->frame_parms.samples_per_tti)%10); + exit(-1); + } + if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" ); exit_fun("nothing to add"); diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index 8ff6c88962..9034fc0574 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -437,9 +437,14 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N txdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.txdata; sf_offset = subframe*frame_parms->samples_per_tti; - if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm + + if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe] + UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB) <= -125.0) { // don't simulate a UE that is too weak + LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %d dBm (num_RE %d) for subframe %d (sf_offset %d)\n", + UE_id, + PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe], + PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe], + subframe,sf_offset); } else { tx_pwr = dac_fixed_gain((double**)s_re, @@ -451,13 +456,13 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N sf_offset, frame_parms->ofdm_symbol_size, 14, - (double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE), - PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE); // This make the previous argument the total power + (double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]), + PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]); // This make the previous argument the total power LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for subframe %d (sf_offset %d)\n", UE_id, 10*log10(tx_pwr), - PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm, - PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE, + PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe], + PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe], subframe,sf_offset); diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index fddbf517fd..258096fe73 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -139,8 +139,10 @@ node_desc_t *ue_data[NUMBER_OF_UE_MAX]; pthread_cond_t sync_cond; pthread_mutex_t sync_mutex; -int sync_var; +int sync_var=-1; +pthread_mutex_t subframe_mutex; +int subframe_eNB_mask=0,subframe_UE_mask=0; openair0_config_t openair0_cfg[MAX_CARDS]; uint32_t downlink_frequency[MAX_NUM_CCs][4]; @@ -451,6 +453,10 @@ typedef enum l2l1_task_state_e { l2l1_task_state_t l2l1_state = L2L1_WAITTING; +extern openair0_timestamp current_eNB_rx_timestamp[NUMBER_OF_eNB_MAX][MAX_NUM_CCs]; +extern openair0_timestamp current_UE_rx_timestamp[NUMBER_OF_UE_MAX][MAX_NUM_CCs]; + + /*------------------------------------------------------------------------------*/ void * l2l1_task (void *args_p) @@ -719,6 +725,40 @@ l2l1_task (void *args_p) clear_eNB_transport_info (oai_emulation.info.nb_enb_local); + CC_id=0; + int all_done=0; + while (all_done==0) { + pthread_mutex_lock(&subframe_mutex); + int subframe_eNB_mask_local = subframe_eNB_mask; + int subframe_UE_mask_local = subframe_UE_mask; + pthread_mutex_unlock(&subframe_mutex); + LOG_D(EMU,"Frame %d, Subframe %d: Checking masks %x,%x\n",frame,sf,subframe_eNB_mask,subframe_UE_mask); + if ((subframe_eNB_mask_local == ((1<frame_parms.samples_per_tti; + } + for (UE_inst = 0; UE_instframe_parms.samples_per_tti; + } + + for (eNB_inst = oai_emulation.info.first_enb_local; (eNB_inst < (oai_emulation.info.first_enb_local @@ -727,6 +767,7 @@ l2l1_task (void *args_p) if (oai_emulation.info.cli_start_enb[eNB_inst] != 0) { T(T_ENB_MASTER_TICK, T_INT(eNB_inst), T_INT(frame % 1024), T_INT(sf)); + /* LOG_D(EMU, "PHY procedures eNB %d for frame %d, subframe %d TDD %d/%d Nid_cell %d\n", eNB_inst, @@ -736,7 +777,7 @@ l2l1_task (void *args_p) PHY_vars_eNB_g[eNB_inst][0]->frame_parms.tdd_config, PHY_vars_eNB_g[eNB_inst][0]->frame_parms.Nid_cell); - + */ #ifdef OPENAIR2 //Application: traffic gen update_otg_eNB (eNB_inst, oai_emulation.info.time_ms); @@ -744,35 +785,8 @@ l2l1_task (void *args_p) //IP/OTG to PDCP and PDCP to IP operation // pdcp_run (frame, 1, 0, eNB_inst); //PHY_vars_eNB_g[eNB_id]->Mod_id #endif + - CC_id=0; - // trigger synch event to RAN FH thread for CC_id - eNB_proc_t *proc = &PHY_vars_eNB_g[eNB_inst][CC_id]->proc; - - - if (pthread_mutex_lock(&proc->mutex_FH) != 0) { - LOG_E( PHY, "error locking mutex for FH\n"); - exit_fun( "error locking mutex" ); - break; - } - int cnt_FH = ++proc->instance_cnt_FH; - proc->frame_rx = frame; - proc->subframe_rx = sf; - proc->timestamp_rx += PHY_vars_eNB_g[eNB_inst][CC_id]->frame_parms.samples_per_tti; - pthread_mutex_unlock( &proc->mutex_FH ); - - if (cnt_FH == 0) { - if (pthread_cond_signal(&proc->cond_FH) != 0) { - LOG_E(PHY,"ERROR pthread_cond_signal for eNB FH CCid %d\n",proc->CC_id); - exit_fun("ERROR pthread_cond_signal"); - break; - } - } - else { - LOG_W(PHY,"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_FH %d)\n",proc->instance_cnt_FH); - exit_fun("FH thread busy"); - break; - } #ifdef PRINT_STATS if((sf==9) && frame%10==0) @@ -1099,6 +1113,10 @@ main (int argc, char **argv) sinr_dB = -20; } + pthread_cond_init(&sync_cond,NULL); + pthread_mutex_init(&sync_mutex, NULL); + pthread_mutex_init(&subframe_mutex, NULL); + #ifdef OPENAIR2 init_omv (); #endif @@ -1116,6 +1134,15 @@ main (int argc, char **argv) init_openair2 (); init_ocm (); + + // wait for all threads to startup + sleep(3); + printf("Sending sync to all threads\n"); + + pthread_mutex_lock(&sync_mutex); + sync_var=0; + pthread_cond_broadcast(&sync_cond); + pthread_mutex_unlock(&sync_mutex); #ifdef SMBV // Rohde&Schwarz SMBV100A vector signal generator diff --git a/targets/SIMU/USER/oaisim_config.c b/targets/SIMU/USER/oaisim_config.c index 51a5a03eac..a470558c27 100644 --- a/targets/SIMU/USER/oaisim_config.c +++ b/targets/SIMU/USER/oaisim_config.c @@ -456,7 +456,7 @@ int olg_config(void) set_comp_log(PHY, LOG_TRACE, 0x15, 1); set_comp_log(PDCP, LOG_DEBUG, 0x15,1); set_comp_log(RRC, LOG_DEBUG, 0x15,1); - set_comp_log(OCM, LOG_ERR, 0x15,20); + set_comp_log(OCM, LOG_DEBUG, 0x15,20); set_comp_log(OTG, LOG_DEBUG, 0x15,1); set_comp_log(OMG, LOG_NOTICE, 0x15,1); set_comp_log(OPT, LOG_ERR, 0x15,1); diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 7a5c36b45d..f6cb9fcb04 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -957,6 +957,11 @@ void init_seed(uint8_t set_seed) } } +openair0_timestamp current_eNB_rx_timestamp[NUMBER_OF_eNB_MAX][MAX_NUM_CCs]; +openair0_timestamp current_UE_rx_timestamp[NUMBER_OF_UE_MAX][MAX_NUM_CCs]; +openair0_timestamp last_eNB_rx_timestamp[NUMBER_OF_eNB_MAX][MAX_NUM_CCs]; +openair0_timestamp last_UE_rx_timestamp[NUMBER_OF_UE_MAX][MAX_NUM_CCs]; + int eNB_trx_start(openair0_device *device) { return(0); } @@ -990,42 +995,44 @@ int UE_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) { return(0); } +extern pthread_mutex_t subframe_mutex; +extern int subframe_eNB_mask,subframe_UE_mask; + int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { - return(0); -} - -int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { - return(0); -} - -int eNB_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { int eNB_id = device->Mod_id; int CC_id = device->CC_id; - int UE_id; - int subframe = (timestamp/PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti)%10; - for (UE_id=0;UE_id<=NB_UE_INST;UE_id++) { - do_DL_sig(eNB2UE, - enb_data, - ue_data, - subframe, - 0, //abstraction_flag, - &PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms, - UE_id, - CC_id); - } - return(0); -} + int subframe; + int ready_for_new_subframe=0; + int subframe_eNB_mask_local; + int sample_count=0; -int UE_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + *ptimestamp = last_eNB_rx_timestamp[eNB_id][CC_id]; - int UE_id = device->Mod_id; - int CC_id = device->CC_id; - int eNB_id; - int subframe = (timestamp/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10; + LOG_D(PHY,"eNB_trx_read nsamps %d TS(%llu,%llu) => subframe %d\n",nsamps, + (unsigned long long)current_eNB_rx_timestamp[eNB_id][CC_id], + (unsigned long long)last_eNB_rx_timestamp[eNB_id][CC_id], + (*ptimestamp/PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti)%10); + // if we're at a subframe boundary generate UL signals for this eNB - for (eNB_id=0;eNB_id<=NB_eNB_INST;eNB_id++) { + while (sample_countframe_parms.samples_per_tti)%10; + LOG_D(PHY,"eNB_trx_read generating UL subframe %d (Ts %llu, current TS %llu)\n", + subframe,(unsigned long long)*ptimestamp, + (unsigned long long)current_eNB_rx_timestamp[eNB_id][CC_id]); + do_UL_sig(UE2eNB, enb_data, ue_data, @@ -1035,8 +1042,87 @@ int UE_trx_write(openair0_device *device,openair0_timestamp timestamp, void **bu 0, // frame is only used for abstraction eNB_id, CC_id); + + + last_eNB_rx_timestamp[eNB_id][CC_id] += PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti; + sample_count += PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti; } - return(0); + + return(nsamps); +} + +int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + + int UE_id = device->Mod_id; + int CC_id = device->CC_id; + int subframe; + int ready_for_new_subframe=0; + int subframe_UE_mask_local; + int sample_count=0; + int read_size; + + *ptimestamp = last_UE_rx_timestamp[UE_id][CC_id]; + + LOG_D(PHY,"UE_trx_read nsamps %d TS(%llu,%llu)\n",nsamps, + (unsigned long long)current_UE_rx_timestamp[UE_id][CC_id], + (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id]); + + if (nsamps < PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti) + read_size = nsamps; + else + read_size = PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti; + + while (sample_countframe_parms.samples_per_tti)%10; + if ((last_UE_rx_timestamp[UE_id][CC_id]%PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti) > 0) + subframe++; + + last_UE_rx_timestamp[UE_id][CC_id] += read_size; + sample_count += read_size; + + if (subframe > 9) + return(nsamps); + + LOG_D(PHY,"UE_trx_read generating DL subframe %d (Ts %llu, current TS %llu)\n", + subframe,(unsigned long long)*ptimestamp, + (unsigned long long)current_UE_rx_timestamp[UE_id][CC_id]); + do_DL_sig(eNB2UE, + enb_data, + ue_data, + subframe, + 0, //abstraction_flag, + &PHY_vars_UE_g[UE_id][CC_id]->frame_parms, + UE_id, + CC_id); + } + + return(nsamps); +} + +int eNB_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + return(nsamps); +} + +int UE_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + return(nsamps); } void init_devices(void){ @@ -1055,8 +1141,10 @@ void init_devices(void){ PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_stop_func = eNB_trx_stop; PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_set_freq_func = eNB_trx_set_freq; PHY_vars_eNB_g[eNB_id][CC_id]->rfdevice.trx_set_gains_func = eNB_trx_set_gains; + current_eNB_rx_timestamp[eNB_id][CC_id] = PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti; + last_eNB_rx_timestamp[eNB_id][CC_id] = 0; } - for (UE_id=0;UE_idrfdevice.Mod_id = UE_id; PHY_vars_UE_g[UE_id][CC_id]->rfdevice.CC_id = CC_id; PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_start_func = UE_trx_start; @@ -1066,6 +1154,9 @@ void init_devices(void){ PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_stop_func = UE_trx_stop; PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_set_freq_func = UE_trx_set_freq; PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_set_gains_func = UE_trx_set_gains; + current_UE_rx_timestamp[UE_id][CC_id] = PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti; + last_UE_rx_timestamp[UE_id][CC_id] = 0; + } } } @@ -1123,7 +1214,11 @@ void init_openair1(void) //N_TA_offset for (CC_id=0; CC_iduse_ia_receiver = 0; + + PHY_vars_UE_g[UE_id][CC_id]->use_ia_receiver = 0; + PHY_vars_UE_g[UE_id][CC_id]->mode = normal_txrx; + PHY_vars_UE_g[UE_id][CC_id]->mac_enabled = 1; + PHY_vars_UE_g[UE_id][CC_id]->no_timing_correction = 1; if (PHY_vars_UE_g[UE_id][CC_id]->frame_parms.frame_type == TDD) { if (PHY_vars_UE_g[UE_id][CC_id]->frame_parms.N_RB_DL == 100) @@ -1396,7 +1491,7 @@ void update_ocm() enb_data[eNB_id]->tx_power_dBm = PHY_vars_eNB_g[eNB_id][0]->frame_parms.pdsch_config_common.referenceSignalPower; for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) - ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id][0]->tx_power_dBm; + ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id][0]->tx_power_dBm[0]; /* check if the openair channel model is activated used for PHY abstraction : path loss*/ @@ -1450,10 +1545,10 @@ void update_ocm() UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.pdsch_config_common.referenceSignalPower; } - LOG_I(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",eNB_id,UE_id,CC_id, + LOG_D(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",eNB_id,UE_id,CC_id, eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB, PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.pdsch_config_common.referenceSignalPower,snr_dB); - // printf("[SIM] Path loss from UE %d to eNB %d => %f dB\n",UE_id,eNB_id,UE2eNB[UE_id][eNB_id]->path_loss_dB); + } } } @@ -1721,3 +1816,14 @@ void init_time() td_avg = TARGET_SF_TIME_NS; } +int openair0_transport_load(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params) { + + return(0); + + +} + +int openair0_device_load(openair0_device *device, openair0_config_t *openair0_cfg) { + + return(0); +} From 9116065678834b0243418fcca308225ea93a985b Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 25 Aug 2016 14:14:35 +0200 Subject: [PATCH 191/340] minor fix to usrp timing logging --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 40 +++++++++++--------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index f2cc289ed7..f9c2309ab8 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -46,6 +46,7 @@ #include #include #include +#include "UTIL/LOG/log_extern.h" #include "common_lib.h" #ifdef __SSE4_1__ # include @@ -213,9 +214,11 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, time_avg= time_diff; else time_avg=(time_diff+time_avg) /2.0; - - if ( loop%10000 ==0) - printf("\n usrp_write: min(ns)=%d, max(ns)=%d, avg(ns)=%d", (int)time_min, (int)time_max,(int)time_avg); + + //prints statics of uhd every 10 seconds + if ( loop % (10 * ((int)device->openair0_cfg[0].sample_rate /(int)nsamps )) ==0) + LOG_I(HW,"usrp_write: min(ns)=%d, max(ns)=%d, avg(ns)=%d\n", (int)time_min, (int)time_max,(int)time_avg); + loop++; return ret; } @@ -318,20 +321,23 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); *ptimestamp = s->rx_timestamp; - clock_gettime(CLOCK_MONOTONIC_RAW, &tp_end); - time_diff = (tp_end.tv_sec - tp_start.tv_sec) *1E09 + (tp_end.tv_nsec - tp_start.tv_nsec); - if (time_min==0 ||loop==1 || time_min > time_diff) - time_min=time_diff; - if (time_max==0 || loop==1|| time_max < time_diff) - time_max=time_diff; - if (time_avg ==0 ||loop==1) - time_avg= time_diff; - else - time_avg=(time_diff+time_avg) /2.0; - if ( loop % 10000==0) - printf("\n usrp_read: min(ns)=%d, max(ns)=%d, avg(ns)=%d", (int)time_min, (int)time_max,(int)time_avg); - loop++; - return samples_received; + clock_gettime(CLOCK_MONOTONIC_RAW, &tp_end); + time_diff = (tp_end.tv_sec - tp_start.tv_sec) *1E09 + (tp_end.tv_nsec - tp_start.tv_nsec); + if (time_min==0 ||loop==1 || time_min > time_diff) + time_min=time_diff; + if (time_max==0 ||loop==1 || time_max < time_diff) + time_max=time_diff; + if (time_avg ==0 ||loop==1) + time_avg= time_diff; + else + time_avg=(time_diff+time_avg) /2.0; + + //prints statics of uhd every 10 seconds + if ( loop % (10 * ((int)device->openair0_cfg[0].sample_rate /(int)nsamps )) ==0) + LOG_I(HW,"usrp_read: min(ns)=%d, max(ns)=%d, avg(ns)=%d\n", (int)time_min, (int)time_max,(int)time_avg); + + loop++; + return samples_received; } /*! \brief Get current timestamp of USRP From 4f5d818065d5193ce4bf165555c852983755f648 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 25 Aug 2016 18:11:30 +0200 Subject: [PATCH 192/340] minor syntax fix of uespec_procedures --- openair1/SCHED/phy_procedures_lte_ue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 58bbcc8ac0..5c884112fd 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1044,7 +1044,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB ue->tx_total_RE[subframe_tx] = nb_rb*12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(ue->tx_power_dBm[, + tx_amp = get_tx_amp(ue->tx_power_dBm, ue->tx_power_max_dBm, ue->frame_parms.N_RB_UL, nb_rb); From b2635278166f33ac075d98ca09676936ab10d3e9 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 26 Aug 2016 05:18:20 +0200 Subject: [PATCH 193/340] Update .gitlab-ci.yml for manual build --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2a59202686..6f3963db42 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -34,4 +34,4 @@ job1: - sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $NFS_TEST_RESULTS_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$NFS_TEST_RESULTS_DIR - sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $EXTERNAL_SHARE_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$EXTERNAL_SHARE_DIR - cat $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml - + when: manual From 895775e52c3e55ec448dd7b9b37321324ff4378a Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Sat, 27 Aug 2016 21:23:04 +0200 Subject: [PATCH 194/340] revert the amount of mem block to its previous value --- openair2/UTIL/MEM/mem_block.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openair2/UTIL/MEM/mem_block.h b/openair2/UTIL/MEM/mem_block.h index d15d729bdd..01a05a786b 100755 --- a/openair2/UTIL/MEM/mem_block.h +++ b/openair2/UTIL/MEM/mem_block.h @@ -75,7 +75,8 @@ public_mem_block(void check_mem_area (void);) private_mem_block(void check_free_mem_block (mem_block_t * leP);) # endif #ifdef USER_MODE -# define MEM_SCALE MAX_MOBILES_PER_ENB*NB_RB_MAX +//# define MEM_SCALE MAX_MOBILES_PER_ENB*NB_RB_MAX +# define MEM_SCALE MAX_MOBILES_PER_ENB #else # ifdef NODE_RG # define MEM_SCALE 2 From feb361b4d00f693ec5efa85ab349481ebb44d265 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Tue, 30 Aug 2016 11:30:01 +0200 Subject: [PATCH 195/340] update the logging when the pdcp instance is not configured --- openair2/COMMON/platform_types.h | 3 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 11 +++-- openair3/GTPV1-U/gtpv1u_eNB.c | 65 +++++++++++++++++------------ 3 files changed, 45 insertions(+), 34 deletions(-) diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h index 709ecfd9b2..670b191c0b 100755 --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -68,7 +68,6 @@ typedef uint32_t frame_t; typedef int32_t sframe_t; typedef uint32_t sub_frame_t; typedef uint8_t module_id_t; -typedef uint8_t configured_t; typedef uint8_t eNB_index_t; typedef uint16_t ue_id_t; typedef int16_t smodule_id_t; @@ -216,7 +215,7 @@ typedef struct protocol_ctxt_s { frame_t frame; /*!< \brief LTE frame number.*/ sub_frame_t subframe; /*!< \brief LTE sub frame number.*/ eNB_index_t eNB_index; /*!< \brief valid for UE indicating the index of connected eNB(s) */ - configured_t configured; /*!< \brief flag indicating whether the instance is configured or not */ + boolean_t configured; /*!< \brief flag indicating whether the instance is configured or not */ } protocol_ctxt_t; // warning time hardcoded #define PROTOCOL_CTXT_TIME_MILLI_SECONDS(CtXt_h) ((CtXt_h)->frame*10+(CtXt_h)->subframe) diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index e0b993891f..3779adbbc9 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -147,16 +147,15 @@ boolean_t pdcp_data_req( if (h_rc != HASH_TABLE_OK) { if (modeP != PDCP_TRANSMISSION_MODE_TRANSPARENT) { - if ((ctxt_pP->configured == 0) && (ctxt_pP->frame%10 == 0)) - LOG_W(PDCP, PROTOCOL_CTXT_FMT" Instance is not configured for rb_id %d Ignoring SDU...\n", - PROTOCOL_CTXT_ARGS(ctxt_pP), - rb_idP); - ctxt_pP->configured=0; + LOG_W(PDCP, PROTOCOL_CTXT_FMT" Instance is not configured for rb_id %d Ignoring SDU...\n", + PROTOCOL_CTXT_ARGS(ctxt_pP), + rb_idP); + ctxt_pP->configured=FALSE; return FALSE; } }else{ // instance for a given RB is configured - ctxt_pP->configured=1; + ctxt_pP->configured=TRUE; } if (ctxt_pP->enb_flag == ENB_FLAG_NO) { diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c index 9f2475ef37..2a5a124775 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB.c +++ b/openair3/GTPV1-U/gtpv1u_eNB.c @@ -28,7 +28,7 @@ *******************************************************************************/ /*! \file gtpv1u_eNB.c * \brief - * \author Sebastien ROUX, Lionel GAUTHIER + * \author Sebastien ROUX, Lionel GAUTHIER, Navid Nikaein * \version 1.0 * \company Eurecom * \email: lionel.gauthier@eurecom.fr @@ -289,7 +289,7 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( NwGtpv1uUlpHandleT hUlp, NwGtpv1uUlpApiT *pUlpApi) { - int result = 0; + boolean_t result = FALSE; teid_t teid = 0; hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS; gtpv1u_teid_data_t *gtpv1u_teid_data_p = NULL; @@ -335,38 +335,51 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( //#warning "LG eps bearer mapping to DRB id to do (offset -4)" PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, gtpv1u_teid_data_p->enb_id, ENB_FLAG_YES, gtpv1u_teid_data_p->ue_id, 0, 0,gtpv1u_teid_data_p->enb_id); + if (ctxt.configured == TRUE ) { - MSC_LOG_TX_MESSAGE( - MSC_GTPU_ENB, - MSC_PDCP_ENB, - NULL,0, - MSC_AS_TIME_FMT" DATA-REQ rb %u size %u", - 0,0, - (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, - buffer_len); - - result = pdcp_data_req( - &ctxt, - SRB_FLAG_NO, - (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, - 0, // mui - SDU_CONFIRM_NO, // confirm - buffer_len, - buffer, - PDCP_TRANSMISSION_MODE_DATA); - AssertError (result == TRUE, return NW_GTPV1U_FAILURE ,"PDCP data request failed!\n"); + MSC_LOG_TX_MESSAGE( + MSC_GTPU_ENB, + MSC_PDCP_ENB, + NULL,0, + MSC_AS_TIME_FMT" DATA-REQ rb %u size %u", + 0,0, + (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, + buffer_len); + + result = pdcp_data_req( + &ctxt, + SRB_FLAG_NO, + (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, + 0, // mui + SDU_CONFIRM_NO, // confirm + buffer_len, + buffer, + PDCP_TRANSMISSION_MODE_DATA); + } + + if ( result == FALSE ) { + + if (ctxt.configured == FALSE ) + LOG_W(GTPU, "PDCP data request failed, cause: RB is not configured!\n") ; + else + LOG_W(GTPU, "PDCP data request failed\n"); + + return NW_GTPV1U_FAILURE; + } + } else { - LOG_E(GTPU, "Received T-PDU from gtpv1u stack teid %u unknown size %u", teid, buffer_len); + LOG_W(GTPU, "Received T-PDU from gtpv1u stack teid %u unknown size %u", teid, buffer_len); } } - break; - + break; + default: { LOG_E(GTPU, "Received undefined UlpApi (%02x) from gtpv1u stack!\n", pUlpApi->apiType); } - } - + + } // end of switch + return NW_GTPV1U_OK; } From e13155fa01a9d1a1026802dba035671ab42cd845 Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Tue, 30 Aug 2016 12:15:11 +0200 Subject: [PATCH 196/340] refine the gtp/pdcp logging --- openair3/GTPV1-U/gtpv1u_eNB.c | 40 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c index 2a5a124775..397be865a3 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB.c +++ b/openair3/GTPV1-U/gtpv1u_eNB.c @@ -335,27 +335,25 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( //#warning "LG eps bearer mapping to DRB id to do (offset -4)" PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, gtpv1u_teid_data_p->enb_id, ENB_FLAG_YES, gtpv1u_teid_data_p->ue_id, 0, 0,gtpv1u_teid_data_p->enb_id); - if (ctxt.configured == TRUE ) { - - MSC_LOG_TX_MESSAGE( - MSC_GTPU_ENB, - MSC_PDCP_ENB, - NULL,0, - MSC_AS_TIME_FMT" DATA-REQ rb %u size %u", - 0,0, - (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, - buffer_len); - - result = pdcp_data_req( - &ctxt, - SRB_FLAG_NO, - (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, - 0, // mui - SDU_CONFIRM_NO, // confirm - buffer_len, - buffer, - PDCP_TRANSMISSION_MODE_DATA); - } + MSC_LOG_TX_MESSAGE( + MSC_GTPU_ENB, + MSC_PDCP_ENB, + NULL,0, + MSC_AS_TIME_FMT" DATA-REQ rb %u size %u", + 0,0, + (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, + buffer_len); + + result = pdcp_data_req( + &ctxt, + SRB_FLAG_NO, + (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, + 0, // mui + SDU_CONFIRM_NO, // confirm + buffer_len, + buffer, + PDCP_TRANSMISSION_MODE_DATA); + if ( result == FALSE ) { From fc85f44f49859f56666358efbe1a5d09c86f88f8 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 30 Aug 2016 15:26:28 +0200 Subject: [PATCH 197/340] fixed a bug in Alamouti coding (introduced in 7bc37c5696f31f093e9346dbb46586c652c2c45c) --- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index c3ffe90513..0641d69de2 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -361,8 +361,6 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, else if (mimo_mode == ALAMOUTI) { *re_allocated = *re_allocated + 1; - // normalization for 2 tx antennas - amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); switch (mod_order0) { case 2: //QPSK @@ -419,8 +417,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, //((int16_t *)&txdataF[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); //((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - ((int16_t *)&txdataF[0][tti_offset])[0]+=qam_table_s0[qam16_table_offset_re]; - ((int16_t *)&txdataF[0][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im]; + ((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam16_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15; + ((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15; // Antenna 1 position n Real part -> -x1* @@ -450,8 +448,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, //((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); //((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - ((int16_t *)&txdataF[1][tti_offset])[0]+=-qam_table_s0[qam16_table_offset_re]; - ((int16_t *)&txdataF[1][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im]; + ((int16_t *)&txdataF[1][tti_offset])[0]+=-(qam_table_s0[qam16_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15; + ((int16_t *)&txdataF[1][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15; break; @@ -494,8 +492,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, //((int16_t *)&txdataF[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); //((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - ((int16_t *)&txdataF[0][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re]; - ((int16_t *)&txdataF[0][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im]; + ((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam64_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15; + ((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15; // Antenna 1 => -x1* @@ -534,8 +532,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, //((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); //((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - ((int16_t *)&txdataF[1][tti_offset])[0]+=-qam_table_s0[qam64_table_offset_re]; - ((int16_t *)&txdataF[1][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im]; + ((int16_t *)&txdataF[1][tti_offset])[0]+=-(qam_table_s0[qam64_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15; + ((int16_t *)&txdataF[1][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15; break; From cd938bd5c451309571b6d44353f5dd7d9d9867a1 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 30 Aug 2016 15:31:02 +0200 Subject: [PATCH 198/340] pdcch is now filled with dummy data (like it used to be) to enable better estimation of signal energy (also in unitary sims and oaisim) --- openair1/PHY/LTE_TRANSPORT/dci.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 2180e575cf..523dfd4d03 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -2092,10 +2092,10 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, y[1] = &yseq1[0]; // reset all bits to , here we set elements as 2 - memset(e, 2, DCI_BITS_MAX); - // // here we interpret NIL as a random QPSK sequence. That makes power estimation easier. - // for (i=0; i Date: Tue, 30 Aug 2016 15:44:34 +0200 Subject: [PATCH 199/340] blacklisting testcases 015508 015511 (lte-softmodem TM2 20MHz) --- cmake_targets/autotests/test_case_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 8dfbc60a9b..9e0d53d6ea 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010304 010305 0104+ 015502 015505 015514 015517 015602 015605 015702 015705 015802 015805 015808 015811 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 + 010141 0102+ 010304 010305 0104+ 015502 015505 015508 015511 015514 015517 015602 015605 015702 015705 015802 015805 015808 015811 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 3 mozart hutch starsky stevens amerique calisson From f8804fcbacbb0434411a30f463971991e42997ad Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 30 Aug 2016 17:17:44 +0200 Subject: [PATCH 200/340] fix max throughput for TM2 tests --- cmake_targets/autotests/test_case_list.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 9e0d53d6ea..f042ed6971 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1415,7 +1415,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue;$OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s @@ -1489,7 +1489,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue;$OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s @@ -1548,7 +1548,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf + -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf @@ -1563,7 +1563,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 28Mbits/s @@ -1658,7 +1658,7 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 16Mbits/s False @@ -1732,7 +1732,7 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s -i 1 -f m False From 09435e66c9a394dd2f15846841ce2bff361abf4d Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 31 Aug 2016 00:36:53 +0200 Subject: [PATCH 201/340] fixes for TM1/TM2 config files --- .../CONF/enb.band7.tm1.100PRB.usrpb210.conf | 3 +- .../CONF/enb.band7.tm1.100PRB.usrpx310.conf | 2 + .../CONF/enb.band7.tm2.100PRB.usrpb210.conf | 174 ++++++++++++++++++ .../CONF/enb.band7.tm2.100PRB.usrpx310.conf | 171 +++++++++++++++++ .../CONF/enb.band7.tm2.usrpb210.conf | 174 ++++++++++++++++++ .../CONF/enb.band7.tm2.usrpx310.conf | 172 +++++++++++++++++ 6 files changed, 695 insertions(+), 1 deletion(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index 7d34889f67..133e6ce3b0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -33,6 +33,7 @@ eNBs = Nid_cell = 0; N_RB_DL = 100; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -46,7 +47,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; + pdsch_referenceSignalPower = -32; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf index 210c7ea740..baf1725cfa 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf @@ -32,6 +32,7 @@ eNBs = Nid_cell = 0; N_RB_DL = 100; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 32; @@ -96,6 +97,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf new file mode 100644 index 0000000000..ba753fb6f3 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf @@ -0,0 +1,174 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "94"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2680000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 2; + nb_antennas_tx = 2; + nb_antennas_rx = 2; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -32; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 2; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.171"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.150/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.150/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf new file mode 100644 index 0000000000..1954662a10 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf @@ -0,0 +1,171 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 2; + nb_antennas_tx = 2; + nb_antennas_rx = 2; + tx_gain = 32; + rx_gain = 116; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -23; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -108; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 2; + ue_TransmissionMode = 2; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf new file mode 100644 index 0000000000..7941441d1d --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -0,0 +1,174 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "94"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2680000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 2; + nb_antennas_tx = 2; + nb_antennas_rx = 2; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -26; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 2; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.171"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.150/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.150/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf new file mode 100644 index 0000000000..f4296c9c61 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf @@ -0,0 +1,172 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 2; + nb_antennas_tx = 2; + nb_antennas_rx = 2; + tx_gain = 32; + rx_gain = 116; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -16; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -108; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 2; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); From 55c83b00f92ee9937604cfd98da3f23487f43d32 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 31 Aug 2016 11:26:16 +0200 Subject: [PATCH 202/340] hotfix: bug in rx_pucch This hotfix does not change the processing at all. At this point, stat_re == 0, so the behavior is the same as before. But the code was wrong. There should have been no test, it's a NACK, period. --- openair1/PHY/LTE_TRANSPORT/pucch.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 88ce57b930..82ad9ab00f 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -1052,12 +1052,11 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, if (fmt==pucch_format1b) *(1+payload) = (stat_im<0) ? 1 : 0; } else { // insufficient energy on PUCCH so NAK - *payload = 0; ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re); ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im); phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; - *payload = (stat_re<0) ? 1 : 0; + *payload = 0; if (fmt==pucch_format1b) *(1+payload) = 0; From c8e7e5900fba354a17714614fc3e83c25c40fa3b Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 30 Aug 2016 15:59:24 +0200 Subject: [PATCH 203/340] enabling deadline scheduler by default for EXMIMO2 --- cmake_targets/build_oai | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 935c57f0f1..625e2fcf5e 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -333,7 +333,7 @@ function main() { #By default: EXMIMO: enable if [ "$FORCE_DEADLINE_SCHEDULER_FLAG_USER" = "" ]; then if [ "$HW" = "EXMIMO" ] ; then - DEADLINE_SCHEDULER_FLAG_USER="False" + DEADLINE_SCHEDULER_FLAG_USER="True" elif [ "$HW" = "ETHERNET" ] ; then DEADLINE_SCHEDULER_FLAG_USER="True" elif [ "$HW" = "OAI_USRP" ] ; then From 5fc1f3e56faf8ffe05a05e239b3663d4602c5851 Mon Sep 17 00:00:00 2001 From: Xiwen JIANG Date: Tue, 30 Aug 2016 17:11:39 +0200 Subject: [PATCH 204/340] libboost_system is only linked for USRP target now (was causing problems for EXMIMO2 target) --- cmake_targets/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c9377c0fb3..e9bd7197c8 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -556,7 +556,7 @@ elseif (${RF_BOARD} STREQUAL "OAI_USRP") set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp) LINK_DIRECTORIES("/opt/lib") - set(option_HW_lib "-luhd -rdynamic -ldl") + set(option_HW_lib "-luhd -rdynamic -ldl -lboost_system") elseif (${RF_BOARD} STREQUAL "OAI_BLADERF") include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/") @@ -1641,7 +1641,6 @@ target_link_libraries (lte-softmodem -ldl target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) -target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES} -lboost_system) #Added manually as it is not found for some reason for USRP target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (lte-softmodem ${T_LIB}) @@ -1677,7 +1676,6 @@ target_link_libraries (lte-softmodem-nos1 target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES}) target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) -target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES} -lboost_system) #Added manually as it is not found for some reason for USRP target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES}) target_link_libraries (lte-softmodem-nos1 ${T_LIB}) @@ -1700,7 +1698,7 @@ target_link_libraries(rrh_gw UTIL LFDS -Wl,--end-group ) target_link_libraries (rrh_gw rt pthread m ) -target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} -lboost_system ) #Added manually as it is not found for some reason for USRP +target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib}) target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES}) target_link_libraries (rrh_gw ${T_LIB}) From 12e9b05abcc26cc7b2a7a1ed7a113c1f5c92454e Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 31 Aug 2016 11:08:37 -0700 Subject: [PATCH 205/340] change in a comment --- targets/RT/USER/lte-enb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index a7a0314bdc..9d4b0f1aeb 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1076,8 +1076,8 @@ int wakeup_rxtx(eNB_proc_t *proc,eNB_rxtx_proc_t *proc_rxtx,LTE_DL_FRAME_PARMS * // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired // transmitted timestamp of the next TX slot (first). // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, - // we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti, - // and proc->subframe_tx = proc->subframe_rx+3 + // we want to generate subframe (n+4), so TS_tx = TX_rx+4*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+4 proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); proc_rxtx->frame_rx = proc->frame_rx; proc_rxtx->subframe_rx = proc->subframe_rx; From 85e562d0b910070ff9519637961e309b5872a2a9 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Thu, 1 Sep 2016 12:18:19 +0200 Subject: [PATCH 206/340] hotfix: fix a silly bug --- openair2/LAYER2/MAC/eNB_scheduler_primitives.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index bb9e7b3d30..54eedb4926 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -75,7 +75,7 @@ void init_ue_sched_info(void) module_id_t i,j,k; for (i=0; i Date: Thu, 1 Sep 2016 03:47:51 -0700 Subject: [PATCH 207/340] RCC configuration files for IF4p5 --- .../CONF/rcc.band7.tm1.100PRB.if4p5.conf | 191 ++++++++++++++++++ .../CONF/rcc.band7.tm1.50PRB.if4p5.conf | 191 ++++++++++++++++++ 2 files changed, 382 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.100PRB.if4p5.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.100PRB.if4p5.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.100PRB.if4p5.conf new file mode 100644 index 0000000000..d97dc0c002 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.100PRB.if4p5.conf @@ -0,0 +1,191 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "74:d4:35:cc:8d:15"; + local_address = "34:e6:d7:3c:ae:fc"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); + diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf new file mode 100644 index 0000000000..b264993dd4 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5.conf @@ -0,0 +1,191 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "74:d4:35:cc:8d:15"; + local_address = "34:e6:d7:3c:ae:fc"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); + From a8fb38f40de59e85abd4c0520d465f5a619b663f Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Fri, 2 Sep 2016 13:18:47 +0530 Subject: [PATCH 208/340] fix prach packet in if4p5 UDP --- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index 863b0d02d2..11aa8ed9ba 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -208,7 +208,9 @@ int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestam if (flags == IF4p5_PDLFFT) { packet_size = UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks); } else if (flags == IF4p5_PULFFT) { - packet_size = UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks); + packet_size = UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PRACH) { + packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; } else { printf("trx_eth_write_udp_IF4p5: unknown flags %d\n",flags); return(-1); From e8e940229423bbc9159099e6cc23b54f3da56698 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 3 Sep 2016 17:45:08 +0200 Subject: [PATCH 209/340] small changes for 20 MHz real-time operation --- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 3 +++ .../CONF/enb.band7.tm1.100PRB.usrpb210.conf | 2 +- targets/RT/USER/eNB_usrp.gtkw | 21 ++++++++++++------- targets/RT/USER/lte-enb.c | 4 ++-- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index dbe06ea6ba..2f578d9cc1 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -6221,6 +6221,9 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, if (dci_format == format0) { + if (!ulsch) + return -1; + if (rnti == ra_rnti) harq_pid = 0; else diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index 8144147ea5..10da79724a 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -31,7 +31,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2645000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; diff --git a/targets/RT/USER/eNB_usrp.gtkw b/targets/RT/USER/eNB_usrp.gtkw index 44401bd25e..47f505031e 100644 --- a/targets/RT/USER/eNB_usrp.gtkw +++ b/targets/RT/USER/eNB_usrp.gtkw @@ -1,19 +1,19 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Sun Jul 24 14:21:37 2016 +[*] Wed Aug 31 12:37:04 2016 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Sun Jul 24 14:18:00 2016" -[dumpfile_size] 7104337 +[dumpfile_mtime] "Wed Aug 31 11:48:14 2016" +[dumpfile_size] 411905827 [savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw" [timestart] 10621768000 -[size] 1535 724 +[size] 1236 578 [pos] 309 0 *-19.793451 29026062100 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -[sst_width] 284 +[sst_width] 386 [signals_width] 262 [sst_expanded] 1 -[sst_vpaned_height] 294 +[sst_vpaned_height] 146 @28 functions.trx_read functions.trx_write @@ -28,14 +28,21 @@ variables.subframe_number_RX0_eNB[63:0] variables.frame_number_TX0_eNB[63:0] variables.subframe_number_TX0_eNB[63:0] @28 +functions.phy_procedures_eNb_rx_common0 +functions.phy_procedures_eNb_rx_uespec0 +functions.phy_procedures_eNb_tx0 functions.eNB_thread_rxtx1 @24 variables.frame_number_RX1_eNB[63:0] variables.subframe_number_RX1_eNB[63:0] variables.frame_number_TX1_eNB[63:0] -@25 variables.subframe_number_TX1_eNB[63:0] @28 +functions.phy_procedures_eNb_rx_common1 +functions.phy_procedures_eNb_rx_uespec1 +@29 +functions.phy_procedures_eNb_tx1 +@28 functions.phy_enb_sfgen functions.phy_eNB_slot_fep functions.phy_enb_prach_rx diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index a7a0314bdc..9f2a108f5b 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -191,7 +191,7 @@ static inline void thread_top_init(char *thread_name, exit_fun("Error setting deadline scheduler"); } - LOG_I( HW, "[SCHED] eNB %s deadline thread (TID %ld) started on CPU %d\n", gettid(), thread_name,sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB %s deadline thread started on CPU %d\n", thread_name,sched_getcpu() ); #else //LOW_LATENCY int policy, s, j; @@ -880,7 +880,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; unsigned int rxs,txs; int i; - int tx_sfoffset = (eNB->single_thread_flag == 1) ? 3 : 3; + int tx_sfoffset = 2;//(eNB->single_thread_flag == 1) ? 3 : 3; if (proc->first_rx==0) { // Transmit TX buffer based on timestamp from RX From a205844d77e774fe803614c4c06d99c438a7cffb Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 3 Sep 2016 08:49:14 -0700 Subject: [PATCH 210/340] addition of paging in UE, modifications for dlsim --- cmake_targets/CMakeLists.txt | 1 + openair1/PHY/INIT/lte_init.c | 662 +++++++++++------------ openair1/PHY/LTE_TRANSPORT/dci.c | 68 ++- openair1/PHY/LTE_TRANSPORT/defs.h | 1 + openair1/PHY/LTE_TRANSPORT/proto.h | 8 + openair1/PHY/defs.h | 37 +- openair1/SCHED/phy_procedures_lte_ue.c | 82 +++ openair1/SIMULATION/LTE_PHY/dlsim.c | 698 +------------------------ openair2/LAYER2/MAC/defs.h | 9 + openair2/LAYER2/MAC/main.c | 1 + openair2/LAYER2/MAC/proto.h | 2 + openair2/LAYER2/MAC/ue_procedures.c | 35 ++ openair2/PHY_INTERFACE/defs.h | 3 + openair2/RRC/LITE/L2_interface.c | 4 + openair2/RRC/LITE/proto.h | 6 + openair2/RRC/LITE/rrc_UE.c | 34 ++ openair2/UTIL/LOG/vcd_signal_dumper.c | 1 + openair2/UTIL/LOG/vcd_signal_dumper.h | 1 + 18 files changed, 583 insertions(+), 1070 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index a83bce5e8b..e1396b6398 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -960,6 +960,7 @@ set(PHY_SRC ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pch.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/srs_modulation.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/drs_modulation.c diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 259a7ba77a..67d30bbb15 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -26,9 +26,6 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE *******************************************************************************/ -#ifdef EXMIMO -#include "openair0_lib.h" -#endif #include "defs.h" #include "SCHED/defs.h" #include "PHY/extern.h" @@ -48,7 +45,7 @@ extern uint16_t prach_root_sequence_map4[138]; uint8_t dmrs1_tab[8] = {0,2,3,4,6,8,9,10}; // FIXME not used anywhere -void phy_config_mib(LTE_DL_FRAME_PARMS *frame_parms, +void phy_config_mib(LTE_DL_FRAME_PARMS *fp, uint8_t N_RB_DL, uint8_t Nid_cell, uint8_t Ncp, @@ -57,14 +54,14 @@ void phy_config_mib(LTE_DL_FRAME_PARMS *frame_parms, PHICH_CONFIG_COMMON *phich_config) { - frame_parms->N_RB_DL = N_RB_DL; - frame_parms->Nid_cell = Nid_cell; - frame_parms->nushift = Nid_cell%6; - frame_parms->Ncp = Ncp; - frame_parms->frame_type = frame_type; - frame_parms->nb_antennas_tx_eNB = p_eNB; - frame_parms->phich_config_common.phich_resource = phich_config->phich_resource; - frame_parms->phich_config_common.phich_duration = phich_config->phich_duration; + fp->N_RB_DL = N_RB_DL; + fp->Nid_cell = Nid_cell; + fp->nushift = Nid_cell%6; + fp->Ncp = Ncp; + fp->frame_type = frame_type; + fp->nb_antennas_tx_eNB = p_eNB; + fp->phich_config_common.phich_resource = phich_config->phich_resource; + fp->phich_config_common.phich_duration = phich_config->phich_duration; } void phy_config_sib1_eNB(uint8_t Mod_id, @@ -74,15 +71,15 @@ void phy_config_sib1_eNB(uint8_t Mod_id, uint16_t SIPeriod) { - LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; + LTE_DL_FRAME_PARMS *fp = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; if (tdd_Config) { - frame_parms->tdd_config = tdd_Config->subframeAssignment; - frame_parms->tdd_config_S = tdd_Config->specialSubframePatterns; + fp->tdd_config = tdd_Config->subframeAssignment; + fp->tdd_config_S = tdd_Config->specialSubframePatterns; } - frame_parms->SIwindowsize = SIwindowsize; - frame_parms->SIPeriod = SIPeriod; + fp->SIwindowsize = SIwindowsize; + fp->SIPeriod = SIPeriod; } void phy_config_sib1_ue(uint8_t Mod_id,int CC_id, @@ -92,15 +89,15 @@ void phy_config_sib1_ue(uint8_t Mod_id,int CC_id, uint16_t SIperiod) { - LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; + LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; if (tdd_Config) { - frame_parms->tdd_config = tdd_Config->subframeAssignment; - frame_parms->tdd_config_S = tdd_Config->specialSubframePatterns; + fp->tdd_config = tdd_Config->subframeAssignment; + fp->tdd_config_S = tdd_Config->specialSubframePatterns; } - frame_parms->SIwindowsize = SIwindowsize; - frame_parms->SIPeriod = SIperiod; + fp->SIwindowsize = SIwindowsize; + fp->SIPeriod = SIperiod; } void phy_config_sib2_eNB(uint8_t Mod_id, @@ -112,132 +109,132 @@ void phy_config_sib2_eNB(uint8_t Mod_id, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList) { - LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; + LTE_DL_FRAME_PARMS *fp = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; //LTE_eNB_UE_stats *eNB_UE_stats = PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats; //int32_t rx_total_gain_eNB_dB = PHY_vars_eNB_g[Mod_id][CC_id]->rx_total_gain_eNB_dB; int i; LOG_D(PHY,"[eNB%d] CCid %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id); - frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",frame_parms->prach_config_common.rootSequenceIndex ); + fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; + LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",fp->prach_config_common.rootSequenceIndex ); - frame_parms->prach_config_common.prach_Config_enabled=1; + fp->prach_config_common.prach_Config_enabled=1; - frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_ConfigIndex = %d\n",frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_ConfigIndex = %d\n",fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); - frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.highSpeedFlag = %d\n",frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag); - frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig); - frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset); - compute_prach_seq(&frame_parms->prach_config_common,frame_parms->frame_type, + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.highSpeedFlag = %d\n",fp->prach_config_common.prach_ConfigInfo.highSpeedFlag); + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig); + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset); + compute_prach_seq(&fp->prach_config_common,fp->frame_type, PHY_vars_eNB_g[Mod_id][CC_id]->X_u); - frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; - frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; - frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; - frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; + fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; + fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; + fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; + fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; - frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; - frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; + fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; + fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; - frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - LOG_D(PHY,"pusch_config_common.n_SB = %d\n",frame_parms->pusch_config_common.n_SB ); + fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + LOG_D(PHY,"pusch_config_common.n_SB = %d\n",fp->pusch_config_common.n_SB ); - frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - LOG_D(PHY,"pusch_config_common.hoppingMode = %d\n",frame_parms->pusch_config_common.hoppingMode); + fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + LOG_D(PHY,"pusch_config_common.hoppingMode = %d\n",fp->pusch_config_common.hoppingMode); - frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - LOG_D(PHY,"pusch_config_common.pusch_HoppingOffset = %d\n",frame_parms->pusch_config_common.pusch_HoppingOffset); + fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + LOG_D(PHY,"pusch_config_common.pusch_HoppingOffset = %d\n",fp->pusch_config_common.pusch_HoppingOffset); - frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - LOG_D(PHY,"pusch_config_common.enable64QAM = %d\n",frame_parms->pusch_config_common.enable64QAM ); + fp->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + LOG_D(PHY,"pusch_config_common.enable64QAM = %d\n",fp->pusch_config_common.enable64QAM ); - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift); - init_ul_hopping(frame_parms); + init_ul_hopping(fp); - frame_parms->soundingrs_ul_config_common.enabled_flag = 0; + fp->soundingrs_ul_config_common.enabled_flag = 0; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) { - frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; - frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; - frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; + fp->soundingrs_ul_config_common.enabled_flag = 1; + fp->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; + fp->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; + fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) - frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; + fp->soundingrs_ul_config_common.srs_MaxUpPts = 1; else - frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; + fp->soundingrs_ul_config_common.srs_MaxUpPts = 0; } - frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; - frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; - frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; - frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; + fp->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; + fp->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; + fp->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; + fp->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; - frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; + fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; // Now configure some of the Physical Channels // PUCCH - init_ncs_cell(frame_parms,PHY_vars_eNB_g[Mod_id][CC_id]->ncs_cell); + init_ncs_cell(fp,PHY_vars_eNB_g[Mod_id][CC_id]->ncs_cell); - init_ul_hopping(frame_parms); + init_ul_hopping(fp); // MBSFN if (mbsfn_SubframeConfigList != NULL) { - frame_parms->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; + fp->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; for (i=0; ilist.count; i++) { - frame_parms->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; - frame_parms->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; + fp->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; + fp->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { - frame_parms->MBSFN_config[i].fourFrames_flag = 0; - frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration + fp->MBSFN_config[i].fourFrames_flag = 0; + fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + fp->MBSFN_config[i].mbsfn_SubframeConfig); } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration - frame_parms->MBSFN_config[i].fourFrames_flag = 1; - frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = + fp->MBSFN_config[i].fourFrames_flag = 1; + fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + fp->MBSFN_config[i].mbsfn_SubframeConfig); } } } else - frame_parms->num_MBSFN_config = 0; + fp->num_MBSFN_config = 0; } @@ -250,106 +247,109 @@ void phy_config_sib2_ue(uint8_t Mod_id,int CC_id, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList) { - LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; + LTE_DL_FRAME_PARMS *fp = &ue->frame_parms; int i; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_IN); LOG_I(PHY,"[UE%d] Applying radioResourceConfigCommon from eNB%d\n",Mod_id,CH_index); - frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; + fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - frame_parms->prach_config_common.prach_Config_enabled=1; - frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; - frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; - frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; - frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; + fp->prach_config_common.prach_Config_enabled=1; + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; - compute_prach_seq(&frame_parms->prach_config_common,frame_parms->frame_type,PHY_vars_UE_g[Mod_id][CC_id]->X_u); + compute_prach_seq(&fp->prach_config_common,fp->frame_type,ue->X_u); - frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; - frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; - frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; - frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; + fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; + fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; + fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; + fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; - frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; - frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; + fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; + fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; - frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; + fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + fp->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; - init_ul_hopping(frame_parms); - frame_parms->soundingrs_ul_config_common.enabled_flag = 0; + init_ul_hopping(fp); + fp->soundingrs_ul_config_common.enabled_flag = 0; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) { - frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; - frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; - frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; + fp->soundingrs_ul_config_common.enabled_flag = 1; + fp->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; + fp->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; + fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) - frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; + fp->soundingrs_ul_config_common.srs_MaxUpPts = 1; else - frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; + fp->soundingrs_ul_config_common.srs_MaxUpPts = 0; } - frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; - frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; - frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; - frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; + fp->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; + fp->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; + fp->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; + fp->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; - frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; + fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; // Now configure some of the Physical Channels // PUCCH - init_ncs_cell(frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); + init_ncs_cell(fp,ue->ncs_cell); - init_ul_hopping(frame_parms); + init_ul_hopping(fp); + // PCH + init_ue_paging_info(ue,radioResourceConfigCommon->pcch_Config.defaultPagingCycle,radioResourceConfigCommon->pcch_Config.nB); // MBSFN if (mbsfn_SubframeConfigList != NULL) { - frame_parms->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; + fp->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; for (i=0; ilist.count; i++) { - frame_parms->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; - frame_parms->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; + fp->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; + fp->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { - frame_parms->MBSFN_config[i].fourFrames_flag = 0; - frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration + fp->MBSFN_config[i].fourFrames_flag = 0; + fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + fp->MBSFN_config[i].mbsfn_SubframeConfig); } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration - frame_parms->MBSFN_config[i].fourFrames_flag = 1; - frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = + fp->MBSFN_config[i].fourFrames_flag = 1; + fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + fp->MBSFN_config[i].mbsfn_SubframeConfig); } } } @@ -362,17 +362,17 @@ void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index,int mbsfn_Are long mbsfn_AreaId_r9) { - LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; + LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { - frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; + fp->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; LOG_N(PHY,"Fix me: only called when mbsfn_Area_idx == 0)\n"); } - lte_gold_mbsfn(frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_mbsfn_table,frame_parms->Nid_cell_mbsfn); + lte_gold_mbsfn(fp,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_mbsfn_table,fp->Nid_cell_mbsfn); } @@ -381,17 +381,17 @@ void phy_config_sib13_eNB(uint8_t Mod_id,int CC_id,int mbsfn_Area_idx, long mbsfn_AreaId_r9) { - LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; + LTE_DL_FRAME_PARMS *fp = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms; LOG_I(PHY,"[eNB%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { - frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; + fp->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; LOG_N(PHY,"Fix me: only called when mbsfn_Area_idx == 0)\n"); } - lte_gold_mbsfn(frame_parms,PHY_vars_eNB_g[Mod_id][CC_id]->lte_gold_mbsfn_table,frame_parms->Nid_cell_mbsfn); + lte_gold_mbsfn(fp,PHY_vars_eNB_g[Mod_id][CC_id]->lte_gold_mbsfn_table,fp->Nid_cell_mbsfn); } @@ -400,6 +400,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB) uint8_t UE_id; struct PhysicalConfigDedicated *physicalConfigDedicated; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; for (UE_id=0; UE_idphysicalConfigDedicated[UE_id]; @@ -421,7 +422,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB) eNB->pucch_config_dedicated[UE_id].ackNackRepetition=1; } - if (eNB->frame_parms.frame_type == FDD) { + if (fp->frame_type == FDD) { eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = multiplexing; } else { if (physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode) @@ -508,7 +509,7 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility PHY_vars_UE_g[Mod_id][CC_id]->ho_triggered = 1; //PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH; - LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; + LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; // int N_ZC; // uint8_t prach_fmt; // int u; @@ -516,88 +517,88 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility LOG_I(PHY,"[UE%d] Handover triggered: Applying radioResourceConfigCommon from eNB %d\n", Mod_id,eNB_id); - frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - frame_parms->prach_config_common.prach_Config_enabled=1; - frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex; - frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag; - frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig; - frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset; + fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; + fp->prach_config_common.prach_Config_enabled=1; + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex; + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag; + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig; + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset; - // prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,frame_parms->frame_type); + // prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,fp->frame_type); // N_ZC = (prach_fmt <4)?839:139; - // u = (prach_fmt < 4) ? prach_root_sequence_map0_3[frame_parms->prach_config_common.rootSequenceIndex] : - // prach_root_sequence_map4[frame_parms->prach_config_common.rootSequenceIndex]; + // u = (prach_fmt < 4) ? prach_root_sequence_map0_3[fp->prach_config_common.rootSequenceIndex] : + // prach_root_sequence_map4[fp->prach_config_common.rootSequenceIndex]; //compute_prach_seq(u,N_ZC, PHY_vars_UE_g[Mod_id]->X_u); compute_prach_seq(&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common, - frame_parms->frame_type, + fp->frame_type, PHY_vars_UE_g[Mod_id][CC_id]->X_u); - frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift; - frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI; - frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN; - frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN; - frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower; - frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b; + fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift; + fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI; + fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN; + fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN; + fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower; + fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b; - frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift; + fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + fp->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift; - init_ul_hopping(frame_parms); - frame_parms->soundingrs_ul_config_common.enabled_flag = 0; + init_ul_hopping(fp); + fp->soundingrs_ul_config_common.enabled_flag = 0; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->present==SoundingRS_UL_ConfigCommon_PR_setup) { - frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_BandwidthConfig; - frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig; - frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.ackNackSRS_SimultaneousTransmission; + fp->soundingrs_ul_config_common.enabled_flag = 1; + fp->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_BandwidthConfig; + fp->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig; + fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.ackNackSRS_SimultaneousTransmission; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_MaxUpPts) - frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; + fp->soundingrs_ul_config_common.srs_MaxUpPts = 1; else - frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; + fp->soundingrs_ul_config_common.srs_MaxUpPts = 0; } - frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUSCH; - frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon->alpha; - frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUCCH; - frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaPreambleMsg3; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1b; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a; - frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b; + fp->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUSCH; + fp->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon->alpha; + fp->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUCCH; + fp->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaPreambleMsg3; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1b; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b; - frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx; + fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx; // Now configure some of the Physical Channels if (radioResourceConfigCommon->antennaInfoCommon) - frame_parms->nb_antennas_tx = (1<antennaInfoCommon->antennaPortsCount); + fp->nb_antennas_tx = (1<antennaInfoCommon->antennaPortsCount); else - frame_parms->nb_antennas_tx = 1; + fp->nb_antennas_tx = 1; //PHICH if (radioResourceConfigCommon->antennaInfoCommon) { - frame_parms->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource; - frame_parms->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration; + fp->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource; + fp->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration; } //Target CellId - frame_parms->Nid_cell = mobilityControlInfo->targetPhysCellId; - frame_parms->nushift = frame_parms->Nid_cell%6; + fp->Nid_cell = mobilityControlInfo->targetPhysCellId; + fp->nushift = fp->Nid_cell%6; // PUCCH - init_ncs_cell(frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); + init_ncs_cell(fp,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); - init_ul_hopping(frame_parms); + init_ul_hopping(fp); // RNTI @@ -676,46 +677,13 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, ARFCN_ValueEUTRA_t dl_CarrierFreq_r10 = sCellToAddMod_r10->cellIdentification_r10->dl_CarrierFreq_r10; uint32_t carrier_freq_local; -#ifdef EXMIMO -#ifdef DRIVER2013 - // exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[rf_map[CC_id].card].exmimo_config_ptr; -#endif -#endif - if ((dl_CarrierFreq_r10>=36000) && (dl_CarrierFreq_r10<=36199)) { carrier_freq_local = 1900000000 + (dl_CarrierFreq_r10-36000)*100000; //band 33 from 3GPP 36.101 v 10.9 Table 5.7.3-1 LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); - /* -#ifdef EXMIMO -#ifdef DRIVER2013 - //carrier_freq[CC_id] = carrier_freq_local; - //openair_daq_vars.freq_offset = -6540; - p_exmimo_config->rf.rf_freq_rx[rf_map[CC_id].chain] = carrier_freq_local;//+openair_daq_vars.freq_offset2; - p_exmimo_config->rf.rf_freq_tx[rf_map[CC_id].chain] = carrier_freq_local;//+openair_daq_vars.freq_offset2; - p_exmimo_config->rf.tx_gain[rf_map[CC_id].chain][0] = 25; - p_exmimo_config->rf.rf_vcocal[rf_map[CC_id].chain] = 910; - p_exmimo_config->rf.rf_local[rf_map[CC_id].chain] = 8255063; //this should be taken form calibration file - p_exmimo_config->rf.rffe_band_mode[rf_map[CC_id].chain] = B19G_TDD; -#endif -#endif*/ } else if ((dl_CarrierFreq_r10>=6150) && (dl_CarrierFreq_r10<=6449)) { carrier_freq_local = 832000000 + (dl_CarrierFreq_r10-6150)*100000; //band 20 from 3GPP 36.101 v 10.9 Table 5.7.3-1 // this is actually for the UL only, but we use it for DL too, since there is no TDD mode for this band LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); -/* -#ifdef EXMIMO -#ifdef DRIVER2013 - //carrier_freq[CC_id] = carrier_freq_local; - //openair_daq_vars.freq_offset = -2000; - p_exmimo_config->rf.rf_freq_rx[rf_map[CC_id].chain] = carrier_freq_local;//+openair_daq_vars.freq_offset2; - p_exmimo_config->rf.rf_freq_tx[rf_map[CC_id].chain] = carrier_freq_local;//+openair_daq_vars.freq_offset2; - p_exmimo_config->rf.tx_gain[rf_map[CC_id].chain][0] = 10; - p_exmimo_config->rf.rf_vcocal[rf_map[CC_id].chain] = 2015; - p_exmimo_config->rf.rf_local[rf_map[CC_id].chain] = 8254992; //this should be taken form calibration file - p_exmimo_config->rf.rffe_band_mode[rf_map[CC_id].chain] = DD_TDD; -#endif -#endif -*/ } else { LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %d of SCell %d for UE %d not supported\n",Mod_id,/*eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id); } @@ -906,11 +874,11 @@ void phy_init_lte_top(LTE_DL_FRAME_PARMS *frame_parms) * \param[in] frame_parms LTE_DL_FRAME_PARMS structure. * \note This function is optimistic in that it expects malloc() to succeed. */ -void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS* const frame_parms ) +void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS* const fp ) { AssertFatal( pdsch, "pdsch==0" ); - pdsch->pmi_ext = (uint8_t*)malloc16_clear( frame_parms->N_RB_DL ); + pdsch->pmi_ext = (uint8_t*)malloc16_clear( fp->N_RB_DL ); pdsch->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); pdsch->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) ); pdsch->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) ); @@ -918,7 +886,7 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); pdsch->rxdataF_comp0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch->rho = (int32_t**)malloc16_clear( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pdsch->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) ); pdsch->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); @@ -926,14 +894,14 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS pdsch->dl_ch_magb0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); // the allocated memory size is fixed: - AssertFatal( frame_parms->nb_antennas_rx <= 2, "nb_antennas_rx > 2" ); + AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" ); - for (int i=0; inb_antennas_rx; i++) { - pdsch->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*7*2) ); + for (int i=0; inb_antennas_rx; i++) { + pdsch->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) ); - for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++) + for (int j=0; j<4; j++) { //fp->nb_antennas_tx; j++) const int idx = (j<<1)+i; - const size_t num = 7*2*frame_parms->N_RB_DL*12; + const size_t num = 7*2*fp->N_RB_DL*12; pdsch->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); @@ -952,7 +920,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, { // create shortcuts - LTE_DL_FRAME_PARMS* const frame_parms = &ue->frame_parms; + LTE_DL_FRAME_PARMS* const fp = &ue->frame_parms; LTE_UE_COMMON* const common_vars = &ue->common_vars; LTE_UE_PDSCH** const pdsch_vars = ue->pdsch_vars; LTE_UE_PDSCH** const pdsch_vars_SI = ue->pdsch_vars_SI; @@ -965,11 +933,11 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, int i,j,k; int eNB_id; - printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx); + printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx); LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST); // many memory allocation sizes are hard coded - AssertFatal( frame_parms->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" ); + AssertFatal( fp->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" ); AssertFatal( ue->n_connected_eNB <= NUMBER_OF_CONNECTED_eNB_MAX, "n_connected_eNB is too large" ); // init phy_vars_ue @@ -995,25 +963,25 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, // init TX buffers - common_vars->txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - common_vars->txdataF = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); + common_vars->txdata = (int32_t**)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) ); + common_vars->txdataF = (int32_t **)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) ); - for (i=0; inb_antennas_tx; i++) { + for (i=0; inb_antennas_tx; i++) { - common_vars->txdata[i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); - common_vars->txdataF[i] = (int32_t *)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); + common_vars->txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) ); + common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); } // init RX buffers - common_vars->rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - common_vars->rxdataF = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - common_vars->rxdataF2 = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdata = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdataF2 = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - for (i=0; inb_antennas_rx; i++) { - common_vars->rxdata[i] = (int32_t*) malloc16_clear( (FRAME_LENGTH_COMPLEX_SAMPLES+2048)*sizeof(int32_t) ); - common_vars->rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->ofdm_symbol_size*14) ); - common_vars->rxdataF2[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*10) ); + for (i=0; inb_antennas_rx; i++) { + common_vars->rxdata[i] = (int32_t*) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) ); + common_vars->rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) ); + common_vars->rxdataF2[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti*10) ); } } @@ -1022,11 +990,11 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, common_vars->dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); common_vars->dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); - for (i=0; inb_antennas_rx; i++) + for (i=0; inb_antennas_rx; i++) for (j=0; j<4; j++) { int idx = (j<<1) + i; - common_vars->dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->symbols_per_tti*(frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); - common_vars->dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size*2 ); + common_vars->dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); + common_vars->dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 ); } } @@ -1041,9 +1009,9 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, pbch_vars[eNB_id] = (LTE_UE_PBCH *)malloc16_clear(sizeof(LTE_UE_PBCH)); if (abstraction_flag == 0) { - phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], frame_parms ); + phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], fp ); - pdsch_vars[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*frame_parms->N_RB_DL*12); + pdsch_vars[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12); pdsch_vars[eNB_id]->llr_shifts_p = pdsch_vars[eNB_id]->llr_shifts; pdsch_vars[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); pdsch_vars[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); @@ -1052,19 +1020,19 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, for (k=0; k<8; k++) pdsch_vars[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - for (i=0; inb_antennas_rx; i++) + for (i=0; inb_antennas_rx; i++) for (j=0; j<4; j++) { int idx = (j<<1)+i; - pdsch_vars[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(frame_parms->N_RB_DL*12) ); - pdsch_vars[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(frame_parms->N_RB_DL*12) ); + pdsch_vars[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + pdsch_vars[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); for (k=0; k<8; k++) - pdsch_vars[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*14) ); + pdsch_vars[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*14) ); } - phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], frame_parms ); - phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], frame_parms ); - phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], frame_parms ); + phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp ); // 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE pdcch_vars[eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); pdcch_vars[eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); @@ -1073,17 +1041,17 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, pdcch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); pdcch_vars[eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdcch_vars[eNB_id]->rho = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pdcch_vars[eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); pdcch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); pdcch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - for (i=0; inb_antennas_rx; i++) { - //ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*7*2) ); + for (i=0; inb_antennas_rx; i++) { + //ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) ); pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) ); - for (j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++) + for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++) int idx = (j<<1)+i; - // size_t num = 7*2*frame_parms->N_RB_DL*12; + // size_t num = 7*2*fp->N_RB_DL*12; size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB pdcch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdcch_vars[eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); @@ -1093,17 +1061,17 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, } // PBCH - pbch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pbch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); pbch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); pbch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); pbch_vars[eNB_id]->llr = (int8_t*)malloc16_clear( 1920 ); - prach_vars[eNB_id]->prachF = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(frame_parms->ofdm_symbol_size*12)) ); - prach_vars[eNB_id]->prach = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(frame_parms->ofdm_symbol_size*12)) ); + prach_vars[eNB_id]->prachF = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); + prach_vars[eNB_id]->prach = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); - for (i=0; inb_antennas_rx; i++) { + for (i=0; inb_antennas_rx; i++) { pbch_vars[eNB_id]->rxdataF_ext[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); - for (j=0; j<4; j++) {//frame_parms->nb_antennas_tx;j++) { + for (j=0; j<4; j++) {//fp->nb_antennas_tx;j++) { int idx = (j<<1)+i; pbch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); pbch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); @@ -1121,14 +1089,14 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); if (abstraction_flag == 0) { - phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], frame_parms ); + phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], fp ); pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); } else { //abstraction == 1 - ue->sinr_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); + ue->sinr_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) ); } - ue->sinr_CQI_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); + ue->sinr_CQI_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) ); ue->init_averaging = 1; ue->pdsch_config_dedicated->p_a = dB0; // default value until overwritten by RRCConnectionReconfiguration @@ -1149,7 +1117,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, { // shortcuts - LTE_DL_FRAME_PARMS* const frame_parms = &eNB->frame_parms; + LTE_DL_FRAME_PARMS* const fp = &eNB->frame_parms; LTE_eNB_COMMON* const common_vars = &eNB->common_vars; LTE_eNB_PUSCH** const pusch_vars = eNB->pusch_vars; LTE_eNB_SRS* const srs_vars = eNB->srs_vars; @@ -1163,14 +1131,14 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, LOG_I(PHY,"[eNB %"PRIu8"] Initializing DL_FRAME_PARMS : N_RB_DL %"PRIu8", PHICH Resource %d, PHICH Duration %d\n", eNB->Mod_id, - frame_parms->N_RB_DL,frame_parms->phich_config_common.phich_resource, - frame_parms->phich_config_common.phich_duration); + fp->N_RB_DL,fp->phich_config_common.phich_resource, + fp->phich_config_common.phich_duration); LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_eNB][MOD %02"PRIu8"][]\n", eNB->Mod_id); if (eNB->node_function != NGFI_RRU_IF4p5) { - lte_gold(frame_parms,eNB->lte_gold_table,frame_parms->Nid_cell); - generate_pcfich_reg_mapping(frame_parms); - generate_phich_reg_mapping(frame_parms); + lte_gold(fp,eNB->lte_gold_table,fp->Nid_cell); + generate_pcfich_reg_mapping(fp); + generate_phich_reg_mapping(fp); for (UE_id=0; UE_idfirst_run_timing_advance[UE_id] = @@ -1192,35 +1160,35 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, // TX vars if (eNB->node_function != NGFI_RCC_IF4p5) - common_vars->txdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - common_vars->txdataF[eNB_id] = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); + common_vars->txdata[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) ); + common_vars->txdataF[eNB_id] = (int32_t **)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) ); - for (i=0; inb_antennas_tx; i++) { + for (i=0; inb_antennas_tx; i++) { if (eNB->node_function != NGFI_RCC_IF4p5) - common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); - common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); + common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) ); + common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); #ifdef DEBUG_PHY printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]); printf("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%d bytes)\n", eNB_id,i,common_vars->txdataF[eNB_id][i], - FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t)); #endif } // RX vars if (eNB->node_function != NGFI_RCC_IF4p5) { - common_vars->rxdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdata[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); } - common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - for (i=0; inb_antennas_rx; i++) { + for (i=0; inb_antennas_rx; i++) { if (eNB->node_function != NGFI_RCC_IF4p5) { - common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); - common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->samples_per_tti*sizeof(int32_t) ); + common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) ); + common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*sizeof(int32_t) ); } - common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti) ); + common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti) ); #ifdef DEBUG_PHY printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata[eNB_id][i]); printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i]); @@ -1231,19 +1199,19 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, // Channel estimates for SRS for (UE_id=0; UE_idnb_antennas_rx*sizeof(int32_t*) ); - srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + srs_vars[UE_id].srs_ch_estimates[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - for (i=0; inb_antennas_rx; i++) { - srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size ); - srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size*2 ); + for (i=0; inb_antennas_rx; i++) { + srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size ); + srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 ); } } //UE_id - common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*frame_parms->samples_per_tti ); + common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_tti ); } } else { //UPLINK abstraction = 1 - eNB->sinr_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); + eNB->sinr_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) ); } } //eNB_id @@ -1255,7 +1223,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, // SRS for (UE_id=0; UE_idofdm_symbol_size*sizeof(int32_t)); + srs_vars[UE_id].srs = (int32_t*)malloc16_clear(2*fp->ofdm_symbol_size*sizeof(int32_t)); } } } @@ -1268,19 +1236,19 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) ); /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */ - AssertFatal(frame_parms->nb_antennas_rx <= sizeof(prach_vars->rxsigF) / sizeof(prach_vars->rxsigF[0]), + AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->rxsigF) / sizeof(prach_vars->rxsigF[0]), "nb_antennas_rx too large"); - for (i=0; inb_antennas_rx; i++) { - prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( frame_parms->ofdm_symbol_size*12*2*sizeof(int16_t) ); + for (i=0; inb_antennas_rx; i++) { + prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( fp->ofdm_symbol_size*12*2*sizeof(int16_t) ); #ifdef DEBUG_PHY printf("[openair][LTE_PHY][INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]); #endif } if (eNB->node_function != NGFI_RRU_IF4p5) { - AssertFatal(frame_parms->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]), + AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]), "nb_antennas_rx too large"); - for (i=0; inb_antennas_rx; i++) { + for (i=0; inb_antennas_rx; i++) { prach_vars->prach_ifft[i] = (int16_t*)malloc16_clear(1024*2*sizeof(int16_t)); #ifdef DEBUG_PHY printf("[openair][LTE_PHY][INIT] prach_vars->prach_ifft[%d] = %p\n",i,prach_vars->prach_ifft[i]); @@ -1295,61 +1263,61 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, if (abstraction_flag==0) { for (eNB_id=0; eNB_id<3; eNB_id++) { - pusch_vars[UE_id]->rxdataF_ext[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_ext[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - for (i=0; inb_antennas_rx; i++) { + for (i=0; inb_antennas_rx; i++) { // RK 2 times because of output format of FFT! // FIXME We should get rid of this - pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*frame_parms->ofdm_symbol_size ); - pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); + pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); + pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); + pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*fp->ofdm_symbol_size ); + pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); + pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); + pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); } // In case of Distributed Alamouti Collabrative scheme separate channel estimates are required for both the UEs if (cooperation_flag == 2) { - pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // UE 0 DRS estimates - pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // UE 1 DRS estimates + pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); // UE 0 DRS estimates + pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); // UE 1 DRS estimates - for (i=0; inb_antennas_rx; i++) { - pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + for (i=0; inb_antennas_rx; i++) { + pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); + pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); } // Compensated data for the case of Distributed Alamouti Scheme - pusch_vars[UE_id]->rxdataF_comp_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y)*(h0*) - pusch_vars[UE_id]->rxdataF_comp_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y*)*(h1) + pusch_vars[UE_id]->rxdataF_comp_0[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y)*(h0*) + pusch_vars[UE_id]->rxdataF_comp_1[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y*)*(h1) - for (i=0; inb_antennas_rx; i++) { - pusch_vars[UE_id]->rxdataF_comp_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - pusch_vars[UE_id]->rxdataF_comp_1[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + for (i=0; inb_antennas_rx; i++) { + pusch_vars[UE_id]->rxdataF_comp_0[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); + pusch_vars[UE_id]->rxdataF_comp_1[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); } // UE 0 - pusch_vars[UE_id]->ul_ch_mag_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->ul_ch_magb_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_mag_0[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_magb_0[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - for (i=0; inb_antennas_rx; i++) { - pusch_vars[UE_id]->ul_ch_mag_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - pusch_vars[UE_id]->ul_ch_magb_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + for (i=0; inb_antennas_rx; i++) { + pusch_vars[UE_id]->ul_ch_mag_0[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); + pusch_vars[UE_id]->ul_ch_magb_0[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); } // UE 1 - pusch_vars[UE_id]->ul_ch_mag_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->ul_ch_magb_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_mag_1[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_magb_1[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - for (i=0; inb_antennas_rx; i++) { - pusch_vars[UE_id]->ul_ch_mag_1[eNB_id][i] = (int32_t*)malloc16( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - pusch_vars[UE_id]->ul_ch_magb_1[eNB_id][i] = (int32_t*)malloc16( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); + for (i=0; inb_antennas_rx; i++) { + pusch_vars[UE_id]->ul_ch_mag_1[eNB_id][i] = (int32_t*)malloc16( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); + pusch_vars[UE_id]->ul_ch_magb_1[eNB_id][i] = (int32_t*)malloc16( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); } }//cooperation_flag } //eNB_id @@ -1374,15 +1342,15 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, return(-1); } - for (j=0; jframe_parms.nb_antennas_tx; j++) { - eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(eNB->frame_parms.ofdm_symbol_size)); // repeated format (hence the '2*') + for (j=0; jnb_antennas_tx; j++) { + eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(fp->ofdm_symbol_size)); // repeated format (hence the '2*') if (eNB->dl_precoder_SeNB[eNB_id][j]) { #ifdef DEBUG_PHY printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j, eNB->dl_precoder_SeNB[eNB_id][j]); #endif - memset(eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(eNB->frame_parms.ofdm_symbol_size)); + memset(eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(fp->ofdm_symbol_size)); } else { printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j); return(-1); diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 0117c8e7d2..5667740aec 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -2664,8 +2664,10 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, uint8_t mi, uint16_t si_rnti, uint16_t ra_rnti, + uint16_t p_rnti, uint8_t L, uint8_t format_si, + uint8_t format_p, uint8_t format_ra, uint8_t format_c, uint8_t sizeof_bits, @@ -2797,6 +2799,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, #endif if (((L>1) && ((crc == si_rnti)|| + (crc == p_rnti)|| (crc == ra_rnti)))|| (crc == pdcch_vars[eNB_id]->crnti)) { dci_alloc[*dci_cnt].dci_length = sizeof_bits; @@ -2831,6 +2834,9 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, if (crc==si_rnti) { dci_alloc[*dci_cnt].format = format_si; *dci_cnt = *dci_cnt+1; + } else if (crc==p_rnti) { + dci_alloc[*dci_cnt].format = format_p; + *dci_cnt = *dci_cnt+1; } else if (crc==ra_rnti) { dci_alloc[*dci_cnt].format = format_ra; // store first nCCE of group for PUCCH transmission of ACK/NAK @@ -3118,7 +3124,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, if (ue->prach_resources[eNB_id]) ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI; - // First check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI format 0/1A), + // First check common search spaces at aggregation 4 (SI_RNTI, P_RNTI and RA_RNTI format 0/1A), // and UE_SPEC format0 (PUSCH) too while we're at it dci_decoding_procedure0(pdcch_vars,1,subframe, dci_alloc, @@ -3127,9 +3133,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 2, format1A, format1A, + format1A, format0, format1A_size_bits, format1A_size_bytes, @@ -3144,7 +3152,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); - // Now check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI and C-RNTI format 1C), + // Now check common search spaces at aggregation 4 (SI_RNTI,P_RNTI and RA_RNTI and C-RNTI format 1C), // and UE_SPEC format0 (PUSCH) too while we're at it dci_decoding_procedure0(pdcch_vars,1,subframe, dci_alloc, @@ -3153,10 +3161,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 2, format1C, format1C, format1C, + format1C, format1C_size_bits, format1C_size_bytes, &dci_cnt, @@ -3170,7 +3180,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); - // Now check common search spaces at aggregation 8 (SI_RNTI and RA_RNTI format 1A), + // Now check common search spaces at aggregation 8 (SI_RNTI,P_RNTI and RA_RNTI format 1A), // and UE_SPEC format0 (PUSCH) too while we're at it // printf("[DCI search] doing common search/format0 aggregation 3\n"); #ifdef DEBUG_DCI_DECODING @@ -3182,10 +3192,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, frame_parms, mi, SI_RNTI, + P_RNTI, ra_rnti, 3, format1A, format1A, + format1A, format0, format1A_size_bits, format1A_size_bytes, @@ -3209,7 +3221,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, - 3, + P_RNTI, + 3, + format1C, format1C, format1C, format1C, @@ -3241,7 +3255,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, - 3, + P_RNTI, + 3, + format1A, format1A, format1A, format0, @@ -3268,7 +3284,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, - 2, + P_RNTI, + 2, + format1A, format1A, format1A, format0, @@ -3299,9 +3317,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format0, format0_size_bits, format0_size_bytes, @@ -3326,9 +3346,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format0, format0_size_bits, format0_size_bytes, @@ -3357,9 +3379,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format1, format1_size_bits, format1_size_bytes, @@ -3386,9 +3410,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format1, format1_size_bits, format1_size_bytes, @@ -3416,7 +3442,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, - 2, + P_RNTI, + 2, + format1A, format1A, format1A, format1, @@ -3446,9 +3474,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 3, format1A, format1A, + format1A, format1, format1_size_bits, format1_size_bytes, @@ -3479,9 +3509,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format2A, format2A_size_bits, format2A_size_bytes, @@ -3508,9 +3540,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format2A, format2A_size_bits, format2A_size_bytes, @@ -3537,9 +3571,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 2, format1A, format1A, + format1A, format2A, format2A_size_bits, format2A_size_bytes, @@ -3567,9 +3603,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 3, format1A, format1A, + format1A, format2A, format2A_size_bits, format2A_size_bytes, @@ -3591,9 +3629,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format2, format2_size_bits, format2_size_bytes, @@ -3620,9 +3660,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format2, format2_size_bits, format2_size_bytes, @@ -3649,9 +3691,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 2, format1A, format1A, + format1A, format2, format2_size_bits, format2_size_bytes, @@ -3679,9 +3723,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 3, format1A, format1A, + format1A, format2, format2_size_bits, format2_size_bytes, @@ -3706,9 +3752,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format1E_2A_M10PRB, sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), @@ -3736,9 +3784,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format1E_2A_M10PRB, sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), @@ -3765,9 +3815,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 2, format1A, format1A, + format1A, format1E_2A_M10PRB, sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), @@ -3796,9 +3848,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, mi, SI_RNTI, ra_rnti, + P_RNTI, 3, format1A, format1A, + format1A, format1E_2A_M10PRB, sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 141e5a95dc..090ae4637f 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -729,6 +729,7 @@ typedef enum {format0, typedef enum { SI_PDSCH=0, RA_PDSCH, + P_PDSCH, PDSCH, PDSCH1, PMCH diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index c3922b13d5..d0d38b34a6 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -1339,6 +1339,14 @@ int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, @param frame_parms Pointer to a LTE_DL_FRAME_PARMS structure (eNB or UE)*/ void init_ul_hopping(LTE_DL_FRAME_PARMS *frame_parms); + +/*! + \brief This function implements the initialization of paging parameters for UE (See Section 7, 36.304).It must be called after setting IMSImod1024 during UE startup and after receiving SIB2 + @param ue Pointer to UE context + @param defaultPagingCycle T from 36.304 (0=32,1=64,2=128,3=256) + @param nB nB from 36.304 (0=4T,1=2T,2=T,3=T/2,4=T/4,5=T/8,6=T/16,7=T/32*/ +int init_ue_paging_info(PHY_VARS_UE *ue, long defaultPagingCycle, long nB); + int32_t compareints (const void * a, const void * b); diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index c4c37d2b72..abf6038543 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -53,11 +53,6 @@ # define msg mexPrintf #else # ifdef OPENAIR2 -# if ENABLE_RAL -# include "collection/hashtable/hashtable.h" -# include "COMMON/ral_messages_types.h" -# include "UTIL/queue.h" -# endif # include "log.h" # define msg(aRGS...) LOG_D(PHY, ##aRGS) # else @@ -132,10 +127,6 @@ static inline void* malloc16_clear( size_t size ) #include "PHY/TOOLS/defs.h" #include "platform_types.h" -#ifdef OPENAIR_LTE - -//#include "PHY/LTE_ESTIMATION/defs.h" - #include "PHY/LTE_TRANSPORT/defs.h" #include @@ -178,16 +169,6 @@ typedef struct UE_SCAN_INFO_s { int32_t freq_offset_Hz[3][10]; } UE_SCAN_INFO_t; -#if ENABLE_RAL -typedef struct ral_threshold_phy_s { - SLIST_ENTRY(ral_threshold_phy_s) ral_thresholds; - ral_threshold_t threshold; - ral_th_action_t th_action; - ral_link_param_t link_param; - long timer_id; -} ral_threshold_phy_t; -#endif - /// Top-level PHY Data Structure for RN typedef struct { /// Module ID indicator for this instance @@ -647,17 +628,25 @@ typedef struct { LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1]; LTE_UE_PDSCH *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PDCCH *pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch[NUMBER_OF_CONNECTED_eNB_MAX][2]; LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX],*dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; // This is for SIC in the UE, to store the reencoded data LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX]; + //Paging parameters + uint32_t IMSImod1024; + uint32_t PF; + uint32_t PO; + // For abstraction-purposes only uint8_t sr[10]; uint8_t pucch_sel[10]; @@ -712,6 +701,8 @@ typedef struct { int dlsch_SI_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_ra_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_ra_errors[NUMBER_OF_CONNECTED_eNB_MAX]; + int dlsch_p_received[NUMBER_OF_CONNECTED_eNB_MAX]; + int dlsch_p_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mch_received_sf[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mch_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mcch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; @@ -835,11 +826,6 @@ typedef struct { /// RF and Interface devices per CC openair0_device rfdevice; -#if ENABLE_RAL - hash_table_t *ral_thresholds_timed; - SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX]; - SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX]; -#endif } PHY_VARS_UE; @@ -851,6 +837,5 @@ typedef struct { #include "PHY/LTE_ESTIMATION/defs.h" #include "SIMULATION/ETH_TRANSPORT/defs.h" -#endif //OPENAIR_LTE #endif // __PHY_DEFS__H__ diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 5c884112fd..8468d62cad 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1627,8 +1627,10 @@ void restart_phy(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t eNB_id,uint8_t ab ue->dlsch_fer[eNB_id] = 0; ue->dlsch_SI_received[eNB_id] = 0; ue->dlsch_ra_received[eNB_id] = 0; + ue->dlsch_p_received[eNB_id] = 0; ue->dlsch_SI_errors[eNB_id] = 0; ue->dlsch_ra_errors[eNB_id] = 0; + ue->dlsch_p_errors[eNB_id] = 0; ue->dlsch_mch_received[eNB_id] = 0; @@ -2027,6 +2029,35 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint } } + else if ((dci_alloc_rx[i].rnti == P_RNTI) && + ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); +#endif + + + if (generate_ue_dlsch_params_from_dci(frame_rx, + subframe_rx, + (void *)&dci_alloc_rx[i].dci_pdu, + SI_RNTI, + dci_alloc_rx[i].format, + &ue->dlsch_SI[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI)==0) { + + ue->dlsch_p_received[eNB_id]++; + + + LOG_D(PHY,"[UE %d] Frame %d, subframe %d : Generate UE DLSCH P_RNTI format 1%s\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C"); + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + + } + } + else if ((ue->prach_resources[eNB_id]) && (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) && (dci_alloc_rx[i].format == format1A)) { @@ -2440,6 +2471,9 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, case RA_PDSCH: pdsch_vars = ue->pdsch_vars_ra[eNB_id]; break; + case P_PDSCH: + pdsch_vars = ue->pdsch_vars_p[eNB_id]; + break; case PDSCH: pdsch_vars = ue->pdsch_vars[eNB_id]; break; @@ -2557,6 +2591,14 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, ue->dlsch_SI[eNB_id]->harq_processes[0]->b, ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); break; + case P_PDSCH: + mac_xface->ue_decode_p(ue->Mod_id, + CC_id, + frame_rx, + eNB_id, + ue->dlsch_SI[eNB_id]->harq_processes[0]->b, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); + break; case RA_PDSCH: process_rar(ue,proc,eNB_id,mode,abstraction_flag); break; @@ -2630,6 +2672,8 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin if (ue->dlsch_SI[eNB_id]) ue->dlsch_SI[eNB_id]->active = 0; + if (ue->dlsch_p[eNB_id]) + ue->dlsch_p[eNB_id]->active = 0; if (ue->dlsch_ra[eNB_id]) ue->dlsch_ra[eNB_id]->active = 0; @@ -2726,6 +2770,20 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin ue->frame_parms.symbols_per_tti>>1, abstraction_flag); } + + // do procedures for SI-RNTI + if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { + ue_pdsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + ue->pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->frame_parms.symbols_per_tti>>1, + abstraction_flag); + } + // do procedures for RA-RNTI if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { ue_pdsch_procedures(ue, @@ -2821,6 +2879,30 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin abstraction_flag); ue->dlsch_SI[eNB_id]->active = 0; } + + // do procedures for P-RNTI + if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { + ue_pdsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + 1+(ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + + ue_dlsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + &ue->dlsch_p_errors[eNB_id], + mode, + abstraction_flag); + ue->dlsch_p[eNB_id]->active = 0; + } // do procedures for RA-RNTI if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { ue_pdsch_procedures(ue, diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index fb6a9d0288..cfd3da43ca 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -129,7 +129,8 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_ } -void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,double SNR, int tx_lev,int hold_channel,int abstx, int num_rounds, int trials, int round, channel_desc_t *eNB2UE[4], double **s_re,double **s_im,double **r_re,double **r_im,FILE *csv_fd) { +void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,double SNR, int tx_lev,int hold_channel,int abstx, int num_rounds, int trials, int round, channel_desc_t *eNB2UE[4], + double s_re[2][30720*2],double s_im[2][30720*2],double r_re[2][30720*2],double r_im[2][30720*2],FILE *csv_fd) { int i,u; int aa,aarx,aatx; @@ -1266,7 +1267,7 @@ int main(int argc, char **argv) double snr_step=1,input_snr_step=1, snr_int=30; LTE_DL_FRAME_PARMS *frame_parms; - double **s_re,**s_im,**r_re,**r_im; + double s_re[2][30720*2],s_im[2][30720*2],r_re[2][30720*2],r_im[2][30720*2]; double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel @@ -1798,13 +1799,6 @@ int main(int argc, char **argv) frame_parms = &eNB->frame_parms; - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); - // r_re0 = malloc(2*sizeof(double*)); - // r_im0 = malloc(2*sizeof(double*)); - nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model); @@ -1948,14 +1942,6 @@ int main(int argc, char **argv) } */ - for (i=0; i<2; i++) { - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - } - - UE->pdcch_vars[0]->crnti = n_rnti; // Fill in UL_alloc @@ -2329,165 +2315,7 @@ int main(int argc, char **argv) } // common_flag == 0 - /* - num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci, - num_common_dci, - dci_alloc, - 0, - AMP, - &eNB->frame_parms, - eNB->common_vars.txdataF[eNB_id], - subframe); - - if (n_frames==1) printf("Generated DCI, num_pdcch_symbols %d\n",num_pdcch_symbols_2); - if (num_pdcch_symbols_2 > num_pdcch_symbols) { - printf("Error: given num_pdcch_symbols not big enough (%d > %d)\n",num_pdcch_symbols_2,num_pdcch_symbols); - exit(-1); - } - - for (k=0; kframe_parms, - eNB->dlsch[k][cw]->harq_processes[0]->nb_rb, - eNB->dlsch[k][cw]->harq_processes[0]->rb_alloc, - get_Qm(eNB->dlsch[k][cw]->harq_processes[0]->mcs), - eNB->dlsch[k][cw]->harq_processes[0]->Nl, - num_pdcch_symbols, - 0,subframe); - - tbs = eNB->dlsch[k][cw]->harq_processes[0]->TBS; - rate = (double)tbs/(double)coded_bits_per_codeword; - - if ((SNR==snr0) && (trials==0) && (round==0)) - printf("User %d, cw %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n", - k,cw,rate,rate*get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs), - coded_bits_per_codeword, - tbs, - get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs), - num_pdcch_symbols, - eNB->dlsch[0][0]->harq_processes[0]->round); - - // use the PMI from previous trial - if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { - eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); - UE->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); - - if (n_users>1) - eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); - - - } - - - start_meas(&eNB->dlsch_encoding_stats); - - if (dlsch_encoding(((cw==0) ? input_buffer0[k] : input_buffer1[k]), - &eNB->frame_parms, - num_pdcch_symbols, - eNB->dlsch[k][cw], - 0,subframe, - &eNB->dlsch_rate_matching_stats, - &eNB->dlsch_turbo_encoding_stats, - &eNB->dlsch_interleaving_stats - )<0) - exit(-1); - - stop_meas(&eNB->dlsch_encoding_stats); - - eNB->dlsch[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI; - start_meas(&eNB->dlsch_scrambling_stats); - dlsch_scrambling(&eNB->frame_parms, - 0, - eNB->dlsch[k][cw], - coded_bits_per_codeword, - 0, - subframe<<1); - stop_meas(&eNB->dlsch_scrambling_stats); - - if (n_frames==1) { - for (s=0; sdlsch[k][cw]->harq_processes[0]->C; s++) { - if (sdlsch[k][cw]->harq_processes[0]->Cminus) - Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kminus; - else - Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kplus; - - Kr_bytes = Kr>>3; - - for (i=0; idlsch[k][cw]->harq_processes[0]->c[s][i]); - } - } - } - - start_meas(&eNB->dlsch_modulation_stats); - - re_allocated = dlsch_modulation(eNB->common_vars.txdataF[eNB_id], - AMP, - subframe, - &eNB->frame_parms, - num_pdcch_symbols, - eNB->dlsch[k][0], - (transmission_mode==3)||(transmission_mode==4) ? eNB->dlsch[k][1] : NULL); - - (void)re_allocated; - - stop_meas(&eNB->dlsch_modulation_stats); - - } //n_users - - - generate_pilots(eNB, - eNB->common_vars.txdataF[eNB_id], - AMP, - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - - start_meas(&eNB->ofdm_mod_stats); - - do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], - eNB->common_vars.txdata[eNB_id], - (subframe*2), - &eNB->frame_parms); - - do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], - eNB->common_vars.txdata[eNB_id], - (subframe*2)+1, - &eNB->frame_parms); - - stop_meas(&eNB->ofdm_mod_stats); - stop_meas(&eNB->phy_proc_tx); - - do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], - eNB->common_vars.txdata[eNB_id], - (subframe*2)+2, - &eNB->frame_parms); - - if (n_frames==1) { - write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], - nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); - - if (eNB->frame_parms.nb_antennas_tx>1) - write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], - nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); - } - tx_lev = 0; - - for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { - tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa] - [subframe*eNB->frame_parms.samples_per_tti], - eNB->frame_parms.samples_per_tti); - } - - tx_lev_dB = (unsigned int) dB_fixed(tx_lev); - - if (n_frames==1) { - printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); - write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe* eNB->frame_parms.samples_per_tti], - - eNB->frame_parms.samples_per_tti,1,1); - } - } - */ /* else { // Read signal from file i=0; @@ -2533,7 +2361,6 @@ int main(int argc, char **argv) &eNB->frame_parms); stop_meas(&eNB->ofdm_mod_stats); - stop_meas(&eNB->phy_proc_tx); // generate next subframe for channel estimation @@ -2653,461 +2480,7 @@ int main(int argc, char **argv) } - /* - if (n_frames==1) { - printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); - printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); - printf("rx_level Null symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); - printf("rx_level data symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); - } - - if (eNB->frame_parms.Ncp == 0) { // normal prefix - pilot1 = 4; - pilot2 = 7; - pilot3 = 11; - } else { // extended prefix - pilot1 = 3; - pilot2 = 6; - pilot3 = 9; - } - - start_meas(&UE->phy_proc_rx); - // Inner receiver scheduling for 3 slots - for (Ns=(2*subframe); Ns<((2*subframe)+3); Ns++) { - for (l=0; lofdm_demod_stats); - slot_fep(UE, - l, - Ns%20, - 0, - 0, - 0); - stop_meas(&UE->ofdm_demod_stats); - - if (UE->perfect_ce==1) { - if (awgn_flag==0) { - for(k=0; knb_antennas_tx; aa++) { - for (aarx=0; aarxnb_antennas_rx; aarx++) { - for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( - eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( - eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); - } - } - } - } - } else { - for(aa=0; aanb_antennas_tx; aa++) { - for (aarx=0; aarxnb_antennas_rx; aarx++) { - for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); - ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; - } - } - } - } - } - - - if ((Ns==((2*subframe))) && (l==0)) { - lte_ue_measurements(UE, - subframe*UE->frame_parms.samples_per_tti, - 1, - 0); - - if (transmission_mode==5 || transmission_mode==6) { - if (pmi_feedback == 1) { - pmi_feedback = 0; - hold_channel = 1; - goto PMI_FEEDBACK; - } - } - - } - - - if ((Ns==(2*subframe)) && (l==pilot1)) {// process symbols 0,1,2 - - if (dci_flag == 1) { - UE->UE_mode[0] = PUSCH; - start_meas(&UE->dlsch_rx_pdcch_stats); - rx_pdcch(&UE->common_vars, - UE->pdcch_vars, - &UE->frame_parms, - subframe, - 0, - (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - UE->high_speed_flag, - 0); - stop_meas(&UE->dlsch_rx_pdcch_stats); - // overwrite number of pdcch symbols - UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; - - dci_cnt = dci_decoding_procedure(UE, - dci_alloc_rx,1, - eNB_id, - subframe); - //printf("dci_cnt %d\n",dci_cnt); - - if (dci_cnt==0) { - dlsch_active = 0; - - if (round==0) { - dci_errors++; - round=5; - errs[0]++; - //round_trials[0]++; - - if (n_frames==1) - printf("DCI error trial %d errs[0] %d\n",trials,errs[0]); - } - - // for (i=1;i<=round;i++) - // round_trials[i]--; - // round=5; - } - - for (i=0; idlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->first_tx=1; - - if ((dci_alloc_rx[i].rnti == n_rnti) && - (generate_ue_dlsch_params_from_dci(0, - subframe, - dci_alloc_rx[i].dci_pdu, - dci_alloc_rx[i].rnti, - dci_alloc_rx[i].format, - UE->dlsch[0], - &UE->frame_parms, - UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI)==0)) { - //dump_dci(&UE->frame_parms,&dci_alloc_rx[i]); - coded_bits_per_codeword = get_G(&eNB->frame_parms, - UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb, - UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even, - get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs), - UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl, - UE->pdcch_vars[0]->num_pdcch_symbols, - 0,subframe); - printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword, - UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->TBS); - - dlsch_active = 1; - } else { - dlsch_active = 0; - - if (round==0) { - dci_errors++; - errs[0]++; - //round_trials[0]++; - round=5; - - if (n_frames==1) - printf("DCI misdetection trial %d\n",trials); - - } - - // for (i=1;i<=round;i++) - // round_trials[i]--; - // round=5; - } - } - } // if dci_flag==1 - else { //dci_flag == 0 - - UE->pdcch_vars[0]->crnti = n_rnti; - UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; - - if (round == 0) UE->dlsch[0][0]->harq_processes[0]->first_tx=1; - - switch (transmission_mode) { - case 1: - case 2: - generate_ue_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - (common_flag==0)? C_RNTI : SI_RNTI, - (common_flag==0)? format1 : format1A, - UE->dlsch[0], - &UE->frame_parms, - UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI); - break; - - case 3: - // printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx); - generate_ue_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - (common_flag==0)? C_RNTI : SI_RNTI, - (common_flag==0)? format2A : format1A, - UE->dlsch[0], - &UE->frame_parms, - UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI); - // printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx); - break; - - case 4: - generate_ue_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - (common_flag==0)? C_RNTI : SI_RNTI, - (common_flag==0)? format2 : format1A, - UE->dlsch[0], - &UE->frame_parms, - UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI); - break; - - case 5: - case 6: - generate_ue_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu2_1E[0], - C_RNTI, - format1E_2A_M10PRB, - UE->dlsch[0], - &UE->frame_parms, - UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI); - break; - - } - - dlsch_active = 1; - } // if dci_flag == 1 - } - - if (dlsch_active == 1) { - if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix) - - if ((transmission_mode == 5) && - (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->dl_power_off==0) && - (UE->use_ia_receiver ==1)) { - dual_stream_UE = 1; - } else { - dual_stream_UE = 0; - } - - - start_meas(&UE->dlsch_llr_stats); - - for (m=UE->pdcch_vars[0]->num_pdcch_symbols; - mpdcch_vars[0]->num_pdcch_symbols)?1:0, - dual_stream_UE, - i_mod, - UE->dlsch[0][0]->current_harq_pid)==-1) { - dlsch_active = 0; - break; - } - } - - stop_meas(&UE->dlsch_llr_stats); - } - - if ((Ns==(1+(2*subframe))) && (l==pilot1)) { - // process symbols (6 Extended Prefix),7,8,9 - start_meas(&UE->dlsch_llr_stats); - - for (m=pilot2; - mdlsch[0][0]->current_harq_pid)==-1) { - dlsch_active=0; - break; - } - } - - stop_meas(&UE->dlsch_llr_stats); - } - - if ((Ns==(2+(2*subframe))) && (l==0)) { // process symbols 10,11,(12,13 Normal Prefix) do deinterleaving for TTI - start_meas(&UE->dlsch_llr_stats); - - for (m=pilot3; - mframe_parms.symbols_per_tti; - m++) { - if (rx_pdsch(UE, - PDSCH, - eNB_id, - eNB_id_i, - subframe, - m, - 0, - dual_stream_UE, - i_mod, - UE->dlsch[0][0]->current_harq_pid)==-1) { - dlsch_active=0; - break; - } - } - - stop_meas(&UE->dlsch_llr_stats); - } - - if (test_perf ==0 ) { - if ((n_frames==1) && (Ns==(2+(2*subframe))) && (l==0)) { - write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8); - - if (eNB->frame_parms.nb_antennas_tx>1) - write_output("ch1.m","ch1",eNB2UE[0]->ch[eNB->frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8); - - //common vars - write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - - if (UE->frame_parms.nb_antennas_rx>1) { - write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); - write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - } - - write_output("dlsch00_r0.m","dl00_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]), - UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - - if (UE->frame_parms.nb_antennas_rx>1) - write_output("dlsch01_r0.m","dl01_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]), - UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - - if (eNB->frame_parms.nb_antennas_tx>1) - write_output("dlsch10_r0.m","dl10_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]), - UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - - if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) - write_output("dlsch11_r0.m","dl11_r0", - &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]), - UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); - - //pdsch_vars - dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round); - //dump_dlsch2(UE,eNB_id_i,coded_bits_per_codeword); - write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); - - //pdcch_vars - write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); - write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); - - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); - write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4); - - } - } - } - } - } - - //saving PMI in case of Transmission Mode > 5 - - if(abstx) { - if (trials==0 && round==0 && transmission_mode>=5) { - for (iii=0; iiilte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii])); - fprintf(csv_fd,"%x,%x,",(UE->pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); - printf("%x ",(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); - } - } - } - - for (int cw=Kmimo-1; cw>=0; cw--) { - UE->dlsch[0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; - coded_bits_per_codeword = get_G(&eNB->frame_parms, - eNB->dlsch[0][cw]->harq_processes[0]->nb_rb, - eNB->dlsch[0][cw]->harq_processes[0]->rb_alloc, - get_Qm(eNB->dlsch[0][cw]->harq_processes[0]->mcs), - eNB->dlsch[0][cw]->harq_processes[0]->Nl, - num_pdcch_symbols, - 0,subframe); - - UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid]->G = coded_bits_per_codeword; - - - // calculate uncoded BLER - uncoded_ber=0; - for (i=0;idlsch[0][0]->harq_processes[0]->e[i] != (UE->pdsch_vars[0]->llr[0][i]<0)) { - uncoded_ber_bit[i] = 1; - uncoded_ber++; - } - else - uncoded_ber_bit[i] = 0; - - uncoded_ber/=coded_bits_per_codeword; - avg_ber += uncoded_ber; - - if (n_frames==1) - write_output("uncoded_ber_bit.m","uncoded_ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); - - - start_meas(&UE->dlsch_unscrambling_stats); - dlsch_unscrambling(&UE->frame_parms, - 0, - UE->dlsch[0][cw], - coded_bits_per_codeword, - UE->pdsch_vars[eNB_id]->llr[cw], - 0, - subframe<<1); - stop_meas(&UE->dlsch_unscrambling_stats); - - start_meas(&UE->dlsch_decoding_stats); - ret = dlsch_decoding(UE, - UE->pdsch_vars[eNB_id]->llr[cw], - &UE->frame_parms, - UE->dlsch[0][cw], - UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid], - subframe, - UE->dlsch[0][cw]->current_harq_pid, - 1,llr8_flag); - stop_meas(&UE->dlsch_decoding_stats); - - if (cw==1) { - if (ret <= UE->dlsch[0][cw]->max_turbo_iterations) { - } else { - errs2[round]++; - } - } - } - - - stop_meas(&UE->phy_proc_rx); - */ if (UE->dlsch_errors[0] == 0) { @@ -3120,45 +2493,7 @@ int main(int argc, char **argv) UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->TBS; TB0_active = 0; - if (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC - - //for (round = 0 ; round < UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->round ; round++) { - // re-encoding of first stream - //dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; - //dlsch0_eNB_harq = UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]; - //dlsch0_eNB_harq->mimo_mode = LARGE_CDD; - //dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0]; - //dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb; - //dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs; - //dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx; - //dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl; - - //dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS; - //dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off; - //dlsch0_eNB_harq->status = dlsch0_ue_harq->status; - - //UE->dlsch[eNB_id]->active = UE->dlsch[eNB_id][0]->active; - //UE->dlsch[eNB_id]->rnti = UE->dlsch[eNB_id][0]->rnti; - - //dlsch_encoding(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->b, - // &UE->frame_parms, - // num_pdcch_symbols, - // UE->dlsch[0], - // 0,subframe, - // &UE->dlsch_rate_matching_stats, - // &UE->dlsch_turbo_encoding_stats, - // &UE->dlsch_interleaving_stats - // ); - - //scrambling - - //modulation - - //stripping (from matched filter output?) - - //detection of second stream - } - + } // DLSCH received ok else { errs[round]++; @@ -3449,13 +2784,14 @@ int main(int argc, char **argv) printf("eNB TX function statistics (per 1ms subframe)\n\n"); std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, 2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials); - printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, - n_tx_dropped); std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, 2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); printf("OFDM_mod time :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); + printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials); + printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, + n_tx_dropped); + std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, 2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); printf("DLSCH modulation time :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0, @@ -3809,24 +3145,6 @@ int main(int argc, char **argv) } - printf("Freeing channel I/O\n"); - - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - - // lte_sync_time_free(); - - // printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0])); - return(0); } diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index bf166f6d64..5b558e2921 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -82,6 +82,7 @@ #define BCCH_PAYLOAD_SIZE_MAX 128 #define CCCH_PAYLOAD_SIZE_MAX 128 +#define PCCH_PAYLOAD_SIZE_MAX 128 #define SCH_PAYLOAD_SIZE_MAX 4096 /// Logical channel ids from 36-311 (Note BCCH is not specified in 36-311, uses the same as first DRB) @@ -263,6 +264,10 @@ typedef struct { typedef struct { uint8_t payload[BCCH_PAYLOAD_SIZE_MAX] ; } __attribute__((__packed__))BCCH_PDU; +/*! \brief BCCH payload */ +typedef struct { + uint8_t payload[PCCH_PAYLOAD_SIZE_MAX] ; +} __attribute__((__packed__))PCCH_PDU; #ifdef Rel10 /*! \brief MCCH payload */ @@ -291,6 +296,8 @@ typedef struct { #define CCCH_LCHANID 0 /*!\brief Values of BCCH logical channel */ #define BCCH 3 // SI +/*!\brief Values of PCCH logical channel */ +#define PCCH 4 // Paging /*!\brief Value of CCCH / SRB0 logical channel */ #define CCCH 0 // srb0 /*!\brief DCCH / SRB1 logical channel */ @@ -1104,6 +1111,8 @@ typedef struct { time_stats_t rx_mch_sdu; /// UE BCCH rx processing time including RLC interface (mac_rrc_data_ind) time_stats_t rx_si; + /// UE PCCH rx processing time including RLC interface (mac_rrc_data_ind) + time_stats_t rx_p; } UE_MAC_INST; /*! \brief ID of the neighboring cells used for HO*/ typedef struct { diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index 7480babd24..fd29513470 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -480,6 +480,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui LOG_I(MAC,"[MAIN] init UE MAC functions \n"); mac_xface->ue_decode_si = ue_decode_si; + mac_xface->ue_decode_p = ue_decode_p; mac_xface->ue_send_sdu = ue_send_sdu; #ifdef Rel10 mac_xface->ue_send_mch_sdu = ue_send_mch_sdu; diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index b6b223bd6a..10d5093dd4 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -385,6 +385,8 @@ void mac_out_of_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t CH_ind void ue_decode_si(module_id_t module_idP, int CC_id,frame_t frame, uint8_t CH_index, void *pdu, uint16_t len); +void ue_decode_p(module_id_t module_idP, int CC_id,frame_t frame, uint8_t CH_index, void *pdu, uint16_t len); + void ue_send_sdu(module_id_t module_idP, uint8_t CC_id,frame_t frame, uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index); diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 1d7e49070b..a3c35d18b8 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -525,6 +525,41 @@ void ue_decode_si(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_i } } +void ue_decode_p(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_index, void *pdu,uint16_t len) +{ + + start_meas(&UE_mac_inst[module_idP].rx_p); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_IN); + + LOG_D(MAC,"[UE %d] Frame %d Sending Paging message to RRC (LCID Id %d,len %d)\n",module_idP,frameP,PCCH,len); + + mac_rrc_data_ind(module_idP, + CC_id, + frameP,0, // unknown subframe + P_RNTI, + PCCH, + (uint8_t *)pdu, + len, + ENB_FLAG_NO, + eNB_index, + 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_OUT); + stop_meas(&UE_mac_inst[module_idP].rx_p); + if (opt_enabled == 1) { + trace_pdu(0, + (uint8_t *)pdu, + len, + module_idP, + 4, + P_RNTI, + UE_mac_inst[module_idP].subframe, + 0, + 0); + LOG_D(OPT,"[UE %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", + module_idP, frameP, CC_id, P_RNTI, len); + } +} + #ifdef Rel10 unsigned char *parse_mch_header(unsigned char *mac_header, unsigned char *num_sdu, diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h index 5d933094f3..6b45bbdc7b 100755 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -146,6 +146,9 @@ typedef struct { /// Send a received SI sdu void (*ue_decode_si)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len); + /// Send a received Paging sdu + void (*ue_decode_p)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len); + /// Send a received DLSCH sdu to MAC void (*ue_send_sdu)(module_id_t Mod_id,uint8_t CC_id,frame_t frameP,uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index); diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index 0558376b1d..3bdd88b821 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -397,6 +397,10 @@ mac_rrc_data_ind( #endif } + if(srb_idP == PCCH) { + LOG_D(RRC,"[UE %d] Received SDU for PCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); + decode_PCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t*)sduP,sdu_lenP); + } if((srb_idP & RAB_OFFSET) == CCCH) { if (sdu_lenP>0) { LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",module_idP,srb_idP & RAB_OFFSET,eNB_indexP); diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 7b316ce953..f200b14d30 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -357,6 +357,12 @@ int decode_BCCH_DLSCH_Message( const uint8_t rsrq, const uint8_t rsrp ); +int decode_PCCH_DLSCH_Message( + const protocol_ctxt_t* const ctxt_pP, + const uint8_t eNB_index, + uint8_t* const Sdu, + const uint8_t Sdu_len); + void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index c72c106e0f..8ea604f932 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -58,6 +58,7 @@ #include "UL-DCCH-Message.h" #include "DL-DCCH-Message.h" #include "BCCH-DL-SCH-Message.h" +#include "PCCH-Message.h" #ifdef Rel10 #include "MCCH-Message.h" #endif @@ -2463,6 +2464,39 @@ int decode_BCCH_DLSCH_Message( return 0; } +//----------------------------------------------------------------------------- +int decode_PCCH_DLSCH_Message( + const protocol_ctxt_t* const ctxt_pP, + const uint8_t eNB_index, + uint8_t* const Sdu, + const uint8_t Sdu_len) +{ + PCCH_Message_t *pcch_message = NULL; + int i; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_IN ); + + asn_dec_rval_t dec_rval = uper_decode_complete( NULL, + &asn_DEF_PCCH_Message, + (void **)&pcch_message, + (const void *)Sdu, + Sdu_len ); + + if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { + LOG_E( RRC, "[UE %"PRIu8"] Failed to decode PCCH_MESSAGE (%zu bits)\n", + ctxt_pP->module_id, + dec_rval.consumed ); + for (i=0;i Date: Sat, 3 Sep 2016 08:57:59 -0700 Subject: [PATCH 211/340] added pch.c --- openair1/PHY/LTE_TRANSPORT/pch.c | 61 ++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 openair1/PHY/LTE_TRANSPORT/pch.c diff --git a/openair1/PHY/LTE_TRANSPORT/pch.c b/openair1/PHY/LTE_TRANSPORT/pch.c new file mode 100644 index 0000000000..167d9c19ae --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/pch.c @@ -0,0 +1,61 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "assertions.h" + +const unsigned int Ttab[4] = {32,64,128,256}; + +// This function implements the initialization of paging parameters for UE (See Section 7, 36.304) +// It must be called after setting IMSImod1024 during UE startup and after receiving SIB2 +int init_ue_paging_info(PHY_VARS_UE *ue, long defaultPagingCycle, long nB) { + + LTE_DL_FRAME_PARMS *fp = &ue->frame_parms; + + unsigned int T = Ttab[defaultPagingCycle]; + unsigned int N = (nB<=2) ? T : (T>>(nB-2)); + unsigned int Ns = (nB<2) ? (1<<(2-nB)) : 1; + unsigned int UE_ID = ue->IMSImod1024; + unsigned int i_s = (UE_ID/N)%Ns; + + + ue->PF = (T/N) * (UE_ID % N); + + // This implements Section 7.2 from 36.304 + if (Ns==1) + ue->PO = (fp->frame_type==FDD) ? 9 : 0; + else if (Ns==2) + ue->PO = (fp->frame_type==FDD) ? (4+(5*i_s)) : (5*i_s); + else if (Ns==4) + ue->PO = (fp->frame_type==FDD) ? (4*(i_s&1)+(5*(i_s>>1))) : ((i_s&1)+(5*(i_s>>1))); + else + AssertFatal(1==0,"init_ue_paging_info: Ns is %d\n",Ns); + + return(0); +} From b8b2edb3a9e23c4f824ad4da3dc13fa98e07e944 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 3 Sep 2016 12:52:28 -0700 Subject: [PATCH 212/340] updates in ulsim for new multipath_channel declaration. Small optimization in dlsch_modulation.c --- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 29 ++++++++++++++++- openair1/SIMULATION/LTE_PHY/ulsim.c | 31 +------------------ 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 034dc0ada8..48b3f53be4 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -328,7 +328,7 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; re<12; - re++,x0p+=6,tti_offset++) { + re+=4,x0p+=24,tti_offset+=4) { qam64_table_offset_re=FOUR[x0p[0]]; qam64_table_offset_im=FOUR[x0p[1]]; @@ -338,6 +338,33 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, qam64_table_offset_im+=x0p[5]; ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=FOUR[x0p[6]]; + qam64_table_offset_im=FOUR[x0p[7]]; + qam64_table_offset_re+=TWO[x0p[8]]; + qam64_table_offset_im+=TWO[x0p[9]]; + qam64_table_offset_re+=x0p[10]; + qam64_table_offset_im+=x0p[11]; + ((int16_t *)&txdataF[0][tti_offset])[2]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[3]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=FOUR[x0p[12]]; + qam64_table_offset_im=FOUR[x0p[13]]; + qam64_table_offset_re+=TWO[x0p[14]]; + qam64_table_offset_im+=TWO[x0p[15]]; + qam64_table_offset_re+=x0p[16]; + qam64_table_offset_im+=x0p[17]; + ((int16_t *)&txdataF[0][tti_offset])[4]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[5]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=FOUR[x0p[18]]; + qam64_table_offset_im=FOUR[x0p[19]]; + qam64_table_offset_re+=TWO[x0p[20]]; + qam64_table_offset_im+=TWO[x0p[21]]; + qam64_table_offset_re+=x0p[22]; + qam64_table_offset_im+=x0p[23]; + ((int16_t *)&txdataF[0][tti_offset])[6]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[7]=qam_table_s0[qam64_table_offset_im]; } } else { diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 48b3f8cec1..2c2b03ce78 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -188,7 +188,7 @@ int main(int argc, char **argv) int **txdata; LTE_DL_FRAME_PARMS *frame_parms; - double **s_re,**s_im,**r_re,**r_im; + double s_re[2][30720],s_im[2][30720],r_re[2][30720],r_im[2][30720]; double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel double iqim=0.0; uint8_t extended_prefix_flag=0; @@ -583,12 +583,6 @@ int main(int argc, char **argv) txdata = UE->common_vars.txdata; - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); - // r_re0 = malloc(2*sizeof(double*)); - // r_im0 = malloc(2*sizeof(double*)); nsymb = (eNB->frame_parms.Ncp == NORMAL) ? 14 : 12; @@ -630,13 +624,6 @@ int main(int argc, char **argv) fprintf(csv_fdUL,"data_all%d=[",mcs); } - for (i=0; i<2; i++) { - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - } - if (xforms==1) { fl_initialize (&argc, argv, NULL, 0, 0); @@ -1716,22 +1703,6 @@ int main(int argc, char **argv) if (test_perf !=0) fclose (time_meas_fd); - printf("Freeing channel I/O\n"); - - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - - // lte_sync_time_free(); - return(0); } From 64cd0076ba3e06c9d7379f034b0c183d69932a7b Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 5 Sep 2016 11:41:48 +0200 Subject: [PATCH 213/340] bugfix: print a warning when a configuration parameter is not found If your configuration file does not contain a parameter the softmodem only printed "Failed to parse eNB configuration file" without telling you what parameter was not found. This quick fix adds a warning in such cases. It also exists at the first error rather than trying to parse the rest of the configuration file. --- openair2/ENB_APP/enb_config.c | 217 ++++++++++++++++++---------------- 1 file changed, 117 insertions(+), 100 deletions(-) diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 76f7bceaf8..58ce97d3e4 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -60,6 +60,27 @@ #include "SystemInformationBlockType2.h" #include "LAYER2/MAC/extern.h" +/* those macros are here to help diagnose problems in configuration files + * if the lookup fails, a warning is printed + * (yes we can use the function name for the macro itself, the C preprocessor + * won't die in an infinite loop) + */ +#define config_setting_lookup_int(setting, name, value) \ + (config_setting_lookup_int(setting, name, value) || \ + (printf("WARNING: setting '%s' not found in configuration file\n", name), 0)) +#define config_setting_lookup_int64(setting, name, value) \ + (config_setting_lookup_int64(setting, name, value) || \ + (printf("WARNING: setting '%s' not found in configuration file\n", name), 0)) +#define config_setting_lookup_float(setting, name, value) \ + (config_setting_lookup_float(setting, name, value) || \ + (printf("WARNING: setting '%s' not found in configuration file\n", name), 0)) +#define config_setting_lookup_bool(setting, name, value) \ + (config_setting_lookup_bool(setting, name, value) || \ + (printf("WARNING: setting '%s' not found in configuration file\n", name), 0)) +#define config_setting_lookup_string(setting, name, value) \ + (config_setting_lookup_string(setting, name, value) || \ + (printf("WARNING: setting '%s' not found in configuration file\n", name), 0)) + #define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" #define ENB_CONFIG_STRING_ENB_LIST "eNBs" @@ -514,7 +535,6 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) int num_component_carriers = 0; int i = 0; int j = 0; - int parse_errors = 0; libconfig_int enb_id = 0; const char* cell_type = NULL; const char* tac = 0; @@ -716,7 +736,6 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) if (setting != NULL) { enb_properties_index = 0; - parse_errors = 0; num_enbs = config_setting_length(setting); for (i = 0; i < num_enbs; i++) { @@ -743,7 +762,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) ) ) { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, %u th enb\n", lib_config_file_name_pP, i); continue; // FIXME this prevents segfaults below, not sure what happens after function exit @@ -761,7 +780,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { enb_properties.properties[enb_properties_index]->cell_type = CELL_HOME_ENB; } else { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n", lib_config_file_name_pP, i, cell_type); } @@ -865,7 +884,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) #endif )) { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, Component Carrier %d!\n", lib_config_file_name_pP, enb_properties.properties[enb_properties_index]->nb_cc++); continue; // FIXME this prevents segfaults below, not sure what happens after function exit @@ -874,17 +893,17 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->nb_cc++; enb_properties.properties[enb_properties_index]->tdd_config[j] = tdd_config; - AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, + AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6, "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!", lib_config_file_name_pP, i, tdd_config, TDD_Config__subframeAssignment_sa6); enb_properties.properties[enb_properties_index]->tdd_config_s[j] = tdd_config_s; - AssertError (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, parse_errors ++, + AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!", lib_config_file_name_pP, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); if (!prefix_type) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n", lib_config_file_name_pP, i, ENB_CONFIG_STRING_PREFIX_TYPE); else if (strcmp(prefix_type, "NORMAL") == 0) { @@ -892,7 +911,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(prefix_type, "EXTENDED") == 0) { enb_properties.properties[enb_properties_index]->prefix_type[j] = EXTENDED; } else { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", lib_config_file_name_pP, i, prefix_type); } @@ -903,7 +922,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->Nid_cell[j]= Nid_cell; if (Nid_cell>503) { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n", lib_config_file_name_pP, i, Nid_cell); } @@ -911,7 +930,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->N_RB_DL[j]= N_RB_DL; if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n", lib_config_file_name_pP, i, N_RB_DL); } @@ -921,27 +940,27 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(frame_type, "TDD") == 0) { enb_properties.properties[enb_properties_index]->frame_type[j] = TDD; } else { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n", lib_config_file_name_pP, i, frame_type); } enb_properties.properties[enb_properties_index]->tdd_config[j] = tdd_config; - AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, + AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6, "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!", lib_config_file_name_pP, i, tdd_config, TDD_Config__subframeAssignment_sa6); enb_properties.properties[enb_properties_index]->tdd_config_s[j] = tdd_config_s; - AssertError (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, parse_errors ++, + AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!", lib_config_file_name_pP, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); if (!prefix_type) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n", lib_config_file_name_pP, i, ENB_CONFIG_STRING_PREFIX_TYPE); else if (strcmp(prefix_type, "NORMAL") == 0) { @@ -949,7 +968,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(prefix_type, "EXTENDED") == 0) { enb_properties.properties[enb_properties_index]->prefix_type[j] = EXTENDED; } else { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", lib_config_file_name_pP, i, prefix_type); } @@ -967,64 +986,66 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset; - parse_errors += enb_check_band_frequencies(lib_config_file_name_pP, + if (enb_check_band_frequencies(lib_config_file_name_pP, enb_properties_index, enb_properties.properties[enb_properties_index]->eutra_band[j], enb_properties.properties[enb_properties_index]->downlink_frequency[j], enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j], - enb_properties.properties[enb_properties_index]->frame_type[j]); + enb_properties.properties[enb_properties_index]->frame_type[j])) { + AssertFatal(0, "error calling enb_check_band_frequencies\n"); + } enb_properties.properties[enb_properties_index]->nb_antennas_tx[j] = nb_antennas_tx; if ((nb_antenna_ports <1) || (nb_antenna_ports > 2)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antenna_ports choice: 1..2 !\n", lib_config_file_name_pP, i, nb_antenna_ports); enb_properties.properties[enb_properties_index]->nb_antenna_ports[j] = nb_antenna_ports; if ((nb_antennas_tx <1) || (nb_antennas_tx > 64)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antennas_tx choice: 1..4 !\n", lib_config_file_name_pP, i, nb_antennas_tx); enb_properties.properties[enb_properties_index]->nb_antennas_rx[j] = nb_antennas_rx; if ((nb_antennas_rx <1) || (nb_antennas_rx > 4)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antennas_rx choice: 1..4 !\n", lib_config_file_name_pP, i, nb_antennas_rx); enb_properties.properties[enb_properties_index]->tx_gain[j] = tx_gain; if ((tx_gain <0) || (tx_gain > 127)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for tx_gain choice: 0..127 !\n", lib_config_file_name_pP, i, tx_gain); enb_properties.properties[enb_properties_index]->rx_gain[j] = rx_gain; if ((rx_gain <0) || (rx_gain > 160)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rx_gain choice: 0..160 !\n", lib_config_file_name_pP, i, rx_gain); enb_properties.properties[enb_properties_index]->prach_root[j] = prach_root; if ((prach_root <0) || (prach_root > 1023)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_root choice: 0..1023 !\n", lib_config_file_name_pP, i, prach_root); enb_properties.properties[enb_properties_index]->prach_config_index[j] = prach_config_index; if ((prach_config_index <0) || (prach_config_index > 63)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_config_index choice: 0..1023 !\n", lib_config_file_name_pP, i, prach_config_index); if (!prach_high_speed) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", lib_config_file_name_pP, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED); else if (strcmp(prach_high_speed, "ENABLE") == 0) { @@ -1032,21 +1053,21 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(prach_high_speed, "DISABLE") == 0) { enb_properties.properties[enb_properties_index]->prach_high_speed[j] = FALSE; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n", lib_config_file_name_pP, i, prach_high_speed); enb_properties.properties[enb_properties_index]->prach_zero_correlation[j] =prach_zero_correlation; if ((prach_zero_correlation <0) || (prach_zero_correlation > 15)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n", lib_config_file_name_pP, i, prach_zero_correlation); enb_properties.properties[enb_properties_index]->prach_freq_offset[j] = prach_freq_offset; if ((prach_freq_offset <0) || (prach_freq_offset > 94)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 0..94!\n", lib_config_file_name_pP, i, prach_freq_offset); @@ -1054,21 +1075,21 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->pucch_delta_shift[j] = pucch_delta_shift-1; if ((pucch_delta_shift <1) || (pucch_delta_shift > 3)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n", lib_config_file_name_pP, i, pucch_delta_shift); enb_properties.properties[enb_properties_index]->pucch_nRB_CQI[j] = pucch_nRB_CQI; if ((pucch_nRB_CQI <0) || (pucch_nRB_CQI > 98)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n", lib_config_file_name_pP, i, pucch_nRB_CQI); enb_properties.properties[enb_properties_index]->pucch_nCS_AN[j] = pucch_nCS_AN; if ((pucch_nCS_AN <0) || (pucch_nCS_AN > 7)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n", lib_config_file_name_pP, i, pucch_nCS_AN); @@ -1076,7 +1097,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->pucch_n1_AN[j] = pucch_n1_AN; if ((pucch_n1_AN <0) || (pucch_n1_AN > 2047)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n", lib_config_file_name_pP, i, pucch_n1_AN); @@ -1084,26 +1105,26 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->pdsch_referenceSignalPower[j] = pdsch_referenceSignalPower; if ((pdsch_referenceSignalPower <-60) || (pdsch_referenceSignalPower > 50)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n", lib_config_file_name_pP, i, pdsch_referenceSignalPower); enb_properties.properties[enb_properties_index]->pdsch_p_b[j] = pdsch_p_b; if ((pdsch_p_b <0) || (pdsch_p_b > 3)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_p_b choice: 0..3!\n", lib_config_file_name_pP, i, pdsch_p_b); enb_properties.properties[enb_properties_index]->pusch_n_SB[j] = pusch_n_SB; if ((pusch_n_SB <1) || (pusch_n_SB > 4)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_n_SB choice: 1..4!\n", lib_config_file_name_pP, i, pusch_n_SB); if (!pusch_hoppingMode) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d define %s: interSubframe,intraAndInterSubframe!\n", lib_config_file_name_pP, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE); else if (strcmp(pusch_hoppingMode,"interSubFrame")==0) { @@ -1111,19 +1132,19 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pusch_hoppingMode,"intraAndInterSubFrame")==0) { enb_properties.properties[enb_properties_index]->pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n", lib_config_file_name_pP, i, pusch_hoppingMode); enb_properties.properties[enb_properties_index]->pusch_hoppingOffset[j] = pusch_hoppingOffset; if ((pusch_hoppingOffset<0) || (pusch_hoppingOffset>98)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n", lib_config_file_name_pP, i, pusch_hoppingMode); if (!pusch_enable64QAM) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", lib_config_file_name_pP, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM); else if (strcmp(pusch_enable64QAM, "ENABLE") == 0) { @@ -1131,12 +1152,12 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pusch_enable64QAM, "DISABLE") == 0) { enb_properties.properties[enb_properties_index]->pusch_enable64QAM[j] = FALSE; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n", lib_config_file_name_pP, i, pusch_enable64QAM); if (!pusch_groupHoppingEnabled) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", lib_config_file_name_pP, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN); else if (strcmp(pusch_groupHoppingEnabled, "ENABLE") == 0) { @@ -1144,7 +1165,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pusch_groupHoppingEnabled, "DISABLE") == 0) { enb_properties.properties[enb_properties_index]->pusch_groupHoppingEnabled[j] = FALSE; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n", lib_config_file_name_pP, i, pusch_groupHoppingEnabled); @@ -1152,12 +1173,12 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->pusch_groupAssignment[j] = pusch_groupAssignment; if ((pusch_groupAssignment<0)||(pusch_groupAssignment>29)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n", lib_config_file_name_pP, i, pusch_groupAssignment); if (!pusch_sequenceHoppingEnabled) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", lib_config_file_name_pP, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN); else if (strcmp(pusch_sequenceHoppingEnabled, "ENABLE") == 0) { @@ -1165,14 +1186,14 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pusch_sequenceHoppingEnabled, "DISABLE") == 0) { enb_properties.properties[enb_properties_index]->pusch_sequenceHoppingEnabled[j] = FALSE; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n", lib_config_file_name_pP, i, pusch_sequenceHoppingEnabled); enb_properties.properties[enb_properties_index]->pusch_nDMRS1[j] = pusch_nDMRS1; //cyclic_shift in RRC! if ((pusch_nDMRS1 <0) || (pusch_nDMRS1>7)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n", lib_config_file_name_pP, i, pusch_nDMRS1); @@ -1181,7 +1202,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(phich_duration,"EXTENDED")==0) { enb_properties.properties[enb_properties_index]->phich_duration[j] = extended; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n", lib_config_file_name_pP, i, phich_duration); @@ -1194,7 +1215,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(phich_resource,"TWO")==0) { enb_properties.properties[enb_properties_index]->phich_resource[j] = two; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n", lib_config_file_name_pP, i, phich_resource); @@ -1203,7 +1224,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(srs_enable, "DISABLE") == 0) { enb_properties.properties[enb_properties_index]->srs_enable[j] = FALSE; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", lib_config_file_name_pP, i, srs_enable); @@ -1213,21 +1234,20 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_SRS_ACKNACKST_CONFIG, &srs_ackNackST) && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_SRS_MAXUPPTS, &srs_MaxUpPts) )) - AssertError(0, - parse_errors++, + AssertFatal(0, "Failed to parse eNB configuration file %s, enb %d unknown values for srs_BandwidthConfig, srs_SubframeConfig, srs_ackNackST, srs_MaxUpPts\n", lib_config_file_name_pP, i); enb_properties.properties[enb_properties_index]->srs_BandwidthConfig[j] = srs_BandwidthConfig; if ((srs_BandwidthConfig < 0) || (srs_BandwidthConfig >7)) - AssertError (0, parse_errors ++, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n", + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n", lib_config_file_name_pP, i, srs_BandwidthConfig); enb_properties.properties[enb_properties_index]->srs_SubframeConfig[j] = srs_SubframeConfig; if ((srs_SubframeConfig<0) || (srs_SubframeConfig>15)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n", lib_config_file_name_pP, i, srs_SubframeConfig); @@ -1236,7 +1256,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(srs_ackNackST, "DISABLE") == 0) { enb_properties.properties[enb_properties_index]->srs_ackNackST[j] = FALSE; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", lib_config_file_name_pP, i, srs_ackNackST); @@ -1245,7 +1265,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(srs_MaxUpPts, "DISABLE") == 0) { enb_properties.properties[enb_properties_index]->srs_MaxUpPts[j] = FALSE; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n", lib_config_file_name_pP, i, srs_MaxUpPts); } @@ -1253,7 +1273,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->pusch_p0_Nominal[j] = pusch_p0_Nominal; if ((pusch_p0_Nominal<-126) || (pusch_p0_Nominal>24)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n", lib_config_file_name_pP, i, pusch_p0_Nominal); @@ -1274,21 +1294,21 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pusch_alpha,"AL1")==0) { enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al1; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n", lib_config_file_name_pP, i, pusch_alpha); enb_properties.properties[enb_properties_index]->pucch_p0_Nominal[j] = pucch_p0_Nominal; if ((pucch_p0_Nominal<-127) || (pucch_p0_Nominal>-96)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n", lib_config_file_name_pP, i, pucch_p0_Nominal); enb_properties.properties[enb_properties_index]->msg3_delta_Preamble[j] = msg3_delta_Preamble; if ((msg3_delta_Preamble<-1) || (msg3_delta_Preamble>6)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n", lib_config_file_name_pP, i, msg3_delta_Preamble); @@ -1300,7 +1320,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pucch_deltaF_Format1,"deltaF2")==0) { enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n", lib_config_file_name_pP, i, pucch_deltaF_Format1); @@ -1311,7 +1331,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pucch_deltaF_Format1b,"deltaF5")==0) { enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n", lib_config_file_name_pP, i, pucch_deltaF_Format1b); @@ -1325,7 +1345,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pucch_deltaF_Format2,"deltaF2")==0) { enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n", lib_config_file_name_pP, i, pucch_deltaF_Format2); @@ -1336,7 +1356,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pucch_deltaF_Format2a,"deltaF2")==0) { enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n", lib_config_file_name_pP, i, pucch_deltaF_Format2a); @@ -1347,7 +1367,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pucch_deltaF_Format2b,"deltaF2")==0) { enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n", lib_config_file_name_pP, i, pucch_deltaF_Format2b); @@ -1357,7 +1377,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rach_numberOfRA_Preambles[j] = (rach_numberOfRA_Preambles/4)-1; if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>64) || ((rach_numberOfRA_Preambles&3)!=0)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n", lib_config_file_name_pP, i, rach_numberOfRA_Preambles); @@ -1367,14 +1387,14 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) if (!(config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_SIZEOFRA_PREAMBLESGROUPA, &rach_sizeOfRA_PreamblesGroupA) && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MESSAGESIZEGROUPA, &rach_messageSizeGroupA) && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_RACH_MESSAGEPOWEROFFSETGROUPB, &rach_messagePowerOffsetGroupB))) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d rach_sizeOfRA_PreamblesGroupA, messageSizeGroupA,messagePowerOffsetGroupB!\n", lib_config_file_name_pP, i); enb_properties.properties[enb_properties_index]->rach_sizeOfRA_PreamblesGroupA[j] = (rach_sizeOfRA_PreamblesGroupA/4)-1; if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>60) || ((rach_numberOfRA_Preambles&3)!=0)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n", lib_config_file_name_pP, i, rach_sizeOfRA_PreamblesGroupA); @@ -1397,7 +1417,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n", lib_config_file_name_pP, i, rach_messageSizeGroupA); break; @@ -1434,21 +1454,21 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) else if (strcmp(rach_messagePowerOffsetGroupB,"dB18")==0) { enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n", lib_config_file_name_pP, i, rach_messagePowerOffsetGroupB); } else if (strcmp(rach_preamblesGroupAConfig, "DISABLE") == 0) { enb_properties.properties[enb_properties_index]->rach_preamblesGroupAConfig[j] = FALSE; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n", lib_config_file_name_pP, i, rach_preamblesGroupAConfig); enb_properties.properties[enb_properties_index]->rach_preambleInitialReceivedTargetPower[j] = (rach_preambleInitialReceivedTargetPower+120)/2; if ((rach_preambleInitialReceivedTargetPower<-120) || (rach_preambleInitialReceivedTargetPower>-90) || ((rach_preambleInitialReceivedTargetPower&1)!=0)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n", lib_config_file_name_pP, i, rach_preambleInitialReceivedTargetPower); @@ -1456,7 +1476,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rach_powerRampingStep[j] = rach_powerRampingStep/2; if ((rach_powerRampingStep<0) || (rach_powerRampingStep>6) || ((rach_powerRampingStep&1)!=0)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n", lib_config_file_name_pP, i, rach_powerRampingStep); @@ -1508,7 +1528,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n", lib_config_file_name_pP, i, rach_preambleTransMax); break; @@ -1517,7 +1537,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rach_raResponseWindowSize[j] = (rach_raResponseWindowSize==10)?7:rach_raResponseWindowSize-2; if ((rach_raResponseWindowSize<0)||(rach_raResponseWindowSize==9)||(rach_raResponseWindowSize>10)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n", lib_config_file_name_pP, i, rach_preambleTransMax); @@ -1525,14 +1545,14 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->rach_macContentionResolutionTimer[j] = (rach_macContentionResolutionTimer/8)-1; if ((rach_macContentionResolutionTimer<8) || (rach_macContentionResolutionTimer>64) || ((rach_macContentionResolutionTimer&7)!=0)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n", lib_config_file_name_pP, i, rach_preambleTransMax); enb_properties.properties[enb_properties_index]->rach_maxHARQ_Msg3Tx[j] = rach_maxHARQ_Msg3Tx; if ((rach_maxHARQ_Msg3Tx<0) || (rach_maxHARQ_Msg3Tx>8)) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n", lib_config_file_name_pP, i, rach_preambleTransMax); @@ -1555,7 +1575,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n", lib_config_file_name_pP, i, pcch_defaultPagingCycle); break; @@ -1578,7 +1598,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (strcmp(pcch_nB, "oneThirtySecondT") == 0) { enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneThirtySecondT; } else - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n", lib_config_file_name_pP, i, pcch_defaultPagingCycle); @@ -1602,7 +1622,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16", lib_config_file_name_pP, i, bcch_modificationPeriodCoeff); @@ -1644,7 +1664,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t300 choice: 100,200,300,400,600,1000,1500,2000 ", lib_config_file_name_pP, i, ue_TimersAndConstants_t300); break; @@ -1685,7 +1705,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t301 choice: 100,200,300,400,600,1000,1500,2000 ", lib_config_file_name_pP, i, ue_TimersAndConstants_t301); break; @@ -1722,7 +1742,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t310 choice: 0,50,100,200,500,1000,1500,2000 ", lib_config_file_name_pP, i, ue_TimersAndConstants_t310); break; @@ -1759,7 +1779,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1000,3000,5000,10000,150000,20000,30000", lib_config_file_name_pP, i, ue_TimersAndConstants_t311); break; @@ -1800,7 +1820,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_n310 choice: 1,2,3,4,6,6,8,10,20", lib_config_file_name_pP, i, ue_TimersAndConstants_n311); break; @@ -1841,7 +1861,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1,2,3,4,5,6,8,10", lib_config_file_name_pP, i, ue_TimersAndConstants_t311); break; @@ -1871,7 +1891,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm7; break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7", lib_config_file_name_pP, i, ue_TransmissionMode); break; @@ -1888,7 +1908,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) && config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_MAX_RETX_THRESHOLD, &srb1_max_retx_threshold) && config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_POLL_PDU, &srb1_poll_pdu) && config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_POLL_BYTE, &srb1_poll_byte))) - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d timer_poll_retransmit, timer_reordering, " "timer_status_prohibit, poll_pdu, poll_byte, max_retx_threshold !\n", lib_config_file_name_pP, i); @@ -1927,7 +1947,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Bad config value when parsing eNB configuration file %s, enb %d srb1_max_retx_threshold %u!\n", lib_config_file_name_pP, i, srb1_max_retx_threshold); } @@ -1965,7 +1985,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) if (srb1_poll_pdu >= 10000) enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_pInfinity; else - AssertError (0, parse_errors ++, + AssertFatal (0, "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_pdu %u!\n", lib_config_file_name_pP, i, srb1_poll_pdu); } @@ -2033,7 +2053,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) if (srb1_poll_byte >= 10000) enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kBinfinity; else - AssertError (0, parse_errors ++, + AssertFatal (0, "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_byte %u!\n", lib_config_file_name_pP, i, srb1_poll_byte); } @@ -2043,7 +2063,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if (srb1_timer_poll_retransmit <= 500) { enb_properties.properties[enb_properties_index]->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 300)/50 + 50; } else { - AssertError (0, parse_errors ++, + AssertFatal (0, "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_poll_retransmit %u!\n", lib_config_file_name_pP, i, srb1_timer_poll_retransmit); } @@ -2053,7 +2073,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } else if ((srb1_timer_poll_retransmit >= 300) && (srb1_timer_poll_retransmit <= 500)) { enb_properties.properties[enb_properties_index]->srb1_timer_status_prohibit = (srb1_timer_status_prohibit - 300)/50 + 51; } else { - AssertError (0, parse_errors ++, + AssertFatal (0, "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_status_prohibit %u!\n", lib_config_file_name_pP, i, srb1_timer_status_prohibit); } @@ -2184,7 +2204,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) break; default: - AssertError (0, parse_errors ++, + AssertFatal (0, "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_reordering %u!\n", lib_config_file_name_pP, i, srb1_timer_reordering); } @@ -2211,7 +2231,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, (const char **)&preference) ) ) { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, %u th enb %u th mme address !\n", lib_config_file_name_pP, i, j); continue; // FIXME will prevent segfaults below, not sure what happens at function exit... @@ -2261,7 +2281,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE, &tx_scheduling_advance) ) ) { - AssertError (0, parse_errors ++, + AssertFatal (0, "Failed to parse eNB configuration file %s, %u th enb %u the RRH GW address !\n", lib_config_file_name_pP, i, j); continue; // FIXME will prevent segfaults below, not sure what happens at function exit... @@ -2664,13 +2684,10 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.number = num_enb_properties; - AssertError (enb_properties_index == num_enb_properties, parse_errors ++, + AssertFatal (enb_properties_index == num_enb_properties, "Failed to parse eNB configuration file %s, mismatch between %u active eNBs and %u corresponding defined eNBs !\n", lib_config_file_name_pP, num_enb_properties, enb_properties_index); - AssertFatal (parse_errors == 0, - "Failed to parse eNB configuration file %s, found %d error%s !\n", - lib_config_file_name_pP, parse_errors, parse_errors > 1 ? "s" : ""); enb_config_display(); return &enb_properties; From f47f78ba55f156eadf6699027a6adea397773ec3 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 6 Sep 2016 20:26:37 +0200 Subject: [PATCH 214/340] addition of TM2 test cases --- cmake_targets/autotests/README.txt | 55 +- cmake_targets/autotests/test_case_list.xml | 2525 +++++++++++++++++++- 2 files changed, 2451 insertions(+), 129 deletions(-) diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt index cf1e28dd05..241762f2a2 100644 --- a/cmake_targets/autotests/README.txt +++ b/cmake_targets/autotests/README.txt @@ -99,25 +99,31 @@ Obj.# Case# Test# Description 01 51 06 mbmssim (TBD) -01 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX, 2TX/2RX +01 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX (TM1), 2TX/2RX (TM2) 01 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 03 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 04 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 05 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX -01 55 06 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 07 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 08 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 09 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 10 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 11 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX +01 55 06 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 07 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 08 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 09 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 10 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 11 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) 01 55 12 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 13 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 14 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 15 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 16 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 17 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 55 18 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 19 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 20 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 21 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 22 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 23 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) 01 56 lte-softmodem tests with USRP B210 RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE 01 56 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX @@ -135,7 +141,7 @@ Obj.# Case# Test# Description 01 57 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 57 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 58 lte-softmodem tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for `TX/1RX, 2TX/2RX +01 58 lte-softmodem tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX (TM1), 2TX/2RX(TM2) 01 58 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 58 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 58 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX @@ -148,6 +154,18 @@ Obj.# Case# Test# Description 01 58 09 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 01 58 10 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 01 58 11 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 58 12 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 13 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 14 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 15 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 16 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 17 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 18 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 19 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 20 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 21 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 22 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 23 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) 01 59 lte-softmodem tests with USRP X310 RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE @@ -160,7 +178,7 @@ Obj.# Case# Test# Description 01 60 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 60 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 61 lte-softmodem tests with EXMIMO RF as eNB and ALU EPC w/ Bandrich COTS UE for `TX/1RX, 2TX/2RX +01 61 lte-softmodem tests with EXMIMO RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX, 2TX/2RX 01 61 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 61 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 61 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX @@ -178,7 +196,7 @@ Obj.# Case# Test# Description 01 63 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 63 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 65 00 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 65 00 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX 01 65 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 65 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 65 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX @@ -220,7 +238,7 @@ Obj.# Case# Test# Description 01 85 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -02 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Sony Experia M4 COTS UE for TX/1RX +02 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Sony Experia M4 COTS UE for 1TX/1RX and 2TX/2RX (TM2) 02 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 02 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 02 55 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX @@ -233,7 +251,18 @@ Obj.# Case# Test# Description 02 55 09 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 02 55 10 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 02 55 11 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX - +02 55 12 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 13 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 14 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 15 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 16 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 17 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 18 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 19 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 20 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 21 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 22 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 23 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) 01 64 lte-softmodem-noS1 tests @@ -249,4 +278,4 @@ Obj.# Case# Test# Description #TODO: Add test cases for 10,20 MHz #TODO: Add test cases for TDD/FDD #TODO: Test and compile seperately for Rel8/Rel10 -#TODO: Case03.py eMBMS test case \ No newline at end of file +#TODO: Case03.py eMBMS test case diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index f042ed6971..20931cf392 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010304 010305 0104+ 015502 015505 015508 015511 015514 015517 015602 015605 015702 015705 015802 015805 015808 015811 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 + 010141 0102+ 010304 010305 0104+ 015502 015505 015508 015511 015514 015517 015520 015523 015602 015605 015702 015705 015802 015805 015808 015811 015814 015817 015820 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 025514 025517 025520 025523 3 mozart hutch starsky stevens amerique calisson @@ -1095,6 +1095,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -1315,6 +1316,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -1378,29 +1380,31 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf N_RB_DL 25 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1440,7 +1444,7 @@ throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False - USRPb210.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.UL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 10 @@ -1453,29 +1457,31 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf N_RB_DL 50 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1514,7 +1520,7 @@ throughput_test min=0.0Mbits/sec max=2.0Mbits/sec average=2.0Mbits/sec False - USRPb210.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.UL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 10 @@ -1526,29 +1532,32 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1588,7 +1597,7 @@ throughput_test min=0.0Mbits/sec max=4.0Mbits/sec average=4.0Mbits/sec False - USRPb210.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.UL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 10 @@ -1600,29 +1609,31 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf N_RB_DL 25 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1662,7 +1673,7 @@ False - USRPb210.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.DL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 10 @@ -1674,29 +1685,31 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf N_RB_DL 50 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1736,7 +1749,7 @@ False - USRPb210.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.DL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 10 @@ -1748,29 +1761,32 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1806,11 +1822,11 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s False - USRPb210.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.DL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 10 @@ -1983,6 +1999,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -2203,6 +2220,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -2258,6 +2276,469 @@ + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue;$OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.ALU_EPC.Bandrich.5MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + > + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue;$OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=2.0Mbits/sec average=2.0Mbits/sec + + False + USRPb210.ALU_EPC.Bandrich.10MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=4.0Mbits/sec average=4.0Mbits/sec + + False + USRPb210.ALU_EPC.Bandrich.20MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 + + + False + USRPb210.ALU_EPC.Bandrich.5MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m + + + False + USRPb210.ALU_EPC.Bandrich.10MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s + + + False + USRPb210.ALU_EPC.Bandrich.20MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem @@ -3488,6 +3969,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" @@ -3702,6 +4184,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" @@ -3916,6 +4399,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" @@ -4130,6 +4614,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" @@ -4183,6 +4668,890 @@ c 10 + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m -u + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 28Mbits/s -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -u -f m -b 16M + + + False + USRPx310.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m -u + + + False + USRPx310.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s + + + False + USRPx310.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.5MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.10MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.20MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPx310.ALU_EPC.Bandrich.5MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPx310.ALU_EPC.Bandrich.10MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPx310.ALU_EPC.Bandrich.20MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + @@ -7173,6 +8542,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -7395,6 +8765,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -7618,6 +8989,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -7840,6 +9212,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -7895,5 +9268,925 @@ c + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 7Mbits/s -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.20MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 16Mbits/s -i 1 -f m -u + + + False + USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m -u + + + False + USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m + + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 40Mbits/s -i 1 -f m -u + + + False + USRPb210.ALU_EPC.SonyExperiaM4.20MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 -B 192.172.0.2 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.20MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -f m + + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPb210.ALU_EPC.SonyExperiaM4.20MHz.TCP.FDD.Band_7.DL.2TX.2RX.TM2 + 10 + + + From 3514b24723704928b1851bb982786e436e3a7954 Mon Sep 17 00:00:00 2001 From: hbilel Date: Thu, 8 Sep 2016 14:09:11 +0200 Subject: [PATCH 215/340] Fix UE-DFT segmentation fault: align rx_data buffer --- openair1/PHY/MODULATION/slot_fep_ul.c | 51 +++++++++++++++++---------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index 57f4a6f7ab..c612893c5c 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -50,6 +50,10 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, void (*dft)(int16_t *,int16_t *, int); + int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs + unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; + unsigned int rx_offset; + switch (frame_parms->ofdm_symbol_size) { case 128: dft = dft128; @@ -103,28 +107,37 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, #endif for (aa=0; aanb_antennas_rx; aa++) { - + rx_offset = slot_offset +nb_prefix_samples0; if (l==0) { - dft( -#ifndef OFDMA_ULSCH - (int16_t *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][slot_offset + - nb_prefix_samples0], -#else - (int16_t *)&eNB_common_vars->rxdata[eNB_id][aa][((frame_parms->samples_per_tti>>1)*Ns) + - nb_prefix_samples0], -#endif - (int16_t *)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol],1); + dft( (int16_t *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][rx_offset], + (int16_t *)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol], + 1 + ); } else { - dft( -#ifndef OFDMA_ULSCH - (short *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][slot_offset + -#else - (short *)&eNB_common_vars->rxdata[eNB_id][aa][((frame_parms->samples_per_tti>>1)*Ns) + -#endif - (frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) + - (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1)], - (short*)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol],1); + rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l; + if(rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) + { + memcpy((void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][frame_length_samples], + (void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][0], + frame_parms->ofdm_symbol_size*sizeof(int)); + } + + if( (rx_offset & 7) != 0){ + memcpy((void *)&tmp_dft_in, + (void *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][(rx_offset % frame_length_samples)], + frame_parms->ofdm_symbol_size*sizeof(int)); + dft( (short *) tmp_dft_in, + (short*) &eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol], + 1 + ); + } + else{ + dft( (short *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][rx_offset], + (short*)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol], + 1 + ); + } } } From 8fffd732cc16fd5145e8deead3fe8b8c76a8453f Mon Sep 17 00:00:00 2001 From: luhan wang Date: Thu, 8 Sep 2016 16:28:44 +0200 Subject: [PATCH 216/340] added const declarations to coefficients for FFT --- openair1/PHY/TOOLS/lte_dfts.c | 112 +++++++++++++++++----------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 00e1b0b5ce..b50e6c5e34 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -58,10 +58,10 @@ #define print_ints(s,x) printf("%s %d %d %d %d\n",s,(x)[0],(x)[1],(x)[2],(x)[3]) -static int16_t conjugatedft[32] __attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1}; +const static int16_t conjugatedft[32] __attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1}; -static int16_t reflip[32] __attribute__((aligned(32))) = {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1}; +const static int16_t reflip[32] __attribute__((aligned(32))) = {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1}; #if defined(__x86_64__) || defined(__i386__) static inline void cmac(__m128i a,__m128i b, __m128i *re32, __m128i *im32) __attribute__((always_inline)); @@ -474,33 +474,33 @@ static inline int16x8_t packed_cmult2(int16x8_t a,int16x8_t b, int16x8_t b2) #endif -static int16_t W0s[16]__attribute__((aligned(32))) = {32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0}; +const static int16_t W0s[16]__attribute__((aligned(32))) = {32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0}; -static int16_t W13s[16]__attribute__((aligned(32))) = {-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378}; -static int16_t W23s[16]__attribute__((aligned(32))) = {-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378}; +const static int16_t W13s[16]__attribute__((aligned(32))) = {-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378}; +const static int16_t W23s[16]__attribute__((aligned(32))) = {-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378}; -static int16_t W15s[16]__attribute__((aligned(32))) = {10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163}; -static int16_t W25s[16]__attribute__((aligned(32))) = {-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260}; -static int16_t W35s[16]__attribute__((aligned(32))) = {-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260}; -static int16_t W45s[16]__attribute__((aligned(32))) = {10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163}; +const static int16_t W15s[16]__attribute__((aligned(32))) = {10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163}; +const static int16_t W25s[16]__attribute__((aligned(32))) = {-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260}; +const static int16_t W35s[16]__attribute__((aligned(32))) = {-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260}; +const static int16_t W45s[16]__attribute__((aligned(32))) = {10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163}; #if defined(__x86_64__) || defined(__i386__) -__m128i *W0 = (__m128i *)W0s; -__m128i *W13 = (__m128i *)W13s; -__m128i *W23 = (__m128i *)W23s; -__m128i *W15 = (__m128i *)W15s; -__m128i *W25 = (__m128i *)W25s; -__m128i *W35 = (__m128i *)W35s; -__m128i *W45 = (__m128i *)W45s; +const __m128i *W0 = (__m128i *)W0s; +const __m128i *W13 = (__m128i *)W13s; +const __m128i *W23 = (__m128i *)W23s; +const __m128i *W15 = (__m128i *)W15s; +const __m128i *W25 = (__m128i *)W25s; +const __m128i *W35 = (__m128i *)W35s; +const __m128i *W45 = (__m128i *)W45s; #ifdef __AVX2__ -__m256i *W0_256 = (__m256i *)W0s; -__m256i *W13_256 = (__m256i *)W13s; -__m256i *W23_256 = (__m256i *)W23s; -__m256i *W15_256 = (__m256i *)W15s; -__m256i *W25_256 = (__m256i *)W25s; -__m256i *W35_256 = (__m256i *)W35s; -__m256i *W45_256 = (__m256i *)W45s; +const __m256i *W0_256 = (__m256i *)W0s; +const __m256i *W13_256 = (__m256i *)W13s; +const __m256i *W23_256 = (__m256i *)W23s; +const __m256i *W15_256 = (__m256i *)W15s; +const __m256i *W25_256 = (__m256i *)W25s; +const __m256i *W35_256 = (__m256i *)W35s; +const __m256i *W45_256 = (__m256i *)W45s; #endif #elif defined(__arm__) @@ -512,23 +512,23 @@ int16x8_t *W25 = (int16x8_t *)W25s; int16x8_t *W35 = (int16x8_t *)W35s; int16x8_t *W45 = (int16x8_t *)W45s; #endif -static int16_t dft_norm_table[16] = {9459, //12 - 6689,//24 - 5461,//36 - 4729,//482 - 4230,//60 - 23170,//72 - 3344,//96 - 3153,//108 - 2991,//120 - 18918,//sqrt(3),//144 - 18918,//sqrt(3),//180 - 16384,//2, //192 - 18918,//sqrt(3), // 216 - 16384,//2, //240 - 18918,//sqrt(3), // 288 - 14654 - }; //sqrt(5) //300 +const static int16_t dft_norm_table[16] = {9459, //12 + 6689,//24 + 5461,//36 + 4729,//482 + 4230,//60 + 23170,//72 + 3344,//96 + 3153,//108 + 2991,//120 + 18918,//sqrt(3),//144 + 18918,//sqrt(3),//180 + 16384,//2, //192 + 18918,//sqrt(3), // 216 + 16384,//2, //240 + 18918,//sqrt(3), // 288 + 14654 +}; //sqrt(5) //300 #if defined(__x86_64__) || defined(__i386__) @@ -2036,42 +2036,42 @@ static inline void transpose4_ooff(int16x4_t *x,int16x4_t *y,int off) // 16-point optimized DFT kernel -int16_t tw16[24] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273, +const static int16_t tw16[24] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273, 32767,0,23169,-23170,0 ,-32767,-23170,-23170, 32767,0,12539,-30273,-23170,-23170,-30273,12539 }; -int16_t tw16a[24] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273, +const static int16_t tw16a[24] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273, 32767,0,23169,23170,0 ,32767,-23170,23170, 32767,0,12539,30273,-23170,23170,-30273,-12539 }; -int16_t tw16b[24] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539, +const static int16_t tw16b[24] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539, 0,32767,-23170,23169,-32767,0 ,-23170,-23170, 0,32767,-30273,12539,-23170,-23170,12539 ,-30273 }; -int16_t tw16c[24] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539, +const static int16_t tw16c[24] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539, 0,32767,23170,23169,32767,0 ,23170 ,-23170, 0,32767,30273,12539,23170,-23170,-12539,-30273 }; -int16_t tw16rep[48] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,32767,0,30272,-12540,23169 ,-23170,12539 ,-30273, +const static int16_t tw16rep[48] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,32767,0,30272,-12540,23169 ,-23170,12539 ,-30273, 32767,0,23169,-23170,0 ,-32767,-23170,-23170,32767,0,23169,-23170,0 ,-32767,-23170,-23170, 32767,0,12539,-30273,-23170,-23170,-30273,12539,32767,0,12539,-30273,-23170,-23170,-30273,12539 }; -int16_t tw16arep[48] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273,32767,0,30272,12540,23169 ,23170,12539 ,30273, +const static int16_t tw16arep[48] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273,32767,0,30272,12540,23169 ,23170,12539 ,30273, 32767,0,23169,23170,0 ,32767,-23170,23170,32767,0,23169,23170,0 ,32767,-23170,23170, 32767,0,12539,30273,-23170,23170,-30273,-12539,32767,0,12539,30273,-23170,23170,-30273,-12539 }; -int16_t tw16brep[48] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539,0,32767,-12540,30272,-23170,23169 ,-30273,12539, +const static int16_t tw16brep[48] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539,0,32767,-12540,30272,-23170,23169 ,-30273,12539, 0,32767,-23170,23169,-32767,0 ,-23170,-23170,0,32767,-23170,23169,-32767,0 ,-23170,-23170, 0,32767,-30273,12539,-23170,-23170,12539 ,-30273,0,32767,-30273,12539,-23170,-23170,12539 ,-30273 }; -int16_t tw16crep[48] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539,0,32767,12540,30272,23170,23169 ,30273 ,12539, +const static int16_t tw16crep[48] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539,0,32767,12540,30272,23170,23169 ,30273 ,12539, 0,32767,23170,23169,32767,0 ,23170 ,-23170,0,32767,23170,23169,32767,0 ,23170 ,-23170, 0,32767,30273,12539,23170,-23170,-12539,-30273,0,32767,30273,12539,23170,-23170,-12539,-30273 }; @@ -2502,7 +2502,7 @@ static inline void idft16_simd256(int16_t *x,int16_t *y) // 64-point optimized DFT -int16_t tw64[96] __attribute__((aligned(32))) = { +const static int16_t tw64[96] __attribute__((aligned(32))) = { 32767,0,32609,-3212,32137,-6393,31356,-9512, 30272,-12540,28897,-15447,27244,-18205,25329,-20788, 23169,-23170,20787,-25330,18204,-27245,15446,-28898, @@ -2517,7 +2517,7 @@ int16_t tw64[96] __attribute__((aligned(32))) = { -30273,12539,-25330,20787,-18205,27244,-9512,31356 }; -int16_t tw64rep[192] __attribute__((aligned(32))) = { +const static int16_t tw64rep[192] __attribute__((aligned(32))) = { 32767,0,32609,-3212,32137,-6393,31356,-9512,32767,0,32609,-3212,32137,-6393,31356,-9512, 30272,-12540,28897,-15447,27244,-18205,25329,-20788,30272,-12540,28897,-15447,27244,-18205,25329,-20788, 23169,-23170,20787,-25330,18204,-27245,15446,-28898,23169,-23170,20787,-25330,18204,-27245,15446,-28898, @@ -2532,7 +2532,7 @@ int16_t tw64rep[192] __attribute__((aligned(32))) = { -30273,12539,-25330,20787,-18205,27244,-9512,31356,-30273,12539,-25330,20787,-18205,27244,-9512,31356 }; -int16_t tw64a[96] __attribute__((aligned(32))) = { +const static int16_t tw64a[96] __attribute__((aligned(32))) = { 32767,0,32609,3212,32137,6393,31356,9512, 30272,12540,28897,15447,27244,18205,25329,20788, 23169,23170,20787,25330,18204,27245,15446,28898, @@ -2546,7 +2546,7 @@ int16_t tw64a[96] __attribute__((aligned(32))) = { -23170,23170,-28898,15447,-32138,6393,-32610,-3211, -30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356 }; -int16_t tw64arep[192] __attribute__((aligned(32))) = { +const static int16_t tw64arep[192] __attribute__((aligned(32))) = { 32767,0,32609,3212,32137,6393,31356,9512,32767,0,32609,3212,32137,6393,31356,9512, 30272,12540,28897,15447,27244,18205,25329,20788,30272,12540,28897,15447,27244,18205,25329,20788, 23169,23170,20787,25330,18204,27245,15446,28898,23169,23170,20787,25330,18204,27245,15446,28898, @@ -2561,7 +2561,7 @@ int16_t tw64arep[192] __attribute__((aligned(32))) = { -30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356,-30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356 }; -int16_t tw64b[96] __attribute__((aligned(32))) = { +const static int16_t tw64b[96] __attribute__((aligned(32))) = { 0,32767,-3212,32609,-6393,32137,-9512,31356, -12540,30272,-15447,28897,-18205,27244,-20788,25329, -23170,23169,-25330,20787,-27245,18204,-28898,15446, @@ -2576,7 +2576,7 @@ int16_t tw64b[96] __attribute__((aligned(32))) = { 12539,-30273,20787,-25330,27244,-18205,31356,-9512 }; -int16_t tw64brep[192] __attribute__((aligned(32))) = { +const static int16_t tw64brep[192] __attribute__((aligned(32))) = { 0,32767,-3212,32609,-6393,32137,-9512,31356,0,32767,-3212,32609,-6393,32137,-9512,31356, -12540,30272,-15447,28897,-18205,27244,-20788,25329,-12540,30272,-15447,28897,-18205,27244,-20788,25329, -23170,23169,-25330,20787,-27245,18204,-28898,15446,-23170,23169,-25330,20787,-27245,18204,-28898,15446, @@ -2591,7 +2591,7 @@ int16_t tw64brep[192] __attribute__((aligned(32))) = { 12539,-30273,20787,-25330,27244,-18205,31356,-9512,12539,-30273,20787,-25330,27244,-18205,31356,-9512 }; -int16_t tw64c[96] __attribute__((aligned(32))) = { +const static int16_t tw64c[96] __attribute__((aligned(32))) = { 0,32767,3212,32609,6393,32137,9512,31356, 12540,30272,15447,28897,18205,27244,20788,25329, 23170,23169,25330,20787,27245,18204,28898,15446, @@ -2606,7 +2606,7 @@ int16_t tw64c[96] __attribute__((aligned(32))) = { -12539,-30273,-20787,-25330,-27244,-18205,-31356,-9512 }; -int16_t tw64crep[192] __attribute__((aligned(32))) = { +const static int16_t tw64crep[192] __attribute__((aligned(32))) = { 0,32767,3212,32609,6393,32137,9512,31356,0,32767,3212,32609,6393,32137,9512,31356, 12540,30272,15447,28897,18205,27244,20788,25329,12540,30272,15447,28897,18205,27244,20788,25329, 23170,23169,25330,20787,27245,18204,28898,15446,23170,23169,25330,20787,27245,18204,28898,15446, From f329139f189e3bd2452691837094f06622c8c017 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 10 Sep 2016 01:44:19 -0700 Subject: [PATCH 217/340] minor cleanup in ulsch_decoding.c. Some modifications to comments in impl_defs_lte.h. --- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 142 +++++++++----------- openair1/PHY/impl_defs_lte.h | 32 ++--- 2 files changed, 83 insertions(+), 91 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 6ed0f91101..b0c1aa1886 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -127,7 +127,7 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t max_turbo_iterations,uint8_t N_RB_UL, uin ulsch->Mlimit = 4; for (i=0; i<8; i++) { - // msg("new_ue_ulsch: Harq process %d\n",i); + // printf("new_ue_ulsch: Harq process %d\n",i); ulsch->harq_processes[i] = (LTE_UL_eNB_HARQ_t *)malloc16(sizeof(LTE_UL_eNB_HARQ_t)); if (ulsch->harq_processes[i]) { @@ -202,11 +202,11 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) uint8_t crc; crc = cqi[CQI_LENGTH>>3]; - // msg("crc1: %x, shift %d\n",crc,CQI_LENGTH&0x7); + // printf("crc1: %x, shift %d\n",crc,CQI_LENGTH&0x7); crc = (crc<<(CQI_LENGTH&0x7)); // clear crc bits // ((char *)cqi)[CQI_LENGTH>>3] &= 0xff>>(8-(CQI_LENGTH&0x7)); - // msg("crc2: %x, cqi0 %x\n",crc,cqi[1+(CQI_LENGTH>>3)]); + // printf("crc2: %x, cqi0 %x\n",crc,cqi[1+(CQI_LENGTH>>3)]); crc |= (cqi[1+(CQI_LENGTH>>3)])>>(8-(CQI_LENGTH&0x7)); // clear crc bits //(((char *)cqi)[1+(CQI_LENGTH>>3)]) = 0; @@ -258,7 +258,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, // uint8_t ytag2[6*14*1200],*ytag2_ptr; int16_t cseq[6*14*1200]; int off; - int status[20]; + int subframe = proc->subframe_rx; LTE_UL_eNB_HARQ_t *ulsch_harq; @@ -312,7 +312,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", + printf("ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", frame_parms->Nid_cell,ulsch->rnti,x2, ulsch_harq->round, ulsch_harq->rvidx, @@ -401,7 +401,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, // Q_ACK = Qprime * Q_m; Qprime_ACK = Qprime; #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: Qprime_ACK %d, Msc_initial %d, Nsymb_initial %d, sumKr %d\n", + printf("ulsch_decoding.c: Qprime_ACK %d, Msc_initial %d, Nsymb_initial %d, sumKr %d\n", Qprime_ACK,ulsch_harq->Msc_initial,ulsch_harq->Nsymb_initial,sumKr); #endif @@ -430,7 +430,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, Q_CQI = Q_m * Qprime; #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch_harq->Or1,ulsch_harq->O_ACK); + printf("ulsch_decoding: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch_harq->Or1,ulsch_harq->O_ACK); #endif G = G - Q_RI - Q_CQI; @@ -531,7 +531,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, } #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: ACK i %d, r %d, j %d, ColumnSet[j] %d\n",i,r,j,columnset[j]); + printf("ulsch_decoding.c: ACK i %d, r %d, j %d, ColumnSet[j] %d\n",i,r,j,columnset[j]); #endif j=(j+3)&3; } @@ -964,15 +964,15 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, } #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding: Or1=%d\n",ulsch_harq->Or1); + printf("ulsch_decoding: Or1=%d\n",ulsch_harq->Or1); for (i=0; i<1+((8+ulsch_harq->Or1)/8); i++) - msg("ulsch_decoding: O[%d] %d\n",i,ulsch_harq->o[i]); + printf("ulsch_decoding: O[%d] %d\n",i,ulsch_harq->o[i]); if (ulsch_harq->cqi_crc_status == 1) - msg("RX CQI CRC OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); + printf("RX CQI CRC OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); else - msg("RX CQI CRC NOT OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); + printf("RX CQI CRC NOT OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); #endif } @@ -985,6 +985,10 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, r_offset = 0; + offset = 0; + + ret = 1; + for (r=0; rC; r++) { // printf("before subblock deinterleaving c[%d] = %p\n",r,ulsch_harq->c[r]); @@ -1010,7 +1014,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, } #ifdef DEBUG_ULSCH_DECODING - msg("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? ulsch_harq->F : 0); + printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? ulsch_harq->F : 0); #endif memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); @@ -1019,7 +1023,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, (r==0) ? ulsch_harq->F : 0); #ifdef DEBUG_ULSCH_DECODING - msg("Rate Matching Segment %d (coded bits (G) %d,unpunctured/repeated bits %d, Q_m %d, nb_rb %d, Nl %d)...\n", + printf("Rate Matching Segment %d (coded bits (G) %d,unpunctured/repeated bits %d, Q_m %d, nb_rb %d, Nl %d)...\n", r, G, Kr*3, Q_m, @@ -1056,75 +1060,63 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, &ulsch_harq->d[r][96], ulsch_harq->w[r]); stop_meas(&eNB->ulsch_deinterleaving_stats); - } + - for (r=0; rC; r++) { + if (ulsch_harq->C == 1) + crc_type = CRC24_A; + else + crc_type = CRC24_B; + + start_meas(&eNB->ulsch_turbo_decoding_stats); + + ret = tc(&ulsch_harq->d[r][96], + ulsch_harq->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, + crc_type, + (r==0) ? ulsch_harq->F : 0, + &eNB->ulsch_tc_init_stats, + &eNB->ulsch_tc_alpha_stats, + &eNB->ulsch_tc_beta_stats, + &eNB->ulsch_tc_gamma_stats, + &eNB->ulsch_tc_ext_stats, + &eNB->ulsch_tc_intl1_stats, + &eNB->ulsch_tc_intl2_stats); + + stop_meas(&eNB->ulsch_turbo_decoding_stats); + - /* printf("c[%d] : %p\n",r, - ulsch_harq->c[r]); - */ - - if (ulsch_harq->C == 1) - crc_type = CRC24_A; - else - crc_type = CRC24_B; - - start_meas(&eNB->ulsch_turbo_decoding_stats); - - ret = tc(&ulsch_harq->d[r][96], - ulsch_harq->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, - crc_type, - (r==0) ? ulsch_harq->F : 0, - &eNB->ulsch_tc_init_stats, - &eNB->ulsch_tc_alpha_stats, - &eNB->ulsch_tc_beta_stats, - &eNB->ulsch_tc_gamma_stats, - &eNB->ulsch_tc_ext_stats, - &eNB->ulsch_tc_intl1_stats, - &eNB->ulsch_tc_intl2_stats); - - stop_meas(&eNB->ulsch_turbo_decoding_stats); - - status[r] = ret; - - } + + // Reassembly of Transport block here - offset = 0; - ret = 1; - - for (r=0; rC; r++) { - if (status[r] != (1+ulsch->max_turbo_iterations)) { + if (ret != (1+ulsch->max_turbo_iterations)) { if (rCminus) - Kr = ulsch_harq->Kminus; + Kr = ulsch_harq->Kminus; else - Kr = ulsch_harq->Kplus; - + Kr = ulsch_harq->Kplus; + Kr_bytes = Kr>>3; - + if (r==0) { - memcpy(ulsch_harq->b, - &ulsch_harq->c[0][(ulsch_harq->F>>3)], - Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0)); - offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); + memcpy(ulsch_harq->b, + &ulsch_harq->c[0][(ulsch_harq->F>>3)], + Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0)); + offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); } else { - memcpy(ulsch_harq->b+offset, - ulsch_harq->c[r], - Kr_bytes - ((ulsch_harq->C>1)?3:0)); - offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); + memcpy(ulsch_harq->b+offset, + ulsch_harq->c[r], + Kr_bytes - ((ulsch_harq->C>1)?3:0)); + offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); } - - if (ret != (1+ulsch->max_turbo_iterations)) - ret = status[r]; + } else { - ret = 1+ulsch->max_turbo_iterations; + break; } - + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,0); @@ -1208,7 +1200,7 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb sinr_db1 = sinr_dB[offset*2]; sinr_db2 = sinr_dB[offset*2+1]; - msg("sinr_db1=%f\n,sinr_db2=%f\n",sinr_db1,sinr_db2); + printf("sinr_db1=%f\n,sinr_db2=%f\n",sinr_db1,sinr_db2); //rounding up for the table lookup sinr_db1 *= 10; @@ -1462,7 +1454,7 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb sinr_eff = sinr_eff * beta2_dlsch_MI[TM][mcs]; } - msg("SINR_Eff = %e\n",sinr_eff); + printf("SINR_Eff = %e\n",sinr_eff); sinr_eff *= 10; sinr_eff = floor(sinr_eff); @@ -1470,7 +1462,7 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb // sinr_eff += 1; // } sinr_eff /= 10; - msg("sinr_eff after rounding = %f\n",sinr_eff); + printf("sinr_eff after rounding = %f\n",sinr_eff); for (index = 0; index < 16; index++) { if(index == 0) { @@ -1488,10 +1480,10 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb #ifdef USER_MODE // need to be adapted for the emulation in the kernel space if (uniformrandom() < bler) { - msg("abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); + printf("abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); return(0); } else { - msg("abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); + printf("abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); return(1); } diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 7c38048a55..bed2057800 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -607,34 +607,34 @@ typedef struct { int32_t **txdataF[3]; /// \brief Holds the received data in time domain. /// Should point to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna [0..nb_antennas_rx[ /// - third index: sample [0..] int32_t **rxdata[3]; /// \brief Holds the last subframe of received data in time domain after removal of 7.5kHz frequency offset. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: secotr id [0..2] (hard coded) /// - second index: rx antenna [0..nb_antennas_rx[ /// - third index: sample [0..samples_per_tti[ int32_t **rxdata_7_5kHz[3]; /// \brief Holds the received data in the frequency domain. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna [0..nb_antennas_rx[ /// - third index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ int32_t **rxdataF[3]; /// \brief Holds output of the sync correlator. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: sample [0..samples_per_tti*10[ uint32_t *sync_corr[3]; } LTE_eNB_COMMON; typedef struct { /// \brief Hold the channel estimates in frequency domain based on SRS. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..ofdm_symbol_size[ int32_t **srs_ch_estimates[3]; /// \brief Hold the channel estimates in time domain based on SRS. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..2*ofdm_symbol_size[ int32_t **srs_ch_estimates_time[3]; @@ -645,54 +645,54 @@ typedef struct { typedef struct { /// \brief Holds the received data in the frequency domain for the allocated RBs in repeated format. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..2*ofdm_symbol_size[ /// - third index (definition from phy_init_lte_eNB()): ? [0..24*N_RB_UL*frame_parms->symbols_per_tti[ /// \warning inconsistent third index definition int32_t **rxdataF_ext[3]; /// \brief Holds the received data in the frequency domain for the allocated RBs in normal format. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **rxdataF_ext2[3]; /// \brief Hold the channel estimates in time domain based on DRS. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..4*ofdm_symbol_size[ int32_t **drs_ch_estimates_time[3]; /// \brief Hold the channel estimates in frequency domain based on DRS. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **drs_ch_estimates[3]; /// \brief Hold the channel estimates for UE0 in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **drs_ch_estimates_0[3]; /// \brief Hold the channel estimates for UE1 in case of Distributed Almouti Scheme. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **drs_ch_estimates_1[3]; /// \brief Holds the compensated signal. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **rxdataF_comp[3]; /// \brief Hold the compensated data (y)*(h0*) in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **rxdataF_comp_0[3]; /// \brief Hold the compensated data (y*)*(h1) in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **rxdataF_comp_1[3]; /// \brief ?. - /// - first index: eNB id [0..2] (hard coded) + /// - first index: sector id [0..2] (hard coded) /// - second index: rx antenna id [0..nb_antennas_rx[ /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **ul_ch_mag[3]; From 862e480e7565a6ab08522b6712db61070f13c005 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 10 Sep 2016 11:19:56 +0200 Subject: [PATCH 218/340] nothing important --- cmake_targets/CMakeLists.txt | 2 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 152 ++++++++++++------- openair1/SCHED/phy_procedures_lte_eNb.c | 80 ++++++++-- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 2 +- 4 files changed, 167 insertions(+), 69 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index e1396b6398..9f3c0ece0d 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -178,7 +178,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU # these changes are related to hardcoded path to include .h files add_definitions(-DCMAKER) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3") -set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O3") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2") set(GIT_BRANCH "UNKNOWN") diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 6ed0f91101..1d0c8c25e3 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -127,7 +127,7 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t max_turbo_iterations,uint8_t N_RB_UL, uin ulsch->Mlimit = 4; for (i=0; i<8; i++) { - // msg("new_ue_ulsch: Harq process %d\n",i); + // printf("new_ue_ulsch: Harq process %d\n",i); ulsch->harq_processes[i] = (LTE_UL_eNB_HARQ_t *)malloc16(sizeof(LTE_UL_eNB_HARQ_t)); if (ulsch->harq_processes[i]) { @@ -202,11 +202,11 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) uint8_t crc; crc = cqi[CQI_LENGTH>>3]; - // msg("crc1: %x, shift %d\n",crc,CQI_LENGTH&0x7); + // printf("crc1: %x, shift %d\n",crc,CQI_LENGTH&0x7); crc = (crc<<(CQI_LENGTH&0x7)); // clear crc bits // ((char *)cqi)[CQI_LENGTH>>3] &= 0xff>>(8-(CQI_LENGTH&0x7)); - // msg("crc2: %x, cqi0 %x\n",crc,cqi[1+(CQI_LENGTH>>3)]); + // printf("crc2: %x, cqi0 %x\n",crc,cqi[1+(CQI_LENGTH>>3)]); crc |= (cqi[1+(CQI_LENGTH>>3)])>>(8-(CQI_LENGTH&0x7)); // clear crc bits //(((char *)cqi)[1+(CQI_LENGTH>>3)]) = 0; @@ -217,7 +217,54 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) } +typedef struct { + PHY_VARS_eNB *eNB; + +} tc_param; +static void *td_thread(void *param) { + + PHY_VARS_eNB *eNB = (tc_param*)param->eNB; + eNB_proc_t *proc = &eNB->proc; + + while (!oai_exit) { + + if (wait_on_condition(&proc->mutex_td,&proc->cond_td,&proc->instance_cnt_td,"td thread")<0) break; + // TD here + ret = tc(&ulsch_harq->d[r][96], + ulsch_harq->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, + crc_type, + (r==0) ? ulsch_harq->F : 0, + &eNB->ulsch_tc_init_stats, + &eNB->ulsch_tc_alpha_stats, + &eNB->ulsch_tc_beta_stats, + &eNB->ulsch_tc_gamma_stats, + &eNB->ulsch_tc_ext_stats, + &eNB->ulsch_tc_intl1_stats, + &eNB->ulsch_tc_intl2_stats); + + stop_meas(&eNB->ulsch_turbo_decoding_stats); + + status[r] = ret; + + if (release_thread(&proc->mutex_td,&proc->instance_cnt_td,"td thread")<0) break; + + if (pthread_cond_signal(&proc->cond_td) != 0) { + printf("[eNB] ERROR pthread_cond_signal for td thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + } + + + + return(NULL); +} + unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, uint8_t UE_id, uint8_t control_only_flag, @@ -312,7 +359,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", + printf("ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", frame_parms->Nid_cell,ulsch->rnti,x2, ulsch_harq->round, ulsch_harq->rvidx, @@ -401,7 +448,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, // Q_ACK = Qprime * Q_m; Qprime_ACK = Qprime; #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: Qprime_ACK %d, Msc_initial %d, Nsymb_initial %d, sumKr %d\n", + printf("ulsch_decoding.c: Qprime_ACK %d, Msc_initial %d, Nsymb_initial %d, sumKr %d\n", Qprime_ACK,ulsch_harq->Msc_initial,ulsch_harq->Nsymb_initial,sumKr); #endif @@ -430,7 +477,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, Q_CQI = Q_m * Qprime; #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch_harq->Or1,ulsch_harq->O_ACK); + printf("ulsch_decoding: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch_harq->Or1,ulsch_harq->O_ACK); #endif G = G - Q_RI - Q_CQI; @@ -531,7 +578,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, } #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: ACK i %d, r %d, j %d, ColumnSet[j] %d\n",i,r,j,columnset[j]); + printf("ulsch_decoding.c: ACK i %d, r %d, j %d, ColumnSet[j] %d\n",i,r,j,columnset[j]); #endif j=(j+3)&3; } @@ -964,15 +1011,15 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, } #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding: Or1=%d\n",ulsch_harq->Or1); + printf("ulsch_decoding: Or1=%d\n",ulsch_harq->Or1); for (i=0; i<1+((8+ulsch_harq->Or1)/8); i++) - msg("ulsch_decoding: O[%d] %d\n",i,ulsch_harq->o[i]); + printf("ulsch_decoding: O[%d] %d\n",i,ulsch_harq->o[i]); if (ulsch_harq->cqi_crc_status == 1) - msg("RX CQI CRC OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); + printf("RX CQI CRC OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); else - msg("RX CQI CRC NOT OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); + printf("RX CQI CRC NOT OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); #endif } @@ -1010,7 +1057,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, } #ifdef DEBUG_ULSCH_DECODING - msg("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? ulsch_harq->F : 0); + printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? ulsch_harq->F : 0); #endif memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); @@ -1019,7 +1066,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, (r==0) ? ulsch_harq->F : 0); #ifdef DEBUG_ULSCH_DECODING - msg("Rate Matching Segment %d (coded bits (G) %d,unpunctured/repeated bits %d, Q_m %d, nb_rb %d, Nl %d)...\n", + printf("Rate Matching Segment %d (coded bits (G) %d,unpunctured/repeated bits %d, Q_m %d, nb_rb %d, Nl %d)...\n", r, G, Kr*3, Q_m, @@ -1058,40 +1105,41 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, stop_meas(&eNB->ulsch_deinterleaving_stats); } - for (r=0; rC; r++) { - - /* printf("c[%d] : %p\n",r, - ulsch_harq->c[r]); - */ - - if (ulsch_harq->C == 1) - crc_type = CRC24_A; - else - crc_type = CRC24_B; - - start_meas(&eNB->ulsch_turbo_decoding_stats); - - ret = tc(&ulsch_harq->d[r][96], - ulsch_harq->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, - crc_type, - (r==0) ? ulsch_harq->F : 0, - &eNB->ulsch_tc_init_stats, - &eNB->ulsch_tc_alpha_stats, - &eNB->ulsch_tc_beta_stats, - &eNB->ulsch_tc_gamma_stats, - &eNB->ulsch_tc_ext_stats, - &eNB->ulsch_tc_intl1_stats, - &eNB->ulsch_tc_intl2_stats); - - stop_meas(&eNB->ulsch_turbo_decoding_stats); - - status[r] = ret; - - } + for (r=0; rC; r+=2) { + + /* printf("c[%d] : %p\n",r, + ulsch_harq->c[r]); + */ + + if (ulsch_harq->C == 1) + crc_type = CRC24_A; + else + crc_type = CRC24_B; + + start_meas(&eNB->ulsch_turbo_decoding_stats); + + ret = tc(&ulsch_harq->d[r][96], + ulsch_harq->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, + crc_type, + (r==0) ? ulsch_harq->F : 0, + &eNB->ulsch_tc_init_stats, + &eNB->ulsch_tc_alpha_stats, + &eNB->ulsch_tc_beta_stats, + &eNB->ulsch_tc_gamma_stats, + &eNB->ulsch_tc_ext_stats, + &eNB->ulsch_tc_intl1_stats, + &eNB->ulsch_tc_intl2_stats); + + stop_meas(&eNB->ulsch_turbo_decoding_stats); + + status[r] = ret; + if (ret==(1+ulsch->max_turbo_iterations)) + break; + } // Reassembly of Transport block here offset = 0; @@ -1208,7 +1256,7 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb sinr_db1 = sinr_dB[offset*2]; sinr_db2 = sinr_dB[offset*2+1]; - msg("sinr_db1=%f\n,sinr_db2=%f\n",sinr_db1,sinr_db2); + printf("sinr_db1=%f\n,sinr_db2=%f\n",sinr_db1,sinr_db2); //rounding up for the table lookup sinr_db1 *= 10; @@ -1462,7 +1510,7 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb sinr_eff = sinr_eff * beta2_dlsch_MI[TM][mcs]; } - msg("SINR_Eff = %e\n",sinr_eff); + printf("SINR_Eff = %e\n",sinr_eff); sinr_eff *= 10; sinr_eff = floor(sinr_eff); @@ -1470,7 +1518,7 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb // sinr_eff += 1; // } sinr_eff /= 10; - msg("sinr_eff after rounding = %f\n",sinr_eff); + printf("sinr_eff after rounding = %f\n",sinr_eff); for (index = 0; index < 16; index++) { if(index == 0) { @@ -1488,10 +1536,10 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb #ifdef USER_MODE // need to be adapted for the emulation in the kernel space if (uniformrandom() < bler) { - msg("abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); + printf("abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); return(0); } else { - msg("abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); + printf("abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); return(1); } diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 980fa3335a..cbea52db81 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2508,6 +2508,8 @@ void fep0(PHY_VARS_eNB *eNB,int slot) { LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int l; + // printf("fep0: slot %d\n",slot); + remove_7_5_kHz(eNB,(slot&1)+(proc->subframe_rx<<1)); for (l=0; lsymbols_per_tti/2; l++) { slot_fep_ul(fp, @@ -2560,21 +2562,68 @@ static inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond, return(0); } +static inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { + + if (pthread_mutex_lock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + + while (*instance_cnt == 0) { + // most of the time the thread will skip this + // waits only if proc->instance_cnt_rxtx is 0 + pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again + } + + if (pthread_mutex_unlock(mutex) != 0) { + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} + extern int oai_exit; +#define THREAD_FULL 1 +#ifdef THREAD_FULL static void *fep_thread(void *param) { PHY_VARS_eNB *eNB = (PHY_VARS_eNB *)param; eNB_proc_t *proc = &eNB->proc; while (!oai_exit) { + if (wait_on_condition(&proc->mutex_fep,&proc->cond_fep,&proc->instance_cnt_fep,"fep thread")<0) break; fep0(eNB,0); if (release_thread(&proc->mutex_fep,&proc->instance_cnt_fep,"fep thread")<0) break; + + if (pthread_cond_signal(&proc->cond_fep) != 0) { + printf("[eNB] ERROR pthread_cond_signal for fep thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } } + + + return(NULL); } +#else + +static void *fep_thread(void *param) { + + PHY_VARS_eNB *eNB = (PHY_VARS_eNB *)param; + eNB_proc_t *proc = &eNB->proc; + + fep0(eNB,0); + + return(NULL); +} + +#endif void init_fep_thread(PHY_VARS_eNB *eNB,pthread_attr_t *attr_fep) { eNB_proc_t *proc = &eNB->proc; @@ -2584,13 +2633,17 @@ void init_fep_thread(PHY_VARS_eNB *eNB,pthread_attr_t *attr_fep) { pthread_mutex_init( &proc->mutex_fep, NULL); pthread_cond_init( &proc->cond_fep, NULL); +#ifdef THREAD_FULL pthread_create(&proc->pthread_fep, attr_fep, fep_thread, (void*)eNB); +#endif } + void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { eNB_proc_t *proc = &eNB->proc; + struct timespec wait; int wait_cnt=0; wait.tv_sec=0; @@ -2599,6 +2652,8 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); start_meas(&eNB->ofdm_demod_stats); +#ifdef THREAD_FULL + if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { printf("[eNB] ERROR pthread_mutex_lock for fep thread %d (IC %d)\n", proc->instance_cnt_fep); exit_fun( "error locking mutex_fep" ); @@ -2626,26 +2681,21 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { // call second slot in this symbol fep0(eNB,1); - if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { - printf("[eNB] ERROR pthread_mutex_lock for fep thread %d (IC %d)\n", proc->instance_cnt_fep); - exit_fun( "error locking mutex_fep" ); - return; - } - while (proc->instance_cnt_fep==0) { - wait_cnt++; - if (wait_cnt>10000) - break; - }; + wait_on_busy_condition(&proc->mutex_fep,&proc->cond_fep,&proc->instance_cnt_fep,"fep thread"); - pthread_mutex_unlock( &proc->mutex_fep ); - if (wait_cnt>1000000) { - printf("[eNB] parallel FEP didn't finish\n"); - exit_fun( "error" ); - } +#else + pthread_create(&proc->pthread_fep, NULL, fep_thread, (void*)eNB); + // call second slot in this symbol + fep0(eNB,1); + pthread_join(proc->pthread_fep,(void**)NULL); + +#endif stop_meas(&eNB->ofdm_demod_stats); } + + void eNB_fep_full(PHY_VARS_eNB *eNB) { eNB_proc_t *proc = &eNB->proc; diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index f9c2309ab8..56a0f50ff4 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -568,7 +568,7 @@ extern "C" { // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); - args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096"; +// args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096"; uhd::device_addrs_t device_adds = uhd::device::find(args); From 3e86219ee7565b10fc857680dcb46bbbaaf3af7b Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 12 Sep 2016 11:25:55 +0200 Subject: [PATCH 219/340] fix for TM2 config files --- .../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf | 2 +- .../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf index 7941441d1d..2d634a863b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -47,7 +47,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; + pdsch_referenceSignalPower = -28; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf index f4296c9c61..a68c65146f 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf @@ -46,7 +46,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -16; + pdsch_referenceSignalPower = -18; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; From 410dc2ae5fe57ae6dfb07443cfdd298ce3d77b56 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 13 Sep 2016 13:27:58 +0200 Subject: [PATCH 220/340] blacklist TM2 TCP test cases --- cmake_targets/autotests/test_case_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 20931cf392..539c31e980 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -10,7 +10,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010304 010305 0104+ 015502 015505 015508 015511 015514 015517 015520 015523 015602 015605 015702 015705 015802 015805 015808 015811 015814 015817 015820 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 025514 025517 025520 025523 + 010141 0102+ 010304 010305 0104+ 015502 015505 015508 015511 015514 015517 015518 015519 015520 015521 015522 015523 015602 015605 015702 015705 015802 015805 015808 015811 015814 015817 015818 015819 015820 015821 015822 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 025514 025517 025518 025519 025520 025521 025522 025523 3 mozart hutch starsky stevens amerique calisson From 1e9687fa0bbd5441cb9e8ddd487eae5f19c14c26 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 14 Sep 2016 03:47:51 -0700 Subject: [PATCH 221/340] some cleanup in dlsch_modulation prior to parallelization --- openair1/PHY/INIT/init_top.c | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 265 ++++++++++-------- 2 files changed, 145 insertions(+), 122 deletions(-) diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c index e0de14bbb8..350f0f0c94 100755 --- a/openair1/PHY/INIT/init_top.c +++ b/openair1/PHY/INIT/init_top.c @@ -45,7 +45,7 @@ */ //#define DEBUG_PHY - +t /* diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index e80a86b7cd..8438e86496 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -1542,6 +1542,142 @@ uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb) } +inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) __attribute__((always_inline)); +inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) { + + + if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL + // PBCH + if ((subframe_offset==0) && + (rb>((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) { + return(1); + } + if (frame_parms->frame_type == TDD) { // TDD + //SSS TDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)) ) { + return(1); + } + //PSS TDD + if (((subframe_offset==1) || (subframe_offset==6)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==2) ) { + return(1); + } + } else { + //PSS FDD + if (((subframe_offset==0)||(subframe_offset==5)) && + (rb>((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==((nsymb>>1)-1)) ) { + return(1); + } + //SSS FDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) { + return(1); + } + } + } + else { // even N_RB_DL + //PBCH + if ((subframe_offset==0) && + (rb>=((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) + return(1); + + if (frame_parms->frame_type == TDD) { // TDD + //SSS + if (((subframe_offset==0)|| + (subframe_offset==5)) && + (rb>=((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==nsymb-1) ) { + return(1); + } + + //PSS + if (((subframe_offset==1)|| + (subframe_offset==6)) && + (rb>=((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==2) ) { + return(1); + } + } else { // FDD + //SSS + if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) { + return(1); + } + + //PSS + if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-1)) ) { + return(1); + } + } + } + + return(0); +} + +inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) __attribute__((always_inline)); +inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) { + + printf("check_skiphalf : rb %d, subframe_offset %d,l %d, nsymb %d\n",rb,subframe_offset,l,nsymb); + + if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL + + // PBCH + if ((subframe_offset==0) && + (rb==((frame_parms->N_RB_DL>>1)-3)) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) + return(1); + else if ((subframe_offset==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + return(2); + + if (frame_parms->frame_type == TDD) { // TDD + //SSS TDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==(nsymb-1))) + return(1); + else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1))) + return(2); + //PSS TDD + if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==2)) + return(1); + else if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==2)) + return(2); + } + else { // FDD + //PSS FDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==((nsymb>>1)-1))) + return(1); + else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(((nsymb>>1)-1)))) + return(2); + //SSS FDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && ((l==((nsymb>>1)-2)))) + return(1); + else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && ((l==(nsymb>>1)-2))) + return(2); + } + } + else { // EVEN N_RB_DL + return(0); + } + + return(0); +} + +inline int check_skip_dc(int rb,LTE_DL_FRAME_PARMS *frame_parms) __attribute__((always_inline)); +inline int check_skip_dc(int rb,LTE_DL_FRAME_PARMS *frame_parms) { + + if (((frame_parms->N_RB_DL&1) == 1) && // odd N_RB_DL, rb==N_RB_DL/2 PRB contains DC element + (rb==(frame_parms->N_RB_DL>>1))) + return(1); + else + return(0); +} + int dlsch_modulation(int32_t **txdataF, int16_t amp, uint32_t subframe_offset, @@ -1560,7 +1696,7 @@ int dlsch_modulation(int32_t **txdataF, uint32_t rb_alloc_ind; uint32_t *rb_alloc = dlsch0_harq->rb_alloc; uint8_t pilots=0; - uint8_t skip_dc,skip_half; + uint8_t skip_dc=0,skip_half=0; uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs); uint8_t mod_order1 = 0; int16_t amp_rho_a, amp_rho_b; @@ -1636,6 +1772,7 @@ int dlsch_modulation(int32_t **txdataF, jj2=0; re_allocated=0; + // printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); for (l=num_pdcch_symbols; lN_RB_DL&1) == 1) { // ODD N_RB_DL - - if (rb==(frame_parms->N_RB_DL>>1)) - skip_dc = 1; - else - skip_dc = 0; - - // PBCH - if ((subframe_offset==0) && - (rb>((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 - if ((subframe_offset==0) && - (rb==((frame_parms->N_RB_DL>>1)-3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((subframe_offset==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=2; - - if (frame_parms->frame_type == TDD) { // TDD - //SSS TDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)) ) { - rb_alloc_ind = 0; - } - - //SSS TDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==(nsymb-1))) - skip_half=1; - else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1))) - skip_half=2; - - //PSS TDD - if (((subframe_offset==1) || (subframe_offset==6)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==2) ) { - rb_alloc_ind = 0; - } - - //PSS TDD - if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==2)) - skip_half=1; - else if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==2)) - skip_half=2; - } else { - //PSS FDD - if (((subframe_offset==0)||(subframe_offset==5)) && - (rb>((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==((nsymb>>1)-1)) ) { - rb_alloc_ind = 0; - } - - //PSS FDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==((nsymb>>1)-1))) - skip_half=1; - else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(((nsymb>>1)-1)))) - skip_half=2; - - //SSS FDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) { - rb_alloc_ind = 0; - } - - //SSS FDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && ((l==((nsymb>>1)-2)))) - skip_half=1; - else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && ((l==(nsymb>>1)-2))) - skip_half=2; - - } - - } else { // EVEN N_RB_DL - //PBCH - if ((subframe_offset==0) && - (rb>=((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) - rb_alloc_ind = 0; - - skip_dc=0; - skip_half=0; - - if (frame_parms->frame_type == TDD) { // TDD - //SSS - if (((subframe_offset==0)|| - (subframe_offset==5)) && - (rb>=((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==nsymb-1) ) { - rb_alloc_ind = 0; - } - - //PSS - if (((subframe_offset==1)|| - (subframe_offset==6)) && - (rb>=((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==2) ) { - rb_alloc_ind = 0; - } - } else { // FDD - //SSS - if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) { - rb_alloc_ind = 0; - } - - //PSS - if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-1)) ) { - rb_alloc_ind = 0; - } - } + if (check_skip(rb,subframe_offset,frame_parms,l,nsymb)==1) + rb_alloc_ind = 0; + else { + skip_half = check_skiphalf(rb,subframe_offset,frame_parms,l,nsymb); + skip_dc = check_skip_dc(rb,frame_parms); } - if (dlsch0_harq->Nlayers>1) { printf("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); return(-1); @@ -1909,7 +1932,7 @@ int dlsch_modulation(int32_t **txdataF, if (rb_alloc_ind > 0) { - // printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); + printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); allocate_REs(frame_parms, txdataF, &jj, From 3d88f4ed2f0b09791fd467244f5560c30f711c14 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 14 Sep 2016 15:04:55 +0200 Subject: [PATCH 222/340] remove copyright notice All the *.c *.h and *.cpp files that have a eurecom copyright at the head have been processed. All other files (ie. those with other extensions) have not been touched. Changes to be committed: modified: common/utils/asn1_conversions.h modified: common/utils/assertions.h modified: common/utils/collection/hashtable/hashtable.c modified: common/utils/collection/hashtable/hashtable.h modified: common/utils/collection/hashtable/obj_hashtable.c modified: common/utils/collection/hashtable/obj_hashtable.h modified: common/utils/itti/assertions.h modified: common/utils/itti/backtrace.c modified: common/utils/itti/backtrace.h modified: common/utils/itti/intertask_interface.c modified: common/utils/itti/intertask_interface.h modified: common/utils/itti/intertask_interface_dump.c modified: common/utils/itti/intertask_interface_dump.h modified: common/utils/itti/intertask_interface_init.h modified: common/utils/itti/intertask_interface_types.h modified: common/utils/itti/intertask_messages_def.h modified: common/utils/itti/intertask_messages_types.h modified: common/utils/itti/itti_types.h modified: common/utils/itti/memory_pools.c modified: common/utils/itti/memory_pools.h modified: common/utils/itti/messages_def.h modified: common/utils/itti/messages_types.h modified: common/utils/itti/signals.c modified: common/utils/itti/signals.h modified: common/utils/itti/tasks_def.h modified: common/utils/itti/timer.c modified: common/utils/itti/timer.h modified: common/utils/itti/timer_messages_def.h modified: common/utils/itti/timer_messages_types.h modified: common/utils/itti_analyzer/common/itti_types.h modified: common/utils/itti_analyzer/common/logs.h modified: common/utils/itti_analyzer/common/rc.h modified: common/utils/itti_analyzer/itti_analyzer.c modified: common/utils/itti_analyzer/libbuffers/buffers.c modified: common/utils/itti_analyzer/libbuffers/buffers.h modified: common/utils/itti_analyzer/libbuffers/file.c modified: common/utils/itti_analyzer/libbuffers/file.h modified: common/utils/itti_analyzer/libbuffers/socket.c modified: common/utils/itti_analyzer/libbuffers/socket.h modified: common/utils/itti_analyzer/libparser/array_type.c modified: common/utils/itti_analyzer/libparser/array_type.h modified: common/utils/itti_analyzer/libparser/enum_type.c modified: common/utils/itti_analyzer/libparser/enum_type.h modified: common/utils/itti_analyzer/libparser/enum_value_type.c modified: common/utils/itti_analyzer/libparser/enum_value_type.h modified: common/utils/itti_analyzer/libparser/field_type.c modified: common/utils/itti_analyzer/libparser/field_type.h modified: common/utils/itti_analyzer/libparser/file_type.c modified: common/utils/itti_analyzer/libparser/file_type.h modified: common/utils/itti_analyzer/libparser/fundamental_type.c modified: common/utils/itti_analyzer/libparser/fundamental_type.h modified: common/utils/itti_analyzer/libparser/intertask_contexts.h modified: common/utils/itti_analyzer/libparser/pointer_type.c modified: common/utils/itti_analyzer/libparser/pointer_type.h modified: common/utils/itti_analyzer/libparser/reference_type.c modified: common/utils/itti_analyzer/libparser/reference_type.h modified: common/utils/itti_analyzer/libparser/struct_type.c modified: common/utils/itti_analyzer/libparser/struct_type.h modified: common/utils/itti_analyzer/libparser/typedef_type.c modified: common/utils/itti_analyzer/libparser/typedef_type.h modified: common/utils/itti_analyzer/libparser/types.c modified: common/utils/itti_analyzer/libparser/types.h modified: common/utils/itti_analyzer/libparser/union_type.c modified: common/utils/itti_analyzer/libparser/union_type.h modified: common/utils/itti_analyzer/libparser/xml_parse.c modified: common/utils/itti_analyzer/libparser/xml_parse.h modified: common/utils/itti_analyzer/libresolver/locate_root.c modified: common/utils/itti_analyzer/libresolver/locate_root.h modified: common/utils/itti_analyzer/libresolver/resolvers.c modified: common/utils/itti_analyzer/libresolver/resolvers.h modified: common/utils/itti_analyzer/libui/ui_callbacks.c modified: common/utils/itti_analyzer/libui/ui_callbacks.h modified: common/utils/itti_analyzer/libui/ui_filters.c modified: common/utils/itti_analyzer/libui/ui_filters.h modified: common/utils/itti_analyzer/libui/ui_interface.c modified: common/utils/itti_analyzer/libui/ui_interface.h modified: common/utils/itti_analyzer/libui/ui_main_screen.c modified: common/utils/itti_analyzer/libui/ui_main_screen.h modified: common/utils/itti_analyzer/libui/ui_menu_bar.c modified: common/utils/itti_analyzer/libui/ui_menu_bar.h modified: common/utils/itti_analyzer/libui/ui_notebook.c modified: common/utils/itti_analyzer/libui/ui_notebook.h modified: common/utils/itti_analyzer/libui/ui_notif_dlg.c modified: common/utils/itti_analyzer/libui/ui_notif_dlg.h modified: common/utils/itti_analyzer/libui/ui_notifications.c modified: common/utils/itti_analyzer/libui/ui_notifications.h modified: common/utils/itti_analyzer/libui/ui_signal_dissect_view.c modified: common/utils/itti_analyzer/libui/ui_signal_dissect_view.h modified: common/utils/itti_analyzer/libui/ui_tree_view.c modified: common/utils/itti_analyzer/libui/ui_tree_view.h modified: common/utils/msc/msc.c modified: common/utils/msc/msc.h modified: openair1/PHY/CODING/3gpplte.c modified: openair1/PHY/CODING/3gpplte_sse.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c modified: openair1/PHY/CODING/TESTBENCH/ltetest.c modified: openair1/PHY/CODING/TESTBENCH/pdcch_test.c modified: openair1/PHY/CODING/TESTBENCH/viterbi_test.c modified: openair1/PHY/CODING/ccoding_byte.c modified: openair1/PHY/CODING/ccoding_byte_lte.c modified: openair1/PHY/CODING/crc_byte.c modified: openair1/PHY/CODING/defs.h modified: openair1/PHY/CODING/extern.h modified: openair1/PHY/CODING/extern_3GPPinterleaver.h modified: openair1/PHY/CODING/lte_interleaver.h modified: openair1/PHY/CODING/lte_interleaver2.h modified: openair1/PHY/CODING/lte_interleaver_inline.h modified: openair1/PHY/CODING/lte_rate_matching.c modified: openair1/PHY/CODING/lte_segmentation.c modified: openair1/PHY/CODING/rate_matching.c modified: openair1/PHY/CODING/scrambler.h modified: openair1/PHY/CODING/vars.h modified: openair1/PHY/CODING/viterbi.c modified: openair1/PHY/CODING/viterbi_lte.c modified: openair1/PHY/INIT/defs.h modified: openair1/PHY/INIT/extern.h modified: openair1/PHY/INIT/init_top.c modified: openair1/PHY/INIT/lte_init.c modified: openair1/PHY/INIT/lte_parms.c modified: openair1/PHY/INIT/vars.h modified: openair1/PHY/LTE_ESTIMATION/adjust_gain.c modified: openair1/PHY/LTE_ESTIMATION/defs.h modified: openair1/PHY/LTE_ESTIMATION/extern.h modified: openair1/PHY/LTE_ESTIMATION/filt96_32.h modified: openair1/PHY/LTE_ESTIMATION/freq_equalization.c modified: openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c modified: openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c modified: openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c modified: openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c modified: openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c modified: openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c modified: openair1/PHY/LTE_ESTIMATION/lte_sync_time.c modified: openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c modified: openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c modified: openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c modified: openair1/PHY/LTE_ESTIMATION/pss6144.h modified: openair1/PHY/LTE_ESTIMATION/vars.h modified: openair1/PHY/LTE_REFSIG/defs.h modified: openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c modified: openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c modified: openair1/PHY/LTE_REFSIG/lte_dl_uespec.c modified: openair1/PHY/LTE_REFSIG/lte_gold.c modified: openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c modified: openair1/PHY/LTE_REFSIG/lte_ul_ref.c modified: openair1/PHY/LTE_REFSIG/mod_table.h modified: openair1/PHY/LTE_TRANSPORT/dci.c modified: openair1/PHY/LTE_TRANSPORT/dci.h modified: openair1/PHY/LTE_TRANSPORT/dci_tools.c modified: openair1/PHY/LTE_TRANSPORT/defs.h modified: openair1/PHY/LTE_TRANSPORT/dlsch_coding.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h modified: openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h modified: openair1/PHY/LTE_TRANSPORT/drs_modulation.c modified: openair1/PHY/LTE_TRANSPORT/extern.h modified: openair1/PHY/LTE_TRANSPORT/group_hopping.c modified: openair1/PHY/LTE_TRANSPORT/initial_sync.c modified: openair1/PHY/LTE_TRANSPORT/lte_mcs.c modified: openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h modified: openair1/PHY/LTE_TRANSPORT/pbch.c modified: openair1/PHY/LTE_TRANSPORT/pcfich.c modified: openair1/PHY/LTE_TRANSPORT/phich.c modified: openair1/PHY/LTE_TRANSPORT/pilots.c modified: openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c modified: openair1/PHY/LTE_TRANSPORT/pmch.c modified: openair1/PHY/LTE_TRANSPORT/power_control.c modified: openair1/PHY/LTE_TRANSPORT/prach.c modified: openair1/PHY/LTE_TRANSPORT/prach.h modified: openair1/PHY/LTE_TRANSPORT/print_stats.c modified: openair1/PHY/LTE_TRANSPORT/proto.h modified: openair1/PHY/LTE_TRANSPORT/pss.c modified: openair1/PHY/LTE_TRANSPORT/pucch.c modified: openair1/PHY/LTE_TRANSPORT/rar_tools.c modified: openair1/PHY/LTE_TRANSPORT/srs_modulation.c modified: openair1/PHY/LTE_TRANSPORT/sss.c modified: openair1/PHY/LTE_TRANSPORT/sss.h modified: openair1/PHY/LTE_TRANSPORT/uci.h modified: openair1/PHY/LTE_TRANSPORT/uci_tools.c modified: openair1/PHY/LTE_TRANSPORT/ulsch_coding.c modified: openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c modified: openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c modified: openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c modified: openair1/PHY/LTE_TRANSPORT/vars.h modified: openair1/PHY/MODULATION/defs.h modified: openair1/PHY/MODULATION/extern.h modified: openair1/PHY/MODULATION/kHz_7_5.h modified: openair1/PHY/MODULATION/ofdm_mod.c modified: openair1/PHY/MODULATION/prach625Hz.h modified: openair1/PHY/MODULATION/slot_fep.c modified: openair1/PHY/MODULATION/slot_fep_mbsfn.c modified: openair1/PHY/MODULATION/slot_fep_ul.c modified: openair1/PHY/MODULATION/ul_7_5_kHz.c modified: openair1/PHY/MODULATION/vars.h modified: openair1/PHY/TOOLS/8bit_rxdemux.c modified: openair1/PHY/TOOLS/8bit_txmux.c modified: openair1/PHY/TOOLS/angle.c modified: openair1/PHY/TOOLS/cadd_sv.c modified: openair1/PHY/TOOLS/cadd_vv.c modified: openair1/PHY/TOOLS/cdot_prod.c modified: openair1/PHY/TOOLS/cmult_sv.c modified: openair1/PHY/TOOLS/cmult_vv.c modified: openair1/PHY/TOOLS/costable.h modified: openair1/PHY/TOOLS/dB_routines.c modified: openair1/PHY/TOOLS/dB_routines.h modified: openair1/PHY/TOOLS/defs.h modified: openair1/PHY/TOOLS/extern.h modified: openair1/PHY/TOOLS/file_output.c modified: openair1/PHY/TOOLS/invSqrt.c modified: openair1/PHY/TOOLS/log2_approx.c modified: openair1/PHY/TOOLS/lte_dfts.c modified: openair1/PHY/TOOLS/lte_phy_scope.c modified: openair1/PHY/TOOLS/lte_phy_scope.h modified: openair1/PHY/TOOLS/lut.c modified: openair1/PHY/TOOLS/memory_routines.c modified: openair1/PHY/TOOLS/signal_energy.c modified: openair1/PHY/TOOLS/smbv.c modified: openair1/PHY/TOOLS/smbv.h modified: openair1/PHY/TOOLS/sqrt.c modified: openair1/PHY/TOOLS/time_meas.c modified: openair1/PHY/TOOLS/time_meas.h modified: openair1/PHY/TOOLS/twiddle12288.h modified: openair1/PHY/TOOLS/twiddle1536.h modified: openair1/PHY/TOOLS/twiddle24576.h modified: openair1/PHY/TOOLS/twiddle6144.h modified: openair1/PHY/TOOLS/vars.h modified: openair1/PHY/defs.h modified: openair1/PHY/extern.h modified: openair1/PHY/impl_defs_lte.h modified: openair1/PHY/impl_defs_top.h modified: openair1/PHY/sse_intrin.h modified: openair1/PHY/types.h modified: openair1/PHY/vars.h modified: openair1/SCHED/defs.h modified: openair1/SCHED/extern.h modified: openair1/SCHED/phy_mac_stub.c modified: openair1/SCHED/phy_procedures_emos.h modified: openair1/SCHED/phy_procedures_lte_common.c modified: openair1/SCHED/phy_procedures_lte_eNb.c modified: openair1/SCHED/phy_procedures_lte_ue.c modified: openair1/SCHED/pucch_pc.c modified: openair1/SCHED/pusch_pc.c modified: openair1/SCHED/rt_compat.h modified: openair1/SCHED/vars.h modified: openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c modified: openair1/SIMULATION/ETH_TRANSPORT/defs.h modified: openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c modified: openair1/SIMULATION/ETH_TRANSPORT/extern.h modified: openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c modified: openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h modified: openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c modified: openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c modified: openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h modified: openair1/SIMULATION/ETH_TRANSPORT/proto.h modified: openair1/SIMULATION/ETH_TRANSPORT/socket.c modified: openair1/SIMULATION/ETH_TRANSPORT/socket.h modified: openair1/SIMULATION/ETH_TRANSPORT/vars.h modified: openair1/SIMULATION/LTE_PHY/LTE_Configuration.c modified: openair1/SIMULATION/LTE_PHY/LTE_Configuration.h modified: openair1/SIMULATION/LTE_PHY/dlsim.c modified: openair1/SIMULATION/LTE_PHY/framegen.c modified: openair1/SIMULATION/LTE_PHY/gpib_send.c modified: openair1/SIMULATION/LTE_PHY/gpib_send.h modified: openair1/SIMULATION/LTE_PHY/mbmssim.c modified: openair1/SIMULATION/LTE_PHY/pbchsim.c modified: openair1/SIMULATION/LTE_PHY/pdcchsim.c modified: openair1/SIMULATION/LTE_PHY/prachsim.c modified: openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h modified: openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c modified: openair1/SIMULATION/LTE_PHY/pucchsim.c modified: openair1/SIMULATION/LTE_PHY/scansim.c modified: openair1/SIMULATION/LTE_PHY/signalanalyzer.c modified: openair1/SIMULATION/LTE_PHY/signalanalyzer.h modified: openair1/SIMULATION/LTE_PHY/syncsim.c modified: openair1/SIMULATION/LTE_PHY/test.c modified: openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c modified: openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h modified: openair1/SIMULATION/LTE_PHY/ulsim.c modified: openair1/SIMULATION/LTE_PHY/ulsim2.c modified: openair1/SIMULATION/RF/adc.c modified: openair1/SIMULATION/RF/dac.c modified: openair1/SIMULATION/RF/defs.h modified: openair1/SIMULATION/RF/rf.c modified: openair1/SIMULATION/TOOLS/abstraction.c modified: openair1/SIMULATION/TOOLS/ch_desc_proto.c modified: openair1/SIMULATION/TOOLS/defs.h modified: openair1/SIMULATION/TOOLS/gauss.c modified: openair1/SIMULATION/TOOLS/llr_quantization.c modified: openair1/SIMULATION/TOOLS/multipath_channel.c modified: openair1/SIMULATION/TOOLS/multipath_tv_channel.c modified: openair1/SIMULATION/TOOLS/random_channel.c modified: openair1/SIMULATION/TOOLS/rangen_double.c modified: openair1/SIMULATION/TOOLS/scm_corrmat.h modified: openair1/SIMULATION/TOOLS/taus.c modified: openair2/COMMON/as_message.h modified: openair2/COMMON/commonDef.h modified: openair2/COMMON/gtpv1_u_messages_def.h modified: openair2/COMMON/gtpv1_u_messages_types.h modified: openair2/COMMON/intertask_interface_conf.h modified: openair2/COMMON/mac_messages_def.h modified: openair2/COMMON/mac_messages_types.h modified: openair2/COMMON/mac_primitives.h modified: openair2/COMMON/mac_rlc_primitives.h modified: openair2/COMMON/mac_rrc_primitives.h modified: openair2/COMMON/messages_def.h modified: openair2/COMMON/messages_types.h modified: openair2/COMMON/nas_messages_def.h modified: openair2/COMMON/nas_messages_types.h modified: openair2/COMMON/networkDef.h modified: openair2/COMMON/openair_defs.h modified: openair2/COMMON/openair_types.h modified: openair2/COMMON/pdcp_messages_def.h modified: openair2/COMMON/pdcp_messages_types.h modified: openair2/COMMON/phy_messages_def.h modified: openair2/COMMON/phy_messages_types.h modified: openair2/COMMON/platform_constants.h modified: openair2/COMMON/platform_types.h modified: openair2/COMMON/ral_messages_def.h modified: openair2/COMMON/ral_messages_types.h modified: openair2/COMMON/rlc_messages_def.h modified: openair2/COMMON/rlc_messages_types.h modified: openair2/COMMON/rrc_messages_def.h modified: openair2/COMMON/rrc_messages_types.h modified: openair2/COMMON/rrm_config_structs.h modified: openair2/COMMON/rrm_constants.h modified: openair2/COMMON/rtos_header.h modified: openair2/COMMON/s1ap_messages_def.h modified: openair2/COMMON/s1ap_messages_types.h modified: openair2/COMMON/sctp_messages_def.h modified: openair2/COMMON/sctp_messages_types.h modified: openair2/COMMON/tasks_def.h modified: openair2/COMMON/udp_messages_def.h modified: openair2/COMMON/udp_messages_types.h modified: openair2/COMMON/x2ap_messages_def.h modified: openair2/COMMON/x2ap_messages_types.h modified: openair2/DOCS/TEMPLATES/CODE/example_doxy.h modified: openair2/ENB_APP/enb_app.c modified: openair2/ENB_APP/enb_app.h modified: openair2/ENB_APP/enb_config.c modified: openair2/ENB_APP/enb_config.h modified: openair2/LAYER2/MAC/config.c modified: openair2/LAYER2/MAC/defs.h modified: openair2/LAYER2/MAC/eNB_scheduler.c modified: openair2/LAYER2/MAC/eNB_scheduler_RA.c modified: openair2/LAYER2/MAC/eNB_scheduler_bch.c modified: openair2/LAYER2/MAC/eNB_scheduler_dlsch.c modified: openair2/LAYER2/MAC/eNB_scheduler_mch.c modified: openair2/LAYER2/MAC/eNB_scheduler_primitives.c modified: openair2/LAYER2/MAC/eNB_scheduler_ulsch.c modified: openair2/LAYER2/MAC/extern.h modified: openair2/LAYER2/MAC/l1_helpers.c modified: openair2/LAYER2/MAC/lte_transport_init.c modified: openair2/LAYER2/MAC/main.c modified: openair2/LAYER2/MAC/openair2_proc.c modified: openair2/LAYER2/MAC/pre_processor.c modified: openair2/LAYER2/MAC/proto.h modified: openair2/LAYER2/MAC/ra_procedures.c modified: openair2/LAYER2/MAC/rar_tools.c modified: openair2/LAYER2/MAC/ue_procedures.c modified: openair2/LAYER2/MAC/vars.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h modified: openair2/LAYER2/RLC/rlc.c modified: openair2/LAYER2/RLC/rlc.h modified: openair2/LAYER2/RLC/rlc_def.h modified: openair2/LAYER2/RLC/rlc_def_lte.h modified: openair2/LAYER2/RLC/rlc_mac.c modified: openair2/LAYER2/RLC/rlc_mpls.c modified: openair2/LAYER2/RLC/rlc_primitives.h modified: openair2/LAYER2/RLC/rlc_rrc.c modified: openair2/LAYER2/layer2_top.c modified: openair2/LAYER2/openair2_proc.c modified: openair2/LAYER2/register.c modified: openair2/LAYER2/register.h modified: openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c modified: openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h modified: openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c modified: openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h modified: openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c modified: openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c modified: openair2/NAS/nas_ue_task.h modified: openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c modified: openair2/NETWORK_DRIVER/LITE/classifier.c modified: openair2/NETWORK_DRIVER/LITE/common.c modified: openair2/NETWORK_DRIVER/LITE/constant.h modified: openair2/NETWORK_DRIVER/LITE/device.c modified: openair2/NETWORK_DRIVER/LITE/ioctl.c modified: openair2/NETWORK_DRIVER/LITE/ioctl.h modified: openair2/NETWORK_DRIVER/LITE/local.h modified: openair2/NETWORK_DRIVER/LITE/netlink.c modified: openair2/NETWORK_DRIVER/LITE/proto_extern.h modified: openair2/NETWORK_DRIVER/LITE/sap.h modified: openair2/NETWORK_DRIVER/LITE/tool.c modified: openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c modified: openair2/NETWORK_DRIVER/MESH/classifier.c modified: openair2/NETWORK_DRIVER/MESH/common.c modified: openair2/NETWORK_DRIVER/MESH/constant.h modified: openair2/NETWORK_DRIVER/MESH/device.c modified: openair2/NETWORK_DRIVER/MESH/ioctl.c modified: openair2/NETWORK_DRIVER/MESH/ioctl.h modified: openair2/NETWORK_DRIVER/MESH/local.h modified: openair2/NETWORK_DRIVER/MESH/mesh.c modified: openair2/NETWORK_DRIVER/MESH/netlink.c modified: openair2/NETWORK_DRIVER/MESH/proto_extern.h modified: openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h modified: openair2/NETWORK_DRIVER/MESH/sap.h modified: openair2/NETWORK_DRIVER/MESH/tool.c modified: openair2/NETWORK_DRIVER/UE_IP/common.c modified: openair2/NETWORK_DRIVER/UE_IP/constant.h modified: openair2/NETWORK_DRIVER/UE_IP/device.c modified: openair2/NETWORK_DRIVER/UE_IP/local.h modified: openair2/NETWORK_DRIVER/UE_IP/netlink.c modified: openair2/NETWORK_DRIVER/UE_IP/proto_extern.h modified: openair2/NETWORK_DRIVER/UE_IP/sap.h modified: openair2/PHY_INTERFACE/defs.h modified: openair2/PHY_INTERFACE/extern.h modified: openair2/PHY_INTERFACE/mac_phy_primitives.c modified: openair2/PHY_INTERFACE/mac_phy_primitives.h modified: openair2/PHY_INTERFACE/vars.h modified: openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c modified: openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h modified: openair2/RRC/LITE/L2_interface.c modified: openair2/RRC/LITE/MESSAGES/asn1_msg.c modified: openair2/RRC/LITE/MESSAGES/asn1_msg.h modified: openair2/RRC/LITE/defs.h modified: openair2/RRC/LITE/extern.h modified: openair2/RRC/LITE/proto.h modified: openair2/RRC/LITE/rrc_2_rrm_msg.c modified: openair2/RRC/LITE/rrc_UE.c modified: openair2/RRC/LITE/rrc_UE_ral.c modified: openair2/RRC/LITE/rrc_UE_ral.h modified: openair2/RRC/LITE/rrc_common.c modified: openair2/RRC/LITE/rrc_config.c modified: openair2/RRC/LITE/rrc_eNB.c modified: openair2/RRC/LITE/rrc_eNB_GTPV1U.c modified: openair2/RRC/LITE/rrc_eNB_GTPV1U.h modified: openair2/RRC/LITE/rrc_eNB_S1AP.c modified: openair2/RRC/LITE/rrc_eNB_S1AP.h modified: openair2/RRC/LITE/rrc_eNB_UE_context.c modified: openair2/RRC/LITE/rrc_eNB_UE_context.h modified: openair2/RRC/LITE/rrc_eNB_ral.c modified: openair2/RRC/LITE/rrc_eNB_ral.h modified: openair2/RRC/LITE/rrc_rrm_interface.c modified: openair2/RRC/LITE/rrc_rrm_interface.h modified: openair2/RRC/LITE/rrc_types.h modified: openair2/RRC/LITE/rrm_2_rrc_msg.c modified: openair2/RRC/LITE/utils.c modified: openair2/RRC/LITE/vars.h modified: openair2/RRC/NAS/nas_config.c modified: openair2/RRC/NAS/nas_config.h modified: openair2/RRC/NAS/rb_config.c modified: openair2/RRC/NAS/rb_config.h modified: openair2/RRM_4_RRC_LITE/src/platform.h modified: openair2/RRM_4_RRC_LITE/src/platform_constants.h modified: openair2/RRM_4_RRC_LITE/src/platform_defines.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h modified: openair2/RRM_4_RRC_LITE/src/rrm.cpp modified: openair2/UTIL/AT_COMMANDS/parser.c modified: openair2/UTIL/AT_COMMANDS/parser.h modified: openair2/UTIL/BIGPHYS/bigphys.c modified: openair2/UTIL/BIGPHYS/defs.h modified: openair2/UTIL/CLI/cli.c modified: openair2/UTIL/CLI/cli.h modified: openair2/UTIL/CLI/cli_cmd.c modified: openair2/UTIL/CLI/cli_if.h modified: openair2/UTIL/CLI/cli_server.c modified: openair2/UTIL/FIFO/pad_list.c modified: openair2/UTIL/FIFO/pad_list.h modified: openair2/UTIL/FIFO/types.h modified: openair2/UTIL/LISTS/list.c modified: openair2/UTIL/LOG/log.c modified: openair2/UTIL/LOG/log.h modified: openair2/UTIL/LOG/log_extern.h modified: openair2/UTIL/LOG/log_if.h modified: openair2/UTIL/LOG/vcd_signal_dumper.c modified: openair2/UTIL/LOG/vcd_signal_dumper.h modified: openair2/UTIL/MATH/crc_byte.c modified: openair2/UTIL/MATH/oml.c modified: openair2/UTIL/MATH/oml.h modified: openair2/UTIL/MATH/random.c modified: openair2/UTIL/MATH/random_proto_extern.h modified: openair2/UTIL/MATH/taus.c modified: openair2/UTIL/MEM/mem_block.c modified: openair2/UTIL/MEM/mem_block.h modified: openair2/UTIL/MEM/mem_mngt.c modified: openair2/UTIL/MEM/mem_mngt_proto_extern.h modified: openair2/UTIL/MEM/mem_pool.h modified: openair2/UTIL/OCG/OCG.c modified: openair2/UTIL/OCG/OCG.h modified: openair2/UTIL/OCG/OCG_call_emu.h modified: openair2/UTIL/OCG/OCG_config_mobi.c modified: openair2/UTIL/OCG/OCG_config_mobi.h modified: openair2/UTIL/OCG/OCG_create_dir.c modified: openair2/UTIL/OCG/OCG_create_dir.h modified: openair2/UTIL/OCG/OCG_detect_file.c modified: openair2/UTIL/OCG/OCG_detect_file.h modified: openair2/UTIL/OCG/OCG_extern.h modified: openair2/UTIL/OCG/OCG_generate_report.c modified: openair2/UTIL/OCG/OCG_generate_report.h modified: openair2/UTIL/OCG/OCG_get_opt.c modified: openair2/UTIL/OCG/OCG_get_opt.h modified: openair2/UTIL/OCG/OCG_if.h modified: openair2/UTIL/OCG/OCG_parse_XML.c modified: openair2/UTIL/OCG/OCG_parse_XML.h modified: openair2/UTIL/OCG/OCG_parse_filename.c modified: openair2/UTIL/OCG/OCG_parse_filename.h modified: openair2/UTIL/OCG/OCG_save_XML.c modified: openair2/UTIL/OCG/OCG_save_XML.h modified: openair2/UTIL/OCG/OCG_vars.h modified: openair2/UTIL/OMG/TraCIConstants.h modified: openair2/UTIL/OMG/client_traci_OMG.c modified: openair2/UTIL/OMG/client_traci_OMG.h modified: openair2/UTIL/OMG/common.c modified: openair2/UTIL/OMG/defs.h modified: openair2/UTIL/OMG/grid.c modified: openair2/UTIL/OMG/grid.h modified: openair2/UTIL/OMG/id_manager.c modified: openair2/UTIL/OMG/id_manager.h modified: openair2/UTIL/OMG/job.c modified: openair2/UTIL/OMG/mobility_parser.c modified: openair2/UTIL/OMG/mobility_parser.h modified: openair2/UTIL/OMG/omg.c modified: openair2/UTIL/OMG/omg.h modified: openair2/UTIL/OMG/omg_constants.h modified: openair2/UTIL/OMG/omg_hashtable.c modified: openair2/UTIL/OMG/omg_hashtable.h modified: openair2/UTIL/OMG/omg_vars.h modified: openair2/UTIL/OMG/rwalk.c modified: openair2/UTIL/OMG/rwalk.h modified: openair2/UTIL/OMG/rwp.c modified: openair2/UTIL/OMG/rwp.h modified: openair2/UTIL/OMG/socket_traci_OMG.c modified: openair2/UTIL/OMG/socket_traci_OMG.h modified: openair2/UTIL/OMG/static.c modified: openair2/UTIL/OMG/static.h modified: openair2/UTIL/OMG/steadystaterwp.c modified: openair2/UTIL/OMG/steadystaterwp.h modified: openair2/UTIL/OMG/storage_traci_OMG.c modified: openair2/UTIL/OMG/storage_traci_OMG.h modified: openair2/UTIL/OMG/sumo.c modified: openair2/UTIL/OMG/sumo.h modified: openair2/UTIL/OMG/trace.c modified: openair2/UTIL/OMG/trace.h modified: openair2/UTIL/OMG/trace_hashtable.c modified: openair2/UTIL/OMG/trace_hashtable.h modified: openair2/UTIL/OMV/communicationthread.cpp modified: openair2/UTIL/OMV/communicationthread.h modified: openair2/UTIL/OMV/mywindow.cpp modified: openair2/UTIL/OMV/mywindow.h modified: openair2/UTIL/OMV/omv.cpp modified: openair2/UTIL/OMV/openglwidget.cpp modified: openair2/UTIL/OMV/openglwidget.h modified: openair2/UTIL/OMV/structures.h modified: openair2/UTIL/OPT/mac_pcap.h modified: openair2/UTIL/OPT/opt.h modified: openair2/UTIL/OPT/socket_sender.c modified: openair2/UTIL/OPT/vars.h modified: openair2/UTIL/OSA/osa_defs.h modified: openair2/UTIL/OSA/osa_internal.h modified: openair2/UTIL/OSA/osa_key_deriver.c modified: openair2/UTIL/OSA/osa_snow3g.h modified: openair2/UTIL/OSA/osa_stream_eea.c modified: openair2/UTIL/OSA/osa_stream_eia.c modified: openair2/UTIL/OTG/main.c modified: openair2/UTIL/OTG/otg.c modified: openair2/UTIL/OTG/otg.h modified: openair2/UTIL/OTG/otg_config.h modified: openair2/UTIL/OTG/otg_defs.h modified: openair2/UTIL/OTG/otg_externs.h modified: openair2/UTIL/OTG/otg_form.c modified: openair2/UTIL/OTG/otg_form.h modified: openair2/UTIL/OTG/otg_kpi.c modified: openair2/UTIL/OTG/otg_kpi.h modified: openair2/UTIL/OTG/otg_models.c modified: openair2/UTIL/OTG/otg_models.h modified: openair2/UTIL/OTG/otg_rx.c modified: openair2/UTIL/OTG/otg_rx.h modified: openair2/UTIL/OTG/otg_rx_socket.c modified: openair2/UTIL/OTG/otg_rx_socket.h modified: openair2/UTIL/OTG/otg_tx.c modified: openair2/UTIL/OTG/otg_tx.h modified: openair2/UTIL/OTG/otg_tx_socket.c modified: openair2/UTIL/OTG/otg_tx_socket.h modified: openair2/UTIL/OTG/otg_vars.h modified: openair2/UTIL/OTG/traffic_config.h modified: openair2/UTIL/TIMER/umts_timer.c modified: openair2/UTIL/TIMER/umts_timer.h modified: openair2/UTIL/TIMER/umts_timer_proto_extern.h modified: openair2/UTIL/TIMER/umts_timer_struct.h modified: openair2/UTIL/TRACE/fifo_printf.c modified: openair2/UTIL/TRACE/fifo_printf.h modified: openair2/UTIL/TRACE/fifo_printf_proto_extern.h modified: openair2/UTIL/TRACE/print.h modified: openair2/X2AP/x2ap.c modified: openair2/X2AP/x2ap.h modified: openair2/X2AP/x2ap_common.c modified: openair2/X2AP/x2ap_common.h modified: openair3/COMMON/common_types.h modified: openair3/COMMON/gtpv1_u_messages_def.h modified: openair3/COMMON/gtpv1_u_messages_types.h modified: openair3/COMMON/intertask_interface_conf.h modified: openair3/COMMON/messages_def.h modified: openair3/COMMON/messages_types.h modified: openair3/COMMON/nas_messages_def.h modified: openair3/COMMON/nas_messages_types.h modified: openair3/COMMON/s1ap_messages_def.h modified: openair3/COMMON/s1ap_messages_types.h modified: openair3/COMMON/sctp_messages_def.h modified: openair3/COMMON/sctp_messages_types.h modified: openair3/COMMON/security_types.h modified: openair3/COMMON/tasks_def.h modified: openair3/COMMON/udp_messages_def.h modified: openair3/COMMON/udp_messages_types.h modified: openair3/GTPV1-U/gtpv1u.h modified: openair3/GTPV1-U/gtpv1u_eNB.c modified: openair3/GTPV1-U/gtpv1u_eNB_defs.h modified: openair3/GTPV1-U/gtpv1u_eNB_task.h modified: openair3/GTPV1-U/gtpv1u_sgw_defs.h modified: openair3/GTPV1-U/gtpv1u_task.c modified: openair3/GTPV1-U/gtpv1u_teid_pool.c modified: openair3/NAS/COMMON/API/NETWORK/as_message.c modified: openair3/NAS/COMMON/API/NETWORK/l2_message.h modified: openair3/NAS/COMMON/API/NETWORK/nas_message.c modified: openair3/NAS/COMMON/API/NETWORK/nas_message.h modified: openair3/NAS/COMMON/API/NETWORK/network_api.c modified: openair3/NAS/COMMON/API/NETWORK/network_api.h modified: openair3/NAS/COMMON/EMM/MSG/AttachAccept.c modified: openair3/NAS/COMMON/EMM/MSG/AttachAccept.h modified: openair3/NAS/COMMON/EMM/MSG/AttachComplete.c modified: openair3/NAS/COMMON/EMM/MSG/AttachComplete.h modified: openair3/NAS/COMMON/EMM/MSG/AttachReject.c modified: openair3/NAS/COMMON/EMM/MSG/AttachReject.h modified: openair3/NAS/COMMON/EMM/MSG/AttachRequest.c modified: openair3/NAS/COMMON/EMM/MSG/AttachRequest.h modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h modified: openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c modified: openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h modified: openair3/NAS/COMMON/EMM/MSG/DetachAccept.c modified: openair3/NAS/COMMON/EMM/MSG/DetachAccept.h modified: openair3/NAS/COMMON/EMM/MSG/DetachRequest.c modified: openair3/NAS/COMMON/EMM/MSG/DetachRequest.h modified: openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c modified: openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h modified: openair3/NAS/COMMON/EMM/MSG/EmmInformation.c modified: openair3/NAS/COMMON/EMM/MSG/EmmInformation.h modified: openair3/NAS/COMMON/EMM/MSG/EmmStatus.c modified: openair3/NAS/COMMON/EMM/MSG/EmmStatus.h modified: openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c modified: openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h modified: openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c modified: openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h modified: openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c modified: openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h modified: openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c modified: openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h modified: openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c modified: openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h modified: openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h modified: openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h modified: openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c modified: openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c modified: openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c modified: openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h modified: openair3/NAS/COMMON/EMM/MSG/ServiceReject.c modified: openair3/NAS/COMMON/EMM/MSG/ServiceReject.h modified: openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c modified: openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h modified: openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c modified: openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h modified: openair3/NAS/COMMON/EMM/MSG/emm_cause.h modified: openair3/NAS/COMMON/EMM/MSG/emm_msg.c modified: openair3/NAS/COMMON/EMM/MSG/emm_msg.h modified: openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h modified: openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c modified: openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h modified: openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c modified: openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h modified: openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c modified: openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h modified: openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c modified: openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h modified: openair3/NAS/COMMON/ESM/MSG/EsmStatus.c modified: openair3/NAS/COMMON/ESM/MSG/EsmStatus.h modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h modified: openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c modified: openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h modified: openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c modified: openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h modified: openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c modified: openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h modified: openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c modified: openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h modified: openair3/NAS/COMMON/ESM/MSG/esm_cause.h modified: openair3/NAS/COMMON/ESM/MSG/esm_msg.c modified: openair3/NAS/COMMON/ESM/MSG/esm_msg.h modified: openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h modified: openair3/NAS/COMMON/IES/AccessPointName.c modified: openair3/NAS/COMMON/IES/AccessPointName.h modified: openair3/NAS/COMMON/IES/AdditionalUpdateResult.c modified: openair3/NAS/COMMON/IES/AdditionalUpdateResult.h modified: openair3/NAS/COMMON/IES/AdditionalUpdateType.c modified: openair3/NAS/COMMON/IES/AdditionalUpdateType.h modified: openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c modified: openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h modified: openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c modified: openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h modified: openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c modified: openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h modified: openair3/NAS/COMMON/IES/AuthenticationParameterRand.c modified: openair3/NAS/COMMON/IES/AuthenticationParameterRand.h modified: openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c modified: openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h modified: openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c modified: openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h modified: openair3/NAS/COMMON/IES/Cli.c modified: openair3/NAS/COMMON/IES/Cli.h modified: openair3/NAS/COMMON/IES/CsfbResponse.c modified: openair3/NAS/COMMON/IES/CsfbResponse.h modified: openair3/NAS/COMMON/IES/DaylightSavingTime.c modified: openair3/NAS/COMMON/IES/DaylightSavingTime.h modified: openair3/NAS/COMMON/IES/DetachType.c modified: openair3/NAS/COMMON/IES/DetachType.h modified: openair3/NAS/COMMON/IES/DrxParameter.c modified: openair3/NAS/COMMON/IES/DrxParameter.h modified: openair3/NAS/COMMON/IES/EmergencyNumberList.c modified: openair3/NAS/COMMON/IES/EmergencyNumberList.h modified: openair3/NAS/COMMON/IES/EmmCause.c modified: openair3/NAS/COMMON/IES/EmmCause.h modified: openair3/NAS/COMMON/IES/EpsAttachResult.c modified: openair3/NAS/COMMON/IES/EpsAttachResult.h modified: openair3/NAS/COMMON/IES/EpsAttachType.c modified: openair3/NAS/COMMON/IES/EpsAttachType.h modified: openair3/NAS/COMMON/IES/EpsBearerContextStatus.c modified: openair3/NAS/COMMON/IES/EpsBearerContextStatus.h modified: openair3/NAS/COMMON/IES/EpsBearerIdentity.c modified: openair3/NAS/COMMON/IES/EpsBearerIdentity.h modified: openair3/NAS/COMMON/IES/EpsMobileIdentity.c modified: openair3/NAS/COMMON/IES/EpsMobileIdentity.h modified: openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c modified: openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h modified: openair3/NAS/COMMON/IES/EpsQualityOfService.c modified: openair3/NAS/COMMON/IES/EpsQualityOfService.h modified: openair3/NAS/COMMON/IES/EpsUpdateResult.c modified: openair3/NAS/COMMON/IES/EpsUpdateResult.h modified: openair3/NAS/COMMON/IES/EpsUpdateType.c modified: openair3/NAS/COMMON/IES/EpsUpdateType.h modified: openair3/NAS/COMMON/IES/EsmCause.c modified: openair3/NAS/COMMON/IES/EsmCause.h modified: openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c modified: openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h modified: openair3/NAS/COMMON/IES/EsmMessageContainer.c modified: openair3/NAS/COMMON/IES/EsmMessageContainer.h modified: openair3/NAS/COMMON/IES/GprsTimer.c modified: openair3/NAS/COMMON/IES/GprsTimer.h modified: openair3/NAS/COMMON/IES/GutiType.c modified: openair3/NAS/COMMON/IES/GutiType.h modified: openair3/NAS/COMMON/IES/IdentityType2.c modified: openair3/NAS/COMMON/IES/IdentityType2.h modified: openair3/NAS/COMMON/IES/ImeisvRequest.c modified: openair3/NAS/COMMON/IES/ImeisvRequest.h modified: openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c modified: openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h modified: openair3/NAS/COMMON/IES/LcsClientIdentity.c modified: openair3/NAS/COMMON/IES/LcsClientIdentity.h modified: openair3/NAS/COMMON/IES/LcsIndicator.c modified: openair3/NAS/COMMON/IES/LcsIndicator.h modified: openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c modified: openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h modified: openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c modified: openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h modified: openair3/NAS/COMMON/IES/LocationAreaIdentification.c modified: openair3/NAS/COMMON/IES/LocationAreaIdentification.h modified: openair3/NAS/COMMON/IES/MessageType.c modified: openair3/NAS/COMMON/IES/MessageType.h modified: openair3/NAS/COMMON/IES/MobileIdentity.c modified: openair3/NAS/COMMON/IES/MobileIdentity.h modified: openair3/NAS/COMMON/IES/MobileStationClassmark2.c modified: openair3/NAS/COMMON/IES/MobileStationClassmark2.h modified: openair3/NAS/COMMON/IES/MobileStationClassmark3.c modified: openair3/NAS/COMMON/IES/MobileStationClassmark3.h modified: openair3/NAS/COMMON/IES/MsNetworkCapability.c modified: openair3/NAS/COMMON/IES/MsNetworkCapability.h modified: openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c modified: openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h modified: openair3/NAS/COMMON/IES/NasKeySetIdentifier.c modified: openair3/NAS/COMMON/IES/NasKeySetIdentifier.h modified: openair3/NAS/COMMON/IES/NasMessageContainer.c modified: openair3/NAS/COMMON/IES/NasMessageContainer.h modified: openair3/NAS/COMMON/IES/NasRequestType.c modified: openair3/NAS/COMMON/IES/NasRequestType.h modified: openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c modified: openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h modified: openair3/NAS/COMMON/IES/NetworkName.c modified: openair3/NAS/COMMON/IES/NetworkName.h modified: openair3/NAS/COMMON/IES/Nonce.c modified: openair3/NAS/COMMON/IES/Nonce.h modified: openair3/NAS/COMMON/IES/PTmsiSignature.c modified: openair3/NAS/COMMON/IES/PTmsiSignature.h modified: openair3/NAS/COMMON/IES/PacketFlowIdentifier.c modified: openair3/NAS/COMMON/IES/PacketFlowIdentifier.h modified: openair3/NAS/COMMON/IES/PagingIdentity.c modified: openair3/NAS/COMMON/IES/PagingIdentity.h modified: openair3/NAS/COMMON/IES/PdnAddress.c modified: openair3/NAS/COMMON/IES/PdnAddress.h modified: openair3/NAS/COMMON/IES/PdnType.c modified: openair3/NAS/COMMON/IES/PdnType.h modified: openair3/NAS/COMMON/IES/PlmnList.c modified: openair3/NAS/COMMON/IES/PlmnList.h modified: openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c modified: openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h modified: openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c modified: openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h modified: openair3/NAS/COMMON/IES/ProtocolDiscriminator.c modified: openair3/NAS/COMMON/IES/ProtocolDiscriminator.h modified: openair3/NAS/COMMON/IES/QualityOfService.c modified: openair3/NAS/COMMON/IES/QualityOfService.h modified: openair3/NAS/COMMON/IES/RadioPriority.c modified: openair3/NAS/COMMON/IES/RadioPriority.h modified: openair3/NAS/COMMON/IES/SecurityHeaderType.c modified: openair3/NAS/COMMON/IES/SecurityHeaderType.h modified: openair3/NAS/COMMON/IES/ServiceType.c modified: openair3/NAS/COMMON/IES/ServiceType.h modified: openair3/NAS/COMMON/IES/ShortMac.c modified: openair3/NAS/COMMON/IES/ShortMac.h modified: openair3/NAS/COMMON/IES/SsCode.c modified: openair3/NAS/COMMON/IES/SsCode.h modified: openair3/NAS/COMMON/IES/SupportedCodecList.c modified: openair3/NAS/COMMON/IES/SupportedCodecList.h modified: openair3/NAS/COMMON/IES/TimeZone.c modified: openair3/NAS/COMMON/IES/TimeZone.h modified: openair3/NAS/COMMON/IES/TimeZoneAndTime.c modified: openair3/NAS/COMMON/IES/TimeZoneAndTime.h modified: openair3/NAS/COMMON/IES/TmsiStatus.c modified: openair3/NAS/COMMON/IES/TmsiStatus.h modified: openair3/NAS/COMMON/IES/TrackingAreaIdentity.c modified: openair3/NAS/COMMON/IES/TrackingAreaIdentity.h modified: openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c modified: openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h modified: openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c modified: openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h modified: openair3/NAS/COMMON/IES/TrafficFlowTemplate.c modified: openair3/NAS/COMMON/IES/TrafficFlowTemplate.h modified: openair3/NAS/COMMON/IES/TransactionIdentifier.c modified: openair3/NAS/COMMON/IES/TransactionIdentifier.h modified: openair3/NAS/COMMON/IES/UeNetworkCapability.c modified: openair3/NAS/COMMON/IES/UeNetworkCapability.h modified: openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c modified: openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h modified: openair3/NAS/COMMON/IES/UeSecurityCapability.c modified: openair3/NAS/COMMON/IES/UeSecurityCapability.h modified: openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c modified: openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h modified: openair3/NAS/COMMON/UTIL/OctetString.c modified: openair3/NAS/COMMON/UTIL/OctetString.h modified: openair3/NAS/COMMON/UTIL/TLVDecoder.c modified: openair3/NAS/COMMON/UTIL/TLVDecoder.h modified: openair3/NAS/COMMON/UTIL/TLVEncoder.c modified: openair3/NAS/COMMON/UTIL/TLVEncoder.h modified: openair3/NAS/COMMON/UTIL/device.c modified: openair3/NAS/COMMON/UTIL/device.h modified: openair3/NAS/COMMON/UTIL/memory.c modified: openair3/NAS/COMMON/UTIL/memory.h modified: openair3/NAS/COMMON/UTIL/nas_log.c modified: openair3/NAS/COMMON/UTIL/nas_log.h modified: openair3/NAS/COMMON/UTIL/nas_timer.c modified: openair3/NAS/COMMON/UTIL/nas_timer.h modified: openair3/NAS/COMMON/UTIL/parser.c modified: openair3/NAS/COMMON/UTIL/parser.h modified: openair3/NAS/COMMON/UTIL/socket.c modified: openair3/NAS/COMMON/UTIL/socket.h modified: openair3/NAS/COMMON/UTIL/stty.c modified: openair3/NAS/COMMON/UTIL/tst/timer.c modified: openair3/NAS/COMMON/securityDef.h modified: openair3/NAS/COMMON/userDef.h modified: openair3/NAS/TOOLS/network.h modified: openair3/NAS/TOOLS/ue_data.c modified: openair3/NAS/TOOLS/usim_data.c modified: openair3/NAS/UE/API/USER/at_command.c modified: openair3/NAS/UE/API/USER/at_command.h modified: openair3/NAS/UE/API/USER/at_error.c modified: openair3/NAS/UE/API/USER/at_error.h modified: openair3/NAS/UE/API/USER/at_response.c modified: openair3/NAS/UE/API/USER/at_response.h modified: openair3/NAS/UE/API/USER/tst/at_parser.c modified: openair3/NAS/UE/API/USER/user_api.c modified: openair3/NAS/UE/API/USER/user_api.h modified: openair3/NAS/UE/API/USER/user_indication.c modified: openair3/NAS/UE/API/USER/user_indication.h modified: openair3/NAS/UE/API/USIM/aka_functions.h modified: openair3/NAS/UE/API/USIM/usim_api.c modified: openair3/NAS/UE/API/USIM/usim_api.h modified: openair3/NAS/UE/EMM/Attach.c modified: openair3/NAS/UE/EMM/Authentication.c modified: openair3/NAS/UE/EMM/Detach.c modified: openair3/NAS/UE/EMM/EmmStatusHdl.c modified: openair3/NAS/UE/EMM/Identification.c modified: openair3/NAS/UE/EMM/IdleMode.c modified: openair3/NAS/UE/EMM/IdleMode.h modified: openair3/NAS/UE/EMM/LowerLayer.c modified: openair3/NAS/UE/EMM/LowerLayer.h modified: openair3/NAS/UE/EMM/SAP/EmmDeregistered.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c modified: openair3/NAS/UE/EMM/SAP/EmmNull.c modified: openair3/NAS/UE/EMM/SAP/EmmRegistered.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c modified: openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c modified: openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c modified: openair3/NAS/UE/EMM/SAP/emm_as.c modified: openair3/NAS/UE/EMM/SAP/emm_as.h modified: openair3/NAS/UE/EMM/SAP/emm_asDef.h modified: openair3/NAS/UE/EMM/SAP/emm_esm.c modified: openair3/NAS/UE/EMM/SAP/emm_esm.h modified: openair3/NAS/UE/EMM/SAP/emm_esmDef.h modified: openair3/NAS/UE/EMM/SAP/emm_fsm.c modified: openair3/NAS/UE/EMM/SAP/emm_fsm.h modified: openair3/NAS/UE/EMM/SAP/emm_recv.c modified: openair3/NAS/UE/EMM/SAP/emm_recv.h modified: openair3/NAS/UE/EMM/SAP/emm_reg.c modified: openair3/NAS/UE/EMM/SAP/emm_reg.h modified: openair3/NAS/UE/EMM/SAP/emm_regDef.h modified: openair3/NAS/UE/EMM/SAP/emm_sap.c modified: openair3/NAS/UE/EMM/SAP/emm_sap.h modified: openair3/NAS/UE/EMM/SAP/emm_send.c modified: openair3/NAS/UE/EMM/SAP/emm_send.h modified: openair3/NAS/UE/EMM/SecurityModeControl.c modified: openair3/NAS/UE/EMM/ServiceRequestHdl.c modified: openair3/NAS/UE/EMM/TrackingAreaUpdate.c modified: openair3/NAS/UE/EMM/emmData.h modified: openair3/NAS/UE/EMM/emm_main.c modified: openair3/NAS/UE/EMM/emm_main.h modified: openair3/NAS/UE/EMM/emm_proc.h modified: openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c modified: openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c modified: openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c modified: openair3/NAS/UE/ESM/EsmStatusHdl.c modified: openair3/NAS/UE/ESM/PdnConnectivity.c modified: openair3/NAS/UE/ESM/PdnDisconnect.c modified: openair3/NAS/UE/ESM/SAP/esm_recv.c modified: openair3/NAS/UE/ESM/SAP/esm_recv.h modified: openair3/NAS/UE/ESM/SAP/esm_sap.c modified: openair3/NAS/UE/ESM/SAP/esm_sap.h modified: openair3/NAS/UE/ESM/SAP/esm_sapDef.h modified: openair3/NAS/UE/ESM/SAP/esm_send.c modified: openair3/NAS/UE/ESM/SAP/esm_send.h modified: openair3/NAS/UE/ESM/esmData.h modified: openair3/NAS/UE/ESM/esm_ebr.c modified: openair3/NAS/UE/ESM/esm_ebr.h modified: openair3/NAS/UE/ESM/esm_ebr_context.c modified: openair3/NAS/UE/ESM/esm_ebr_context.h modified: openair3/NAS/UE/ESM/esm_ip.c modified: openair3/NAS/UE/ESM/esm_main.c modified: openair3/NAS/UE/ESM/esm_main.h modified: openair3/NAS/UE/ESM/esm_proc.h modified: openair3/NAS/UE/ESM/esm_pt.c modified: openair3/NAS/UE/ESM/esm_pt.h modified: openair3/NAS/UE/UEprocess.c modified: openair3/NAS/UE/nas_itti_messaging.c modified: openair3/NAS/UE/nas_itti_messaging.h modified: openair3/NAS/UE/nas_network.c modified: openair3/NAS/UE/nas_network.h modified: openair3/NAS/UE/nas_parser.c modified: openair3/NAS/UE/nas_parser.h modified: openair3/NAS/UE/nas_proc.c modified: openair3/NAS/UE/nas_proc.h modified: openair3/NAS/UE/nas_ue_task.c modified: openair3/NAS/UE/nas_user.c modified: openair3/NAS/UE/nas_user.h modified: openair3/S1AP/s1ap_common.c modified: openair3/S1AP/s1ap_common.h modified: openair3/S1AP/s1ap_eNB.c modified: openair3/S1AP/s1ap_eNB.h modified: openair3/S1AP/s1ap_eNB_context_management_procedures.c modified: openair3/S1AP/s1ap_eNB_context_management_procedures.h modified: openair3/S1AP/s1ap_eNB_decoder.c modified: openair3/S1AP/s1ap_eNB_decoder.h modified: openair3/S1AP/s1ap_eNB_default_values.h modified: openair3/S1AP/s1ap_eNB_defs.h modified: openair3/S1AP/s1ap_eNB_encoder.c modified: openair3/S1AP/s1ap_eNB_encoder.h modified: openair3/S1AP/s1ap_eNB_handlers.c modified: openair3/S1AP/s1ap_eNB_handlers.h modified: openair3/S1AP/s1ap_eNB_itti_messaging.c modified: openair3/S1AP/s1ap_eNB_itti_messaging.h modified: openair3/S1AP/s1ap_eNB_management_procedures.c modified: openair3/S1AP/s1ap_eNB_management_procedures.h modified: openair3/S1AP/s1ap_eNB_nas_procedures.c modified: openair3/S1AP/s1ap_eNB_nas_procedures.h modified: openair3/S1AP/s1ap_eNB_nnsf.c modified: openair3/S1AP/s1ap_eNB_nnsf.h modified: openair3/S1AP/s1ap_eNB_overload.c modified: openair3/S1AP/s1ap_eNB_overload.h modified: openair3/S1AP/s1ap_eNB_trace.c modified: openair3/S1AP/s1ap_eNB_trace.h modified: openair3/S1AP/s1ap_eNB_ue_context.c modified: openair3/S1AP/s1ap_eNB_ue_context.h modified: openair3/SCTP/sctp_common.c modified: openair3/SCTP/sctp_common.h modified: openair3/SCTP/sctp_default_values.h modified: openair3/SCTP/sctp_eNB_defs.h modified: openair3/SCTP/sctp_eNB_itti_messaging.c modified: openair3/SCTP/sctp_eNB_itti_messaging.h modified: openair3/SCTP/sctp_eNB_task.c modified: openair3/SCTP/sctp_eNB_task.h modified: openair3/SCTP/sctp_primitives_client.c modified: openair3/SCTP/sctp_primitives_client.h modified: openair3/SECU/kdf.c modified: openair3/SECU/key_nas_deriver.c modified: openair3/SECU/key_nas_encryption.c modified: openair3/SECU/nas_stream_eea1.c modified: openair3/SECU/nas_stream_eea2.c modified: openair3/SECU/nas_stream_eia1.c modified: openair3/SECU/nas_stream_eia2.c modified: openair3/SECU/rijndael.h modified: openair3/SECU/secu_defs.h modified: openair3/SECU/snow3g.c modified: openair3/SECU/snow3g.h modified: openair3/TEST/EPC_TEST/generate_scenario.c modified: openair3/TEST/EPC_TEST/generate_scenario.h modified: openair3/TEST/EPC_TEST/play_scenario.c modified: openair3/TEST/EPC_TEST/play_scenario.h modified: openair3/TEST/EPC_TEST/play_scenario_decode.c modified: openair3/TEST/EPC_TEST/play_scenario_display.c modified: openair3/TEST/EPC_TEST/play_scenario_fsm.c modified: openair3/TEST/EPC_TEST/play_scenario_parse.c modified: openair3/TEST/EPC_TEST/play_scenario_s1ap.c modified: openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c modified: openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h modified: openair3/TEST/EPC_TEST/play_scenario_sctp.c modified: openair3/TEST/oaisim_mme_client_test.c modified: openair3/TEST/oaisim_mme_itti_test.c modified: openair3/TEST/oaisim_mme_list_benchmark.c modified: openair3/TEST/oaisim_mme_s1ap_test.c modified: openair3/TEST/oaisim_mme_sctp_test.c modified: openair3/TEST/oaisim_mme_test_s1c.c modified: openair3/TEST/oaisim_mme_test_s1c.h modified: openair3/TEST/oaisim_mme_test_s1c_s1ap.c modified: openair3/TEST/oaisim_mme_test_s1c_s1ap.h modified: openair3/TEST/oaisim_mme_test_s1c_scenario.c modified: openair3/TEST/oaisim_mme_test_s1c_scenario.h modified: openair3/TEST/oaisim_mme_test_s1c_scenario1.c modified: openair3/TEST/test_aes128_cmac_encrypt.c modified: openair3/TEST/test_aes128_ctr_decrypt.c modified: openair3/TEST/test_aes128_ctr_encrypt.c modified: openair3/TEST/test_kdf.c modified: openair3/TEST/test_s1ap.c modified: openair3/TEST/test_secu.c modified: openair3/TEST/test_secu_kenb.c modified: openair3/TEST/test_secu_knas.c modified: openair3/TEST/test_secu_knas_encrypt_eea1.c modified: openair3/TEST/test_secu_knas_encrypt_eea2.c modified: openair3/TEST/test_secu_knas_encrypt_eia1.c modified: openair3/TEST/test_secu_knas_encrypt_eia2.c modified: openair3/TEST/test_secu_knas_stream_int.c modified: openair3/UDP/udp_eNB_task.c modified: openair3/UDP/udp_eNB_task.h modified: openair3/UTILS/HASHTABLE/hashtable.c modified: openair3/UTILS/HASHTABLE/hashtable.h modified: openair3/UTILS/HASHTABLE/obj_hashtable.c modified: openair3/UTILS/HASHTABLE/obj_hashtable.h modified: openair3/UTILS/conversions.c modified: openair3/UTILS/conversions.h modified: openair3/UTILS/enum_string.c modified: openair3/UTILS/enum_string.h modified: openair3/UTILS/log.c modified: openair3/UTILS/log.h modified: openair3/UTILS/mcc_mnc_itu.c modified: openair3/UTILS/mcc_mnc_itu.h modified: openair3/UTILS/mme_config.c modified: openair3/UTILS/mme_config.h modified: openair3/UTILS/mme_default_values.h modified: targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c modified: targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h modified: targets/ARCH/COMMON/common_lib.c modified: targets/ARCH/COMMON/common_lib.h modified: targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c modified: targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c modified: targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c modified: targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h modified: targets/ARCH/EXMIMO/DEFS/openair_device.h modified: targets/ARCH/EXMIMO/DEFS/pcie_interface.h modified: targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h modified: targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c modified: targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h modified: targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c modified: targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c modified: targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c modified: targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c modified: targets/ARCH/EXMIMO/USERSPACE/LIB/example.c modified: targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c modified: targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h modified: targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c modified: targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h modified: targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h modified: targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h modified: targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c modified: targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h modified: targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp modified: targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp modified: targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp modified: targets/COMMON/create_tasks.c modified: targets/COMMON/create_tasks.h modified: targets/RT/USER/TOOLS/thread_ipc.c modified: targets/RT/USER/TOOLS/thread_ipc.h modified: targets/RT/USER/UE_transport_IQ.c modified: targets/RT/USER/condtest.c modified: targets/RT/USER/eNB_transport_IQ.c modified: targets/RT/USER/emos-raw.c modified: targets/RT/USER/lte-softmodem.c modified: targets/RT/USER/lte-ue.c modified: targets/RT/USER/msg_many.h modified: targets/RT/USER/rrh.c modified: targets/RT/USER/rrh_gw.c modified: targets/RT/USER/rrh_gw.h modified: targets/RT/USER/rrh_gw_externs.h modified: targets/RT/USER/rt_wrapper.c modified: targets/RT/USER/rt_wrapper.h modified: targets/RT/USER/sched_dlsch.c modified: targets/RT/USER/sched_rx_pdsch.c modified: targets/RT/USER/sched_ulsch.c modified: targets/RT/USER/sleeptest.c modified: targets/RT/USER/synctest.c modified: targets/SIMU/PROC/Process.c modified: targets/SIMU/PROC/Process.h modified: targets/SIMU/PROC/Tsync.h modified: targets/SIMU/PROC/channel_sim_proc.c modified: targets/SIMU/PROC/channel_sim_proc.h modified: targets/SIMU/PROC/interface.h modified: targets/SIMU/USER/channel_sim.c modified: targets/SIMU/USER/cor_SF_sim.c modified: targets/SIMU/USER/cor_SF_sim.h modified: targets/SIMU/USER/event_handler.c modified: targets/SIMU/USER/event_handler.h modified: targets/SIMU/USER/init_lte.c modified: targets/SIMU/USER/init_lte.h modified: targets/SIMU/USER/oaisim.c modified: targets/SIMU/USER/oaisim.h modified: targets/SIMU/USER/oaisim_config.c modified: targets/SIMU/USER/oaisim_config.h modified: targets/SIMU/USER/oaisim_functions.c modified: targets/SIMU/USER/oaisim_functions.h modified: targets/SIMU/USER/oaisim_pad.c modified: targets/SIMU/USER/sinr_sim.c --- common/utils/asn1_conversions.h | 29 ----------------- common/utils/assertions.h | 29 ----------------- common/utils/collection/hashtable/hashtable.c | 29 ----------------- common/utils/collection/hashtable/hashtable.h | 30 ------------------ .../collection/hashtable/obj_hashtable.c | 29 ----------------- .../collection/hashtable/obj_hashtable.h | 29 ----------------- common/utils/itti/assertions.h | 29 ----------------- common/utils/itti/backtrace.c | 28 ----------------- common/utils/itti/backtrace.h | 29 ----------------- common/utils/itti/intertask_interface.c | 29 ----------------- common/utils/itti/intertask_interface.h | 29 ----------------- common/utils/itti/intertask_interface_dump.c | 30 ------------------ common/utils/itti/intertask_interface_dump.h | 29 ----------------- common/utils/itti/intertask_interface_init.h | 29 ----------------- common/utils/itti/intertask_interface_types.h | 29 ----------------- common/utils/itti/intertask_messages_def.h | 29 ----------------- common/utils/itti/intertask_messages_types.h | 29 ----------------- common/utils/itti/itti_types.h | 29 ----------------- common/utils/itti/memory_pools.c | 29 ----------------- common/utils/itti/memory_pools.h | 29 ----------------- common/utils/itti/messages_def.h | 29 ----------------- common/utils/itti/messages_types.h | 29 ----------------- common/utils/itti/signals.c | 29 ----------------- common/utils/itti/signals.h | 29 ----------------- common/utils/itti/tasks_def.h | 29 ----------------- common/utils/itti/timer.c | 29 ----------------- common/utils/itti/timer.h | 29 ----------------- common/utils/itti/timer_messages_def.h | 29 ----------------- common/utils/itti/timer_messages_types.h | 29 ----------------- .../utils/itti_analyzer/common/itti_types.h | 29 ----------------- common/utils/itti_analyzer/common/logs.h | 29 ----------------- common/utils/itti_analyzer/common/rc.h | 30 ------------------ common/utils/itti_analyzer/itti_analyzer.c | 30 ------------------ .../utils/itti_analyzer/libbuffers/buffers.c | 30 ------------------ .../utils/itti_analyzer/libbuffers/buffers.h | 30 ------------------ common/utils/itti_analyzer/libbuffers/file.c | 30 ------------------ common/utils/itti_analyzer/libbuffers/file.h | 30 ------------------ .../utils/itti_analyzer/libbuffers/socket.c | 30 ------------------ .../utils/itti_analyzer/libbuffers/socket.h | 30 ------------------ .../itti_analyzer/libparser/array_type.c | 30 ------------------ .../itti_analyzer/libparser/array_type.h | 30 ------------------ .../utils/itti_analyzer/libparser/enum_type.c | 30 ------------------ .../utils/itti_analyzer/libparser/enum_type.h | 30 ------------------ .../itti_analyzer/libparser/enum_value_type.c | 30 ------------------ .../itti_analyzer/libparser/enum_value_type.h | 30 ------------------ .../itti_analyzer/libparser/field_type.c | 30 ------------------ .../itti_analyzer/libparser/field_type.h | 30 ------------------ .../utils/itti_analyzer/libparser/file_type.c | 30 ------------------ .../utils/itti_analyzer/libparser/file_type.h | 30 ------------------ .../libparser/fundamental_type.c | 30 ------------------ .../libparser/fundamental_type.h | 29 ----------------- .../libparser/intertask_contexts.h | 30 ------------------ .../itti_analyzer/libparser/pointer_type.c | 30 ------------------ .../itti_analyzer/libparser/pointer_type.h | 30 ------------------ .../itti_analyzer/libparser/reference_type.c | 30 ------------------ .../itti_analyzer/libparser/reference_type.h | 30 ------------------ .../itti_analyzer/libparser/struct_type.c | 30 ------------------ .../itti_analyzer/libparser/struct_type.h | 30 ------------------ .../itti_analyzer/libparser/typedef_type.c | 30 ------------------ .../itti_analyzer/libparser/typedef_type.h | 30 ------------------ common/utils/itti_analyzer/libparser/types.c | 30 ------------------ common/utils/itti_analyzer/libparser/types.h | 30 ------------------ .../itti_analyzer/libparser/union_type.c | 30 ------------------ .../itti_analyzer/libparser/union_type.h | 30 ------------------ .../utils/itti_analyzer/libparser/xml_parse.c | 30 ------------------ .../utils/itti_analyzer/libparser/xml_parse.h | 30 ------------------ .../itti_analyzer/libresolver/locate_root.c | 30 ------------------ .../itti_analyzer/libresolver/locate_root.h | 30 ------------------ .../itti_analyzer/libresolver/resolvers.c | 30 ------------------ .../itti_analyzer/libresolver/resolvers.h | 30 ------------------ .../utils/itti_analyzer/libui/ui_callbacks.c | 30 ------------------ .../utils/itti_analyzer/libui/ui_callbacks.h | 30 ------------------ common/utils/itti_analyzer/libui/ui_filters.c | 30 ------------------ common/utils/itti_analyzer/libui/ui_filters.h | 30 ------------------ .../utils/itti_analyzer/libui/ui_interface.c | 30 ------------------ .../utils/itti_analyzer/libui/ui_interface.h | 30 ------------------ .../itti_analyzer/libui/ui_main_screen.c | 30 ------------------ .../itti_analyzer/libui/ui_main_screen.h | 30 ------------------ .../utils/itti_analyzer/libui/ui_menu_bar.c | 30 ------------------ .../utils/itti_analyzer/libui/ui_menu_bar.h | 30 ------------------ .../utils/itti_analyzer/libui/ui_notebook.c | 30 ------------------ .../utils/itti_analyzer/libui/ui_notebook.h | 30 ------------------ .../utils/itti_analyzer/libui/ui_notif_dlg.c | 30 ------------------ .../utils/itti_analyzer/libui/ui_notif_dlg.h | 30 ------------------ .../itti_analyzer/libui/ui_notifications.c | 30 ------------------ .../itti_analyzer/libui/ui_notifications.h | 30 ------------------ .../libui/ui_signal_dissect_view.c | 30 ------------------ .../libui/ui_signal_dissect_view.h | 30 ------------------ .../utils/itti_analyzer/libui/ui_tree_view.c | 30 ------------------ .../utils/itti_analyzer/libui/ui_tree_view.h | 30 ------------------ common/utils/msc/msc.c | 29 ----------------- common/utils/msc/msc.h | 29 ----------------- openair1/PHY/CODING/3gpplte.c | 28 ----------------- openair1/PHY/CODING/3gpplte_sse.c | 28 ----------------- openair1/PHY/CODING/3gpplte_turbo_decoder.c | 28 ----------------- .../CODING/3gpplte_turbo_decoder_avx2_16bit.c | 28 ----------------- .../PHY/CODING/3gpplte_turbo_decoder_sse.c | 28 ----------------- .../CODING/3gpplte_turbo_decoder_sse_16bit.c | 28 ----------------- .../CODING/3gpplte_turbo_decoder_sse_8bit.c | 28 ----------------- openair1/PHY/CODING/TESTBENCH/ltetest.c | 28 ----------------- openair1/PHY/CODING/TESTBENCH/pdcch_test.c | 28 ----------------- openair1/PHY/CODING/TESTBENCH/viterbi_test.c | 28 ----------------- openair1/PHY/CODING/ccoding_byte.c | 28 ----------------- openair1/PHY/CODING/ccoding_byte_lte.c | 28 ----------------- openair1/PHY/CODING/crc_byte.c | 28 ----------------- openair1/PHY/CODING/defs.h | 28 ----------------- openair1/PHY/CODING/extern.h | 28 ----------------- openair1/PHY/CODING/extern_3GPPinterleaver.h | 28 ----------------- openair1/PHY/CODING/lte_interleaver.h | 28 ----------------- openair1/PHY/CODING/lte_interleaver2.h | 28 ----------------- openair1/PHY/CODING/lte_interleaver_inline.h | 28 ----------------- openair1/PHY/CODING/lte_rate_matching.c | 28 ----------------- openair1/PHY/CODING/lte_segmentation.c | 28 ----------------- openair1/PHY/CODING/rate_matching.c | 28 ----------------- openair1/PHY/CODING/scrambler.h | 28 ----------------- openair1/PHY/CODING/vars.h | 28 ----------------- openair1/PHY/CODING/viterbi.c | 28 ----------------- openair1/PHY/CODING/viterbi_lte.c | 28 ----------------- openair1/PHY/INIT/defs.h | 28 ----------------- openair1/PHY/INIT/extern.h | 28 ----------------- openair1/PHY/INIT/init_top.c | 28 ----------------- openair1/PHY/INIT/lte_init.c | 28 ----------------- openair1/PHY/INIT/lte_parms.c | 28 ----------------- openair1/PHY/INIT/vars.h | 28 ----------------- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 28 ----------------- openair1/PHY/LTE_ESTIMATION/defs.h | 28 ----------------- openair1/PHY/LTE_ESTIMATION/extern.h | 28 ----------------- openair1/PHY/LTE_ESTIMATION/filt96_32.h | 28 ----------------- .../PHY/LTE_ESTIMATION/freq_equalization.c | 28 ----------------- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 28 ----------------- .../lte_dl_channel_estimation.c | 28 ----------------- .../lte_dl_channel_estimation_emos.c | 28 ----------------- .../lte_dl_mbsfn_channel_estimation.c | 28 ----------------- .../PHY/LTE_ESTIMATION/lte_eNB_measurements.c | 28 ----------------- .../PHY/LTE_ESTIMATION/lte_est_freq_offset.c | 28 ----------------- openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 28 ----------------- .../PHY/LTE_ESTIMATION/lte_sync_timefreq.c | 29 ----------------- .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 28 ----------------- .../lte_ul_channel_estimation.c | 28 ----------------- openair1/PHY/LTE_ESTIMATION/pss6144.h | 29 ----------------- openair1/PHY/LTE_ESTIMATION/vars.h | 28 ----------------- openair1/PHY/LTE_REFSIG/defs.h | 28 ----------------- openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c | 28 ----------------- openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c | 28 ----------------- openair1/PHY/LTE_REFSIG/lte_dl_uespec.c | 29 ----------------- openair1/PHY/LTE_REFSIG/lte_gold.c | 28 ----------------- openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c | 28 ----------------- openair1/PHY/LTE_REFSIG/lte_ul_ref.c | 28 ----------------- openair1/PHY/LTE_REFSIG/mod_table.h | 28 ----------------- openair1/PHY/LTE_TRANSPORT/dci.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/dci.h | 29 ----------------- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/defs.h | 29 ----------------- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 29 ----------------- .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 29 ----------------- .../PHY/LTE_TRANSPORT/dlsch_llr_computation.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h | 28 ----------------- openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h | 28 ----------------- openair1/PHY/LTE_TRANSPORT/drs_modulation.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/extern.h | 28 ----------------- openair1/PHY/LTE_TRANSPORT/group_hopping.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/initial_sync.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/lte_mcs.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h | 28 ----------------- openair1/PHY/LTE_TRANSPORT/pbch.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/pcfich.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/phich.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/pilots.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/pmch.c | 28 ----------------- openair1/PHY/LTE_TRANSPORT/power_control.c | 28 ----------------- openair1/PHY/LTE_TRANSPORT/prach.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/prach.h | 28 ----------------- openair1/PHY/LTE_TRANSPORT/print_stats.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/proto.h | 29 ----------------- openair1/PHY/LTE_TRANSPORT/pss.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/pucch.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/rar_tools.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/srs_modulation.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/sss.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/sss.h | 29 ----------------- openair1/PHY/LTE_TRANSPORT/uci.h | 28 ----------------- openair1/PHY/LTE_TRANSPORT/uci_tools.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 29 ----------------- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c | 29 ----------------- openair1/PHY/LTE_TRANSPORT/vars.h | 28 ----------------- openair1/PHY/MODULATION/defs.h | 28 ----------------- openair1/PHY/MODULATION/extern.h | 30 ------------------ openair1/PHY/MODULATION/kHz_7_5.h | 28 ----------------- openair1/PHY/MODULATION/ofdm_mod.c | 28 ----------------- openair1/PHY/MODULATION/prach625Hz.h | 28 ----------------- openair1/PHY/MODULATION/slot_fep.c | 28 ----------------- openair1/PHY/MODULATION/slot_fep_mbsfn.c | 28 ----------------- openair1/PHY/MODULATION/slot_fep_ul.c | 28 ----------------- openair1/PHY/MODULATION/ul_7_5_kHz.c | 28 ----------------- openair1/PHY/MODULATION/vars.h | 28 ----------------- openair1/PHY/TOOLS/8bit_rxdemux.c | 28 ----------------- openair1/PHY/TOOLS/8bit_txmux.c | 28 ----------------- openair1/PHY/TOOLS/angle.c | 28 ----------------- openair1/PHY/TOOLS/cadd_sv.c | 28 ----------------- openair1/PHY/TOOLS/cadd_vv.c | 28 ----------------- openair1/PHY/TOOLS/cdot_prod.c | 28 ----------------- openair1/PHY/TOOLS/cmult_sv.c | 28 ----------------- openair1/PHY/TOOLS/cmult_vv.c | 28 ----------------- openair1/PHY/TOOLS/costable.h | 28 ----------------- openair1/PHY/TOOLS/dB_routines.c | 28 ----------------- openair1/PHY/TOOLS/dB_routines.h | 28 ----------------- openair1/PHY/TOOLS/defs.h | 28 ----------------- openair1/PHY/TOOLS/extern.h | 28 ----------------- openair1/PHY/TOOLS/file_output.c | 28 ----------------- openair1/PHY/TOOLS/invSqrt.c | 28 ----------------- openair1/PHY/TOOLS/log2_approx.c | 28 ----------------- openair1/PHY/TOOLS/lte_dfts.c | 28 ----------------- openair1/PHY/TOOLS/lte_phy_scope.c | 28 ----------------- openair1/PHY/TOOLS/lte_phy_scope.h | 28 ----------------- openair1/PHY/TOOLS/lut.c | 28 ----------------- openair1/PHY/TOOLS/memory_routines.c | 28 ----------------- openair1/PHY/TOOLS/signal_energy.c | 28 ----------------- openair1/PHY/TOOLS/smbv.c | 29 ----------------- openair1/PHY/TOOLS/smbv.h | 29 ----------------- openair1/PHY/TOOLS/sqrt.c | 28 ----------------- openair1/PHY/TOOLS/time_meas.c | 28 ----------------- openair1/PHY/TOOLS/time_meas.h | 28 ----------------- openair1/PHY/TOOLS/twiddle12288.h | 28 ----------------- openair1/PHY/TOOLS/twiddle1536.h | 28 ----------------- openair1/PHY/TOOLS/twiddle24576.h | 28 ----------------- openair1/PHY/TOOLS/twiddle6144.h | 28 ----------------- openair1/PHY/TOOLS/vars.h | 28 ----------------- openair1/PHY/defs.h | 29 ----------------- openair1/PHY/extern.h | 28 ----------------- openair1/PHY/impl_defs_lte.h | 29 ----------------- openair1/PHY/impl_defs_top.h | 29 ----------------- openair1/PHY/sse_intrin.h | 29 ----------------- openair1/PHY/types.h | 28 ----------------- openair1/PHY/vars.h | 28 ----------------- openair1/SCHED/defs.h | 28 ----------------- openair1/SCHED/extern.h | 28 ----------------- openair1/SCHED/phy_mac_stub.c | 29 ----------------- openair1/SCHED/phy_procedures_emos.h | 28 ----------------- openair1/SCHED/phy_procedures_lte_common.c | 29 ----------------- openair1/SCHED/phy_procedures_lte_eNb.c | 29 ----------------- openair1/SCHED/phy_procedures_lte_ue.c | 29 ----------------- openair1/SCHED/pucch_pc.c | 29 ----------------- openair1/SCHED/pusch_pc.c | 29 ----------------- openair1/SCHED/rt_compat.h | 28 ----------------- openair1/SCHED/vars.h | 28 ----------------- .../ETH_TRANSPORT/bypass_session_layer.c | 28 ----------------- openair1/SIMULATION/ETH_TRANSPORT/defs.h | 28 ----------------- .../SIMULATION/ETH_TRANSPORT/emu_transport.c | 28 ----------------- openair1/SIMULATION/ETH_TRANSPORT/extern.h | 28 ----------------- .../SIMULATION/ETH_TRANSPORT/multicast_link.c | 28 ----------------- .../SIMULATION/ETH_TRANSPORT/multicast_link.h | 28 ----------------- .../SIMULATION/ETH_TRANSPORT/netlink_init.c | 28 ----------------- openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c | 28 ----------------- openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h | 28 ----------------- openair1/SIMULATION/ETH_TRANSPORT/proto.h | 28 ----------------- openair1/SIMULATION/ETH_TRANSPORT/socket.c | 28 ----------------- openair1/SIMULATION/ETH_TRANSPORT/socket.h | 28 ----------------- openair1/SIMULATION/ETH_TRANSPORT/vars.h | 28 ----------------- .../SIMULATION/LTE_PHY/LTE_Configuration.c | 28 ----------------- .../SIMULATION/LTE_PHY/LTE_Configuration.h | 28 ----------------- openair1/SIMULATION/LTE_PHY/dlsim.c | 29 ----------------- openair1/SIMULATION/LTE_PHY/framegen.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/gpib_send.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/gpib_send.h | 28 ----------------- openair1/SIMULATION/LTE_PHY/mbmssim.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/pbchsim.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/prachsim.c | 28 ----------------- .../SIMULATION/LTE_PHY/pucchsignalgegerator.h | 28 ----------------- .../SIMULATION/LTE_PHY/pucchsignalgenerator.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/pucchsim.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/scansim.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/signalanalyzer.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/signalanalyzer.h | 28 ----------------- openair1/SIMULATION/LTE_PHY/syncsim.c | 28 ----------------- openair1/SIMULATION/LTE_PHY/test.c | 28 ----------------- .../SIMULATION/LTE_PHY/ulsignalgenerator.c | 28 ----------------- .../SIMULATION/LTE_PHY/ulsignalgenerator.h | 28 ----------------- openair1/SIMULATION/LTE_PHY/ulsim.c | 29 ----------------- openair1/SIMULATION/LTE_PHY/ulsim2.c | 28 ----------------- openair1/SIMULATION/RF/adc.c | 28 ----------------- openair1/SIMULATION/RF/dac.c | 28 ----------------- openair1/SIMULATION/RF/defs.h | 28 ----------------- openair1/SIMULATION/RF/rf.c | 28 ----------------- openair1/SIMULATION/TOOLS/abstraction.c | 28 ----------------- openair1/SIMULATION/TOOLS/ch_desc_proto.c | 28 ----------------- openair1/SIMULATION/TOOLS/defs.h | 28 ----------------- openair1/SIMULATION/TOOLS/gauss.c | 28 ----------------- openair1/SIMULATION/TOOLS/llr_quantization.c | 28 ----------------- openair1/SIMULATION/TOOLS/multipath_channel.c | 28 ----------------- .../SIMULATION/TOOLS/multipath_tv_channel.c | 28 ----------------- openair1/SIMULATION/TOOLS/random_channel.c | 28 ----------------- openair1/SIMULATION/TOOLS/rangen_double.c | 28 ----------------- openair1/SIMULATION/TOOLS/scm_corrmat.h | 28 ----------------- openair1/SIMULATION/TOOLS/taus.c | 28 ----------------- openair2/COMMON/as_message.h | 30 ------------------ openair2/COMMON/commonDef.h | 28 ----------------- openair2/COMMON/gtpv1_u_messages_def.h | 29 ----------------- openair2/COMMON/gtpv1_u_messages_types.h | 29 ----------------- openair2/COMMON/intertask_interface_conf.h | 29 ----------------- openair2/COMMON/mac_messages_def.h | 29 ----------------- openair2/COMMON/mac_messages_types.h | 29 ----------------- openair2/COMMON/mac_primitives.h | 29 ----------------- openair2/COMMON/mac_rlc_primitives.h | 29 ----------------- openair2/COMMON/mac_rrc_primitives.h | 30 ------------------ openair2/COMMON/messages_def.h | 29 ----------------- openair2/COMMON/messages_types.h | 29 ----------------- openair2/COMMON/nas_messages_def.h | 29 ----------------- openair2/COMMON/nas_messages_types.h | 29 ----------------- openair2/COMMON/networkDef.h | 29 ----------------- openair2/COMMON/openair_defs.h | 29 ----------------- openair2/COMMON/openair_types.h | 29 ----------------- openair2/COMMON/pdcp_messages_def.h | 28 ----------------- openair2/COMMON/pdcp_messages_types.h | 29 ----------------- openair2/COMMON/phy_messages_def.h | 29 ----------------- openair2/COMMON/phy_messages_types.h | 29 ----------------- openair2/COMMON/platform_constants.h | 29 ----------------- openair2/COMMON/platform_types.h | 29 ----------------- openair2/COMMON/ral_messages_def.h | 29 ----------------- openair2/COMMON/ral_messages_types.h | 29 ----------------- openair2/COMMON/rlc_messages_def.h | 29 ----------------- openair2/COMMON/rlc_messages_types.h | 29 ----------------- openair2/COMMON/rrc_messages_def.h | 29 ----------------- openair2/COMMON/rrc_messages_types.h | 29 ----------------- openair2/COMMON/rrm_config_structs.h | 29 ----------------- openair2/COMMON/rrm_constants.h | 29 ----------------- openair2/COMMON/rtos_header.h | 29 ----------------- openair2/COMMON/s1ap_messages_def.h | 29 ----------------- openair2/COMMON/s1ap_messages_types.h | 29 ----------------- openair2/COMMON/sctp_messages_def.h | 29 ----------------- openair2/COMMON/sctp_messages_types.h | 29 ----------------- openair2/COMMON/tasks_def.h | 29 ----------------- openair2/COMMON/udp_messages_def.h | 29 ----------------- openair2/COMMON/udp_messages_types.h | 29 ----------------- openair2/COMMON/x2ap_messages_def.h | 29 ----------------- openair2/COMMON/x2ap_messages_types.h | 28 ----------------- openair2/DOCS/TEMPLATES/CODE/example_doxy.h | 30 ------------------ openair2/ENB_APP/enb_app.c | 29 ----------------- openair2/ENB_APP/enb_app.h | 29 ----------------- openair2/ENB_APP/enb_config.c | 29 ----------------- openair2/ENB_APP/enb_config.h | 29 ----------------- openair2/LAYER2/MAC/config.c | 28 ----------------- openair2/LAYER2/MAC/defs.h | 28 ----------------- openair2/LAYER2/MAC/eNB_scheduler.c | 28 ----------------- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 29 ----------------- openair2/LAYER2/MAC/eNB_scheduler_bch.c | 29 ----------------- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 29 ----------------- openair2/LAYER2/MAC/eNB_scheduler_mch.c | 29 ----------------- .../LAYER2/MAC/eNB_scheduler_primitives.c | 29 ----------------- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 29 ----------------- openair2/LAYER2/MAC/extern.h | 28 ----------------- openair2/LAYER2/MAC/l1_helpers.c | 28 ----------------- openair2/LAYER2/MAC/lte_transport_init.c | 29 ----------------- openair2/LAYER2/MAC/main.c | 28 ----------------- openair2/LAYER2/MAC/openair2_proc.c | 28 ----------------- openair2/LAYER2/MAC/pre_processor.c | 28 ----------------- openair2/LAYER2/MAC/proto.h | 28 ----------------- openair2/LAYER2/MAC/ra_procedures.c | 29 ----------------- openair2/LAYER2/MAC/rar_tools.c | 29 ----------------- openair2/LAYER2/MAC/ue_procedures.c | 29 ----------------- openair2/LAYER2/MAC/vars.h | 28 ----------------- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 29 ----------------- openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 29 ----------------- .../PDCP_v10.1.0/pdcp_control_primitive.c | 28 ----------------- .../pdcp_control_primitives_proto_extern.h | 28 ----------------- openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 29 ----------------- openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c | 29 ----------------- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.c | 29 ----------------- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.h | 29 ----------------- .../LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h | 28 ----------------- openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c | 28 ----------------- .../PDCP_v10.1.0/pdcp_sequence_manager.c | 29 ----------------- .../PDCP_v10.1.0/pdcp_sequence_manager.h | 29 ----------------- openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c | 29 ----------------- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c | 29 ----------------- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h | 29 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c | 28 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h | 28 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h | 28 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c | 28 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h | 28 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c | 28 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h | 28 ----------------- .../RLC/AM_v9.3.0/rlc_am_proto_extern.h | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h | 28 ----------------- .../RLC/AM_v9.3.0/rlc_am_segments_holes.c | 28 ----------------- .../RLC/AM_v9.3.0/rlc_am_segments_holes.h | 28 ----------------- .../RLC/AM_v9.3.0/rlc_am_status_report.c | 28 ----------------- .../RLC/AM_v9.3.0/rlc_am_status_report.h | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h | 28 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c | 28 ----------------- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h | 28 ----------------- .../AM_v9.3.0/rlc_am_timer_poll_retransmit.c | 28 ----------------- .../AM_v9.3.0/rlc_am_timer_poll_retransmit.h | 28 ----------------- .../RLC/AM_v9.3.0/rlc_am_timer_reordering.c | 28 ----------------- .../RLC/AM_v9.3.0/rlc_am_timer_reordering.h | 28 ----------------- .../AM_v9.3.0/rlc_am_timer_status_prohibit.c | 28 ----------------- .../AM_v9.3.0/rlc_am_timer_status_prohibit.h | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c | 28 ----------------- .../LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h | 28 ----------------- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c | 28 ----------------- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h | 28 ----------------- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h | 28 ----------------- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c | 28 ----------------- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h | 28 ----------------- .../LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h | 28 ----------------- .../LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h | 28 ----------------- .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 28 ----------------- .../RLC/UM_v9.3.0/rlc_um_control_primitives.h | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h | 28 ----------------- .../LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c | 28 ----------------- .../LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h | 28 ----------------- .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c | 28 ----------------- .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h | 28 ----------------- .../LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c | 28 ----------------- .../LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h | 28 ----------------- .../LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c | 28 ----------------- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h | 28 ----------------- .../RLC/UM_v9.3.0/rlc_um_very_simple_test.c | 28 ----------------- .../RLC/UM_v9.3.0/rlc_um_very_simple_test.h | 28 ----------------- openair2/LAYER2/RLC/rlc.c | 28 ----------------- openair2/LAYER2/RLC/rlc.h | 28 ----------------- openair2/LAYER2/RLC/rlc_def.h | 28 ----------------- openair2/LAYER2/RLC/rlc_def_lte.h | 28 ----------------- openair2/LAYER2/RLC/rlc_mac.c | 28 ----------------- openair2/LAYER2/RLC/rlc_mpls.c | 28 ----------------- openair2/LAYER2/RLC/rlc_primitives.h | 28 ----------------- openair2/LAYER2/RLC/rlc_rrc.c | 28 ----------------- openair2/LAYER2/layer2_top.c | 28 ----------------- openair2/LAYER2/openair2_proc.c | 28 ----------------- openair2/LAYER2/register.c | 28 ----------------- openair2/LAYER2/register.h | 28 ----------------- .../DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c | 9 ------ .../DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h | 9 ------ .../DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c | 30 ------------------ .../DRIVER/CELLULAR/NASMT/nasmt_classifier.c | 28 ----------------- .../NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c | 28 ----------------- .../DRIVER/CELLULAR/NASMT/nasmt_constant.h | 30 ------------------ .../NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c | 30 ------------------ .../DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c | 28 ----------------- .../DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h | 28 ----------------- .../NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c | 29 ----------------- .../NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h | 28 ----------------- .../NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h | 28 ----------------- .../NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c | 26 ---------------- .../DRIVER/CELLULAR/NASMT/nasmt_variables.h | 28 ----------------- .../DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c | 30 ------------------ .../DRIVER/CELLULAR/NASRG/nasrg_classifier.c | 28 ----------------- .../NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c | 28 ----------------- .../DRIVER/CELLULAR/NASRG/nasrg_constant.h | 31 ------------------- .../NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c | 30 ------------------ .../DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c | 28 ----------------- .../DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h | 28 ----------------- .../NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c | 29 ----------------- .../NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h | 28 ----------------- .../NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h | 28 ----------------- .../NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c | 9 ------ .../DRIVER/CELLULAR/NASRG/nasrg_variables.h | 28 ----------------- .../NAS/DRIVER/CELLULAR/NETLTEST/netltest.c | 9 ------ openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h | 9 ------ openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c | 9 ------ .../NAS/SIMU_CELLULAR/rrm_fifo_standalone.c | 10 ------ openair2/NAS/nas_ue_task.h | 30 ------------------ .../NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c | 29 ----------------- openair2/NETWORK_DRIVER/LITE/classifier.c | 29 ----------------- openair2/NETWORK_DRIVER/LITE/common.c | 29 ----------------- openair2/NETWORK_DRIVER/LITE/constant.h | 30 ------------------ openair2/NETWORK_DRIVER/LITE/device.c | 30 ------------------ openair2/NETWORK_DRIVER/LITE/ioctl.c | 29 ----------------- openair2/NETWORK_DRIVER/LITE/ioctl.h | 28 ----------------- openair2/NETWORK_DRIVER/LITE/local.h | 28 ----------------- openair2/NETWORK_DRIVER/LITE/netlink.c | 29 ----------------- openair2/NETWORK_DRIVER/LITE/proto_extern.h | 28 ----------------- openair2/NETWORK_DRIVER/LITE/sap.h | 29 ----------------- openair2/NETWORK_DRIVER/LITE/tool.c | 29 ----------------- .../NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c | 28 ----------------- openair2/NETWORK_DRIVER/MESH/classifier.c | 28 ----------------- openair2/NETWORK_DRIVER/MESH/common.c | 28 ----------------- openair2/NETWORK_DRIVER/MESH/constant.h | 31 ------------------- openair2/NETWORK_DRIVER/MESH/device.c | 29 ----------------- openair2/NETWORK_DRIVER/MESH/ioctl.c | 30 ------------------ openair2/NETWORK_DRIVER/MESH/ioctl.h | 10 ------ openair2/NETWORK_DRIVER/MESH/local.h | 28 ----------------- openair2/NETWORK_DRIVER/MESH/mesh.c | 29 ----------------- openair2/NETWORK_DRIVER/MESH/netlink.c | 29 ----------------- openair2/NETWORK_DRIVER/MESH/proto_extern.h | 28 ----------------- .../NETWORK_DRIVER/MESH/rrc_nas_primitives.h | 28 ----------------- openair2/NETWORK_DRIVER/MESH/sap.h | 28 ----------------- openair2/NETWORK_DRIVER/MESH/tool.c | 29 ----------------- openair2/NETWORK_DRIVER/UE_IP/common.c | 29 ----------------- openair2/NETWORK_DRIVER/UE_IP/constant.h | 30 ------------------ openair2/NETWORK_DRIVER/UE_IP/device.c | 29 ----------------- openair2/NETWORK_DRIVER/UE_IP/local.h | 29 +---------------- openair2/NETWORK_DRIVER/UE_IP/netlink.c | 28 ----------------- openair2/NETWORK_DRIVER/UE_IP/proto_extern.h | 29 ----------------- openair2/NETWORK_DRIVER/UE_IP/sap.h | 29 ----------------- openair2/PHY_INTERFACE/defs.h | 29 ----------------- openair2/PHY_INTERFACE/extern.h | 29 ----------------- openair2/PHY_INTERFACE/mac_phy_primitives.c | 29 ----------------- openair2/PHY_INTERFACE/mac_phy_primitives.h | 29 ----------------- openair2/PHY_INTERFACE/vars.h | 29 ----------------- .../L2_INTERFACE/openair_rrc_L2_interface.c | 29 ----------------- .../L2_INTERFACE/openair_rrc_L2_interface.h | 29 ----------------- openair2/RRC/LITE/L2_interface.c | 29 ----------------- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 29 ----------------- openair2/RRC/LITE/MESSAGES/asn1_msg.h | 29 ----------------- openair2/RRC/LITE/defs.h | 30 ------------------ openair2/RRC/LITE/extern.h | 30 ------------------ openair2/RRC/LITE/proto.h | 28 ----------------- openair2/RRC/LITE/rrc_2_rrm_msg.c | 29 ----------------- openair2/RRC/LITE/rrc_UE.c | 28 ----------------- openair2/RRC/LITE/rrc_UE_ral.c | 30 ------------------ openair2/RRC/LITE/rrc_UE_ral.h | 30 ------------------ openair2/RRC/LITE/rrc_common.c | 29 ----------------- openair2/RRC/LITE/rrc_config.c | 29 ----------------- openair2/RRC/LITE/rrc_eNB.c | 29 ----------------- openair2/RRC/LITE/rrc_eNB_GTPV1U.c | 28 ----------------- openair2/RRC/LITE/rrc_eNB_GTPV1U.h | 28 ----------------- openair2/RRC/LITE/rrc_eNB_S1AP.c | 28 ----------------- openair2/RRC/LITE/rrc_eNB_S1AP.h | 28 ----------------- openair2/RRC/LITE/rrc_eNB_UE_context.c | 29 ----------------- openair2/RRC/LITE/rrc_eNB_UE_context.h | 29 ----------------- openair2/RRC/LITE/rrc_eNB_ral.c | 29 ----------------- openair2/RRC/LITE/rrc_eNB_ral.h | 29 ----------------- openair2/RRC/LITE/rrc_rrm_interface.c | 28 ----------------- openair2/RRC/LITE/rrc_rrm_interface.h | 28 ----------------- openair2/RRC/LITE/rrc_types.h | 29 ----------------- openair2/RRC/LITE/rrm_2_rrc_msg.c | 28 ----------------- openair2/RRC/LITE/utils.c | 29 ----------------- openair2/RRC/LITE/vars.h | 29 ----------------- openair2/RRC/NAS/nas_config.c | 28 ----------------- openair2/RRC/NAS/nas_config.h | 28 ----------------- openair2/RRC/NAS/rb_config.c | 28 ----------------- openair2/RRC/NAS/rb_config.h | 29 ----------------- openair2/RRM_4_RRC_LITE/src/platform.h | 29 ----------------- .../RRM_4_RRC_LITE/src/platform_constants.h | 29 ----------------- .../RRM_4_RRC_LITE/src/platform_defines.h | 29 ----------------- .../src/radio_resources/Asn1Utils.cpp | 29 ----------------- .../src/radio_resources/Asn1Utils.h | 29 ----------------- .../src/radio_resources/Command.cpp | 29 ----------------- .../src/radio_resources/Command.h | 29 ----------------- .../src/radio_resources/DataRadioBearer.cpp | 29 ----------------- .../src/radio_resources/DataRadioBearer.h | 29 ----------------- .../src/radio_resources/ENodeB.cpp | 29 ----------------- .../src/radio_resources/ENodeB.h | 29 ----------------- .../src/radio_resources/Exceptions.h | 29 ----------------- .../src/radio_resources/LogicalChannel.cpp | 29 ----------------- .../src/radio_resources/LogicalChannel.h | 29 ----------------- .../src/radio_resources/Mobile.cpp | 29 ----------------- .../src/radio_resources/Mobile.h | 29 ----------------- .../src/radio_resources/RadioBearer.cpp | 29 ----------------- .../src/radio_resources/RadioBearer.h | 29 ----------------- .../src/radio_resources/RadioResources.cpp | 29 ----------------- .../src/radio_resources/RadioResources.h | 29 ----------------- .../radio_resources/SignallingRadioBearer.cpp | 29 ----------------- .../radio_resources/SignallingRadioBearer.h | 29 ----------------- .../src/radio_resources/Transaction.cpp | 29 ----------------- .../src/radio_resources/Transaction.h | 29 ----------------- .../src/radio_resources/Transactions.cpp | 29 ----------------- .../src/radio_resources/Transactions.h | 29 ----------------- openair2/RRM_4_RRC_LITE/src/rrm.cpp | 29 ----------------- openair2/UTIL/AT_COMMANDS/parser.c | 29 ----------------- openair2/UTIL/AT_COMMANDS/parser.h | 29 ----------------- openair2/UTIL/BIGPHYS/bigphys.c | 29 ----------------- openair2/UTIL/BIGPHYS/defs.h | 29 ----------------- openair2/UTIL/CLI/cli.c | 28 ----------------- openair2/UTIL/CLI/cli.h | 29 ----------------- openair2/UTIL/CLI/cli_cmd.c | 29 ----------------- openair2/UTIL/CLI/cli_if.h | 29 ----------------- openair2/UTIL/CLI/cli_server.c | 30 ------------------ openair2/UTIL/FIFO/pad_list.c | 29 ----------------- openair2/UTIL/FIFO/pad_list.h | 29 ----------------- openair2/UTIL/FIFO/types.h | 29 ----------------- openair2/UTIL/LISTS/list.c | 28 ----------------- openair2/UTIL/LOG/log.c | 29 ----------------- openair2/UTIL/LOG/log.h | 29 ----------------- openair2/UTIL/LOG/log_extern.h | 29 ----------------- openair2/UTIL/LOG/log_if.h | 29 ----------------- openair2/UTIL/LOG/vcd_signal_dumper.c | 29 ----------------- openair2/UTIL/LOG/vcd_signal_dumper.h | 29 ----------------- openair2/UTIL/MATH/crc_byte.c | 29 ----------------- openair2/UTIL/MATH/oml.c | 29 ----------------- openair2/UTIL/MATH/oml.h | 29 ----------------- openair2/UTIL/MATH/random.c | 29 ----------------- openair2/UTIL/MATH/random_proto_extern.h | 29 ----------------- openair2/UTIL/MATH/taus.c | 29 ----------------- openair2/UTIL/MEM/mem_block.c | 30 ------------------ openair2/UTIL/MEM/mem_block.h | 29 ----------------- openair2/UTIL/MEM/mem_mngt.c | 29 ----------------- openair2/UTIL/MEM/mem_mngt_proto_extern.h | 30 ------------------ openair2/UTIL/MEM/mem_pool.h | 29 ----------------- openair2/UTIL/OCG/OCG.c | 29 ----------------- openair2/UTIL/OCG/OCG.h | 29 ----------------- openair2/UTIL/OCG/OCG_call_emu.h | 29 ----------------- openair2/UTIL/OCG/OCG_config_mobi.c | 29 ----------------- openair2/UTIL/OCG/OCG_config_mobi.h | 29 ----------------- openair2/UTIL/OCG/OCG_create_dir.c | 29 ----------------- openair2/UTIL/OCG/OCG_create_dir.h | 29 ----------------- openair2/UTIL/OCG/OCG_detect_file.c | 29 ----------------- openair2/UTIL/OCG/OCG_detect_file.h | 29 ----------------- openair2/UTIL/OCG/OCG_extern.h | 29 ----------------- openair2/UTIL/OCG/OCG_generate_report.c | 29 ----------------- openair2/UTIL/OCG/OCG_generate_report.h | 29 ----------------- openair2/UTIL/OCG/OCG_get_opt.c | 29 ----------------- openair2/UTIL/OCG/OCG_get_opt.h | 29 ----------------- openair2/UTIL/OCG/OCG_if.h | 29 ----------------- openair2/UTIL/OCG/OCG_parse_XML.c | 29 ----------------- openair2/UTIL/OCG/OCG_parse_XML.h | 29 ----------------- openair2/UTIL/OCG/OCG_parse_filename.c | 29 ----------------- openair2/UTIL/OCG/OCG_parse_filename.h | 29 ----------------- openair2/UTIL/OCG/OCG_save_XML.c | 29 ----------------- openair2/UTIL/OCG/OCG_save_XML.h | 29 ----------------- openair2/UTIL/OCG/OCG_vars.h | 29 ----------------- openair2/UTIL/OMG/TraCIConstants.h | 29 ----------------- openair2/UTIL/OMG/client_traci_OMG.c | 29 ----------------- openair2/UTIL/OMG/client_traci_OMG.h | 29 ----------------- openair2/UTIL/OMG/common.c | 29 ----------------- openair2/UTIL/OMG/defs.h | 28 ----------------- openair2/UTIL/OMG/grid.c | 28 ----------------- openair2/UTIL/OMG/grid.h | 29 ----------------- openair2/UTIL/OMG/id_manager.c | 29 ----------------- openair2/UTIL/OMG/id_manager.h | 29 ----------------- openair2/UTIL/OMG/job.c | 28 ----------------- openair2/UTIL/OMG/mobility_parser.c | 29 ----------------- openair2/UTIL/OMG/mobility_parser.h | 29 ----------------- openair2/UTIL/OMG/omg.c | 29 ----------------- openair2/UTIL/OMG/omg.h | 28 ----------------- openair2/UTIL/OMG/omg_constants.h | 29 ----------------- openair2/UTIL/OMG/omg_hashtable.c | 29 ----------------- openair2/UTIL/OMG/omg_hashtable.h | 29 ----------------- openair2/UTIL/OMG/omg_vars.h | 29 ----------------- openair2/UTIL/OMG/rwalk.c | 29 ----------------- openair2/UTIL/OMG/rwalk.h | 29 ----------------- openair2/UTIL/OMG/rwp.c | 29 ----------------- openair2/UTIL/OMG/rwp.h | 29 ----------------- openair2/UTIL/OMG/socket_traci_OMG.c | 29 ----------------- openair2/UTIL/OMG/socket_traci_OMG.h | 29 ----------------- openair2/UTIL/OMG/static.c | 29 ----------------- openair2/UTIL/OMG/static.h | 29 ----------------- openair2/UTIL/OMG/steadystaterwp.c | 29 ----------------- openair2/UTIL/OMG/steadystaterwp.h | 29 ----------------- openair2/UTIL/OMG/storage_traci_OMG.c | 29 ----------------- openair2/UTIL/OMG/storage_traci_OMG.h | 29 ----------------- openair2/UTIL/OMG/sumo.c | 29 ----------------- openair2/UTIL/OMG/sumo.h | 29 ----------------- openair2/UTIL/OMG/trace.c | 28 ----------------- openair2/UTIL/OMG/trace.h | 29 ----------------- openair2/UTIL/OMG/trace_hashtable.c | 29 ----------------- openair2/UTIL/OMG/trace_hashtable.h | 29 ----------------- openair2/UTIL/OMV/communicationthread.cpp | 30 ------------------ openair2/UTIL/OMV/communicationthread.h | 30 ------------------ openair2/UTIL/OMV/mywindow.cpp | 30 ------------------ openair2/UTIL/OMV/mywindow.h | 30 ------------------ openair2/UTIL/OMV/omv.cpp | 30 ------------------ openair2/UTIL/OMV/openglwidget.cpp | 30 ------------------ openair2/UTIL/OMV/openglwidget.h | 30 ------------------ openair2/UTIL/OMV/structures.h | 30 ------------------ openair2/UTIL/OPT/mac_pcap.h | 30 ------------------ openair2/UTIL/OPT/opt.h | 29 ----------------- openair2/UTIL/OPT/socket_sender.c | 28 ----------------- openair2/UTIL/OPT/vars.h | 29 ----------------- openair2/UTIL/OSA/osa_defs.h | 29 ----------------- openair2/UTIL/OSA/osa_internal.h | 29 ----------------- openair2/UTIL/OSA/osa_key_deriver.c | 29 ----------------- openair2/UTIL/OSA/osa_snow3g.h | 30 ------------------ openair2/UTIL/OSA/osa_stream_eea.c | 29 ----------------- openair2/UTIL/OSA/osa_stream_eia.c | 29 ----------------- openair2/UTIL/OTG/main.c | 29 ----------------- openair2/UTIL/OTG/otg.c | 29 ----------------- openair2/UTIL/OTG/otg.h | 29 ----------------- openair2/UTIL/OTG/otg_config.h | 29 ----------------- openair2/UTIL/OTG/otg_defs.h | 29 ----------------- openair2/UTIL/OTG/otg_externs.h | 29 ----------------- openair2/UTIL/OTG/otg_form.c | 29 ----------------- openair2/UTIL/OTG/otg_form.h | 29 ----------------- openair2/UTIL/OTG/otg_kpi.c | 29 ----------------- openair2/UTIL/OTG/otg_kpi.h | 29 ----------------- openair2/UTIL/OTG/otg_models.c | 30 ------------------ openair2/UTIL/OTG/otg_models.h | 29 ----------------- openair2/UTIL/OTG/otg_rx.c | 29 ----------------- openair2/UTIL/OTG/otg_rx.h | 29 ----------------- openair2/UTIL/OTG/otg_rx_socket.c | 29 ----------------- openair2/UTIL/OTG/otg_rx_socket.h | 29 ----------------- openair2/UTIL/OTG/otg_tx.c | 29 ----------------- openair2/UTIL/OTG/otg_tx.h | 29 ----------------- openair2/UTIL/OTG/otg_tx_socket.c | 29 ----------------- openair2/UTIL/OTG/otg_tx_socket.h | 29 ----------------- openair2/UTIL/OTG/otg_vars.h | 29 ----------------- openair2/UTIL/OTG/traffic_config.h | 30 ------------------ openair2/UTIL/TIMER/umts_timer.c | 29 ----------------- openair2/UTIL/TIMER/umts_timer.h | 29 ----------------- openair2/UTIL/TIMER/umts_timer_proto_extern.h | 29 ----------------- openair2/UTIL/TIMER/umts_timer_struct.h | 30 ------------------ openair2/UTIL/TRACE/fifo_printf.c | 29 ----------------- openair2/UTIL/TRACE/fifo_printf.h | 29 ----------------- .../UTIL/TRACE/fifo_printf_proto_extern.h | 30 ------------------ openair2/UTIL/TRACE/print.h | 29 ----------------- openair2/X2AP/x2ap.c | 29 ----------------- openair2/X2AP/x2ap.h | 29 ----------------- openair2/X2AP/x2ap_common.c | 29 ----------------- openair2/X2AP/x2ap_common.h | 29 ----------------- openair3/COMMON/common_types.h | 31 ------------------- openair3/COMMON/gtpv1_u_messages_def.h | 29 ----------------- openair3/COMMON/gtpv1_u_messages_types.h | 29 ----------------- openair3/COMMON/intertask_interface_conf.h | 30 ------------------ openair3/COMMON/messages_def.h | 29 ----------------- openair3/COMMON/messages_types.h | 30 ------------------ openair3/COMMON/nas_messages_def.h | 29 ----------------- openair3/COMMON/nas_messages_types.h | 29 ----------------- openair3/COMMON/s1ap_messages_def.h | 29 ----------------- openair3/COMMON/s1ap_messages_types.h | 29 ----------------- openair3/COMMON/sctp_messages_def.h | 29 ----------------- openair3/COMMON/sctp_messages_types.h | 29 ----------------- openair3/COMMON/security_types.h | 29 ----------------- openair3/COMMON/tasks_def.h | 29 ----------------- openair3/COMMON/udp_messages_def.h | 29 ----------------- openair3/COMMON/udp_messages_types.h | 29 ----------------- openair3/GTPV1-U/gtpv1u.h | 28 ----------------- openair3/GTPV1-U/gtpv1u_eNB.c | 28 ----------------- openair3/GTPV1-U/gtpv1u_eNB_defs.h | 28 ----------------- openair3/GTPV1-U/gtpv1u_eNB_task.h | 28 ----------------- openair3/GTPV1-U/gtpv1u_sgw_defs.h | 28 ----------------- openair3/GTPV1-U/gtpv1u_task.c | 28 ----------------- openair3/GTPV1-U/gtpv1u_teid_pool.c | 28 ----------------- openair3/NAS/COMMON/API/NETWORK/as_message.c | 28 ----------------- openair3/NAS/COMMON/API/NETWORK/l2_message.h | 28 ----------------- openair3/NAS/COMMON/API/NETWORK/nas_message.c | 28 ----------------- openair3/NAS/COMMON/API/NETWORK/nas_message.h | 28 ----------------- openair3/NAS/COMMON/API/NETWORK/network_api.c | 28 ----------------- openair3/NAS/COMMON/API/NETWORK/network_api.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/AttachAccept.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/AttachAccept.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/AttachComplete.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/AttachComplete.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/AttachReject.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/AttachReject.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/AttachRequest.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/AttachRequest.h | 28 ----------------- .../COMMON/EMM/MSG/AuthenticationFailure.c | 28 ----------------- .../COMMON/EMM/MSG/AuthenticationFailure.h | 28 ----------------- .../NAS/COMMON/EMM/MSG/AuthenticationReject.c | 28 ----------------- .../NAS/COMMON/EMM/MSG/AuthenticationReject.h | 28 ----------------- .../COMMON/EMM/MSG/AuthenticationRequest.c | 28 ----------------- .../COMMON/EMM/MSG/AuthenticationRequest.h | 28 ----------------- .../COMMON/EMM/MSG/AuthenticationResponse.c | 28 ----------------- .../COMMON/EMM/MSG/AuthenticationResponse.h | 28 ----------------- .../COMMON/EMM/MSG/CsServiceNotification.c | 28 ----------------- .../COMMON/EMM/MSG/CsServiceNotification.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/DetachAccept.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/DetachAccept.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/DetachRequest.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/DetachRequest.h | 28 ----------------- .../NAS/COMMON/EMM/MSG/DownlinkNasTransport.c | 28 ----------------- .../NAS/COMMON/EMM/MSG/DownlinkNasTransport.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/EmmInformation.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/EmmInformation.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/EmmStatus.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/EmmStatus.h | 28 ----------------- .../COMMON/EMM/MSG/ExtendedServiceRequest.c | 28 ----------------- .../COMMON/EMM/MSG/ExtendedServiceRequest.h | 28 ----------------- .../COMMON/EMM/MSG/GutiReallocationCommand.c | 28 ----------------- .../COMMON/EMM/MSG/GutiReallocationCommand.h | 28 ----------------- .../COMMON/EMM/MSG/GutiReallocationComplete.c | 28 ----------------- .../COMMON/EMM/MSG/GutiReallocationComplete.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h | 28 ----------------- .../NAS/COMMON/EMM/MSG/IdentityResponse.c | 28 ----------------- .../NAS/COMMON/EMM/MSG/IdentityResponse.h | 28 ----------------- .../COMMON/EMM/MSG/NASSecurityModeCommand.h | 28 ----------------- .../COMMON/EMM/MSG/NASSecurityModeComplete.h | 28 ----------------- .../NAS/COMMON/EMM/MSG/SecurityModeCommand.c | 28 ----------------- .../NAS/COMMON/EMM/MSG/SecurityModeComplete.c | 28 ----------------- .../NAS/COMMON/EMM/MSG/SecurityModeReject.c | 28 ----------------- .../NAS/COMMON/EMM/MSG/SecurityModeReject.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/ServiceReject.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/ServiceReject.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h | 28 ----------------- .../COMMON/EMM/MSG/TrackingAreaUpdateAccept.c | 28 ----------------- .../COMMON/EMM/MSG/TrackingAreaUpdateAccept.h | 28 ----------------- .../EMM/MSG/TrackingAreaUpdateComplete.c | 28 ----------------- .../EMM/MSG/TrackingAreaUpdateComplete.h | 28 ----------------- .../COMMON/EMM/MSG/TrackingAreaUpdateReject.c | 28 ----------------- .../COMMON/EMM/MSG/TrackingAreaUpdateReject.h | 28 ----------------- .../EMM/MSG/TrackingAreaUpdateRequest.c | 28 ----------------- .../EMM/MSG/TrackingAreaUpdateRequest.h | 28 ----------------- .../NAS/COMMON/EMM/MSG/UplinkNasTransport.c | 28 ----------------- .../NAS/COMMON/EMM/MSG/UplinkNasTransport.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/emm_cause.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/emm_msg.c | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/emm_msg.h | 28 ----------------- openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h | 28 ----------------- .../ActivateDedicatedEpsBearerContextAccept.c | 28 ----------------- .../ActivateDedicatedEpsBearerContextAccept.h | 28 ----------------- .../ActivateDedicatedEpsBearerContextReject.c | 28 ----------------- .../ActivateDedicatedEpsBearerContextReject.h | 28 ----------------- ...ActivateDedicatedEpsBearerContextRequest.c | 28 ----------------- ...ActivateDedicatedEpsBearerContextRequest.h | 28 ----------------- .../ActivateDefaultEpsBearerContextAccept.c | 28 ----------------- .../ActivateDefaultEpsBearerContextAccept.h | 28 ----------------- .../ActivateDefaultEpsBearerContextReject.c | 28 ----------------- .../ActivateDefaultEpsBearerContextReject.h | 28 ----------------- .../ActivateDefaultEpsBearerContextRequest.c | 28 ----------------- .../ActivateDefaultEpsBearerContextRequest.h | 28 ----------------- .../ESM/MSG/BearerResourceAllocationReject.c | 28 ----------------- .../ESM/MSG/BearerResourceAllocationReject.h | 28 ----------------- .../ESM/MSG/BearerResourceAllocationRequest.c | 28 ----------------- .../ESM/MSG/BearerResourceAllocationRequest.h | 28 ----------------- .../MSG/BearerResourceModificationReject.c | 28 ----------------- .../MSG/BearerResourceModificationReject.h | 28 ----------------- .../MSG/BearerResourceModificationRequest.c | 28 ----------------- .../MSG/BearerResourceModificationRequest.h | 28 ----------------- .../MSG/DeactivateEpsBearerContextAccept.c | 28 ----------------- .../MSG/DeactivateEpsBearerContextAccept.h | 28 ----------------- .../MSG/DeactivateEpsBearerContextRequest.c | 28 ----------------- .../MSG/DeactivateEpsBearerContextRequest.h | 28 ----------------- .../COMMON/ESM/MSG/EsmInformationRequest.c | 28 ----------------- .../COMMON/ESM/MSG/EsmInformationRequest.h | 28 ----------------- .../COMMON/ESM/MSG/EsmInformationResponse.c | 28 ----------------- .../COMMON/ESM/MSG/EsmInformationResponse.h | 28 ----------------- openair3/NAS/COMMON/ESM/MSG/EsmStatus.c | 28 ----------------- openair3/NAS/COMMON/ESM/MSG/EsmStatus.h | 28 ----------------- .../ESM/MSG/ModifyEpsBearerContextAccept.c | 28 ----------------- .../ESM/MSG/ModifyEpsBearerContextAccept.h | 28 ----------------- .../ESM/MSG/ModifyEpsBearerContextReject.c | 28 ----------------- .../ESM/MSG/ModifyEpsBearerContextReject.h | 28 ----------------- .../ESM/MSG/ModifyEpsBearerContextRequest.c | 28 ----------------- .../ESM/MSG/ModifyEpsBearerContextRequest.h | 28 ----------------- .../COMMON/ESM/MSG/PdnConnectivityReject.c | 28 ----------------- .../COMMON/ESM/MSG/PdnConnectivityReject.h | 28 ----------------- .../COMMON/ESM/MSG/PdnConnectivityRequest.c | 28 ----------------- .../COMMON/ESM/MSG/PdnConnectivityRequest.h | 28 ----------------- .../NAS/COMMON/ESM/MSG/PdnDisconnectReject.c | 28 ----------------- .../NAS/COMMON/ESM/MSG/PdnDisconnectReject.h | 28 ----------------- .../NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c | 28 ----------------- .../NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h | 28 ----------------- openair3/NAS/COMMON/ESM/MSG/esm_cause.h | 28 ----------------- openair3/NAS/COMMON/ESM/MSG/esm_msg.c | 28 ----------------- openair3/NAS/COMMON/ESM/MSG/esm_msg.h | 28 ----------------- openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h | 28 ----------------- openair3/NAS/COMMON/IES/AccessPointName.c | 28 ----------------- openair3/NAS/COMMON/IES/AccessPointName.h | 28 ----------------- .../NAS/COMMON/IES/AdditionalUpdateResult.c | 28 ----------------- .../NAS/COMMON/IES/AdditionalUpdateResult.h | 28 ----------------- .../NAS/COMMON/IES/AdditionalUpdateType.c | 28 ----------------- .../NAS/COMMON/IES/AdditionalUpdateType.h | 28 ----------------- .../COMMON/IES/ApnAggregateMaximumBitRate.c | 28 ----------------- .../COMMON/IES/ApnAggregateMaximumBitRate.h | 28 ----------------- .../IES/AuthenticationFailureParameter.c | 28 ----------------- .../IES/AuthenticationFailureParameter.h | 28 ----------------- .../COMMON/IES/AuthenticationParameterAutn.c | 28 ----------------- .../COMMON/IES/AuthenticationParameterAutn.h | 28 ----------------- .../COMMON/IES/AuthenticationParameterRand.c | 28 ----------------- .../COMMON/IES/AuthenticationParameterRand.h | 28 ----------------- .../IES/AuthenticationResponseParameter.c | 28 ----------------- .../IES/AuthenticationResponseParameter.h | 28 ----------------- .../COMMON/IES/CipheringKeySequenceNumber.c | 28 ----------------- .../COMMON/IES/CipheringKeySequenceNumber.h | 28 ----------------- openair3/NAS/COMMON/IES/Cli.c | 28 ----------------- openair3/NAS/COMMON/IES/Cli.h | 28 ----------------- openair3/NAS/COMMON/IES/CsfbResponse.c | 28 ----------------- openair3/NAS/COMMON/IES/CsfbResponse.h | 28 ----------------- openair3/NAS/COMMON/IES/DaylightSavingTime.c | 28 ----------------- openair3/NAS/COMMON/IES/DaylightSavingTime.h | 28 ----------------- openair3/NAS/COMMON/IES/DetachType.c | 28 ----------------- openair3/NAS/COMMON/IES/DetachType.h | 28 ----------------- openair3/NAS/COMMON/IES/DrxParameter.c | 28 ----------------- openair3/NAS/COMMON/IES/DrxParameter.h | 28 ----------------- openair3/NAS/COMMON/IES/EmergencyNumberList.c | 28 ----------------- openair3/NAS/COMMON/IES/EmergencyNumberList.h | 28 ----------------- openair3/NAS/COMMON/IES/EmmCause.c | 28 ----------------- openair3/NAS/COMMON/IES/EmmCause.h | 28 ----------------- openair3/NAS/COMMON/IES/EpsAttachResult.c | 28 ----------------- openair3/NAS/COMMON/IES/EpsAttachResult.h | 28 ----------------- openair3/NAS/COMMON/IES/EpsAttachType.c | 28 ----------------- openair3/NAS/COMMON/IES/EpsAttachType.h | 28 ----------------- .../NAS/COMMON/IES/EpsBearerContextStatus.c | 28 ----------------- .../NAS/COMMON/IES/EpsBearerContextStatus.h | 28 ----------------- openair3/NAS/COMMON/IES/EpsBearerIdentity.c | 28 ----------------- openair3/NAS/COMMON/IES/EpsBearerIdentity.h | 28 ----------------- openair3/NAS/COMMON/IES/EpsMobileIdentity.c | 28 ----------------- openair3/NAS/COMMON/IES/EpsMobileIdentity.h | 28 ----------------- .../NAS/COMMON/IES/EpsNetworkFeatureSupport.c | 28 ----------------- .../NAS/COMMON/IES/EpsNetworkFeatureSupport.h | 28 ----------------- openair3/NAS/COMMON/IES/EpsQualityOfService.c | 28 ----------------- openair3/NAS/COMMON/IES/EpsQualityOfService.h | 28 ----------------- openair3/NAS/COMMON/IES/EpsUpdateResult.c | 28 ----------------- openair3/NAS/COMMON/IES/EpsUpdateResult.h | 28 ----------------- openair3/NAS/COMMON/IES/EpsUpdateType.c | 28 ----------------- openair3/NAS/COMMON/IES/EpsUpdateType.h | 28 ----------------- openair3/NAS/COMMON/IES/EsmCause.c | 28 ----------------- openair3/NAS/COMMON/IES/EsmCause.h | 28 ----------------- .../COMMON/IES/EsmInformationTransferFlag.c | 28 ----------------- .../COMMON/IES/EsmInformationTransferFlag.h | 28 ----------------- openair3/NAS/COMMON/IES/EsmMessageContainer.c | 28 ----------------- openair3/NAS/COMMON/IES/EsmMessageContainer.h | 28 ----------------- openair3/NAS/COMMON/IES/GprsTimer.c | 28 ----------------- openair3/NAS/COMMON/IES/GprsTimer.h | 28 ----------------- openair3/NAS/COMMON/IES/GutiType.c | 28 ----------------- openair3/NAS/COMMON/IES/GutiType.h | 28 ----------------- openair3/NAS/COMMON/IES/IdentityType2.c | 28 ----------------- openair3/NAS/COMMON/IES/IdentityType2.h | 28 ----------------- openair3/NAS/COMMON/IES/ImeisvRequest.c | 28 ----------------- openair3/NAS/COMMON/IES/ImeisvRequest.h | 28 ----------------- .../NAS/COMMON/IES/KsiAndSequenceNumber.c | 28 ----------------- .../NAS/COMMON/IES/KsiAndSequenceNumber.h | 28 ----------------- openair3/NAS/COMMON/IES/LcsClientIdentity.c | 28 ----------------- openair3/NAS/COMMON/IES/LcsClientIdentity.h | 28 ----------------- openair3/NAS/COMMON/IES/LcsIndicator.c | 28 ----------------- openair3/NAS/COMMON/IES/LcsIndicator.h | 28 ----------------- .../NAS/COMMON/IES/LinkedEpsBearerIdentity.c | 28 ----------------- .../NAS/COMMON/IES/LinkedEpsBearerIdentity.h | 28 ----------------- .../IES/LlcServiceAccessPointIdentifier.c | 28 ----------------- .../IES/LlcServiceAccessPointIdentifier.h | 28 ----------------- .../COMMON/IES/LocationAreaIdentification.c | 28 ----------------- .../COMMON/IES/LocationAreaIdentification.h | 28 ----------------- openair3/NAS/COMMON/IES/MessageType.c | 28 ----------------- openair3/NAS/COMMON/IES/MessageType.h | 28 ----------------- openair3/NAS/COMMON/IES/MobileIdentity.c | 28 ----------------- openair3/NAS/COMMON/IES/MobileIdentity.h | 28 ----------------- .../NAS/COMMON/IES/MobileStationClassmark2.c | 28 ----------------- .../NAS/COMMON/IES/MobileStationClassmark2.h | 28 ----------------- .../NAS/COMMON/IES/MobileStationClassmark3.c | 28 ----------------- .../NAS/COMMON/IES/MobileStationClassmark3.h | 28 ----------------- openair3/NAS/COMMON/IES/MsNetworkCapability.c | 28 ----------------- openair3/NAS/COMMON/IES/MsNetworkCapability.h | 28 ----------------- .../NAS/COMMON/IES/MsNetworkFeatureSupport.c | 28 ----------------- .../NAS/COMMON/IES/MsNetworkFeatureSupport.h | 28 ----------------- openair3/NAS/COMMON/IES/NasKeySetIdentifier.c | 28 ----------------- openair3/NAS/COMMON/IES/NasKeySetIdentifier.h | 28 ----------------- openair3/NAS/COMMON/IES/NasMessageContainer.c | 28 ----------------- openair3/NAS/COMMON/IES/NasMessageContainer.h | 28 ----------------- openair3/NAS/COMMON/IES/NasRequestType.c | 28 ----------------- openair3/NAS/COMMON/IES/NasRequestType.h | 28 ----------------- .../NAS/COMMON/IES/NasSecurityAlgorithms.c | 28 ----------------- .../NAS/COMMON/IES/NasSecurityAlgorithms.h | 28 ----------------- openair3/NAS/COMMON/IES/NetworkName.c | 28 ----------------- openair3/NAS/COMMON/IES/NetworkName.h | 28 ----------------- openair3/NAS/COMMON/IES/Nonce.c | 28 ----------------- openair3/NAS/COMMON/IES/Nonce.h | 28 ----------------- openair3/NAS/COMMON/IES/PTmsiSignature.c | 28 ----------------- openair3/NAS/COMMON/IES/PTmsiSignature.h | 28 ----------------- .../NAS/COMMON/IES/PacketFlowIdentifier.c | 28 ----------------- .../NAS/COMMON/IES/PacketFlowIdentifier.h | 28 ----------------- openair3/NAS/COMMON/IES/PagingIdentity.c | 28 ----------------- openair3/NAS/COMMON/IES/PagingIdentity.h | 28 ----------------- openair3/NAS/COMMON/IES/PdnAddress.c | 28 ----------------- openair3/NAS/COMMON/IES/PdnAddress.h | 28 ----------------- openair3/NAS/COMMON/IES/PdnType.c | 28 ----------------- openair3/NAS/COMMON/IES/PdnType.h | 28 ----------------- openair3/NAS/COMMON/IES/PlmnList.c | 28 ----------------- openair3/NAS/COMMON/IES/PlmnList.h | 28 ----------------- .../COMMON/IES/ProcedureTransactionIdentity.c | 28 ----------------- .../COMMON/IES/ProcedureTransactionIdentity.h | 28 ----------------- .../COMMON/IES/ProtocolConfigurationOptions.c | 28 ----------------- .../COMMON/IES/ProtocolConfigurationOptions.h | 28 ----------------- .../NAS/COMMON/IES/ProtocolDiscriminator.c | 28 ----------------- .../NAS/COMMON/IES/ProtocolDiscriminator.h | 28 ----------------- openair3/NAS/COMMON/IES/QualityOfService.c | 28 ----------------- openair3/NAS/COMMON/IES/QualityOfService.h | 28 ----------------- openair3/NAS/COMMON/IES/RadioPriority.c | 28 ----------------- openair3/NAS/COMMON/IES/RadioPriority.h | 28 ----------------- openair3/NAS/COMMON/IES/SecurityHeaderType.c | 28 ----------------- openair3/NAS/COMMON/IES/SecurityHeaderType.h | 28 ----------------- openair3/NAS/COMMON/IES/ServiceType.c | 28 ----------------- openair3/NAS/COMMON/IES/ServiceType.h | 28 ----------------- openair3/NAS/COMMON/IES/ShortMac.c | 28 ----------------- openair3/NAS/COMMON/IES/ShortMac.h | 28 ----------------- openair3/NAS/COMMON/IES/SsCode.c | 28 ----------------- openair3/NAS/COMMON/IES/SsCode.h | 28 ----------------- openair3/NAS/COMMON/IES/SupportedCodecList.c | 28 ----------------- openair3/NAS/COMMON/IES/SupportedCodecList.h | 28 ----------------- openair3/NAS/COMMON/IES/TimeZone.c | 28 ----------------- openair3/NAS/COMMON/IES/TimeZone.h | 28 ----------------- openair3/NAS/COMMON/IES/TimeZoneAndTime.c | 28 ----------------- openair3/NAS/COMMON/IES/TimeZoneAndTime.h | 28 ----------------- openair3/NAS/COMMON/IES/TmsiStatus.c | 28 ----------------- openair3/NAS/COMMON/IES/TmsiStatus.h | 28 ----------------- .../NAS/COMMON/IES/TrackingAreaIdentity.c | 28 ----------------- .../NAS/COMMON/IES/TrackingAreaIdentity.h | 28 ----------------- .../NAS/COMMON/IES/TrackingAreaIdentityList.c | 28 ----------------- .../NAS/COMMON/IES/TrackingAreaIdentityList.h | 28 ----------------- .../IES/TrafficFlowAggregateDescription.c | 28 ----------------- .../IES/TrafficFlowAggregateDescription.h | 28 ----------------- openair3/NAS/COMMON/IES/TrafficFlowTemplate.c | 28 ----------------- openair3/NAS/COMMON/IES/TrafficFlowTemplate.h | 28 ----------------- .../NAS/COMMON/IES/TransactionIdentifier.c | 28 ----------------- .../NAS/COMMON/IES/TransactionIdentifier.h | 28 ----------------- openair3/NAS/COMMON/IES/UeNetworkCapability.c | 28 ----------------- openair3/NAS/COMMON/IES/UeNetworkCapability.h | 28 ----------------- ...UeRadioCapabilityInformationUpdateNeeded.c | 28 ----------------- ...UeRadioCapabilityInformationUpdateNeeded.h | 28 ----------------- .../NAS/COMMON/IES/UeSecurityCapability.c | 28 ----------------- .../NAS/COMMON/IES/UeSecurityCapability.h | 28 ----------------- .../VoiceDomainPreferenceAndUeUsageSetting.c | 28 ----------------- .../VoiceDomainPreferenceAndUeUsageSetting.h | 28 ----------------- openair3/NAS/COMMON/UTIL/OctetString.c | 28 ----------------- openair3/NAS/COMMON/UTIL/OctetString.h | 28 ----------------- openair3/NAS/COMMON/UTIL/TLVDecoder.c | 28 ----------------- openair3/NAS/COMMON/UTIL/TLVDecoder.h | 28 ----------------- openair3/NAS/COMMON/UTIL/TLVEncoder.c | 28 ----------------- openair3/NAS/COMMON/UTIL/TLVEncoder.h | 28 ----------------- openair3/NAS/COMMON/UTIL/device.c | 28 ----------------- openair3/NAS/COMMON/UTIL/device.h | 28 ----------------- openair3/NAS/COMMON/UTIL/memory.c | 28 ----------------- openair3/NAS/COMMON/UTIL/memory.h | 28 ----------------- openair3/NAS/COMMON/UTIL/nas_log.c | 28 ----------------- openair3/NAS/COMMON/UTIL/nas_log.h | 28 ----------------- openair3/NAS/COMMON/UTIL/nas_timer.c | 28 ----------------- openair3/NAS/COMMON/UTIL/nas_timer.h | 28 ----------------- openair3/NAS/COMMON/UTIL/parser.c | 28 ----------------- openair3/NAS/COMMON/UTIL/parser.h | 28 ----------------- openair3/NAS/COMMON/UTIL/socket.c | 28 ----------------- openair3/NAS/COMMON/UTIL/socket.h | 28 ----------------- openair3/NAS/COMMON/UTIL/stty.c | 28 ----------------- openair3/NAS/COMMON/UTIL/tst/timer.c | 28 ----------------- openair3/NAS/COMMON/securityDef.h | 28 ----------------- openair3/NAS/COMMON/userDef.h | 28 ----------------- openair3/NAS/TOOLS/network.h | 28 ----------------- openair3/NAS/TOOLS/ue_data.c | 28 ----------------- openair3/NAS/TOOLS/usim_data.c | 28 ----------------- openair3/NAS/UE/API/USER/at_command.c | 28 ----------------- openair3/NAS/UE/API/USER/at_command.h | 28 ----------------- openair3/NAS/UE/API/USER/at_error.c | 28 ----------------- openair3/NAS/UE/API/USER/at_error.h | 28 ----------------- openair3/NAS/UE/API/USER/at_response.c | 28 ----------------- openair3/NAS/UE/API/USER/at_response.h | 28 ----------------- openair3/NAS/UE/API/USER/tst/at_parser.c | 28 ----------------- openair3/NAS/UE/API/USER/user_api.c | 28 ----------------- openair3/NAS/UE/API/USER/user_api.h | 28 ----------------- openair3/NAS/UE/API/USER/user_indication.c | 28 ----------------- openair3/NAS/UE/API/USER/user_indication.h | 28 ----------------- openair3/NAS/UE/API/USIM/aka_functions.h | 28 ----------------- openair3/NAS/UE/API/USIM/usim_api.c | 28 ----------------- openair3/NAS/UE/API/USIM/usim_api.h | 28 ----------------- openair3/NAS/UE/EMM/Attach.c | 28 ----------------- openair3/NAS/UE/EMM/Authentication.c | 28 ----------------- openair3/NAS/UE/EMM/Detach.c | 28 ----------------- openair3/NAS/UE/EMM/EmmStatusHdl.c | 28 ----------------- openair3/NAS/UE/EMM/Identification.c | 28 ----------------- openair3/NAS/UE/EMM/IdleMode.c | 28 ----------------- openair3/NAS/UE/EMM/IdleMode.h | 28 ----------------- openair3/NAS/UE/EMM/LowerLayer.c | 28 ----------------- openair3/NAS/UE/EMM/LowerLayer.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/EmmDeregistered.c | 28 ----------------- .../UE/EMM/SAP/EmmDeregisteredAttachNeeded.c | 28 ----------------- .../SAP/EmmDeregisteredAttemptingToAttach.c | 28 ----------------- .../NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c | 28 ----------------- .../EMM/SAP/EmmDeregisteredLimitedService.c | 28 ----------------- .../EMM/SAP/EmmDeregisteredNoCellAvailable.c | 28 ----------------- .../NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c | 28 ----------------- .../UE/EMM/SAP/EmmDeregisteredNormalService.c | 28 ----------------- .../UE/EMM/SAP/EmmDeregisteredPlmnSearch.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/EmmNull.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/EmmRegistered.c | 28 ----------------- .../EMM/SAP/EmmRegisteredAttemptingToUpdate.c | 28 ----------------- .../SAP/EmmRegisteredImsiDetachInitiated.c | 28 ----------------- .../NAS/UE/EMM/SAP/EmmRegisteredInitiated.c | 28 ----------------- .../UE/EMM/SAP/EmmRegisteredLimitedService.c | 28 ----------------- .../UE/EMM/SAP/EmmRegisteredNoCellAvailable.c | 28 ----------------- .../UE/EMM/SAP/EmmRegisteredNormalService.c | 28 ----------------- .../NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c | 28 ----------------- .../UE/EMM/SAP/EmmRegisteredUpdateNeeded.c | 28 ----------------- .../UE/EMM/SAP/EmmServiceRequestInitiated.c | 28 ----------------- .../SAP/EmmTrackingAreaUpdatingInitiated.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_as.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_as.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_asDef.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_esm.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_esm.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_esmDef.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_fsm.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_fsm.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_recv.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_recv.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_reg.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_reg.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_regDef.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_sap.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_sap.h | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_send.c | 28 ----------------- openair3/NAS/UE/EMM/SAP/emm_send.h | 28 ----------------- openair3/NAS/UE/EMM/SecurityModeControl.c | 28 ----------------- openair3/NAS/UE/EMM/ServiceRequestHdl.c | 28 ----------------- openair3/NAS/UE/EMM/TrackingAreaUpdate.c | 28 ----------------- openair3/NAS/UE/EMM/emmData.h | 28 ----------------- openair3/NAS/UE/EMM/emm_main.c | 28 ----------------- openair3/NAS/UE/EMM/emm_main.h | 28 ----------------- openair3/NAS/UE/EMM/emm_proc.h | 28 ----------------- .../ESM/DedicatedEpsBearerContextActivation.c | 28 ----------------- .../ESM/DefaultEpsBearerContextActivation.c | 28 ----------------- .../NAS/UE/ESM/EpsBearerContextDeactivation.c | 28 ----------------- openair3/NAS/UE/ESM/EsmStatusHdl.c | 28 ----------------- openair3/NAS/UE/ESM/PdnConnectivity.c | 28 ----------------- openair3/NAS/UE/ESM/PdnDisconnect.c | 28 ----------------- openair3/NAS/UE/ESM/SAP/esm_recv.c | 28 ----------------- openair3/NAS/UE/ESM/SAP/esm_recv.h | 28 ----------------- openair3/NAS/UE/ESM/SAP/esm_sap.c | 28 ----------------- openair3/NAS/UE/ESM/SAP/esm_sap.h | 28 ----------------- openair3/NAS/UE/ESM/SAP/esm_sapDef.h | 28 ----------------- openair3/NAS/UE/ESM/SAP/esm_send.c | 28 ----------------- openair3/NAS/UE/ESM/SAP/esm_send.h | 28 ----------------- openair3/NAS/UE/ESM/esmData.h | 28 ----------------- openair3/NAS/UE/ESM/esm_ebr.c | 28 ----------------- openair3/NAS/UE/ESM/esm_ebr.h | 28 ----------------- openair3/NAS/UE/ESM/esm_ebr_context.c | 28 ----------------- openair3/NAS/UE/ESM/esm_ebr_context.h | 28 ----------------- openair3/NAS/UE/ESM/esm_ip.c | 28 ----------------- openair3/NAS/UE/ESM/esm_main.c | 28 ----------------- openair3/NAS/UE/ESM/esm_main.h | 28 ----------------- openair3/NAS/UE/ESM/esm_proc.h | 28 ----------------- openair3/NAS/UE/ESM/esm_pt.c | 28 ----------------- openair3/NAS/UE/ESM/esm_pt.h | 28 ----------------- openair3/NAS/UE/UEprocess.c | 28 ----------------- openair3/NAS/UE/nas_itti_messaging.c | 28 ----------------- openair3/NAS/UE/nas_itti_messaging.h | 28 ----------------- openair3/NAS/UE/nas_network.c | 28 ----------------- openair3/NAS/UE/nas_network.h | 28 ----------------- openair3/NAS/UE/nas_parser.c | 28 ----------------- openair3/NAS/UE/nas_parser.h | 28 ----------------- openair3/NAS/UE/nas_proc.c | 28 ----------------- openair3/NAS/UE/nas_proc.h | 28 ----------------- openair3/NAS/UE/nas_ue_task.c | 28 ----------------- openair3/NAS/UE/nas_user.c | 28 ----------------- openair3/NAS/UE/nas_user.h | 28 ----------------- openair3/S1AP/s1ap_common.c | 29 ----------------- openair3/S1AP/s1ap_common.h | 29 ----------------- openair3/S1AP/s1ap_eNB.c | 28 ----------------- openair3/S1AP/s1ap_eNB.h | 29 ----------------- .../s1ap_eNB_context_management_procedures.c | 28 ----------------- .../s1ap_eNB_context_management_procedures.h | 29 ----------------- openair3/S1AP/s1ap_eNB_decoder.c | 29 ----------------- openair3/S1AP/s1ap_eNB_decoder.h | 29 ----------------- openair3/S1AP/s1ap_eNB_default_values.h | 28 ----------------- openair3/S1AP/s1ap_eNB_defs.h | 29 ----------------- openair3/S1AP/s1ap_eNB_encoder.c | 29 ----------------- openair3/S1AP/s1ap_eNB_encoder.h | 29 ----------------- openair3/S1AP/s1ap_eNB_handlers.c | 29 ----------------- openair3/S1AP/s1ap_eNB_handlers.h | 29 ----------------- openair3/S1AP/s1ap_eNB_itti_messaging.c | 28 ----------------- openair3/S1AP/s1ap_eNB_itti_messaging.h | 28 ----------------- .../S1AP/s1ap_eNB_management_procedures.c | 29 ----------------- .../S1AP/s1ap_eNB_management_procedures.h | 29 ----------------- openair3/S1AP/s1ap_eNB_nas_procedures.c | 28 ----------------- openair3/S1AP/s1ap_eNB_nas_procedures.h | 29 ----------------- openair3/S1AP/s1ap_eNB_nnsf.c | 29 ----------------- openair3/S1AP/s1ap_eNB_nnsf.h | 29 ----------------- openair3/S1AP/s1ap_eNB_overload.c | 29 ----------------- openair3/S1AP/s1ap_eNB_overload.h | 29 ----------------- openair3/S1AP/s1ap_eNB_trace.c | 29 ----------------- openair3/S1AP/s1ap_eNB_trace.h | 30 ------------------ openair3/S1AP/s1ap_eNB_ue_context.c | 29 ----------------- openair3/S1AP/s1ap_eNB_ue_context.h | 29 ----------------- openair3/SCTP/sctp_common.c | 29 ----------------- openair3/SCTP/sctp_common.h | 29 ----------------- openair3/SCTP/sctp_default_values.h | 28 ----------------- openair3/SCTP/sctp_eNB_defs.h | 28 ----------------- openair3/SCTP/sctp_eNB_itti_messaging.c | 28 ----------------- openair3/SCTP/sctp_eNB_itti_messaging.h | 28 ----------------- openair3/SCTP/sctp_eNB_task.c | 29 ----------------- openair3/SCTP/sctp_eNB_task.h | 29 ----------------- openair3/SCTP/sctp_primitives_client.c | 28 ----------------- openair3/SCTP/sctp_primitives_client.h | 29 ----------------- openair3/SECU/kdf.c | 28 ----------------- openair3/SECU/key_nas_deriver.c | 28 ----------------- openair3/SECU/key_nas_encryption.c | 28 ----------------- openair3/SECU/nas_stream_eea1.c | 28 ----------------- openair3/SECU/nas_stream_eea2.c | 28 ----------------- openair3/SECU/nas_stream_eia1.c | 28 ----------------- openair3/SECU/nas_stream_eia2.c | 28 ----------------- openair3/SECU/rijndael.h | 28 ----------------- openair3/SECU/secu_defs.h | 28 ----------------- openair3/SECU/snow3g.c | 28 ----------------- openair3/SECU/snow3g.h | 28 ----------------- openair3/TEST/EPC_TEST/generate_scenario.c | 29 ----------------- openair3/TEST/EPC_TEST/generate_scenario.h | 29 ----------------- openair3/TEST/EPC_TEST/play_scenario.c | 29 ----------------- openair3/TEST/EPC_TEST/play_scenario.h | 29 ----------------- openair3/TEST/EPC_TEST/play_scenario_decode.c | 29 ----------------- .../TEST/EPC_TEST/play_scenario_display.c | 29 ----------------- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 29 ----------------- openair3/TEST/EPC_TEST/play_scenario_parse.c | 29 ----------------- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 29 ----------------- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 29 ----------------- .../EPC_TEST/play_scenario_s1ap_eNB_defs.h | 29 ----------------- openair3/TEST/EPC_TEST/play_scenario_sctp.c | 29 ----------------- openair3/TEST/oaisim_mme_client_test.c | 28 ----------------- openair3/TEST/oaisim_mme_itti_test.c | 28 ----------------- openair3/TEST/oaisim_mme_list_benchmark.c | 28 ----------------- openair3/TEST/oaisim_mme_s1ap_test.c | 28 ----------------- openair3/TEST/oaisim_mme_sctp_test.c | 28 ----------------- openair3/TEST/oaisim_mme_test_s1c.c | 28 ----------------- openair3/TEST/oaisim_mme_test_s1c.h | 30 ------------------ openair3/TEST/oaisim_mme_test_s1c_s1ap.c | 28 ----------------- openair3/TEST/oaisim_mme_test_s1c_s1ap.h | 28 ----------------- openair3/TEST/oaisim_mme_test_s1c_scenario.c | 28 ----------------- openair3/TEST/oaisim_mme_test_s1c_scenario.h | 28 ----------------- openair3/TEST/oaisim_mme_test_s1c_scenario1.c | 28 ----------------- openair3/TEST/test_aes128_cmac_encrypt.c | 28 ----------------- openair3/TEST/test_aes128_ctr_decrypt.c | 28 ----------------- openair3/TEST/test_aes128_ctr_encrypt.c | 28 ----------------- openair3/TEST/test_kdf.c | 28 ----------------- openair3/TEST/test_s1ap.c | 28 ----------------- openair3/TEST/test_secu.c | 28 ----------------- openair3/TEST/test_secu_kenb.c | 28 ----------------- openair3/TEST/test_secu_knas.c | 28 ----------------- openair3/TEST/test_secu_knas_encrypt_eea1.c | 28 ----------------- openair3/TEST/test_secu_knas_encrypt_eea2.c | 28 ----------------- openair3/TEST/test_secu_knas_encrypt_eia1.c | 28 ----------------- openair3/TEST/test_secu_knas_encrypt_eia2.c | 28 ----------------- openair3/TEST/test_secu_knas_stream_int.c | 28 ----------------- openair3/UDP/udp_eNB_task.c | 28 ----------------- openair3/UDP/udp_eNB_task.h | 28 ----------------- openair3/UTILS/HASHTABLE/hashtable.c | 28 ----------------- openair3/UTILS/HASHTABLE/hashtable.h | 28 ----------------- openair3/UTILS/HASHTABLE/obj_hashtable.c | 28 ----------------- openair3/UTILS/HASHTABLE/obj_hashtable.h | 28 ----------------- openair3/UTILS/conversions.c | 28 ----------------- openair3/UTILS/conversions.h | 29 ----------------- openair3/UTILS/enum_string.c | 28 ----------------- openair3/UTILS/enum_string.h | 28 ----------------- openair3/UTILS/log.c | 28 ----------------- openair3/UTILS/log.h | 28 ----------------- openair3/UTILS/mcc_mnc_itu.c | 29 ----------------- openair3/UTILS/mcc_mnc_itu.h | 28 ----------------- openair3/UTILS/mme_config.c | 29 ----------------- openair3/UTILS/mme_config.h | 28 ----------------- openair3/UTILS/mme_default_values.h | 28 ----------------- .../ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c | 29 ----------------- .../ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h | 29 ----------------- targets/ARCH/COMMON/common_lib.c | 28 ----------------- targets/ARCH/COMMON/common_lib.h | 28 ----------------- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 28 ----------------- targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 28 ----------------- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 28 ----------------- .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 28 ----------------- targets/ARCH/EXMIMO/DEFS/openair_device.h | 29 ----------------- targets/ARCH/EXMIMO/DEFS/pcie_interface.h | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h | 29 ----------------- .../ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c | 29 ----------------- .../ARCH/EXMIMO/DRIVER/eurecom/module_main.c | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h | 29 ----------------- .../ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c | 29 ----------------- .../ARCH/EXMIMO/DRIVER/exmimo3/module_main.c | 29 ----------------- targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h | 29 ----------------- .../EXMIMO/DRIVER/telecomparistech/em1_dev.c | 29 ----------------- .../EXMIMO/DRIVER/telecomparistech/em1_drv.c | 29 ----------------- .../EXMIMO/DRIVER/telecomparistech/em1_drv.h | 29 ----------------- .../DRIVER/telecomparistech/em1_fifos.c | 29 ----------------- .../DRIVER/telecomparistech/em1_ioctl.c | 29 ----------------- .../EXMIMO/DRIVER/telecomparistech/em1_mmap.c | 29 ----------------- .../EXMIMO/DRIVER/telecomparistech/em1_rw.c | 29 ----------------- targets/ARCH/EXMIMO/USERSPACE/LIB/example.c | 29 ----------------- .../ARCH/EXMIMO/USERSPACE/LIB/gain_control.c | 29 ----------------- .../ARCH/EXMIMO/USERSPACE/LIB/gain_control.h | 29 ----------------- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 29 ----------------- .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h | 29 ----------------- .../ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h | 29 ----------------- .../EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h | 29 ----------------- .../EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c | 29 ----------------- .../EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h | 29 ----------------- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 30 ------------------ .../ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp | 29 ----------------- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 29 ----------------- targets/COMMON/create_tasks.c | 29 ----------------- targets/COMMON/create_tasks.h | 29 ----------------- targets/RT/USER/TOOLS/thread_ipc.c | 29 ----------------- targets/RT/USER/TOOLS/thread_ipc.h | 29 ----------------- targets/RT/USER/UE_transport_IQ.c | 28 ----------------- targets/RT/USER/condtest.c | 29 ----------------- targets/RT/USER/eNB_transport_IQ.c | 29 ----------------- targets/RT/USER/emos-raw.c | 29 ----------------- targets/RT/USER/lte-softmodem.c | 29 ----------------- targets/RT/USER/lte-ue.c | 29 ----------------- targets/RT/USER/msg_many.h | 29 ----------------- targets/RT/USER/rrh.c | 29 ----------------- targets/RT/USER/rrh_gw.c | 29 ----------------- targets/RT/USER/rrh_gw.h | 29 ----------------- targets/RT/USER/rrh_gw_externs.h | 28 ----------------- targets/RT/USER/rt_wrapper.c | 29 ----------------- targets/RT/USER/rt_wrapper.h | 29 ----------------- targets/RT/USER/sched_dlsch.c | 29 ----------------- targets/RT/USER/sched_rx_pdsch.c | 29 ----------------- targets/RT/USER/sched_ulsch.c | 29 ----------------- targets/RT/USER/sleeptest.c | 29 ----------------- targets/RT/USER/synctest.c | 29 ----------------- targets/SIMU/PROC/Process.c | 29 ----------------- targets/SIMU/PROC/Process.h | 29 ----------------- targets/SIMU/PROC/Tsync.h | 29 ----------------- targets/SIMU/PROC/channel_sim_proc.c | 29 ----------------- targets/SIMU/PROC/channel_sim_proc.h | 29 ----------------- targets/SIMU/PROC/interface.h | 29 ----------------- targets/SIMU/USER/channel_sim.c | 29 ----------------- targets/SIMU/USER/cor_SF_sim.c | 29 ----------------- targets/SIMU/USER/cor_SF_sim.h | 29 ----------------- targets/SIMU/USER/event_handler.c | 29 ----------------- targets/SIMU/USER/event_handler.h | 29 ----------------- targets/SIMU/USER/init_lte.c | 29 ----------------- targets/SIMU/USER/init_lte.h | 29 ----------------- targets/SIMU/USER/oaisim.c | 28 ----------------- targets/SIMU/USER/oaisim.h | 29 ----------------- targets/SIMU/USER/oaisim_config.c | 29 ----------------- targets/SIMU/USER/oaisim_config.h | 30 ------------------ targets/SIMU/USER/oaisim_functions.c | 28 ----------------- targets/SIMU/USER/oaisim_functions.h | 29 ----------------- targets/SIMU/USER/oaisim_pad.c | 29 ----------------- targets/SIMU/USER/sinr_sim.c | 29 ----------------- 1337 files changed, 1 insertion(+), 37946 deletions(-) mode change 100755 => 100644 common/utils/collection/hashtable/hashtable.c mode change 100755 => 100644 common/utils/collection/hashtable/hashtable.h mode change 100755 => 100644 common/utils/collection/hashtable/obj_hashtable.c mode change 100755 => 100644 common/utils/collection/hashtable/obj_hashtable.h mode change 100755 => 100644 openair1/PHY/CODING/3gpplte_sse.c mode change 100755 => 100644 openair1/PHY/CODING/ccoding_byte.c mode change 100755 => 100644 openair1/PHY/CODING/crc_byte.c mode change 100755 => 100644 openair1/PHY/CODING/extern_3GPPinterleaver.h mode change 100755 => 100644 openair1/PHY/CODING/scrambler.h mode change 100755 => 100644 openair1/PHY/CODING/viterbi.c mode change 100755 => 100644 openair1/PHY/INIT/init_top.c mode change 100755 => 100644 openair1/PHY/LTE_ESTIMATION/freq_equalization.c mode change 100755 => 100644 openair1/PHY/LTE_TRANSPORT/pbch.c mode change 100755 => 100644 openair1/PHY/MODULATION/ofdm_mod.c mode change 100755 => 100644 openair1/PHY/MODULATION/ul_7_5_kHz.c mode change 100755 => 100644 openair1/PHY/TOOLS/cmult_vv.c mode change 100755 => 100644 openair1/PHY/TOOLS/dB_routines.c mode change 100755 => 100644 openair1/PHY/TOOLS/file_output.c mode change 100755 => 100644 openair1/PHY/TOOLS/memory_routines.c mode change 100755 => 100644 openair1/PHY/TOOLS/signal_energy.c mode change 100755 => 100644 openair1/PHY/TOOLS/sqrt.c mode change 100755 => 100644 openair1/PHY/defs.h mode change 100755 => 100644 openair1/PHY/extern.h mode change 100755 => 100644 openair1/PHY/impl_defs_top.h mode change 100755 => 100644 openair1/PHY/types.h mode change 100755 => 100644 openair1/PHY/vars.h mode change 100755 => 100644 openair1/SCHED/phy_procedures_lte_common.c mode change 100755 => 100644 openair1/SCHED/phy_procedures_lte_eNb.c mode change 100755 => 100644 openair1/SCHED/phy_procedures_lte_ue.c mode change 100755 => 100644 openair1/SCHED/rt_compat.h mode change 100755 => 100644 openair1/SIMULATION/ETH_TRANSPORT/defs.h mode change 100755 => 100644 openair1/SIMULATION/ETH_TRANSPORT/extern.h mode change 100755 => 100644 openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c mode change 100755 => 100644 openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h mode change 100755 => 100644 openair1/SIMULATION/ETH_TRANSPORT/socket.c mode change 100755 => 100644 openair1/SIMULATION/ETH_TRANSPORT/socket.h mode change 100755 => 100644 openair1/SIMULATION/ETH_TRANSPORT/vars.h mode change 100755 => 100644 openair1/SIMULATION/RF/adc.c mode change 100755 => 100644 openair1/SIMULATION/RF/dac.c mode change 100755 => 100644 openair1/SIMULATION/TOOLS/ch_desc_proto.c mode change 100755 => 100644 openair2/COMMON/gtpv1_u_messages_def.h mode change 100755 => 100644 openair2/COMMON/gtpv1_u_messages_types.h mode change 100755 => 100644 openair2/COMMON/openair_defs.h mode change 100755 => 100644 openair2/COMMON/openair_types.h mode change 100755 => 100644 openair2/COMMON/platform_constants.h mode change 100755 => 100644 openair2/COMMON/platform_types.h mode change 100755 => 100644 openair2/COMMON/ral_messages_def.h mode change 100755 => 100644 openair2/COMMON/ral_messages_types.h mode change 100755 => 100644 openair2/COMMON/rlc_messages_def.h mode change 100755 => 100644 openair2/COMMON/rlc_messages_types.h mode change 100755 => 100644 openair2/COMMON/rrm_config_structs.h mode change 100755 => 100644 openair2/COMMON/rrm_constants.h mode change 100755 => 100644 openair2/COMMON/rtos_header.h mode change 100755 => 100644 openair2/COMMON/udp_messages_def.h mode change 100755 => 100644 openair2/COMMON/udp_messages_types.h mode change 100755 => 100644 openair2/ENB_APP/enb_config.c mode change 100755 => 100644 openair2/ENB_APP/enb_config.h mode change 100755 => 100644 openair2/LAYER2/MAC/lte_transport_init.c mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp.c mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp.h mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h mode change 100755 => 100644 openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c mode change 100755 => 100644 openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h mode change 100755 => 100644 openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c mode change 100755 => 100644 openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h mode change 100755 => 100644 openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h mode change 100755 => 100644 openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c mode change 100755 => 100644 openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h mode change 100755 => 100644 openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c mode change 100755 => 100644 openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h mode change 100755 => 100644 openair2/LAYER2/RLC/rlc.h mode change 100755 => 100644 openair2/LAYER2/RLC/rlc_def.h mode change 100755 => 100644 openair2/LAYER2/RLC/rlc_primitives.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h mode change 100755 => 100644 openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h mode change 100755 => 100644 openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c mode change 100755 => 100644 openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/classifier.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/common.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/constant.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/device.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/ioctl.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/ioctl.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/local.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/netlink.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/proto_extern.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/sap.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/LITE/tool.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/classifier.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/common.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/constant.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/device.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/ioctl.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/ioctl.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/local.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/mesh.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/proto_extern.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/sap.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/MESH/tool.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/UE_IP/common.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/UE_IP/constant.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/UE_IP/device.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/UE_IP/local.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/UE_IP/netlink.c mode change 100755 => 100644 openair2/NETWORK_DRIVER/UE_IP/proto_extern.h mode change 100755 => 100644 openair2/NETWORK_DRIVER/UE_IP/sap.h mode change 100755 => 100644 openair2/PHY_INTERFACE/defs.h mode change 100755 => 100644 openair2/RRC/LITE/rrc_UE_ral.c mode change 100755 => 100644 openair2/RRC/LITE/rrc_UE_ral.h mode change 100755 => 100644 openair2/RRC/LITE/rrc_eNB_GTPV1U.c mode change 100755 => 100644 openair2/RRC/LITE/rrc_eNB_GTPV1U.h mode change 100755 => 100644 openair2/RRC/LITE/rrc_eNB_ral.c mode change 100755 => 100644 openair2/RRC/LITE/rrc_eNB_ral.h mode change 100755 => 100644 openair2/RRC/NAS/nas_config.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/platform.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/platform_constants.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/platform_defines.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/rrm.cpp mode change 100755 => 100644 openair2/UTIL/AT_COMMANDS/parser.c mode change 100755 => 100644 openair2/UTIL/AT_COMMANDS/parser.h mode change 100755 => 100644 openair2/UTIL/BIGPHYS/bigphys.c mode change 100755 => 100644 openair2/UTIL/FIFO/pad_list.c mode change 100755 => 100644 openair2/UTIL/FIFO/pad_list.h mode change 100755 => 100644 openair2/UTIL/LISTS/list.c mode change 100755 => 100644 openair2/UTIL/LOG/log.c mode change 100755 => 100644 openair2/UTIL/LOG/log.h mode change 100755 => 100644 openair2/UTIL/MATH/taus.c mode change 100755 => 100644 openair2/UTIL/MEM/mem_block.h mode change 100755 => 100644 openair2/UTIL/MEM/mem_mngt.c mode change 100755 => 100644 openair2/UTIL/MEM/mem_mngt_proto_extern.h mode change 100755 => 100644 openair2/UTIL/MEM/mem_pool.h mode change 100755 => 100644 openair2/UTIL/OMV/communicationthread.cpp mode change 100755 => 100644 openair2/UTIL/OMV/communicationthread.h mode change 100755 => 100644 openair2/UTIL/OMV/mywindow.cpp mode change 100755 => 100644 openair2/UTIL/OMV/mywindow.h mode change 100755 => 100644 openair2/UTIL/OMV/omv.cpp mode change 100755 => 100644 openair2/UTIL/OMV/openglwidget.cpp mode change 100755 => 100644 openair2/UTIL/OMV/openglwidget.h mode change 100755 => 100644 openair2/UTIL/OMV/structures.h mode change 100755 => 100644 openair2/UTIL/TIMER/umts_timer.c mode change 100755 => 100644 openair2/UTIL/TIMER/umts_timer.h mode change 100755 => 100644 openair2/UTIL/TIMER/umts_timer_proto_extern.h mode change 100755 => 100644 openair2/UTIL/TIMER/umts_timer_struct.h mode change 100755 => 100644 openair2/UTIL/TRACE/fifo_printf.c mode change 100755 => 100644 openair2/UTIL/TRACE/fifo_printf.h mode change 100755 => 100644 openair2/UTIL/TRACE/fifo_printf_proto_extern.h mode change 100755 => 100644 openair2/UTIL/TRACE/print.h mode change 100755 => 100644 openair2/X2AP/x2ap_common.c mode change 100755 => 100644 openair2/X2AP/x2ap_common.h mode change 100755 => 100644 openair3/GTPV1-U/gtpv1u_eNB_task.h mode change 100755 => 100644 openair3/NAS/UE/EMM/Attach.c mode change 100755 => 100644 openair3/NAS/UE/EMM/Authentication.c mode change 100755 => 100644 openair3/NAS/UE/EMM/Detach.c mode change 100755 => 100644 openair3/NAS/UE/EMM/EmmStatusHdl.c mode change 100755 => 100644 openair3/NAS/UE/EMM/Identification.c mode change 100755 => 100644 openair3/NAS/UE/EMM/IdleMode.c mode change 100755 => 100644 openair3/NAS/UE/EMM/IdleMode.h mode change 100755 => 100644 openair3/NAS/UE/EMM/LowerLayer.c mode change 100755 => 100644 openair3/NAS/UE/EMM/LowerLayer.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregistered.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmNull.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegistered.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_as.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_as.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_asDef.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_esm.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_esm.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_esmDef.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_fsm.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_fsm.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_recv.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_recv.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_reg.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_reg.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_regDef.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_sap.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_sap.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_send.c mode change 100755 => 100644 openair3/NAS/UE/EMM/SAP/emm_send.h mode change 100755 => 100644 openair3/NAS/UE/EMM/SecurityModeControl.c mode change 100755 => 100644 openair3/NAS/UE/EMM/ServiceRequestHdl.c mode change 100755 => 100644 openair3/NAS/UE/EMM/TrackingAreaUpdate.c mode change 100755 => 100644 openair3/NAS/UE/EMM/emmData.h mode change 100755 => 100644 openair3/NAS/UE/EMM/emm_main.c mode change 100755 => 100644 openair3/NAS/UE/EMM/emm_main.h mode change 100755 => 100644 openair3/NAS/UE/EMM/emm_proc.h mode change 100755 => 100644 openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c mode change 100755 => 100644 openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c mode change 100755 => 100644 openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c mode change 100755 => 100644 openair3/NAS/UE/ESM/EsmStatusHdl.c mode change 100755 => 100644 openair3/NAS/UE/ESM/PdnConnectivity.c mode change 100755 => 100644 openair3/NAS/UE/ESM/PdnDisconnect.c mode change 100755 => 100644 openair3/NAS/UE/ESM/SAP/esm_recv.c mode change 100755 => 100644 openair3/NAS/UE/ESM/SAP/esm_recv.h mode change 100755 => 100644 openair3/NAS/UE/ESM/SAP/esm_sap.c mode change 100755 => 100644 openair3/NAS/UE/ESM/SAP/esm_sap.h mode change 100755 => 100644 openair3/NAS/UE/ESM/SAP/esm_sapDef.h mode change 100755 => 100644 openair3/NAS/UE/ESM/SAP/esm_send.c mode change 100755 => 100644 openair3/NAS/UE/ESM/SAP/esm_send.h mode change 100755 => 100644 openair3/NAS/UE/ESM/esmData.h mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_ebr.c mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_ebr.h mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_ebr_context.c mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_ebr_context.h mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_ip.c mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_main.c mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_main.h mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_proc.h mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_pt.c mode change 100755 => 100644 openair3/NAS/UE/ESM/esm_pt.h mode change 100755 => 100644 openair3/NAS/UE/nas_itti_messaging.c mode change 100755 => 100644 openair3/NAS/UE/nas_itti_messaging.h mode change 100755 => 100644 openair3/NAS/UE/nas_network.c mode change 100755 => 100644 openair3/NAS/UE/nas_network.h mode change 100755 => 100644 openair3/NAS/UE/nas_parser.c mode change 100755 => 100644 openair3/NAS/UE/nas_parser.h mode change 100755 => 100644 openair3/NAS/UE/nas_proc.c mode change 100755 => 100644 openair3/NAS/UE/nas_proc.h mode change 100755 => 100644 openair3/S1AP/s1ap_eNB_context_management_procedures.c mode change 100755 => 100644 openair3/S1AP/s1ap_eNB_context_management_procedures.h mode change 100755 => 100644 openair3/SECU/nas_stream_eea1.c mode change 100755 => 100644 openair3/SECU/nas_stream_eia1.c mode change 100755 => 100644 openair3/TEST/oaisim_mme_test_s1c_s1ap.c mode change 100755 => 100644 openair3/TEST/oaisim_mme_test_s1c_s1ap.h mode change 100755 => 100644 openair3/TEST/oaisim_mme_test_s1c_scenario.c mode change 100755 => 100644 openair3/TEST/test_secu_knas_encrypt_eea1.c mode change 100755 => 100644 openair3/TEST/test_secu_knas_encrypt_eia1.c mode change 100755 => 100644 openair3/UTILS/HASHTABLE/obj_hashtable.c mode change 100755 => 100644 openair3/UTILS/HASHTABLE/obj_hashtable.h mode change 100755 => 100644 openair3/UTILS/mcc_mnc_itu.c mode change 100755 => 100644 openair3/UTILS/mcc_mnc_itu.h mode change 100755 => 100644 targets/ARCH/EXMIMO/DEFS/openair_device.h mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c mode change 100755 => 100644 targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h diff --git a/common/utils/asn1_conversions.h b/common/utils/asn1_conversions.h index bb7b244989..9afa670cb4 100644 --- a/common/utils/asn1_conversions.h +++ b/common/utils/asn1_conversions.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef ASN1_CONVERSIONS_H_ #define ASN1_CONVERSIONS_H_ diff --git a/common/utils/assertions.h b/common/utils/assertions.h index 8bb74109ed..aa77fa0e59 100644 --- a/common/utils/assertions.h +++ b/common/utils/assertions.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef UTILS_ASSERTIONS_H_ #define UTILS_ASSERTIONS_H_ diff --git a/common/utils/collection/hashtable/hashtable.c b/common/utils/collection/hashtable/hashtable.c old mode 100755 new mode 100644 index 4ce0ee7a7e..9fc913c5fb --- a/common/utils/collection/hashtable/hashtable.c +++ b/common/utils/collection/hashtable/hashtable.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include #include #include diff --git a/common/utils/collection/hashtable/hashtable.h b/common/utils/collection/hashtable/hashtable.h old mode 100755 new mode 100644 index 5c06937bed..e9aa7c7d3d --- a/common/utils/collection/hashtable/hashtable.h +++ b/common/utils/collection/hashtable/hashtable.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef _UTILS_COLLECTION_HASH_TABLE_H_ #define _UTILS_COLLECTION_HASH_TABLE_H_ #include diff --git a/common/utils/collection/hashtable/obj_hashtable.c b/common/utils/collection/hashtable/obj_hashtable.c old mode 100755 new mode 100644 index 63fd8a688b..d6f1a3a431 --- a/common/utils/collection/hashtable/obj_hashtable.c +++ b/common/utils/collection/hashtable/obj_hashtable.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include #include #include diff --git a/common/utils/collection/hashtable/obj_hashtable.h b/common/utils/collection/hashtable/obj_hashtable.h old mode 100755 new mode 100644 index 8743a13f08..1450022b52 --- a/common/utils/collection/hashtable/obj_hashtable.h +++ b/common/utils/collection/hashtable/obj_hashtable.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef _UTILS_COLLECTION_OBJ_HASH_TABLE_H_ #define _UTILS_COLLECTION_OBJ_HASH_TABLE_H_ #include diff --git a/common/utils/itti/assertions.h b/common/utils/itti/assertions.h index c047ef6b76..7e90d63d15 100644 --- a/common/utils/itti/assertions.h +++ b/common/utils/itti/assertions.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include #include #include diff --git a/common/utils/itti/backtrace.c b/common/utils/itti/backtrace.c index 3d984cbf11..b44cd8fd8d 100644 --- a/common/utils/itti/backtrace.c +++ b/common/utils/itti/backtrace.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/common/utils/itti/backtrace.h b/common/utils/itti/backtrace.h index 1ba8143860..1db8e4d4f3 100644 --- a/common/utils/itti/backtrace.h +++ b/common/utils/itti/backtrace.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include #ifndef BACKTRACE_H_ diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c index 6789dadce6..9469f0fbfc 100644 --- a/common/utils/itti/intertask_interface.c +++ b/common/utils/itti/intertask_interface.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #define _GNU_SOURCE #include #include diff --git a/common/utils/itti/intertask_interface.h b/common/utils/itti/intertask_interface.h index 46fb0c749f..a235ae86e8 100644 --- a/common/utils/itti/intertask_interface.h +++ b/common/utils/itti/intertask_interface.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation * @ingroup _ref_implementation_ diff --git a/common/utils/itti/intertask_interface_dump.c b/common/utils/itti/intertask_interface_dump.c index 30d92e3a29..22082c9840 100644 --- a/common/utils/itti/intertask_interface_dump.c +++ b/common/utils/itti/intertask_interface_dump.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - /** @brief Intertask Interface Signal Dumper * Allows users to connect their itti_analyzer to this process and dump * signals exchanged between tasks. diff --git a/common/utils/itti/intertask_interface_dump.h b/common/utils/itti/intertask_interface_dump.h index acaf450cf4..d69424e89a 100644 --- a/common/utils/itti/intertask_interface_dump.h +++ b/common/utils/itti/intertask_interface_dump.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef INTERTASK_INTERFACE_DUMP_H_ #define INTERTASK_INTERFACE_DUMP_H_ diff --git a/common/utils/itti/intertask_interface_init.h b/common/utils/itti/intertask_interface_init.h index a01f1eea90..6f30111b1f 100644 --- a/common/utils/itti/intertask_interface_init.h +++ b/common/utils/itti/intertask_interface_init.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation * @ingroup _ref_implementation_ diff --git a/common/utils/itti/intertask_interface_types.h b/common/utils/itti/intertask_interface_types.h index bf29e12008..b7d9d47eaf 100644 --- a/common/utils/itti/intertask_interface_types.h +++ b/common/utils/itti/intertask_interface_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation * @ingroup _ref_implementation_ diff --git a/common/utils/itti/intertask_messages_def.h b/common/utils/itti/intertask_messages_def.h index 4f125f4649..0023afb27d 100644 --- a/common/utils/itti/intertask_messages_def.h +++ b/common/utils/itti/intertask_messages_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /* This message asks for task initialization */ MESSAGE_DEF(INITIALIZE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, initialize_message) diff --git a/common/utils/itti/intertask_messages_types.h b/common/utils/itti/intertask_messages_types.h index e64a709636..c75637c5d6 100644 --- a/common/utils/itti/intertask_messages_types.h +++ b/common/utils/itti/intertask_messages_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /* * intertask_messages_types.h * diff --git a/common/utils/itti/itti_types.h b/common/utils/itti/itti_types.h index f1a17d1228..c67ac2b85f 100644 --- a/common/utils/itti/itti_types.h +++ b/common/utils/itti/itti_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /** @brief Intertask Interface common types * Contains type definitions used for generating and parsing ITTI messages. * @author Laurent Winckel diff --git a/common/utils/itti/memory_pools.c b/common/utils/itti/memory_pools.c index a7d3448352..24edcc5761 100644 --- a/common/utils/itti/memory_pools.c +++ b/common/utils/itti/memory_pools.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifdef RTAI # include #endif diff --git a/common/utils/itti/memory_pools.h b/common/utils/itti/memory_pools.h index 72268f90d7..b95904c741 100644 --- a/common/utils/itti/memory_pools.h +++ b/common/utils/itti/memory_pools.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef MEMORY_POOLS_H_ #define MEMORY_POOLS_H_ diff --git a/common/utils/itti/messages_def.h b/common/utils/itti/messages_def.h index 7df3789fd7..384a404993 100644 --- a/common/utils/itti/messages_def.h +++ b/common/utils/itti/messages_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" #include "timer_messages_def.h" diff --git a/common/utils/itti/messages_types.h b/common/utils/itti/messages_types.h index 3426aada3e..e300eca53b 100644 --- a/common/utils/itti/messages_types.h +++ b/common/utils/itti/messages_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /* * messages_types.h * diff --git a/common/utils/itti/signals.c b/common/utils/itti/signals.c index b9a3316cec..d5732d296b 100644 --- a/common/utils/itti/signals.c +++ b/common/utils/itti/signals.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti/signals.h b/common/utils/itti/signals.h index 53a73afa6f..7a1f335e83 100644 --- a/common/utils/itti/signals.h +++ b/common/utils/itti/signals.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef SIGNALS_H_ #define SIGNALS_H_ diff --git a/common/utils/itti/tasks_def.h b/common/utils/itti/tasks_def.h index 5f2a413235..e762a77b9d 100644 --- a/common/utils/itti/tasks_def.h +++ b/common/utils/itti/tasks_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10) diff --git a/common/utils/itti/timer.c b/common/utils/itti/timer.c index 40e8791022..8c3d359294 100644 --- a/common/utils/itti/timer.c +++ b/common/utils/itti/timer.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include #include #include diff --git a/common/utils/itti/timer.h b/common/utils/itti/timer.h index 825b3ca2eb..336ef8da05 100644 --- a/common/utils/itti/timer.h +++ b/common/utils/itti/timer.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef TIMER_H_ #define TIMER_H_ diff --git a/common/utils/itti/timer_messages_def.h b/common/utils/itti/timer_messages_def.h index 56af4e8a8e..47955de591 100644 --- a/common/utils/itti/timer_messages_def.h +++ b/common/utils/itti/timer_messages_def.h @@ -1,30 +1 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - MESSAGE_DEF(TIMER_HAS_EXPIRED, MESSAGE_PRIORITY_MED_PLUS, timer_has_expired_t, timer_has_expired) diff --git a/common/utils/itti/timer_messages_types.h b/common/utils/itti/timer_messages_types.h index 8126b75aef..d245c12987 100644 --- a/common/utils/itti/timer_messages_types.h +++ b/common/utils/itti/timer_messages_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef TIMER_MESSAGES_TYPES_H_ #define TIMER_MESSAGES_TYPES_H_ diff --git a/common/utils/itti_analyzer/common/itti_types.h b/common/utils/itti_analyzer/common/itti_types.h index 3671b1d917..3abea6d0ae 100644 --- a/common/utils/itti_analyzer/common/itti_types.h +++ b/common/utils/itti_analyzer/common/itti_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /** @brief Intertask Interface common types * Contains type definitions used for generating and parsing ITTI messages. * @author Laurent Winckel diff --git a/common/utils/itti_analyzer/common/logs.h b/common/utils/itti_analyzer/common/logs.h index 21d2dfad78..166e54258f 100644 --- a/common/utils/itti_analyzer/common/logs.h +++ b/common/utils/itti_analyzer/common/logs.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /* * logs.h * diff --git a/common/utils/itti_analyzer/common/rc.h b/common/utils/itti_analyzer/common/rc.h index 11eb107632..ff72228fc7 100644 --- a/common/utils/itti_analyzer/common/rc.h +++ b/common/utils/itti_analyzer/common/rc.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include diff --git a/common/utils/itti_analyzer/itti_analyzer.c b/common/utils/itti_analyzer/itti_analyzer.c index 78bdb43b39..681d6af509 100644 --- a/common/utils/itti_analyzer/itti_analyzer.c +++ b/common/utils/itti_analyzer/itti_analyzer.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/buffers.c b/common/utils/itti_analyzer/libbuffers/buffers.c index e8a1fc0c20..d9f802f54b 100644 --- a/common/utils/itti_analyzer/libbuffers/buffers.c +++ b/common/utils/itti_analyzer/libbuffers/buffers.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/buffers.h b/common/utils/itti_analyzer/libbuffers/buffers.h index fd57e7b021..a98e8417ce 100644 --- a/common/utils/itti_analyzer/libbuffers/buffers.h +++ b/common/utils/itti_analyzer/libbuffers/buffers.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #ifndef BUFFERS_H_ diff --git a/common/utils/itti_analyzer/libbuffers/file.c b/common/utils/itti_analyzer/libbuffers/file.c index b9404c31c0..2b530521a4 100644 --- a/common/utils/itti_analyzer/libbuffers/file.c +++ b/common/utils/itti_analyzer/libbuffers/file.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/file.h b/common/utils/itti_analyzer/libbuffers/file.h index 8d2b90a5cf..8dc4b141cc 100644 --- a/common/utils/itti_analyzer/libbuffers/file.h +++ b/common/utils/itti_analyzer/libbuffers/file.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef FILE_H_ #define FILE_H_ diff --git a/common/utils/itti_analyzer/libbuffers/socket.c b/common/utils/itti_analyzer/libbuffers/socket.c index e782ee431b..24ef122946 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.c +++ b/common/utils/itti_analyzer/libbuffers/socket.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/socket.h b/common/utils/itti_analyzer/libbuffers/socket.h index 45881f311b..0e7c0ab1e5 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.h +++ b/common/utils/itti_analyzer/libbuffers/socket.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include diff --git a/common/utils/itti_analyzer/libparser/array_type.c b/common/utils/itti_analyzer/libparser/array_type.c index d88c7fa848..8235024fa7 100644 --- a/common/utils/itti_analyzer/libparser/array_type.c +++ b/common/utils/itti_analyzer/libparser/array_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/array_type.h b/common/utils/itti_analyzer/libparser/array_type.h index dd3eccf359..3d7273c1e2 100644 --- a/common/utils/itti_analyzer/libparser/array_type.h +++ b/common/utils/itti_analyzer/libparser/array_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef ARRAY_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/enum_type.c b/common/utils/itti_analyzer/libparser/enum_type.c index 78328b5492..35fef35b4f 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.c +++ b/common/utils/itti_analyzer/libparser/enum_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/enum_type.h b/common/utils/itti_analyzer/libparser/enum_type.h index ae19a5c495..3c3d918b1c 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.h +++ b/common/utils/itti_analyzer/libparser/enum_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef ENUM_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.c b/common/utils/itti_analyzer/libparser/enum_value_type.c index eae25817b6..89e0f86e90 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.c +++ b/common/utils/itti_analyzer/libparser/enum_value_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.h b/common/utils/itti_analyzer/libparser/enum_value_type.h index 71ce4f9849..8f6249733a 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.h +++ b/common/utils/itti_analyzer/libparser/enum_value_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef ENUM_VALUE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/field_type.c b/common/utils/itti_analyzer/libparser/field_type.c index 4ebb743150..bf62a06a24 100644 --- a/common/utils/itti_analyzer/libparser/field_type.c +++ b/common/utils/itti_analyzer/libparser/field_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/field_type.h b/common/utils/itti_analyzer/libparser/field_type.h index 0437f9e5ec..9e2b5d56ad 100644 --- a/common/utils/itti_analyzer/libparser/field_type.h +++ b/common/utils/itti_analyzer/libparser/field_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef FIELD_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/file_type.c b/common/utils/itti_analyzer/libparser/file_type.c index c032e6eb88..c63ab4946a 100644 --- a/common/utils/itti_analyzer/libparser/file_type.c +++ b/common/utils/itti_analyzer/libparser/file_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/file_type.h b/common/utils/itti_analyzer/libparser/file_type.h index d84f5af34f..5f9a864054 100644 --- a/common/utils/itti_analyzer/libparser/file_type.h +++ b/common/utils/itti_analyzer/libparser/file_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef FILE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.c b/common/utils/itti_analyzer/libparser/fundamental_type.c index 8559919730..66117c9ec5 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.c +++ b/common/utils/itti_analyzer/libparser/fundamental_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.h b/common/utils/itti_analyzer/libparser/fundamental_type.h index cb13bf2b79..3d0870321b 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.h +++ b/common/utils/itti_analyzer/libparser/fundamental_type.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include "types.h" #ifndef FUNDAMENTAL_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/intertask_contexts.h b/common/utils/itti_analyzer/libparser/intertask_contexts.h index 72d3fb2cc6..0968d8f6aa 100644 --- a/common/utils/itti_analyzer/libparser/intertask_contexts.h +++ b/common/utils/itti_analyzer/libparser/intertask_contexts.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "fundamental_type.h" #include "struct_type.h" diff --git a/common/utils/itti_analyzer/libparser/pointer_type.c b/common/utils/itti_analyzer/libparser/pointer_type.c index 921bafcac8..f35b96e29c 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.c +++ b/common/utils/itti_analyzer/libparser/pointer_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/pointer_type.h b/common/utils/itti_analyzer/libparser/pointer_type.h index 0c6b901f5b..6560f4f45d 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.h +++ b/common/utils/itti_analyzer/libparser/pointer_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef POINTER_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/reference_type.c b/common/utils/itti_analyzer/libparser/reference_type.c index ee49b10cd5..e6d080e656 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.c +++ b/common/utils/itti_analyzer/libparser/reference_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/reference_type.h b/common/utils/itti_analyzer/libparser/reference_type.h index 693bc712d8..fe0c84f9d8 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.h +++ b/common/utils/itti_analyzer/libparser/reference_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef REFERENCE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/struct_type.c b/common/utils/itti_analyzer/libparser/struct_type.c index af1201b4d2..0cc3510947 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.c +++ b/common/utils/itti_analyzer/libparser/struct_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/struct_type.h b/common/utils/itti_analyzer/libparser/struct_type.h index 7bbb9ee100..a3e1fcf12f 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.h +++ b/common/utils/itti_analyzer/libparser/struct_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef STRUCT_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/typedef_type.c b/common/utils/itti_analyzer/libparser/typedef_type.c index 285acfad5c..dc42dca9f3 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.c +++ b/common/utils/itti_analyzer/libparser/typedef_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/typedef_type.h b/common/utils/itti_analyzer/libparser/typedef_type.h index 0657f50c98..878176005f 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.h +++ b/common/utils/itti_analyzer/libparser/typedef_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef TYPEDEF_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/types.c b/common/utils/itti_analyzer/libparser/types.c index 7ae55bb737..3248115ba3 100644 --- a/common/utils/itti_analyzer/libparser/types.c +++ b/common/utils/itti_analyzer/libparser/types.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/types.h b/common/utils/itti_analyzer/libparser/types.h index 339029839d..2a8e55951a 100644 --- a/common/utils/itti_analyzer/libparser/types.h +++ b/common/utils/itti_analyzer/libparser/types.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include "buffers.h" diff --git a/common/utils/itti_analyzer/libparser/union_type.c b/common/utils/itti_analyzer/libparser/union_type.c index ef8fd393ac..13db1f1755 100644 --- a/common/utils/itti_analyzer/libparser/union_type.c +++ b/common/utils/itti_analyzer/libparser/union_type.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/union_type.h b/common/utils/itti_analyzer/libparser/union_type.h index c1817dea6e..2df5be43c0 100644 --- a/common/utils/itti_analyzer/libparser/union_type.h +++ b/common/utils/itti_analyzer/libparser/union_type.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "types.h" #ifndef UNION_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c index cdad8ee3ed..27b07afa66 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.c +++ b/common/utils/itti_analyzer/libparser/xml_parse.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include diff --git a/common/utils/itti_analyzer/libparser/xml_parse.h b/common/utils/itti_analyzer/libparser/xml_parse.h index 5d23a6157a..d699ed5eeb 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.h +++ b/common/utils/itti_analyzer/libparser/xml_parse.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include "rc.h" #include "types.h" diff --git a/common/utils/itti_analyzer/libresolver/locate_root.c b/common/utils/itti_analyzer/libresolver/locate_root.c index 8d1b101e73..61c0b45de5 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.c +++ b/common/utils/itti_analyzer/libresolver/locate_root.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include diff --git a/common/utils/itti_analyzer/libresolver/locate_root.h b/common/utils/itti_analyzer/libresolver/locate_root.h index 103e7b96ef..9582b10192 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.h +++ b/common/utils/itti_analyzer/libresolver/locate_root.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef LOCATE_ROOT_H_ #define LOCATE_ROOT_H_ diff --git a/common/utils/itti_analyzer/libresolver/resolvers.c b/common/utils/itti_analyzer/libresolver/resolvers.c index 685cd84d87..840d5ab2d0 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.c +++ b/common/utils/itti_analyzer/libresolver/resolvers.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libresolver/resolvers.h b/common/utils/itti_analyzer/libresolver/resolvers.h index 84d2e15ecf..c73dcedee2 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.h +++ b/common/utils/itti_analyzer/libresolver/resolvers.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef RESOLVERS_H_ #define RESOLVERS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c index 725a453334..3647c12166 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.c +++ b/common/utils/itti_analyzer/libui/ui_callbacks.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.h b/common/utils/itti_analyzer/libui/ui_callbacks.h index f408441548..5266ff013b 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.h +++ b/common/utils/itti_analyzer/libui/ui_callbacks.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef UI_CALLBACKS_H_ #define UI_CALLBACKS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_filters.c b/common/utils/itti_analyzer/libui/ui_filters.c index e2fb993933..cffd3e6b62 100644 --- a/common/utils/itti_analyzer/libui/ui_filters.c +++ b/common/utils/itti_analyzer/libui/ui_filters.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include diff --git a/common/utils/itti_analyzer/libui/ui_filters.h b/common/utils/itti_analyzer/libui/ui_filters.h index 9e168ad62f..43cfc55839 100644 --- a/common/utils/itti_analyzer/libui/ui_filters.h +++ b/common/utils/itti_analyzer/libui/ui_filters.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef UI_FILTERS_H_ #define UI_FILTERS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_interface.c b/common/utils/itti_analyzer/libui/ui_interface.c index 8f0f5a8415..806dce8b6c 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.c +++ b/common/utils/itti_analyzer/libui/ui_interface.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libui/ui_interface.h b/common/utils/itti_analyzer/libui/ui_interface.h index de120e6565..922bd89554 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.h +++ b/common/utils/itti_analyzer/libui/ui_interface.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #ifndef UI_INTERFACE_H_ diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c index e440bfb50e..b326233fc8 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.c +++ b/common/utils/itti_analyzer/libui/ui_main_screen.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.h b/common/utils/itti_analyzer/libui/ui_main_screen.h index 4455195a1d..634525ad5b 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.h +++ b/common/utils/itti_analyzer/libui/ui_main_screen.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef UI_MAIN_SCREEN_H_ #define UI_MAIN_SCREEN_H_ diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.c b/common/utils/itti_analyzer/libui/ui_menu_bar.c index a5c7c2810f..7aea1a1ae1 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.c +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #define G_LOG_DOMAIN ("UI") #include diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.h b/common/utils/itti_analyzer/libui/ui_menu_bar.h index 7644862c7a..f7f1c808b8 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.h +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef UI_MENU_BAR_H_ #define UI_MENU_BAR_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notebook.c b/common/utils/itti_analyzer/libui/ui_notebook.c index 07bf12fe7c..5beef83afc 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.c +++ b/common/utils/itti_analyzer/libui/ui_notebook.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_notebook.h b/common/utils/itti_analyzer/libui/ui_notebook.h index cf574608ca..aafc30e114 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.h +++ b/common/utils/itti_analyzer/libui/ui_notebook.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef UI_NOTEBOOK_H_ #define UI_NOTEBOOK_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notif_dlg.c b/common/utils/itti_analyzer/libui/ui_notif_dlg.c index 6d442a733c..8179eb0670 100644 --- a/common/utils/itti_analyzer/libui/ui_notif_dlg.c +++ b/common/utils/itti_analyzer/libui/ui_notif_dlg.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #define G_LOG_DOMAIN ("UI") #include "rc.h" diff --git a/common/utils/itti_analyzer/libui/ui_notif_dlg.h b/common/utils/itti_analyzer/libui/ui_notif_dlg.h index 871b7ddb0c..d17371c434 100644 --- a/common/utils/itti_analyzer/libui/ui_notif_dlg.h +++ b/common/utils/itti_analyzer/libui/ui_notif_dlg.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #ifndef UI_NOTIF_DLG_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c index 5a3b57656b..3039dd683c 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.c +++ b/common/utils/itti_analyzer/libui/ui_notifications.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include #include diff --git a/common/utils/itti_analyzer/libui/ui_notifications.h b/common/utils/itti_analyzer/libui/ui_notifications.h index 9ea36aa1f2..c941b2af24 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.h +++ b/common/utils/itti_analyzer/libui/ui_notifications.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef UI_NOTIFICATIONS_H_ #define UI_NOTIFICATIONS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c index 49e8df315d..e1a588b86b 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #define G_LOG_DOMAIN ("UI") diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h index 36d8d55de5..d4db1777dd 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef UI_SIGNAL_DISSECT_VIEW_H_ #define UI_SIGNAL_DISSECT_VIEW_H_ diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.c b/common/utils/itti_analyzer/libui/ui_tree_view.c index 94a612dac6..4c7c8e7147 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.c +++ b/common/utils/itti_analyzer/libui/ui_tree_view.c @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #include #include diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.h b/common/utils/itti_analyzer/libui/ui_tree_view.h index cee24eba38..6d555dd7e7 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.h +++ b/common/utils/itti_analyzer/libui/ui_tree_view.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef UI_TREE_VIEW_H_ #define UI_TREE_VIEW_H_ diff --git a/common/utils/msc/msc.c b/common/utils/msc/msc.c index c05c1bf7ce..a01b849018 100644 --- a/common/utils/msc/msc.c +++ b/common/utils/msc/msc.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /*! \file msc.c * \brief Message chart generator logging utility (generated files to processed by a script to produce a mscgen input file for generating a sequence diagram document) * \author Lionel GAUTHIER diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h index e73f826ac3..b3e3f4d9f7 100644 --- a/common/utils/msc/msc.h +++ b/common/utils/msc/msc.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef MSC_H_ #define MSC_H_ #include diff --git a/openair1/PHY/CODING/3gpplte.c b/openair1/PHY/CODING/3gpplte.c index c1a862ebb3..438d6eb10c 100644 --- a/openair1/PHY/CODING/3gpplte.c +++ b/openair1/PHY/CODING/3gpplte.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte.c purpose: Encoding routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c old mode 100755 new mode 100644 index 34fcbef6d6..e4bf811e52 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_sse.c purpose: Encoding routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 author: Laurent Thomas diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder.c b/openair1/PHY/CODING/3gpplte_turbo_decoder.c index 9fba2ba899..3c8e097f30 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder.c purpose: Fixed-point routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 Modified from TI C6x reference design. diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c index 24f399a2b2..85c229bf34 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder_sse_16bit.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c index 67df01c437..d1d03fe473 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder_sse.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c index ab7d19407e..5e4b1efd35 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder_sse_16bit.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index 0227a45a3d..a4548a04cd 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder_sse.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) diff --git a/openair1/PHY/CODING/TESTBENCH/ltetest.c b/openair1/PHY/CODING/TESTBENCH/ltetest.c index b7b9fb4aab..809b06bccc 100644 --- a/openair1/PHY/CODING/TESTBENCH/ltetest.c +++ b/openair1/PHY/CODING/TESTBENCH/ltetest.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c index 84ed605411..1d30cceba9 100644 --- a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c +++ b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/PHY/CODING/TESTBENCH/viterbi_test.c b/openair1/PHY/CODING/TESTBENCH/viterbi_test.c index efc07820f3..03e369fc63 100644 --- a/openair1/PHY/CODING/TESTBENCH/viterbi_test.c +++ b/openair1/PHY/CODING/TESTBENCH/viterbi_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/PHY/CODING/ccoding_byte.c b/openair1/PHY/CODING/ccoding_byte.c old mode 100755 new mode 100644 index cd626a8553..e02f2b16bb --- a/openair1/PHY/CODING/ccoding_byte.c +++ b/openair1/PHY/CODING/ccoding_byte.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: ccoding_byte.c purpose: Encoding routines for implementing 802.11 convolutionally-coded waveforms author: raymond.knopp@eurecom.fr, based on similar code for 3GPP convolutional code (UMTS) by P. Humblet (2000) diff --git a/openair1/PHY/CODING/ccoding_byte_lte.c b/openair1/PHY/CODING/ccoding_byte_lte.c index 12271fdceb..8718a98ecf 100644 --- a/openair1/PHY/CODING/ccoding_byte_lte.c +++ b/openair1/PHY/CODING/ccoding_byte_lte.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: ccoding_byte_lte.c purpose: Tail-biting convolutional code from 36-212, V8.6 2009-03. Includes CRC (8-UCI,16-DCI)and RNTI scrambling (DCI) author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c old mode 100755 new mode 100644 index e7ed05f411..9b0de0962e --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: crc_byte.c purpose: generate 3GPP LTE CRCs. Byte-oriented implementation of CRC's author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h index c0f6091dfd..42faee1ac5 100644 --- a/openair1/PHY/CODING/defs.h +++ b/openair1/PHY/CODING/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: PHY/CODING/defs.h purpose: Top-level definitions, data types and function prototypes for openairinterface coding blocks author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/extern.h b/openair1/PHY/CODING/extern.h index 0108dab386..469371adf2 100644 --- a/openair1/PHY/CODING/extern.h +++ b/openair1/PHY/CODING/extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ extern unsigned short f1f2mat_old[2*188]; diff --git a/openair1/PHY/CODING/extern_3GPPinterleaver.h b/openair1/PHY/CODING/extern_3GPPinterleaver.h old mode 100755 new mode 100644 index bc521a59a3..a346876769 --- a/openair1/PHY/CODING/extern_3GPPinterleaver.h +++ b/openair1/PHY/CODING/extern_3GPPinterleaver.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ typedef struct interleaver_codebook { unsigned long nb_bits; unsigned short f1; diff --git a/openair1/PHY/CODING/lte_interleaver.h b/openair1/PHY/CODING/lte_interleaver.h index 1199933a53..6aac7f80eb 100644 --- a/openair1/PHY/CODING/lte_interleaver.h +++ b/openair1/PHY/CODING/lte_interleaver.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __LTE_INTERLEAVER_H #define __LTE_INTERLEAVER_H #define INCL_INTERLEAVE diff --git a/openair1/PHY/CODING/lte_interleaver2.h b/openair1/PHY/CODING/lte_interleaver2.h index 67b696a15f..ffdf3ff608 100644 --- a/openair1/PHY/CODING/lte_interleaver2.h +++ b/openair1/PHY/CODING/lte_interleaver2.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned short f1f2mat_old[2*188] = {3, 10, 7, 12, 19, 42, diff --git a/openair1/PHY/CODING/lte_interleaver_inline.h b/openair1/PHY/CODING/lte_interleaver_inline.h index 5e71bd7081..4797d11d5b 100644 --- a/openair1/PHY/CODING/lte_interleaver_inline.h +++ b/openair1/PHY/CODING/lte_interleaver_inline.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ extern unsigned int threegpplte_interleaver_output; extern unsigned int threegpplte_interleaver_tmp; diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 2dbf92d751..5807a5a0b2 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: lte_rate_matching.c purpose: Procedures for rate matching/interleaving for LTE (turbo-coded transport channels) (TX/RX) author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/lte_segmentation.c b/openair1/PHY/CODING/lte_segmentation.c index a4409ee414..4c86248eda 100644 --- a/openair1/PHY/CODING/lte_segmentation.c +++ b/openair1/PHY/CODING/lte_segmentation.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: lte_segmentation.c purpose: Procedures for transport block segmentation for LTE (turbo-coded transport channels) author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/rate_matching.c b/openair1/PHY/CODING/rate_matching.c index c14f22e2ac..c17812ce7a 100644 --- a/openair1/PHY/CODING/rate_matching.c +++ b/openair1/PHY/CODING/rate_matching.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef DEBUG #include #include diff --git a/openair1/PHY/CODING/scrambler.h b/openair1/PHY/CODING/scrambler.h old mode 100755 new mode 100644 index 3718d8b456..cbc1d0be83 --- a/openair1/PHY/CODING/scrambler.h +++ b/openair1/PHY/CODING/scrambler.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned char scrambling_sequence[1024] = { 208, 127, diff --git a/openair1/PHY/CODING/vars.h b/openair1/PHY/CODING/vars.h index 98e63a43dc..f2b770141b 100644 --- a/openair1/PHY/CODING/vars.h +++ b/openair1/PHY/CODING/vars.h @@ -1,30 +1,2 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "lte_interleaver.h" #include "lte_interleaver2.h" diff --git a/openair1/PHY/CODING/viterbi.c b/openair1/PHY/CODING/viterbi.c old mode 100755 new mode 100644 index cacc9ab2ff..16e6bb479d --- a/openair1/PHY/CODING/viterbi.c +++ b/openair1/PHY/CODING/viterbi.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: viterbi.c purpose: SIMD Optimized 802.11/802.16 Viterbi Decoder author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/viterbi_lte.c b/openair1/PHY/CODING/viterbi_lte.c index f5a174e53e..3b9183504c 100644 --- a/openair1/PHY/CODING/viterbi_lte.c +++ b/openair1/PHY/CODING/viterbi_lte.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: viterbit_lte.c purpose: SIMD optimized LTE Viterbi Decoder for rate 1/3 Tail-biting convolutional code. Performs two iterations of code. First pass does Viterbi with all initial partial metrics set to zero. Second pass does Viterbi diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/defs.h index 5762d871f8..5d655159f0 100644 --- a/openair1/PHY/INIT/defs.h +++ b/openair1/PHY/INIT/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __INIT_DEFS__H__ #define __INIT_DEFS__H__ diff --git a/openair1/PHY/INIT/extern.h b/openair1/PHY/INIT/extern.h index 5c046434e6..e69de29bb2 100644 --- a/openair1/PHY/INIT/extern.h +++ b/openair1/PHY/INIT/extern.h @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ \ No newline at end of file diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c old mode 100755 new mode 100644 index e0de14bbb8..30a526e5c8 --- a/openair1/PHY/INIT/init_top.c +++ b/openair1/PHY/INIT/init_top.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*!\brief Initilization and reconfiguration routines for LTE PHY */ #ifndef USER_MODE #define __NO_VERSION__ diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index e78714db13..a40ca6e71c 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef EXMIMO #include "openair0_lib.h" #endif diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c index fc2602d697..9a44923ae9 100644 --- a/openair1/PHY/INIT/lte_parms.c +++ b/openair1/PHY/INIT/lte_parms.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" #include "log.h" diff --git a/openair1/PHY/INIT/vars.h b/openair1/PHY/INIT/vars.h index 5c046434e6..e69de29bb2 100644 --- a/openair1/PHY/INIT/vars.h +++ b/openair1/PHY/INIT/vars.h @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ \ No newline at end of file diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index af72bce967..fd2b49507d 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index c20d24e34f..c417995c48 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __LTE_ESTIMATION_DEFS__H__ #define __LTE_ESTIMATION_DEFS__H__ diff --git a/openair1/PHY/LTE_ESTIMATION/extern.h b/openair1/PHY/LTE_ESTIMATION/extern.h index 7f3cc6e31f..e69de29bb2 100644 --- a/openair1/PHY/LTE_ESTIMATION/extern.h +++ b/openair1/PHY/LTE_ESTIMATION/extern.h @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ diff --git a/openair1/PHY/LTE_ESTIMATION/filt96_32.h b/openair1/PHY/LTE_ESTIMATION/filt96_32.h index 61225974bc..02c41b6322 100644 --- a/openair1/PHY/LTE_ESTIMATION/filt96_32.h +++ b/openair1/PHY/LTE_ESTIMATION/filt96_32.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ short filt24_0[24] __attribute__((aligned(32))) ={ 2730,5461,8192,10922,13653,16384,13653,10922,8192,5461,2730,0,0,0,0,0,0,0,0,0,0,0,0,0 }; diff --git a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c old mode 100755 new mode 100644 index 8f1ffe0441..3f7e4f206d --- a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c +++ b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 059119c605..938edd2b9f 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index bfbe94bb61..d32bbf451b 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef USER_MODE #include #endif diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c index 63223e5ff5..677df26145 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef USER_MODE #include #endif diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c index 1dbafdb911..6aa100dd88 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef USER_MODE #include #endif diff --git a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c index 8b5c1a1806..d456278ef1 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c index 6f1279b5b8..679dcb7fe1 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: lte_est_freq_offset.c author (c): florian.kaltenberger@eurecom.fr diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index dfb39a510f..808e681439 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: lte_sync_time.c purpose: coarse timing synchronization for LTE (using PSS) author: florian.kaltenberger@eurecom.fr, oscar.tonelli@yahoo.it diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c index 74b46c5eb6..68a948a9c1 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_ESTIMATION/lte_sync_timefreq.c * \brief Initial time frequency scan of entire LTE band * \author R. Knopp diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 3bc26ad7e8..078770ed54 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ // this function fills the PHY_vars->PHY_measurement structure #include "PHY/defs.h" diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index 1de23f6412..6ed19c9086 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/LTE_ESTIMATION/pss6144.h b/openair1/PHY/LTE_ESTIMATION/pss6144.h index 4903c84d62..0c8329d95a 100644 --- a/openair1/PHY/LTE_ESTIMATION/pss6144.h +++ b/openair1/PHY/LTE_ESTIMATION/pss6144.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_ESTIMATION/lte_sync_timefreq.c * \brief Initial time frequency scan of entire LTE band * \author R. Knopp diff --git a/openair1/PHY/LTE_ESTIMATION/vars.h b/openair1/PHY/LTE_ESTIMATION/vars.h index 7f3cc6e31f..e69de29bb2 100644 --- a/openair1/PHY/LTE_ESTIMATION/vars.h +++ b/openair1/PHY/LTE_ESTIMATION/vars.h @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ diff --git a/openair1/PHY/LTE_REFSIG/defs.h b/openair1/PHY/LTE_REFSIG/defs.h index f8701a63a8..c6bb1a4078 100644 --- a/openair1/PHY/LTE_REFSIG/defs.h +++ b/openair1/PHY/LTE_REFSIG/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Definitions for LTE Reference signals */ /* Author R. Knopp / EURECOM / OpenAirInterface.org */ #ifndef __LTE_REFSIG_DEFS__H__ diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c index 9ffda3a83d..109f528db4 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef USER_MODE #include #include diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c index 9c3269b863..4a050c30ec 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ // 6.10.2.2 MBSFN reference signals Mapping to resource elements #ifdef USER_MODE diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c index 9b094393c7..40df5c56c3 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_REFSIG/lte_dl_uespec.c * \brief Top-level routines for generating UE-specific Reference signals from 36-211, V11.3.0 2013-06 * \author R. Knopp diff --git a/openair1/PHY/LTE_REFSIG/lte_gold.c b/openair1/PHY/LTE_REFSIG/lte_gold.c index bfd6716640..7d05faf806 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c index 0d14515776..8a4079f8cb 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ // 7.2 Pseudo-random sequence generation by a length-31 Gold sequence // for MBSFN reference signals diff --git a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c index 4020abe361..418735d794 100644 --- a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c +++ b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef MAIN #include #include diff --git a/openair1/PHY/LTE_REFSIG/mod_table.h b/openair1/PHY/LTE_REFSIG/mod_table.h index 5ae3efdea2..2dd86fb937 100644 --- a/openair1/PHY/LTE_REFSIG/mod_table.h +++ b/openair1/PHY/LTE_REFSIG/mod_table.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define MOD_TABLE_SIZE_SHORT 304 #define MOD_TABLE_QPSK_OFFSET 1 #define MOD_TABLE_16QAM_OFFSET 5 diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 523dfd4d03..0bfa23e625 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dci.c * \brief Implements PDCCH physical channel TX/RX procedures (36.211) and DCI encoding/decoding (36.212/36.213). Current LTE compliance V8.6 2009-03. * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h index e65352f5a0..62bdd5260a 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.h +++ b/openair1/PHY/LTE_TRANSPORT/dci.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dci.h * \brief typedefs for LTE DCI structures from 36-212, V8.6 2009-03. Limited to 5 MHz formats for the moment.Current LTE compliance V8.6 2009-03. * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 1bd7db46a0..3e62526cb3 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dci_tools.c * \brief PHY Support routines (eNB/UE) for filling PDSCH/PUSCH/DLSCH/ULSCH data structures based on DCI PDUs generated by eNB MAC scheduler. * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 6d34b8c9b9..74176f0155 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/defs.h * \brief data structures for PDSCH/DLSCH/PUSCH/ULSCH physical and transport channel descriptors (TX/RX) * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 366b93e71d..bc23109976 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dlsch_coding.c * \brief Top-level routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 2e8d70102f..c069295c91 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dlsch_decoding.c * \brief Top-level routines for decoding Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 19ce6b9edc..3bc2423bf7 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dlsch_demodulation.c * \brief Top-level routines for demodulating the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c index f9f6002970..e80a173b92 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dlsch_llr_computation.c * \brief Top-level routines for LLR computation of the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 0641d69de2..e8a465f683 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dlsch_modulation.c * \brief Top-level routines for generating the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c index dd971748cb..daf714959f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/dlsch_scrambling.c * \brief Routines for the scrambling procedure of the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h index 4a5520c371..fdb2c5b50a 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned int dlsch_tbs25[27][25] = {{16,32,56,88,120,152,176,208,224,256,288,328,344,376,392,424,456,488,504,536,568,600,616,648,680}, {24,56,88,144,176,208,224,256,328,344,376,424,456,488,520,568,600,632,680,712,744,776,808,872,904}, {32,72,144,176,208,256,296,328,376,424,472,520,568,616,648,696,744,776,840,872,936,968,1000,1064,1096}, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h index b2c32b8643..193df272da 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define TBStable_rowCnt 27 /** \brief "Transport block size table" diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c index 097bcdd691..ed13e96743 100644 --- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/drs_modulation.c * \brief Top-level routines for generating the Demodulation Reference Signals from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger, A. Bhamri diff --git a/openair1/PHY/LTE_TRANSPORT/extern.h b/openair1/PHY/LTE_TRANSPORT/extern.h index 1fc6f7cb28..fbd115ec08 100644 --- a/openair1/PHY/LTE_TRANSPORT/extern.h +++ b/openair1/PHY/LTE_TRANSPORT/extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ extern unsigned int dlsch_tbs25[27][25],TBStable[27][110],TBStable1C[32]; extern unsigned short lte_cqi_eff1024[16]; extern char lte_cqi_snr_dB[15]; diff --git a/openair1/PHY/LTE_TRANSPORT/group_hopping.c b/openair1/PHY/LTE_TRANSPORT/group_hopping.c index 64c0830386..2e47214312 100644 --- a/openair1/PHY/LTE_TRANSPORT/group_hopping.c +++ b/openair1/PHY/LTE_TRANSPORT/group_hopping.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/group_hopping.c * \brief Top-level routines for group/sequence hopping and nPRS sequence generationg for DRS and PUCCH from 36-211, V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 5a8463a861..82f475474e 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/initial_sync.c * \brief Routines for initial UE synchronization procedure (PSS,SSS,PBCH and frame format detection) * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c index 41d9ec72a6..ae63b18d97 100644 --- a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c +++ b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/lte_mcs.c * \brief Some support routines for MCS computations * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h b/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h index 36f965a5ff..03d04f1d14 100644 --- a/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define modOrder(I_MCS,I_TBS) ((I_MCS-I_TBS)*2+2) // Find modulation order from I_TBS and I_MCS /** \fn unsigned char I_TBS2I_MCS(unsigned char I_TBS); diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c old mode 100755 new mode 100644 index b7b7149c62..cf3b8fbb01 --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/pbch.c * \brief Top-level routines for generating and decoding the PBCH/BCH physical/transport channel V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c index 915ce17a45..fb1d83e76d 100644 --- a/openair1/PHY/LTE_TRANSPORT/pcfich.c +++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/pcfich.c * \brief Top-level routines for generating and decoding the PCFICH/CFI physical/transport channel V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index a7138bcd04..10ef72512b 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/phich.c * \brief Top-level routines for generating and decoding the PHICH/HI physical/transport channel V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/pilots.c b/openair1/PHY/LTE_TRANSPORT/pilots.c index 66e32fcb49..4393b16f73 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/pilots.c * \brief Top-level routines for generating DL cell-specific reference signals V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c index 168f3db17c..774b17fb77 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/pilots_mbsfn.c * \brief Top-level routines for generating DL mbsfn reference signals * \authors S. Paranche, R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index fbcec50333..6a1190e220 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c index 339a1faefd..621bc492a0 100644 --- a/openair1/PHY/LTE_TRANSPORT/power_control.c +++ b/openair1/PHY/LTE_TRANSPORT/power_control.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/impl_defs_lte.h" diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index b93519d393..0554228b64 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/prach.c * \brief Top-level routines for generating and decoding the PRACH physical channel V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/prach.h b/openair1/PHY/LTE_TRANSPORT/prach.h index 98e8db2508..1c9aba645f 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.h +++ b/openair1/PHY/LTE_TRANSPORT/prach.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ short __attribute__((aligned(16))) X_u839[4][2*839] = {{25792,20209,24697,21533,21208,24977,14453,29407,3673,32560,-10603,31004,-25018,21161,-32697,2145,-25717,-20307,-2330,-32685,24778,-21441,31178,10078,4403,32469,-28990,15273,-22038,-24250,20546,-25526,26673,19030,-20065,25905,-22930,-23408,28086,-16877,6820,32049,-31985,-7121,22218,-24084,6580,32099,-28459,-16242,31873,-7599,-20642,25448,4038,-32518,10834,30923,-21115,-25058,26955,18629,-29699,-13845,30607,11698,-30291,-12497,28519,16134,-24291,-21993,16188,28488,-3308,-32600,-13118,30026,27959,-17087,-32353,-5193,18679,26921,9552,-31344,-31534,8904,22308,24000,14122,-29568,-32314,-5435,490,32763,32605,-3247,-2819,-32646,-32758,-798,-7539,31887,28149,16771,26458,-19330,-4283,-32487,-29271,-14729,-30052,13061,-12213,30405,9669,31307,25331,20784,32111,6520,32182,-6160,29046,-15165,25563,-20499,23450,-22887,23450,-22887,25563,-20499,29046,-15165,32182,-6160,32111,6520,25331,20784,9669,31307,-12213,30405,-30052,13061,-29271,-14729,-4283,-32487,26458,-19330,28149,16771,-7539,31887,-32758,-798,-2819,-32646,32605,-3247,490,32763,-32314,-5435,14122,-29568,22308,24000,-31534,8904,9552,-31344,18679,26921,-32353,-5193,27959,-17087,-13118,30026,-3308,-32600,16188,28488,-24291,-21993,28519,16134,-30291,-12497,30607,11698,-29699,-13845,26955,18629,-21115,-25058,10834,30923,4038,-32518,-20642,25448,31873,-7599,-28459,-16242,6580,32099,22218,-24084,-31985,-7121,6820,32049,28086,-16877,-22930,-23408,-20065,25905,26673,19030,20546,-25526,-22038,-24250,-28990,15273,4403,32469,31178,10078,24778,-21441,-2330,-32685,-25717,-20307,-32697,2145,-25018,21161,-10603,31004,3673,32560,14453,29407,21208,24977,24697,21533,25792,20209,24858,21348,21579,24657,15110,29074,4646,32435,-9435,31379,-24042,22263,-32540,3855,-26887,-18731,-4526,-32454,23104,-23235,31902,7479,7299,31943,-27368,18019,-24455,-21810,17555,-27668,28757,15705,-16614,28243,-25868,-20114,25409,-20690,11526,30672,-32705,-2024,17967,-27402,11984,30496,-30904,-10893,29902,-13399,-15328,28960,-2574,-32666,17034,27991,-26018,-19919,30428,12155,-32088,-6641,32509,4099,-32428,-4708,31663,8431,-29160,-14947,23191,23148,-12099,-30452,-4161,32501,21855,-24414,-32445,4585,25942,20016,-614,-32762,-27095,18426,28874,15490,3551,-32575,-32251,5797,11756,30585,29379,-14509,-14344,-29461,-30780,11238,4889,32400,32409,4828,16929,-28055,-16719,-28181,-32719,-1779,-22129,24166,1471,32733,21946,24331,31786,7956,31756,-8076,26166,-19724,19180,-26567,13454,-29878,10253,-31122,10020,-31198,12779,-30173,18172,-27267,25096,-21068,31140,-10196,32333,5313,24207,22082,5131,32362,-18881,26780,-32641,2879,-20927,-25215,11870,-30542,32741,-1288,11296,30758,-27635,17607,-20737,-25371,24938,-21255,19279,26494,-29435,14398,-5979,-32218,32205,6038,-19871,26054,-11412,-30716,31253,9845,-28640,15920,11181,-30801,8727,31583,-23278,-23062,30694,11469,-32751,-1043,32135,-6401,-31024,10544,30651,-11585,-31326,9610,32461,-4465,-32525,-3978,29103,15056,-19577,-26277,2940,32634,17347,-27799,-31600,8668,27501,17813,-1840,-32716,-27232,18223,28023,16981,6700,-32075,-32747,1165,5857,32239,31929,-7360,-5737,-32261,-32755,920,-7061,31997,27765,17399,27568,-17711,-1105,-32749,-27026,-18529,-31846,7717,-18275,27197,1716,32721,18477,27060,28397,16348,32292,5555,32650,-2758,31815,-7838,31289,-9729,31631,-8550,32493,-4222,32593,3368,29750,13733,21394,24818,6098,32194,-13790,29724,-29953,13286,-30196,-12724,-8373,-31680,22398,-23917,31396,9375,2451,32675,-30863,11008,-16082,-28550,27300,-18122,17451,27732,-29647,13955,-7181,-31971,32617,3123,-15975,28609,-17140,-27928,32711,1900,-22666,23663,-123,-32767,20450,25601,-31064,-10429,32390,-4951,-28275,16560,22576,-23748,-17866,27468,15436,-28904,-15760,28728,18780,-26851,-23875,22443,29487,-14289,-32726,1655,29541,14177,-16508,-28306,-5375,32323,26745,-18931,-31567,-8787,10137,31159,22754,-23579,-30475,-12042,-2697,32655,32553,-3735,-6941,-32024,-32011,7000,3916,32532,32679,2390,11641,-30630,-23959,-22354,-30945,10776,-8016,31771,19674,26202,32477,4342,27700,-17504,13005,-30076,-3063,-32624,-15653,-28787,-23621,-22710,-27831,-17296,-29594,-14067,-29802,-13623,-28580,-16029,-25254,-20879,-18579,-26991,-7420,-31916,7896,-31802,23790,-22533,32629,-3002,25640,20402,1226,32744,-26092,19821,-30100,-12950,-369,-32765,30984,-10661,17243,27862,-25487,20593,-21302,-24899,26312,-19527,14892,29187,-32062,6760,5010,-32382,26815,18830,-30149,12836,8134,-31742,17658,27601,-31501,-9023,30821,-11124,-21021,25135,8609,-31616,2206,32692,-9787,-31272,14011,29620,-15220,-29019,13566,29826,-8846,-31551,736,32758,10486,-31044,-22843,23492,31695,-8313,-30384,-12270,14232,29514,12326,-30361,-31726,8193,23364,22973,10718,-30965,-32765,429,8490,31647,30001,-13175,-14783,-29243,-29853,13510,9199,31449,32731,-1534,9317,-31415,-24617,-21626,-31103,10312,-9904,31234,16824,28117,31466,9140,30563,-11814,19772,-26130,6219,-32172,-5496,-32303,-13678,-29776,-18377,-27130,-20162,-25830,-19379,-26423,-15868,-28669,-9082,-31484,1349,-32740,14563,-29353,27163,-18326,32760,674,24372,21901,981,32752,-25176,20973,-31216,-9963,-5254,-32344,28212,-16667,23705,22621,-18071,27333,-28699,-15814,16294,-28429,26385,19428,-24536,21717,-13231,-29978,32765,-307,-15545,28845,-15002,-29132,31957,7240,-27896,17191,10950,-30884,7777,31830,-21672,-24577,29325,14618,-32272,-5677,32762,-553,-32568,3612,32580,-3491,-32767,184,32159,6279,-28933,-15382,20831,25292,-6461,-32124,-12441,30313,28816,-15599,-31432,-9259,12892,30123,17762,-27536,-32671,-2513,10370,31082,26602,-19131,-24125,-22174,-19478,26349,26530,19230,21487,-24739,-20355,-25679,-30337,12383,245,32766,29215,14837,28336,-16455,4768,-32419,-19968,-25981,-32037,-6881,-30244,12610,-20259,25754,-8254,31710,1961,32708,8963,31517,12666,30219,13342,29927,11065,30841,5616,32282,-3186,32611,-14674,29297,-26240,19625,-32661,2635,-27435,-17917,-7659,-31860,18980,-26710,32766,-62,16401,28366,-19081,26638,-31362,-9494,2084,-32701,32688,-2269,3429,32587,-32737,1410,3794,-32547,30518,11927,-21764,24495,-12554,-30267,32372,5071,-23536,22798,-859,-32756,22487,23832,-32229,-5919,30736,-11355,-23018,23321,13900,-29673,-6340,32147,1594,-32729,0,32767,1594,-32729,-6340,32147,13900,-29673,-23018,23321,30736,-11355,-32229,-5919,22487,23832,-859,-32756,-23536,22798,32372,5071,-12554,-30267,-21764,24495,30518,11927,3794,-32547,-32737,1410,3429,32587,32688,-2269,2084,-32701,-31362,-9494,-19081,26638,16401,28366,32766,-62,18980,-26710,-7659,-31860,-27435,-17917,-32661,2635,-26240,19625,-14674,29297,-3186,32611,5616,32282,11065,30841,13342,29927,12666,30219,8963,31517,1961,32708,-8254,31710,-20259,25754,-30244,12610,-32037,-6881,-19968,-25981,4768,-32419,28336,-16455,29215,14837,245,32766,-30337,12383,-20355,-25679,21487,-24739,26530,19230,-19478,26349,-24125,-22174,26602,-19131,10370,31082,-32671,-2513,17762,-27536,12892,30123,-31432,-9259,28816,-15599,-12441,30313,-6461,-32124,20831,25292,-28933,-15382,32159,6279,-32767,184,32580,-3491,-32568,3612,32762,-553,-32272,-5677,29325,14618,-21672,-24577,7777,31830,10950,-30884,-27896,17191,31957,7240,-15002,-29132,-15545,28845,32765,-307,-13231,-29978,-24536,21717,26385,19428,16294,-28429,-28699,-15814,-18071,27333,23705,22621,28212,-16667,-5254,-32344,-31216,-9963,-25176,20973,981,32752,24372,21901,32760,674,27163,-18326,14563,-29353,1349,-32740,-9082,-31484,-15868,-28669,-19379,-26423,-20162,-25830,-18377,-27130,-13678,-29776,-5496,-32303,6219,-32172,19772,-26130,30563,-11814,31466,9140,16824,28117,-9904,31234,-31103,10312,-24617,-21626,9317,-31415,32731,-1534,9199,31449,-29853,13510,-14783,-29243,30001,-13175,8490,31647,-32765,429,10718,-30965,23364,22973,-31726,8193,12326,-30361,14232,29514,-30384,-12270,31695,-8313,-22843,23492,10486,-31044,736,32758,-8846,-31551,13566,29826,-15220,-29019,14011,29620,-9787,-31272,2206,32692,8609,-31616,-21021,25135,30821,-11124,-31501,-9023,17658,27601,8134,-31742,-30149,12836,26815,18830,5010,-32382,-32062,6760,14892,29187,26312,-19527,-21302,-24899,-25487,20593,17243,27862,30984,-10661,-369,-32765,-30100,-12950,-26092,19821,1226,32744,25640,20402,32629,-3002,23790,-22533,7896,-31802,-7420,-31916,-18579,-26991,-25254,-20879,-28580,-16029,-29802,-13623,-29594,-14067,-27831,-17296,-23621,-22710,-15653,-28787,-3063,-32624,13005,-30076,27700,-17504,32477,4342,19674,26202,-8016,31771,-30945,10776,-23959,-22354,11641,-30630,32679,2390,3916,32532,-32011,7000,-6941,-32024,32553,-3735,-2697,32655,-30475,-12042,22754,-23579,10137,31159,-31567,-8787,26745,-18931,-5375,32323,-16508,-28306,29541,14177,-32726,1655,29487,-14289,-23875,22443,18780,-26851,-15760,28728,15436,-28904,-17866,27468,22576,-23748,-28275,16560,32390,-4951,-31064,-10429,20450,25601,-123,-32767,-22666,23663,32711,1900,-17140,-27928,-15975,28609,32617,3123,-7181,-31971,-29647,13955,17451,27732,27300,-18122,-16082,-28550,-30863,11008,2451,32675,31396,9375,22398,-23917,-8373,-31680,-30196,-12724,-29953,13286,-13790,29724,6098,32194,21394,24818,29750,13733,32593,3368,32493,-4222,31631,-8550,31289,-9729,31815,-7838,32650,-2758,32292,5555,28397,16348,18477,27060,1716,32721,-18275,27197,-31846,7717,-27026,-18529,-1105,-32749,27568,-17711,27765,17399,-7061,31997,-32755,920,-5737,-32261,31929,-7360,5857,32239,-32747,1165,6700,-32075,28023,16981,-27232,18223,-1840,-32716,27501,17813,-31600,8668,17347,-27799,2940,32634,-19577,-26277,29103,15056,-32525,-3978,32461,-4465,-31326,9610,30651,-11585,-31024,10544,32135,-6401,-32751,-1043,30694,11469,-23278,-23062,8727,31583,11181,-30801,-28640,15920,31253,9845,-11412,-30716,-19871,26054,32205,6038,-5979,-32218,-29435,14398,19279,26494,24938,-21255,-20737,-25371,-27635,17607,11296,30758,32741,-1288,11870,-30542,-20927,-25215,-32641,2879,-18881,26780,5131,32362,24207,22082,32333,5313,31140,-10196,25096,-21068,18172,-27267,12779,-30173,10020,-31198,10253,-31122,13454,-29878,19180,-26567,26166,-19724,31756,-8076,31786,7956,21946,24331,1471,32733,-22129,24166,-32719,-1779,-16719,-28181,16929,-28055,32409,4828,4889,32400,-30780,11238,-14344,-29461,29379,-14509,11756,30585,-32251,5797,3551,-32575,28874,15490,-27095,18426,-614,-32762,25942,20016,-32445,4585,21855,-24414,-4161,32501,-12099,-30452,23191,23148,-29160,-14947,31663,8431,-32428,-4708,32509,4099,-32088,-6641,30428,12155,-26018,-19919,17034,27991,-2574,-32666,-15328,28960,29902,-13399,-30904,-10893,11984,30496,17967,-27402,-32705,-2024,11526,30672,25409,-20690,-25868,-20114,-16614,28243,28757,15705,17555,-27668,-24455,-21810,-27368,18019,7299,31943,31902,7479,23104,-23235,-4526,-32454,-26887,-18731,-32540,3855,-24042,22263,-9435,31379,4646,32435,15110,29074,21579,24657,24858,21348}, {25792,-20210,24858,-21349,21579,-24658,15110,-29075,4646,-32436,-9435,-31380,-24042,-22264,-32540,-3856,-26887,18730,-4526,32453,23104,23234,31902,-7480,7299,-31944,-27368,-18020,-24455,21809,17555,27667,28757,-15706,-16614,-28244,-25868,20113,25409,20689,11526,-30673,-32705,2023,17967,27401,11984,-30497,-30904,10892,29902,13398,-15328,-28961,-2574,32665,17034,-27992,-26018,19918,30428,-12156,-32088,6640,32509,-4100,-32428,4707,31663,-8432,-29160,14946,23191,-23149,-12099,30451,-4161,-32502,21855,24413,-32445,-4586,25942,-20017,-614,32761,-27095,-18427,28874,-15491,3551,32574,-32251,-5798,11756,-30586,29379,14508,-14344,29460,-30780,-11239,4889,-32401,32409,-4829,16929,28054,-16719,28180,-32719,1778,-22129,-24167,1471,-32734,21946,-24332,31786,-7957,31756,8075,26166,19723,19180,26566,13454,29877,10253,31121,10020,31197,12779,30172,18172,27266,25096,21067,31140,10195,32333,-5314,24207,-22083,5131,-32363,-18881,-26781,-32641,-2880,-20927,25214,11870,30541,32741,1287,11296,-30759,-27635,-17608,-20737,25370,24938,21254,19279,-26495,-29435,-14399,-5979,32217,32205,-6039,-19871,-26055,-11412,30715,31253,-9846,-28640,-15921,11181,30800,8727,-31584,-23278,23061,30694,-11470,-32751,1042,32135,6400,-31024,-10545,30651,11584,-31326,-9611,32461,4464,-32525,3977,29103,-15057,-19577,26276,2940,-32635,17347,27798,-31600,-8669,27501,-17814,-1840,32715,-27232,-18224,28023,-16982,6700,32074,-32747,-1166,5857,-32240,31929,7359,-5737,32260,-32755,-921,-7061,-31998,27765,-17400,27568,17710,-1105,32748,-27026,18528,-31846,-7718,-18275,-27198,1716,-32722,18477,-27061,28397,-16349,32292,-5556,32650,2757,31815,7837,31289,9728,31631,8549,32493,4221,32593,-3369,29750,-13734,21394,-24819,6098,-32195,-13790,-29725,-29953,-13287,-30196,12723,-8373,31679,22398,23916,31396,-9376,2451,-32676,-30863,-11009,-16082,28549,27300,18121,17451,-27733,-29647,-13956,-7181,31970,32617,-3124,-15975,-28610,-17140,27927,32711,-1901,-22666,-23664,-123,32766,20450,-25602,-31064,10428,32390,4950,-28275,-16561,22576,23747,-17866,-27469,15436,28903,-15760,-28729,18780,26850,-23875,-22444,29487,14288,-32726,-1656,29541,-14178,-16508,28305,-5375,-32324,26745,18930,-31567,8786,10137,-31160,22754,23578,-30475,12041,-2697,-32656,32553,3734,-6941,32023,-32011,-7001,3916,-32533,32679,-2391,11641,30629,-23959,22353,-30945,-10777,-8016,-31772,19674,-26203,32477,-4343,27700,17503,13005,30075,-3063,32623,-15653,28786,-23621,22709,-27831,17295,-29594,14066,-29802,13622,-28580,16028,-25254,20878,-18579,26990,-7420,31915,7896,31801,23790,22532,32629,3001,25640,-20403,1226,-32745,-26092,-19822,-30100,12949,-369,32764,30984,10660,17243,-27863,-25487,-20594,-21302,24898,26312,19526,14892,-29188,-32062,-6761,5010,32381,26815,-18831,-30149,-12837,8134,31741,17658,-27602,-31501,9022,30821,11123,-21021,-25136,8609,31615,2206,-32693,-9787,31271,14011,-29621,-15220,29018,13566,-29827,-8846,31550,736,-32759,10486,31043,-22843,-23493,31695,8312,-30384,12269,14232,-29515,12326,30360,-31726,-8194,23364,-22974,10718,30964,-32765,-430,8490,-31648,30001,13174,-14783,29242,-29853,-13511,9199,-31450,32731,1533,9317,31414,-24617,21625,-31103,-10313,-9904,-31235,16824,-28118,31466,-9141,30563,11813,19772,26129,6219,32171,-5496,32302,-13678,29775,-18377,27129,-20162,25829,-19379,26422,-15868,28668,-9082,31483,1349,32739,14563,29352,27163,18325,32760,-675,24372,-21902,981,-32753,-25176,-20974,-31216,9962,-5254,32343,28212,16666,23705,-22622,-18071,-27334,-28699,15813,16294,28428,26385,-19429,-24536,-21718,-13231,29977,32765,306,-15545,-28846,-15002,29131,31957,-7241,-27896,-17192,10950,30883,7777,-31831,-21672,24576,29325,-14619,-32272,5676,32762,552,-32568,-3613,32580,3490,-32767,-185,32159,-6280,-28933,15381,20831,-25293,-6461,32123,-12441,-30314,28816,15598,-31432,9258,12892,-30124,17762,27535,-32671,2512,10370,-31083,26602,19130,-24125,22173,-19478,-26350,26530,-19231,21487,24738,-20355,25678,-30337,-12384,245,-32767,29215,-14838,28336,16454,4768,32418,-19968,25980,-32037,6880,-30244,-12611,-20259,-25755,-8254,-31711,1961,-32709,8963,-31518,12666,-30220,13342,-29928,11065,-30842,5616,-32283,-3186,-32612,-14674,-29298,-26240,-19626,-32661,-2636,-27435,17916,-7659,31859,18980,26709,32766,61,16401,-28367,-19081,-26639,-31362,9493,2084,32700,32688,2268,3429,-32588,-32737,-1411,3794,32546,30518,-11928,-21764,-24496,-12554,30266,32372,-5072,-23536,-22799,-859,32755,22487,-23833,-32229,5918,30736,11354,-23018,-23322,13900,29672,-6340,-32148,1594,32728,-1,-32767,1594,32728,-6340,-32148,13900,29672,-23018,-23322,30736,11354,-32229,5918,22487,-23833,-859,32755,-23536,-22799,32372,-5072,-12554,30266,-21764,-24496,30518,-11928,3794,32546,-32737,-1411,3429,-32588,32688,2268,2084,32700,-31362,9493,-19081,-26639,16401,-28367,32766,61,18980,26709,-7659,31859,-27435,17916,-32661,-2636,-26240,-19626,-14674,-29298,-3186,-32612,5616,-32283,11065,-30842,13342,-29928,12666,-30220,8963,-31518,1961,-32709,-8254,-31711,-20259,-25755,-30244,-12611,-32037,6880,-19968,25980,4768,32418,28336,16454,29215,-14838,245,-32767,-30337,-12384,-20355,25678,21487,24738,26530,-19231,-19478,-26350,-24125,22173,26602,19130,10370,-31083,-32671,2512,17762,27535,12892,-30124,-31432,9258,28816,15598,-12441,-30314,-6461,32123,20831,-25293,-28933,15381,32159,-6280,-32767,-185,32580,3490,-32568,-3613,32762,552,-32272,5676,29325,-14619,-21672,24576,7777,-31831,10950,30883,-27896,-17192,31957,-7241,-15002,29131,-15545,-28846,32765,306,-13231,29977,-24536,-21718,26385,-19429,16294,28428,-28699,15813,-18071,-27334,23705,-22622,28212,16666,-5254,32343,-31216,9962,-25176,-20974,981,-32753,24372,-21902,32760,-675,27163,18325,14563,29352,1349,32739,-9082,31483,-15868,28668,-19379,26422,-20162,25829,-18377,27129,-13678,29775,-5496,32302,6219,32171,19772,26129,30563,11813,31466,-9141,16824,-28118,-9904,-31235,-31103,-10313,-24617,21625,9317,31414,32731,1533,9199,-31450,-29853,-13511,-14783,29242,30001,13174,8490,-31648,-32765,-430,10718,30964,23364,-22974,-31726,-8194,12326,30360,14232,-29515,-30384,12269,31695,8312,-22843,-23493,10486,31043,736,-32759,-8846,31550,13566,-29827,-15220,29018,14011,-29621,-9787,31271,2206,-32693,8609,31615,-21021,-25136,30821,11123,-31501,9022,17658,-27602,8134,31741,-30149,-12837,26815,-18831,5010,32381,-32062,-6761,14892,-29188,26312,19526,-21302,24898,-25487,-20594,17243,-27863,30984,10660,-369,32764,-30100,12949,-26092,-19822,1226,-32745,25640,-20403,32629,3001,23790,22532,7896,31801,-7420,31915,-18579,26990,-25254,20878,-28580,16028,-29802,13622,-29594,14066,-27831,17295,-23621,22709,-15653,28786,-3063,32623,13005,30075,27700,17503,32477,-4343,19674,-26203,-8016,-31772,-30945,-10777,-23959,22353,11641,30629,32679,-2391,3916,-32533,-32011,-7001,-6941,32023,32553,3734,-2697,-32656,-30475,12041,22754,23578,10137,-31160,-31567,8786,26745,18930,-5375,-32324,-16508,28305,29541,-14178,-32726,-1656,29487,14288,-23875,-22444,18780,26850,-15760,-28729,15436,28903,-17866,-27469,22576,23747,-28275,-16561,32390,4950,-31064,10428,20450,-25602,-123,32766,-22666,-23664,32711,-1901,-17140,27927,-15975,-28610,32617,-3124,-7181,31970,-29647,-13956,17451,-27733,27300,18121,-16082,28549,-30863,-11009,2451,-32676,31396,-9376,22398,23916,-8373,31679,-30196,12723,-29953,-13287,-13790,-29725,6098,-32195,21394,-24819,29750,-13734,32593,-3369,32493,4221,31631,8549,31289,9728,31815,7837,32650,2757,32292,-5556,28397,-16349,18477,-27061,1716,-32722,-18275,-27198,-31846,-7718,-27026,18528,-1105,32748,27568,17710,27765,-17400,-7061,-31998,-32755,-921,-5737,32260,31929,7359,5857,-32240,-32747,-1166,6700,32074,28023,-16982,-27232,-18224,-1840,32715,27501,-17814,-31600,-8669,17347,27798,2940,-32635,-19577,26276,29103,-15057,-32525,3977,32461,4464,-31326,-9611,30651,11584,-31024,-10545,32135,6400,-32751,1042,30694,-11470,-23278,23061,8727,-31584,11181,30800,-28640,-15921,31253,-9846,-11412,30715,-19871,-26055,32205,-6039,-5979,32217,-29435,-14399,19279,-26495,24938,21254,-20737,25370,-27635,-17608,11296,-30759,32741,1287,11870,30541,-20927,25214,-32641,-2880,-18881,-26781,5131,-32363,24207,-22083,32333,-5314,31140,10195,25096,21067,18172,27266,12779,30172,10020,31197,10253,31121,13454,29877,19180,26566,26166,19723,31756,8075,31786,-7957,21946,-24332,1471,-32734,-22129,-24167,-32719,1778,-16719,28180,16929,28054,32409,-4829,4889,-32401,-30780,-11239,-14344,29460,29379,14508,11756,-30586,-32251,-5798,3551,32574,28874,-15491,-27095,-18427,-614,32761,25942,-20017,-32445,-4586,21855,24413,-4161,-32502,-12099,30451,23191,-23149,-29160,14946,31663,-8432,-32428,4707,32509,-4100,-32088,6640,30428,-12156,-26018,19918,17034,-27992,-2574,32665,-15328,-28961,29902,13398,-30904,10892,11984,-30497,17967,27401,-32705,2023,11526,-30673,25409,20689,-25868,20113,-16614,-28244,28757,-15706,17555,27667,-24455,21809,-27368,-18020,7299,-31944,31902,-7480,23104,23234,-4526,32453,-26887,18730,-32540,-3856,-24042,-22264,-9435,-31380,4646,-32436,15110,-29075,21579,-24658,24858,-21349,25792,-20210,24697,-21534,21208,-24978,14453,-29408,3673,-32561,-10603,-31005,-25018,-21162,-32697,-2146,-25717,20306,-2330,32684,24778,21440,31178,-10079,4403,-32470,-28990,-15274,-22038,24249,20546,25525,26673,-19031,-20065,-25906,-22930,23407,28086,16876,6820,-32050,-31985,7120,22218,24083,6580,-32100,-28459,16241,31873,7598,-20642,-25449,4038,32517,10834,-30924,-21115,25057,26955,-18630,-29699,13844,30607,-11699,-30291,12496,28519,-16135,-24291,21992,16188,-28489,-3308,32599,-13118,-30027,27959,17086,-32353,5192,18679,-26922,9552,31343,-31534,-8905,22308,-24001,14122,29567,-32314,5434,490,-32764,32605,3246,-2819,32645,-32758,797,-7539,-31888,28149,-16772,26458,19329,-4283,32486,-29271,14728,-30052,-13062,-12213,-30406,9669,-31308,25331,-20785,32111,-6521,32182,6159,29046,15164,25563,20498,23450,22886,23450,22886,25563,20498,29046,15164,32182,6159,32111,-6521,25331,-20785,9669,-31308,-12213,-30406,-30052,-13062,-29271,14728,-4283,32486,26458,19329,28149,-16772,-7539,-31888,-32758,797,-2819,32645,32605,3246,490,-32764,-32314,5434,14122,29567,22308,-24001,-31534,-8905,9552,31343,18679,-26922,-32353,5192,27959,17086,-13118,-30027,-3308,32599,16188,-28489,-24291,21992,28519,-16135,-30291,12496,30607,-11699,-29699,13844,26955,-18630,-21115,25057,10834,-30924,4038,32517,-20642,-25449,31873,7598,-28459,16241,6580,-32100,22218,24083,-31985,7120,6820,-32050,28086,16876,-22930,23407,-20065,-25906,26673,-19031,20546,25525,-22038,24249,-28990,-15274,4403,-32470,31178,-10079,24778,21440,-2330,32684,-25717,20306,-32697,-2146,-25018,-21162,-10603,-31005,3673,-32561,14453,-29408,21208,-24978,24697,-21534}, {-4283,-32487,4889,32400,-6941,-32024,10370,31082,-15002,-29132,20450,25601,-26018,-19919,30607,11698,-32751,-1043,30821,-11124,-23536,22798,10718,-30965,5857,32239,-22038,-24250,31902,7479,-29953,13286,14563,-29353,8963,31517,-28580,-16029,31140,-10196,-12213,30405,-16719,-28181,32679,2390,-19478,26349,-13231,-29978,32711,1900,-15328,28960,-21115,-25058,30651,-11585,2206,32692,-32229,-5919,12326,-30361,28023,16981,-20065,25905,-24455,-21810,22398,-23917,24372,21901,-20259,25754,-27831,-17296,12779,-30173,32111,6520,1471,32733,-30945,10776,-20355,-25679,16294,-28429,32617,3123,11984,30496,-20642,25448,-32525,-3978,-15220,-29019,13900,-29673,31695,-8313,27501,17813,6820,32049,-16614,28243,-30863,11008,-31216,-9963,-19968,-25981,-3063,-32624,13454,-29878,25563,-20499,31756,-8076,32477,4342,29215,14837,23705,22621,17451,27732,11526,30672,6580,32099,2940,32634,736,32758,0,32767,736,32758,2940,32634,6580,32099,11526,30672,17451,27732,23705,22621,29215,14837,32477,4342,31756,-8076,25563,-20499,13454,-29878,-3063,-32624,-19968,-25981,-31216,-9963,-30863,11008,-16614,28243,6820,32049,27501,17813,31695,-8313,13900,-29673,-15220,-29019,-32525,-3978,-20642,25448,11984,30496,32617,3123,16294,-28429,-20355,-25679,-30945,10776,1471,32733,32111,6520,12779,-30173,-27831,-17296,-20259,25754,24372,21901,22398,-23917,-24455,-21810,-20065,25905,28023,16981,12326,-30361,-32229,-5919,2206,32692,30651,-11585,-21115,-25058,-15328,28960,32711,1900,-13231,-29978,-19478,26349,32679,2390,-16719,-28181,-12213,30405,31140,-10196,-28580,-16029,8963,31517,14563,-29353,-29953,13286,31902,7479,-22038,-24250,5857,32239,10718,-30965,-23536,22798,30821,-11124,-32751,-1043,30607,11698,-26018,-19919,20450,25601,-15002,-29132,10370,31082,-6941,-32024,4889,32400,-4283,-32487,5131,32362,-7420,-31916,11065,30841,-15868,-28669,21394,24818,-26887,-18731,31178,10078,-32755,920,30001,-13175,-21764,24495,8134,-31742,8727,31583,-24291,-21993,32509,4099,-28275,16560,10950,-30884,12892,30123,-30475,-12042,29379,-14509,-7539,31887,-20927,-25215,32629,-3002,-14674,29297,-18377,-27130,32493,-4222,-9435,31379,-25717,-20307,27568,-17711,9199,31449,-32737,1410,5010,-32382,31253,9845,-13118,30026,-29160,-14947,15436,-28904,29325,14618,-12441,30313,-31567,-8787,3551,-32575,32605,-3247,11296,30758,-26092,19821,-27435,-17917,6219,-32172,31815,-7838,21579,24657,-10603,31004,-31846,7717,-24617,-21626,2084,-32701,26312,-19527,32205,6038,18679,26921,-4161,32501,-23875,22443,-32568,3612,-28933,-15382,-16508,-28306,-614,-32762,14122,-29568,24938,-21255,30984,-10661,32766,-62,31466,9140,28397,16348,24697,21533,21208,24977,18477,27060,16824,28117,16401,28366,17243,27862,19279,26494,22308,24000,25942,20016,29541,14177,32159,6279,32580,-3491,29487,-14289,21855,-24414,9552,-31344,-5979,-32218,-21302,-24899,-31362,-9494,-31103,10312,-18275,27197,3673,32560,24858,21348,32650,-2758,19772,-26130,-7659,-31860,-30100,-12950,-27635,17607,490,32763,28874,15490,26745,-18931,-6461,-32124,-32272,-5677,-15760,28728,23191,23148,27959,-17087,-11412,-30716,-32062,6760,3429,32587,32731,-1534,-1105,-32749,-32697,2145,4646,32435,31631,-8550,-13678,-29776,-26240,19625,25640,20402,11870,-30542,-32758,-798,11756,30585,22754,-23579,-31432,-9259,7777,31830,22576,-23748,-32428,-4708,16188,28488,11181,-30801,-30149,12836,30518,11927,-14783,-29243,-7061,31997,24778,-21441,-32540,3855,29750,13733,-19379,-26423,5616,32282,7896,-31802,-18881,26780,26458,-19330,-30780,11238,32553,-3735,-32671,-2513,31957,7240,-31064,-10429,30428,12155,-30291,-12497,30694,11469,-31501,-9023,32372,5071,-32765,429,31929,-7360,-28990,15273,23104,-23235,-13790,29724,1349,-32740,12666,30219,-25254,-20879,32333,5313,-30052,13061,16929,-28055,3916,32532,-24125,-22174,32765,-307,-22666,23663,-2574,-32666,26955,18629,-31024,10544,8609,-31616,22487,23832,-31726,8193,6700,-32075,26673,19030,-27368,18019,-8373,-31680,32760,674,-8254,31710,-29594,-14067,18172,-27267,25331,20784,-22129,24166,-23959,-22354,21487,-24739,26385,19428,-15975,28609,-30904,-10893,4038,-32518,32461,-4465,14011,29620,-23018,23321,-30384,-12270,-1840,-32716,28086,-16877,28757,15705,2451,32675,-25176,20973,-32037,-6881,-15653,-28787,10253,-31122,29046,-15165,31786,7956,19674,26202,245,32766,-18071,27333,-29647,13955,-32705,-2024,-28459,-16242,-19577,-26277,-8846,-31551,1594,-32729,10486,-31044,17347,-27799,22218,-24084,25409,-20690,27300,-18122,28212,-16667,28336,-16455,27700,-17504,26166,-19724,23450,-22887,19180,-26567,13005,-30076,4768,-32419,-5254,-32344,-16082,-28550,-25868,-20114,-31985,-7121,-31600,8668,-22843,23492,-6340,32147,13566,29826,29103,15056,31873,-7599,17967,-27402,-7181,-31971,-28699,-15814,-30337,12383,-8016,31771,21946,24331,32182,-6160,10020,-31198,-23621,-22710,-30244,12610,981,32752,31396,9375,17555,-27668,-22930,-23408,-27232,18223,14232,29514,30736,-11355,-9787,-31272,-31326,9610,10834,30923,29902,-13399,-17140,-27928,-24536,21717,26530,19230,11641,-30630,-32719,-1779,9669,31307,25096,-21068,-29802,-13623,1961,32708,27163,-18326,-30196,-12724,7299,31943,20546,-25526,-32747,1165,23364,22973,-859,-32756,-21021,25135,32135,-6401,-29699,-13845,17034,27991,-123,-32767,-15545,28845,26602,-19131,-32011,7000,32409,4828,-29271,-14729,24207,22082,-18579,-26991,13342,29927,-9082,-31484,6098,32194,-4526,-32454,4403,32469,-5737,-32261,8490,31647,-12554,-30267,17658,27601,-23278,-23062,28519,16134,-32088,-6641,32390,-4951,-27896,17191,17762,-27536,-2697,32655,-14344,-29461,28149,16771,-32641,2879,23790,-22533,-3186,32611,-20162,-25830,32593,3368,-24042,22263,-2330,-32685,27765,17399,-29853,13510,3794,-32547,26815,18830,-28640,15920,-3308,-32600,31663,8431,-17866,27468,-21672,-24577,28816,-15599,10137,31159,-32251,5797,-2819,-32646,32741,-1288,1226,32744,-32661,2635,-5496,-32303,31289,-9729,15110,29074,-25018,21161,-27026,-18529,9317,-31415,32688,-2269,14892,29187,-19871,26054,-32353,-5193,-12099,-30452,18780,-26851,32762,-553,20831,25292,-5375,32323,-27095,18426,-32314,-5435,-20737,-25371,-369,-32765,18980,-26710,30563,-11814,32292,5555,25792,20209,14453,29407,1716,32721,-9904,31234,-19081,26638,-25487,20593,-29435,14398,-31534,8904,-32445,4585,-32726,1655,-32767,184,-32767,184,-32726,1655,-32445,4585,-31534,8904,-29435,14398,-25487,20593,-19081,26638,-9904,31234,1716,32721,14453,29407,25792,20209,32292,5555,30563,-11814,18980,-26710,-369,-32765,-20737,-25371,-32314,-5435,-27095,18426,-5375,32323,20831,25292,32762,-553,18780,-26851,-12099,-30452,-32353,-5193,-19871,26054,14892,29187,32688,-2269,9317,-31415,-27026,-18529,-25018,21161,15110,29074,31289,-9729,-5496,-32303,-32661,2635,1226,32744,32741,-1288,-2819,-32646,-32251,5797,10137,31159,28816,-15599,-21672,-24577,-17866,27468,31663,8431,-3308,-32600,-28640,15920,26815,18830,3794,-32547,-29853,13510,27765,17399,-2330,-32685,-24042,22263,32593,3368,-20162,-25830,-3186,32611,23790,-22533,-32641,2879,28149,16771,-14344,-29461,-2697,32655,17762,-27536,-27896,17191,32390,-4951,-32088,-6641,28519,16134,-23278,-23062,17658,27601,-12554,-30267,8490,31647,-5737,-32261,4403,32469,-4526,-32454,6098,32194,-9082,-31484,13342,29927,-18579,-26991,24207,22082,-29271,-14729,32409,4828,-32011,7000,26602,-19131,-15545,28845,-123,-32767,17034,27991,-29699,-13845,32135,-6401,-21021,25135,-859,-32756,23364,22973,-32747,1165,20546,-25526,7299,31943,-30196,-12724,27163,-18326,1961,32708,-29802,-13623,25096,-21068,9669,31307,-32719,-1779,11641,-30630,26530,19230,-24536,21717,-17140,-27928,29902,-13399,10834,30923,-31326,9610,-9787,-31272,30736,-11355,14232,29514,-27232,18223,-22930,-23408,17555,-27668,31396,9375,981,32752,-30244,12610,-23621,-22710,10020,-31198,32182,-6160,21946,24331,-8016,31771,-30337,12383,-28699,-15814,-7181,-31971,17967,-27402,31873,-7599,29103,15056,13566,29826,-6340,32147,-22843,23492,-31600,8668,-31985,-7121,-25868,-20114,-16082,-28550,-5254,-32344,4768,-32419,13005,-30076,19180,-26567,23450,-22887,26166,-19724,27700,-17504,28336,-16455,28212,-16667,27300,-18122,25409,-20690,22218,-24084,17347,-27799,10486,-31044,1594,-32729,-8846,-31551,-19577,-26277,-28459,-16242,-32705,-2024,-29647,13955,-18071,27333,245,32766,19674,26202,31786,7956,29046,-15165,10253,-31122,-15653,-28787,-32037,-6881,-25176,20973,2451,32675,28757,15705,28086,-16877,-1840,-32716,-30384,-12270,-23018,23321,14011,29620,32461,-4465,4038,-32518,-30904,-10893,-15975,28609,26385,19428,21487,-24739,-23959,-22354,-22129,24166,25331,20784,18172,-27267,-29594,-14067,-8254,31710,32760,674,-8373,-31680,-27368,18019,26673,19030,6700,-32075,-31726,8193,22487,23832,8609,-31616,-31024,10544,26955,18629,-2574,-32666,-22666,23663,32765,-307,-24125,-22174,3916,32532,16929,-28055,-30052,13061,32333,5313,-25254,-20879,12666,30219,1349,-32740,-13790,29724,23104,-23235,-28990,15273,31929,-7360,-32765,429,32372,5071,-31501,-9023,30694,11469,-30291,-12497,30428,12155,-31064,-10429,31957,7240,-32671,-2513,32553,-3735,-30780,11238,26458,-19330,-18881,26780,7896,-31802,5616,32282,-19379,-26423,29750,13733,-32540,3855,24778,-21441,-7061,31997,-14783,-29243,30518,11927,-30149,12836,11181,-30801,16188,28488,-32428,-4708,22576,-23748,7777,31830,-31432,-9259,22754,-23579,11756,30585,-32758,-798,11870,-30542,25640,20402,-26240,19625,-13678,-29776,31631,-8550,4646,32435,-32697,2145,-1105,-32749,32731,-1534,3429,32587,-32062,6760,-11412,-30716,27959,-17087,23191,23148,-15760,28728,-32272,-5677,-6461,-32124,26745,-18931,28874,15490,490,32763,-27635,17607,-30100,-12950,-7659,-31860,19772,-26130,32650,-2758,24858,21348,3673,32560,-18275,27197,-31103,10312,-31362,-9494,-21302,-24899,-5979,-32218,9552,-31344,21855,-24414,29487,-14289,32580,-3491,32159,6279,29541,14177,25942,20016,22308,24000,19279,26494,17243,27862,16401,28366,16824,28117,18477,27060,21208,24977,24697,21533,28397,16348,31466,9140,32766,-62,30984,-10661,24938,-21255,14122,-29568,-614,-32762,-16508,-28306,-28933,-15382,-32568,3612,-23875,22443,-4161,32501,18679,26921,32205,6038,26312,-19527,2084,-32701,-24617,-21626,-31846,7717,-10603,31004,21579,24657,31815,-7838,6219,-32172,-27435,-17917,-26092,19821,11296,30758,32605,-3247,3551,-32575,-31567,-8787,-12441,30313,29325,14618,15436,-28904,-29160,-14947,-13118,30026,31253,9845,5010,-32382,-32737,1410,9199,31449,27568,-17711,-25717,-20307,-9435,31379,32493,-4222,-18377,-27130,-14674,29297,32629,-3002,-20927,-25215,-7539,31887,29379,-14509,-30475,-12042,12892,30123,10950,-30884,-28275,16560,32509,4099,-24291,-21993,8727,31583,8134,-31742,-21764,24495,30001,-13175,-32755,920,31178,10078,-26887,-18731,21394,24818,-15868,-28669,11065,30841,-7420,-31916,5131,32362}, diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 7445fca40f..62de0a29fb 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/print_stats.c * \brief PHY statstic logging function * \author R. Knopp, F. Kaltenberger, navid nikaein diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 411c058c3e..9cea841df9 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/proto.h * \brief Function prototypes for PHY physical/transport channel processing and generation V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/pss.c b/openair1/PHY/LTE_TRANSPORT/pss.c index e2a4c549da..982cdeed9a 100644 --- a/openair1/PHY/LTE_TRANSPORT/pss.c +++ b/openair1/PHY/LTE_TRANSPORT/pss.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/pss.c * \brief Top-level routines for generating primary synchronization signal (PSS) V8.6 2009-03 * \author F. Kaltenberger, O. Tonelli, R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 82ad9ab00f..8e598df3d4 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/pucch.c * \brief Top-level routines for generating and decoding the PUCCH physical channel V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c index 40dec0ec6f..2432206469 100644 --- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/rar_tools.c * \brief Routine for filling the PUSCH/ULSCH data structures based on a random-access response (RAR) SDU from MAC. Note this is both for UE and eNB. V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c index 249fd81ee4..ac265b41bd 100644 --- a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/srs_modulation.c * \brief Top-level routines for generating sounding reference signal (SRS) V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c index 34d55daaea..bcb7d59c18 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.c +++ b/openair1/PHY/LTE_TRANSPORT/sss.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/sss.c * \brief Top-level routines for generating and decoding the secondary synchronization signal (SSS) V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/sss.h b/openair1/PHY/LTE_TRANSPORT/sss.h index 5b79f95610..bce9b669ef 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.h +++ b/openair1/PHY/LTE_TRANSPORT/sss.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - int16_t d0_sss[504*62] = {1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1}; int16_t d5_sss[504*62] = {1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1}; diff --git a/openair1/PHY/LTE_TRANSPORT/uci.h b/openair1/PHY/LTE_TRANSPORT/uci.h index 03580cf4c9..94f511a8cb 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci.h +++ b/openair1/PHY/LTE_TRANSPORT/uci.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c index 6a475d52ee..73c69b3b74 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/phich.c * \brief Routines for generation of and computations regarding the uplink control information (UCI) for PUSCH. V8.6 2009-03 * \author R. Knopp, F. Kaltenberger, A. Bhamri diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 1004cfa192..9c5217eb0c 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/ulsch_coding.c * \brief Top-level routines for coding the ULSCH transport channel as described in 36.212 V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index a0a5602261..0e70b804ff 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/ulsch_decoding.c * \brief Top-level routines for decoding the ULSCH transport channel from 36.212 V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 010dd36f31..fd7b58c9d9 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/ulsch_demodulation.c * \brief Top-level routines for demodulating the PUSCH physical channel from 36.211 V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c index b4f7f02480..cf04553c9b 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/LTE_TRANSPORT/ulsch_modulation.c * \brief Top-level routines for generating PUSCH physical channel from 36.211 V8.6 2009-03 * \author R. Knopp, F. Kaltenberger, A. Bhamri diff --git a/openair1/PHY/LTE_TRANSPORT/vars.h b/openair1/PHY/LTE_TRANSPORT/vars.h index c40633aff3..714ed6fcfc 100644 --- a/openair1/PHY/LTE_TRANSPORT/vars.h +++ b/openair1/PHY/LTE_TRANSPORT/vars.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "dlsch_tbs.h" //#include "dlsch_tbs_full.h" #include "sss.h" diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h index 8b92e3886e..637fcb823a 100644 --- a/openair1/PHY/MODULATION/defs.h +++ b/openair1/PHY/MODULATION/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __MODULATION_DEFS__H__ #define __MODULATION_DEFS__H__ #include "PHY/defs.h" diff --git a/openair1/PHY/MODULATION/extern.h b/openair1/PHY/MODULATION/extern.h index f5be5682aa..e69de29bb2 100644 --- a/openair1/PHY/MODULATION/extern.h +++ b/openair1/PHY/MODULATION/extern.h @@ -1,30 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - - diff --git a/openair1/PHY/MODULATION/kHz_7_5.h b/openair1/PHY/MODULATION/kHz_7_5.h index 2c07627b66..7200627040 100644 --- a/openair1/PHY/MODULATION/kHz_7_5.h +++ b/openair1/PHY/MODULATION/kHz_7_5.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ int16_t s6n_kHz_7_5[1920]__attribute__((aligned(16))) = {31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805}; int16_t s6e_kHz_7_5[1920]__attribute__((aligned(16))) = {23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805}; diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c old mode 100755 new mode 100644 index d7dd141fb5..51361ada7d --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* * @defgroup _PHY_MODULATION_ * @ingroup _physical_layer_ref_implementation_ diff --git a/openair1/PHY/MODULATION/prach625Hz.h b/openair1/PHY/MODULATION/prach625Hz.h index 5a114181e6..a04b8b7669 100644 --- a/openair1/PHY/MODULATION/prach625Hz.h +++ b/openair1/PHY/MODULATION/prach625Hz.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ int16_t sig625_1_25MHz[2850*2]; int16_t sig625_2_5MHz[5700*2]; int16_t sig625_5MHz[11400*2]; diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index 61c83e5b89..3179327b6b 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "defs.h" //#define DEBUG_FEP diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index f6ca4aa2f4..1be0917098 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "defs.h" //#define DEBUG_FEP diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index c612893c5c..de76b547c5 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "defs.h" diff --git a/openair1/PHY/MODULATION/ul_7_5_kHz.c b/openair1/PHY/MODULATION/ul_7_5_kHz.c old mode 100755 new mode 100644 index 4a50ad395e..8f742e25aa --- a/openair1/PHY/MODULATION/ul_7_5_kHz.c +++ b/openair1/PHY/MODULATION/ul_7_5_kHz.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "extern.h" diff --git a/openair1/PHY/MODULATION/vars.h b/openair1/PHY/MODULATION/vars.h index 5fa9b96776..69b32e6b44 100644 --- a/openair1/PHY/MODULATION/vars.h +++ b/openair1/PHY/MODULATION/vars.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ mod_sym_t qpsk_table[4]; mod_sym_t qam16_table[16]; mod_sym_t qam64_table[64]; diff --git a/openair1/PHY/TOOLS/8bit_rxdemux.c b/openair1/PHY/TOOLS/8bit_rxdemux.c index c9406c10ce..a0bd13a2a0 100644 --- a/openair1/PHY/TOOLS/8bit_rxdemux.c +++ b/openair1/PHY/TOOLS/8bit_rxdemux.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/TOOLS/8bit_txmux.c b/openair1/PHY/TOOLS/8bit_txmux.c index b31da10198..2a6b5034ea 100644 --- a/openair1/PHY/TOOLS/8bit_txmux.c +++ b/openair1/PHY/TOOLS/8bit_txmux.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/TOOLS/angle.c b/openair1/PHY/TOOLS/angle.c index f2c71ea742..5319b6e2c3 100644 --- a/openair1/PHY/TOOLS/angle.c +++ b/openair1/PHY/TOOLS/angle.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /****************************** * file: angle.c * purpose: compute the angle of a 8 bit complex number diff --git a/openair1/PHY/TOOLS/cadd_sv.c b/openair1/PHY/TOOLS/cadd_sv.c index 2fa052f6c9..be12659d1c 100644 --- a/openair1/PHY/TOOLS/cadd_sv.c +++ b/openair1/PHY/TOOLS/cadd_sv.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" static __m128i alpha_128 __attribute__ ((aligned(16))); diff --git a/openair1/PHY/TOOLS/cadd_vv.c b/openair1/PHY/TOOLS/cadd_vv.c index 3bc349463e..edac4adbc3 100644 --- a/openair1/PHY/TOOLS/cadd_vv.c +++ b/openair1/PHY/TOOLS/cadd_vv.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" diff --git a/openair1/PHY/TOOLS/cdot_prod.c b/openair1/PHY/TOOLS/cdot_prod.c index e6ff476303..987b94b335 100644 --- a/openair1/PHY/TOOLS/cdot_prod.c +++ b/openair1/PHY/TOOLS/cdot_prod.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c index 31ad77be82..1a65b5962f 100644 --- a/openair1/PHY/TOOLS/cmult_sv.c +++ b/openair1/PHY/TOOLS/cmult_sv.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/sse_intrin.h" #include "defs.h" diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c old mode 100755 new mode 100644 index f970d33224..1151540a44 --- a/openair1/PHY/TOOLS/cmult_vv.c +++ b/openair1/PHY/TOOLS/cmult_vv.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" //#include "MAC_INTERFACE/extern.h" #ifdef USER_MODE diff --git a/openair1/PHY/TOOLS/costable.h b/openair1/PHY/TOOLS/costable.h index 86627a4707..d1d6428cf3 100644 --- a/openair1/PHY/TOOLS/costable.h +++ b/openair1/PHY/TOOLS/costable.h @@ -1,29 +1 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned int acostable[256] = {16384,16343,16302,16261,16220,16179,16139,16098,16057,16016,15975,15934,15893,15852,15811,15770,15729,15688,15647,15606,15565,15524,15483,15442,15401,15360,15319,15278,15236,15195,15154,15113,15072,15030,14989,14948,14907,14865,14824,14782,14741,14700,14658,14617,14575,14534,14492,14450,14409,14367,14325,14284,14242,14200,14158,14116,14075,14033,13991,13949,13907,13864,13822,13780,13738,13696,13653,13611,13568,13526,13484,13441,13398,13356,13313,13270,13227,13184,13142,13099,13056,13012,12969,12926,12883,12839,12796,12752,12709,12665,12622,12578,12534,12490,12446,12402,12358,12314,12270,12225,12181,12136,12092,12047,12002,11957,11913,11868,11822,11777,11732,11687,11641,11595,11550,11504,11458,11412,11366,11320,11274,11227,11181,11134,11087,11040,10993,10946,10899,10852,10804,10757,10709,10661,10613,10565,10517,10468,10420,10371,10322,10273,10224,10174,10125,10075,10026,9976,9925,9875,9825,9774,9723,9672,9621,9569,9518,9466,9414,9362,9309,9257,9204,9151,9097,9044,8990,8936,8882,8827,8773,8718,8662,8607,8551,8495,8439,8382,8325,8268,8210,8152,8094,8035,7976,7917,7858,7798,7737,7676,7615,7554,7492,7430,7367,7303,7240,7176,7111,7046,6980,6914,6847,6780,6712,6643,6574,6505,6434,6363,6292,6219,6146,6072,5997,5921,5845,5767,5689,5610,5529,5448,5365,5282,5197,5110,5023,4934,4843,4751,4657,4562,4464,4364,4263,4159,4052,3942,3830,3715,3595,3472,3345,3213,3075,2931,2779,2620,2450,2267,2069,1850,1602,1307,924,0}; diff --git a/openair1/PHY/TOOLS/dB_routines.c b/openair1/PHY/TOOLS/dB_routines.c old mode 100755 new mode 100644 index ae792c4dd6..8b0b293728 --- a/openair1/PHY/TOOLS/dB_routines.c +++ b/openair1/PHY/TOOLS/dB_routines.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" // Approximate 10*log10(x) in fixed point : x = 0...(2^32)-1 diff --git a/openair1/PHY/TOOLS/dB_routines.h b/openair1/PHY/TOOLS/dB_routines.h index 36040dc28a..1e29358fe7 100644 --- a/openair1/PHY/TOOLS/dB_routines.h +++ b/openair1/PHY/TOOLS/dB_routines.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* * dB_routines.h * diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 8d30a7ea10..c965f2cdaa 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __PHY_TOOLS_DEFS__H__ #define __PHY_TOOLS_DEFS__H__ diff --git a/openair1/PHY/TOOLS/extern.h b/openair1/PHY/TOOLS/extern.h index 5c046434e6..e69de29bb2 100644 --- a/openair1/PHY/TOOLS/extern.h +++ b/openair1/PHY/TOOLS/extern.h @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ \ No newline at end of file diff --git a/openair1/PHY/TOOLS/file_output.c b/openair1/PHY/TOOLS/file_output.c old mode 100755 new mode 100644 index e3a92696fe..29376568b3 --- a/openair1/PHY/TOOLS/file_output.c +++ b/openair1/PHY/TOOLS/file_output.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef USER_MODE #include diff --git a/openair1/PHY/TOOLS/invSqrt.c b/openair1/PHY/TOOLS/invSqrt.c index 40a576eb30..a098fe728a 100644 --- a/openair1/PHY/TOOLS/invSqrt.c +++ b/openair1/PHY/TOOLS/invSqrt.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ static short lookup_table[1025] = {0x7fff, 0x16a0, 0x1000, 0xd10, 0xb50, 0xa1e, 0x93c, 0x88d, 0x800, 0x78a, 0x727, 0x6d2, 0x688, 0x646, 0x60c, 0x5d7, 0x5a8, 0x57c, 0x555, 0x530, 0x50f, 0x4f0, 0x4d2, 0x4b7, 0x49e, 0x486, 0x470, 0x45a, 0x446, 0x433, 0x421, 0x410, 0x400, 0x3f0, 0x3e1, 0x3d3, 0x3c5, 0x3b8, 0x3ab, 0x39f, 0x393, 0x388, 0x37d, 0x373, 0x369, 0x35f, 0x356, 0x34c, 0x344, 0x33b, 0x333, 0x32b, 0x323, 0x31b, 0x314, 0x30d, 0x306, 0x2ff, 0x2f8, 0x2f2, 0x2eb, 0x2e5, 0x2df, 0x2d9, 0x2d4, 0x2ce, 0x2c9, 0x2c3, 0x2be, 0x2b9, 0x2b4, 0x2af, 0x2aa, 0x2a5, 0x2a1, 0x29c, 0x298, 0x294, 0x28f, 0x28b, 0x287, 0x283, 0x27f, 0x27b, 0x278, 0x274, 0x270, 0x26d, 0x269, 0x266, 0x262, 0x25f, 0x25b, 0x258, 0x255, 0x252, 0x24f, 0x24c, 0x249, 0x246, 0x243, 0x240, 0x23d, 0x23a, 0x238, 0x235, 0x232, 0x22f, 0x22d, 0x22a, 0x228, 0x225, 0x223, 0x220, 0x21e, 0x21c, 0x219, 0x217, 0x215, 0x213, 0x210, 0x20e, 0x20c, 0x20a, 0x208, 0x206, 0x204, 0x202, 0x200, 0x1fe, 0x1fc, 0x1fa, 0x1f8, 0x1f6, 0x1f4, 0x1f2, 0x1f0, 0x1ee, 0x1ed, 0x1eb, 0x1e9, 0x1e7, 0x1e6, 0x1e4, 0x1e2, 0x1e1, 0x1df, 0x1dd, 0x1dc, 0x1da, 0x1d8, 0x1d7, 0x1d5, 0x1d4, 0x1d2, 0x1d1, 0x1cf, 0x1ce, 0x1cc, 0x1cb, 0x1c9, 0x1c8, 0x1c7, 0x1c5, 0x1c4, 0x1c2, 0x1c1, 0x1c0, 0x1be, 0x1bd, 0x1bc, 0x1ba, 0x1b9, 0x1b8, 0x1b7, 0x1b5, 0x1b4, 0x1b3, 0x1b2, 0x1b0, 0x1af, 0x1ae, 0x1ad, 0x1ac, 0x1ab, 0x1a9, 0x1a8, 0x1a7, 0x1a6, 0x1a5, 0x1a4, 0x1a3, 0x1a2, 0x1a0, 0x19f, 0x19e, 0x19d, 0x19c, 0x19b, 0x19a, 0x199, 0x198, 0x197, 0x196, 0x195, 0x194, 0x193, 0x192, 0x191, 0x190, 0x18f, 0x18e, 0x18d, 0x18c, 0x18b, 0x18b, 0x18a, 0x189, 0x188, 0x187, 0x186, 0x185, 0x184, 0x183, 0x183, 0x182, 0x181, 0x180, 0x17f, 0x17e, 0x17d, 0x17d, 0x17c, 0x17b, 0x17a, 0x179, 0x179, 0x178, 0x177, 0x176, 0x175, 0x175, 0x174, 0x173, 0x172, 0x172, 0x171, 0x170, 0x16f, 0x16f, 0x16e, 0x16d, 0x16c, 0x16c, 0x16b, 0x16a, 0x16a, 0x169, 0x168, 0x167, 0x167, 0x166, 0x165, 0x165, 0x164, 0x163, 0x163, 0x162, 0x161, 0x161, 0x160, 0x15f, 0x15f, 0x15e, 0x15d, 0x15d, 0x15c, 0x15c, 0x15b, 0x15a, 0x15a, 0x159, 0x158, 0x158, 0x157, 0x157, 0x156, 0x155, 0x155, 0x154, 0x154, 0x153, 0x152, 0x152, 0x151, 0x151, 0x150, 0x150, 0x14f, 0x14e, 0x14e, 0x14d, 0x14d, 0x14c, 0x14c, 0x14b, 0x14b, 0x14a, 0x14a, 0x149, 0x148, 0x148, 0x147, 0x147, 0x146, 0x146, 0x145, 0x145, 0x144, 0x144, 0x143, 0x143, 0x142, 0x142, 0x141, 0x141, 0x140, 0x140, 0x13f, 0x13f, 0x13e, 0x13e, 0x13d, 0x13d, 0x13c, 0x13c, 0x13c, 0x13b, 0x13b, 0x13a, 0x13a, 0x139, 0x139, 0x138, 0x138, 0x137, 0x137, 0x136, 0x136, 0x136, 0x135, 0x135, 0x134, 0x134, 0x133, 0x133, 0x133, 0x132, 0x132, 0x131, 0x131, 0x130, 0x130, 0x130, 0x12f, 0x12f, 0x12e, 0x12e, 0x12d, 0x12d, 0x12d, 0x12c, 0x12c, 0x12b, 0x12b, 0x12b, 0x12a, 0x12a, 0x129, 0x129, 0x129, 0x128, 0x128, 0x127, 0x127, 0x127, 0x126, 0x126, 0x126, 0x125, 0x125, 0x124, 0x124, 0x124, 0x123, 0x123, 0x123, 0x122, 0x122, 0x121, 0x121, 0x121, 0x120, 0x120, 0x120, 0x11f, 0x11f, 0x11f, 0x11e, 0x11e, 0x11e, 0x11d, 0x11d, 0x11d, 0x11c, 0x11c, 0x11c, 0x11b, 0x11b, 0x11a, 0x11a, 0x11a, 0x119, 0x119, 0x119, 0x118, 0x118, 0x118, 0x117, 0x117, 0x117, 0x117, 0x116, 0x116, 0x116, 0x115, 0x115, 0x115, 0x114, 0x114, 0x114, 0x113, 0x113, 0x113, 0x112, 0x112, 0x112, 0x111, 0x111, 0x111, 0x111, 0x110, 0x110, 0x110, 0x10f, 0x10f, 0x10f, 0x10e, 0x10e, 0x10e, 0x10e, 0x10d, 0x10d, 0x10d, 0x10c, 0x10c, 0x10c, 0x10c, 0x10b, 0x10b, 0x10b, 0x10a, 0x10a, 0x10a, 0x10a, 0x109, 0x109, 0x109, 0x108, 0x108, 0x108, 0x108, 0x107, 0x107, 0x107, 0x107, 0x106, 0x106, 0x106, 0x105, 0x105, 0x105, 0x105, 0x104, 0x104, 0x104, 0x104, 0x103, 0x103, 0x103, 0x103, 0x102, 0x102, 0x102, 0x102, 0x101, 0x101, 0x101, 0x101, 0x100, 0x100, 0x100, 0x100, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf7, 0xf7, 0xf7, 0xf7, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5}; short invSqrt(short x) diff --git a/openair1/PHY/TOOLS/log2_approx.c b/openair1/PHY/TOOLS/log2_approx.c index bfff65cb03..9870d35067 100644 --- a/openair1/PHY/TOOLS/log2_approx.c +++ b/openair1/PHY/TOOLS/log2_approx.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned char log2_approx(unsigned int x) { diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 1bdcb3ad60..877183c875 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any lat_er version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef USER_MODE #include #include diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 4b623fb9dc..0f6c0f0c28 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Form definition file generated by fdesign */ #include diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h index 877934fc7a..77fcf8ea84 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.h +++ b/openair1/PHY/TOOLS/lte_phy_scope.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Header file generated by fdesign on Tue Nov 13 09:42:50 2012 */ #ifndef FD_lte_scope_h_ diff --git a/openair1/PHY/TOOLS/lut.c b/openair1/PHY/TOOLS/lut.c index 5e6602c7f2..f0a5db11ab 100644 --- a/openair1/PHY/TOOLS/lut.c +++ b/openair1/PHY/TOOLS/lut.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ double interp(double x, double *xs, double *ys, int count) { int i; diff --git a/openair1/PHY/TOOLS/memory_routines.c b/openair1/PHY/TOOLS/memory_routines.c old mode 100755 new mode 100644 index 4da4d89cb6..6c9a4be610 --- a/openair1/PHY/TOOLS/memory_routines.c +++ b/openair1/PHY/TOOLS/memory_routines.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/sse_intrin.h" void Zero_Buffer(void *buf,unsigned int length) diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c old mode 100755 new mode 100644 index 373fdc0d90..8b66eb2678 --- a/openair1/PHY/TOOLS/signal_energy.c +++ b/openair1/PHY/TOOLS/signal_energy.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/TOOLS/smbv.c b/openair1/PHY/TOOLS/smbv.c index b7de63f483..9daa725330 100644 --- a/openair1/PHY/TOOLS/smbv.c +++ b/openair1/PHY/TOOLS/smbv.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* This library offers some functions to remotely program the R&S SMBV100A. */ diff --git a/openair1/PHY/TOOLS/smbv.h b/openair1/PHY/TOOLS/smbv.h index c52b50f038..a89f38d6a2 100644 --- a/openair1/PHY/TOOLS/smbv.h +++ b/openair1/PHY/TOOLS/smbv.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* This library offers some functions to remotely program the R&S SMBV100A. */ diff --git a/openair1/PHY/TOOLS/sqrt.c b/openair1/PHY/TOOLS/sqrt.c old mode 100755 new mode 100644 index 247cfa138f..bca05b5a50 --- a/openair1/PHY/TOOLS/sqrt.c +++ b/openair1/PHY/TOOLS/sqrt.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ //---------------------------------------------- // // Integer square root. Take the square root of an integer. diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c index ba1014e9a0..07b4b0172d 100644 --- a/openair1/PHY/TOOLS/time_meas.c +++ b/openair1/PHY/TOOLS/time_meas.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include "time_meas.h" #include diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index 3e621ac281..9397a5e0f1 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __TIME_MEAS_DEFS__H__ #define __TIME_MEAS_DEFS__H__ diff --git a/openair1/PHY/TOOLS/twiddle12288.h b/openair1/PHY/TOOLS/twiddle12288.h index bc1226c67e..4214d00084 100644 --- a/openair1/PHY/TOOLS/twiddle12288.h +++ b/openair1/PHY/TOOLS/twiddle12288.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:4095)/12288)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:8190)/12288)); diff --git a/openair1/PHY/TOOLS/twiddle1536.h b/openair1/PHY/TOOLS/twiddle1536.h index b74534aabf..8eb6b8e565 100644 --- a/openair1/PHY/TOOLS/twiddle1536.h +++ b/openair1/PHY/TOOLS/twiddle1536.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include /* Twiddles generated with diff --git a/openair1/PHY/TOOLS/twiddle24576.h b/openair1/PHY/TOOLS/twiddle24576.h index 46cdb97a5b..01af22474f 100644 --- a/openair1/PHY/TOOLS/twiddle24576.h +++ b/openair1/PHY/TOOLS/twiddle24576.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:8191)/24576)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:16382)/24576)); diff --git a/openair1/PHY/TOOLS/twiddle6144.h b/openair1/PHY/TOOLS/twiddle6144.h index 3f9c3684dc..324f5a2a3d 100644 --- a/openair1/PHY/TOOLS/twiddle6144.h +++ b/openair1/PHY/TOOLS/twiddle6144.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:2047)/6144)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:4094)/6144)); diff --git a/openair1/PHY/TOOLS/vars.h b/openair1/PHY/TOOLS/vars.h index 7f3cc6e31f..e69de29bb2 100644 --- a/openair1/PHY/TOOLS/vars.h +++ b/openair1/PHY/TOOLS/vars.h @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h old mode 100755 new mode 100644 index 26239b024c..74e14eb97b --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/defs.h \brief Top-level defines and structure definitions \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h old mode 100755 new mode 100644 index 4c9e2706c7..2786a5d7ab --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __PHY_EXTERN_H__ #define __PHY_EXTERN_H__ diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 7c38048a55..cf48dba322 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/impl_defs_lte.h * \brief LTE Physical channel configuration and variable structure definitions * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h old mode 100755 new mode 100644 index 98615d6f6e..1c1844aa46 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/impl_defs_top.h * \brief More defines and structure definitions * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/sse_intrin.h b/openair1/PHY/sse_intrin.h index dbeb21dff1..8857c424ca 100644 --- a/openair1/PHY/sse_intrin.h +++ b/openair1/PHY/sse_intrin.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 2015 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file PHY/sse_intrin.h * \brief SSE includes and compatibility functions. * diff --git a/openair1/PHY/types.h b/openair1/PHY/types.h old mode 100755 new mode 100644 index 7a362c5270..868ccb0743 --- a/openair1/PHY/types.h +++ b/openair1/PHY/types.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __openair_TYPES_H__ #define __openair_TYPES_H__ diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h old mode 100755 new mode 100644 index 3d940d4a94..1e33624ace --- a/openair1/PHY/vars.h +++ b/openair1/PHY/vars.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __PHY_VARS_H__ #define __PHY_VARS_H__ diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 29fb7c37e8..4a4a068e1c 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* \author R. Knopp, F. Kaltenberger \company EURECOM diff --git a/openair1/SCHED/extern.h b/openair1/SCHED/extern.h index dd3892a290..3875298d19 100644 --- a/openair1/SCHED/extern.h +++ b/openair1/SCHED/extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*!\brief SCHED external variables */ #ifndef __SCHED_EXTERN_H__ diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index a7da9f9cc5..bf6f14be13 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file phy_mac_stub.c * \brief stimulates the phy without mac * \author R. Knopp, F. Kaltenberger, N. Nikaein diff --git a/openair1/SCHED/phy_procedures_emos.h b/openair1/SCHED/phy_procedures_emos.h index b34730bddb..fe7991ca1b 100644 --- a/openair1/SCHED/phy_procedures_emos.h +++ b/openair1/SCHED/phy_procedures_emos.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __PHY_PROCEDURES_EMOS_H__ #define __PHY_PROCEDURES_EMOS_H__ diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c old mode 100755 new mode 100644 index e56606e262..8ea93cac50 --- a/openair1/SCHED/phy_procedures_lte_common.c +++ b/openair1/SCHED/phy_procedures_lte_common.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file phy_procedures_lte_eNB.c * \brief Implementation of common utilities for eNB/UE procedures from 36.213 LTE specifications * \author R. Knopp, F. Kaltenberger diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c old mode 100755 new mode 100644 index 77a993578a..454b57a834 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1,33 +1,4 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file phy_procedures_lte_eNB.c * \brief Implementation of eNB procedures from 36.213 LTE specifications * \author R. Knopp, F. Kaltenberger, N. Nikaein diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c old mode 100755 new mode 100644 index ac09ac77b3..c751df0916 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file phy_procedures_lte_ue.c * \brief Implementation of UE procedures from 36.213 LTE specifications * \author R. Knopp, F. Kaltenberger, N. Nikaein diff --git a/openair1/SCHED/pucch_pc.c b/openair1/SCHED/pucch_pc.c index afcf4bd5b3..ad20e6ab05 100644 --- a/openair1/SCHED/pucch_pc.c +++ b/openair1/SCHED/pucch_pc.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pusch_pc.c * \brief Implementation of UE PUSCH Power Control procedures from 36.213 LTE specifications (Section * \author R. Knopp diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c index 5fb1f7449c..9591045041 100644 --- a/openair1/SCHED/pusch_pc.c +++ b/openair1/SCHED/pusch_pc.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pusch_pc.c * \brief Implementation of UE PUSCH Power Control procedures from 36.213 LTE specifications (Section * \author R. Knopp diff --git a/openair1/SCHED/rt_compat.h b/openair1/SCHED/rt_compat.h old mode 100755 new mode 100644 index 14b5e8cb52..f387bb9eba --- a/openair1/SCHED/rt_compat.h +++ b/openair1/SCHED/rt_compat.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Header file for making PLATON work on both RTLinux and RTAI using pthreads * Copyright Frank Wartena, 2004 * Version: 0.1 January 28th, 2004 ## First version for scheduling test diff --git a/openair1/SCHED/vars.h b/openair1/SCHED/vars.h index 532251a2f0..65501a05b1 100644 --- a/openair1/SCHED/vars.h +++ b/openair1/SCHED/vars.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" OPENAIR_DAQ_VARS openair_daq_vars; diff --git a/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c b/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c index 0ced6e0ceb..31f39d3836 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file bypass_session_layer.h * \brief implementation of emultor tx and rx * \author Navid Nikaein and Raymond Knopp diff --git a/openair1/SIMULATION/ETH_TRANSPORT/defs.h b/openair1/SIMULATION/ETH_TRANSPORT/defs.h old mode 100755 new mode 100644 index 790a0adc2d..8da6bb0a05 --- a/openair1/SIMULATION/ETH_TRANSPORT/defs.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file phy_emulation.h * \brief specifies the data structure and variable for phy emulation * \author Navid Nikaein, Raymomd Knopp and Hicham Anouar diff --git a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c index ec15e7c668..57c8f21587 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file phy_emulation.c * \brief implements the underlying protocol for emulated data exchange over Ethernet using IP multicast * \author Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/extern.h b/openair1/SIMULATION/ETH_TRANSPORT/extern.h old mode 100755 new mode 100644 index c368fa7229..9930a74152 --- a/openair1/SIMULATION/ETH_TRANSPORT/extern.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file extern.h * \brief specifies the extern variables for phy emulation * \author Navid Nikaein and Raymomd Knopp and Hicham Anouar diff --git a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c old mode 100755 new mode 100644 index b919d979d8..4f56c1dff5 --- a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file multicast.h * \brief * \author Lionel Gauthier and Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h old mode 100755 new mode 100644 index 0ac2ceb336..ca109ca90b --- a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file multicast.h * \brief * \author Lionel Gauthier and Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c index d7fc98348c..d321b6268b 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file netlink_init.c * \brief initiate the netlink socket for communication with nas dirver * \author Navid Nikaein and Raymomd Knopp diff --git a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c index e76b50f61b..22fc1c0bbd 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file pgm_link.c * \brief implementation a warpper for openpgm for reliable multicast transmission * \author Navid Nikaein and S. Roux diff --git a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h index 6fc14fdc99..81942bd4c1 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef PGM_LINK_H_ #define PGM_LINK_H_ diff --git a/openair1/SIMULATION/ETH_TRANSPORT/proto.h b/openair1/SIMULATION/ETH_TRANSPORT/proto.h index aa87a53ab7..304c6e0842 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/proto.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/proto.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file proto.h * \brief * \author Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.c b/openair1/SIMULATION/ETH_TRANSPORT/socket.c old mode 100755 new mode 100644 index 39195c2206..295a65e104 --- a/openair1/SIMULATION/ETH_TRANSPORT/socket.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file socket.c * \brief * \author Lionel Gauthier diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.h b/openair1/SIMULATION/ETH_TRANSPORT/socket.h old mode 100755 new mode 100644 index a1cc11e5c2..2543928061 --- a/openair1/SIMULATION/ETH_TRANSPORT/socket.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file socket.h * \brief * \author Lionel Gauthier diff --git a/openair1/SIMULATION/ETH_TRANSPORT/vars.h b/openair1/SIMULATION/ETH_TRANSPORT/vars.h old mode 100755 new mode 100644 index fecf347d28..fdf457a0dd --- a/openair1/SIMULATION/ETH_TRANSPORT/vars.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/vars.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file vars.h * \brief specifies the variables for phy emulation * \author Navid Nikaein and Raymomd Knopp and Hicham Anouar diff --git a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c index cf6f81597f..3a9e12151c 100644 --- a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c +++ b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h index ee5eeb5ae5..0cdd884f73 100644 --- a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h +++ b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 02fe3f1d29..d376508596 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file dlsim.c \brief Top-level DL simulator \author R. Knopp diff --git a/openair1/SIMULATION/LTE_PHY/framegen.c b/openair1/SIMULATION/LTE_PHY/framegen.c index 578fec7d0e..9894539862 100644 --- a/openair1/SIMULATION/LTE_PHY/framegen.c +++ b/openair1/SIMULATION/LTE_PHY/framegen.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.c b/openair1/SIMULATION/LTE_PHY/gpib_send.c index fd9543aa21..64ba15dfc5 100644 --- a/openair1/SIMULATION/LTE_PHY/gpib_send.c +++ b/openair1/SIMULATION/LTE_PHY/gpib_send.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.h b/openair1/SIMULATION/LTE_PHY/gpib_send.h index 4cc568edc8..5402ada9a5 100644 --- a/openair1/SIMULATION/LTE_PHY/gpib_send.h +++ b/openair1/SIMULATION/LTE_PHY/gpib_send.h @@ -1,29 +1 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ void gpib_send(unsigned int gpib_board, unsigned int gpib_device, char* command_string); diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 8e19bd86db..2eedb50869 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index b25b45cf14..4e7a7a1d63 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 655a7e2b62..482e88dab2 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c index 37fc3a6a10..1ce329fc6a 100644 --- a/openair1/SIMULATION/LTE_PHY/prachsim.c +++ b/openair1/SIMULATION/LTE_PHY/prachsim.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h b/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h index 0fd3dd752d..c743949238 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h +++ b/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c b/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c index ce04cb9539..30f8cf0cf0 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index 614cad4898..251af3a5ce 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/scansim.c b/openair1/SIMULATION/LTE_PHY/scansim.c index 2cbb7b3e32..0bc48ec4dd 100644 --- a/openair1/SIMULATION/LTE_PHY/scansim.c +++ b/openair1/SIMULATION/LTE_PHY/scansim.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/signalanalyzer.c b/openair1/SIMULATION/LTE_PHY/signalanalyzer.c index 2167f52abb..90c372e556 100644 --- a/openair1/SIMULATION/LTE_PHY/signalanalyzer.c +++ b/openair1/SIMULATION/LTE_PHY/signalanalyzer.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/signalanalyzer.h b/openair1/SIMULATION/LTE_PHY/signalanalyzer.h index d3d82c8aaa..169f6cdc7c 100644 --- a/openair1/SIMULATION/LTE_PHY/signalanalyzer.h +++ b/openair1/SIMULATION/LTE_PHY/signalanalyzer.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c index 45b69adcc5..b46c7a7282 100644 --- a/openair1/SIMULATION/LTE_PHY/syncsim.c +++ b/openair1/SIMULATION/LTE_PHY/syncsim.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/test.c b/openair1/SIMULATION/LTE_PHY/test.c index abaf917f7a..a4350718b9 100644 --- a/openair1/SIMULATION/LTE_PHY/test.c +++ b/openair1/SIMULATION/LTE_PHY/test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include "SIMULATION/TOOLS/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c index e2a99dd7a4..67f7bc4bcd 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c +++ b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h index d8d143817c..8d9f611bc4 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h +++ b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 56f8eb146a..c72af4a4c4 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file ulsim.c \brief Top-level DL simulator \author R. Knopp diff --git a/openair1/SIMULATION/LTE_PHY/ulsim2.c b/openair1/SIMULATION/LTE_PHY/ulsim2.c index b6b1852c07..8beb71453b 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim2.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim2.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include "SIMULATION/TOOLS/defs.h" diff --git a/openair1/SIMULATION/RF/adc.c b/openair1/SIMULATION/RF/adc.c old mode 100755 new mode 100644 index 6dc1c7f8e6..8690d85a4f --- a/openair1/SIMULATION/RF/adc.c +++ b/openair1/SIMULATION/RF/adc.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ void adc(double **r_re, double **r_im, unsigned int input_offset, diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c old mode 100755 new mode 100644 index 22e286a496..38c79a78ff --- a/openair1/SIMULATION/RF/dac.c +++ b/openair1/SIMULATION/RF/dac.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ //#define DEBUG_DAC 1 #include #include diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/defs.h index 984dfa6ca8..76a4e7ac1a 100644 --- a/openair1/SIMULATION/RF/defs.h +++ b/openair1/SIMULATION/RF/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /** \brief Apply RF impairments to received signal @param r_re Double two-dimensional array of Real part of received signal @param r_im Double two-dimensional array of Imag part of received signal diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c index 1f240595aa..c4c0268fd6 100644 --- a/openair1/SIMULATION/RF/rf.c +++ b/openair1/SIMULATION/RF/rf.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ //#include "defs.h" #include #include diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c index 591b238acf..27b37989d0 100644 --- a/openair1/SIMULATION/TOOLS/abstraction.c +++ b/openair1/SIMULATION/TOOLS/abstraction.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/ch_desc_proto.c b/openair1/SIMULATION/TOOLS/ch_desc_proto.c old mode 100755 new mode 100644 index 80a491888c..3e9a8b5572 --- a/openair1/SIMULATION/TOOLS/ch_desc_proto.c +++ b/openair1/SIMULATION/TOOLS/ch_desc_proto.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h index c72ea743b1..4144e7106c 100644 --- a/openair1/SIMULATION/TOOLS/defs.h +++ b/openair1/SIMULATION/TOOLS/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __SIMULATION_TOOLS_DEFS_H__ #define __SIMULATION_TOOLS_DEFS_H__ #include "PHY/defs.h" diff --git a/openair1/SIMULATION/TOOLS/gauss.c b/openair1/SIMULATION/TOOLS/gauss.c index 9c3a431bef..1c63e5a66a 100644 --- a/openair1/SIMULATION/TOOLS/gauss.c +++ b/openair1/SIMULATION/TOOLS/gauss.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/llr_quantization.c b/openair1/SIMULATION/TOOLS/llr_quantization.c index e8b4696ba6..b97fa17a3d 100644 --- a/openair1/SIMULATION/TOOLS/llr_quantization.c +++ b/openair1/SIMULATION/TOOLS/llr_quantization.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ //#include #include //#include diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c index 9a72ca6423..9ad9e2262f 100644 --- a/openair1/SIMULATION/TOOLS/multipath_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_channel.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c index 3568545f29..fb9bc76772 100644 --- a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 417ff29162..6f434935a8 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c index 24de0468c3..b1ae5535b4 100644 --- a/openair1/SIMULATION/TOOLS/rangen_double.c +++ b/openair1/SIMULATION/TOOLS/rangen_double.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef USER_MODE #include #include diff --git a/openair1/SIMULATION/TOOLS/scm_corrmat.h b/openair1/SIMULATION/TOOLS/scm_corrmat.h index 61fd6a6e11..5cc137b2eb 100644 --- a/openair1/SIMULATION/TOOLS/scm_corrmat.h +++ b/openair1/SIMULATION/TOOLS/scm_corrmat.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ double R22_sqrt[6][32] = { {0.921700, -0.000000, 0.010380, -0.027448, -0.250153, 0.294754, 0.005961, 0.010769, 0.010380, 0.027448, 0.921700, 0.000000, -0.011595, -0.004130, -0.250153, 0.294754, -0.250153, -0.294754, -0.011595, 0.004130, 0.921700, 0.000000, 0.010380, -0.027448, 0.005961, -0.010769, -0.250153, -0.294754, 0.010380, 0.027448, 0.921700, 0.000000}, {0.923810, 0.000000, 0.004069, 0.027832, 0.151730, 0.350180, -0.009882, 0.006114, 0.004069, -0.027832, 0.923810, 0.000000, 0.011218, -0.003029, 0.151730, 0.350180, 0.151730, -0.350180, 0.011218, 0.003029, 0.923810, -0.000000, 0.004069, 0.027832, -0.009882, -0.006114, 0.151730, -0.350180, 0.004069, -0.027832, 0.923810, 0.000000}, diff --git a/openair1/SIMULATION/TOOLS/taus.c b/openair1/SIMULATION/TOOLS/taus.c index 9a2a6f44b3..7fc15781c7 100644 --- a/openair1/SIMULATION/TOOLS/taus.c +++ b/openair1/SIMULATION/TOOLS/taus.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef USER_MODE #include #include diff --git a/openair2/COMMON/as_message.h b/openair2/COMMON/as_message.h index 30810a325e..bd20b1257c 100644 --- a/openair2/COMMON/as_message.h +++ b/openair2/COMMON/as_message.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - /***************************************************************************** Source as_message.h diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h index 64216b0094..0e4948c618 100644 --- a/openair2/COMMON/commonDef.h +++ b/openair2/COMMON/commonDef.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /* Source commonDef.h diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h old mode 100755 new mode 100644 index 0e93a917ab..bd4f972965 --- a/openair2/COMMON/gtpv1_u_messages_def.h +++ b/openair2/COMMON/gtpv1_u_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - MESSAGE_DEF(GTPV1U_ENB_UPDATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_update_tunnel_req_t, Gtpv1uUpdateTunnelReq) MESSAGE_DEF(GTPV1U_ENB_UPDATE_TUNNEL_RESP, MESSAGE_PRIORITY_MED, gtpv1u_enb_update_tunnel_resp_t, Gtpv1uUpdateTunnelResp) MESSAGE_DEF(GTPV1U_ENB_DELETE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_delete_tunnel_req_t, Gtpv1uDeleteTunnelReq) diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h old mode 100755 new mode 100644 index 2a6dd1bf2c..0f297949e0 --- a/openair2/COMMON/gtpv1_u_messages_types.h +++ b/openair2/COMMON/gtpv1_u_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef GTPV1_U_MESSAGES_TYPES_H_ #define GTPV1_U_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/intertask_interface_conf.h b/openair2/COMMON/intertask_interface_conf.h index 9d6a7f9d99..4f5494b4dd 100644 --- a/openair2/COMMON/intertask_interface_conf.h +++ b/openair2/COMMON/intertask_interface_conf.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * intertask_interface_conf.h * diff --git a/openair2/COMMON/mac_messages_def.h b/openair2/COMMON/mac_messages_def.h index 64aca9911c..e6d4db0fa8 100644 --- a/openair2/COMMON/mac_messages_def.h +++ b/openair2/COMMON/mac_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * mac_messages_def.h * diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h index ecc8c67533..83d6e28655 100644 --- a/openair2/COMMON/mac_messages_types.h +++ b/openair2/COMMON/mac_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * mac_messages_types.h * diff --git a/openair2/COMMON/mac_primitives.h b/openair2/COMMON/mac_primitives.h index a8fc149f47..9434eb02c9 100644 --- a/openair2/COMMON/mac_primitives.h +++ b/openair2/COMMON/mac_primitives.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef __MAC_PRIMITIVES_H__ #define __MAC_PRIMITIVES_H__ diff --git a/openair2/COMMON/mac_rlc_primitives.h b/openair2/COMMON/mac_rlc_primitives.h index 62913bd842..a2ede949eb 100644 --- a/openair2/COMMON/mac_rlc_primitives.h +++ b/openair2/COMMON/mac_rlc_primitives.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** mac_rlc_primitives.h - description ------------------- diff --git a/openair2/COMMON/mac_rrc_primitives.h b/openair2/COMMON/mac_rrc_primitives.h index b7f1450909..3891488e79 100644 --- a/openair2/COMMON/mac_rrc_primitives.h +++ b/openair2/COMMON/mac_rrc_primitives.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - #ifndef __MAC_RRC_PRIMITIVES_H__ # define __MAC_RRC_PRIMITIVES_H__ diff --git a/openair2/COMMON/messages_def.h b/openair2/COMMON/messages_def.h index 246aa855ec..04d6a65fe6 100644 --- a/openair2/COMMON/messages_def.h +++ b/openair2/COMMON/messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" #include "timer_messages_def.h" diff --git a/openair2/COMMON/messages_types.h b/openair2/COMMON/messages_types.h index b1ff6c3b18..fa14f2fa7c 100644 --- a/openair2/COMMON/messages_types.h +++ b/openair2/COMMON/messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * messages_types.h * diff --git a/openair2/COMMON/nas_messages_def.h b/openair2/COMMON/nas_messages_def.h index 0e70564aa9..20ea454427 100644 --- a/openair2/COMMON/nas_messages_def.h +++ b/openair2/COMMON/nas_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * nas_messages_def.h * diff --git a/openair2/COMMON/nas_messages_types.h b/openair2/COMMON/nas_messages_types.h index 2251444a01..b9a26f69e7 100644 --- a/openair2/COMMON/nas_messages_types.h +++ b/openair2/COMMON/nas_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * nas_messages_types.h * diff --git a/openair2/COMMON/networkDef.h b/openair2/COMMON/networkDef.h index 46716bee24..7659076f51 100644 --- a/openair2/COMMON/networkDef.h +++ b/openair2/COMMON/networkDef.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /***************************************************************************** Source networkDef.h diff --git a/openair2/COMMON/openair_defs.h b/openair2/COMMON/openair_defs.h old mode 100755 new mode 100644 index c2dd4d0616..40e296e181 --- a/openair2/COMMON/openair_defs.h +++ b/openair2/COMMON/openair_defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef __openair_DEFS_H__ #define __openair_DEFS_H__ diff --git a/openair2/COMMON/openair_types.h b/openair2/COMMON/openair_types.h old mode 100755 new mode 100644 index 47f217038d..053a8427b2 --- a/openair2/COMMON/openair_types.h +++ b/openair2/COMMON/openair_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef __openair_TYPES_H__ #define __openair_TYPES_H__ diff --git a/openair2/COMMON/pdcp_messages_def.h b/openair2/COMMON/pdcp_messages_def.h index 28cda8bc1b..9c06d13359 100644 --- a/openair2/COMMON/pdcp_messages_def.h +++ b/openair2/COMMON/pdcp_messages_def.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /* * pdcp_messages_def.h * diff --git a/openair2/COMMON/pdcp_messages_types.h b/openair2/COMMON/pdcp_messages_types.h index fc239f529f..a926b36187 100644 --- a/openair2/COMMON/pdcp_messages_types.h +++ b/openair2/COMMON/pdcp_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * pdcp_messages_types.h * diff --git a/openair2/COMMON/phy_messages_def.h b/openair2/COMMON/phy_messages_def.h index bc63c28ac3..ae7204f2a0 100644 --- a/openair2/COMMON/phy_messages_def.h +++ b/openair2/COMMON/phy_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * mphy_messages_def.h * diff --git a/openair2/COMMON/phy_messages_types.h b/openair2/COMMON/phy_messages_types.h index b8ef212f31..808a5f3730 100644 --- a/openair2/COMMON/phy_messages_types.h +++ b/openair2/COMMON/phy_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * phy_messages_types.h * diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h old mode 100755 new mode 100644 index ed052fc608..f4aeb18f95 --- a/openair2/COMMON/platform_constants.h +++ b/openair2/COMMON/platform_constants.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* platform_constants.h ------------------- diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h old mode 100755 new mode 100644 index 670b191c0b..4086b7028a --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* platform_types.h ------------------- diff --git a/openair2/COMMON/ral_messages_def.h b/openair2/COMMON/ral_messages_def.h old mode 100755 new mode 100644 index 59719663fe..feb0ddd9d9 --- a/openair2/COMMON/ral_messages_def.h +++ b/openair2/COMMON/ral_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - MESSAGE_DEF(RRC_RAL_SYSTEM_CONFIGURATION_IND, MESSAGE_PRIORITY_MED, rrc_ral_system_configuration_ind_t, rrc_ral_system_configuration_ind) MESSAGE_DEF(RRC_RAL_SYSTEM_INFORMATION_IND, MESSAGE_PRIORITY_MED, rrc_ral_system_information_ind_t, rrc_ral_system_information_ind) diff --git a/openair2/COMMON/ral_messages_types.h b/openair2/COMMON/ral_messages_types.h old mode 100755 new mode 100644 index 234304004d..01e202546f --- a/openair2/COMMON/ral_messages_types.h +++ b/openair2/COMMON/ral_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef RAL_MESSAGES_TYPES_H_ #define RAL_MESSAGES_TYPES_H_ #include "asn1_constants.h" diff --git a/openair2/COMMON/rlc_messages_def.h b/openair2/COMMON/rlc_messages_def.h old mode 100755 new mode 100644 index 990648eff6..93e3030807 --- a/openair2/COMMON/rlc_messages_def.h +++ b/openair2/COMMON/rlc_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * rlc_messages_def.h * diff --git a/openair2/COMMON/rlc_messages_types.h b/openair2/COMMON/rlc_messages_types.h old mode 100755 new mode 100644 index 1399dadade..9c32946a16 --- a/openair2/COMMON/rlc_messages_types.h +++ b/openair2/COMMON/rlc_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * rlc_messages_types.h * diff --git a/openair2/COMMON/rrc_messages_def.h b/openair2/COMMON/rrc_messages_def.h index 27d3a6bdd4..852736c4f8 100644 --- a/openair2/COMMON/rrc_messages_def.h +++ b/openair2/COMMON/rrc_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * rrc_messages_def.h * diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index ffe194265f..826123d832 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * rrc_messages_types.h * diff --git a/openair2/COMMON/rrm_config_structs.h b/openair2/COMMON/rrm_config_structs.h old mode 100755 new mode 100644 index 55443f497e..9062a98f6c --- a/openair2/COMMON/rrm_config_structs.h +++ b/openair2/COMMON/rrm_config_structs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* rrm_config_structs.h ------------------- diff --git a/openair2/COMMON/rrm_constants.h b/openair2/COMMON/rrm_constants.h old mode 100755 new mode 100644 index e12608feb2..29b0d9d9ea --- a/openair2/COMMON/rrm_constants.h +++ b/openair2/COMMON/rrm_constants.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* rrm_constants.h ------------------- diff --git a/openair2/COMMON/rtos_header.h b/openair2/COMMON/rtos_header.h old mode 100755 new mode 100644 index ea2783ee6f..f22c34e624 --- a/openair2/COMMON/rtos_header.h +++ b/openair2/COMMON/rtos_header.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _RTOS_HEADER_H_ # define _RTOS_HEADER_H_ # if defined(RTAI) && !defined(USER_MODE) diff --git a/openair2/COMMON/s1ap_messages_def.h b/openair2/COMMON/s1ap_messages_def.h index e2012a91c5..a186de2c0b 100644 --- a/openair2/COMMON/s1ap_messages_def.h +++ b/openair2/COMMON/s1ap_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* Messages for S1AP logging */ MESSAGE_DEF(S1AP_UPLINK_NAS_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_uplink_nas_log) MESSAGE_DEF(S1AP_UE_CAPABILITY_IND_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_capability_ind_log) diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h index 56091c0c36..712c8920aa 100644 --- a/openair2/COMMON/s1ap_messages_types.h +++ b/openair2/COMMON/s1ap_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef S1AP_MESSAGES_TYPES_H_ #define S1AP_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/sctp_messages_def.h b/openair2/COMMON/sctp_messages_def.h index 8053f47ec9..c872a0fcfa 100644 --- a/openair2/COMMON/sctp_messages_def.h +++ b/openair2/COMMON/sctp_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - MESSAGE_DEF(SCTP_NEW_ASSOCIATION_REQ , MESSAGE_PRIORITY_MED, sctp_new_association_req_t , sctp_new_association_req) MESSAGE_DEF(SCTP_NEW_ASSOCIATION_RESP, MESSAGE_PRIORITY_MED, sctp_new_association_resp_t , sctp_new_association_resp) MESSAGE_DEF(SCTP_NEW_ASSOCIATION_IND , MESSAGE_PRIORITY_MED, sctp_new_association_ind_t , sctp_new_association_ind) diff --git a/openair2/COMMON/sctp_messages_types.h b/openair2/COMMON/sctp_messages_types.h index 490e39a8c7..7f01960d2e 100644 --- a/openair2/COMMON/sctp_messages_types.h +++ b/openair2/COMMON/sctp_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef SCTP_MESSAGES_TYPES_H_ #define SCTP_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/tasks_def.h b/openair2/COMMON/tasks_def.h index 5e0f8bd211..53a531ff20 100644 --- a/openair2/COMMON/tasks_def.h +++ b/openair2/COMMON/tasks_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MAX, 10) diff --git a/openair2/COMMON/udp_messages_def.h b/openair2/COMMON/udp_messages_def.h old mode 100755 new mode 100644 index a6341ec880..08e98b801e --- a/openair2/COMMON/udp_messages_def.h +++ b/openair2/COMMON/udp_messages_def.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - MESSAGE_DEF(UDP_INIT, MESSAGE_PRIORITY_MED, udp_init_t, udp_init) MESSAGE_DEF(UDP_DATA_REQ, MESSAGE_PRIORITY_MED, udp_data_req_t, udp_data_req) MESSAGE_DEF(UDP_DATA_IND, MESSAGE_PRIORITY_MED, udp_data_ind_t, udp_data_ind) diff --git a/openair2/COMMON/udp_messages_types.h b/openair2/COMMON/udp_messages_types.h old mode 100755 new mode 100644 index 9491fab65f..d609cb8d14 --- a/openair2/COMMON/udp_messages_types.h +++ b/openair2/COMMON/udp_messages_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef UDP_MESSAGES_TYPES_H_ #define UDP_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/x2ap_messages_def.h b/openair2/COMMON/x2ap_messages_def.h index 4e5bef69d5..e69de29bb2 100644 --- a/openair2/COMMON/x2ap_messages_def.h +++ b/openair2/COMMON/x2ap_messages_def.h @@ -1,29 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h index 4e22149f3b..e69de29bb2 100644 --- a/openair2/COMMON/x2ap_messages_types.h +++ b/openair2/COMMON/x2ap_messages_types.h @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ diff --git a/openair2/DOCS/TEMPLATES/CODE/example_doxy.h b/openair2/DOCS/TEMPLATES/CODE/example_doxy.h index 876448ac8c..62656eda1b 100644 --- a/openair2/DOCS/TEMPLATES/CODE/example_doxy.h +++ b/openair2/DOCS/TEMPLATES/CODE/example_doxy.h @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file doxy_template.h * \brief explain how this block is organized, and how it works * \author Navid Nikaein diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index f756dc9ea2..581f69274b 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* enb_app.c ------------------- diff --git a/openair2/ENB_APP/enb_app.h b/openair2/ENB_APP/enb_app.h index 30e3373eac..da276d870a 100644 --- a/openair2/ENB_APP/enb_app.h +++ b/openair2/ENB_APP/enb_app.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* enb_app.h ------------------- diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c old mode 100755 new mode 100644 index 58ce97d3e4..accb2e8153 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* enb_config.c ------------------- diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h old mode 100755 new mode 100644 index 4bdaf67514..ad22b42bab --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* enb_config.h ------------------- diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 2c5a0799d2..a50cb84b38 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file config.c * \brief UE and eNB configuration performed by RRC or as a consequence of RRC procedures * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 713c9d967c..b90184f157 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file LAYER2/MAC/defs.h * \brief MAC data structures, constant, and function prototype * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index a6c4eaeb16..5a087495f9 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file eNB_scheduler.c * \brief eNB scheduler top level function operates on per subframe basis * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index c3a2aea0a5..c8d2b00e7b 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file eNB_scheduler_RA.c * \brief primitives used for random access * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_bch.c b/openair2/LAYER2/MAC/eNB_scheduler_bch.c index f3774777a1..3c15942b6f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_bch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_bch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file eNB_scheduler_bch.c * \brief procedures related to eNB for the BCH transport channel * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 61a0357691..a55b8ff66d 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file eNB_scheduler_dlsch.c * \brief procedures related to eNB for the DLSCH transport channel * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index a6926e15ad..d2b4790063 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file eNB_scheduler_mch.c * \brief procedures related to eNB for the MCH transport channel * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 54eedb4926..3e7f93d9ce 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file eNB_scheduler_primitives.c * \brief primitives used by eNB for BCH, RACH, ULSCH, DLSCH scheduling * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index f0ad4ee3ee..00be1b6b78 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file eNB_scheduler_ulsch.c * \brief eNB procedures for the ULSCH transport channel * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/extern.h b/openair2/LAYER2/MAC/extern.h index ca847acf4c..7c5748d38f 100644 --- a/openair2/LAYER2/MAC/extern.h +++ b/openair2/LAYER2/MAC/extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file extern.h * \brief mac externs * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/l1_helpers.c b/openair2/LAYER2/MAC/l1_helpers.c index 44bdbfe00e..e923fc505d 100644 --- a/openair2/LAYER2/MAC/l1_helpers.c +++ b/openair2/LAYER2/MAC/l1_helpers.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file l1_helper.c * \brief phy helper function * \author Navid Nikaein, Raymond Knopp diff --git a/openair2/LAYER2/MAC/lte_transport_init.c b/openair2/LAYER2/MAC/lte_transport_init.c old mode 100755 new mode 100644 index fa446a4aee..90fb4a8072 --- a/openair2/LAYER2/MAC/lte_transport_init.c +++ b/openair2/LAYER2/MAC/lte_transport_init.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #define UL_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,24) #define BCCH_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,4) #define RA_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,4) diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index d5a445744d..a016719924 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file main.c * \brief top init of Layer 2 * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/openair2_proc.c b/openair2/LAYER2/MAC/openair2_proc.c index bb4a994a8a..8d810b7fad 100644 --- a/openair2/LAYER2/MAC/openair2_proc.c +++ b/openair2/LAYER2/MAC/openair2_proc.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /* \file openair2_proc.c \brief MAC layer online statistics \author Navid Nikaein diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index fe8fe55d44..8bb08c0e9e 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file pre_processor.c * \brief eNB scheduler preprocessing fuction prior to scheduling * \author Navid Nikaein and Ankit Bhamri diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index 9a0f60167d..933c55e474 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file LAYER2/MAC/proto.h * \brief MAC functions prototypes for eNB and UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index 669077bf4f..b1ab4f408e 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file ra_procedures.c * \brief Routines for UE MAC-layer Random-access procedures (36.321) V8.6 2009-03 * \author R. Knopp and Navid Nikaein diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c index be8dc43c97..fe70c6403b 100644 --- a/openair2/LAYER2/MAC/rar_tools.c +++ b/openair2/LAYER2/MAC/rar_tools.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rar_tools.c * \brief random access tools * \author Raymond Knopp and navid nikaein diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 90d227eb35..a0b650d1af 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file ue_procedures.c * \brief procedures related to UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/vars.h b/openair2/LAYER2/MAC/vars.h index 508c7f8c21..bfc4c9d5b1 100644 --- a/openair2/LAYER2/MAC/vars.h +++ b/openair2/LAYER2/MAC/vars.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file vars.h * \brief mac vars * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c old mode 100755 new mode 100644 index 3779adbbc9..9ffdaa792a --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp.c * \brief pdcp interface with RLC * \author Navid Nikaein and Lionel GAUTHIER diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h old mode 100755 new mode 100644 index 52322b1348..8b39878ad5 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file LAYER2/PDCP_v10.1.0/pdcp.h * \brief pdcp interface with RLC, RRC * \author Lionel GAUTHIER and Navid Nikaein diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c old mode 100755 new mode 100644 index e858008803..569a5cd09e --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*************************************************************************** pdcp_control_primitives.c ------------------- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h old mode 100755 new mode 100644 index 90c4805dde..1c510c83d2 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*************************************************************************** pdcp_control_primitives_proto_extern.h ------------------- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c old mode 100755 new mode 100644 index 390ad5a48d..2d8f4c8bf7 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp_fifo.c * \brief pdcp interface with linux IP interface, have a look at http://man7.org/linux/man-pages/man7/netlink.7.html for netlink * \author Navid Nikaein and Lionel GAUTHIER diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c index 365013c42d..91eaaf3463 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp_netlink.c * \brief pdcp communication with linux IP interface, * have a look at http://man7.org/linux/man-pages/man7/netlink.7.html for netlink. diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c old mode 100755 new mode 100644 index fb530f686a..d9efcb6ca3 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp_primitives.c * \brief PDCP PDU buffer dissector code * \author Baris Demiray diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h old mode 100755 new mode 100644 index 1913fd69f1..72a75bf64a --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - ***************************************************************************/ - /*! \file LAYER2/PDCP_v10.1.0/pdcp_primitives.h * \brief pdcp primitives * \author Baris Demiray and Navid Nikaein diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h old mode 100755 new mode 100644 index 3b83140af2..b09774466e --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* pdcp_proto_extern.h ------------------- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c index 15a1cf57d2..27b5194a24 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file pdcp_security.c * \brief PDCP Security Methods * \author ROUX Sebastie and Navid Nikaein diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c old mode 100755 new mode 100644 index 9615726bc0..fdaabd92e1 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp_sequence_manager.c * \brief PDCP Sequence Numbering Methods * \author Baris Demiray and Navid Nikaein diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h index 1766613e1f..61a1ed6424 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp_sequence_manager.h * \brief PDCP Sequence Numbering Methods * \author Baris Demiray diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c index 8786a91690..7a1a3515b1 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp_thread.c * \brief * \author F. Kaltenberger diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c index ef2cf1afaf..2c7b80b43a 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp_util.c * \brief PDCP Util Methods * \author Baris Demiray diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h index 41f73a7045..4891659fbd 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file pdcp_util.h * \brief PDCP Util Methods * \author Baris Demiray diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c old mode 100755 new mode 100644 index fd8279579d..fe7bd57686 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h old mode 100755 new mode 100644 index 70cbb3b12e..5976bad84b --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am.h * \brief This file, and only this file must be included by code that interact with RLC AM layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h old mode 100755 new mode 100644 index 3bc97ee650..6ab11d8f23 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_constants.h * \brief This file defines constant values used in RLC AM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h old mode 100755 new mode 100644 index 15bba038ea..4c597fa0c7 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_entity.h * \brief This file defines the RLC AM variables stored in a struct called rlc_am_entity_t. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c old mode 100755 new mode 100644 index 8bffde184e..c3042abe73 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*************************************************************************** rlc_am_in_sdu.c - ------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h old mode 100755 new mode 100644 index 111de0416e..643eb17516 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_in_sdu.h * \brief This file defines the prototypes of the utility functions manipulating the incoming SDU buffer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c old mode 100755 new mode 100644 index 81645f06fe..a5687f3b70 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_INIT_C 1 #ifdef USER_MODE diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h old mode 100755 new mode 100644 index ed2f7f2936..edfb8a7aed --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_init.h * \brief This file defines the prototypes of the functions initializing a RLC AM protocol instance. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h old mode 100755 new mode 100644 index 7f3cc6e31f..e69de29bb2 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c old mode 100755 new mode 100644 index 2581437f91..a5c4da5618 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_REASSEMBLY_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h old mode 100755 new mode 100644 index c5fbc9edea..d4172606bd --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_reassembly.h * \brief This file defines the prototypes of the functions dealing with the reassembly of segments. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c old mode 100755 new mode 100644 index f41b96653c..09f5170779 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_RECEIVER_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h old mode 100755 new mode 100644 index 66e492649d..8e01dac68f --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_receiver.h * \brief This file defines the prototypes of the functions dealing with the first stage of the receiving process. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c old mode 100755 new mode 100644 index 9c318a0346..f0e14b44ff --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_RETRANSMIT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h old mode 100755 new mode 100644 index aa6c4b878d..5af677b559 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_retransmit.h * \brief This file defines the prototypes of the functions dealing with the retransmission. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c old mode 100755 new mode 100644 index a580181f6e..7669b71f1f --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_RX_LIST_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h old mode 100755 new mode 100644 index 6c6bb0e6c6..026fca8603 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_rx_list.h * \brief This file defines the prototypes of the functions dealing with a RX list data structure supporting re-segmentation. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c old mode 100755 new mode 100644 index 18ff9a8ad4..701626f741 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_SEGMENT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h old mode 100755 new mode 100644 index eba9dd6455..5bb5b41a83 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_segment.h * \brief This file defines the prototypes of the functions dealing with the segmentation of PDCP SDUs. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c old mode 100755 new mode 100644 index 59f5180e2c..f657064a4f --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_SEGMENT_HOLES_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h old mode 100755 new mode 100644 index db171d3e3e..569338f0e6 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_segments_holes.h * \brief This file defines the prototypes of the functions dealing with the re-segmentation of RLC PDUs stored in the retransmission buffer,. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c old mode 100755 new mode 100644 index 9c46297ad6..bcfdc9b057 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_STATUS_REPORT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h old mode 100755 new mode 100644 index 6a44401701..bac6a7672c --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_status_report.h * \brief This file defines the prototypes of the functions dealing with the reading/writting of informations from/in RLC AM control PDUs, and the processing of received control PDUs. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h old mode 100755 new mode 100644 index 738952d3c6..40fe9a3885 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_structs.h * \brief This file defines structures used inside the RLC AM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c old mode 100755 new mode 100644 index 13f96e1f3f..e648c64fc3 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_TEST_C 1 #define RLC_C 1 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h old mode 100755 new mode 100644 index a78a391869..a1509ff676 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_test.h * \brief This file defines the prototypes of RLC AM test functions. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c old mode 100755 new mode 100644 index 746bde2659..311db2c038 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_POLL_RETRANSMIT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h old mode 100755 new mode 100644 index 2ef993e9ee..058c7841cd --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_timer_poll_retransmit.h * \brief This file defines the prototypes of the functions manipulating the t-PollRetransmit timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c old mode 100755 new mode 100644 index a05700abc1..958cb5d2b5 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_POLL_REORDERING_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h old mode 100755 new mode 100644 index 11bcc92b09..d0fca45354 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_timer_reordering.h * \brief This file defines the prototypes of the functions manipulating the t-Reordering timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c old mode 100755 new mode 100644 index 716e592ce7..0c92e6ca78 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_STATUS_PROHIBIT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h old mode 100755 new mode 100644 index 3881085b0e..4d469e9e0b --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_timer_status_prohibit.h * \brief This file defines the prototypes of the functions manipulating the t-StatusProhibit timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c old mode 100755 new mode 100644 index 89a6657d62..00d02440d8 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_WINDOWS_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h old mode 100755 new mode 100644 index a9a306cad3..3c3f3dddef --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_windows.h * \brief This file defines the prototypes of the functions testing window, based on SN modulo and rx and tx protocol state variables. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c old mode 100755 new mode 100644 index 9f57a6a0cd..08013e592c --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_TM_MODULE 1 #define RLC_TM_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h old mode 100755 new mode 100644 index d772d1d4be..06444a0f9b --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_tm.h * \brief This file, and only this file must be included by code that interact with RLC TM layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h old mode 100755 new mode 100644 index fa716f81be..09a3925bda --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_tm_entity.h * \brief This file defines the RLC TM variables stored in a struct called rlc_tm_entity_t. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c old mode 100755 new mode 100644 index 6b1b487286..20a444cf28 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_TM_MODULE 1 #define RLC_TM_INIT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h old mode 100755 new mode 100644 index 48322c98b8..484937ee6f --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_tm_init.h * \brief This file defines the prototypes of the functions dealing with the control primitives and initialization. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h old mode 100755 new mode 100644 index e59d2972bc..32bc7f5943 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_tm_structs.h * \brief This file defines structures used inside the RLC TM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c old mode 100755 new mode 100644 index 7b0c9890ed..4da33f0da0 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h index 2289ed639c..97345fb417 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um.h * \brief This file, and only this file must be included by code that interact with RLC UM layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h old mode 100755 new mode 100644 index d25a394e8b..f0da01072e --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_constants.h * \brief This file defines constant values used inside RLC UM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c old mode 100755 new mode 100644 index a91e384a55..08a4da571b --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_CONTROL_PRIMITIVES_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h index b9a5166ed2..ce4333e4f9 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_control_primitives.h * \brief This file defines the prototypes of the functions dealing with the control primitives and initialization. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c index 881dc9b993..67d7875c14 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_DAR_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h index dce80d2d98..cb8f4bad0a 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_dar.h * \brief This file defines the prototypes of the functions dealing with the reassembly buffer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h old mode 100755 new mode 100644 index 07fb15bfef..32fca56346 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_entity.h * \brief This file defines the RLC UM variables stored in a struct called rlc_um_entity_t. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c old mode 100755 new mode 100644 index 27b35de67d..8fe95878f3 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_FSM_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h index 645311f451..e15b6be27b 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_fsm.h * \brief This file defines the prototypes of the functions dealing with the finite state machine of the RLC UM protocol instance. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c old mode 100755 new mode 100644 index 24c0ee8291..c4096736d1 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_REASSEMBLY_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h index adba9c133c..385f9475eb 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_reassembly.h * \brief This file defines the prototypes of the functions dealing with the reassembly of segments. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c old mode 100755 new mode 100644 index 6ea07a4677..14ca2101d6 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_RECEIVER_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h index b230a6cb40..f7158b90b3 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_receiver.h * \brief This file defines the prototypes of the functions dealing with the first stage of the receiving process. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c old mode 100755 new mode 100644 index 24890bf957..fccac92a2e --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_SEGMENT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h index 45c8b3d16d..2f2abee9f1 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_segment.h * \brief This file defines the prototypes of the functions dealing with the segmentation of PDCP SDUs. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h old mode 100755 new mode 100644 index 535998bfd1..f459512e76 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_structs.h * \brief This file defines structures used inside the RLC UM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c old mode 100755 new mode 100644 index 04afcff0ff..2ee9c2281e --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE #define RLC_C #define RLC_UM_TEST_C diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h old mode 100755 new mode 100644 index ae64c28278..e63113bc3c --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ # ifndef __RLC_UM_TEST_H__ # define __RLC_UM_TEST_H__ # ifdef RLC_UM_TEST_C diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c index 139490a680..ec47898056 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE #define RLC_UM_VERY_SIMPLE_TEST_C #include diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h index 790dc1ee50..623b2cfa7f 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_very_simple_test.h * \brief This file defines the prototypes of the functions dealing with the sending of self generated packet for very basic test or debug of RLC or lower layers. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index af0fe46875..c075317cb5 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* rlc.c ------------------- diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h old mode 100755 new mode 100644 index 72fde0b746..a3a9e3a8f5 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc.h * \brief This file, and only this file must be included by external code that interact with RLC layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_def.h b/openair2/LAYER2/RLC/rlc_def.h old mode 100755 new mode 100644 index 1205ad2891..a9cec1f72e --- a/openair2/LAYER2/RLC/rlc_def.h +++ b/openair2/LAYER2/RLC/rlc_def.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_def.h * \brief This file contains constants for RLC internal use. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_def_lte.h b/openair2/LAYER2/RLC/rlc_def_lte.h index 01bf2ac486..935fcb3ead 100644 --- a/openair2/LAYER2/RLC/rlc_def_lte.h +++ b/openair2/LAYER2/RLC/rlc_def_lte.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_def_lte.h * \brief This file contains LTE constants for RLC internal use. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_mac.c b/openair2/LAYER2/RLC/rlc_mac.c index 3bde40888f..d0c3596dbb 100644 --- a/openair2/LAYER2/RLC/rlc_mac.c +++ b/openair2/LAYER2/RLC/rlc_mac.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* rlc_mac.c ------------------- diff --git a/openair2/LAYER2/RLC/rlc_mpls.c b/openair2/LAYER2/RLC/rlc_mpls.c index 263b92b063..9f5c6b0e23 100644 --- a/openair2/LAYER2/RLC/rlc_mpls.c +++ b/openair2/LAYER2/RLC/rlc_mpls.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* rlc_mpls.c ------------------- diff --git a/openair2/LAYER2/RLC/rlc_primitives.h b/openair2/LAYER2/RLC/rlc_primitives.h old mode 100755 new mode 100644 index d77d131345..ba111fc224 --- a/openair2/LAYER2/RLC/rlc_primitives.h +++ b/openair2/LAYER2/RLC/rlc_primitives.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_primitives.h * \brief This file contains constants definition for RLC primitives. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index 9919cc0f70..2c6183d04d 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* rlc_rrc.c ------------------- diff --git a/openair2/LAYER2/layer2_top.c b/openair2/LAYER2/layer2_top.c index 4cd1f50d03..38dbc16444 100644 --- a/openair2/LAYER2/layer2_top.c +++ b/openair2/LAYER2/layer2_top.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*________________________openair_w3g4free_top.c________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/LAYER2/openair2_proc.c b/openair2/LAYER2/openair2_proc.c index 8daa8afb70..3db3fcc7bf 100644 --- a/openair2/LAYER2/openair2_proc.c +++ b/openair2/LAYER2/openair2_proc.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /****************************************************************************** \file openair2_proc # \brief print openair2 overall statistics diff --git a/openair2/LAYER2/register.c b/openair2/LAYER2/register.c index ac93364452..3ae1cba520 100644 --- a/openair2/LAYER2/register.c +++ b/openair2/LAYER2/register.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*________________________rrc_register.c________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/LAYER2/register.h b/openair2/LAYER2/register.h index 09c464ae56..783e63a16e 100644 --- a/openair2/LAYER2/register.h +++ b/openair2/LAYER2/register.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*________________________rrc_register.h________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c old mode 100755 new mode 100644 index 3647131326..5b6578f739 --- a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c +++ b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c @@ -1,12 +1,3 @@ -/*************************************************************************** - nascell_ioctl.c - description - ------------------- - copyright : (C) 2002 by Eurecom - email : michelle.wetterwald@eurecom.fr - yan.moret@eurecom.fr - *************************************************************************** - - ***************************************************************************/ #include "nascell_ioctl.h" #include "rrc_nas_primitives.h" //#include "rrc_qos.h" diff --git a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h old mode 100755 new mode 100644 index 2fce5403a2..cf9f258eb8 --- a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h +++ b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h @@ -1,12 +1,3 @@ -/*************************************************************************** - graal_ioctl.h - description - ------------------- - copyright : (C) 2002 by Eurecom - email : michelle.wetterwald@eurecom.fr - yan.moret@eurecom.fr - *************************************************************************** - - ***************************************************************************/ #ifndef _IOCTL_H #define _IOCTL_H diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c old mode 100755 new mode 100644 index 8e946f04e2..a83798eeed --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c @@ -1,33 +1,3 @@ -/*************************************************************************** - nasmt_ascontrol.c - description - *************************************************************************** - Access Stratum Control features for MT - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_ascontrol.c * \brief Access Stratum Control functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c old mode 100755 new mode 100644 index 1e79a4f3f0..d073638f32 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c @@ -1,31 +1,3 @@ -/*************************************************************************** - nasmt_classifier.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_classifier.c * \brief Flow classification functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c old mode 100755 new mode 100644 index 8006cccc74..f8161a858c --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c @@ -1,31 +1,3 @@ -/*************************************************************************** - nasmt_common.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_common.c * \brief Common functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h old mode 100755 new mode 100644 index c772804949..3d312e32d3 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h @@ -1,33 +1,3 @@ -/*************************************************************************** - nasmt_constant.h - description - *************************************************************************** - Defines all constants for NAS MT - In particular, constants for the default RAB - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_constant.h * \brief Defines all constants for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c old mode 100755 new mode 100644 index 91fb934e0a..28820e1118 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c @@ -1,33 +1,3 @@ -/*************************************************************************** - nasmt_device.c - description - *************************************************************************** - Device Driver features for MT - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_device.c * \brief Networking Device Driver for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c old mode 100755 new mode 100644 index fc0d28a278..719b6b1c2f --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c @@ -1,31 +1,3 @@ -/*************************************************************************** - nasmt_iocontrol.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_iocontrol.c * \brief I/O control functions for upper layers of driver for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h old mode 100755 new mode 100644 index ac682163f8..212ee894ce --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h @@ -1,31 +1,3 @@ -/*************************************************************************** - nasmt_iocontrol.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_iocontrol.h * \brief I/O control constnats and structures for upper layers of driver for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c old mode 100755 new mode 100644 index 17e94bb3c0..39b5047f94 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c @@ -1,32 +1,3 @@ -/*************************************************************************** - nasmt_netlink.c - description - ------------------- - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_netlink.c * \brief Netlink socket functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h old mode 100755 new mode 100644 index cabc515034..7468f66d12 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h @@ -1,31 +1,3 @@ -/*************************************************************************** - nasmt_proto.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_proto.h * \brief Function prototypes for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h old mode 100755 new mode 100644 index a9af1ca4ca..b8fa1608f4 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h @@ -1,31 +1,3 @@ -/*************************************************************************** - nasmt_sap.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_sap.h * \brief SAP constants for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c index 1b64b83dca..4fdc64cd59 100755 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c @@ -3,32 +3,6 @@ *************************************************************************** ***************************************************************************/ -/******************************************************************************* - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_tool.c * \brief Tool functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h old mode 100755 new mode 100644 index 3ee63d8862..f543fb54f8 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h @@ -1,31 +1,3 @@ -/*************************************************************************** - nasmt_variables.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_variables.h * \brief Variable and structure definitions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c old mode 100755 new mode 100644 index 53d0e14aeb..2889c5b2e1 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c @@ -1,33 +1,3 @@ -/*************************************************************************** - nasrg_ascontrol.c - description - *************************************************************************** - Access Stratum Control features for eNodeB - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_ascontrol.c * \brief Access Stratum Control functions for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c old mode 100755 new mode 100644 index 5bacf88de2..a5df919fa6 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c @@ -1,31 +1,3 @@ -/*************************************************************************** - nasrg_classifier.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_classifier.c * \brief Flow classification functions for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c old mode 100755 new mode 100644 index 9857d11ec8..ff105ca829 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c @@ -1,31 +1,3 @@ -/*************************************************************************** - nasrg_common.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_common.c * \brief Common functions for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h old mode 100755 new mode 100644 index d0e81aa4e6..f6b6b143b4 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h @@ -1,34 +1,3 @@ -/*************************************************************************** - nasrg_constant.h - description - *************************************************************************** - Defines all constants for NAS RG - - In particular, constants for the default RAB and its qos class - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_constant.h * \brief Defines all constants for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c old mode 100755 new mode 100644 index 10dc702540..f5946c3e6b --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c @@ -1,33 +1,3 @@ -/*************************************************************************** - nasrg_device.c - description -*************************************************************************** - Device Driver features for RG - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_device.c * \brief Networking Device Driver for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c old mode 100755 new mode 100644 index 727614ed22..e21b9268ad --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c @@ -1,31 +1,3 @@ -/*************************************************************************** - nasrg_iocontrol.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_iocontrol.c * \brief I/O control functions for upper layers of driver for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h old mode 100755 new mode 100644 index 6ae41f0599..a1b24124cc --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h @@ -1,31 +1,3 @@ -/*************************************************************************** - nasrg_iocontrol.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_iocontrol.h * \brief I/O control constnats and structures for upper layers of driver for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c old mode 100755 new mode 100644 index 3736bc3fcf..3dbbab6cd3 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c @@ -1,32 +1,3 @@ -/*************************************************************************** - nasrg_netlink.c - description - ------------------- - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_netlink.c * \brief Netlink socket functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h old mode 100755 new mode 100644 index bc872182d5..98f0379443 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h @@ -1,31 +1,3 @@ -/*************************************************************************** - nasrg_proto.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_proto.h * \brief Function prototypes for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h old mode 100755 new mode 100644 index f30fb35d95..9ecaeb17f8 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h @@ -1,31 +1,3 @@ -/*************************************************************************** - nasrg_sap.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasmt_sap.h * \brief SAP constants for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c old mode 100755 new mode 100644 index 804de4bff5..d62d5ed2e6 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c @@ -1,12 +1,3 @@ -/*************************************************************************** - nasrg_tool.c - description - ------------------- - copyright : (C) 2002 by Eurecom - email : yan.moret@eurecom.fr - michelle.wetterwald@eurecom.fr - *************************************************************************** - - ***************************************************************************/ #include "nasrg_variables.h" #include "nasrg_proto.h" diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h old mode 100755 new mode 100644 index 6891d155e5..573ed0b904 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h @@ -1,31 +1,3 @@ -/*************************************************************************** - nasrg_variables.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ /*! \file nasrg_variables.h * \brief Variable and structure definitions for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c index 673a5a0b5d..1a3bbef8d5 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c +++ b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c @@ -1,12 +1,3 @@ -/*************************************************************************** - netltest.c - - ------------------- - begin : Tue Jan 15 2002 - copyright : (C) 2002, 2010 by Eurecom - created by : michelle.wetterwald@eurecom.fr - ************************************************************************** - This file contains the functions used to interface the NAS // from MESH Driver - ***************************************************************************/ //----------------------------------------------------------------------------- // For FIFOS / NETLINK interface #include diff --git a/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h b/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h old mode 100755 new mode 100644 index 787d2db9cc..95eb588ef1 --- a/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h +++ b/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h @@ -1,12 +1,3 @@ -/*************************************************************************** - nas_control_proto.h - description - ------------------- - begin : June 25, 2002 - copyright : (C) 2002 by Eurecom - email : Michelle.Wetterwald@eurecom.fr - ************************************************************************** - Prototypes related to NAS control functions - ***************************************************************************/ #ifndef __NAS_CONTROL_H__ #define __NAS_CONTROL_H__ diff --git a/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c b/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c old mode 100755 new mode 100644 index 98b9d50109..dbff4b58f0 --- a/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c +++ b/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c @@ -1,12 +1,3 @@ -/*************************************************************************** - nasrg_simu_meas.c - description - ------------------- - begin : June 2004 - copyright : (C) 2004, 2010 by Eurecom - email : Michelle.Wetterwald@eurecom.fr - ************************************************************************** - Simulations of measures for tests - ***************************************************************************/ #include #include #include diff --git a/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c b/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c old mode 100755 new mode 100644 index 3622c06b94..b323798b6b --- a/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c +++ b/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c @@ -1,13 +1,3 @@ -/*************************************************************************** - rrm_fifo_standalone.c - - ------------------- - begin : June 27, 2002 - copyright : (C) 2002 by Eurecom - created by : michelle.wetterwald@eurecom.fr - - description: - This file contains an emulator of the RRM - ***************************************************************************/ #include #include #include diff --git a/openair2/NAS/nas_ue_task.h b/openair2/NAS/nas_ue_task.h index 6695ab0ac5..65dcf6781b 100644 --- a/openair2/NAS/nas_ue_task.h +++ b/openair2/NAS/nas_ue_task.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - #ifndef NAS_UE_TASK_H_ #define NAS_UE_TASK_H_ diff --git a/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c b/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c old mode 100755 new mode 100644 index 43b8ec3614..2938ebbb8e --- a/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c +++ b/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** rb_tool.c - User-space utility for driving NASMESH IOCTL interface ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/classifier.c b/openair2/NETWORK_DRIVER/LITE/classifier.c old mode 100755 new mode 100644 index 4025e28e19..fe2519f712 --- a/openair2/NETWORK_DRIVER/LITE/classifier.c +++ b/openair2/NETWORK_DRIVER/LITE/classifier.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file classifier.c * \brief Classify IP packets * \author Navid Nikaein, Lionel GAUTHIER, Raymond knopp diff --git a/openair2/NETWORK_DRIVER/LITE/common.c b/openair2/NETWORK_DRIVER/LITE/common.c old mode 100755 new mode 100644 index 7aca4b8d5f..165a2b7279 --- a/openair2/NETWORK_DRIVER/LITE/common.c +++ b/openair2/NETWORK_DRIVER/LITE/common.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file common.c * \brief implementation of emultor tx and rx * \author Navid Nikaein, Lionel GAUTHIER, and Raymomd Knopp diff --git a/openair2/NETWORK_DRIVER/LITE/constant.h b/openair2/NETWORK_DRIVER/LITE/constant.h old mode 100755 new mode 100644 index 82cef8e8c1..5b4694d1e0 --- a/openair2/NETWORK_DRIVER/LITE/constant.h +++ b/openair2/NETWORK_DRIVER/LITE/constant.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - #ifndef _OAI_NW_DRV_CST #define _OAI_NW_DRV_CST diff --git a/openair2/NETWORK_DRIVER/LITE/device.c b/openair2/NETWORK_DRIVER/LITE/device.c old mode 100755 new mode 100644 index 9b772d6eef..aad7b2fc08 --- a/openair2/NETWORK_DRIVER/LITE/device.c +++ b/openair2/NETWORK_DRIVER/LITE/device.c @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file device.c * \brief Networking Device Driver for OpenAirInterface Ethernet * \author navid.nikaein, Lionel Gauthier, raymond.knopp, diff --git a/openair2/NETWORK_DRIVER/LITE/ioctl.c b/openair2/NETWORK_DRIVER/LITE/ioctl.c old mode 100755 new mode 100644 index ad3a4eefac..01486b1d72 --- a/openair2/NETWORK_DRIVER/LITE/ioctl.c +++ b/openair2/NETWORK_DRIVER/LITE/ioctl.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include "local.h" #include "ioctl.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/LITE/ioctl.h b/openair2/NETWORK_DRIVER/LITE/ioctl.h old mode 100755 new mode 100644 index 3b5d55823a..d21bc5ad64 --- a/openair2/NETWORK_DRIVER/LITE/ioctl.h +++ b/openair2/NETWORK_DRIVER/LITE/ioctl.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** ioctl.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/local.h b/openair2/NETWORK_DRIVER/LITE/local.h old mode 100755 new mode 100644 index 7268f69b5d..b11fb61dac --- a/openair2/NETWORK_DRIVER/LITE/local.h +++ b/openair2/NETWORK_DRIVER/LITE/local.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** local.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/netlink.c b/openair2/NETWORK_DRIVER/LITE/netlink.c old mode 100755 new mode 100644 index 2339540cae..8c28dda586 --- a/openair2/NETWORK_DRIVER/LITE/netlink.c +++ b/openair2/NETWORK_DRIVER/LITE/netlink.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file netlink.c * \brief establish a netlink * \author Navid Nikaein, Lionel Gauthier, and Raymond knopp diff --git a/openair2/NETWORK_DRIVER/LITE/proto_extern.h b/openair2/NETWORK_DRIVER/LITE/proto_extern.h old mode 100755 new mode 100644 index 36039ed984..e13264bbab --- a/openair2/NETWORK_DRIVER/LITE/proto_extern.h +++ b/openair2/NETWORK_DRIVER/LITE/proto_extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** proto_extern.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/sap.h b/openair2/NETWORK_DRIVER/LITE/sap.h old mode 100755 new mode 100644 index ffe778fe34..fe4abed3b7 --- a/openair2/NETWORK_DRIVER/LITE/sap.h +++ b/openair2/NETWORK_DRIVER/LITE/sap.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef OAI_SAP_H #define OAI_SAP_H typedef unsigned short OaiNwDrvRadioBearerId_t; diff --git a/openair2/NETWORK_DRIVER/LITE/tool.c b/openair2/NETWORK_DRIVER/LITE/tool.c old mode 100755 new mode 100644 index 492d674c06..d0957297b8 --- a/openair2/NETWORK_DRIVER/LITE/tool.c +++ b/openair2/NETWORK_DRIVER/LITE/tool.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include "local.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c b/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c index fb005b3589..b3a73ee8fc 100644 --- a/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c +++ b/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** rb_tool.c - User-space utility for driving NASMESH IOCTL interface ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/classifier.c b/openair2/NETWORK_DRIVER/MESH/classifier.c old mode 100755 new mode 100644 index 2c55c0ca79..2c3abaed0d --- a/openair2/NETWORK_DRIVER/MESH/classifier.c +++ b/openair2/NETWORK_DRIVER/MESH/classifier.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file classifier.c * \brief Classify IP packets * \author Navid Nikaein, Lionel GAUTHIER, Raymond knopp diff --git a/openair2/NETWORK_DRIVER/MESH/common.c b/openair2/NETWORK_DRIVER/MESH/common.c old mode 100755 new mode 100644 index 37862046c9..5aca469753 --- a/openair2/NETWORK_DRIVER/MESH/common.c +++ b/openair2/NETWORK_DRIVER/MESH/common.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file common.c * \brief implementation of emultor tx and rx * \author Navid Nikaein, Lionel GAUTHIER, and Raymomd Knopp diff --git a/openair2/NETWORK_DRIVER/MESH/constant.h b/openair2/NETWORK_DRIVER/MESH/constant.h old mode 100755 new mode 100644 index a6f053b658..aa4c6e4479 --- a/openair2/NETWORK_DRIVER/MESH/constant.h +++ b/openair2/NETWORK_DRIVER/MESH/constant.h @@ -1,34 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - - #ifndef _NAS_CST #define _NAS_CST diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c old mode 100755 new mode 100644 index 51b71d6d8e..c783e1a77d --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file device.c * \brief Networking Device Driver for OpenAirInterface MESH * \author navid.nikaein, yan.moret(no longer valid), michelle.wetterwald, raymond.knopp diff --git a/openair2/NETWORK_DRIVER/MESH/ioctl.c b/openair2/NETWORK_DRIVER/MESH/ioctl.c old mode 100755 new mode 100644 index 89f63ece77..5b112c5000 --- a/openair2/NETWORK_DRIVER/MESH/ioctl.c +++ b/openair2/NETWORK_DRIVER/MESH/ioctl.c @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - #include "local.h" #include "ioctl.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/MESH/ioctl.h b/openair2/NETWORK_DRIVER/MESH/ioctl.h old mode 100755 new mode 100644 index d056bed076..b776fcf3cf --- a/openair2/NETWORK_DRIVER/MESH/ioctl.h +++ b/openair2/NETWORK_DRIVER/MESH/ioctl.h @@ -1,13 +1,3 @@ -/*************************************************************************** - nas_iocontrol.h - description - ------------------- - copyright : (C) 2002 by Eurecom - email : michelle.wetterwald@eurecom.fr - yan.moret@eurecom.fr - knopp@eurecom.fr - *************************************************************************** - - ***************************************************************************/ #ifndef NAS_CTL_H #define NAS_CTL_H diff --git a/openair2/NETWORK_DRIVER/MESH/local.h b/openair2/NETWORK_DRIVER/MESH/local.h old mode 100755 new mode 100644 index 1171eb3b5a..13fd2603fc --- a/openair2/NETWORK_DRIVER/MESH/local.h +++ b/openair2/NETWORK_DRIVER/MESH/local.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** local.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/mesh.c b/openair2/NETWORK_DRIVER/MESH/mesh.c old mode 100755 new mode 100644 index 9f49a4b4cd..963699b2c6 --- a/openair2/NETWORK_DRIVER/MESH/mesh.c +++ b/openair2/NETWORK_DRIVER/MESH/mesh.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** nas_mesh.c - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/netlink.c b/openair2/NETWORK_DRIVER/MESH/netlink.c index e8fd851c23..93169fd0a9 100644 --- a/openair2/NETWORK_DRIVER/MESH/netlink.c +++ b/openair2/NETWORK_DRIVER/MESH/netlink.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file netlink.c * \brief establish a netlink * \author Navid Nikaein, Lionel Gauthier, and Raymond knopp diff --git a/openair2/NETWORK_DRIVER/MESH/proto_extern.h b/openair2/NETWORK_DRIVER/MESH/proto_extern.h old mode 100755 new mode 100644 index ea46858445..72b8d08f71 --- a/openair2/NETWORK_DRIVER/MESH/proto_extern.h +++ b/openair2/NETWORK_DRIVER/MESH/proto_extern.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** nas_proto_extern.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h b/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h old mode 100755 new mode 100644 index a1787b1df7..ba288a32cd --- a/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h +++ b/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /********************************************************************* rrc_nas_primitives.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/sap.h b/openair2/NETWORK_DRIVER/MESH/sap.h old mode 100755 new mode 100644 index 4241744d86..528d8b1028 --- a/openair2/NETWORK_DRIVER/MESH/sap.h +++ b/openair2/NETWORK_DRIVER/MESH/sap.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** graal_sap.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/tool.c b/openair2/NETWORK_DRIVER/MESH/tool.c old mode 100755 new mode 100644 index 54acd68ba7..132da70b78 --- a/openair2/NETWORK_DRIVER/MESH/tool.c +++ b/openair2/NETWORK_DRIVER/MESH/tool.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include "local.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/UE_IP/common.c b/openair2/NETWORK_DRIVER/UE_IP/common.c old mode 100755 new mode 100644 index 17ce737e6a..9f85cb7043 --- a/openair2/NETWORK_DRIVER/UE_IP/common.c +++ b/openair2/NETWORK_DRIVER/UE_IP/common.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file common.c * \brief * \author Navid Nikaein and Raymond Knopp, Lionel GAUTHIER diff --git a/openair2/NETWORK_DRIVER/UE_IP/constant.h b/openair2/NETWORK_DRIVER/UE_IP/constant.h old mode 100755 new mode 100644 index 0345d2dfad..9c817ecdc0 --- a/openair2/NETWORK_DRIVER/UE_IP/constant.h +++ b/openair2/NETWORK_DRIVER/UE_IP/constant.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - #ifndef _UE_IP_CST #define _UE_IP_CST diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c old mode 100755 new mode 100644 index a0e32726d9..ce0fc2c2f3 --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file device.c * \brief Networking Device Driver for OpenAirInterface * \author navid nikaein, Lionel Gauthier, raymond knopp diff --git a/openair2/NETWORK_DRIVER/UE_IP/local.h b/openair2/NETWORK_DRIVER/UE_IP/local.h old mode 100755 new mode 100644 index f00d26385d..46725aecad --- a/openair2/NETWORK_DRIVER/UE_IP/local.h +++ b/openair2/NETWORK_DRIVER/UE_IP/local.h @@ -1,31 +1,4 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************//*************************************************************************** +/*************************************************************************** local.h - description ------------------- copyright : (C) 2002 by Eurecom diff --git a/openair2/NETWORK_DRIVER/UE_IP/netlink.c b/openair2/NETWORK_DRIVER/UE_IP/netlink.c old mode 100755 new mode 100644 index 17870218c9..08c2d98da5 --- a/openair2/NETWORK_DRIVER/UE_IP/netlink.c +++ b/openair2/NETWORK_DRIVER/UE_IP/netlink.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file netlink.c * \brief establish a netlink * \author Navid Nikaein, Lionel Gauthier, Raymond knopp diff --git a/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h b/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h old mode 100755 new mode 100644 index 4eac01b680..e749362fc5 --- a/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h +++ b/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** proto_extern.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/UE_IP/sap.h b/openair2/NETWORK_DRIVER/UE_IP/sap.h old mode 100755 new mode 100644 index 086390cdc4..d755f0bd1f --- a/openair2/NETWORK_DRIVER/UE_IP/sap.h +++ b/openair2/NETWORK_DRIVER/UE_IP/sap.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef UE_IP_SAP_H #define UE_IP_SAP_H typedef unsigned short OaiNwDrvRadioBearerId_t; diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h old mode 100755 new mode 100644 index a85c2b15f2..09d4b731a5 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file PHY_INTERFACE/defs.h * \brief mac phy interface primitives * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/PHY_INTERFACE/extern.h b/openair2/PHY_INTERFACE/extern.h index b1700b7697..e75a36bc8b 100644 --- a/openair2/PHY_INTERFACE/extern.h +++ b/openair2/PHY_INTERFACE/extern.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef __PHY_INTERFACE_EXTERN_H__ #define __PHY_INTERFACE_EXTERN_H__ diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.c b/openair2/PHY_INTERFACE/mac_phy_primitives.c index 52b4a1b039..ced666c501 100644 --- a/openair2/PHY_INTERFACE/mac_phy_primitives.c +++ b/openair2/PHY_INTERFACE/mac_phy_primitives.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*________________________mac_phy_primitives.c________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.h b/openair2/PHY_INTERFACE/mac_phy_primitives.h index a52ce6c8cb..9b79723d82 100644 --- a/openair2/PHY_INTERFACE/mac_phy_primitives.h +++ b/openair2/PHY_INTERFACE/mac_phy_primitives.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*________________________mac_phy_primitives.h________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/PHY_INTERFACE/vars.h b/openair2/PHY_INTERFACE/vars.h index 561ab426e7..6c30acca8c 100644 --- a/openair2/PHY_INTERFACE/vars.h +++ b/openair2/PHY_INTERFACE/vars.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef __PHY_INTERFACE_VARS_H__ #define __PHY_INTERFACE_VARS_H__ diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c index 702433744d..694cc9c480 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file l2_interface.c * \brief layer 2 interface * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h index f694a68c58..a4030950fd 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file l2_interface.c * \brief layer 2 interface * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index a737be167e..f53cce1f5a 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file l2_interface.c * \brief layer 2 interface, used to support different RRC sublayer * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 13cfae80da..fd2f602016 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file asn1_msg.c * \brief primitives to build the asn1 messages * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.h b/openair2/RRC/LITE/MESSAGES/asn1_msg.h index 9c5e72293a..a38f044f65 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.h +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file asn1_msg.h * \brief primitives to build the asn1 messages * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index e546b52f8e..eb2ab5f603 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file RRC/LITE/defs.h * \brief RRC struct definitions and function prototypes * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/extern.h b/openair2/RRC/LITE/extern.h index 64863b796f..e7bdcdd1ad 100644 --- a/openair2/RRC/LITE/extern.h +++ b/openair2/RRC/LITE/extern.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file vars.h * \brief rrc external vars * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index a7bc9c4940..30a6132a0e 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file proto.h * \brief RRC functions prototypes for eNB and UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrc_2_rrm_msg.c b/openair2/RRC/LITE/rrc_2_rrm_msg.c index 0dcdce6b12..fae9b11ed3 100644 --- a/openair2/RRC/LITE/rrc_2_rrm_msg.c +++ b/openair2/RRC/LITE/rrc_2_rrm_msg.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 01c1ee6ca9..d2420217f9 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_UE.c * \brief rrc procedures for UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrc_UE_ral.c b/openair2/RRC/LITE/rrc_UE_ral.c old mode 100755 new mode 100644 index ed1e6ca205..7ef010aa68 --- a/openair2/RRC/LITE/rrc_UE_ral.c +++ b/openair2/RRC/LITE/rrc_UE_ral.c @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file rrc_UE_ral.c * \brief rrc procedures for handling RAL messages * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_UE_ral.h b/openair2/RRC/LITE/rrc_UE_ral.h old mode 100755 new mode 100644 index a06ae637cd..8d40da2055 --- a/openair2/RRC/LITE/rrc_UE_ral.h +++ b/openair2/RRC/LITE/rrc_UE_ral.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file rrc_UE_ral.h * \brief rrc procedures for handling RAL messages * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index bd77c8463a..368cb6e571 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rrc_common.c * \brief rrc common procedures for eNB and UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrc_config.c b/openair2/RRC/LITE/rrc_config.c index cd91e6c2f3..1648354bab 100644 --- a/openair2/RRC/LITE/rrc_config.c +++ b/openair2/RRC/LITE/rrc_config.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rrc_config.c * \brief rrc cinfiguration * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 7f36a9b36c..36180e69fa 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rrc_eNB.c * \brief rrc procedures for eNB * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c old mode 100755 new mode 100644 index 89acbca195..2cf8015df5 --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_eNB_GTPV1U.c * \brief rrc GTPV1U procedures for eNB * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.h b/openair2/RRC/LITE/rrc_eNB_GTPV1U.h old mode 100755 new mode 100644 index 388f71c136..80bb42014b --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.h +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_eNB_GTPV1U.h * \brief rrc GTPV1U procedures for eNB * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 33d076b9f6..83da626936 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2016 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_eNB_S1AP.c * \brief rrc S1AP procedures for eNB * \author Navid Nikaein, Laurent Winckel, Sebastien ROUX, and Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.h b/openair2/RRC/LITE/rrc_eNB_S1AP.h index 0beebc72c1..d39366f4d3 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.h +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_eNB_S1AP.h * \brief rrc S1AP procedures for eNB * \author Laurent Winckel and Sebastien ROUX and Navid Nikaein and Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_UE_context.c b/openair2/RRC/LITE/rrc_eNB_UE_context.c index 0662471763..37418feff1 100644 --- a/openair2/RRC/LITE/rrc_eNB_UE_context.c +++ b/openair2/RRC/LITE/rrc_eNB_UE_context.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rrc_eNB_UE_context.h * \brief rrc procedures for UE context * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_UE_context.h b/openair2/RRC/LITE/rrc_eNB_UE_context.h index 084baa9cc4..972005d44a 100644 --- a/openair2/RRC/LITE/rrc_eNB_UE_context.h +++ b/openair2/RRC/LITE/rrc_eNB_UE_context.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rrc_eNB_UE_context.h * \brief rrc procedures for UE context * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_ral.c b/openair2/RRC/LITE/rrc_eNB_ral.c old mode 100755 new mode 100644 index d1a0f02e46..38b4afd18d --- a/openair2/RRC/LITE/rrc_eNB_ral.c +++ b/openair2/RRC/LITE/rrc_eNB_ral.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rrc_eNB_ral.c * \brief rrc procedures for handling RAL messages * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_ral.h b/openair2/RRC/LITE/rrc_eNB_ral.h old mode 100755 new mode 100644 index da69b47023..27d74aee9a --- a/openair2/RRC/LITE/rrc_eNB_ral.h +++ b/openair2/RRC/LITE/rrc_eNB_ral.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rrc_eNB_ral.h * \brief rrc procedures for handling RAL messages * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_rrm_interface.c b/openair2/RRC/LITE/rrc_rrm_interface.c index 29f97ed296..643f630c87 100644 --- a/openair2/RRC/LITE/rrc_rrm_interface.c +++ b/openair2/RRC/LITE/rrc_rrm_interface.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/rrc_rrm_interface.h b/openair2/RRC/LITE/rrc_rrm_interface.h index 5d83f8679b..cf4080c5a6 100644 --- a/openair2/RRC/LITE/rrc_rrm_interface.h +++ b/openair2/RRC/LITE/rrc_rrm_interface.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/rrc_types.h b/openair2/RRC/LITE/rrc_types.h index cd9b7815f6..7aa6f9ba1b 100644 --- a/openair2/RRC/LITE/rrc_types.h +++ b/openair2/RRC/LITE/rrc_types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rrc_types.h * \brief rrc types and subtypes * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrm_2_rrc_msg.c b/openair2/RRC/LITE/rrm_2_rrc_msg.c index cc44465201..025e78ec0e 100644 --- a/openair2/RRC/LITE/rrm_2_rrc_msg.c +++ b/openair2/RRC/LITE/rrm_2_rrc_msg.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/utils.c b/openair2/RRC/LITE/utils.c index 1bf6530384..1a2ad0d712 100644 --- a/openair2/RRC/LITE/utils.c +++ b/openair2/RRC/LITE/utils.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*________________________openair_rrc_utils.c________________________ Authors : Hicham Anouar diff --git a/openair2/RRC/LITE/vars.h b/openair2/RRC/LITE/vars.h index cb6e8c5238..1dd532a4b2 100644 --- a/openair2/RRC/LITE/vars.h +++ b/openair2/RRC/LITE/vars.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file vars.hles * \brief rrc variables * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/NAS/nas_config.c b/openair2/RRC/NAS/nas_config.c index 400be1a604..516525fe01 100644 --- a/openair2/RRC/NAS/nas_config.c +++ b/openair2/RRC/NAS/nas_config.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file nas_config.c * \brief Configures the nasmesh interface * \author Daniel Camara and Navid Nikaein diff --git a/openair2/RRC/NAS/nas_config.h b/openair2/RRC/NAS/nas_config.h old mode 100755 new mode 100644 index 93ee5a196d..fd783e0674 --- a/openair2/RRC/NAS/nas_config.h +++ b/openair2/RRC/NAS/nas_config.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file nas_config.h * \brief Configures the nasmesh interface * \author Daniel Camara and navid nikaein diff --git a/openair2/RRC/NAS/rb_config.c b/openair2/RRC/NAS/rb_config.c index 9a7f8a88da..ed04b47713 100644 --- a/openair2/RRC/NAS/rb_config.c +++ b/openair2/RRC/NAS/rb_config.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rb_config.c * \brief User-space utility for configuring NASMESH IOCTL interface * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/NAS/rb_config.h b/openair2/RRC/NAS/rb_config.h index e8d807f882..f701a5f96f 100644 --- a/openair2/RRC/NAS/rb_config.h +++ b/openair2/RRC/NAS/rb_config.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /** \file rb_config.h * \brief Openair radio bearer configuration header file * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRM_4_RRC_LITE/src/platform.h b/openair2/RRM_4_RRC_LITE/src/platform.h old mode 100755 new mode 100644 index 42bab6dc8b..25bc91a8e2 --- a/openair2/RRM_4_RRC_LITE/src/platform.h +++ b/openair2/RRM_4_RRC_LITE/src/platform.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* platform.h ------------------- diff --git a/openair2/RRM_4_RRC_LITE/src/platform_constants.h b/openair2/RRM_4_RRC_LITE/src/platform_constants.h old mode 100755 new mode 100644 index ecf072ac4c..12f1787c2b --- a/openair2/RRM_4_RRC_LITE/src/platform_constants.h +++ b/openair2/RRM_4_RRC_LITE/src/platform_constants.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* platform_constants.h ------------------- diff --git a/openair2/RRM_4_RRC_LITE/src/platform_defines.h b/openair2/RRM_4_RRC_LITE/src/platform_defines.h old mode 100755 new mode 100644 index ff3e7c0428..f4f24eb81a --- a/openair2/RRM_4_RRC_LITE/src/platform_defines.h +++ b/openair2/RRM_4_RRC_LITE/src/platform_defines.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* platform_defines.h ------------------- diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp old mode 100755 new mode 100644 index 04b97887e4..bff7a1251d --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h old mode 100755 new mode 100644 index ee1eb8f38a..92674d9953 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _ASN1UTILS_H # define _ASN1UTILS_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp old mode 100755 new mode 100644 index 7bd92ad9b6..ce558718a0 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include //---------------------------------------------------------------------------- diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h old mode 100755 new mode 100644 index 107cc97717..43c1cee46d --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - # ifndef _COMMAND_H # define _COMMAND_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp old mode 100755 new mode 100644 index 73824db9a9..e9905371a3 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp @@ -1,30 +1 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include "DataRadioBearer.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h old mode 100755 new mode 100644 index eb897ce894..586409f66b --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _DATARADIOBEARER_H # define _DATARADIOBEARER_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp old mode 100755 new mode 100644 index 8a4498861b..945c2bfadc --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h old mode 100755 new mode 100644 index c1c761032d..46c87e8d42 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _ENODEB_H # define _ENODEB_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h old mode 100755 new mode 100644 index a236d5e09e..ace3b9ee32 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _EXCEPTIONS_H # define _EXCEPTIONS_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp old mode 100755 new mode 100644 index 607bfd042a..1e7bd4d568 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include "LogicalChannel.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h old mode 100755 new mode 100644 index c9d572cbf1..82ef6cb6bf --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _LOGICALCHANNEL_H # define _LOGICALCHANNEL_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp old mode 100755 new mode 100644 index 7400700800..23fc95c818 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h old mode 100755 new mode 100644 index 6d2be81694..309586508c --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _MOBILE_H # define _MOBILE_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp old mode 100755 new mode 100644 index 76a32516e4..67b5eeeeae --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include "RadioBearer.h" #include "Command.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h old mode 100755 new mode 100644 index 16cf600c04..36d5fd78d2 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _RADIOBEARER_H # define _RADIOBEARER_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp old mode 100755 new mode 100644 index efcffdcf7d..a657b5a64d --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include "RadioResources.h" #include "Exceptions.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h old mode 100755 new mode 100644 index 263c486c2e..64f937fc63 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _RADIORESOURCES_H # define _RADIORESOURCES_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp old mode 100755 new mode 100644 index 99fa875d67..459563e902 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp @@ -1,30 +1 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include "SignallingRadioBearer.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h old mode 100755 new mode 100644 index e441f9b0d7..6b232fe190 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _SIGNALLINGRADIOBEARER_H # define _SIGNALLINGRADIOBEARER_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp old mode 100755 new mode 100644 index c9ccc39745..5b95f1ac31 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h old mode 100755 new mode 100644 index 2497a4ea3b..9423c86833 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef _TRANSACTION_H # define _TRANSACTION_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp old mode 100755 new mode 100644 index 04176f98ee..a2812a17bf --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include "Transactions.h" #include "Exceptions.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h old mode 100755 new mode 100644 index 1b15b2e59f..a1220b3956 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - # ifndef _TRANSACTIONS_H # define _TRANSACTIONS_H diff --git a/openair2/RRM_4_RRC_LITE/src/rrm.cpp b/openair2/RRM_4_RRC_LITE/src/rrm.cpp old mode 100755 new mode 100644 index 02e3cae229..5a1772f045 --- a/openair2/RRM_4_RRC_LITE/src/rrm.cpp +++ b/openair2/RRM_4_RRC_LITE/src/rrm.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - // =========================================================================== #include #include diff --git a/openair2/UTIL/AT_COMMANDS/parser.c b/openair2/UTIL/AT_COMMANDS/parser.c old mode 100755 new mode 100644 index 0a5a530a31..381a049f9b --- a/openair2/UTIL/AT_COMMANDS/parser.c +++ b/openair2/UTIL/AT_COMMANDS/parser.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #define PARSER_C //----------------------------------------------------------------------------- #include "rtos_header.h" diff --git a/openair2/UTIL/AT_COMMANDS/parser.h b/openair2/UTIL/AT_COMMANDS/parser.h old mode 100755 new mode 100644 index d232c076aa..634b698ebf --- a/openair2/UTIL/AT_COMMANDS/parser.h +++ b/openair2/UTIL/AT_COMMANDS/parser.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /***************************************************************** * * File Name : parser.h diff --git a/openair2/UTIL/BIGPHYS/bigphys.c b/openair2/UTIL/BIGPHYS/bigphys.c old mode 100755 new mode 100644 index a325217621..aac999749f --- a/openair2/UTIL/BIGPHYS/bigphys.c +++ b/openair2/UTIL/BIGPHYS/bigphys.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include "defs.h" #include "linux/module.h" diff --git a/openair2/UTIL/BIGPHYS/defs.h b/openair2/UTIL/BIGPHYS/defs.h index a371fb0002..716fd5c4aa 100644 --- a/openair2/UTIL/BIGPHYS/defs.h +++ b/openair2/UTIL/BIGPHYS/defs.h @@ -1,30 +1 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - void* bigphys_malloc(int); diff --git a/openair2/UTIL/CLI/cli.c b/openair2/UTIL/CLI/cli.c index 9f5f226047..82b84dddf7 100644 --- a/openair2/UTIL/CLI/cli.c +++ b/openair2/UTIL/CLI/cli.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file cli.c * \brief oai main cli core * \author Navid Nikaein diff --git a/openair2/UTIL/CLI/cli.h b/openair2/UTIL/CLI/cli.h index fc1109b1c6..d4e86a0005 100644 --- a/openair2/UTIL/CLI/cli.h +++ b/openair2/UTIL/CLI/cli.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file cli.h * \brief cli interface header file * \author Navid Nikaein diff --git a/openair2/UTIL/CLI/cli_cmd.c b/openair2/UTIL/CLI/cli_cmd.c index 8f7db6862c..96d4a6d7e6 100644 --- a/openair2/UTIL/CLI/cli_cmd.c +++ b/openair2/UTIL/CLI/cli_cmd.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file cli_cmd.c * \brief oai cli commands * \author Navid Nikaein diff --git a/openair2/UTIL/CLI/cli_if.h b/openair2/UTIL/CLI/cli_if.h index 1ec29d18a5..30c520087d 100644 --- a/openair2/UTIL/CLI/cli_if.h +++ b/openair2/UTIL/CLI/cli_if.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file cli_if.h * \brief cli interface * \author Navid Nikaein diff --git a/openair2/UTIL/CLI/cli_server.c b/openair2/UTIL/CLI/cli_server.c index b93679c384..66bdab7886 100644 --- a/openair2/UTIL/CLI/cli_server.c +++ b/openair2/UTIL/CLI/cli_server.c @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file cli_server.c * \brief oai cli server side implementation * \author Navid Nikaein diff --git a/openair2/UTIL/FIFO/pad_list.c b/openair2/UTIL/FIFO/pad_list.c old mode 100755 new mode 100644 index db7e33f1d6..0252c25683 --- a/openair2/UTIL/FIFO/pad_list.c +++ b/openair2/UTIL/FIFO/pad_list.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file pad_list.c * \brief list management primimtives * \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein diff --git a/openair2/UTIL/FIFO/pad_list.h b/openair2/UTIL/FIFO/pad_list.h old mode 100755 new mode 100644 index 5d018c3e24..189b0b8616 --- a/openair2/UTIL/FIFO/pad_list.h +++ b/openair2/UTIL/FIFO/pad_list.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file pad_list.c * \brief list management primimtives * \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein diff --git a/openair2/UTIL/FIFO/types.h b/openair2/UTIL/FIFO/types.h index f75460d18b..c6b78975b8 100644 --- a/openair2/UTIL/FIFO/types.h +++ b/openair2/UTIL/FIFO/types.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file pad_list.c * \brief list management primimtives * \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein diff --git a/openair2/UTIL/LISTS/list.c b/openair2/UTIL/LISTS/list.c old mode 100755 new mode 100644 index 37450f6b30..6cfd0e2b45 --- a/openair2/UTIL/LISTS/list.c +++ b/openair2/UTIL/LISTS/list.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file list.c * \brief list management primimtives. It includes three implementations: (1) with mem_blocks, (2) standard list implementation (mem usage 314MB) (3) Linux Queue-based implementation (mem usage 394 MB) * \author Navid Nikaein, Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER diff --git a/openair2/UTIL/LOG/log.c b/openair2/UTIL/LOG/log.c old mode 100755 new mode 100644 index 0ef8f99d71..b407375a09 --- a/openair2/UTIL/LOG/log.c +++ b/openair2/UTIL/LOG/log.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file log.c * \brief log implementaion * \author Navid Nikaein diff --git a/openair2/UTIL/LOG/log.h b/openair2/UTIL/LOG/log.h old mode 100755 new mode 100644 index dce5a190e4..b50a750ebb --- a/openair2/UTIL/LOG/log.h +++ b/openair2/UTIL/LOG/log.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file log.h * \brief openair log generator (OLG) for * \author Navid Nikaein diff --git a/openair2/UTIL/LOG/log_extern.h b/openair2/UTIL/LOG/log_extern.h index fbae536524..e70027c78f 100644 --- a/openair2/UTIL/LOG/log_extern.h +++ b/openair2/UTIL/LOG/log_extern.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include"log.h" extern log_t *g_log; diff --git a/openair2/UTIL/LOG/log_if.h b/openair2/UTIL/LOG/log_if.h index 1e89344028..cbcf6e4dac 100644 --- a/openair2/UTIL/LOG/log_if.h +++ b/openair2/UTIL/LOG/log_if.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file log_if.h * \brief log interface * \author Navid Nikaein diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 78e481f3d6..45a7269ab9 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file vcd_signal_dumper.c * \brief Dump functions calls and variables to VCD file. Use GTKWave to display this file. * \author S. Roux diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 0592e78b50..3a54fba8f0 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file vcd_signal_dumper.h * \brief Output functions call to VCD file which is readable by gtkwave. * \author ROUX Sebastien diff --git a/openair2/UTIL/MATH/crc_byte.c b/openair2/UTIL/MATH/crc_byte.c index d305b10aeb..06be0f6d9b 100644 --- a/openair2/UTIL/MATH/crc_byte.c +++ b/openair2/UTIL/MATH/crc_byte.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* May 10, 2001 Modified in June, 2001, to include the length non multiple of 8 diff --git a/openair2/UTIL/MATH/oml.c b/openair2/UTIL/MATH/oml.c index 20c2876207..812723d5a2 100644 --- a/openair2/UTIL/MATH/oml.c +++ b/openair2/UTIL/MATH/oml.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file oml.c * \brief Data structure for distribution libraries * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/MATH/oml.h b/openair2/UTIL/MATH/oml.h index 9b0b863549..a860dfe08d 100644 --- a/openair2/UTIL/MATH/oml.h +++ b/openair2/UTIL/MATH/oml.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file oml.h * \brief Data structure for OCG of OpenAir emulator * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/MATH/random.c b/openair2/UTIL/MATH/random.c index 04c20abaa8..72c2043f2e 100644 --- a/openair2/UTIL/MATH/random.c +++ b/openair2/UTIL/MATH/random.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* random.c ------------------- diff --git a/openair2/UTIL/MATH/random_proto_extern.h b/openair2/UTIL/MATH/random_proto_extern.h index 2fd70eb86c..9a45c1db09 100644 --- a/openair2/UTIL/MATH/random_proto_extern.h +++ b/openair2/UTIL/MATH/random_proto_extern.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* random_proto_extern.h diff --git a/openair2/UTIL/MATH/taus.c b/openair2/UTIL/MATH/taus.c old mode 100755 new mode 100644 index 277c2c16f6..6a766892cc --- a/openair2/UTIL/MATH/taus.c +++ b/openair2/UTIL/MATH/taus.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file taus.c * \brief random number generator per OAI component * \author Navid Nikaein diff --git a/openair2/UTIL/MEM/mem_block.c b/openair2/UTIL/MEM/mem_block.c index f0191a536a..21dfa58358 100644 --- a/openair2/UTIL/MEM/mem_block.c +++ b/openair2/UTIL/MEM/mem_block.c @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*************************************************************************** mem_block.c - description ------------------- diff --git a/openair2/UTIL/MEM/mem_block.h b/openair2/UTIL/MEM/mem_block.h old mode 100755 new mode 100644 index 01a05a786b..b79ceac2ea --- a/openair2/UTIL/MEM/mem_block.h +++ b/openair2/UTIL/MEM/mem_block.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** mem_block.h - description ------------------- diff --git a/openair2/UTIL/MEM/mem_mngt.c b/openair2/UTIL/MEM/mem_mngt.c old mode 100755 new mode 100644 index 1c4ad60552..22f2ddba0d --- a/openair2/UTIL/MEM/mem_mngt.c +++ b/openair2/UTIL/MEM/mem_mngt.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** mem_mngt.c - description ------------------- diff --git a/openair2/UTIL/MEM/mem_mngt_proto_extern.h b/openair2/UTIL/MEM/mem_mngt_proto_extern.h old mode 100755 new mode 100644 index dd20bc2f25..e69de29bb2 --- a/openair2/UTIL/MEM/mem_mngt_proto_extern.h +++ b/openair2/UTIL/MEM/mem_mngt_proto_extern.h @@ -1,30 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - diff --git a/openair2/UTIL/MEM/mem_pool.h b/openair2/UTIL/MEM/mem_pool.h old mode 100755 new mode 100644 index 5d950008de..b9339489b8 --- a/openair2/UTIL/MEM/mem_pool.h +++ b/openair2/UTIL/MEM/mem_pool.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** mem_pool.h - description ------------------- diff --git a/openair2/UTIL/OCG/OCG.c b/openair2/UTIL/OCG/OCG.c index 54f011260b..2d6ebf2a7b 100644 --- a/openair2/UTIL/OCG/OCG.c +++ b/openair2/UTIL/OCG/OCG.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG.c * \brief Main function containing the FSM of OCG * \author Navid Nikaein and Lusheng Wang diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h index cf96de7963..ef3df9718a 100644 --- a/openair2/UTIL/OCG/OCG.h +++ b/openair2/UTIL/OCG/OCG.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG.h * \brief Data structure for OCG of OpenAir emulator * \author Navid Nikaein, Lusheng Wang and Andre Gomes(One source) diff --git a/openair2/UTIL/OCG/OCG_call_emu.h b/openair2/UTIL/OCG/OCG_call_emu.h index 25e455764e..9396e781c8 100644 --- a/openair2/UTIL/OCG/OCG_call_emu.h +++ b/openair2/UTIL/OCG/OCG_call_emu.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_call_emu.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_config_mobi.c b/openair2/UTIL/OCG/OCG_config_mobi.c index f931fe0929..d01f58b8d0 100644 --- a/openair2/UTIL/OCG/OCG_config_mobi.c +++ b/openair2/UTIL/OCG/OCG_config_mobi.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_config_mobi.c * \brief Generate an XML to configure the mobility * \author Lusheng Wang & Navid Nikaein diff --git a/openair2/UTIL/OCG/OCG_config_mobi.h b/openair2/UTIL/OCG/OCG_config_mobi.h index a52c784fc6..b9df48566f 100644 --- a/openair2/UTIL/OCG/OCG_config_mobi.h +++ b/openair2/UTIL/OCG/OCG_config_mobi.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_config_mobi.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_create_dir.c b/openair2/UTIL/OCG/OCG_create_dir.c index 27258ff122..f94fd24f1a 100644 --- a/openair2/UTIL/OCG/OCG_create_dir.c +++ b/openair2/UTIL/OCG/OCG_create_dir.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_create_dir.c * \brief Create directory for current emulation * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_create_dir.h b/openair2/UTIL/OCG/OCG_create_dir.h index f9f8db1690..3aefecf9e8 100644 --- a/openair2/UTIL/OCG/OCG_create_dir.h +++ b/openair2/UTIL/OCG/OCG_create_dir.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_create_dir.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_detect_file.c b/openair2/UTIL/OCG/OCG_detect_file.c index fb18f90bbc..45de2c294a 100644 --- a/openair2/UTIL/OCG/OCG_detect_file.c +++ b/openair2/UTIL/OCG/OCG_detect_file.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_detect_file.c * \brief Detect if a new XML is generated from the web portal * \author Lusheng Wang & Navid Nikaein diff --git a/openair2/UTIL/OCG/OCG_detect_file.h b/openair2/UTIL/OCG/OCG_detect_file.h index de877a4fcf..e7a0d8d9f8 100644 --- a/openair2/UTIL/OCG/OCG_detect_file.h +++ b/openair2/UTIL/OCG/OCG_detect_file.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_detect_file.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_extern.h b/openair2/UTIL/OCG/OCG_extern.h index e03932e406..5a0a74e2a1 100644 --- a/openair2/UTIL/OCG/OCG_extern.h +++ b/openair2/UTIL/OCG/OCG_extern.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef __OCG_EXTERN_H__ #define __OCG_EXTERN_H__ diff --git a/openair2/UTIL/OCG/OCG_generate_report.c b/openair2/UTIL/OCG/OCG_generate_report.c index 5cf448a15d..1863168730 100644 --- a/openair2/UTIL/OCG/OCG_generate_report.c +++ b/openair2/UTIL/OCG/OCG_generate_report.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_generate_report.c * \brief Generate a brief report for debug of OCG * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_generate_report.h b/openair2/UTIL/OCG/OCG_generate_report.h index 2a2f26f827..96ba3789b5 100644 --- a/openair2/UTIL/OCG/OCG_generate_report.h +++ b/openair2/UTIL/OCG/OCG_generate_report.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_generate_report.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_get_opt.c b/openair2/UTIL/OCG/OCG_get_opt.c index 1e9d8a784b..2f1cacb299 100644 --- a/openair2/UTIL/OCG/OCG_get_opt.c +++ b/openair2/UTIL/OCG/OCG_get_opt.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_get_opt.c * \brief Get Options of the OCG command * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_get_opt.h b/openair2/UTIL/OCG/OCG_get_opt.h index d44e96f5c3..14fc479dcf 100644 --- a/openair2/UTIL/OCG/OCG_get_opt.h +++ b/openair2/UTIL/OCG/OCG_get_opt.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_get_opt.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_if.h b/openair2/UTIL/OCG/OCG_if.h index 5f600539dd..34c07735fe 100644 --- a/openair2/UTIL/OCG/OCG_if.h +++ b/openair2/UTIL/OCG/OCG_if.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_if.h * \brief Interfaces to the outside of OCG * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_parse_XML.c b/openair2/UTIL/OCG/OCG_parse_XML.c index 0100d742e1..ac593ea0d2 100644 --- a/openair2/UTIL/OCG/OCG_parse_XML.c +++ b/openair2/UTIL/OCG/OCG_parse_XML.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_parse_XML.c * \brief Parse the content of the XML configuration file * \author Lusheng Wang & Navid Nikaein & Andre Gomes(One Source) diff --git a/openair2/UTIL/OCG/OCG_parse_XML.h b/openair2/UTIL/OCG/OCG_parse_XML.h index 25de67e196..beedd784fa 100644 --- a/openair2/UTIL/OCG/OCG_parse_XML.h +++ b/openair2/UTIL/OCG/OCG_parse_XML.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_parse_XML.h * \brief Variables indicating the element which is currently parsed * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_parse_filename.c b/openair2/UTIL/OCG/OCG_parse_filename.c index 2f2a196fa0..8fd3121399 100644 --- a/openair2/UTIL/OCG/OCG_parse_filename.c +++ b/openair2/UTIL/OCG/OCG_parse_filename.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_parse_filename.c * \brief Parse the filename of the XML file * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_parse_filename.h b/openair2/UTIL/OCG/OCG_parse_filename.h index 4c1bd6989d..9e10c7fd32 100644 --- a/openair2/UTIL/OCG/OCG_parse_filename.h +++ b/openair2/UTIL/OCG/OCG_parse_filename.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_parse_filename.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_save_XML.c b/openair2/UTIL/OCG/OCG_save_XML.c index ec94ab9f8e..3be439f85f 100644 --- a/openair2/UTIL/OCG/OCG_save_XML.c +++ b/openair2/UTIL/OCG/OCG_save_XML.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_save_XML.c * \brief Save the XML configuration file in the created directory for current emulation * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_save_XML.h b/openair2/UTIL/OCG/OCG_save_XML.h index d8cc24c9e8..6ea6538ca4 100644 --- a/openair2/UTIL/OCG/OCG_save_XML.h +++ b/openair2/UTIL/OCG/OCG_save_XML.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OCG_save_XML.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_vars.h b/openair2/UTIL/OCG/OCG_vars.h index f1aab9b580..597494e41e 100644 --- a/openair2/UTIL/OCG/OCG_vars.h +++ b/openair2/UTIL/OCG/OCG_vars.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef __OCG_VARS_H__ #define __OCG_VARS_H__ diff --git a/openair2/UTIL/OMG/TraCIConstants.h b/openair2/UTIL/OMG/TraCIConstants.h index 1defa16aad..8968c2a283 100644 --- a/openair2/UTIL/OMG/TraCIConstants.h +++ b/openair2/UTIL/OMG/TraCIConstants.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /****************************************************************************/ /// @file TraCIConstants.h /// @author Axel Wegener diff --git a/openair2/UTIL/OMG/client_traci_OMG.c b/openair2/UTIL/OMG/client_traci_OMG.c index b3b43f49b2..de1975d69b 100644 --- a/openair2/UTIL/OMG/client_traci_OMG.c +++ b/openair2/UTIL/OMG/client_traci_OMG.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file client_traci_OMG.c * \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces. * \author S. Uppoor, J. Harri diff --git a/openair2/UTIL/OMG/client_traci_OMG.h b/openair2/UTIL/OMG/client_traci_OMG.h index 4d8b9e86d1..827ddfc263 100644 --- a/openair2/UTIL/OMG/client_traci_OMG.h +++ b/openair2/UTIL/OMG/client_traci_OMG.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file client_traci_OMG.h * \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces. * \author S. Uppoor, J. Harri diff --git a/openair2/UTIL/OMG/common.c b/openair2/UTIL/OMG/common.c index d02ccf63ce..1062d69215 100644 --- a/openair2/UTIL/OMG/common.c +++ b/openair2/UTIL/OMG/common.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OMG.c * \brief Main function containing the OMG interface * \author M. Mahersi, J. Harri, N. Nikaein, diff --git a/openair2/UTIL/OMG/defs.h b/openair2/UTIL/OMG/defs.h index 99de25b176..913a7e05f4 100644 --- a/openair2/UTIL/OMG/defs.h +++ b/openair2/UTIL/OMG/defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /** * \file defs.h * \brief Typedefs & Prototypes of OMG functions diff --git a/openair2/UTIL/OMG/grid.c b/openair2/UTIL/OMG/grid.c index 1c3fc0cc5c..68dd35b5d7 100644 --- a/openair2/UTIL/OMG/grid.c +++ b/openair2/UTIL/OMG/grid.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file grid.c * \brief * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/grid.h b/openair2/UTIL/OMG/grid.h index 138eb0b552..819fa8fe19 100644 --- a/openair2/UTIL/OMG/grid.h +++ b/openair2/UTIL/OMG/grid.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /** * \file grid.h **/ diff --git a/openair2/UTIL/OMG/id_manager.c b/openair2/UTIL/OMG/id_manager.c index d37e56210d..ebd1d9d158 100644 --- a/openair2/UTIL/OMG/id_manager.c +++ b/openair2/UTIL/OMG/id_manager.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file id_manager.c * \brief Main function containing the OMG ID Manager * \author J. Harri diff --git a/openair2/UTIL/OMG/id_manager.h b/openair2/UTIL/OMG/id_manager.h index d255d84dea..82b0fe2b20 100644 --- a/openair2/UTIL/OMG/id_manager.h +++ b/openair2/UTIL/OMG/id_manager.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file id_manager.h * \brief Prototypes of the OMG ID Manager to handle the mapping between OAI ID and SUMO ID * \author J. Harri diff --git a/openair2/UTIL/OMG/job.c b/openair2/UTIL/OMG/job.c index e43ed1a3eb..8b9e4f87c9 100644 --- a/openair2/UTIL/OMG/job.c +++ b/openair2/UTIL/OMG/job.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file job.c * \brief handle jobs for future nodes' update * \author S. Gashaw, M. Mahersi, J. Harri, N. Nikaein, diff --git a/openair2/UTIL/OMG/mobility_parser.c b/openair2/UTIL/OMG/mobility_parser.c index d011dbe34f..7a56609cf4 100644 --- a/openair2/UTIL/OMG/mobility_parser.c +++ b/openair2/UTIL/OMG/mobility_parser.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file mobility_parser.c * \brief A parser for trace-based mobility information (parsed from a file) * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/mobility_parser.h b/openair2/UTIL/OMG/mobility_parser.h index 834f01d64a..fb1eaaa7ce 100644 --- a/openair2/UTIL/OMG/mobility_parser.h +++ b/openair2/UTIL/OMG/mobility_parser.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file mobility_parser.h * \brief A parser for trace-based mobility information (parsed from a file) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/omg.c b/openair2/UTIL/OMG/omg.c index 12b9395f75..dffaf8477c 100644 --- a/openair2/UTIL/OMG/omg.c +++ b/openair2/UTIL/OMG/omg.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file OMG.c * \brief Main function containing the OMG API to oaisim or any other simulator/emulator * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/omg.h b/openair2/UTIL/OMG/omg.h index 1df5205df7..ea96582496 100644 --- a/openair2/UTIL/OMG/omg.h +++ b/openair2/UTIL/OMG/omg.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file OMG.h * \brief Prototypes of OMG APIs * \author M. Mahersi, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/omg_constants.h b/openair2/UTIL/OMG/omg_constants.h index ba09ac6dd8..0476b3aedc 100644 --- a/openair2/UTIL/OMG/omg_constants.h +++ b/openair2/UTIL/OMG/omg_constants.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /** * \file omg_constants.h * \brief Constants and Enumarations diff --git a/openair2/UTIL/OMG/omg_hashtable.c b/openair2/UTIL/OMG/omg_hashtable.c index 761750a634..122eb35c0c 100644 --- a/openair2/UTIL/OMG/omg_hashtable.c +++ b/openair2/UTIL/OMG/omg_hashtable.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file omg_hashtable.c * \brief A 'C' implementation of a hashtable * \author S. Uppoor diff --git a/openair2/UTIL/OMG/omg_hashtable.h b/openair2/UTIL/OMG/omg_hashtable.h index c5437e381c..057388d646 100644 --- a/openair2/UTIL/OMG/omg_hashtable.h +++ b/openair2/UTIL/OMG/omg_hashtable.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file omg_hashtable.h * \brief A 'C' implementation of a hashtable * \author S. Uppoor diff --git a/openair2/UTIL/OMG/omg_vars.h b/openair2/UTIL/OMG/omg_vars.h index f2715cdf1b..fecd57537a 100644 --- a/openair2/UTIL/OMG/omg_vars.h +++ b/openair2/UTIL/OMG/omg_vars.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /** * \file omg_vars.h * \brief Global variables diff --git a/openair2/UTIL/OMG/rwalk.c b/openair2/UTIL/OMG/rwalk.c index 1a406d20e8..26cd4762e8 100644 --- a/openair2/UTIL/OMG/rwalk.c +++ b/openair2/UTIL/OMG/rwalk.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rwalk.c * \brief random walk mobility generator * \author S. Gashaw, N. Nikaein, J. Harri, M. Mahersi diff --git a/openair2/UTIL/OMG/rwalk.h b/openair2/UTIL/OMG/rwalk.h index 6d38a8f799..711243f190 100644 --- a/openair2/UTIL/OMG/rwalk.h +++ b/openair2/UTIL/OMG/rwalk.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /** * \file rwalk.h * \brief Functions used for the RWALK Model diff --git a/openair2/UTIL/OMG/rwp.c b/openair2/UTIL/OMG/rwp.c index 6766cd9555..89194c3b8c 100644 --- a/openair2/UTIL/OMG/rwp.c +++ b/openair2/UTIL/OMG/rwp.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rwp.c * \brief random waypoint mobility generator * \author M. Mahersi, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/rwp.h b/openair2/UTIL/OMG/rwp.h index ae895b95e3..d41e5868bd 100644 --- a/openair2/UTIL/OMG/rwp.h +++ b/openair2/UTIL/OMG/rwp.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * \file rwp.h * \brief Functions used for the Random WayPoint Model diff --git a/openair2/UTIL/OMG/socket_traci_OMG.c b/openair2/UTIL/OMG/socket_traci_OMG.c index 1a62ec04da..c9bebae7ee 100644 --- a/openair2/UTIL/OMG/socket_traci_OMG.c +++ b/openair2/UTIL/OMG/socket_traci_OMG.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file socket_traci_OMG.c * \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/socket_traci_OMG.h b/openair2/UTIL/OMG/socket_traci_OMG.h index a873591148..55a244a712 100644 --- a/openair2/UTIL/OMG/socket_traci_OMG.h +++ b/openair2/UTIL/OMG/socket_traci_OMG.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file socket_traci_OMG.h * \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/static.c b/openair2/UTIL/OMG/static.c index 8305c6e9b7..b188bc57b3 100644 --- a/openair2/UTIL/OMG/static.c +++ b/openair2/UTIL/OMG/static.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file rwalk.c * \brief static mobility generator * \author M. Mahersi, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/static.h b/openair2/UTIL/OMG/static.h index 1b5cb0f72f..0bd0303867 100644 --- a/openair2/UTIL/OMG/static.h +++ b/openair2/UTIL/OMG/static.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /** * \file static.h * \brief Prototypes of the functions used for the STATIC model diff --git a/openair2/UTIL/OMG/steadystaterwp.c b/openair2/UTIL/OMG/steadystaterwp.c index ba2e0d88f7..9dcb99b32c 100644 --- a/openair2/UTIL/OMG/steadystaterwp.c +++ b/openair2/UTIL/OMG/steadystaterwp.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file steadystaterwp.c * \brief random waypoint mobility generator * \author S. Gashaw, J. Harri, N. Nikaein, diff --git a/openair2/UTIL/OMG/steadystaterwp.h b/openair2/UTIL/OMG/steadystaterwp.h index 1e274d9e1f..b81e966e3f 100644 --- a/openair2/UTIL/OMG/steadystaterwp.h +++ b/openair2/UTIL/OMG/steadystaterwp.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file steadystaterwp.h * \brief random waypoint mobility generator * \date 2014 diff --git a/openair2/UTIL/OMG/storage_traci_OMG.c b/openair2/UTIL/OMG/storage_traci_OMG.c index f8ccfdc059..18f93ed5df 100644 --- a/openair2/UTIL/OMG/storage_traci_OMG.c +++ b/openair2/UTIL/OMG/storage_traci_OMG.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file storage_traci_OMG.c * \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/storage_traci_OMG.h b/openair2/UTIL/OMG/storage_traci_OMG.h index e1f97615c6..4742f7199e 100644 --- a/openair2/UTIL/OMG/storage_traci_OMG.h +++ b/openair2/UTIL/OMG/storage_traci_OMG.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file storage_traci_OMG.h * \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/sumo.c b/openair2/UTIL/OMG/sumo.c index 4af34d0bc1..d9248797cb 100644 --- a/openair2/UTIL/OMG/sumo.c +++ b/openair2/UTIL/OMG/sumo.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file sumo.c * \brief The OMG interface to SUMO (Simulation of Urban Mobility) * \author S. Uppoor, J. Harri diff --git a/openair2/UTIL/OMG/sumo.h b/openair2/UTIL/OMG/sumo.h index 71b36bf310..cf9a7ef5ba 100644 --- a/openair2/UTIL/OMG/sumo.h +++ b/openair2/UTIL/OMG/sumo.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file sumo.h * \brief The OMG interface to SUMO (Simulation of Urban Mobility) * \author S. Uppoor, J. Harri diff --git a/openair2/UTIL/OMG/trace.c b/openair2/UTIL/OMG/trace.c index 144b9ae597..9e8ad3ca6d 100644 --- a/openair2/UTIL/OMG/trace.c +++ b/openair2/UTIL/OMG/trace.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file trace.c * \brief The trace-based mobility model for OMG/OAI (mobility is statically imported from a file) * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/trace.h b/openair2/UTIL/OMG/trace.h index b3825e2fa8..26f1e02646 100644 --- a/openair2/UTIL/OMG/trace.h +++ b/openair2/UTIL/OMG/trace.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file trace.h * \brief The trace-based mobility model for OMG/OAI (mobility is statically imported from a file) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/trace_hashtable.c b/openair2/UTIL/OMG/trace_hashtable.c index 51f745de89..1a36b9dd86 100644 --- a/openair2/UTIL/OMG/trace_hashtable.c +++ b/openair2/UTIL/OMG/trace_hashtable.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file hashtable.c * \brief A 'C' implementation of a hashtable * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/trace_hashtable.h b/openair2/UTIL/OMG/trace_hashtable.h index cd7feb73fc..ba06f07cd1 100644 --- a/openair2/UTIL/OMG/trace_hashtable.h +++ b/openair2/UTIL/OMG/trace_hashtable.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file trace_hashtable.h * \brief A 'C' implementation of a hashtable * \author S. Uppoor diff --git a/openair2/UTIL/OMV/communicationthread.cpp b/openair2/UTIL/OMV/communicationthread.cpp old mode 100755 new mode 100644 index e528ea356d..f71674e2fb --- a/openair2/UTIL/OMV/communicationthread.cpp +++ b/openair2/UTIL/OMV/communicationthread.cpp @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file communicationthread.cpp * \brief this thread is to process the communication between the simulator and the visualisor * \author M. Mosli diff --git a/openair2/UTIL/OMV/communicationthread.h b/openair2/UTIL/OMV/communicationthread.h old mode 100755 new mode 100644 index e83d20665c..5cfcfb2aec --- a/openair2/UTIL/OMV/communicationthread.h +++ b/openair2/UTIL/OMV/communicationthread.h @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file communicationthread.h * \brief this thread is to process the communication between the simulator and the visualisor * \author M. Mosli diff --git a/openair2/UTIL/OMV/mywindow.cpp b/openair2/UTIL/OMV/mywindow.cpp old mode 100755 new mode 100644 index b6461fba93..a5e5a682b9 --- a/openair2/UTIL/OMV/mywindow.cpp +++ b/openair2/UTIL/OMV/mywindow.cpp @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file mywindow.cpp * \brief manages the window and its components * \author M. Mosli diff --git a/openair2/UTIL/OMV/mywindow.h b/openair2/UTIL/OMV/mywindow.h old mode 100755 new mode 100644 index b361fb94c6..59d6b0f5ce --- a/openair2/UTIL/OMV/mywindow.h +++ b/openair2/UTIL/OMV/mywindow.h @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file mywindow.h * \brief manages the window and its components * \author M. Mosli diff --git a/openair2/UTIL/OMV/omv.cpp b/openair2/UTIL/OMV/omv.cpp old mode 100755 new mode 100644 index 9b5c858b8c..5e3d7ade90 --- a/openair2/UTIL/OMV/omv.cpp +++ b/openair2/UTIL/OMV/omv.cpp @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file omv.cpp * \brief openair mobility visualisor * \author M. Mosli diff --git a/openair2/UTIL/OMV/openglwidget.cpp b/openair2/UTIL/OMV/openglwidget.cpp old mode 100755 new mode 100644 index c5fddcc7b1..b8093f38b0 --- a/openair2/UTIL/OMV/openglwidget.cpp +++ b/openair2/UTIL/OMV/openglwidget.cpp @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file openglwidget.cpp * \brief area devoted to draw the nodes and their connections * \author M. Mosli diff --git a/openair2/UTIL/OMV/openglwidget.h b/openair2/UTIL/OMV/openglwidget.h old mode 100755 new mode 100644 index c7eac486ae..bf87092a38 --- a/openair2/UTIL/OMV/openglwidget.h +++ b/openair2/UTIL/OMV/openglwidget.h @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file openglwidget.cpp * \brief area devoted to draw the nodes and their connections * \author M. Mosli diff --git a/openair2/UTIL/OMV/structures.h b/openair2/UTIL/OMV/structures.h old mode 100755 new mode 100644 index 6c131371cb..c722c379ec --- a/openair2/UTIL/OMV/structures.h +++ b/openair2/UTIL/OMV/structures.h @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - - /*! \file structures.h * \brief structures used for the * \author M. Mosli diff --git a/openair2/UTIL/OPT/mac_pcap.h b/openair2/UTIL/OPT/mac_pcap.h index f44c12ec40..f1d4b32492 100644 --- a/openair2/UTIL/OPT/mac_pcap.h +++ b/openair2/UTIL/OPT/mac_pcap.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - #include #include #include diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h index bb3a099e12..780b00642e 100644 --- a/openair2/UTIL/OPT/opt.h +++ b/openair2/UTIL/OPT/opt.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*____________________________OPT/opt.h___________________________ Authors: Navid NIKAIEN Company: EURECOM diff --git a/openair2/UTIL/OPT/socket_sender.c b/openair2/UTIL/OPT/socket_sender.c index c984895351..e69de29bb2 100644 --- a/openair2/UTIL/OPT/socket_sender.c +++ b/openair2/UTIL/OPT/socket_sender.c @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ diff --git a/openair2/UTIL/OPT/vars.h b/openair2/UTIL/OPT/vars.h index 4e03467537..2fee168ed3 100644 --- a/openair2/UTIL/OPT/vars.h +++ b/openair2/UTIL/OPT/vars.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*____________________________OPT/var.h___________________________ Authors: Navid NIKAIEN Company: EURECOM diff --git a/openair2/UTIL/OSA/osa_defs.h b/openair2/UTIL/OSA/osa_defs.h index c11f93d2bb..804a608e0a 100644 --- a/openair2/UTIL/OSA/osa_defs.h +++ b/openair2/UTIL/OSA/osa_defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! * \file secu_defs.h * \brief Openair security algorithms functions implementing 3GPP TS 33.401 diff --git a/openair2/UTIL/OSA/osa_internal.h b/openair2/UTIL/OSA/osa_internal.h index a42f925322..3f0116017d 100644 --- a/openair2/UTIL/OSA/osa_internal.h +++ b/openair2/UTIL/OSA/osa_internal.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef OSA_INTERNAL_H_ #define OSA_INTERNAL_H_ diff --git a/openair2/UTIL/OSA/osa_key_deriver.c b/openair2/UTIL/OSA/osa_key_deriver.c index d8b5fba58b..cbe62029ea 100644 --- a/openair2/UTIL/OSA/osa_key_deriver.c +++ b/openair2/UTIL/OSA/osa_key_deriver.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include diff --git a/openair2/UTIL/OSA/osa_snow3g.h b/openair2/UTIL/OSA/osa_snow3g.h index 69a835e60d..8f776094b9 100644 --- a/openair2/UTIL/OSA/osa_snow3g.h +++ b/openair2/UTIL/OSA/osa_snow3g.h @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - - -*******************************************************************************/ /*! \file snow3g.h * \brief * \author Open source Adapted from Specification of the 3GPP Confidentiality and diff --git a/openair2/UTIL/OSA/osa_stream_eea.c b/openair2/UTIL/OSA/osa_stream_eea.c index 8e346631ec..dc60530c92 100644 --- a/openair2/UTIL/OSA/osa_stream_eea.c +++ b/openair2/UTIL/OSA/osa_stream_eea.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include #include diff --git a/openair2/UTIL/OSA/osa_stream_eia.c b/openair2/UTIL/OSA/osa_stream_eia.c index 22ad10d25d..5be42fac51 100644 --- a/openair2/UTIL/OSA/osa_stream_eia.c +++ b/openair2/UTIL/OSA/osa_stream_eia.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include #include diff --git a/openair2/UTIL/OTG/main.c b/openair2/UTIL/OTG/main.c index d52a9258ff..e019463538 100644 --- a/openair2/UTIL/OTG/main.c +++ b/openair2/UTIL/OTG/main.c @@ -1,32 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2011 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - /*! \file main.c * \brief main program for OTG CX + RX * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg.c b/openair2/UTIL/OTG/otg.c index e167eb7b45..f64bb2d82a 100644 --- a/openair2/UTIL/OTG/otg.c +++ b/openair2/UTIL/OTG/otg.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg.c * \brief common function for otc tx and rx * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg.h b/openair2/UTIL/OTG/otg.h index 4c3f5bf8d9..67800351bd 100644 --- a/openair2/UTIL/OTG/otg.h +++ b/openair2/UTIL/OTG/otg.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg.h * \brief Data structure and functions for OTG * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_config.h b/openair2/UTIL/OTG/otg_config.h index 7e0e014375..92755cdca3 100644 --- a/openair2/UTIL/OTG/otg_config.h +++ b/openair2/UTIL/OTG/otg_config.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_config.h main used structures * \brief otg structure * \author Navid Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_defs.h b/openair2/UTIL/OTG/otg_defs.h index c6cee01ec2..14f1f57115 100644 --- a/openair2/UTIL/OTG/otg_defs.h +++ b/openair2/UTIL/OTG/otg_defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file otg_defs.h main used structures * \brief otg structure * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_externs.h b/openair2/UTIL/OTG/otg_externs.h index 7ceccfce35..643b6ce9a5 100644 --- a/openair2/UTIL/OTG/otg_externs.h +++ b/openair2/UTIL/OTG/otg_externs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_externs.h * \brief extern parameters * \author n. nikaein A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_form.c b/openair2/UTIL/OTG/otg_form.c index db77c6a801..bcad6da091 100644 --- a/openair2/UTIL/OTG/otg_form.c +++ b/openair2/UTIL/OTG/otg_form.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_config.h main used structures * \brief otg structure * \author A. Hafsaoui and Navid Nikaein diff --git a/openair2/UTIL/OTG/otg_form.h b/openair2/UTIL/OTG/otg_form.h index 153ec75b32..475eefe320 100644 --- a/openair2/UTIL/OTG/otg_form.h +++ b/openair2/UTIL/OTG/otg_form.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #ifndef __OTG_FORM_H__ # define __OTG_FORM_H__ diff --git a/openair2/UTIL/OTG/otg_kpi.c b/openair2/UTIL/OTG/otg_kpi.c index 877150d892..8b67cb3e64 100644 --- a/openair2/UTIL/OTG/otg_kpi.c +++ b/openair2/UTIL/OTG/otg_kpi.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_kpi.c main used funstions to compute KPIs * \brief define KPIs to compute for performance analysis * \author Navid Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_kpi.h b/openair2/UTIL/OTG/otg_kpi.h index c4ea232d87..4f71e9017c 100644 --- a/openair2/UTIL/OTG/otg_kpi.h +++ b/openair2/UTIL/OTG/otg_kpi.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_kpi.h functions to compute OTG KPIs * \brief desribe function for KPIs computation * \author navid nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_models.c b/openair2/UTIL/OTG/otg_models.c index e671160444..b99f273518 100644 --- a/openair2/UTIL/OTG/otg_models.c +++ b/openair2/UTIL/OTG/otg_models.c @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file otg_models.c * \brief function containing the OTG TX traffic generation functions * \author M. Laner and navid nikaein diff --git a/openair2/UTIL/OTG/otg_models.h b/openair2/UTIL/OTG/otg_models.h index 51944fc15e..9b3a2592b5 100644 --- a/openair2/UTIL/OTG/otg_models.h +++ b/openair2/UTIL/OTG/otg_models.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_models.h * \brief Data structure and functions for OTG * \author M. Laner and navid nikaein diff --git a/openair2/UTIL/OTG/otg_rx.c b/openair2/UTIL/OTG/otg_rx.c index 3f0d35d223..dbbeb6b0f6 100644 --- a/openair2/UTIL/OTG/otg_rx.c +++ b/openair2/UTIL/OTG/otg_rx.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file otg_rx.c * \brief function containing the OTG traffic generation functions * \author Navid Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_rx.h b/openair2/UTIL/OTG/otg_rx.h index 21c6fd85cb..4f279198a0 100644 --- a/openair2/UTIL/OTG/otg_rx.h +++ b/openair2/UTIL/OTG/otg_rx.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_rx.h * \brief Data structure and functions for OTG receiver * \author navid nikaein A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_rx_socket.c b/openair2/UTIL/OTG/otg_rx_socket.c index e9d2e8a863..77bc7aa8fa 100644 --- a/openair2/UTIL/OTG/otg_rx_socket.c +++ b/openair2/UTIL/OTG/otg_rx_socket.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_rx_socket.c * \brief function containing the OTG RX traffic generation functions with sockets * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_rx_socket.h b/openair2/UTIL/OTG/otg_rx_socket.h index 0128269270..d78b18abae 100644 --- a/openair2/UTIL/OTG/otg_rx_socket.h +++ b/openair2/UTIL/OTG/otg_rx_socket.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_rx_socket.h * \brief brief explain how this block is organized, and how it works: OTG RX traffic generation functions with sockets * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_tx.c b/openair2/UTIL/OTG/otg_tx.c index e70bccbc73..6cd4452255 100644 --- a/openair2/UTIL/OTG/otg_tx.c +++ b/openair2/UTIL/OTG/otg_tx.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file otg_tx.c * \brief function containing the OTG TX traffic generation functions * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_tx.h b/openair2/UTIL/OTG/otg_tx.h index 26013dfe47..5d2fa42efe 100644 --- a/openair2/UTIL/OTG/otg_tx.h +++ b/openair2/UTIL/OTG/otg_tx.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_tx.h * \brief Data structure and functions for OTG * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_tx_socket.c b/openair2/UTIL/OTG/otg_tx_socket.c index 60b9df020c..0052bf9127 100644 --- a/openair2/UTIL/OTG/otg_tx_socket.c +++ b/openair2/UTIL/OTG/otg_tx_socket.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_tx_socket.c * \brief function containing the OTG TX traffic generation functions with sockets * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_tx_socket.h b/openair2/UTIL/OTG/otg_tx_socket.h index 2c5372773f..ef7639eecc 100644 --- a/openair2/UTIL/OTG/otg_tx_socket.h +++ b/openair2/UTIL/OTG/otg_tx_socket.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_tx_socket.h * \brief brief explain how this block is organized, and how it works: OTG TX traffic generation functions with sockets * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_vars.h b/openair2/UTIL/OTG/otg_vars.h index cc4c56ce9e..4a91309ef3 100644 --- a/openair2/UTIL/OTG/otg_vars.h +++ b/openair2/UTIL/OTG/otg_vars.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file otg_vars.h * \brief Global structure * \author navid nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/traffic_config.h b/openair2/UTIL/OTG/traffic_config.h index 3e982b1742..7640f64057 100644 --- a/openair2/UTIL/OTG/traffic_config.h +++ b/openair2/UTIL/OTG/traffic_config.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - //IDT DISTRIBUTION PARAMETERS #define IDT_DIST GAUSSIAN #define IDT_MIN 2 diff --git a/openair2/UTIL/TIMER/umts_timer.c b/openair2/UTIL/TIMER/umts_timer.c old mode 100755 new mode 100644 index 9562aee67d..97e009e65b --- a/openair2/UTIL/TIMER/umts_timer.c +++ b/openair2/UTIL/TIMER/umts_timer.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** umts_timer.c - description ------------------- diff --git a/openair2/UTIL/TIMER/umts_timer.h b/openair2/UTIL/TIMER/umts_timer.h old mode 100755 new mode 100644 index a857244ddf..ea32e5d7be --- a/openair2/UTIL/TIMER/umts_timer.h +++ b/openair2/UTIL/TIMER/umts_timer.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** umts_timer.h - description ------------------- diff --git a/openair2/UTIL/TIMER/umts_timer_proto_extern.h b/openair2/UTIL/TIMER/umts_timer_proto_extern.h old mode 100755 new mode 100644 index ca50d3193f..a60ad0da6d --- a/openair2/UTIL/TIMER/umts_timer_proto_extern.h +++ b/openair2/UTIL/TIMER/umts_timer_proto_extern.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** umts_timer_proto_extern.h - description ------------------- diff --git a/openair2/UTIL/TIMER/umts_timer_struct.h b/openair2/UTIL/TIMER/umts_timer_struct.h old mode 100755 new mode 100644 index 46b7216cd9..5aac7a5a88 --- a/openair2/UTIL/TIMER/umts_timer_struct.h +++ b/openair2/UTIL/TIMER/umts_timer_struct.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*************************************************************************** umts_timer_struct.h - description ------------------- diff --git a/openair2/UTIL/TRACE/fifo_printf.c b/openair2/UTIL/TRACE/fifo_printf.c old mode 100755 new mode 100644 index 2c5f5202f9..58d12f713f --- a/openair2/UTIL/TRACE/fifo_printf.c +++ b/openair2/UTIL/TRACE/fifo_printf.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* * fifo_printf.c * ------------------- diff --git a/openair2/UTIL/TRACE/fifo_printf.h b/openair2/UTIL/TRACE/fifo_printf.h old mode 100755 new mode 100644 index 84571e355c..5925fb5098 --- a/openair2/UTIL/TRACE/fifo_printf.h +++ b/openair2/UTIL/TRACE/fifo_printf.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** fifo_printf.h - description ------------------- diff --git a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h old mode 100755 new mode 100644 index 66456af305..2c417d5bda --- a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h +++ b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*************************************************************************** fifo_printf_proto_extern.h - description ------------------- diff --git a/openair2/UTIL/TRACE/print.h b/openair2/UTIL/TRACE/print.h old mode 100755 new mode 100644 index 2c465e0fa5..a7a2f144d2 --- a/openair2/UTIL/TRACE/print.h +++ b/openair2/UTIL/TRACE/print.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*************************************************************************** print.h - description ------------------- diff --git a/openair2/X2AP/x2ap.c b/openair2/X2AP/x2ap.c index 69b70964a4..b9a36061aa 100644 --- a/openair2/X2AP/x2ap.c +++ b/openair2/X2AP/x2ap.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include #include diff --git a/openair2/X2AP/x2ap.h b/openair2/X2AP/x2ap.h index 561f0953c3..2f82d35a50 100644 --- a/openair2/X2AP/x2ap.h +++ b/openair2/X2AP/x2ap.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #include #include diff --git a/openair2/X2AP/x2ap_common.c b/openair2/X2AP/x2ap_common.c old mode 100755 new mode 100644 index 5565835997..2d6b60c349 --- a/openair2/X2AP/x2ap_common.c +++ b/openair2/X2AP/x2ap_common.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file x2ap_common.c * \brief x2ap procedures for both eNB and MME * \author Sebastien ROUX , Lionel GAUTHIER diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h old mode 100755 new mode 100644 index 04ad77f8e3..2e28edba35 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - #if HAVE_CONFIG_H_ # include "config.h" #endif diff --git a/openair3/COMMON/common_types.h b/openair3/COMMON/common_types.h index 18cba9fb81..f53e1ca6c7 100644 --- a/openair3/COMMON/common_types.h +++ b/openair3/COMMON/common_types.h @@ -1,34 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - - #include #include "commonDef.h" diff --git a/openair3/COMMON/gtpv1_u_messages_def.h b/openair3/COMMON/gtpv1_u_messages_def.h index d58b2dfc2e..1774923056 100644 --- a/openair3/COMMON/gtpv1_u_messages_def.h +++ b/openair3/COMMON/gtpv1_u_messages_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - MESSAGE_DEF(GTPV1U_CREATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, Gtpv1uCreateTunnelReq, gtpv1uCreateTunnelReq) MESSAGE_DEF(GTPV1U_CREATE_TUNNEL_RESP, MESSAGE_PRIORITY_MED, Gtpv1uCreateTunnelResp, gtpv1uCreateTunnelResp) MESSAGE_DEF(GTPV1U_UPDATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, Gtpv1uUpdateTunnelReq, gtpv1uUpdateTunnelReq) diff --git a/openair3/COMMON/gtpv1_u_messages_types.h b/openair3/COMMON/gtpv1_u_messages_types.h index 13fd0fd8a0..34182a76fc 100644 --- a/openair3/COMMON/gtpv1_u_messages_types.h +++ b/openair3/COMMON/gtpv1_u_messages_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef GTPV1_U_MESSAGES_TYPES_H_ #define GTPV1_U_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/intertask_interface_conf.h b/openair3/COMMON/intertask_interface_conf.h index 9ab7cc3151..78dc2dba13 100644 --- a/openair3/COMMON/intertask_interface_conf.h +++ b/openair3/COMMON/intertask_interface_conf.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - /* * intertask_interface_conf.h * diff --git a/openair3/COMMON/messages_def.h b/openair3/COMMON/messages_def.h index 2b8667507b..66df39e9ad 100644 --- a/openair3/COMMON/messages_def.h +++ b/openair3/COMMON/messages_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" #include "timer_messages_def.h" diff --git a/openair3/COMMON/messages_types.h b/openair3/COMMON/messages_types.h index 46a7261c59..dbf49c7478 100644 --- a/openair3/COMMON/messages_types.h +++ b/openair3/COMMON/messages_types.h @@ -1,33 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - - #ifndef MESSAGES_TYPES_H_ #define MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/nas_messages_def.h b/openair3/COMMON/nas_messages_def.h index 7c7e670511..b19530bdf8 100644 --- a/openair3/COMMON/nas_messages_def.h +++ b/openair3/COMMON/nas_messages_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - //WARNING: Do not include this header directly. Use intertask_interface.h instead. // Messages for NAS logging diff --git a/openair3/COMMON/nas_messages_types.h b/openair3/COMMON/nas_messages_types.h index 4cbdad2c99..ec843e91f5 100644 --- a/openair3/COMMON/nas_messages_types.h +++ b/openair3/COMMON/nas_messages_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include "as_message.h" #include "nas_message.h" diff --git a/openair3/COMMON/s1ap_messages_def.h b/openair3/COMMON/s1ap_messages_def.h index eeb48a64b0..b4dc15dcca 100644 --- a/openair3/COMMON/s1ap_messages_def.h +++ b/openair3/COMMON/s1ap_messages_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - //WARNING: Do not include this header directly. Use intertask_interface.h instead. /* Messages for S1AP logging */ diff --git a/openair3/COMMON/s1ap_messages_types.h b/openair3/COMMON/s1ap_messages_types.h index af45f57029..a43b2d8ddf 100644 --- a/openair3/COMMON/s1ap_messages_types.h +++ b/openair3/COMMON/s1ap_messages_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef S1AP_MESSAGES_TYPES_H_ #define S1AP_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/sctp_messages_def.h b/openair3/COMMON/sctp_messages_def.h index e56598bc44..54b7a5584c 100644 --- a/openair3/COMMON/sctp_messages_def.h +++ b/openair3/COMMON/sctp_messages_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - //WARNING: Do not include this header directly. Use intertask_interface.h instead. MESSAGE_DEF(SCTP_INIT_MSG, MESSAGE_PRIORITY_MED, SctpInit, sctpInit) diff --git a/openair3/COMMON/sctp_messages_types.h b/openair3/COMMON/sctp_messages_types.h index 5d1aef92ed..70d7014c39 100644 --- a/openair3/COMMON/sctp_messages_types.h +++ b/openair3/COMMON/sctp_messages_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef SCTP_MESSAGES_TYPES_H_ #define SCTP_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/security_types.h b/openair3/COMMON/security_types.h index 3428b23e7a..7feb7540c0 100644 --- a/openair3/COMMON/security_types.h +++ b/openair3/COMMON/security_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair3/COMMON/tasks_def.h b/openair3/COMMON/tasks_def.h index 4590bc002a..8db2390325 100644 --- a/openair3/COMMON/tasks_def.h +++ b/openair3/COMMON/tasks_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10) diff --git a/openair3/COMMON/udp_messages_def.h b/openair3/COMMON/udp_messages_def.h index 551788a2bb..08e98b801e 100644 --- a/openair3/COMMON/udp_messages_def.h +++ b/openair3/COMMON/udp_messages_def.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - MESSAGE_DEF(UDP_INIT, MESSAGE_PRIORITY_MED, udp_init_t, udp_init) MESSAGE_DEF(UDP_DATA_REQ, MESSAGE_PRIORITY_MED, udp_data_req_t, udp_data_req) MESSAGE_DEF(UDP_DATA_IND, MESSAGE_PRIORITY_MED, udp_data_ind_t, udp_data_ind) diff --git a/openair3/COMMON/udp_messages_types.h b/openair3/COMMON/udp_messages_types.h index a44ab44c16..d609cb8d14 100644 --- a/openair3/COMMON/udp_messages_types.h +++ b/openair3/COMMON/udp_messages_types.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #ifndef UDP_MESSAGES_TYPES_H_ #define UDP_MESSAGES_TYPES_H_ diff --git a/openair3/GTPV1-U/gtpv1u.h b/openair3/GTPV1-U/gtpv1u.h index e2af712f7b..4b4158cde7 100644 --- a/openair3/GTPV1-U/gtpv1u.h +++ b/openair3/GTPV1-U/gtpv1u.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u.h * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c index 397be865a3..8d1f0cf245 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB.c +++ b/openair3/GTPV1-U/gtpv1u_eNB.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_eNB.c * \brief * \author Sebastien ROUX, Lionel GAUTHIER, Navid Nikaein diff --git a/openair3/GTPV1-U/gtpv1u_eNB_defs.h b/openair3/GTPV1-U/gtpv1u_eNB_defs.h index 916d4459d9..e5931c677a 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB_defs.h +++ b/openair3/GTPV1-U/gtpv1u_eNB_defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_eNB_defs.h * \brief * \author Sebastien ROUX, Lionel GAUTHIER diff --git a/openair3/GTPV1-U/gtpv1u_eNB_task.h b/openair3/GTPV1-U/gtpv1u_eNB_task.h old mode 100755 new mode 100644 index b06777a55d..ae726221eb --- a/openair3/GTPV1-U/gtpv1u_eNB_task.h +++ b/openair3/GTPV1-U/gtpv1u_eNB_task.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_eNB_task.h * \brief * \author Lionel Gauthier diff --git a/openair3/GTPV1-U/gtpv1u_sgw_defs.h b/openair3/GTPV1-U/gtpv1u_sgw_defs.h index d40410f3b7..59c50d4eda 100644 --- a/openair3/GTPV1-U/gtpv1u_sgw_defs.h +++ b/openair3/GTPV1-U/gtpv1u_sgw_defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef GTPV1U_SGW_DEFS_H_ #define GTPV1U_SGW_DEFS_H_ diff --git a/openair3/GTPV1-U/gtpv1u_task.c b/openair3/GTPV1-U/gtpv1u_task.c index f17a0fdd0e..3aa01c837c 100644 --- a/openair3/GTPV1-U/gtpv1u_task.c +++ b/openair3/GTPV1-U/gtpv1u_task.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_task.c * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/GTPV1-U/gtpv1u_teid_pool.c b/openair3/GTPV1-U/gtpv1u_teid_pool.c index 32db1ff47e..fc012b3ad2 100644 --- a/openair3/GTPV1-U/gtpv1u_teid_pool.c +++ b/openair3/GTPV1-U/gtpv1u_teid_pool.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_task.c * \brief * \author Lionel Gauthier diff --git a/openair3/NAS/COMMON/API/NETWORK/as_message.c b/openair3/NAS/COMMON/API/NETWORK/as_message.c index be850d31af..12ca5d4506 100644 --- a/openair3/NAS/COMMON/API/NETWORK/as_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/as_message.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source as_message.c diff --git a/openair3/NAS/COMMON/API/NETWORK/l2_message.h b/openair3/NAS/COMMON/API/NETWORK/l2_message.h index 02e5d87354..5ff4125db9 100644 --- a/openair3/NAS/COMMON/API/NETWORK/l2_message.h +++ b/openair3/NAS/COMMON/API/NETWORK/l2_message.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source as_message.h diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index e0face9576..fb4f4988ba 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source nas_message.h diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.h b/openair3/NAS/COMMON/API/NETWORK/nas_message.h index cecd676c93..532fb55556 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.h +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source nas_message.h diff --git a/openair3/NAS/COMMON/API/NETWORK/network_api.c b/openair3/NAS/COMMON/API/NETWORK/network_api.c index a057c7e5b0..2189e3941c 100644 --- a/openair3/NAS/COMMON/API/NETWORK/network_api.c +++ b/openair3/NAS/COMMON/API/NETWORK/network_api.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source network_api.c diff --git a/openair3/NAS/COMMON/API/NETWORK/network_api.h b/openair3/NAS/COMMON/API/NETWORK/network_api.h index bf531539bd..ca519f597a 100644 --- a/openair3/NAS/COMMON/API/NETWORK/network_api.h +++ b/openair3/NAS/COMMON/API/NETWORK/network_api.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source network_api.h diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c index c7e4c36614..9dc5678d2f 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h index 760d85ec05..1c3c341eb2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c index f36176f16b..98b7518806 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h index f11623ff44..3d90d7946e 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachReject.c b/openair3/NAS/COMMON/EMM/MSG/AttachReject.c index eed7199635..832364777a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachReject.h b/openair3/NAS/COMMON/EMM/MSG/AttachReject.h index e65fe17325..5c2217ed79 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c index fa11d84ed7..25a5b9f041 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h index 26937ad5d6..33077e62d7 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c index 79a12874cf..f940b041df 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h index 978bf31f18..b14f157da3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c index 1b8643083e..fe74ed39a5 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h index 629b032074..075fc04930 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c index bba6ea7f3b..47163a3ac4 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h index 2997836b0f..7ff59c3fd2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c index db508c5786..ee1d818921 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h index 3442e34064..286eef92ed 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c index 08514dfbe1..dc7e4aa502 100644 --- a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c +++ b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h index e726802840..80d61f669e 100644 --- a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h +++ b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c index 7b3a79453a..9d3c0751ea 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h index a04905aef6..2825fe6d28 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c index 81675e6fd0..e57468b252 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h index 572466d139..d6cf76ceac 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c index a5255e99ea..ebe2655b12 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c +++ b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h index 111958fdf1..c0a2ffaea8 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h +++ b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c index 2901998eb6..371e83044e 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c +++ b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h index a3f8059561..cc22207e44 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h +++ b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c index 274f8d47c0..5302393710 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c +++ b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h index 716d08763a..f971eebf74 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h +++ b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c index 903d92c51f..ed89e04a87 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h index d0a9d02e92..f004fa32aa 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c index 313212c09d..77ec3104d3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h index 68a68d6dc6..b9d491cae2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c index c7bdda8a0f..4abe6b8aa8 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h index 63a51cbe2c..3233a14083 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c index 3d785cddf8..3614afb681 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h index 97f783addd..60396cdba5 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c index 827b9e64e0..f029f8f0eb 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h index c6bb0d8f71..c08b2d03a5 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h index 66baa17269..4a06fef765 100644 --- a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h +++ b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h index 0c4c5400d9..9318881663 100644 --- a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c index 2086d59489..2a74db4a6e 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c index e3fbbf3a78..a918c2d79a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c index 972aad0444..03917a7fbc 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h index 0067104fcd..ebb4eacfce 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c index 0e2aff4374..97e956c6a8 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h index 8a5525d00c..a338d72ea3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c index df51149b88..477886097c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h index 999d5d9f37..a22084177e 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c index 0d4aea3f12..9f546766d1 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h index 1b07da4c7f..20efc8b886 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c index 5facc985f5..5efe49c831 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h index bdb7083c35..d418ea5d19 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c index 56bbcdc7e5..9fbd7f0de8 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h index 055ae55ae7..f7bf2d0bc3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c index 53fe541e47..3493ce9c8a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h index b4ee5bcb42..894a1b39f4 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c index 61b85ca2ca..ee1b989431 100644 --- a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c +++ b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h index 02a58b104f..db1be7de4c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h +++ b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_cause.h b/openair3/NAS/COMMON/EMM/MSG/emm_cause.h index 231e8bfe86..e022cb26de 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_cause.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_cause.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source emm_cause.h diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msg.c b/openair3/NAS/COMMON/EMM/MSG/emm_msg.c index b727b09a73..8167472754 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msg.c +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msg.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source emm_msg.c diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msg.h b/openair3/NAS/COMMON/EMM/MSG/emm_msg.h index db36f45948..0a8fce11dc 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msg.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msg.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source emm_msg.h diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h b/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h index 3e7ba3b50f..f0038057d7 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Version 0.1 diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c index 1e95091471..2adaf96088 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h index 90db94714b..57380f70f2 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c index 09b9ef66f6..cfedffc028 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h index 30e1e72d62..f0700bc2a2 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c index 2c081468b2..3b7197fc47 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h index 89ce283302..d41eb9031f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c index 116160b0e1..15bc20e50f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h index 231a87d117..613552ae26 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c index ecb40aee2b..f149bc8478 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h index b18cf46a62..9c9fe4d62c 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c index 56e570903d..52f077e3f4 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h index 254087da4e..a1043afd10 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c index ff859d659b..1cbe9be70d 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h index 41073b2aa6..720e1eabbe 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c index 2ad5018d15..98b7a7add9 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h index 8b4ef0fff9..0d5e141007 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c index 57591de457..932edd62c4 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h index e06922fa20..261a026701 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c index b5e623343a..5bab619e85 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h index e209c74bfe..d76cebd06a 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c index 3d05c2e7d1..d0447b242f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h index 23b46c7b2f..670202506a 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c index 77038dee23..dc62843bb5 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h index 3cfa64a57a..90b683962b 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c index 79e5b3d732..0489a96f55 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h index d2dad73b46..3acb855c80 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c index c278784ae2..0dbc04897f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h index 3b66dadcc4..7784cb3963 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c index 7f6be43a9f..6756d64472 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h index afcf3142af..af95bb6497 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c index b4f6833dfc..21c7cd009a 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h index 688e0ec814..73bcc1a41b 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c index 01aaa5575d..7a52a5b3c1 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h index 5c40f44879..6084cbff0d 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c index 1624e4e3c3..1c7bf72e09 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h index 2b21e1b2fd..01a442a9ff 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c index 30fa4242f4..b1c4a60708 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h index 3e5ad16c02..5551d7dd6a 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c index 6ca5ca94ab..b3be546076 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h index 78b227ce37..5e273821dc 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c index 73a095d15d..a4ab4f3db4 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h index 980d0f6d09..e4c7dea2d2 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c index 7ab48c6c39..05294bbd94 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h index 9ac114df3a..f3835ab466 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_cause.h b/openair3/NAS/COMMON/ESM/MSG/esm_cause.h index e731ec1a8b..278e271881 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_cause.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_cause.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source esm_cause.h diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msg.c b/openair3/NAS/COMMON/ESM/MSG/esm_msg.c index d9f7df6854..55c449b7bf 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msg.c +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msg.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source esm_msg.c diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msg.h b/openair3/NAS/COMMON/ESM/MSG/esm_msg.h index 9ed64ea2a5..cab4750c34 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msg.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msg.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source esm_msg.h diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h b/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h index 2bb0a4e188..24f358a2bb 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Version 0.1 diff --git a/openair3/NAS/COMMON/IES/AccessPointName.c b/openair3/NAS/COMMON/IES/AccessPointName.c index 3a40d84a23..e9b6a0fa34 100644 --- a/openair3/NAS/COMMON/IES/AccessPointName.c +++ b/openair3/NAS/COMMON/IES/AccessPointName.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AccessPointName.h b/openair3/NAS/COMMON/IES/AccessPointName.h index a05d6f0d53..1bc4d4769c 100644 --- a/openair3/NAS/COMMON/IES/AccessPointName.h +++ b/openair3/NAS/COMMON/IES/AccessPointName.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c index 7a24f4a31e..03a03db34f 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h index 6c96baaa2a..d4857e34a0 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateType.c b/openair3/NAS/COMMON/IES/AdditionalUpdateType.c index d3e713480e..efad938f1d 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateType.c +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateType.h b/openair3/NAS/COMMON/IES/AdditionalUpdateType.h index 49fbcc137e..7720f9dea4 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateType.h +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c index f892f93450..20c1b65f72 100644 --- a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c +++ b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h index e7eb8da33f..39e09f73ad 100644 --- a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h +++ b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c index 179808307e..43e5bac364 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c +++ b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h index f2208ef057..f466563a26 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h +++ b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c index b2b9c72696..ad55d5e279 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h index d75855e45a..01b0adbf86 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c index ae402e41c7..1e96da4b9f 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h index b940e8304f..1178835d11 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c index b142fed5a6..39b643dc78 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c +++ b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h index 0ea7c1af04..59b786c845 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h +++ b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c index c2e395f4fb..51ddc36e3c 100644 --- a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c +++ b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h index d1fd9627f4..8be169f528 100644 --- a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h +++ b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/Cli.c b/openair3/NAS/COMMON/IES/Cli.c index e8c662e289..1e3674ca17 100644 --- a/openair3/NAS/COMMON/IES/Cli.c +++ b/openair3/NAS/COMMON/IES/Cli.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/Cli.h b/openair3/NAS/COMMON/IES/Cli.h index 293bdf28a2..cd7e89a859 100644 --- a/openair3/NAS/COMMON/IES/Cli.h +++ b/openair3/NAS/COMMON/IES/Cli.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/CsfbResponse.c b/openair3/NAS/COMMON/IES/CsfbResponse.c index aa0e2478af..a7ccf8d457 100644 --- a/openair3/NAS/COMMON/IES/CsfbResponse.c +++ b/openair3/NAS/COMMON/IES/CsfbResponse.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/CsfbResponse.h b/openair3/NAS/COMMON/IES/CsfbResponse.h index b20a50bcb0..d39deb17aa 100644 --- a/openair3/NAS/COMMON/IES/CsfbResponse.h +++ b/openair3/NAS/COMMON/IES/CsfbResponse.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/DaylightSavingTime.c b/openair3/NAS/COMMON/IES/DaylightSavingTime.c index fe10157bb9..c4e8d88ded 100644 --- a/openair3/NAS/COMMON/IES/DaylightSavingTime.c +++ b/openair3/NAS/COMMON/IES/DaylightSavingTime.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/DaylightSavingTime.h b/openair3/NAS/COMMON/IES/DaylightSavingTime.h index 6e676d6e72..df65d9d66c 100644 --- a/openair3/NAS/COMMON/IES/DaylightSavingTime.h +++ b/openair3/NAS/COMMON/IES/DaylightSavingTime.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/DetachType.c b/openair3/NAS/COMMON/IES/DetachType.c index b27fae53d4..f827517763 100644 --- a/openair3/NAS/COMMON/IES/DetachType.c +++ b/openair3/NAS/COMMON/IES/DetachType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/DetachType.h b/openair3/NAS/COMMON/IES/DetachType.h index 3728aa7702..5daa624843 100644 --- a/openair3/NAS/COMMON/IES/DetachType.h +++ b/openair3/NAS/COMMON/IES/DetachType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/DrxParameter.c b/openair3/NAS/COMMON/IES/DrxParameter.c index f920ead27f..bb16f40d1e 100644 --- a/openair3/NAS/COMMON/IES/DrxParameter.c +++ b/openair3/NAS/COMMON/IES/DrxParameter.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/DrxParameter.h b/openair3/NAS/COMMON/IES/DrxParameter.h index d30c0e033a..0197901b5e 100644 --- a/openair3/NAS/COMMON/IES/DrxParameter.h +++ b/openair3/NAS/COMMON/IES/DrxParameter.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmergencyNumberList.c b/openair3/NAS/COMMON/IES/EmergencyNumberList.c index 084dbd15fa..f44bdfa139 100644 --- a/openair3/NAS/COMMON/IES/EmergencyNumberList.c +++ b/openair3/NAS/COMMON/IES/EmergencyNumberList.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmergencyNumberList.h b/openair3/NAS/COMMON/IES/EmergencyNumberList.h index 090ce1ec38..96576b6135 100644 --- a/openair3/NAS/COMMON/IES/EmergencyNumberList.h +++ b/openair3/NAS/COMMON/IES/EmergencyNumberList.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmmCause.c b/openair3/NAS/COMMON/IES/EmmCause.c index a89d0d6c30..9b2f4415dc 100644 --- a/openair3/NAS/COMMON/IES/EmmCause.c +++ b/openair3/NAS/COMMON/IES/EmmCause.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmmCause.h b/openair3/NAS/COMMON/IES/EmmCause.h index 42d9f51904..ed0367ea88 100644 --- a/openair3/NAS/COMMON/IES/EmmCause.h +++ b/openair3/NAS/COMMON/IES/EmmCause.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachResult.c b/openair3/NAS/COMMON/IES/EpsAttachResult.c index 6b70585324..bc860886d1 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachResult.c +++ b/openair3/NAS/COMMON/IES/EpsAttachResult.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachResult.h b/openair3/NAS/COMMON/IES/EpsAttachResult.h index 1c459ce914..966228ff94 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachResult.h +++ b/openair3/NAS/COMMON/IES/EpsAttachResult.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachType.c b/openair3/NAS/COMMON/IES/EpsAttachType.c index 8bc691fe55..fb069f6d8e 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachType.c +++ b/openair3/NAS/COMMON/IES/EpsAttachType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachType.h b/openair3/NAS/COMMON/IES/EpsAttachType.h index 268c997db2..318fe40978 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachType.h +++ b/openair3/NAS/COMMON/IES/EpsAttachType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c index b51cf95b67..b2adf40d06 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c +++ b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h index be1fd2f21c..7116eeff5d 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h +++ b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerIdentity.c b/openair3/NAS/COMMON/IES/EpsBearerIdentity.c index f7d405a415..27d1fe6467 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerIdentity.c +++ b/openair3/NAS/COMMON/IES/EpsBearerIdentity.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerIdentity.h b/openair3/NAS/COMMON/IES/EpsBearerIdentity.h index 2c6c9868ab..417437dc4f 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerIdentity.h +++ b/openair3/NAS/COMMON/IES/EpsBearerIdentity.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsMobileIdentity.c b/openair3/NAS/COMMON/IES/EpsMobileIdentity.c index 448858f55c..cdac294f60 100644 --- a/openair3/NAS/COMMON/IES/EpsMobileIdentity.c +++ b/openair3/NAS/COMMON/IES/EpsMobileIdentity.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsMobileIdentity.h b/openair3/NAS/COMMON/IES/EpsMobileIdentity.h index 105db68a05..d4b792d625 100644 --- a/openair3/NAS/COMMON/IES/EpsMobileIdentity.h +++ b/openair3/NAS/COMMON/IES/EpsMobileIdentity.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c index 162db783d5..8368546320 100644 --- a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c +++ b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h index cbe1a0d6f1..108de972ae 100644 --- a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h +++ b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsQualityOfService.c b/openair3/NAS/COMMON/IES/EpsQualityOfService.c index 0a467baffe..b35e37ac80 100644 --- a/openair3/NAS/COMMON/IES/EpsQualityOfService.c +++ b/openair3/NAS/COMMON/IES/EpsQualityOfService.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsQualityOfService.h b/openair3/NAS/COMMON/IES/EpsQualityOfService.h index 10703399e9..2229066b04 100644 --- a/openair3/NAS/COMMON/IES/EpsQualityOfService.h +++ b/openair3/NAS/COMMON/IES/EpsQualityOfService.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateResult.c b/openair3/NAS/COMMON/IES/EpsUpdateResult.c index 8ee25b4aba..3e1f6eba5e 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateResult.c +++ b/openair3/NAS/COMMON/IES/EpsUpdateResult.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateResult.h b/openair3/NAS/COMMON/IES/EpsUpdateResult.h index d3aabc3402..48f4471e91 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateResult.h +++ b/openair3/NAS/COMMON/IES/EpsUpdateResult.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateType.c b/openair3/NAS/COMMON/IES/EpsUpdateType.c index 571b267dcb..6c86eb6b0f 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateType.c +++ b/openair3/NAS/COMMON/IES/EpsUpdateType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateType.h b/openair3/NAS/COMMON/IES/EpsUpdateType.h index 09578574f6..40202ae90c 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateType.h +++ b/openair3/NAS/COMMON/IES/EpsUpdateType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmCause.c b/openair3/NAS/COMMON/IES/EsmCause.c index 8c5436d855..4e23353edb 100644 --- a/openair3/NAS/COMMON/IES/EsmCause.c +++ b/openair3/NAS/COMMON/IES/EsmCause.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmCause.h b/openair3/NAS/COMMON/IES/EsmCause.h index e79c51ac19..df44cc7770 100644 --- a/openair3/NAS/COMMON/IES/EsmCause.h +++ b/openair3/NAS/COMMON/IES/EsmCause.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c index b4d69c44f7..9ff38d0be2 100644 --- a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c +++ b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h index cfaf82a560..f9961bdd5a 100644 --- a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h +++ b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmMessageContainer.c b/openair3/NAS/COMMON/IES/EsmMessageContainer.c index 080374e681..734025b694 100644 --- a/openair3/NAS/COMMON/IES/EsmMessageContainer.c +++ b/openair3/NAS/COMMON/IES/EsmMessageContainer.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmMessageContainer.h b/openair3/NAS/COMMON/IES/EsmMessageContainer.h index 326a9dd4e5..87bd26cc5d 100644 --- a/openair3/NAS/COMMON/IES/EsmMessageContainer.h +++ b/openair3/NAS/COMMON/IES/EsmMessageContainer.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/GprsTimer.c b/openair3/NAS/COMMON/IES/GprsTimer.c index 9d8889ec6b..3d856c6ea9 100644 --- a/openair3/NAS/COMMON/IES/GprsTimer.c +++ b/openair3/NAS/COMMON/IES/GprsTimer.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/GprsTimer.h b/openair3/NAS/COMMON/IES/GprsTimer.h index 66468b75aa..0f7fc89066 100644 --- a/openair3/NAS/COMMON/IES/GprsTimer.h +++ b/openair3/NAS/COMMON/IES/GprsTimer.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/GutiType.c b/openair3/NAS/COMMON/IES/GutiType.c index 7391edb53c..095d8948b1 100644 --- a/openair3/NAS/COMMON/IES/GutiType.c +++ b/openair3/NAS/COMMON/IES/GutiType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/GutiType.h b/openair3/NAS/COMMON/IES/GutiType.h index 4df547ff06..17d8ce9e2d 100644 --- a/openair3/NAS/COMMON/IES/GutiType.h +++ b/openair3/NAS/COMMON/IES/GutiType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/IdentityType2.c b/openair3/NAS/COMMON/IES/IdentityType2.c index c50a1fc0f7..d22ac329bf 100644 --- a/openair3/NAS/COMMON/IES/IdentityType2.c +++ b/openair3/NAS/COMMON/IES/IdentityType2.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/IdentityType2.h b/openair3/NAS/COMMON/IES/IdentityType2.h index 9d7e075b7a..9472c7a7b7 100644 --- a/openair3/NAS/COMMON/IES/IdentityType2.h +++ b/openair3/NAS/COMMON/IES/IdentityType2.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ImeisvRequest.c b/openair3/NAS/COMMON/IES/ImeisvRequest.c index 798ce55dce..d5723d9fa2 100644 --- a/openair3/NAS/COMMON/IES/ImeisvRequest.c +++ b/openair3/NAS/COMMON/IES/ImeisvRequest.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ImeisvRequest.h b/openair3/NAS/COMMON/IES/ImeisvRequest.h index 71c319bc8d..5187a6126c 100644 --- a/openair3/NAS/COMMON/IES/ImeisvRequest.h +++ b/openair3/NAS/COMMON/IES/ImeisvRequest.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c index c552654aa8..afb1bfead5 100644 --- a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c +++ b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h index 042f56d1f8..42a0aecf0a 100644 --- a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h +++ b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsClientIdentity.c b/openair3/NAS/COMMON/IES/LcsClientIdentity.c index 9daf2125e1..9369f06f86 100644 --- a/openair3/NAS/COMMON/IES/LcsClientIdentity.c +++ b/openair3/NAS/COMMON/IES/LcsClientIdentity.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsClientIdentity.h b/openair3/NAS/COMMON/IES/LcsClientIdentity.h index 4f4880956d..798a4fb232 100644 --- a/openair3/NAS/COMMON/IES/LcsClientIdentity.h +++ b/openair3/NAS/COMMON/IES/LcsClientIdentity.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsIndicator.c b/openair3/NAS/COMMON/IES/LcsIndicator.c index 224886fae8..d839cbaed4 100644 --- a/openair3/NAS/COMMON/IES/LcsIndicator.c +++ b/openair3/NAS/COMMON/IES/LcsIndicator.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsIndicator.h b/openair3/NAS/COMMON/IES/LcsIndicator.h index 341c5f2caf..3b866d8c8e 100644 --- a/openair3/NAS/COMMON/IES/LcsIndicator.h +++ b/openair3/NAS/COMMON/IES/LcsIndicator.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c index eec53404ef..59c2e2a198 100644 --- a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c +++ b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h index 393da23e41..a231525112 100644 --- a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h +++ b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c index e30f4dcdbe..5d42d206a6 100644 --- a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c +++ b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h index ba6e40c61b..ef8f0b3c0a 100644 --- a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h +++ b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LocationAreaIdentification.c b/openair3/NAS/COMMON/IES/LocationAreaIdentification.c index 1fc04dc038..29dada8b6c 100644 --- a/openair3/NAS/COMMON/IES/LocationAreaIdentification.c +++ b/openair3/NAS/COMMON/IES/LocationAreaIdentification.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/LocationAreaIdentification.h b/openair3/NAS/COMMON/IES/LocationAreaIdentification.h index 3c52e94809..848e129ecd 100644 --- a/openair3/NAS/COMMON/IES/LocationAreaIdentification.h +++ b/openair3/NAS/COMMON/IES/LocationAreaIdentification.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MessageType.c b/openair3/NAS/COMMON/IES/MessageType.c index 17a23ab383..146f61a295 100644 --- a/openair3/NAS/COMMON/IES/MessageType.c +++ b/openair3/NAS/COMMON/IES/MessageType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MessageType.h b/openair3/NAS/COMMON/IES/MessageType.h index 7dd001ae96..cb96e8e489 100644 --- a/openair3/NAS/COMMON/IES/MessageType.h +++ b/openair3/NAS/COMMON/IES/MessageType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileIdentity.c b/openair3/NAS/COMMON/IES/MobileIdentity.c index 75c152106a..f716d525ac 100644 --- a/openair3/NAS/COMMON/IES/MobileIdentity.c +++ b/openair3/NAS/COMMON/IES/MobileIdentity.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileIdentity.h b/openair3/NAS/COMMON/IES/MobileIdentity.h index 791dfc6f72..6ed4539e88 100644 --- a/openair3/NAS/COMMON/IES/MobileIdentity.h +++ b/openair3/NAS/COMMON/IES/MobileIdentity.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark2.c b/openair3/NAS/COMMON/IES/MobileStationClassmark2.c index 459d716fcb..b0c3d02977 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark2.c +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark2.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark2.h b/openair3/NAS/COMMON/IES/MobileStationClassmark2.h index 06c6250de9..85db61dc34 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark2.h +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark2.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark3.c b/openair3/NAS/COMMON/IES/MobileStationClassmark3.c index d53f054532..8c8f425742 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark3.c +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark3.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark3.h b/openair3/NAS/COMMON/IES/MobileStationClassmark3.h index 25de9191ee..77e2658f9c 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark3.h +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark3.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkCapability.c b/openair3/NAS/COMMON/IES/MsNetworkCapability.c index bda91e876a..bbd8da70e6 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkCapability.c +++ b/openair3/NAS/COMMON/IES/MsNetworkCapability.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkCapability.h b/openair3/NAS/COMMON/IES/MsNetworkCapability.h index e940d91218..adbb4e6646 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkCapability.h +++ b/openair3/NAS/COMMON/IES/MsNetworkCapability.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c index 08fee949a0..36a170cec7 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c +++ b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h index 0210e787a7..69e6bc24ba 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h +++ b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c index 1f1e2bd726..dcb2b87ed4 100644 --- a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c +++ b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h index 46af36c5b5..d5c890f436 100644 --- a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h +++ b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasMessageContainer.c b/openair3/NAS/COMMON/IES/NasMessageContainer.c index 2f295b0cc1..d4ad6a0dbf 100644 --- a/openair3/NAS/COMMON/IES/NasMessageContainer.c +++ b/openair3/NAS/COMMON/IES/NasMessageContainer.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasMessageContainer.h b/openair3/NAS/COMMON/IES/NasMessageContainer.h index a16684a088..15ef69a131 100644 --- a/openair3/NAS/COMMON/IES/NasMessageContainer.h +++ b/openair3/NAS/COMMON/IES/NasMessageContainer.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasRequestType.c b/openair3/NAS/COMMON/IES/NasRequestType.c index 9cbbbdb7f7..116a25c3e1 100644 --- a/openair3/NAS/COMMON/IES/NasRequestType.c +++ b/openair3/NAS/COMMON/IES/NasRequestType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasRequestType.h b/openair3/NAS/COMMON/IES/NasRequestType.h index c6e28298d6..58daa10d59 100644 --- a/openair3/NAS/COMMON/IES/NasRequestType.h +++ b/openair3/NAS/COMMON/IES/NasRequestType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c index cafb734811..22d8012e91 100644 --- a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c +++ b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h index f74b2c39ab..fd1f7d5845 100644 --- a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h +++ b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NetworkName.c b/openair3/NAS/COMMON/IES/NetworkName.c index 521e421c8d..271171ed98 100644 --- a/openair3/NAS/COMMON/IES/NetworkName.c +++ b/openair3/NAS/COMMON/IES/NetworkName.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/NetworkName.h b/openair3/NAS/COMMON/IES/NetworkName.h index c2a8850bc3..836b4eebfb 100644 --- a/openair3/NAS/COMMON/IES/NetworkName.h +++ b/openair3/NAS/COMMON/IES/NetworkName.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/Nonce.c b/openair3/NAS/COMMON/IES/Nonce.c index 438d117fd7..b32d75699e 100644 --- a/openair3/NAS/COMMON/IES/Nonce.c +++ b/openair3/NAS/COMMON/IES/Nonce.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/Nonce.h b/openair3/NAS/COMMON/IES/Nonce.h index 7956177494..0e8f9441a4 100644 --- a/openair3/NAS/COMMON/IES/Nonce.h +++ b/openair3/NAS/COMMON/IES/Nonce.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PTmsiSignature.c b/openair3/NAS/COMMON/IES/PTmsiSignature.c index 3ed25f994a..bedc5a531b 100644 --- a/openair3/NAS/COMMON/IES/PTmsiSignature.c +++ b/openair3/NAS/COMMON/IES/PTmsiSignature.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PTmsiSignature.h b/openair3/NAS/COMMON/IES/PTmsiSignature.h index e51bcc41a9..f3fa46db1e 100644 --- a/openair3/NAS/COMMON/IES/PTmsiSignature.h +++ b/openair3/NAS/COMMON/IES/PTmsiSignature.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c index a108760cfa..f9e26f7663 100644 --- a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c +++ b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h index 24f5dc9a97..2174b5e2f3 100644 --- a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h +++ b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PagingIdentity.c b/openair3/NAS/COMMON/IES/PagingIdentity.c index 9b0c72b7af..656a8b6d0f 100644 --- a/openair3/NAS/COMMON/IES/PagingIdentity.c +++ b/openair3/NAS/COMMON/IES/PagingIdentity.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PagingIdentity.h b/openair3/NAS/COMMON/IES/PagingIdentity.h index 60f93caebd..8b05345461 100644 --- a/openair3/NAS/COMMON/IES/PagingIdentity.h +++ b/openair3/NAS/COMMON/IES/PagingIdentity.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnAddress.c b/openair3/NAS/COMMON/IES/PdnAddress.c index 12dee958f5..18090bcb1f 100644 --- a/openair3/NAS/COMMON/IES/PdnAddress.c +++ b/openair3/NAS/COMMON/IES/PdnAddress.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnAddress.h b/openair3/NAS/COMMON/IES/PdnAddress.h index 22a7dd282c..3aa9b62a27 100644 --- a/openair3/NAS/COMMON/IES/PdnAddress.h +++ b/openair3/NAS/COMMON/IES/PdnAddress.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnType.c b/openair3/NAS/COMMON/IES/PdnType.c index 0dc20ba6e1..09c6a6edc1 100644 --- a/openair3/NAS/COMMON/IES/PdnType.c +++ b/openair3/NAS/COMMON/IES/PdnType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnType.h b/openair3/NAS/COMMON/IES/PdnType.h index 13c97a6602..b56de6ce90 100644 --- a/openair3/NAS/COMMON/IES/PdnType.h +++ b/openair3/NAS/COMMON/IES/PdnType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PlmnList.c b/openair3/NAS/COMMON/IES/PlmnList.c index 2e84bdb74a..d4528f1cad 100644 --- a/openair3/NAS/COMMON/IES/PlmnList.c +++ b/openair3/NAS/COMMON/IES/PlmnList.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/PlmnList.h b/openair3/NAS/COMMON/IES/PlmnList.h index 485e88a6a2..4cc8abce4d 100644 --- a/openair3/NAS/COMMON/IES/PlmnList.h +++ b/openair3/NAS/COMMON/IES/PlmnList.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c index 522307467e..940dc5e57d 100644 --- a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c +++ b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h index 2bc3f098d9..b2cf5aa442 100644 --- a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h +++ b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c index 15f20ef195..2c252b2d87 100644 --- a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c +++ b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h index 8110cb96bc..8ee53e1253 100644 --- a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h +++ b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c index a58ae57faa..c006e43ab6 100644 --- a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c +++ b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h index 04c04e801f..38d0a6324c 100644 --- a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h +++ b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/QualityOfService.c b/openair3/NAS/COMMON/IES/QualityOfService.c index 27d4a78e55..ebebfe3658 100644 --- a/openair3/NAS/COMMON/IES/QualityOfService.c +++ b/openair3/NAS/COMMON/IES/QualityOfService.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/QualityOfService.h b/openair3/NAS/COMMON/IES/QualityOfService.h index 6ce363aacc..0e55e5db2a 100644 --- a/openair3/NAS/COMMON/IES/QualityOfService.h +++ b/openair3/NAS/COMMON/IES/QualityOfService.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/RadioPriority.c b/openair3/NAS/COMMON/IES/RadioPriority.c index 8e1183eb7b..e2075395d4 100644 --- a/openair3/NAS/COMMON/IES/RadioPriority.c +++ b/openair3/NAS/COMMON/IES/RadioPriority.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/RadioPriority.h b/openair3/NAS/COMMON/IES/RadioPriority.h index 629a624eec..fb9f0880ac 100644 --- a/openair3/NAS/COMMON/IES/RadioPriority.h +++ b/openair3/NAS/COMMON/IES/RadioPriority.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/SecurityHeaderType.c b/openair3/NAS/COMMON/IES/SecurityHeaderType.c index 89facd28c1..ecff67f2c8 100644 --- a/openair3/NAS/COMMON/IES/SecurityHeaderType.c +++ b/openair3/NAS/COMMON/IES/SecurityHeaderType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/SecurityHeaderType.h b/openair3/NAS/COMMON/IES/SecurityHeaderType.h index d83ec1e17a..227ffa68b4 100644 --- a/openair3/NAS/COMMON/IES/SecurityHeaderType.h +++ b/openair3/NAS/COMMON/IES/SecurityHeaderType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ServiceType.c b/openair3/NAS/COMMON/IES/ServiceType.c index 3f35abbfaa..cc29088178 100644 --- a/openair3/NAS/COMMON/IES/ServiceType.c +++ b/openair3/NAS/COMMON/IES/ServiceType.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ServiceType.h b/openair3/NAS/COMMON/IES/ServiceType.h index c3aedebc0c..60e41d80f0 100644 --- a/openair3/NAS/COMMON/IES/ServiceType.h +++ b/openair3/NAS/COMMON/IES/ServiceType.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ShortMac.c b/openair3/NAS/COMMON/IES/ShortMac.c index d481b1bba7..57a1c77b16 100644 --- a/openair3/NAS/COMMON/IES/ShortMac.c +++ b/openair3/NAS/COMMON/IES/ShortMac.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/ShortMac.h b/openair3/NAS/COMMON/IES/ShortMac.h index 896f9e42da..134a3fcb23 100644 --- a/openair3/NAS/COMMON/IES/ShortMac.h +++ b/openair3/NAS/COMMON/IES/ShortMac.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/SsCode.c b/openair3/NAS/COMMON/IES/SsCode.c index e0566c9f15..ba68ceb7e0 100644 --- a/openair3/NAS/COMMON/IES/SsCode.c +++ b/openair3/NAS/COMMON/IES/SsCode.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/SsCode.h b/openair3/NAS/COMMON/IES/SsCode.h index 68017184ce..8b70a1b5fc 100644 --- a/openair3/NAS/COMMON/IES/SsCode.h +++ b/openair3/NAS/COMMON/IES/SsCode.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/SupportedCodecList.c b/openair3/NAS/COMMON/IES/SupportedCodecList.c index 375d2255a4..c9a018f141 100644 --- a/openair3/NAS/COMMON/IES/SupportedCodecList.c +++ b/openair3/NAS/COMMON/IES/SupportedCodecList.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/SupportedCodecList.h b/openair3/NAS/COMMON/IES/SupportedCodecList.h index 83396b62d4..835e7e2992 100644 --- a/openair3/NAS/COMMON/IES/SupportedCodecList.h +++ b/openair3/NAS/COMMON/IES/SupportedCodecList.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZone.c b/openair3/NAS/COMMON/IES/TimeZone.c index 39fe50c307..fc0e981efd 100644 --- a/openair3/NAS/COMMON/IES/TimeZone.c +++ b/openair3/NAS/COMMON/IES/TimeZone.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZone.h b/openair3/NAS/COMMON/IES/TimeZone.h index bfa2d38996..6ae377090f 100644 --- a/openair3/NAS/COMMON/IES/TimeZone.h +++ b/openair3/NAS/COMMON/IES/TimeZone.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZoneAndTime.c b/openair3/NAS/COMMON/IES/TimeZoneAndTime.c index 08a8bcdf70..016cd6c628 100644 --- a/openair3/NAS/COMMON/IES/TimeZoneAndTime.c +++ b/openair3/NAS/COMMON/IES/TimeZoneAndTime.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZoneAndTime.h b/openair3/NAS/COMMON/IES/TimeZoneAndTime.h index 27c763cf88..3f32cf2a8f 100644 --- a/openair3/NAS/COMMON/IES/TimeZoneAndTime.h +++ b/openair3/NAS/COMMON/IES/TimeZoneAndTime.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TmsiStatus.c b/openair3/NAS/COMMON/IES/TmsiStatus.c index 1ebbf5beaf..4d54ba3f2f 100644 --- a/openair3/NAS/COMMON/IES/TmsiStatus.c +++ b/openair3/NAS/COMMON/IES/TmsiStatus.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TmsiStatus.h b/openair3/NAS/COMMON/IES/TmsiStatus.h index 6387ca7cec..c11f9b9747 100644 --- a/openair3/NAS/COMMON/IES/TmsiStatus.h +++ b/openair3/NAS/COMMON/IES/TmsiStatus.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c index 14b08e7e24..149fde64fd 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h index 7249d3c5c1..27438fbb47 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c index eae44e8e58..10753854be 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h index 345aacf438..36c8469da9 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c index b2ea6a83b9..7a6355d1b6 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c +++ b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h index 3058873621..d84fd7fcb0 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h +++ b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c index e18ffc92c5..9956191e31 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c +++ b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h index 40f9c6b4a6..286e96cd57 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h +++ b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TransactionIdentifier.c b/openair3/NAS/COMMON/IES/TransactionIdentifier.c index c48ae31a63..a9a75933d0 100644 --- a/openair3/NAS/COMMON/IES/TransactionIdentifier.c +++ b/openair3/NAS/COMMON/IES/TransactionIdentifier.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/TransactionIdentifier.h b/openair3/NAS/COMMON/IES/TransactionIdentifier.h index 061db1c654..6ddc31f6ab 100644 --- a/openair3/NAS/COMMON/IES/TransactionIdentifier.h +++ b/openair3/NAS/COMMON/IES/TransactionIdentifier.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeNetworkCapability.c b/openair3/NAS/COMMON/IES/UeNetworkCapability.c index 902bd1c79c..8ae92a979b 100644 --- a/openair3/NAS/COMMON/IES/UeNetworkCapability.c +++ b/openair3/NAS/COMMON/IES/UeNetworkCapability.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeNetworkCapability.h b/openair3/NAS/COMMON/IES/UeNetworkCapability.h index 56451159a5..f9883a21b3 100644 --- a/openair3/NAS/COMMON/IES/UeNetworkCapability.h +++ b/openair3/NAS/COMMON/IES/UeNetworkCapability.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c index 36d612bf6f..9f3d47d9a9 100644 --- a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c +++ b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h index 853ecea045..41f1c9f27f 100644 --- a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h +++ b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeSecurityCapability.c b/openair3/NAS/COMMON/IES/UeSecurityCapability.c index ecc55ae5ff..0f233c2e05 100644 --- a/openair3/NAS/COMMON/IES/UeSecurityCapability.c +++ b/openair3/NAS/COMMON/IES/UeSecurityCapability.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeSecurityCapability.h b/openair3/NAS/COMMON/IES/UeSecurityCapability.h index dede6af9f8..817df92374 100644 --- a/openair3/NAS/COMMON/IES/UeSecurityCapability.h +++ b/openair3/NAS/COMMON/IES/UeSecurityCapability.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c index 0c84ba0a8e..52c2141b34 100644 --- a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c +++ b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h index 13a8b668ec..14e2af6f7b 100644 --- a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h +++ b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/OctetString.c b/openair3/NAS/COMMON/UTIL/OctetString.c index 4a429d84a7..569e9d6ea8 100644 --- a/openair3/NAS/COMMON/UTIL/OctetString.c +++ b/openair3/NAS/COMMON/UTIL/OctetString.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/OctetString.h b/openair3/NAS/COMMON/UTIL/OctetString.h index b3ea818cc8..c618359452 100644 --- a/openair3/NAS/COMMON/UTIL/OctetString.h +++ b/openair3/NAS/COMMON/UTIL/OctetString.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVDecoder.c b/openair3/NAS/COMMON/UTIL/TLVDecoder.c index c1ce58ea00..51b9e5bdf8 100644 --- a/openair3/NAS/COMMON/UTIL/TLVDecoder.c +++ b/openair3/NAS/COMMON/UTIL/TLVDecoder.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVDecoder.h b/openair3/NAS/COMMON/UTIL/TLVDecoder.h index 99e1b9d90f..5f23f40308 100644 --- a/openair3/NAS/COMMON/UTIL/TLVDecoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVDecoder.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #ifndef TLV_DECODER_H_ #define TLV_DECODER_H_ diff --git a/openair3/NAS/COMMON/UTIL/TLVEncoder.c b/openair3/NAS/COMMON/UTIL/TLVEncoder.c index 0ad394e97a..3b65a8588e 100644 --- a/openair3/NAS/COMMON/UTIL/TLVEncoder.c +++ b/openair3/NAS/COMMON/UTIL/TLVEncoder.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVEncoder.h b/openair3/NAS/COMMON/UTIL/TLVEncoder.h index 2917594618..dc8333882c 100644 --- a/openair3/NAS/COMMON/UTIL/TLVEncoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVEncoder.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #ifndef TLV_ENCODER_H_ #define TLV_ENCODER_H_ diff --git a/openair3/NAS/COMMON/UTIL/device.c b/openair3/NAS/COMMON/UTIL/device.c index 375ffe0846..267e2a55db 100644 --- a/openair3/NAS/COMMON/UTIL/device.c +++ b/openair3/NAS/COMMON/UTIL/device.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source device.c diff --git a/openair3/NAS/COMMON/UTIL/device.h b/openair3/NAS/COMMON/UTIL/device.h index ded1aca095..00114da3eb 100644 --- a/openair3/NAS/COMMON/UTIL/device.h +++ b/openair3/NAS/COMMON/UTIL/device.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source device.h diff --git a/openair3/NAS/COMMON/UTIL/memory.c b/openair3/NAS/COMMON/UTIL/memory.c index 18c7f8b1af..9ebedebe53 100644 --- a/openair3/NAS/COMMON/UTIL/memory.c +++ b/openair3/NAS/COMMON/UTIL/memory.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source memory.c diff --git a/openair3/NAS/COMMON/UTIL/memory.h b/openair3/NAS/COMMON/UTIL/memory.h index 0314630f0c..6ac88defd4 100644 --- a/openair3/NAS/COMMON/UTIL/memory.h +++ b/openair3/NAS/COMMON/UTIL/memory.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source memory.h diff --git a/openair3/NAS/COMMON/UTIL/nas_log.c b/openair3/NAS/COMMON/UTIL/nas_log.c index f0d6a24ffe..1f45085ee9 100644 --- a/openair3/NAS/COMMON/UTIL/nas_log.c +++ b/openair3/NAS/COMMON/UTIL/nas_log.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source nas_log.c diff --git a/openair3/NAS/COMMON/UTIL/nas_log.h b/openair3/NAS/COMMON/UTIL/nas_log.h index c17efb3383..58e7966f29 100644 --- a/openair3/NAS/COMMON/UTIL/nas_log.h +++ b/openair3/NAS/COMMON/UTIL/nas_log.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source nas_log.h diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.c b/openair3/NAS/COMMON/UTIL/nas_timer.c index 5dc6923140..23f7ae8e21 100644 --- a/openair3/NAS/COMMON/UTIL/nas_timer.c +++ b/openair3/NAS/COMMON/UTIL/nas_timer.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source nas_timer.c diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.h b/openair3/NAS/COMMON/UTIL/nas_timer.h index 0b65da4159..9c6b48c4b2 100644 --- a/openair3/NAS/COMMON/UTIL/nas_timer.h +++ b/openair3/NAS/COMMON/UTIL/nas_timer.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source nas_timer.h diff --git a/openair3/NAS/COMMON/UTIL/parser.c b/openair3/NAS/COMMON/UTIL/parser.c index 5f8350ea58..323b523733 100644 --- a/openair3/NAS/COMMON/UTIL/parser.c +++ b/openair3/NAS/COMMON/UTIL/parser.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source parser.c diff --git a/openair3/NAS/COMMON/UTIL/parser.h b/openair3/NAS/COMMON/UTIL/parser.h index fc8a9ad126..28acbed026 100644 --- a/openair3/NAS/COMMON/UTIL/parser.h +++ b/openair3/NAS/COMMON/UTIL/parser.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source parser.h diff --git a/openair3/NAS/COMMON/UTIL/socket.c b/openair3/NAS/COMMON/UTIL/socket.c index b76506109b..b21dabbc33 100644 --- a/openair3/NAS/COMMON/UTIL/socket.c +++ b/openair3/NAS/COMMON/UTIL/socket.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source socket.c diff --git a/openair3/NAS/COMMON/UTIL/socket.h b/openair3/NAS/COMMON/UTIL/socket.h index 4be749d3cc..b1988a4aa7 100644 --- a/openair3/NAS/COMMON/UTIL/socket.h +++ b/openair3/NAS/COMMON/UTIL/socket.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source socket.h diff --git a/openair3/NAS/COMMON/UTIL/stty.c b/openair3/NAS/COMMON/UTIL/stty.c index 1fb72e9204..6fda2f5e61 100644 --- a/openair3/NAS/COMMON/UTIL/stty.c +++ b/openair3/NAS/COMMON/UTIL/stty.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source stty.c diff --git a/openair3/NAS/COMMON/UTIL/tst/timer.c b/openair3/NAS/COMMON/UTIL/tst/timer.c index 7b963fba30..d04cbdb1c9 100644 --- a/openair3/NAS/COMMON/UTIL/tst/timer.c +++ b/openair3/NAS/COMMON/UTIL/tst/timer.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source timer.c diff --git a/openair3/NAS/COMMON/securityDef.h b/openair3/NAS/COMMON/securityDef.h index c418de2c60..f73f3fe7b0 100644 --- a/openair3/NAS/COMMON/securityDef.h +++ b/openair3/NAS/COMMON/securityDef.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source securityDef.h diff --git a/openair3/NAS/COMMON/userDef.h b/openair3/NAS/COMMON/userDef.h index f6398794fe..692712cf35 100644 --- a/openair3/NAS/COMMON/userDef.h +++ b/openair3/NAS/COMMON/userDef.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source userDef.h diff --git a/openair3/NAS/TOOLS/network.h b/openair3/NAS/TOOLS/network.h index b2c7977d2d..f6f1c05699 100644 --- a/openair3/NAS/TOOLS/network.h +++ b/openair3/NAS/TOOLS/network.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source network.h diff --git a/openair3/NAS/TOOLS/ue_data.c b/openair3/NAS/TOOLS/ue_data.c index e99cb9b84c..971f532c96 100644 --- a/openair3/NAS/TOOLS/ue_data.c +++ b/openair3/NAS/TOOLS/ue_data.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source ue_data.c diff --git a/openair3/NAS/TOOLS/usim_data.c b/openair3/NAS/TOOLS/usim_data.c index ffde00c268..a3f6a3efbd 100644 --- a/openair3/NAS/TOOLS/usim_data.c +++ b/openair3/NAS/TOOLS/usim_data.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source usim_data.c diff --git a/openair3/NAS/UE/API/USER/at_command.c b/openair3/NAS/UE/API/USER/at_command.c index dc4dd3c040..37de25df48 100644 --- a/openair3/NAS/UE/API/USER/at_command.c +++ b/openair3/NAS/UE/API/USER/at_command.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_command.c diff --git a/openair3/NAS/UE/API/USER/at_command.h b/openair3/NAS/UE/API/USER/at_command.h index 4c65b0cf2c..d057d0c0e9 100644 --- a/openair3/NAS/UE/API/USER/at_command.h +++ b/openair3/NAS/UE/API/USER/at_command.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_command.h diff --git a/openair3/NAS/UE/API/USER/at_error.c b/openair3/NAS/UE/API/USER/at_error.c index 7b93fb5808..7e467518a5 100644 --- a/openair3/NAS/UE/API/USER/at_error.c +++ b/openair3/NAS/UE/API/USER/at_error.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_error.c diff --git a/openair3/NAS/UE/API/USER/at_error.h b/openair3/NAS/UE/API/USER/at_error.h index 1554f3fa3e..49393e2679 100644 --- a/openair3/NAS/UE/API/USER/at_error.h +++ b/openair3/NAS/UE/API/USER/at_error.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_error.h diff --git a/openair3/NAS/UE/API/USER/at_response.c b/openair3/NAS/UE/API/USER/at_response.c index 68aa9137aa..e0995ccb24 100644 --- a/openair3/NAS/UE/API/USER/at_response.c +++ b/openair3/NAS/UE/API/USER/at_response.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_response.c diff --git a/openair3/NAS/UE/API/USER/at_response.h b/openair3/NAS/UE/API/USER/at_response.h index 2fa30fabeb..d616bc8bd5 100644 --- a/openair3/NAS/UE/API/USER/at_response.h +++ b/openair3/NAS/UE/API/USER/at_response.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_response.h diff --git a/openair3/NAS/UE/API/USER/tst/at_parser.c b/openair3/NAS/UE/API/USER/tst/at_parser.c index 9700018386..2012859810 100644 --- a/openair3/NAS/UE/API/USER/tst/at_parser.c +++ b/openair3/NAS/UE/API/USER/tst/at_parser.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source main.c Version 0.1 diff --git a/openair3/NAS/UE/API/USER/user_api.c b/openair3/NAS/UE/API/USER/user_api.c index 6762877ad0..3c1bf9a129 100644 --- a/openair3/NAS/UE/API/USER/user_api.c +++ b/openair3/NAS/UE/API/USER/user_api.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source user_api.c diff --git a/openair3/NAS/UE/API/USER/user_api.h b/openair3/NAS/UE/API/USER/user_api.h index a71ab458d4..320a8ba917 100644 --- a/openair3/NAS/UE/API/USER/user_api.h +++ b/openair3/NAS/UE/API/USER/user_api.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source user_api.h diff --git a/openair3/NAS/UE/API/USER/user_indication.c b/openair3/NAS/UE/API/USER/user_indication.c index a4e1b7cd93..74b68b94e5 100644 --- a/openair3/NAS/UE/API/USER/user_indication.c +++ b/openair3/NAS/UE/API/USER/user_indication.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source user_indication.c diff --git a/openair3/NAS/UE/API/USER/user_indication.h b/openair3/NAS/UE/API/USER/user_indication.h index 74679fb52a..ff4d446b6c 100644 --- a/openair3/NAS/UE/API/USER/user_indication.h +++ b/openair3/NAS/UE/API/USER/user_indication.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source user_indication.h diff --git a/openair3/NAS/UE/API/USIM/aka_functions.h b/openair3/NAS/UE/API/USIM/aka_functions.h index 0d1a6fe1df..7738acdc3a 100644 --- a/openair3/NAS/UE/API/USIM/aka_functions.h +++ b/openair3/NAS/UE/API/USIM/aka_functions.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ typedef unsigned char u8; /*--------------------------- prototypes --------------------------*/ diff --git a/openair3/NAS/UE/API/USIM/usim_api.c b/openair3/NAS/UE/API/USIM/usim_api.c index 807ee46724..5dd19152eb 100644 --- a/openair3/NAS/UE/API/USIM/usim_api.c +++ b/openair3/NAS/UE/API/USIM/usim_api.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source usim_api.h diff --git a/openair3/NAS/UE/API/USIM/usim_api.h b/openair3/NAS/UE/API/USIM/usim_api.h index f7e85f95e7..799487a6e5 100644 --- a/openair3/NAS/UE/API/USIM/usim_api.h +++ b/openair3/NAS/UE/API/USIM/usim_api.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source usim_api.h diff --git a/openair3/NAS/UE/EMM/Attach.c b/openair3/NAS/UE/EMM/Attach.c old mode 100755 new mode 100644 index 8a589fa0a0..afc283e0f4 --- a/openair3/NAS/UE/EMM/Attach.c +++ b/openair3/NAS/UE/EMM/Attach.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Attach.c diff --git a/openair3/NAS/UE/EMM/Authentication.c b/openair3/NAS/UE/EMM/Authentication.c old mode 100755 new mode 100644 index 6285534450..9065b92482 --- a/openair3/NAS/UE/EMM/Authentication.c +++ b/openair3/NAS/UE/EMM/Authentication.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Authentication.c diff --git a/openair3/NAS/UE/EMM/Detach.c b/openair3/NAS/UE/EMM/Detach.c old mode 100755 new mode 100644 index 7ec7a3d74d..da087f07a0 --- a/openair3/NAS/UE/EMM/Detach.c +++ b/openair3/NAS/UE/EMM/Detach.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Detach.c diff --git a/openair3/NAS/UE/EMM/EmmStatusHdl.c b/openair3/NAS/UE/EMM/EmmStatusHdl.c old mode 100755 new mode 100644 index 126b2a94f6..394704ab32 --- a/openair3/NAS/UE/EMM/EmmStatusHdl.c +++ b/openair3/NAS/UE/EMM/EmmStatusHdl.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Emmstatus.c diff --git a/openair3/NAS/UE/EMM/Identification.c b/openair3/NAS/UE/EMM/Identification.c old mode 100755 new mode 100644 index 80eede61be..c5ebd2c6e6 --- a/openair3/NAS/UE/EMM/Identification.c +++ b/openair3/NAS/UE/EMM/Identification.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Identification.c diff --git a/openair3/NAS/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c old mode 100755 new mode 100644 index b04670819b..32945b0749 --- a/openair3/NAS/UE/EMM/IdleMode.c +++ b/openair3/NAS/UE/EMM/IdleMode.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source IdleMode.c diff --git a/openair3/NAS/UE/EMM/IdleMode.h b/openair3/NAS/UE/EMM/IdleMode.h old mode 100755 new mode 100644 index c0e13c9a7d..c91f9753d6 --- a/openair3/NAS/UE/EMM/IdleMode.h +++ b/openair3/NAS/UE/EMM/IdleMode.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source IdleMode.h diff --git a/openair3/NAS/UE/EMM/LowerLayer.c b/openair3/NAS/UE/EMM/LowerLayer.c old mode 100755 new mode 100644 index 6e264d2a54..602dddac76 --- a/openair3/NAS/UE/EMM/LowerLayer.c +++ b/openair3/NAS/UE/EMM/LowerLayer.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source LowerLayer.c diff --git a/openair3/NAS/UE/EMM/LowerLayer.h b/openair3/NAS/UE/EMM/LowerLayer.h old mode 100755 new mode 100644 index 80ee4acb2a..b4547449e6 --- a/openair3/NAS/UE/EMM/LowerLayer.h +++ b/openair3/NAS/UE/EMM/LowerLayer.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source lowerlayer.h diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c b/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c old mode 100755 new mode 100644 index 13a55b3846..6c60e7bebb --- a/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregistered.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c old mode 100755 new mode 100644 index 0d0301c392..7c55d890a4 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredAttachNeeded.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c old mode 100755 new mode 100644 index 40911608bf..36fd9e1df1 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredAttemptingToAttach.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c old mode 100755 new mode 100644 index 060329f2e5..256970c971 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c old mode 100755 new mode 100644 index 92df829b8d..ce1a9e98d6 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredLimitedService.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c old mode 100755 new mode 100644 index 65154d4d97..1d1c36930c --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredNoCellAvailable.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c old mode 100755 new mode 100644 index 7740b22e9b..374f9047f5 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredNoImsi.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c old mode 100755 new mode 100644 index 25924fd9f2..2f290a0128 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredNormalService.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c old mode 100755 new mode 100644 index 08c3ff5ea1..ef2a4d1fad --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredPlmnSearch.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmNull.c b/openair3/NAS/UE/EMM/SAP/EmmNull.c old mode 100755 new mode 100644 index f36d579e5c..f3c259816c --- a/openair3/NAS/UE/EMM/SAP/EmmNull.c +++ b/openair3/NAS/UE/EMM/SAP/EmmNull.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmNull.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c old mode 100755 new mode 100644 index 889d22663c..47d970730a --- a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegistered.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c old mode 100755 new mode 100644 index 0dcaec5868..fcc6a47010 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredAttemptingToUpdate.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c old mode 100755 new mode 100644 index 24de58db86..c03d06fdab --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredImsiDetachInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c old mode 100755 new mode 100644 index 18c41c8ad4..eda7f12a22 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c old mode 100755 new mode 100644 index 1d78a97509..eac4a8b830 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredLimitedService.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c old mode 100755 new mode 100644 index 8385f4359f..e43848a3c1 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredNoCellAvailable.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c old mode 100755 new mode 100644 index 4f3dc54f46..d0ceb7a80c --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredNormalService.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c old mode 100755 new mode 100644 index a5b28bed43..7a20a191c1 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredPlmnSearch.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c old mode 100755 new mode 100644 index 9f960082f0..ac5876413e --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** ource EmmRegisteredUpdateNeeded.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c old mode 100755 new mode 100644 index 47744d8db9..6e87161638 --- a/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmServiceRequestInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c old mode 100755 new mode 100644 index 4539c63a93..db35f08450 --- a/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmTrackingAreaUpdatingInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_as.c b/openair3/NAS/UE/EMM/SAP/emm_as.c old mode 100755 new mode 100644 index daf2d50c33..4b63580cdb --- a/openair3/NAS/UE/EMM/SAP/emm_as.c +++ b/openair3/NAS/UE/EMM/SAP/emm_as.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_as.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_as.h b/openair3/NAS/UE/EMM/SAP/emm_as.h old mode 100755 new mode 100644 index 1e46431a56..1b504a9388 --- a/openair3/NAS/UE/EMM/SAP/emm_as.h +++ b/openair3/NAS/UE/EMM/SAP/emm_as.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_as.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_asDef.h b/openair3/NAS/UE/EMM/SAP/emm_asDef.h old mode 100755 new mode 100644 index f7b9fa23f8..24b5c2486a --- a/openair3/NAS/UE/EMM/SAP/emm_asDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_asDef.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_asDef.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_esm.c b/openair3/NAS/UE/EMM/SAP/emm_esm.c old mode 100755 new mode 100644 index b4baca66af..d1b2cffb08 --- a/openair3/NAS/UE/EMM/SAP/emm_esm.c +++ b/openair3/NAS/UE/EMM/SAP/emm_esm.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_esm.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_esm.h b/openair3/NAS/UE/EMM/SAP/emm_esm.h old mode 100755 new mode 100644 index 55c3b361a9..a81f536535 --- a/openair3/NAS/UE/EMM/SAP/emm_esm.h +++ b/openair3/NAS/UE/EMM/SAP/emm_esm.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_esm.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h old mode 100755 new mode 100644 index 8251ee57b9..3eb2207989 --- a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_esmDef.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_fsm.c b/openair3/NAS/UE/EMM/SAP/emm_fsm.c old mode 100755 new mode 100644 index dc0e1efa28..86d2b818dc --- a/openair3/NAS/UE/EMM/SAP/emm_fsm.c +++ b/openair3/NAS/UE/EMM/SAP/emm_fsm.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_fsm.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_fsm.h b/openair3/NAS/UE/EMM/SAP/emm_fsm.h old mode 100755 new mode 100644 index c929890e05..9980412679 --- a/openair3/NAS/UE/EMM/SAP/emm_fsm.h +++ b/openair3/NAS/UE/EMM/SAP/emm_fsm.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_fsm.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_recv.c b/openair3/NAS/UE/EMM/SAP/emm_recv.c old mode 100755 new mode 100644 index 12efa89f86..4e2c0f76ae --- a/openair3/NAS/UE/EMM/SAP/emm_recv.c +++ b/openair3/NAS/UE/EMM/SAP/emm_recv.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_recv.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_recv.h b/openair3/NAS/UE/EMM/SAP/emm_recv.h old mode 100755 new mode 100644 index 71398f98d0..d31ccc9175 --- a/openair3/NAS/UE/EMM/SAP/emm_recv.h +++ b/openair3/NAS/UE/EMM/SAP/emm_recv.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_recv.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_reg.c b/openair3/NAS/UE/EMM/SAP/emm_reg.c old mode 100755 new mode 100644 index b73f75975a..dbb8f292f8 --- a/openair3/NAS/UE/EMM/SAP/emm_reg.c +++ b/openair3/NAS/UE/EMM/SAP/emm_reg.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_reg.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_reg.h b/openair3/NAS/UE/EMM/SAP/emm_reg.h old mode 100755 new mode 100644 index 9660f641c1..3e88332eb6 --- a/openair3/NAS/UE/EMM/SAP/emm_reg.h +++ b/openair3/NAS/UE/EMM/SAP/emm_reg.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_reg.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_regDef.h b/openair3/NAS/UE/EMM/SAP/emm_regDef.h old mode 100755 new mode 100644 index 7f96326ffb..1399ddaa4b --- a/openair3/NAS/UE/EMM/SAP/emm_regDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_regDef.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_regDef.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_sap.c b/openair3/NAS/UE/EMM/SAP/emm_sap.c old mode 100755 new mode 100644 index 2da5da75ce..c7d43f9ca2 --- a/openair3/NAS/UE/EMM/SAP/emm_sap.c +++ b/openair3/NAS/UE/EMM/SAP/emm_sap.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_sap.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_sap.h b/openair3/NAS/UE/EMM/SAP/emm_sap.h old mode 100755 new mode 100644 index eda2bde514..866971be1f --- a/openair3/NAS/UE/EMM/SAP/emm_sap.h +++ b/openair3/NAS/UE/EMM/SAP/emm_sap.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_sap.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_send.c b/openair3/NAS/UE/EMM/SAP/emm_send.c old mode 100755 new mode 100644 index d8e434f5a2..0388e53ee1 --- a/openair3/NAS/UE/EMM/SAP/emm_send.c +++ b/openair3/NAS/UE/EMM/SAP/emm_send.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_send.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_send.h b/openair3/NAS/UE/EMM/SAP/emm_send.h old mode 100755 new mode 100644 index 18c8eb37f0..82b644ba80 --- a/openair3/NAS/UE/EMM/SAP/emm_send.h +++ b/openair3/NAS/UE/EMM/SAP/emm_send.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_send.h diff --git a/openair3/NAS/UE/EMM/SecurityModeControl.c b/openair3/NAS/UE/EMM/SecurityModeControl.c old mode 100755 new mode 100644 index fd7e4c3991..fd27c6fa5e --- a/openair3/NAS/UE/EMM/SecurityModeControl.c +++ b/openair3/NAS/UE/EMM/SecurityModeControl.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source SecurityModeControl.c diff --git a/openair3/NAS/UE/EMM/ServiceRequestHdl.c b/openair3/NAS/UE/EMM/ServiceRequestHdl.c old mode 100755 new mode 100644 index d34e1f9f88..ba13ffa711 --- a/openair3/NAS/UE/EMM/ServiceRequestHdl.c +++ b/openair3/NAS/UE/EMM/ServiceRequestHdl.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source ServiceRequest.c diff --git a/openair3/NAS/UE/EMM/TrackingAreaUpdate.c b/openair3/NAS/UE/EMM/TrackingAreaUpdate.c old mode 100755 new mode 100644 index ac7944d18b..770783f1ef --- a/openair3/NAS/UE/EMM/TrackingAreaUpdate.c +++ b/openair3/NAS/UE/EMM/TrackingAreaUpdate.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source TrackingAreaUpdate.c diff --git a/openair3/NAS/UE/EMM/emmData.h b/openair3/NAS/UE/EMM/emmData.h old mode 100755 new mode 100644 index d3e720eab0..cf38b38e3a --- a/openair3/NAS/UE/EMM/emmData.h +++ b/openair3/NAS/UE/EMM/emmData.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emmData.h diff --git a/openair3/NAS/UE/EMM/emm_main.c b/openair3/NAS/UE/EMM/emm_main.c old mode 100755 new mode 100644 index dbeacaa149..5acab31aae --- a/openair3/NAS/UE/EMM/emm_main.c +++ b/openair3/NAS/UE/EMM/emm_main.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_main.c diff --git a/openair3/NAS/UE/EMM/emm_main.h b/openair3/NAS/UE/EMM/emm_main.h old mode 100755 new mode 100644 index b985f806a5..5d28906452 --- a/openair3/NAS/UE/EMM/emm_main.h +++ b/openair3/NAS/UE/EMM/emm_main.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_main.h diff --git a/openair3/NAS/UE/EMM/emm_proc.h b/openair3/NAS/UE/EMM/emm_proc.h old mode 100755 new mode 100644 index 65ebe4e8e2..873aba4758 --- a/openair3/NAS/UE/EMM/emm_proc.h +++ b/openair3/NAS/UE/EMM/emm_proc.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_proc.h diff --git a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c old mode 100755 new mode 100644 index 6a9e140ad4..353c4cb4a2 --- a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c +++ b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source DedicatedEpsBearerContextActivation.c diff --git a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c old mode 100755 new mode 100644 index 1884590437..195f1ff4ad --- a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c +++ b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source DefaultEpsBearerContextActivation.c diff --git a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c old mode 100755 new mode 100644 index bceeebeff1..017d1392ca --- a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c +++ b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EpsBearerContextDeactivation.c diff --git a/openair3/NAS/UE/ESM/EsmStatusHdl.c b/openair3/NAS/UE/ESM/EsmStatusHdl.c old mode 100755 new mode 100644 index 9aafc271dd..d85f3e632d --- a/openair3/NAS/UE/ESM/EsmStatusHdl.c +++ b/openair3/NAS/UE/ESM/EsmStatusHdl.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EsmStatus.c diff --git a/openair3/NAS/UE/ESM/PdnConnectivity.c b/openair3/NAS/UE/ESM/PdnConnectivity.c old mode 100755 new mode 100644 index 8c9d123209..7ae6afea81 --- a/openair3/NAS/UE/ESM/PdnConnectivity.c +++ b/openair3/NAS/UE/ESM/PdnConnectivity.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source PdnConnectivity.c diff --git a/openair3/NAS/UE/ESM/PdnDisconnect.c b/openair3/NAS/UE/ESM/PdnDisconnect.c old mode 100755 new mode 100644 index e9ab748f8d..f988097507 --- a/openair3/NAS/UE/ESM/PdnDisconnect.c +++ b/openair3/NAS/UE/ESM/PdnDisconnect.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source PdnDisconnect.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_recv.c b/openair3/NAS/UE/ESM/SAP/esm_recv.c old mode 100755 new mode 100644 index 72b322e966..3ba14b3868 --- a/openair3/NAS/UE/ESM/SAP/esm_recv.c +++ b/openair3/NAS/UE/ESM/SAP/esm_recv.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_recv.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_recv.h b/openair3/NAS/UE/ESM/SAP/esm_recv.h old mode 100755 new mode 100644 index 35e3ee49ce..ab8fc33996 --- a/openair3/NAS/UE/ESM/SAP/esm_recv.h +++ b/openair3/NAS/UE/ESM/SAP/esm_recv.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_recv.h diff --git a/openair3/NAS/UE/ESM/SAP/esm_sap.c b/openair3/NAS/UE/ESM/SAP/esm_sap.c old mode 100755 new mode 100644 index d23aa07390..5fd394028b --- a/openair3/NAS/UE/ESM/SAP/esm_sap.c +++ b/openair3/NAS/UE/ESM/SAP/esm_sap.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_sap.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_sap.h b/openair3/NAS/UE/ESM/SAP/esm_sap.h old mode 100755 new mode 100644 index 693185c473..d4a7e8e3d3 --- a/openair3/NAS/UE/ESM/SAP/esm_sap.h +++ b/openair3/NAS/UE/ESM/SAP/esm_sap.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_sap.h diff --git a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h old mode 100755 new mode 100644 index 2430696319..b51c124b96 --- a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h +++ b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_sapDef.h diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.c b/openair3/NAS/UE/ESM/SAP/esm_send.c old mode 100755 new mode 100644 index 51cd96fdc8..fdf209c0be --- a/openair3/NAS/UE/ESM/SAP/esm_send.c +++ b/openair3/NAS/UE/ESM/SAP/esm_send.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_send.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.h b/openair3/NAS/UE/ESM/SAP/esm_send.h old mode 100755 new mode 100644 index 8f4056df6f..5a7fd31ec8 --- a/openair3/NAS/UE/ESM/SAP/esm_send.h +++ b/openair3/NAS/UE/ESM/SAP/esm_send.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_send.h diff --git a/openair3/NAS/UE/ESM/esmData.h b/openair3/NAS/UE/ESM/esmData.h old mode 100755 new mode 100644 index 7571e25e64..40e536a956 --- a/openair3/NAS/UE/ESM/esmData.h +++ b/openair3/NAS/UE/ESM/esmData.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esmData.h diff --git a/openair3/NAS/UE/ESM/esm_ebr.c b/openair3/NAS/UE/ESM/esm_ebr.c old mode 100755 new mode 100644 index b305dc778b..037b4905d3 --- a/openair3/NAS/UE/ESM/esm_ebr.c +++ b/openair3/NAS/UE/ESM/esm_ebr.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_ebr.c diff --git a/openair3/NAS/UE/ESM/esm_ebr.h b/openair3/NAS/UE/ESM/esm_ebr.h old mode 100755 new mode 100644 index 1298aa1243..24e19deabf --- a/openair3/NAS/UE/ESM/esm_ebr.h +++ b/openair3/NAS/UE/ESM/esm_ebr.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_ebr.h diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.c b/openair3/NAS/UE/ESM/esm_ebr_context.c old mode 100755 new mode 100644 index 539403f7e4..9cdbfd9cf6 --- a/openair3/NAS/UE/ESM/esm_ebr_context.c +++ b/openair3/NAS/UE/ESM/esm_ebr_context.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_ebr_context.h diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.h b/openair3/NAS/UE/ESM/esm_ebr_context.h old mode 100755 new mode 100644 index a93fb94eb1..f2f8a510d1 --- a/openair3/NAS/UE/ESM/esm_ebr_context.h +++ b/openair3/NAS/UE/ESM/esm_ebr_context.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_ebr_context.h diff --git a/openair3/NAS/UE/ESM/esm_ip.c b/openair3/NAS/UE/ESM/esm_ip.c old mode 100755 new mode 100644 index 041d186b8d..76e62a7d36 --- a/openair3/NAS/UE/ESM/esm_ip.c +++ b/openair3/NAS/UE/ESM/esm_ip.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "emmData.h" #include "esmData.h" diff --git a/openair3/NAS/UE/ESM/esm_main.c b/openair3/NAS/UE/ESM/esm_main.c old mode 100755 new mode 100644 index f507b0a53f..8f925728f8 --- a/openair3/NAS/UE/ESM/esm_main.c +++ b/openair3/NAS/UE/ESM/esm_main.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_main.c diff --git a/openair3/NAS/UE/ESM/esm_main.h b/openair3/NAS/UE/ESM/esm_main.h old mode 100755 new mode 100644 index de95ba26f9..6a989f1c30 --- a/openair3/NAS/UE/ESM/esm_main.h +++ b/openair3/NAS/UE/ESM/esm_main.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_main.h diff --git a/openair3/NAS/UE/ESM/esm_proc.h b/openair3/NAS/UE/ESM/esm_proc.h old mode 100755 new mode 100644 index 094907257b..fcc1328179 --- a/openair3/NAS/UE/ESM/esm_proc.h +++ b/openair3/NAS/UE/ESM/esm_proc.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_proc.h diff --git a/openair3/NAS/UE/ESM/esm_pt.c b/openair3/NAS/UE/ESM/esm_pt.c old mode 100755 new mode 100644 index 9b2f4f7451..1edab0f675 --- a/openair3/NAS/UE/ESM/esm_pt.c +++ b/openair3/NAS/UE/ESM/esm_pt.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_pt.c diff --git a/openair3/NAS/UE/ESM/esm_pt.h b/openair3/NAS/UE/ESM/esm_pt.h old mode 100755 new mode 100644 index 8821b3be91..b521c0f7d7 --- a/openair3/NAS/UE/ESM/esm_pt.h +++ b/openair3/NAS/UE/ESM/esm_pt.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_pt.h diff --git a/openair3/NAS/UE/UEprocess.c b/openair3/NAS/UE/UEprocess.c index 0f45697f18..b6827b28f5 100644 --- a/openair3/NAS/UE/UEprocess.c +++ b/openair3/NAS/UE/UEprocess.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source UEprocess.c diff --git a/openair3/NAS/UE/nas_itti_messaging.c b/openair3/NAS/UE/nas_itti_messaging.c old mode 100755 new mode 100644 index 7b8f630b89..de6c384bf8 --- a/openair3/NAS/UE/nas_itti_messaging.c +++ b/openair3/NAS/UE/nas_itti_messaging.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include "intertask_interface.h" diff --git a/openair3/NAS/UE/nas_itti_messaging.h b/openair3/NAS/UE/nas_itti_messaging.h old mode 100755 new mode 100644 index 9ea80f63c0..5aec6f8e32 --- a/openair3/NAS/UE/nas_itti_messaging.h +++ b/openair3/NAS/UE/nas_itti_messaging.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/NAS/UE/nas_network.c b/openair3/NAS/UE/nas_network.c old mode 100755 new mode 100644 index d6aa625b36..16041005b8 --- a/openair3/NAS/UE/nas_network.c +++ b/openair3/NAS/UE/nas_network.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_network.h diff --git a/openair3/NAS/UE/nas_network.h b/openair3/NAS/UE/nas_network.h old mode 100755 new mode 100644 index d56542ba42..44f7a0d69a --- a/openair3/NAS/UE/nas_network.h +++ b/openair3/NAS/UE/nas_network.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_network.h diff --git a/openair3/NAS/UE/nas_parser.c b/openair3/NAS/UE/nas_parser.c old mode 100755 new mode 100644 index 40ba7152b3..9bf621a871 --- a/openair3/NAS/UE/nas_parser.c +++ b/openair3/NAS/UE/nas_parser.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_parser.c diff --git a/openair3/NAS/UE/nas_parser.h b/openair3/NAS/UE/nas_parser.h old mode 100755 new mode 100644 index 003dd0895e..8af982174b --- a/openair3/NAS/UE/nas_parser.h +++ b/openair3/NAS/UE/nas_parser.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_parser.h diff --git a/openair3/NAS/UE/nas_proc.c b/openair3/NAS/UE/nas_proc.c old mode 100755 new mode 100644 index e9f61b9d8b..0d4597fb1b --- a/openair3/NAS/UE/nas_proc.c +++ b/openair3/NAS/UE/nas_proc.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_proc.c diff --git a/openair3/NAS/UE/nas_proc.h b/openair3/NAS/UE/nas_proc.h old mode 100755 new mode 100644 index 666c97f6dc..e307b7117b --- a/openair3/NAS/UE/nas_proc.h +++ b/openair3/NAS/UE/nas_proc.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_proc.h diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c index ff57901970..b141d73d63 100644 --- a/openair3/NAS/UE/nas_ue_task.c +++ b/openair3/NAS/UE/nas_ue_task.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #if defined(ENABLE_ITTI) # include "assertions.h" # include "intertask_interface.h" diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c index 447198b897..27e40cdc92 100644 --- a/openair3/NAS/UE/nas_user.c +++ b/openair3/NAS/UE/nas_user.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_user.c diff --git a/openair3/NAS/UE/nas_user.h b/openair3/NAS/UE/nas_user.h index 24603f3160..f107935cfb 100644 --- a/openair3/NAS/UE/nas_user.h +++ b/openair3/NAS/UE/nas_user.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_user.h diff --git a/openair3/S1AP/s1ap_common.c b/openair3/S1AP/s1ap_common.c index dabde30b16..d711ba4768 100644 --- a/openair3/S1AP/s1ap_common.c +++ b/openair3/S1AP/s1ap_common.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /*! \file s1ap_common.c * \brief s1ap procedures for both eNB and MME * \author Sebastien ROUX and Navid Nikaein diff --git a/openair3/S1AP/s1ap_common.h b/openair3/S1AP/s1ap_common.h index 3631535903..a8d1e693bb 100644 --- a/openair3/S1AP/s1ap_common.h +++ b/openair3/S1AP/s1ap_common.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /** @defgroup _s1ap_impl_ S1AP Layer Reference Implementation * @ingroup _ref_implementation_ * @{ diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index 4a4ee47e1e..c2b36e0a19 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file s1ap_eNB.c * \brief S1AP eNB task * \author S. Roux and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB.h b/openair3/S1AP/s1ap_eNB.h index 9c372493e9..0b2a717cf2 100644 --- a/openair3/S1AP/s1ap_eNB.h +++ b/openair3/S1AP/s1ap_eNB.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #include #include diff --git a/openair3/S1AP/s1ap_eNB_context_management_procedures.c b/openair3/S1AP/s1ap_eNB_context_management_procedures.c old mode 100755 new mode 100644 index 8bf5d0a313..8fdcbbabb5 --- a/openair3/S1AP/s1ap_eNB_context_management_procedures.c +++ b/openair3/S1AP/s1ap_eNB_context_management_procedures.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file s1ap_eNB_context_management_procedures.c * \brief S1AP context management procedures * \author S. Roux and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_context_management_procedures.h b/openair3/S1AP/s1ap_eNB_context_management_procedures.h old mode 100755 new mode 100644 index be9e0b24b4..4caca82b70 --- a/openair3/S1AP/s1ap_eNB_context_management_procedures.h +++ b/openair3/S1AP/s1ap_eNB_context_management_procedures.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #ifndef S1AP_ENB_CONTEXT_MANAGEMENT_PROCEDURES_H_ #define S1AP_ENB_CONTEXT_MANAGEMENT_PROCEDURES_H_ diff --git a/openair3/S1AP/s1ap_eNB_decoder.c b/openair3/S1AP/s1ap_eNB_decoder.c index d60e19f352..44f1892c91 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.c +++ b/openair3/S1AP/s1ap_eNB_decoder.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file s1ap_eNB_decoder.c * \brief s1ap pdu decode procedures for eNB * \author Sebastien ROUX and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_decoder.h b/openair3/S1AP/s1ap_eNB_decoder.h index 4c3f5f4327..1d9cd3c8de 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.h +++ b/openair3/S1AP/s1ap_eNB_decoder.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #include #include "s1ap_ies_defs.h" diff --git a/openair3/S1AP/s1ap_eNB_default_values.h b/openair3/S1AP/s1ap_eNB_default_values.h index c0fde9f6eb..cd12994427 100644 --- a/openair3/S1AP/s1ap_eNB_default_values.h +++ b/openair3/S1AP/s1ap_eNB_default_values.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef S1AP_ENB_DEFAULT_VALUES_H_ #define S1AP_ENB_DEFAULT_VALUES_H_ diff --git a/openair3/S1AP/s1ap_eNB_defs.h b/openair3/S1AP/s1ap_eNB_defs.h index 2bf2758b89..7829ea3b94 100644 --- a/openair3/S1AP/s1ap_eNB_defs.h +++ b/openair3/S1AP/s1ap_eNB_defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #include #include "queue.h" diff --git a/openair3/S1AP/s1ap_eNB_encoder.c b/openair3/S1AP/s1ap_eNB_encoder.c index 58f7cc1753..474626dea5 100644 --- a/openair3/S1AP/s1ap_eNB_encoder.c +++ b/openair3/S1AP/s1ap_eNB_encoder.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file s1ap_eNB_encoder.c * \brief s1ap pdu encode procedures for eNB * \author Sebastien ROUX and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_encoder.h b/openair3/S1AP/s1ap_eNB_encoder.h index b55cf2c261..a03c03df04 100644 --- a/openair3/S1AP/s1ap_eNB_encoder.h +++ b/openair3/S1AP/s1ap_eNB_encoder.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #ifndef S1AP_ENB_ENCODER_H_ #define S1AP_ENB_ENCODER_H_ diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index f99c5128bd..8fd414d00b 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.c +++ b/openair3/S1AP/s1ap_eNB_handlers.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file s1ap_eNB_handlers.c * \brief s1ap messages handlers for eNB part * \author Sebastien ROUX and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_handlers.h b/openair3/S1AP/s1ap_eNB_handlers.h index 145fd04721..da54b3b2b2 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.h +++ b/openair3/S1AP/s1ap_eNB_handlers.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #ifndef S1AP_ENB_HANDLERS_H_ #define S1AP_ENB_HANDLERS_H_ diff --git a/openair3/S1AP/s1ap_eNB_itti_messaging.c b/openair3/S1AP/s1ap_eNB_itti_messaging.c index b6cdf368f4..849bd09ab2 100644 --- a/openair3/S1AP/s1ap_eNB_itti_messaging.c +++ b/openair3/S1AP/s1ap_eNB_itti_messaging.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "intertask_interface.h" #include "s1ap_eNB_itti_messaging.h" diff --git a/openair3/S1AP/s1ap_eNB_itti_messaging.h b/openair3/S1AP/s1ap_eNB_itti_messaging.h index 4021d623c4..835c2ee803 100644 --- a/openair3/S1AP/s1ap_eNB_itti_messaging.h +++ b/openair3/S1AP/s1ap_eNB_itti_messaging.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef S1AP_ENB_ITTI_MESSAGING_H_ #define S1AP_ENB_ITTI_MESSAGING_H_ diff --git a/openair3/S1AP/s1ap_eNB_management_procedures.c b/openair3/S1AP/s1ap_eNB_management_procedures.c index d521b7b7d3..1092d04401 100644 --- a/openair3/S1AP/s1ap_eNB_management_procedures.c +++ b/openair3/S1AP/s1ap_eNB_management_procedures.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file s1ap_eNB_management_procedures.c * \brief S1AP eNB task * \author S. Roux and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_management_procedures.h b/openair3/S1AP/s1ap_eNB_management_procedures.h index 0fd9f84053..af81eb8c7f 100644 --- a/openair3/S1AP/s1ap_eNB_management_procedures.h +++ b/openair3/S1AP/s1ap_eNB_management_procedures.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #ifndef S1AP_ENB_MANAGEMENT_PROCEDURES_H_ #define S1AP_ENB_MANAGEMENT_PROCEDURES_H_ diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c index d3322a3617..8da0f74ca6 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file s1ap_eNB_nas_procedures.c * \brief S1AP eNb NAS procedure handler * \author S. Roux and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.h b/openair3/S1AP/s1ap_eNB_nas_procedures.h index 552726e8ed..cec47a8587 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.h +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #ifndef S1AP_ENB_NAS_PROCEDURES_H_ #define S1AP_ENB_NAS_PROCEDURES_H_ diff --git a/openair3/S1AP/s1ap_eNB_nnsf.c b/openair3/S1AP/s1ap_eNB_nnsf.c index cf3d4436ed..67ade0e7ab 100644 --- a/openair3/S1AP/s1ap_eNB_nnsf.c +++ b/openair3/S1AP/s1ap_eNB_nnsf.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file s1ap_eNB_nnsf.c * \brief s1ap NAS node selection functions * \author Sebastien ROUX diff --git a/openair3/S1AP/s1ap_eNB_nnsf.h b/openair3/S1AP/s1ap_eNB_nnsf.h index 687f40dd1d..60e5155755 100644 --- a/openair3/S1AP/s1ap_eNB_nnsf.h +++ b/openair3/S1AP/s1ap_eNB_nnsf.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #ifndef S1AP_ENB_NNSF_H_ #define S1AP_ENB_NNSF_H_ diff --git a/openair3/S1AP/s1ap_eNB_overload.c b/openair3/S1AP/s1ap_eNB_overload.c index 2c32f4f9de..308682d964 100644 --- a/openair3/S1AP/s1ap_eNB_overload.c +++ b/openair3/S1AP/s1ap_eNB_overload.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file s1ap_eNB_overload.c * \brief s1ap procedures for overload messages within eNB * \author Sebastien ROUX diff --git a/openair3/S1AP/s1ap_eNB_overload.h b/openair3/S1AP/s1ap_eNB_overload.h index baa1ad1232..75a61926e7 100644 --- a/openair3/S1AP/s1ap_eNB_overload.h +++ b/openair3/S1AP/s1ap_eNB_overload.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #ifndef S1AP_ENB_OVERLOAD_H_ #define S1AP_ENB_OVERLOAD_H_ diff --git a/openair3/S1AP/s1ap_eNB_trace.c b/openair3/S1AP/s1ap_eNB_trace.c index fd192d7320..8bb98ba711 100644 --- a/openair3/S1AP/s1ap_eNB_trace.c +++ b/openair3/S1AP/s1ap_eNB_trace.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #include #include "assertions.h" diff --git a/openair3/S1AP/s1ap_eNB_trace.h b/openair3/S1AP/s1ap_eNB_trace.h index 7d7d49781b..0b8c39b1cd 100644 --- a/openair3/S1AP/s1ap_eNB_trace.h +++ b/openair3/S1AP/s1ap_eNB_trace.h @@ -1,33 +1,3 @@ -/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - -*******************************************************************************/ - #ifndef S1AP_ENB_TRACE_H_ #define S1AP_ENB_TRACE_H_ diff --git a/openair3/S1AP/s1ap_eNB_ue_context.c b/openair3/S1AP/s1ap_eNB_ue_context.c index 50df294dce..4bec4d3cc5 100644 --- a/openair3/S1AP/s1ap_eNB_ue_context.c +++ b/openair3/S1AP/s1ap_eNB_ue_context.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file s1ap_eNB_ue_context.c * \brief s1ap UE context management within eNB * \author Sebastien ROUX diff --git a/openair3/S1AP/s1ap_eNB_ue_context.h b/openair3/S1AP/s1ap_eNB_ue_context.h index 43c9d0e2c2..5b79cf1c62 100644 --- a/openair3/S1AP/s1ap_eNB_ue_context.h +++ b/openair3/S1AP/s1ap_eNB_ue_context.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #include "tree.h" #include "queue.h" diff --git a/openair3/SCTP/sctp_common.c b/openair3/SCTP/sctp_common.c index 8e26679e6a..4aa4ac78db 100644 --- a/openair3/SCTP/sctp_common.c +++ b/openair3/SCTP/sctp_common.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /*! \file sctp_common.c * \brief eNB/MME SCTP related common procedures * \author Sebastien ROUX diff --git a/openair3/SCTP/sctp_common.h b/openair3/SCTP/sctp_common.h index bffc61a919..d3d440b8b6 100644 --- a/openair3/SCTP/sctp_common.h +++ b/openair3/SCTP/sctp_common.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - /*! \file sctp_common.h * \brief eNB/MME SCTP related common procedures * \author Sebastien ROUX diff --git a/openair3/SCTP/sctp_default_values.h b/openair3/SCTP/sctp_default_values.h index 4eaa4e88c2..6bdb5e2d2d 100644 --- a/openair3/SCTP/sctp_default_values.h +++ b/openair3/SCTP/sctp_default_values.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #ifndef SCTP_DEFAULT_VALUES_H_ #define SCTP_DEFAULT_VALUES_H_ diff --git a/openair3/SCTP/sctp_eNB_defs.h b/openair3/SCTP/sctp_eNB_defs.h index 6844b1be31..b3f8593562 100644 --- a/openair3/SCTP/sctp_eNB_defs.h +++ b/openair3/SCTP/sctp_eNB_defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "queue.h" #ifndef SCTP_ENB_DEFS_H_ diff --git a/openair3/SCTP/sctp_eNB_itti_messaging.c b/openair3/SCTP/sctp_eNB_itti_messaging.c index 6e26b2c56d..a85a185a25 100644 --- a/openair3/SCTP/sctp_eNB_itti_messaging.c +++ b/openair3/SCTP/sctp_eNB_itti_messaging.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "intertask_interface.h" #include "sctp_common.h" diff --git a/openair3/SCTP/sctp_eNB_itti_messaging.h b/openair3/SCTP/sctp_eNB_itti_messaging.h index 37af2a9b19..13688b7e21 100644 --- a/openair3/SCTP/sctp_eNB_itti_messaging.h +++ b/openair3/SCTP/sctp_eNB_itti_messaging.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef SCTP_ITTI_MESSAGING_H_ #define SCTP_ITTI_MESSAGING_H_ diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c index 6812c6bce3..d359472b9d 100644 --- a/openair3/SCTP/sctp_eNB_task.c +++ b/openair3/SCTP/sctp_eNB_task.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #include #include #include diff --git a/openair3/SCTP/sctp_eNB_task.h b/openair3/SCTP/sctp_eNB_task.h index 0953b63826..c196ea4d05 100644 --- a/openair3/SCTP/sctp_eNB_task.h +++ b/openair3/SCTP/sctp_eNB_task.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #ifndef SCTP_ENB_TASK_H_ #define SCTP_ENB_TASK_H_ diff --git a/openair3/SCTP/sctp_primitives_client.c b/openair3/SCTP/sctp_primitives_client.c index 762629d405..c5745889f2 100644 --- a/openair3/SCTP/sctp_primitives_client.c +++ b/openair3/SCTP/sctp_primitives_client.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SCTP/sctp_primitives_client.h b/openair3/SCTP/sctp_primitives_client.h index 89cf9f1db2..35c26080e3 100644 --- a/openair3/SCTP/sctp_primitives_client.h +++ b/openair3/SCTP/sctp_primitives_client.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #include #include "sctp_eNB_defs.h" diff --git a/openair3/SECU/kdf.c b/openair3/SECU/kdf.c index 13bd680ccb..16a8476bb4 100644 --- a/openair3/SECU/kdf.c +++ b/openair3/SECU/kdf.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/key_nas_deriver.c b/openair3/SECU/key_nas_deriver.c index 6653d05ee7..9c0377eb67 100644 --- a/openair3/SECU/key_nas_deriver.c +++ b/openair3/SECU/key_nas_deriver.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/key_nas_encryption.c b/openair3/SECU/key_nas_encryption.c index 70e6ed6895..d3e98cd971 100644 --- a/openair3/SECU/key_nas_encryption.c +++ b/openair3/SECU/key_nas_encryption.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include "secu_defs.h" diff --git a/openair3/SECU/nas_stream_eea1.c b/openair3/SECU/nas_stream_eea1.c old mode 100755 new mode 100644 index 142df9e0dc..bd4e4e8e7d --- a/openair3/SECU/nas_stream_eea1.c +++ b/openair3/SECU/nas_stream_eea1.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/nas_stream_eea2.c b/openair3/SECU/nas_stream_eea2.c index 25ef340f4e..0406dec880 100644 --- a/openair3/SECU/nas_stream_eea2.c +++ b/openair3/SECU/nas_stream_eea2.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/nas_stream_eia1.c b/openair3/SECU/nas_stream_eia1.c old mode 100755 new mode 100644 index a0712754f6..40da604f21 --- a/openair3/SECU/nas_stream_eia1.c +++ b/openair3/SECU/nas_stream_eia1.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/nas_stream_eia2.c b/openair3/SECU/nas_stream_eia2.c index 4841dfc90b..db9fc8444d 100644 --- a/openair3/SECU/nas_stream_eia2.c +++ b/openair3/SECU/nas_stream_eia2.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/rijndael.h b/openair3/SECU/rijndael.h index 8014e828ef..4dd704dd94 100644 --- a/openair3/SECU/rijndael.h +++ b/openair3/SECU/rijndael.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef RIJNDAEL_H_ #define RIJNDAEL_H_ /* Rijndael S-box SR */ diff --git a/openair3/SECU/secu_defs.h b/openair3/SECU/secu_defs.h index 0f27d8d309..40954b8ed7 100644 --- a/openair3/SECU/secu_defs.h +++ b/openair3/SECU/secu_defs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef SECU_DEFS_H_ #define SECU_DEFS_H_ diff --git a/openair3/SECU/snow3g.c b/openair3/SECU/snow3g.c index 78184af9c1..dc3bcbf292 100644 --- a/openair3/SECU/snow3g.c +++ b/openair3/SECU/snow3g.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/snow3g.h b/openair3/SECU/snow3g.h index d278db2dcf..4316400455 100644 --- a/openair3/SECU/snow3g.h +++ b/openair3/SECU/snow3g.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file snow3g.h * \brief * \author Open source Adapted from Specification of the 3GPP Confidentiality and diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 69e707dcf9..ea2789a688 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* generate_scenario.c ------------------- diff --git a/openair3/TEST/EPC_TEST/generate_scenario.h b/openair3/TEST/EPC_TEST/generate_scenario.h index 88c0d28e17..2dbcc8ddc7 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.h +++ b/openair3/TEST/EPC_TEST/generate_scenario.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* generate_scenario.h ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index b2207d39d7..081d0e5eaf 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* play_scenario.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index c1458047bd..1e46dff3d6 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /* play_scenario.h ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_decode.c b/openair3/TEST/EPC_TEST/play_scenario_decode.c index aba1703eb3..c80e728029 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_decode.c +++ b/openair3/TEST/EPC_TEST/play_scenario_decode.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* play_scenario_decode.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_display.c b/openair3/TEST/EPC_TEST/play_scenario_display.c index 2a924e952c..a4fca02ec5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_display.c +++ b/openair3/TEST/EPC_TEST/play_scenario_display.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* play_scenario_display.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index f5b142d2fd..0dace298ec 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* play_scenario_fsm.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index e4f7b48c51..51078f4576 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* play_scenario_parse.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 64071981fb..78b95e17c0 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* play_scenario_s1ap.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 5d43b211ee..866b128704 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* play_scenario_s1ap_compare_ie.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h index ac77b88b24..a8e6ff519a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - #include #include "queue.h" diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index 5d5489089b..e542652853 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* play_scenario_sctp.c ------------------- diff --git a/openair3/TEST/oaisim_mme_client_test.c b/openair3/TEST/oaisim_mme_client_test.c index b2eea62424..b81c2c6e49 100644 --- a/openair3/TEST/oaisim_mme_client_test.c +++ b/openair3/TEST/oaisim_mme_client_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_itti_test.c b/openair3/TEST/oaisim_mme_itti_test.c index 06fb3e191c..9f233f5bf1 100644 --- a/openair3/TEST/oaisim_mme_itti_test.c +++ b/openair3/TEST/oaisim_mme_itti_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_list_benchmark.c b/openair3/TEST/oaisim_mme_list_benchmark.c index 8aaf8d1ddd..b91817d128 100644 --- a/openair3/TEST/oaisim_mme_list_benchmark.c +++ b/openair3/TEST/oaisim_mme_list_benchmark.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_s1ap_test.c b/openair3/TEST/oaisim_mme_s1ap_test.c index af3585ded0..1397a30ac5 100644 --- a/openair3/TEST/oaisim_mme_s1ap_test.c +++ b/openair3/TEST/oaisim_mme_s1ap_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_sctp_test.c b/openair3/TEST/oaisim_mme_sctp_test.c index 4c433c8bf3..b64e4f8dad 100644 --- a/openair3/TEST/oaisim_mme_sctp_test.c +++ b/openair3/TEST/oaisim_mme_sctp_test.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c.c b/openair3/TEST/oaisim_mme_test_s1c.c index d7af00086b..94708d73ae 100644 --- a/openair3/TEST/oaisim_mme_test_s1c.c +++ b/openair3/TEST/oaisim_mme_test_s1c.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c.h b/openair3/TEST/oaisim_mme_test_s1c.h index 0927ab6ad6..b12b43842e 100644 --- a/openair3/TEST/oaisim_mme_test_s1c.h +++ b/openair3/TEST/oaisim_mme_test_s1c.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - typedef struct s1c_test_s { int scenario_index; int tx_next_message_index; diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c b/openair3/TEST/oaisim_mme_test_s1c_s1ap.c old mode 100755 new mode 100644 index 836a54b42f..1ebfb3bfd0 --- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c +++ b/openair3/TEST/oaisim_mme_test_s1c_s1ap.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h old mode 100755 new mode 100644 index a4570b97bc..5fea0903b6 --- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h +++ b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.c b/openair3/TEST/oaisim_mme_test_s1c_scenario.c old mode 100755 new mode 100644 index 1cf9208870..478f0a2519 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario.c +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.h b/openair3/TEST/oaisim_mme_test_s1c_scenario.h index 6187f02d7f..a08c83b969 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario.h +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario1.c b/openair3/TEST/oaisim_mme_test_s1c_scenario1.c index 3fc1fbad7b..203259cd74 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario1.c +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario1.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include "oaisim_mme_test_s1c_scenario.h" diff --git a/openair3/TEST/test_aes128_cmac_encrypt.c b/openair3/TEST/test_aes128_cmac_encrypt.c index 22eb244579..1230df9d7b 100644 --- a/openair3/TEST/test_aes128_cmac_encrypt.c +++ b/openair3/TEST/test_aes128_cmac_encrypt.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_aes128_ctr_decrypt.c b/openair3/TEST/test_aes128_ctr_decrypt.c index f3740b48ff..d642728802 100644 --- a/openair3/TEST/test_aes128_ctr_decrypt.c +++ b/openair3/TEST/test_aes128_ctr_decrypt.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_aes128_ctr_encrypt.c b/openair3/TEST/test_aes128_ctr_encrypt.c index a089ac549d..a49ea99764 100644 --- a/openair3/TEST/test_aes128_ctr_encrypt.c +++ b/openair3/TEST/test_aes128_ctr_encrypt.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_kdf.c b/openair3/TEST/test_kdf.c index 121efcb953..e96f3fdb30 100644 --- a/openair3/TEST/test_kdf.c +++ b/openair3/TEST/test_kdf.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_s1ap.c b/openair3/TEST/test_s1ap.c index e070e7018d..9d618d9487 100644 --- a/openair3/TEST/test_s1ap.c +++ b/openair3/TEST/test_s1ap.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include diff --git a/openair3/TEST/test_secu.c b/openair3/TEST/test_secu.c index ac3788eebd..ed1a9f721a 100644 --- a/openair3/TEST/test_secu.c +++ b/openair3/TEST/test_secu.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_kenb.c b/openair3/TEST/test_secu_kenb.c index 967e457229..843c04d850 100644 --- a/openair3/TEST/test_secu_kenb.c +++ b/openair3/TEST/test_secu_kenb.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas.c b/openair3/TEST/test_secu_knas.c index 9b9cdc415a..54dd4cc5f1 100644 --- a/openair3/TEST/test_secu_knas.c +++ b/openair3/TEST/test_secu_knas.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eea1.c b/openair3/TEST/test_secu_knas_encrypt_eea1.c old mode 100755 new mode 100644 index 83a4077d89..dc83308b57 --- a/openair3/TEST/test_secu_knas_encrypt_eea1.c +++ b/openair3/TEST/test_secu_knas_encrypt_eea1.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eea2.c b/openair3/TEST/test_secu_knas_encrypt_eea2.c index d0ff01c1e6..3dd5fcd1ee 100644 --- a/openair3/TEST/test_secu_knas_encrypt_eea2.c +++ b/openair3/TEST/test_secu_knas_encrypt_eea2.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eia1.c b/openair3/TEST/test_secu_knas_encrypt_eia1.c old mode 100755 new mode 100644 index 9a53079098..b42c324c3c --- a/openair3/TEST/test_secu_knas_encrypt_eia1.c +++ b/openair3/TEST/test_secu_knas_encrypt_eia1.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eia2.c b/openair3/TEST/test_secu_knas_encrypt_eia2.c index f85ddc0fea..89cae0e02c 100644 --- a/openair3/TEST/test_secu_knas_encrypt_eia2.c +++ b/openair3/TEST/test_secu_knas_encrypt_eia2.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_stream_int.c b/openair3/TEST/test_secu_knas_stream_int.c index 731af2df8a..0c7d023e02 100644 --- a/openair3/TEST/test_secu_knas_stream_int.c +++ b/openair3/TEST/test_secu_knas_stream_int.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/UDP/udp_eNB_task.c b/openair3/UDP/udp_eNB_task.c index d2a73d9b95..ef573622bc 100644 --- a/openair3/UDP/udp_eNB_task.c +++ b/openair3/UDP/udp_eNB_task.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file udp_eNB_task.c * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/UDP/udp_eNB_task.h b/openair3/UDP/udp_eNB_task.h index 37ff413bf7..94a092c536 100644 --- a/openair3/UDP/udp_eNB_task.h +++ b/openair3/UDP/udp_eNB_task.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file udp_eNB_task.h * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/UTILS/HASHTABLE/hashtable.c b/openair3/UTILS/HASHTABLE/hashtable.c index a557211b23..279eaebae8 100755 --- a/openair3/UTILS/HASHTABLE/hashtable.c +++ b/openair3/UTILS/HASHTABLE/hashtable.c @@ -1,34 +1,6 @@ /* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node * Original licence Creative Commons CC0 1.0 Waiver. */ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/UTILS/HASHTABLE/hashtable.h b/openair3/UTILS/HASHTABLE/hashtable.h index 051a2929b0..fc9b368724 100755 --- a/openair3/UTILS/HASHTABLE/hashtable.h +++ b/openair3/UTILS/HASHTABLE/hashtable.h @@ -1,34 +1,6 @@ /* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node * Original licence Creative Commons CC0 1.0 Waiver.(http://creativecommons.org/publicdomain/zero/1.0/) */ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #ifndef _UTILS_COLLECTION_HASH_TABLE_H_ #define _UTILS_COLLECTION_HASH_TABLE_H_ #include diff --git a/openair3/UTILS/HASHTABLE/obj_hashtable.c b/openair3/UTILS/HASHTABLE/obj_hashtable.c old mode 100755 new mode 100644 index 55e86cd8f3..81abfe03b7 --- a/openair3/UTILS/HASHTABLE/obj_hashtable.c +++ b/openair3/UTILS/HASHTABLE/obj_hashtable.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/UTILS/HASHTABLE/obj_hashtable.h b/openair3/UTILS/HASHTABLE/obj_hashtable.h old mode 100755 new mode 100644 index d74e1e97d4..d11a67e264 --- a/openair3/UTILS/HASHTABLE/obj_hashtable.h +++ b/openair3/UTILS/HASHTABLE/obj_hashtable.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #ifndef _OBJ_HASH_TABLE_H_ #define _OBJ_HASH_TABLE_H_ #include diff --git a/openair3/UTILS/conversions.c b/openair3/UTILS/conversions.c index f2c324568f..628d8de72b 100644 --- a/openair3/UTILS/conversions.c +++ b/openair3/UTILS/conversions.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h index 47912f0d92..547bb97ac2 100644 --- a/openair3/UTILS/conversions.h +++ b/openair3/UTILS/conversions.h @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include "assertions.h" #ifndef CONVERSIONS_H_ diff --git a/openair3/UTILS/enum_string.c b/openair3/UTILS/enum_string.c index cab5b0319e..ce735bd8a4 100644 --- a/openair3/UTILS/enum_string.c +++ b/openair3/UTILS/enum_string.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include #include diff --git a/openair3/UTILS/enum_string.h b/openair3/UTILS/enum_string.h index c0a921c98e..017edbd928 100644 --- a/openair3/UTILS/enum_string.h +++ b/openair3/UTILS/enum_string.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #ifndef ENUM_STRING_H_ #define ENUM_STRING_H_ diff --git a/openair3/UTILS/log.c b/openair3/UTILS/log.c index 6aebde8280..c3bedbfa95 100644 --- a/openair3/UTILS/log.c +++ b/openair3/UTILS/log.c @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair3/UTILS/log.h b/openair3/UTILS/log.h index 34700522af..516d7ab78b 100644 --- a/openair3/UTILS/log.h +++ b/openair3/UTILS/log.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include "mme_config.h" #ifndef LOG_H_ diff --git a/openair3/UTILS/mcc_mnc_itu.c b/openair3/UTILS/mcc_mnc_itu.c old mode 100755 new mode 100644 index 8c59b8e53a..ef1ad151a5 --- a/openair3/UTILS/mcc_mnc_itu.c +++ b/openair3/UTILS/mcc_mnc_itu.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #include #include #include diff --git a/openair3/UTILS/mcc_mnc_itu.h b/openair3/UTILS/mcc_mnc_itu.h old mode 100755 new mode 100644 index b59db73720..3d446abad9 --- a/openair3/UTILS/mcc_mnc_itu.h +++ b/openair3/UTILS/mcc_mnc_itu.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ /***************************************************************************** Source mcc_mnc.h diff --git a/openair3/UTILS/mme_config.c b/openair3/UTILS/mme_config.c index bc1a408312..f82a9f16ff 100644 --- a/openair3/UTILS/mme_config.c +++ b/openair3/UTILS/mme_config.c @@ -1,32 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair3/UTILS/mme_config.h b/openair3/UTILS/mme_config.h index 5301a9c59d..b4dae36a8a 100644 --- a/openair3/UTILS/mme_config.h +++ b/openair3/UTILS/mme_config.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #include #include diff --git a/openair3/UTILS/mme_default_values.h b/openair3/UTILS/mme_default_values.h index 779e5a4661..a5b9abaa6d 100644 --- a/openair3/UTILS/mme_default_values.h +++ b/openair3/UTILS/mme_default_values.h @@ -1,31 +1,3 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ #ifndef MME_DEFAULT_VALUES_H_ #define MME_DEFAULT_VALUES_H_ diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index 6cc1d8c5d2..73e0e94ad4 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** bladerf_lib.c * * Author: navid nikaein diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h index 743baf1bc8..4510dd3900 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** bladerf_lib.h * * Author: navid nikaein diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index b82fc98981..022c626aa5 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file common_lib.c * \brief common APIs for different RF frontend device * \author HongliangXU, Navid Nikaein diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index dc0b31af58..d91757c32b 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file common_lib.h * \brief common APIs for different RF frontend device * \author HongliangXU, Navid Nikaein diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index a360f26556..dba6c54a4a 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index a9706c73bd..8e8a2ca69e 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index f15f2d98eb..8fea197b97 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index b4618bb825..2afc812b09 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file ethernet_lib.h * \brief API to stream I/Q samples over standard ethernet * \author Katerina Trilyraki, Navid Nikaein diff --git a/targets/ARCH/EXMIMO/DEFS/openair_device.h b/targets/ARCH/EXMIMO/DEFS/openair_device.h old mode 100755 new mode 100644 index 2be7b7f088..5c5b5585c0 --- a/targets/ARCH/EXMIMO/DEFS/openair_device.h +++ b/targets/ARCH/EXMIMO/DEFS/openair_device.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef OPENAIR_DEVICE_H #define OPENAIR_DEVICE_H diff --git a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h index 713480b40b..665cfaf638 100644 --- a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h +++ b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** pcie_interface.h Interface definitions to handle communication between PC (kernel driver & SDR application) and Leon3 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h old mode 100755 new mode 100644 index ffba2d61c4..9e3eb64df4 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __DEFS_H__ #define __DEFS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c index eb23d1afb8..7520004e91 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** exmimo_fw.c * * Initialization routines for diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h old mode 100755 new mode 100644 index 90d1eaa64c..248545fd67 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __EXTERN_H__ #define __EXTERN_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c old mode 100755 new mode 100644 index 4427f4c8af..c5ce9fb81e --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** fileops.c * * Device IOCTL File Operations on character device /dev/openair0 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c index c8b9217ce3..4606154290 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** irq.c - IRQ Handler: IRQ from Leon to PCIe/Kernel: exmimo_irq_handler - sends received packets to userspace diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c old mode 100755 new mode 100644 index ce699a1b4f..bc890008cc --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** module_main.c (was: device.c) * * Main Kernel module functions for load/init and cleanup of the kernel driver diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h old mode 100755 new mode 100644 index 7220946e6b..5a284fbe9e --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __VARS_H__ #define __VARS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h old mode 100755 new mode 100644 index ffba2d61c4..9e3eb64df4 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __DEFS_H__ #define __DEFS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c index 1cc6abf9f7..c3d2589821 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** exmimo_fw.c * * Initialization routines for diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h old mode 100755 new mode 100644 index 90d1eaa64c..248545fd67 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __EXTERN_H__ #define __EXTERN_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c old mode 100755 new mode 100644 index 4427f4c8af..c5ce9fb81e --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** fileops.c * * Device IOCTL File Operations on character device /dev/openair0 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c index c8b9217ce3..4606154290 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** irq.c - IRQ Handler: IRQ from Leon to PCIe/Kernel: exmimo_irq_handler - sends received packets to userspace diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c old mode 100755 new mode 100644 index b25ff1cfa8..e4f11d6fc6 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** module_main.c (was: device.c) * * Main Kernel module functions for load/init and cleanup of the kernel driver diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h old mode 100755 new mode 100644 index 7220946e6b..5a284fbe9e --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __VARS_H__ #define __VARS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c index 2a25dd39fe..e97be04c34 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "em1_drv.h" static irqreturn_t irq_handler(int irq, void *dev_id) diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c index b22b224e04..c6bf1ed3d4 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "em1_drv.h" MODULE_AUTHOR("Alexandre Becoulet, Cerdan Sebastien"); diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h index f19f0cfc42..007e36dbc8 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef USER_APP #include diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c index 15f4deacd2..03a1c8ba41 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "em1_drv.h" int em1_fifo_write(struct em1_private_s *pv, const uint32_t *buf, size_t count) diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c index 8ade1d69a0..c6605f537f 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "em1_drv.h" static int em1_ioctl_fifo_write(struct em1_private_s *pv, size_t size, uint32_t *words) diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c index c2860f0b18..7ad3a83cf1 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "em1_drv.h" diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c index 478f8bb363..26be0eb815 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "em1_drv.h" void em1_unlock_user_page(struct em1_page_s *ep) diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c index 5fbe19eacd..62318bbba4 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include "openair0_lib.h" diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c index 84b2d8e8e2..2fd394887c 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "openair0_lib.h" #include "gain_control.h" //#define DEBUG_PHY diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h index c71b51550e..426113de98 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #define TARGET_RX_POWER 50 // Target digital power for the AGC #define TARGET_RX_POWER_MAX 53 // Maximum digital power for AGC #define TARGET_RX_POWER_MIN 48 // Minimum digital power for AGC diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 427cd47be8..46eac95bc0 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** openair0_lib : API to interface with ExpressMIMO-1&2 kernel driver * * Authors: Matthias Ihmig , 2013 diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h index 0abb27dee2..5a0ad4608d 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** openair0_lib : API to interface with ExpressMIMO kernel driver * * Authors: Matthias Ihmig , 2013 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h index 238c4ee606..ed847cbd9e 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*============================================================================ File: elf.h Include file for ELF file. Defines both 32-/64-bit files. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h index dfd16118c6..d1d790d236 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*============================================================================ File: elftypes.h Include file for Elf types. Define elf types for Elf structures. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c index 692742c7cf..03468fe1ba 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* C Header file for updatefw tool. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h index ea2abec216..06d2ddea4d 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* C Header file for updatefw tool. diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 4be796e588..1824810eaa 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - - #include #include #include diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp index 30a2106b34..32938bbd24 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** sodera_lib.c * * Author: Raymond Knopp diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 72e79b44de..73fb85e825 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** usrp_lib.cpp * * \author: HongliangXU : hong-liang-xu@agilent.com diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c index b31c96b72b..47d869bc2b 100644 --- a/targets/COMMON/create_tasks.c +++ b/targets/COMMON/create_tasks.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #if defined(ENABLE_ITTI) # include "intertask_interface.h" # include "create_tasks.h" diff --git a/targets/COMMON/create_tasks.h b/targets/COMMON/create_tasks.h index 4e6f5817d8..6263d7f8d6 100644 --- a/targets/COMMON/create_tasks.h +++ b/targets/COMMON/create_tasks.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef CREATE_TASKS_H_ #define CREATE_TASKS_H_ diff --git a/targets/RT/USER/TOOLS/thread_ipc.c b/targets/RT/USER/TOOLS/thread_ipc.c index 36a61298ef..bc4d0ed2fb 100644 --- a/targets/RT/USER/TOOLS/thread_ipc.c +++ b/targets/RT/USER/TOOLS/thread_ipc.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/RT/USER/TOOLS/thread_ipc.h b/targets/RT/USER/TOOLS/thread_ipc.h index 99439b2b8d..c0221d6a77 100644 --- a/targets/RT/USER/TOOLS/thread_ipc.h +++ b/targets/RT/USER/TOOLS/thread_ipc.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __THREAD_IPC_H__ #define __THREAD_IPC_H__ diff --git a/targets/RT/USER/UE_transport_IQ.c b/targets/RT/USER/UE_transport_IQ.c index a45b8ba43b..b2b4ff42c2 100644 --- a/targets/RT/USER/UE_transport_IQ.c +++ b/targets/RT/USER/UE_transport_IQ.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file UE_transport_IQ.c * \brief UE transport IQ sampels * \author Katerina Trilyraki, Navid Nikaein, Raymond Knopp diff --git a/targets/RT/USER/condtest.c b/targets/RT/USER/condtest.c index 6ff2fe4516..ffd755e59a 100644 --- a/targets/RT/USER/condtest.c +++ b/targets/RT/USER/condtest.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/RT/USER/eNB_transport_IQ.c b/targets/RT/USER/eNB_transport_IQ.c index 86080c2c33..6c743867cd 100644 --- a/targets/RT/USER/eNB_transport_IQ.c +++ b/targets/RT/USER/eNB_transport_IQ.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file eNB_transport_IQ.c * \brief eNB transport IQ samples * \author Katerina Trilyraki, Navid Nikaein, Raymond Knopp diff --git a/targets/RT/USER/emos-raw.c b/targets/RT/USER/emos-raw.c index b436e84502..f6bb712976 100644 --- a/targets/RT/USER/emos-raw.c +++ b/targets/RT/USER/emos-raw.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file lte-softmodem.c * \brief main program to control HW and scheduling * \author R. Knopp, F. Kaltenberger diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index ee4344cd2d..39ca31c1e9 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file lte-softmodem.c * \brief main program to control HW and scheduling * \author R. Knopp, F. Kaltenberger, Navid Nikaein diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 0e834a53ab..fca2113bb1 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - /*! \file lte-ue.c * \brief threads and support functions for real-time LTE UE target * \author R. Knopp, F. Kaltenberger, Navid Nikaein diff --git a/targets/RT/USER/msg_many.h b/targets/RT/USER/msg_many.h index 82e5eb1371..0668a53f04 100644 --- a/targets/RT/USER/msg_many.h +++ b/targets/RT/USER/msg_many.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __MSG_MANY_H__ #define __MSG_MANY_H__ #include diff --git a/targets/RT/USER/rrh.c b/targets/RT/USER/rrh.c index 6da21190e5..bcd83498b4 100644 --- a/targets/RT/USER/rrh.c +++ b/targets/RT/USER/rrh.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /** ethernet_lib : API to stream I/Q samples over standard ethernet (RRH component) * * Authors: Raymond Knopp , Riadh Ghaddab diff --git a/targets/RT/USER/rrh_gw.c b/targets/RT/USER/rrh_gw.c index 4fd687a3a5..e52eeda79b 100644 --- a/targets/RT/USER/rrh_gw.c +++ b/targets/RT/USER/rrh_gw.c @@ -1,33 +1,4 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file rrh_gw.h * \brief top-level for the remote radio head gateway (RRH_gw) module reusing the ethernet library * \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp diff --git a/targets/RT/USER/rrh_gw.h b/targets/RT/USER/rrh_gw.h index 739e2088b2..8a2d050231 100644 --- a/targets/RT/USER/rrh_gw.h +++ b/targets/RT/USER/rrh_gw.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file rrh_gw.h * \brief header file for remote radio head gateway (RRH_gw) module * \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp diff --git a/targets/RT/USER/rrh_gw_externs.h b/targets/RT/USER/rrh_gw_externs.h index df59b9b1af..ec42da2ad5 100644 --- a/targets/RT/USER/rrh_gw_externs.h +++ b/targets/RT/USER/rrh_gw_externs.h @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rrh_gw_extern.h * \brief rrh gatewy external vars * \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp diff --git a/targets/RT/USER/rt_wrapper.c b/targets/RT/USER/rt_wrapper.c index ed9eb4e798..400bcfcd2b 100644 --- a/targets/RT/USER/rt_wrapper.c +++ b/targets/RT/USER/rt_wrapper.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file rt_wrapper.h * \brief provides a wrapper for the timing function, runtime calculations for real-time opeartions depending on weather RTAI or DEADLINE_SCHEDULER kernels are used or not * \author F. Kaltenberger and Navid Nikaein diff --git a/targets/RT/USER/rt_wrapper.h b/targets/RT/USER/rt_wrapper.h index d67632054b..380c1a931b 100644 --- a/targets/RT/USER/rt_wrapper.h +++ b/targets/RT/USER/rt_wrapper.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ - /*! \file rt_wrapper.h * \brief provides a wrapper for the timing function for real-time opeartions depending on weather RTAI is used or not. It also implements an API for the SCHED_DEADLINE kernel scheduler. * \author F. Kaltenberger and Navid Nikaein diff --git a/targets/RT/USER/sched_dlsch.c b/targets/RT/USER/sched_dlsch.c index 48fac642a9..52029bc70f 100644 --- a/targets/RT/USER/sched_dlsch.c +++ b/targets/RT/USER/sched_dlsch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file sched_dlsch.c * \brief DLSCH decoding thread (RTAI) * \author R. Knopp, F. Kaltenberger diff --git a/targets/RT/USER/sched_rx_pdsch.c b/targets/RT/USER/sched_rx_pdsch.c index e792fe737d..af9205ef66 100644 --- a/targets/RT/USER/sched_rx_pdsch.c +++ b/targets/RT/USER/sched_rx_pdsch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file sched_dlsch.c * \brief DLSCH decoding thread (RTAI) * \author R. Knopp, F. Kaltenberger diff --git a/targets/RT/USER/sched_ulsch.c b/targets/RT/USER/sched_ulsch.c index 3ab0c312f5..8434e15206 100644 --- a/targets/RT/USER/sched_ulsch.c +++ b/targets/RT/USER/sched_ulsch.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file sched_ulsch.c * \brief ULSCH decoding thread (RTAI) * \author R. Knopp, F. Kaltenberger diff --git a/targets/RT/USER/sleeptest.c b/targets/RT/USER/sleeptest.c index 369f335307..ba7cfd5554 100644 --- a/targets/RT/USER/sleeptest.c +++ b/targets/RT/USER/sleeptest.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file lte-softmodem.c * \brief main program to control HW and scheduling * \author R. Knopp, F. Kaltenberger diff --git a/targets/RT/USER/synctest.c b/targets/RT/USER/synctest.c index e365ad6728..b9a3bf25e5 100644 --- a/targets/RT/USER/synctest.c +++ b/targets/RT/USER/synctest.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file lte-softmodem.c * \brief main program to control HW and scheduling * \author R. Knopp, F. Kaltenberger diff --git a/targets/SIMU/PROC/Process.c b/targets/SIMU/PROC/Process.c index 28d4970cc0..48adea99ad 100644 --- a/targets/SIMU/PROC/Process.c +++ b/targets/SIMU/PROC/Process.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/SIMU/PROC/Process.h b/targets/SIMU/PROC/Process.h index 4bf6c7a739..6931bd54a5 100644 --- a/targets/SIMU/PROC/Process.h +++ b/targets/SIMU/PROC/Process.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __PROCESS_H__ # define __PROCESS_H__ diff --git a/targets/SIMU/PROC/Tsync.h b/targets/SIMU/PROC/Tsync.h index 6488759440..84dfede802 100644 --- a/targets/SIMU/PROC/Tsync.h +++ b/targets/SIMU/PROC/Tsync.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* * Tsync.h * diff --git a/targets/SIMU/PROC/channel_sim_proc.c b/targets/SIMU/PROC/channel_sim_proc.c index 334d3f5549..d9c0786b51 100644 --- a/targets/SIMU/PROC/channel_sim_proc.c +++ b/targets/SIMU/PROC/channel_sim_proc.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/SIMU/PROC/channel_sim_proc.h b/targets/SIMU/PROC/channel_sim_proc.h index 49e732de98..c2543ad284 100644 --- a/targets/SIMU/PROC/channel_sim_proc.h +++ b/targets/SIMU/PROC/channel_sim_proc.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /* * channel_sim_proc.h * diff --git a/targets/SIMU/PROC/interface.h b/targets/SIMU/PROC/interface.h index 0688226ca6..4c78ad2436 100644 --- a/targets/SIMU/PROC/interface.h +++ b/targets/SIMU/PROC/interface.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #ifndef __INTERFACE_H__ # define __INTERFACE_H__ diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index 187f1109c0..1d81054b92 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/SIMU/USER/cor_SF_sim.c b/targets/SIMU/USER/cor_SF_sim.c index 73a6f023cc..6db7323801 100644 --- a/targets/SIMU/USER/cor_SF_sim.c +++ b/targets/SIMU/USER/cor_SF_sim.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "cor_SF_sim.h" double ** createMat (int nbRow, int nbCol) diff --git a/targets/SIMU/USER/cor_SF_sim.h b/targets/SIMU/USER/cor_SF_sim.h index 193eef90f1..1e2e7c0f11 100644 --- a/targets/SIMU/USER/cor_SF_sim.h +++ b/targets/SIMU/USER/cor_SF_sim.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/SIMU/USER/event_handler.c b/targets/SIMU/USER/event_handler.c index 1f7ecde72e..27d5af13e3 100644 --- a/targets/SIMU/USER/event_handler.c +++ b/targets/SIMU/USER/event_handler.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file event_handler.c * \brief event handler primitives * \author Navid Nikaein and Mohamed Said MOSLI BOUKSIAA, diff --git a/targets/SIMU/USER/event_handler.h b/targets/SIMU/USER/event_handler.h index 748d4efc2c..00c4ff3ab5 100644 --- a/targets/SIMU/USER/event_handler.h +++ b/targets/SIMU/USER/event_handler.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file event_handler.h * \brief primitives to handle event acting on oai * \author Navid Nikaein and Mohamed Said MOSLI BOUKSIAA, diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index 0e7564565c..0692ae7057 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/SIMU/USER/init_lte.h b/targets/SIMU/USER/init_lte.h index 72ffd60765..e71cfaef52 100644 --- a/targets/SIMU/USER/init_lte.h +++ b/targets/SIMU/USER/init_lte.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "PHY/types.h" #include "PHY/defs.h" diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 30093f4953..6de2fa6073 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file oaisim.c * \brief oaisim top level * \author Navid Nikaein diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h index 6fb16b82db..60e33de566 100644 --- a/targets/SIMU/USER/oaisim.h +++ b/targets/SIMU/USER/oaisim.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/SIMU/USER/oaisim_config.c b/targets/SIMU/USER/oaisim_config.c index 51a5a03eac..9b5d49f63e 100644 --- a/targets/SIMU/USER/oaisim_config.c +++ b/targets/SIMU/USER/oaisim_config.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*! \file oaisim_config.c * \brief Configuration of oaisim * \author Navid Nikaein diff --git a/targets/SIMU/USER/oaisim_config.h b/targets/SIMU/USER/oaisim_config.h index a50a8d2426..6e53f23dea 100644 --- a/targets/SIMU/USER/oaisim_config.h +++ b/targets/SIMU/USER/oaisim_config.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - - /*! \file oaisim_config.h * \brief configure an emulation * \author navid nikaein & Lusheng Wang diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 67b070509e..ed65d5c2fc 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1,31 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file oaisim_functions.c * \brief function primitives of oaisim * \author Navid Nikaein diff --git a/targets/SIMU/USER/oaisim_functions.h b/targets/SIMU/USER/oaisim_functions.h index 346e95eaf8..944797bc12 100644 --- a/targets/SIMU/USER/oaisim_functions.h +++ b/targets/SIMU/USER/oaisim_functions.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include "oaisim.h" #include #include diff --git a/targets/SIMU/USER/oaisim_pad.c b/targets/SIMU/USER/oaisim_pad.c index b54709b925..8ac11c11c3 100644 --- a/targets/SIMU/USER/oaisim_pad.c +++ b/targets/SIMU/USER/oaisim_pad.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include diff --git a/targets/SIMU/USER/sinr_sim.c b/targets/SIMU/USER/sinr_sim.c index b235e16585..f0137e5b41 100644 --- a/targets/SIMU/USER/sinr_sim.c +++ b/targets/SIMU/USER/sinr_sim.c @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - #include #include #include From 2d73663bc6c1028169ad5c8b951274780ec156e9 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 15 Sep 2016 10:03:50 -0700 Subject: [PATCH 223/340] modifications for odd N_RB_DL in dlsch_modulation.c --- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 30 +++++++++++-------- openair1/SIMULATION/LTE_PHY/dlsim.c | 2 ++ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 8438e86496..5f51e20ecc 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -182,10 +182,11 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, } } else { + // 1st half of PRB for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; re<6; re++,x0p+=4,tti_offset++) { - + qam16_table_offset_re=TWO[x0p[0]]; qam16_table_offset_im=TWO[x0p[1]]; qam16_table_offset_re+=x0p[2]; @@ -193,7 +194,7 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(LTE_DL_FRAME_PARMS *frame_parms, ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; } - + // 2nd half of PRB for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7; re<12; re++,x0p+=4,tti_offset++) { @@ -626,7 +627,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, switch (mod_order0) { case 2: //QPSK -// printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + // printf("re %d %d(%d) : %d,%d => ",re,tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); for (aa=0; aanb_antennas_tx; aa++) { ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i } @@ -639,7 +640,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, *jj = *jj + 1; - // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; case 4: //16QAM @@ -1623,7 +1624,7 @@ inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) __attribute__((always_inline)); inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) { - printf("check_skiphalf : rb %d, subframe_offset %d,l %d, nsymb %d\n",rb,subframe_offset,l,nsymb); + // printf("check_skiphalf : rb %d, subframe_offset %d,l %d, nsymb %d\n",rb,subframe_offset,l,nsymb); if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL @@ -1913,10 +1914,11 @@ int dlsch_modulation(int32_t **txdataF, if (check_skip(rb,subframe_offset,frame_parms,l,nsymb)==1) rb_alloc_ind = 0; - else { - skip_half = check_skiphalf(rb,subframe_offset,frame_parms,l,nsymb); - skip_dc = check_skip_dc(rb,frame_parms); - } + + skip_half = check_skiphalf(rb,subframe_offset,frame_parms,l,nsymb); + skip_dc = check_skip_dc(rb,frame_parms); + + if (dlsch0_harq->Nlayers>1) { printf("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); return(-1); @@ -1932,7 +1934,7 @@ int dlsch_modulation(int32_t **txdataF, if (rb_alloc_ind > 0) { - printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); + // printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); allocate_REs(frame_parms, txdataF, &jj, @@ -1952,11 +1954,13 @@ int dlsch_modulation(int32_t **txdataF, P1_SHIFT, P2_SHIFT); } - + else { + // printf("Unallocated rb %d/symbol %d, re_offset %d, jj %d\n",rb,l,re_offset,jj); + } re_offset+=12; // go to next RB - - // check if we crossed the symbol boundary and skip DC + + // check if we crossed the symbol boundary and skip DCs if (re_offset >= frame_parms->ofdm_symbol_size) { if (skip_dc == 0) //even number of RBs (doesn't straddle DC) re_offset=1; diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 2adbb777d0..4fd04dcbd4 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -2404,6 +2404,8 @@ int main(int argc, char **argv) write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe* eNB->frame_parms.samples_per_tti], eNB->frame_parms.samples_per_tti,1,1); + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); } } From b8a37a34cf348d26dee7439cf431c9fad5eff7c5 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 17 Sep 2016 14:55:26 -0700 Subject: [PATCH 224/340] pucch format 2/2a/2b UE TX --- openair1/PHY/CODING/lte_rate_matching.c | 3 +- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 1 + openair1/PHY/LTE_TRANSPORT/pmch.c | 4 +- openair1/PHY/LTE_TRANSPORT/proto.h | 21 +- openair1/PHY/LTE_TRANSPORT/pucch.c | 318 ++++++++++++++---- openair1/SCHED/phy_procedures_lte_ue.c | 42 ++- openair1/SIMULATION/LTE_PHY/pucchsim.c | 57 +--- 7 files changed, 302 insertions(+), 144 deletions(-) diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 76586eecf4..0b49fe6f5a 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -518,7 +518,8 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC, // if (rvidx==3) // for (cnt=0;cnt=(3*RTC<<5),"Exiting, RM condition (Ncb %d, Nir/C %d, Nsoft %d, Kw %d\n",Ncb,Nir/C,Nsoft,3*(RTC<<5)); + if (Ncb>(3*(RTC<<5))) + AssertFatal(1==0,"Exiting, RM condition (Ncb %d, RTC %d, Nir/C %d, Nsoft %d, Kw %d)\n",Ncb,RTC,Nir/C,Nsoft,3*(RTC<<5)); Gp = G/Nl/Qm; diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 5f51e20ecc..3cc512a8d8 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -1679,6 +1679,7 @@ inline int check_skip_dc(int rb,LTE_DL_FRAME_PARMS *frame_parms) { return(0); } + int dlsch_modulation(int32_t **txdataF, int16_t amp, uint32_t subframe_offset, diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 93922207bb..8003fb177b 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -319,8 +319,8 @@ void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a) AMP); - if (dlsch_encoding(a, - &eNB->frame_parms, + if (dlsch_encoding(eNB, + a, 1, eNB->dlsch_MCH, proc->frame_tx, diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index f37e4be480..055c1d7fb9 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -1709,17 +1709,16 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7]); -void generate_pucch(int32_t **txdataF, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t ncs_cell[20][7], - PUCCH_FMT_t fmt, - PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, - uint16_t n1_pucch, - uint16_t n2_pucch, - uint8_t shortened_format, - uint8_t *payload, - int16_t amp, - uint8_t subframe); +void generate_pucch1x(int32_t **txdataF, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t ncs_cell[20][7], + PUCCH_FMT_t fmt, + PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, + uint16_t n1_pucch, + uint8_t shortened_format, + uint8_t *payload, + int16_t amp, + uint8_t subframe); void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc, diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 9b9693c82f..2569b5d8c7 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -38,7 +38,7 @@ * \warning */ #include "PHY/defs.h" -#include "PHY/extern.h" +#include "PHY/extern.h" #include "LAYER2/MAC/extern.h" #include "UTIL/LOG/log.h" @@ -97,7 +97,7 @@ void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7]) } #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH ncs_cell init (j %d): Ns %d, l %d => ncs_cell %d\n",j,ns,l,ncs_cell[ns][l]); + printf("[PHY] PUCCH ncs_cell init (j %d): Ns %d, l %d => ncs_cell %d\n",j,ns,l,ncs_cell[ns][l]); #endif } @@ -123,17 +123,16 @@ int16_t W3_im[3][6] = {{0 ,0 ,0 }, char pucch_format_string[6][20] = {"format 1\0","format 1a\0","format 1b\0","format 2\0","format 2a\0","format 2b\0"}; -void generate_pucch(int32_t **txdataF, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t ncs_cell[20][7], - PUCCH_FMT_t fmt, - PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, - uint16_t n1_pucch, - uint16_t n2_pucch, - uint8_t shortened_format, - uint8_t *payload, - int16_t amp, - uint8_t subframe) +void generate_pucch1x(int32_t **txdataF, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t ncs_cell[20][7], + PUCCH_FMT_t fmt, + PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, + uint16_t n1_pucch, + uint8_t shortened_format, + uint8_t *payload, + int16_t amp, + uint8_t subframe) { uint32_t u,v,n; @@ -152,7 +151,8 @@ void generate_pucch(int32_t **txdataF, uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift; uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI; - uint8_t Ncs1_div_deltaPUCCH_Shift = frame_parms->pucch_config_common.nCS_AN; + uint8_t Ncs1 = frame_parms->pucch_config_common.nCS_AN; + uint8_t Ncs1_div_deltaPUCCH_Shift = Ncs1/deltaPUCCH_Shift; uint32_t u0 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30; uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30; @@ -160,12 +160,12 @@ void generate_pucch(int32_t **txdataF, uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) { - msg("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift); + printf("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift); return; } if (Ncs1_div_deltaPUCCH_Shift > 7) { - msg("[PHY] generate_pucch: Illegal Ncs1_div_deltaPUCCH_Shift %d (should be 0...7)\n",Ncs1_div_deltaPUCCH_Shift); + printf("[PHY] generate_pucch: Illegal Ncs1_div_deltaPUCCH_Shift %d (should be 0...7)\n",Ncs1_div_deltaPUCCH_Shift); return; } @@ -175,7 +175,7 @@ void generate_pucch(int32_t **txdataF, Nprime = Nprime_div_deltaPUCCH_Shift * deltaPUCCH_Shift; #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); + printf("[PHY] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); #endif N_UL_symb = (frame_parms->Ncp==0) ? 7 : 6; @@ -194,7 +194,7 @@ void generate_pucch(int32_t **txdataF, } #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: nprime0 %d nprime1 %d, %s, payload (%d,%d)\n",nprime0,nprime1,pucch_format_string[fmt],payload[0],payload[1]); + printf("[PHY] PUCCH: nprime0 %d nprime1 %d, %s, payload (%d,%d)\n",nprime0,nprime1,pucch_format_string[fmt],payload[0],payload[1]); #endif n_oc0 = nprime0/Nprime_div_deltaPUCCH_Shift; @@ -208,7 +208,7 @@ void generate_pucch(int32_t **txdataF, n_oc1<<=1; #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1); + printf("[PHY] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1); #endif nprime=nprime0; @@ -280,7 +280,7 @@ void generate_pucch(int32_t **txdataF, } #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs); + printf("[PHY] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs); #endif alpha_ind=0; // compute output sequence @@ -329,15 +329,9 @@ void generate_pucch(int32_t **txdataF, break; case pucch_format2: - msg("[PHY] PUCCH format 2 not implemented\n"); - break; - case pucch_format2a: - msg("[PHY] PUCCH format 2a not implemented\n"); - break; - case pucch_format2b: - msg("[PHY] PUCCH format 2b not implemented\n"); + AssertFatal(1==0,"should not go here\n"); break; } // switch fmt } else { // These are PUCCH reference symbols @@ -348,7 +342,7 @@ void generate_pucch(int32_t **txdataF, } #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,((int16_t *)&zptr[n])[0],((int16_t *)&zptr[n])[1], + printf("[PHY] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,((int16_t *)&zptr[n])[0],((int16_t *)&zptr[n])[1], alpha_ind,alpha_re[alpha_ind],alpha_im[alpha_ind]); #endif alpha_ind = (alpha_ind + n_cs)%12; @@ -366,13 +360,12 @@ void generate_pucch(int32_t **txdataF, m = (n1_pucch < thres) ? NRB2 : (((n1_pucch-thres)/(12*c/deltaPUCCH_Shift))+NRB2+((deltaPUCCH_Shift*Ncs1_div_deltaPUCCH_Shift)>>3)+rem); #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: m %d\n",m); + printf("[PHY] PUCCH: m %d\n",m); #endif nsymb = N_UL_symb<<1; //for (j=0,l=0;l<(nsymb-1);l++) { for (j=0,l=0; l<(nsymb); l++) { - if ((l<(nsymb>>1)) && ((m&1) == 0)) re_offset = (m*6) + frame_parms->first_carrier_offset; else if ((l<(nsymb>>1)) && ((m&1) == 1)) @@ -395,7 +388,7 @@ void generate_pucch(int32_t **txdataF, re_offset = 0; #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]); + printf("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]); #endif } } @@ -431,13 +424,210 @@ void generate_pucch_emul(PHY_VARS_UE *ue, ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1); UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1); } else if (format == pucch_format1) { - LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,proc->frame_tx,subframe,sr); + // LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,proc->frame_tx,subframe,sr); } ue->sr[subframe] = sr; } + +inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti,uint32_t B,uint8_t *btilde) __attribute__((always_inline)); +inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti,uint32_t B,uint8_t *btilde) { + + uint32_t x1, x2, s=0; + int i; + uint8_t c; + + x2 = (rnti<<14) + ((1+subframe)<<16)*(1+(fp->Nid_cell<<1)); //this is c_init in 36.211 Sec 6.3.1 + s = lte_gold_generic(&x1, &x2, 1); + for (i=0;i<19;i++) { + c = (uint8_t)((s>>i)&1); + btilde[i] = (((B>>i)&1) ^ c); + } +} + +inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t amp) __attribute__((always_inline)); +inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t amp) { + + int i; + + for (i=0;i<20;i++) + d[i] = btilde[i] == 1 ? amp : -amp; + +} + +uint32_t pucch_code[13] = {0xFFFFF,0x5A933,0x10E5A,0x6339C,0x73CE0, + 0xFFC00,0xD8E64,0x4F6B0,0x218EC,0x1B746, + 0x0FFFF,0x33FFF,0x3FFFC}; + +void generate_pucch2x(int32_t **txdataF, + LTE_DL_FRAME_PARMS *fp, + uint8_t ncs_cell[20][7], + PUCCH_FMT_t fmt, + PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, + uint16_t n2_pucch, + uint8_t shortened_format, + uint32_t *payload, + int A, + int B2, + int16_t amp, + uint8_t subframe, + uint16_t rnti) { + + int i,j; + uint32_t B=0; + uint8_t btilde[20]; + int16_t d[22]; + uint8_t deltaPUCCH_Shift = fp->pucch_config_common.deltaPUCCH_Shift; + uint8_t NRB2 = fp->pucch_config_common.nRB_CQI; + uint8_t Ncs1 = fp->pucch_config_common.nCS_AN; + + uint32_t u0 = (fp->Nid_cell + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30; + uint32_t u1 = (fp->Nid_cell + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30; + uint32_t v0=fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; + uint32_t v1=fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; + uint32_t z[12*14],*zptr; + uint32_t u,v,n; + uint8_t ns,N_UL_symb,nsymb; + uint32_t nprime,l,n_cs; + int alpha_ind,data_ind; + int16_t ref_re,ref_im; + int m,re_offset,symbol_offset; + int32_t *txptr; + + if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) { + printf("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift); + return; + } + + if (Ncs1 > 7) { + printf("[PHY] generate_pucch: Illegal Ncs1 %d (should be 0...7)\n",Ncs1); + return; + } + + + // pucch2x_encoding + for (i=0;i 0) + B=B^pucch_code[i]; + + // scrambling + pucch2x_scrambling(fp,subframe,rnti,B,btilde); + // modulation + pucch2x_modulation(btilde,d,amp); + + // add extra symbol for 2a/2b + d[20]=0; + d[21]=0; + if (fmt==pucch_format2a) + d[20] = (B2 == 0) ? amp : -amp; + else if (fmt==pucch_format2b) { + switch (B2) { + case 0: + d[20] = amp; + break; + case 1: + d[21] = -amp; + break; + case 2: + d[21] = amp; + break; + case 3: + d[20] = -amp; + break; + default: + AssertFatal(1==0,"Illegal modulation symbol %d for PUCCH %s\n",B2,pucch_format_string[fmt]); + break; + } + } + + zptr = z; + +#ifdef DEBUG_PUCCH_TX + printf("[PHY] PUCCH2x: n2_pucch %d\n",n2_pucch); +#endif + + N_UL_symb = (fp->Ncp==0) ? 7 : 6; + + for (ns=(subframe<<1),u=u0,v=v0; ns<(2+(subframe<<1)); ns++,u=u1,v=v1) { + + if ((ns&1) == 0) + nprime = (n2_pucch < 12*NRB2) ? + n2_pucch % 12 : + (n2_pucch+Ncs1 + 1)%12; + else + nprime = (n2_pucch < 12*NRB2) ? + ((12*(nprime+1)) % 13)-1 : + (10-n2_pucch)%12; + + //loop over symbols in slot + for (l=0; l>15); + ref_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15); + + if ((l<2)||(l>=(N_UL_symb-2))) { //these are PUCCH data symbols + ((int16_t *)&zptr[n])[0] = ((int32_t)d[data_ind]*ref_re - (int32_t)d[data_ind+1]*ref_im)>>15; + ((int16_t *)&zptr[n])[1] = ((int32_t)d[data_ind]*ref_im + (int32_t)d[data_ind+1]*ref_re)>>15; + } + else { + ((int16_t *)&zptr[n])[0] = ref_re; + ((int16_t *)&zptr[n])[1] = ref_im; + } + + } // n + if ((l<2)||(l>=(N_UL_symb-2))) //these are PUCCH data symbols so increment data index + data_ind+=2; + } // l + } //ns + + m = n2_pucch/12; + +#ifdef DEBUG_PUCCH_TX + printf("[PHY] PUCCH: m %d\n",m); +#endif + nsymb = N_UL_symb<<1; + + //for (j=0,l=0;l<(nsymb-1);l++) { + for (j=0,l=0; l<(nsymb); l++) { + if ((l<(nsymb>>1)) && ((m&1) == 0)) + re_offset = (m*6) + fp->first_carrier_offset; + else if ((l<(nsymb>>1)) && ((m&1) == 1)) + re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12; + else if ((m&1) == 0) + re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12; + else + re_offset = ((m-1)*6) + fp->first_carrier_offset; + + if (re_offset > fp->ofdm_symbol_size) + re_offset -= (fp->ofdm_symbol_size); + + symbol_offset = (unsigned int)fp->ofdm_symbol_size*(l+(subframe*nsymb)); + txptr = &txdataF[0][symbol_offset]; + + for (i=0; i<12; i++,j++) { + txptr[re_offset++] = z[j]; + + if (re_offset==fp->ofdm_symbol_size) + re_offset = 0; + +#ifdef DEBUG_PUCCH_TX + printf("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]); +#endif + } + } +} + + uint32_t rx_pucch(PHY_VARS_eNB *eNB, PUCCH_FMT_t fmt, uint8_t UE_id, @@ -535,7 +725,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, Nprime = Nprime_div_deltaPUCCH_Shift * deltaPUCCH_Shift; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); + printf("[eNB] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); #endif N_UL_symb = (frame_parms->Ncp==NORMAL) ? 7 : 6; @@ -554,7 +744,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"PUCCH: nprime0 %d nprime1 %d\n",nprime0,nprime1); + printf("PUCCH: nprime0 %d nprime1 %d\n",nprime0,nprime1); #endif n_oc0 = nprime0/Nprime_div_deltaPUCCH_Shift; @@ -568,7 +758,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, n_oc1<<=1; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1); + printf("[eNB] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1); #endif nprime=nprime0; @@ -647,7 +837,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs); + printf("[eNB] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs); #endif alpha_ind=0; // compute output sequence @@ -663,7 +853,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, zptr[1+(n<<1)] = -(tmp_re*W_im + tmp_im*W_re)>>15; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,zptr[n<<1],zptr[(n<<1)+1], + printf("[eNB] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,zptr[n<<1],zptr[(n<<1)+1], alpha_ind,alpha_re[alpha_ind],alpha_im[alpha_ind]); #endif @@ -682,7 +872,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, m = (n1_pucch < thres) ? NRB2 : (((n1_pucch-thres)/(12*c/deltaPUCCH_Shift))+NRB2+((deltaPUCCH_Shift*Ncs1_div_deltaPUCCH_Shift)>>3)+rem); #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: m %d\n",m); + printf("[eNB] PUCCH: m %d\n",m); #endif nsymb = N_UL_symb<<1; @@ -716,7 +906,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, re_offset = 0; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,i,re_offset,m,j, + printf("[eNB] PUCCH subframe %d (%d,%d,%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,i,re_offset,m,j, rxptr[re_offset<<1],rxptr[1+(re_offset<<1)], zptr[j],zptr[1+j], rxcomp[aa][j],rxcomp[aa][1+j]); @@ -731,7 +921,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, if (fmt == pucch_format1) { #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"Doing PUCCH detection for format 1\n"); + printf("Doing PUCCH detection for format 1\n"); #endif stat_max = 0; @@ -754,7 +944,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) , stat %d\n",subframe,phase,l,re, + printf("[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) , stat %d\n",subframe,phase,l,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l<<1],cfo[1+(l<<1)], stat_re,stat_im,stat); @@ -767,7 +957,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d), stat %d\n",subframe,phase,l2,re, + printf("[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d), stat %d\n",subframe,phase,l2,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l2<<1],cfo[1+(l2<<1)], stat_re,stat_im,stat); @@ -791,7 +981,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, stat_max *= nsymb; // normalize to energy per symbol stat_max /= (frame_parms->N_RB_UL*12); // #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max); + printf("[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max); #endif #ifdef DEBUG_PUCCH_RX @@ -825,7 +1015,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, *payload = 0; *Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10; } - LOG_D(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above)); + printf("[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above)); *Po_PUCCH_update = 1; if (UE_id==0) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_ENERGY,dB_fixed(stat_max)); @@ -861,7 +1051,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, + printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l<<1],cfo[1+(l<<1)], stat_re,stat_im); @@ -882,7 +1072,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l2,re, + printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l2,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l2<<1],cfo[1+(l2<<1)], stat_re,stat_im); @@ -891,7 +1081,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat); + printf("aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat); #endif stat += ((((stat_re*stat_re)) + ((stat_im*stat_im)) + @@ -911,23 +1101,23 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, } //phase stat_max/=(12); //normalize to energy per symbol and RE - //#ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH fmt1a/b: stat_max : %d, phase_max : %d\n",stat_max,phase_max); - //#endif +#ifdef DEBUG_PUCCH_RX + printf("[eNB] PUCCH fmt1a/b: stat_max : %d, phase_max : %d\n",stat_max,phase_max); +#endif stat_re=0; stat_im=0; - LOG_D(PHY,"PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH); + printf("PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH); *Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1)); *Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - eNB->rx_total_gain_dB; *Po_PUCCH_update = 1; - LOG_D(PHY,"PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n", - dB_fixed(stat_max), - pucch1_thres+sigma2_dB, - pucch1_thres, - sigma2_dB, - dB_fixed(*Po_PUCCH)); + printf("PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n", + dB_fixed(stat_max), + pucch1_thres+sigma2_dB, + pucch1_thres, + sigma2_dB, + dB_fixed(*Po_PUCCH)); // Do detection now if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {// @@ -951,7 +1141,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d l %d re %d chest1 => (%d,%d)\n",subframe,l,re, + printf("[eNB] PUCCH subframe %d l %d re %d chest1 => (%d,%d)\n",subframe,l,re, chest_re,chest_im); #endif @@ -963,7 +1153,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4; off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, + printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l<<1],cfo[1+(l<<1)], stat_re,stat_im); @@ -978,7 +1168,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15)/4); off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, + printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l<<1],cfo[1+(l<<1)], stat_re,stat_im); @@ -996,7 +1186,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d l %d re %d chest2 => (%d,%d)\n",subframe,l,re, + printf("[eNB] PUCCH subframe %d l %d re %d chest2 => (%d,%d)\n",subframe,l,re, chest_re,chest_im); #endif @@ -1008,7 +1198,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4; off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, + printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l<<1],cfo[1+(l<<1)], stat_re,stat_im); @@ -1023,7 +1213,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4; off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, + printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l<<1],cfo[1+(l<<1)], stat_re,stat_im); @@ -1031,7 +1221,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"aa%d re %d : stat %d,%d\n",aa,re,stat_re,stat_im); + printf("aa%d re %d : stat %d,%d\n",aa,re,stat_re,stat_im); #endif } //re diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 8468d62cad..a1daeea089 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1189,17 +1189,16 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin if (abstraction_flag == 0) { - generate_pucch(ue->common_vars.txdataF, - &ue->frame_parms, - ue->ncs_cell, - format, - &ue->pucch_config_dedicated[eNB_id], - n1_pucch, - 0, // n2_pucch - 1, // shortened format - pucch_ack_payload, - tx_amp, - subframe_tx); + generate_pucch1x(ue->common_vars.txdataF, + &ue->frame_parms, + ue->ncs_cell, + format, + &ue->pucch_config_dedicated[eNB_id], + n1_pucch, + 1, // shortened format + pucch_ack_payload, + tx_amp, + subframe_tx); } else { #ifdef PHY_ABSTRACTION @@ -1240,17 +1239,16 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin if (abstraction_flag == 0) { - generate_pucch(ue->common_vars.txdataF, - &ue->frame_parms, - ue->ncs_cell, - pucch_format1, - &ue->pucch_config_dedicated[eNB_id], - ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, - 0, // n2_pucch - 1, // shortened format - pucch_ack_payload, // this is ignored anyway, we just need a pointer - tx_amp, - subframe_tx); + generate_pucch1x(ue->common_vars.txdataF, + &ue->frame_parms, + ue->ncs_cell, + pucch_format1, + &ue->pucch_config_dedicated[eNB_id], + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, + 1, // shortened format + pucch_ack_payload, // this is ignored anyway, we just need a pointer + tx_amp, + subframe_tx); } else { LOG_D(PHY,"Calling generate_pucch_emul ...\n"); generate_pucch_emul(ue, diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index 09777d54ce..4f9b8f9a88 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -66,7 +66,7 @@ int main(int argc, char **argv) uint8_t snr1set=0; //mod_sym_t **txdataF; int **txdata; - double **s_re,**s_im,**r_re,**r_im; + double s_re[2][30720],s_im[2][30720],r_re[2][30720],r_im[2][30720]; double ricean_factor=0.0000005,iqim=0.0; int trial, n_trials, ntrials=1, n_errors; @@ -325,10 +325,6 @@ int main(int argc, char **argv) txdata = eNB->common_vars.txdata[eNB_id]; - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); nsymb = (frame_parms->Ncp == 0) ? 14 : 12; printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS, @@ -352,19 +348,6 @@ int main(int argc, char **argv) exit(-1); } - for (i=0; i<2; i++) { - - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - } - init_ncs_cell(&eNB->frame_parms,eNB->ncs_cell); init_ncs_cell(&UE->frame_parms,UE->ncs_cell); @@ -378,17 +361,16 @@ int main(int argc, char **argv) pucch_payload = 0; - generate_pucch(UE->common_vars.txdataF, - frame_parms, - UE->ncs_cell, - pucch_format, - &pucch_config_dedicated, - n1_pucch, - n2_pucch, - 0, //shortened_format, - &pucch_payload, - AMP, //amp, - subframe); //subframe + generate_pucch1x(UE->common_vars.txdataF, + frame_parms, + UE->ncs_cell, + pucch_format, + &pucch_config_dedicated, + n1_pucch, + 0, //shortened_format, + &pucch_payload, + AMP, //amp, + subframe); //subframe write_output("txsigF0.m","txsF0", &UE->common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1); tx_lev = 0; @@ -453,7 +435,7 @@ int main(int argc, char **argv) multipath_channel(UE2eNB,s_re,s_im,r_re,r_im, - 2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0); + eNB->frame_parms.samples_per_tti,0); sigma2_dB = N0;//10*log10((double)tx_lev) - SNR; tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/(double)tx_lev); @@ -509,8 +491,7 @@ int main(int argc, char **argv) if (sig==1) { ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble( - 0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } else { ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); @@ -603,18 +584,6 @@ int main(int argc, char **argv) } - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - lte_sync_time_free(); return(n_errors); From 43f96a0eacb5bb6b0187c7b6be850453a007e19f Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 19 Sep 2016 14:13:11 -0700 Subject: [PATCH 225/340] finishing merge with develop --- openair1/PHY/INIT/defs.h | 2 -- openair1/PHY/INIT/lte_init.c | 40 --------------------- openair1/PHY/INIT/lte_param_init.c | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 5 --- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 10 +++--- openair1/SCHED/phy_mac_stub.c | 1 - openair1/SCHED/phy_procedures_lte_eNb.c | 4 +-- openair1/SCHED/phy_procedures_lte_ue.c | 5 +++ openair2/RRC/LITE/rrc_eNB.c | 5 +-- targets/RT/USER/lte-enb.c | 12 ++++--- targets/RT/USER/lte-softmodem.c | 7 ++-- targets/SIMU/USER/init_lte.c | 8 ++--- targets/SIMU/USER/init_lte.h | 1 - 13 files changed, 31 insertions(+), 71 deletions(-) diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/defs.h index 89cfebff51..fd14c0c9a5 100644 --- a/openair1/PHY/INIT/defs.h +++ b/openair1/PHY/INIT/defs.h @@ -73,7 +73,6 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, \details Only a subset of phy_vars_eNb is initialized. @param[out] phy_vars_eNb Pointer to eNB Variables @param is_secondary_eNb Flag to indicate this eNB gets synch from another -@param cooperation_flag 0 for no cooperation, 1 for Delay Diversity and 2 for Distributed Alamouti @param abstraction_flag 1 indicates memory should be allocated for abstracted MODEM @returns 0 on success @returns -1 if any memory allocation failed @@ -81,7 +80,6 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, */ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNb, unsigned char is_secondary_eNb, - unsigned char cooperation_flag, unsigned char abstraction_flag); /** \brief Configure LTE_DL_FRAME_PARMS with components derived after initial synchronization (MIB decoding + primary/secondary synch). diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index c9aeb6e1d9..a2e4fa8747 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1175,7 +1175,6 @@ int phy_init_lte_ue(PHY_VARS_UE *ue, int phy_init_lte_eNB(PHY_VARS_eNB *eNB, unsigned char is_secondary_eNB, - uint8_t cooperation_flag, unsigned char abstraction_flag) { @@ -1191,7 +1190,6 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, eNB->total_transmitted_bits = 0; eNB->total_system_throughput = 0; eNB->check_for_MUMIMO_transmissions=0; - LOG_I(PHY,"[eNB %"PRIu8"] Initializing DL_FRAME_PARMS : N_RB_DL %"PRIu8", PHICH Resource %d, PHICH Duration %d\n", eNB->Mod_id, fp->N_RB_DL,fp->phich_config_common.phich_resource, @@ -1345,44 +1343,6 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); } - - // In case of Distributed Alamouti Collabrative scheme separate channel estimates are required for both the UEs - if (cooperation_flag == 2) { - pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); // UE 0 DRS estimates - pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); // UE 1 DRS estimates - - for (i=0; inb_antennas_rx; i++) { - pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); - pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); - } - - // Compensated data for the case of Distributed Alamouti Scheme - pusch_vars[UE_id]->rxdataF_comp_0[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y)*(h0*) - pusch_vars[UE_id]->rxdataF_comp_1[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y*)*(h1) - - for (i=0; inb_antennas_rx; i++) { - pusch_vars[UE_id]->rxdataF_comp_0[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); - pusch_vars[UE_id]->rxdataF_comp_1[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); - } - - // UE 0 - pusch_vars[UE_id]->ul_ch_mag_0[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->ul_ch_magb_0[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - pusch_vars[UE_id]->ul_ch_mag_0[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); - pusch_vars[UE_id]->ul_ch_magb_0[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); - } - - // UE 1 - pusch_vars[UE_id]->ul_ch_mag_1[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->ul_ch_magb_1[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - pusch_vars[UE_id]->ul_ch_mag_1[eNB_id][i] = (int32_t*)malloc16( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); - pusch_vars[UE_id]->ul_ch_magb_1[eNB_id][i] = (int32_t*)malloc16( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); - } - }//cooperation_flag } //eNB_id pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c index 8d9acdbe92..114e1f285a 100644 --- a/openair1/PHY/INIT/lte_param_init.c +++ b/openair1/PHY/INIT/lte_param_init.c @@ -83,7 +83,7 @@ void lte_param_init(unsigned char N_tx, lte_gold(frame_parms,UE->lte_gold_table[i],Nid_cell+i); phy_init_lte_ue(UE,1,0); - phy_init_lte_eNB(eNB,0,0,0); + phy_init_lte_eNB(eNB,0,0); generate_pcfich_reg_mapping(&UE->frame_parms); generate_phich_reg_mapping(&UE->frame_parms); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 3e0af70deb..05ba6fc474 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -384,11 +384,6 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB, unsigned int Kr=0,Kr_bytes,r,r_offset=0; unsigned short m=dlsch->harq_processes[harq_pid]->mcs; - struct timespec wait; - - wait.tv_sec=0; - wait.tv_nsec=5000000L; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); A = dlsch->harq_processes[harq_pid]->TBS; //6228 diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index d194439f3b..7141a4983d 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -6,7 +6,7 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + OpenAirInterface is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -490,19 +490,19 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr tc = phy_threegpplte_turbo_decoder8; if (pthread_mutex_timedlock(&proc->mutex_td,&wait) != 0) { - printf("[eNB] ERROR pthread_mutex_lock for TD thread %d (IC %d)\n", proc->instance_cnt_td); + printf("[eNB] ERROR pthread_mutex_lock for TD thread (IC %d)\n", proc->instance_cnt_td); exit_fun( "error locking mutex_fep" ); - return; + return -1; } if (proc->instance_cnt_td==0) { printf("[eNB] TD thread busy\n"); exit_fun("TD thread busy"); pthread_mutex_unlock( &proc->mutex_td ); - return; + return -1; } - ++proc->instance_cnt_te; + ++proc->instance_cnt_td; proc->tdp.eNB = eNB; proc->tdp.UE_id = UE_id; diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index 21bed06a57..3b343d4994 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -60,7 +60,6 @@ void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) int subframe = proc->subframe_tx; - LTE_eNB_DLSCH_t *DLSCH_ptr = eNB->dlsch[0][0]; /* uint32_t rand = taus(); diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 70b0ce1924..e29e2215b5 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2541,7 +2541,7 @@ static void *fep_thread(void *param) { if (pthread_cond_signal(&proc->cond_fep) != 0) { printf("[eNB] ERROR pthread_cond_signal for fep thread exit\n"); exit_fun( "ERROR pthread_cond_signal" ); - return; + return NULL; } } @@ -2611,7 +2611,7 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB) { start_meas(&eNB->ofdm_demod_stats); if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { - printf("[eNB] ERROR pthread_mutex_lock for fep thread %d (IC %d)\n", proc->instance_cnt_fep); + printf("[eNB] ERROR pthread_mutex_lock for fep thread (IC %d)\n", proc->instance_cnt_fep); exit_fun( "error locking mutex_fep" ); return; } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index a1daeea089..538f9e1126 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -2481,6 +2481,11 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, pdsch_vars = NULL; return; break; + default: + pdsch_vars = NULL; + return; + break; + } harq_pid = dlsch0->current_harq_pid; diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 9e5c54cb07..891db7bee5 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -3736,6 +3736,7 @@ rrc_eNB_generate_RRCConnectionSetup( SRB_ToAddModList_t **SRB_configList; SRB_ToAddMod_t *SRB1_config; int cnt; + LTE_DL_FRAME_PARMS *fp = mac_xface->get_lte_frame_parms(ctxt_pP->module_id,CC_id); T(T_ENB_RRC_CONNECTION_SETUP, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); @@ -3745,9 +3746,9 @@ rrc_eNB_generate_RRCConnectionSetup( do_RRCConnectionSetup(ctxt_pP, ue_context_pP, (uint8_t*) eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Payload, - (mac_xface->lte_frame_parms->nb_antennas_tx_eNB==2)?2:1, //at this point we do not have the UE capability information, so it can only be TM1 or TM2 + (fp->nb_antennas_tx_eNB==2)?2:1, //at this point we do not have the UE capability information, so it can only be TM1 or TM2 rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), - mac_xface->frame_parms, + fp, SRB_configList, &ue_context_pP->ue_context.physicalConfigDedicated); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index c095d46729..a05b1c8a9d 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1291,6 +1291,8 @@ static void* eNB_thread_single( void* param ) { } extern void init_fep_thread(PHY_VARS_eNB *, pthread_attr_t *); +extern void init_td_thread(PHY_VARS_eNB *, pthread_attr_t *); +extern void init_te_thread(PHY_VARS_eNB *, pthread_attr_t *); void init_eNB_proc(int inst) { @@ -1299,7 +1301,7 @@ void init_eNB_proc(int inst) { PHY_VARS_eNB *eNB; eNB_proc_t *proc; eNB_rxtx_proc_t *proc_rxtx; - pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL,*attr_fep=NULL,*attr_td=NULL; + pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL,*attr_fep=NULL,*attr_td=NULL,*attr_te; for (CC_id=0; CC_iddo_prach = do_prach; eNB->fep = eNB_fep_full; eNB->td = ulsch_decoding_data_2thread; - eNB->te = dlsch_encoding_2thread; + eNB->te = dlsch_encoding_2threads; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = NULL; @@ -1662,7 +1664,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = do_prach; eNB->fep = eNB_fep_full; eNB->td = ulsch_decoding_data_2thread; - eNB->te = dlsch_encoding_2thread; + eNB->te = dlsch_encoding_2threads; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = tx_fh_if5; @@ -1686,7 +1688,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = do_prach; eNB->fep = NULL; eNB->td = ulsch_decoding_data_2thread; - eNB->te = dlsch_encoding_2thread; + eNB->te = dlsch_encoding_2threads; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; @@ -1709,7 +1711,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = do_prach; eNB->fep = NULL; eNB->td = ulsch_decoding_data_2thread; - eNB->te = dlsch_encoding_2thread; + eNB->te = dlsch_encoding_2threads; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index ca0c23f335..4eb34321d7 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1121,7 +1121,7 @@ static void get_options (int argc, char **argv) frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex = enb_properties->properties[i]->prach_config_index[CC_id]; frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset = enb_properties->properties[i]->prach_freq_offset[CC_id]; - frame_parms[CC_id]->mode1_flag = (transmission_mode == 1) ? 1 : 0; + frame_parms[CC_id]->mode1_flag = (frame_parms[CC_id]->nb_antennas_tx_eNB == 1) ? 1 : 0; frame_parms[CC_id]->threequarter_fs = threequarter_fs; //} // j @@ -1202,7 +1202,8 @@ int T_port = 2021; /* default port to listen to to wait for the tracer */ int T_dont_fork = 0; /* default is to fork, see 'T_init' to understand */ #endif -void set_default_frame_parms() { +void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]); +void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) { int CC_id; @@ -1248,6 +1249,8 @@ void set_default_frame_parms() { } +void init_openair0(void); + void init_openair0() { int card; diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index 54c5e2ad46..5a244207da 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -49,7 +49,6 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, uint8_t Nid_cell, - uint8_t cooperation_flag, uint8_t abstraction_flag) { @@ -57,18 +56,17 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, PHY_VARS_eNB* PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB)); memset(PHY_vars_eNB,0,sizeof(PHY_VARS_eNB)); PHY_vars_eNB->Mod_id=eNB_id; - PHY_vars_eNB->cooperation_flag=cooperation_flag; + PHY_vars_eNB->cooperation_flag=0;//cooperation_flag; memcpy(&(PHY_vars_eNB->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); PHY_vars_eNB->frame_parms.Nid_cell = ((Nid_cell/3)*3)+((eNB_id+Nid_cell)%3); PHY_vars_eNB->frame_parms.nushift = PHY_vars_eNB->frame_parms.Nid_cell%6; - phy_init_lte_eNB(PHY_vars_eNB,0,cooperation_flag,abstraction_flag); + phy_init_lte_eNB(PHY_vars_eNB,0,abstraction_flag); LOG_I(PHY,"init eNB: Nid_cell %d\n", frame_parms->Nid_cell); LOG_I(PHY,"init eNB: frame_type %d,tdd_config %d\n", frame_parms->frame_type,frame_parms->tdd_config); LOG_I(PHY,"init eNB: number of ue max %d number of enb max %d number of harq pid max %d\n", NUMBER_OF_UE_MAX, NUMBER_OF_eNB_MAX, NUMBER_OF_HARQ_PID_MAX); LOG_I(PHY,"init eNB: N_RB_DL %d\n", frame_parms->N_RB_DL); - LOG_I(PHY,"init eNB: Transmission mode %d\n", transmission_mode); LOG_I(PHY,"init eNB: prach_config_index %d\n", frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); @@ -281,7 +279,7 @@ void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs], PHY_vars_eNB_g[eNB_id] = (PHY_VARS_eNB**) malloc(MAX_NUM_CCs*sizeof(PHY_VARS_eNB*)); for (CC_id=0; CC_idMod_id=eNB_id; PHY_vars_eNB_g[eNB_id][CC_id]->CC_id=CC_id; } diff --git a/targets/SIMU/USER/init_lte.h b/targets/SIMU/USER/init_lte.h index 72ffd60765..d9f0725a7c 100644 --- a/targets/SIMU/USER/init_lte.h +++ b/targets/SIMU/USER/init_lte.h @@ -33,7 +33,6 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, uint8_t Nid_cell, - uint8_t cooperation_flag, uint8_t abstraction_flag); PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms, From 8d15dfe89441abd606fba2984b7edeadd4495820 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 20 Sep 2016 07:57:27 -0700 Subject: [PATCH 226/340] small bugs for lte-softmodem with parallel threads in L1 --- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 05ba6fc474..8afb1e6f1c 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -344,10 +344,12 @@ void *te_thread(void *param) { eNB_proc_t *proc = &((te_params *)param)->eNB->proc; while (!oai_exit) { + if (wait_on_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread")<0) break; dlsch_encoding_2threads0((te_params*)param); + if (release_thread(&proc->mutex_te,&proc->instance_cnt_te,"te thread")<0) break; if (pthread_cond_signal(&proc->cond_te) != 0) { From f05013a2876fa739b1f5540c773f6a5aa2ca25e4 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 20 Sep 2016 16:55:16 +0200 Subject: [PATCH 227/340] real changes for L1 threading. previous was bogus --- .../GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index d2e99a3481..03dcabefe2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -36,6 +36,7 @@ eNBs = Nid_cell = 0; N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -100,6 +101,8 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); From 7af3d98fd9bcc3cc2db773c6f682118e40a9e919 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 21 Sep 2016 17:23:50 +0200 Subject: [PATCH 228/340] bugfix in ulsch_decoding. removal of logging in pucch.c and usrp_lib.cpp. --- openair1/PHY/LTE_TRANSPORT/pucch.c | 8 +-- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 61 +++++++++++-------- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 8 +-- .../CONF/enb.band7.tm1.100PRB.usrpb210.conf | 5 +- targets/RT/USER/lte-enb.c | 2 +- 5 files changed, 47 insertions(+), 37 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 507ff91199..7787ddfcf3 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -1015,7 +1015,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, *payload = 0; *Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10; } - printf("[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above)); + //printf("[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above)); *Po_PUCCH_update = 1; if (UE_id==0) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_ENERGY,dB_fixed(stat_max)); @@ -1107,18 +1107,18 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, stat_re=0; stat_im=0; - printf("PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH); + // printf("PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH); *Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1)); *Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - eNB->rx_total_gain_dB; *Po_PUCCH_update = 1; - + /* printf("PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n", dB_fixed(stat_max), pucch1_thres+sigma2_dB, pucch1_thres, sigma2_dB, dB_fixed(*Po_PUCCH)); - + */ // Do detection now if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {// diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 7141a4983d..de81897d5a 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -302,7 +302,7 @@ int ulsch_decoding_data_2thread0(td_params* tdp) { } // go through second half of segments - for (; r<(ulsch_harq->C/2); r++) { + for (; r<(ulsch_harq->C); r++) { // printf("before subblock deinterleaving c[%d] = %p\n",r,ulsch_harq->c[r]); @@ -461,6 +461,7 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr int Q_m = get_Qm_ul(ulsch_harq->mcs); int G = ulsch_harq->nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch; unsigned int E; + int Cby2; uint8_t (*tc)(int16_t *y, uint8_t *, @@ -489,38 +490,44 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr else tc = phy_threegpplte_turbo_decoder8; - if (pthread_mutex_timedlock(&proc->mutex_td,&wait) != 0) { - printf("[eNB] ERROR pthread_mutex_lock for TD thread (IC %d)\n", proc->instance_cnt_td); - exit_fun( "error locking mutex_fep" ); - return -1; - } + if (ulsch_harq->C>1) { // wakeup worker if more than 1 segment + if (pthread_mutex_timedlock(&proc->mutex_td,&wait) != 0) { + printf("[eNB] ERROR pthread_mutex_lock for TD thread (IC %d)\n", proc->instance_cnt_td); + exit_fun( "error locking mutex_fep" ); + return -1; + } + + if (proc->instance_cnt_td==0) { + printf("[eNB] TD thread busy\n"); + exit_fun("TD thread busy"); + pthread_mutex_unlock( &proc->mutex_td ); + return -1; + } + + ++proc->instance_cnt_td; + + proc->tdp.eNB = eNB; + proc->tdp.UE_id = UE_id; + proc->tdp.harq_pid = harq_pid; + proc->tdp.llr8_flag = llr8_flag; + + + // wakeup worker to do second half segments + if (pthread_cond_signal(&proc->cond_td) != 0) { + printf("[eNB] ERROR pthread_cond_signal for td thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return (1+ulsch->max_turbo_iterations); + } - if (proc->instance_cnt_td==0) { - printf("[eNB] TD thread busy\n"); - exit_fun("TD thread busy"); pthread_mutex_unlock( &proc->mutex_td ); - return -1; + Cby2 = ulsch_harq->C/2; } - - ++proc->instance_cnt_td; - - proc->tdp.eNB = eNB; - proc->tdp.UE_id = UE_id; - proc->tdp.harq_pid = harq_pid; - proc->tdp.llr8_flag = llr8_flag; - - // wakeup worker to do second half segments - if (pthread_cond_signal(&proc->cond_td) != 0) { - printf("[eNB] ERROR pthread_cond_signal for td thread exit\n"); - exit_fun( "ERROR pthread_cond_signal" ); - return (1+ulsch->max_turbo_iterations); + else { + Cby2 = 1; } - pthread_mutex_unlock( &proc->mutex_td ); - - // go through first half of segments in main thread - for (r=0; r<(ulsch_harq->C/2); r++) { + for (r=0; rc[r]); // Get Turbo interleaver parameters diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 56a0f50ff4..1a23015cbb 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -215,10 +215,10 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, else time_avg=(time_diff+time_avg) /2.0; - //prints statics of uhd every 10 seconds + /* //prints statics of uhd every 10 seconds if ( loop % (10 * ((int)device->openair0_cfg[0].sample_rate /(int)nsamps )) ==0) LOG_I(HW,"usrp_write: min(ns)=%d, max(ns)=%d, avg(ns)=%d\n", (int)time_min, (int)time_max,(int)time_avg); - + */ loop++; return ret; } @@ -331,12 +331,12 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp time_avg= time_diff; else time_avg=(time_diff+time_avg) /2.0; - + /* //prints statics of uhd every 10 seconds if ( loop % (10 * ((int)device->openair0_cfg[0].sample_rate /(int)nsamps )) ==0) LOG_I(HW,"usrp_read: min(ns)=%d, max(ns)=%d, avg(ns)=%d\n", (int)time_min, (int)time_max,(int)time_avg); - loop++; + loop++;*/ return samples_received; } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index 10da79724a..fea29a7d59 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -31,11 +31,12 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2680000000L; + downlink_frequency = 2660000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -100,6 +101,8 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index a05b1c8a9d..b8ce8dba57 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -835,7 +835,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; unsigned int rxs,txs; int i; - int tx_sfoffset = 2;//(eNB->single_thread_flag == 1) ? 3 : 3; + int tx_sfoffset = 3;//(eNB->single_thread_flag == 1) ? 3 : 3; if (proc->first_rx==0) { // Transmit TX buffer based on timestamp from RX From 898774d68a8fa1c5062961c3a5d76f9bfda99ea4 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 21 Sep 2016 19:08:25 +0200 Subject: [PATCH 229/340] minor compilation fix --- openair2/ENB_APP/enb_config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index cdcf5544c6..def056ee3f 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -536,6 +536,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) config_setting_t *setting_enb = NULL; config_setting_t *setting_otg = NULL; config_setting_t *subsetting_otg = NULL; + int parse_errors = 0; int num_enb_properties = 0; int enb_properties_index = 0; int num_enbs = 0; From fea3c34b5816be0e638ce1962c19d616b289de72 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 22 Sep 2016 16:03:11 +0200 Subject: [PATCH 230/340] minor fix to UE logging for test setup --- .../autotests/tools/configure_cots_sony_experia_m4_ue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py b/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py index c136067a61..46ee33e97a 100755 --- a/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py +++ b/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py @@ -73,7 +73,7 @@ def start_ue () : time.sleep ( 2) #Now we check if ppp0 interface is up and running try: - cmd = 'sudo adb -s ' + device_id + ' shell netcfg |grep 192.' + cmd = 'sudo adb -s ' + device_id + ' shell netcfg |grep UP' status, out = commands.getstatusoutput(cmd) if (out == '') : print "Waiting for UE to connect and get IP Address..." From e5b643d03c0fa565965f6ed4fb09c9a7dbbeb3b1 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Thu, 22 Sep 2016 16:22:55 +0200 Subject: [PATCH 231/340] updates for UE with USRP --- targets/RT/USER/lte-softmodem.c | 28 ++++++++++++++++++---------- targets/RT/USER/lte-ue.c | 29 ++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 4eb34321d7..c9aa16441f 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -424,10 +424,16 @@ void exit_fun(const char* s) oai_exit = 1; for(CC_id=0; CC_idrfdevice.trx_end_func) - PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice); - if (PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func) - PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice); + if (UE_flag == 0) { + if (PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func) + PHY_vars_eNB_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->rfdevice); + if (PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func) + PHY_vars_eNB_g[0][CC_id]->ifdevice.trx_end_func(&PHY_vars_eNB_g[0][CC_id]->ifdevice); + } + else { + if (PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func) + PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][CC_id]->rfdevice); + } } #if defined(ENABLE_ITTI) @@ -1789,14 +1795,16 @@ int main( int argc, char **argv ) // start the main thread if (UE_flag == 1) init_UE(1); - else init_eNB(node_function,node_timing,1,eth_params,single_thread_flag); + else { + init_eNB(node_function,node_timing,1,eth_params,single_thread_flag); // Sleep to allow all threads to setup - number_of_cards = 1; - - for(CC_id=0; CC_idrf_map.card=0; - PHY_vars_eNB_g[0][CC_id]->rf_map.chain=CC_id+chain_offset; + number_of_cards = 1; + + for(CC_id=0; CC_idrf_map.card=0; + PHY_vars_eNB_g[0][CC_id]->rf_map.chain=CC_id+chain_offset; + } } // connect the TX/RX buffers diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index c33005ebab..190951bf00 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -188,7 +188,7 @@ void init_UE(int nb_inst) { ret = openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]); UE->rfdevice.host_type = BBU_HOST; - UE->rfdevice.type = NONE_DEV; + // UE->rfdevice.type = NONE_DEV; error_code = pthread_create(&UE->proc.pthread_ue, &UE->proc.attr_ue, UE_thread, NULL); if (error_code!= 0) { @@ -369,10 +369,7 @@ static void *UE_thread_synch(void *arg) } - if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { - LOG_E(HW,"Could not start the device\n"); - oai_exit=1; - } + pthread_mutex_lock(&sync_mutex); printf("Locked sync_mutex, waiting (UE_sync_thread)\n"); @@ -382,6 +379,11 @@ static void *UE_thread_synch(void *arg) pthread_mutex_unlock(&sync_mutex); printf("Started device, unlocked sync_mutex (UE_sync_thread)\n"); + if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { + LOG_E(HW,"Could not start the device\n"); + oai_exit=1; + } + while (oai_exit==0) { if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) { @@ -941,7 +943,14 @@ void *UE_thread(void *arg) { rxp, UE->frame_parms.samples_per_tti*10, UE->frame_parms.nb_antennas_rx); + + + if (rxs!=UE->frame_parms.samples_per_tti*10) { + exit_fun("problem in rx"); + return &UE_thread_retval; + } } + instance_cnt_synch = ++UE->proc.instance_cnt_synch; if (instance_cnt_synch == 0) { if (pthread_cond_signal(&UE->proc.cond_synch) != 0) { @@ -968,6 +977,12 @@ void *UE_thread(void *arg) { rxp, UE->frame_parms.samples_per_tti, UE->frame_parms.nb_antennas_rx); + + if (rxs!=UE->frame_parms.samples_per_tti){ + exit_fun("problem in rx"); + return &UE_thread_retval; + } + } } } @@ -1065,12 +1080,12 @@ void *UE_thread(void *arg) { proc->frame_tx = proc->frame_rx + ((proc->subframe_rx>5)?1:0); proc->timestamp_tx = timestamp+(4*UE->frame_parms.samples_per_tti)-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0; - + /* if (sf != (timestamp/UE->frame_parms.samples_per_tti)%10) { LOG_E(PHY,"steady-state UE_thread error : frame_rx %d, subframe_rx %d, frame_tx %d, subframe_tx %d, rx subframe %d\n",proc->frame_rx,proc->subframe_rx,proc->frame_tx,proc->subframe_tx,(timestamp/UE->frame_parms.samples_per_tti)%10); exit(-1); } - + */ if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" ); exit_fun("nothing to add"); From 29fac70eb6f61a7ed9038d02139621edc00996d1 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 22 Sep 2016 18:36:35 +0200 Subject: [PATCH 232/340] minor fix pthread_create call --- targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 17a1d18ce6..ada82b8510 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -487,7 +487,7 @@ void create_watchdog(openair0_device *dev) { pthread_attr_setschedpolicy(&priv->watchdog_attr,SCHED_FIFO); pthread_create(&priv->watchdog,&priv->watchdog_attr,watchdog_thread,dev); #else - pthread_create(&priv->watchdog,NULL,watchdog_thread,devv); + pthread_create(&priv->watchdog,NULL,watchdog_thread,dev); #endif pthread_mutex_init(&priv->watchdog_mutex,NULL); From 23822ea203e00f2100fa41c7ee3084ec55b884fe Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 22 Sep 2016 18:55:14 +0200 Subject: [PATCH 233/340] send SIGINT before processes are killed in test setup --- cmake_targets/autotests/run_exec_lte-softmodem_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index eed2fffb77..50ff6451f8 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -313,7 +313,7 @@ def SSHSessionWrapper(machine, username, key_file, password, logdir_remote, logd # \param CleanUpAluLteBox program to terminate AlU Bell Labs LTE Box # \param ExmimoRfStop String to stop EXMIMO card (specified in test_case_list.xml) def cleanOldPrograms(oai, programList, CleanUpAluLteBox, ExmimoRfStop, logdir, logdirOAI5GRepo): - cmd = 'sudo -E killall -9 -q -r ' + programList + cmd = 'sudo -E killall -s INT -q -r ' + programList + ' ; sleep 5 ; sudo -E killall -9 -q -r ' + programList result = oai.send(cmd, True) print "Killing old programs..." + result programArray = programList.split() From 5e7f0070090c80969f81511ef5ac662b2f4925c2 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 23 Sep 2016 02:08:52 +0200 Subject: [PATCH 234/340] fixed --single-thread flag (when not set) --- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 13 +++--- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 27 ++++++------ openair1/SCHED/phy_procedures_lte_ue.c | 2 + .../LAYER2/MAC/eNB_scheduler_primitives.c | 44 ++++++++++++++++++- openair2/RRC/LITE/L2_interface.c | 4 +- openair2/UTIL/LOG/vcd_signal_dumper.c | 1 + openair2/UTIL/LOG/vcd_signal_dumper.h | 1 + .../CONF/enb.band7.tm1.100PRB.usrpb210.conf | 4 +- .../CONF/enb.band7.tm1.50PRB.usrpb210.conf | 2 +- targets/RT/USER/lte-enb.c | 26 ++++++----- 10 files changed, 85 insertions(+), 39 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 8afb1e6f1c..b3601d1456 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -266,10 +266,7 @@ int dlsch_encoding_2threads0(te_params *tep) { unsigned short m=dlsch->harq_processes[harq_pid]->mcs; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); - - - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_IN); if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet @@ -333,7 +330,7 @@ int dlsch_encoding_2threads0(te_params *tep) { m); // r } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_OUT); return(0); } @@ -424,7 +421,8 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB, pthread_mutex_unlock( &proc->mutex_te ); return(-1); } - + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); ++proc->instance_cnt_te; proc->tep.eNB = eNB; @@ -440,6 +438,7 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB, pthread_mutex_unlock( &proc->mutex_te ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); for (r=dlsch->harq_processes[harq_pid]->C>>1; rharq_processes[harq_pid]->C; r++) { if (rharq_processes[harq_pid]->Cminus) @@ -500,7 +499,7 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB, // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the // outputs for each code segment, see Section 5.1.5 p.20 - for (r=0; rharq_processes[harq_pid]->C; r++) { + for (r=0,r_offset=0; rharq_processes[harq_pid]->C; r++) { // get information for E for the segments that are handled by the worker thread if (r<(dlsch->harq_processes[harq_pid]->C>>1)) { diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index de81897d5a..8bdccd9adf 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -299,6 +299,12 @@ int ulsch_decoding_data_2thread0(td_params* tdp) { E = Nl*Q_m * ((GpmodC==0?0:1) + (Gp/C)); r_offset += E; + + if (r==0) { + offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); + } else { + offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); + } } // go through second half of segments @@ -393,8 +399,7 @@ int ulsch_decoding_data_2thread0(td_params* tdp) { &eNB->ulsch_tc_intl1_stats, &eNB->ulsch_tc_intl2_stats); - - // Reassembly of Transport block here + // Reassembly of Transport block here if (ret != (1+ulsch->max_turbo_iterations)) { if (rCminus) @@ -404,17 +409,11 @@ int ulsch_decoding_data_2thread0(td_params* tdp) { Kr_bytes = Kr>>3; - if (r==0) { - memcpy(ulsch_harq->b, - &ulsch_harq->c[0][(ulsch_harq->F>>3)], - Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0)); - offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); - } else { - memcpy(ulsch_harq->b+offset, - ulsch_harq->c[r], - Kr_bytes - ((ulsch_harq->C>1)?3:0)); - offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); - } + memcpy(ulsch_harq->b+offset, + ulsch_harq->c[r], + Kr_bytes - ((ulsch_harq->C>1)?3:0)); + offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); + } else { break; @@ -621,7 +620,7 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr &eNB->ulsch_tc_ext_stats, &eNB->ulsch_tc_intl1_stats, &eNB->ulsch_tc_intl2_stats); - + // Reassembly of Transport block here if (ret != (1+ulsch->max_turbo_iterations)) { diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 538f9e1126..16872ec879 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -713,12 +713,14 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin if (ue->mac_enabled==1){ // ask L2 for RACH transport if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { + LOG_D(PHY,"Getting PRACH resources\n"); ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(ue->Mod_id, ue->CC_id, frame_tx, eNB_id, subframe_tx); LOG_D(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[ue->Mod_id].radioResourceConfigCommon); + LOG_D(PHY,"Prach resources %p\n",ue->prach_resources[eNB_id]); } } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 9992e76150..605ff93f1f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -1005,6 +1005,46 @@ int get_nCCE_offset(int *CCE_table, } } +void dump_CCE_table(int *CCE_table,const int nCCE,const unsigned short rnti,const int subframe,int L) { + + int nb_candidates = 0,i; + unsigned int Yk; + + for (i=0;irnti); for (j=0;j<=i;j++){ LOG_I(MAC,"DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", - i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci, + j,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci, DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci, DCI_pdu->dci_alloc[j].rnti,DCI_pdu->dci_alloc[j].format, 1<dci_alloc[j].L, nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols); } + dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,dci_alloc->L); + goto failed; } DCI_pdu->num_pdcch_symbols++; diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index 50e00e6a83..d45b69dcd8 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -291,10 +291,10 @@ mac_rrc_data_req( #endif //Rel10 } else { //This is an UE -#ifdef DEBUG_RRC + LOG_D(RRC,"[UE %d] Frame %d Filling CCCH SRB_ID %d\n",Mod_idP,frameP,Srb_id); LOG_D(RRC,"[UE %d] Frame %d buffer_pP status %d,\n",Mod_idP,frameP, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size); -#endif + if( (UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size > 0) ) { diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 94e180773d..b8b8123780 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -272,6 +272,7 @@ const char* eurecomFunctionsNames[] = { "phy_ue_ulsch_scrambling", "phy_eNB_dlsch_modulation", "phy_eNB_dlsch_encoding", + "phy_eNB_dlsch_encoding_w", "phy_eNB_dlsch_scrambling", /* MAC signals */ diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 416ec6064e..6edd9c09d5 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -246,6 +246,7 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_SCRAMBLING, VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, + VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, /* MAC signals */ diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index cc19e20794..6d4652183e 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -32; + pdsch_referenceSignalPower = -29; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -70,7 +70,7 @@ eNBs = pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -103; + pucch_p0_Nominal = -100; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index 03dcabefe2..b18055ed22 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -70,7 +70,7 @@ eNBs = pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -103; + pucch_p0_Nominal = -100; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index b8ce8dba57..d2be56a3a3 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -237,7 +237,7 @@ static inline void thread_top_init(char *thread_name, } memset(&sparam, 0, sizeof(sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); policy = SCHED_FIFO ; s = pthread_setschedparam(pthread_self(), policy, &sparam); @@ -1566,6 +1566,7 @@ int start_rf(PHY_VARS_eNB *eNB) { extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB); extern void eNB_fep_full(PHY_VARS_eNB *eNB); +extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB); extern void do_prach(PHY_VARS_eNB *eNB); void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *eth_params,int single_thread_flag) { @@ -1613,7 +1614,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case NGFI_RRU_IF4p5: eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; + eNB->fep = (single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; eNB->td = NULL; eNB->te = NULL; eNB->proc_uespec_rx = NULL; @@ -1642,9 +1643,9 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP: eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; - eNB->td = ulsch_decoding_data_2thread; - eNB->te = dlsch_encoding_2threads; + eNB->fep = (single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = NULL; @@ -1662,9 +1663,9 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP_BBU: eNB->do_prach = do_prach; - eNB->fep = eNB_fep_full; - eNB->td = ulsch_decoding_data_2thread; - eNB->te = dlsch_encoding_2threads; + eNB->fep = (single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; + eNB->td = (single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = (single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = tx_fh_if5; @@ -1687,8 +1688,8 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst case NGFI_RCC_IF4p5: eNB->do_prach = do_prach; eNB->fep = NULL; - eNB->td = ulsch_decoding_data_2thread; - eNB->te = dlsch_encoding_2threads; + eNB->td = (single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = (single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; @@ -1710,8 +1711,9 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst case NGFI_RAU_IF4p5: eNB->do_prach = do_prach; eNB->fep = NULL; - eNB->td = ulsch_decoding_data_2thread; - eNB->te = dlsch_encoding_2threads; + + eNB->td = (single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = (single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; From 574fbd661cf2288b9064b4e5f874f533722ade03 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 23 Sep 2016 16:38:20 +0200 Subject: [PATCH 235/340] activate TX path of UE --- targets/RT/USER/lte-ue.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 190951bf00..e1438e3b27 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -851,10 +851,10 @@ void *UE_thread(void *arg) { static int UE_thread_retval; PHY_VARS_UE *UE = PHY_vars_UE_g[0][0]; // int tx_enabled = 0; - unsigned int rxs; + unsigned int rxs,txs; int dummy_rx[UE->frame_parms.nb_antennas_rx][UE->frame_parms.samples_per_tti] __attribute__((aligned(32))); openair0_timestamp timestamp,timestamp1; - void* rxp[2]; + void* rxp[2], *txp[2]; #ifdef NAS_UE MessageDef *message_p; @@ -863,6 +863,7 @@ void *UE_thread(void *arg) { int start_rx_stream = 0; int rx_off_diff = 0; int rx_correction_timer = 0; + int i; #ifdef DEADLINE_SCHEDULER @@ -1033,9 +1034,24 @@ void *UE_thread(void *arg) { else { UE->proc.proc_rxtx[0].frame_rx++; UE->proc.proc_rxtx[1].frame_rx++; - + for (int sf=0;sf<10;sf++) { - for (int i=0; iframe_parms.nb_antennas_rx; i++) + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + + for (i=0; iframe_parms.nb_antennas_tx; i++) + txp[i] = (void*)&UE->common_vars.txdata[i][((sf+4)%10)*UE->frame_parms.samples_per_tti]; + + txs = UE->rfdevice.trx_write_func(&UE->rfdevice, + timestamp+(4*UE->frame_parms.samples_per_tti)-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0-openair0_cfg[0].tx_sample_advance, + txp, + UE->frame_parms.samples_per_tti, + UE->frame_parms.nb_antennas_tx, + 1); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + for (i=0; iframe_parms.nb_antennas_rx; i++) rxp[i] = (void*)&rxdata[i][UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti)]; // grab signal for subframe VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); @@ -1047,7 +1063,7 @@ void *UE_thread(void *arg) { UE->frame_parms.samples_per_tti, UE->frame_parms.nb_antennas_rx); } - + else { rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, @@ -1056,10 +1072,10 @@ void *UE_thread(void *arg) { UE->frame_parms.nb_antennas_rx); // read in first symbol of next frame and adjust for timing drift rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, - ×tamp1, - (void**)rxdata, - UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, - UE->frame_parms.nb_antennas_rx); + ×tamp1, + (void**)rxdata, + UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, + UE->frame_parms.nb_antennas_rx); rx_off_diff = 0; } } From 1edceeb6ea7a3cee6eba163f42304450edabd1e5 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 24 Sep 2016 19:58:24 +0200 Subject: [PATCH 236/340] config files fix for new params in enhancement-10-harmony branch --- .../GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf | 3 +++ .../GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf | 3 +++ .../GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf | 5 ++++- .../GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf | 3 +++ .../GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf | 3 +++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf index d0488f2d37..ac3c5fa290 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf @@ -22,6 +22,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf index ba753fb6f3..f50101a3e9 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf index 1954662a10..115082c530 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf @@ -22,6 +22,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -46,7 +49,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -23; + pdsch_referenceSignalPower = -26; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf index 2d634a863b..dc4e65f47d 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf index a68c65146f..f41df6bb76 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf @@ -22,6 +22,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; From 2098dcdd0a5ce4e8ab2eac4cea0aa470db8f2fcf Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 24 Sep 2016 21:06:19 +0200 Subject: [PATCH 237/340] Gitlab CI: minor fix to how processes are terminated --- cmake_targets/autotests/run_exec_lte-softmodem_tests.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index eed2fffb77..86f8f605c5 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -588,7 +588,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , RRH_pre_exec_args = testcase.findtext('RRH_pre_exec_args',default='') RRH_main_exec = testcase.findtext('RRH_main_exec',default='') RRH_main_exec_args = testcase.findtext('RRH_main_exec_args',default='') - RRH_terminate_missing_procs = testcase.findtext('RRH_terminate_missing_procs',default='True') + RRH_terminate_missing_procs = testcase.findtext('RRH_terminate_missing_procs',default='False') eNBMachine = testcase.findtext('eNB',default='') @@ -601,7 +601,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , eNB_main_exec_args = testcase.findtext('eNB_main_exec_args',default='') eNB_traffic_exec = testcase.findtext('eNB_traffic_exec',default='') eNB_traffic_exec_args = testcase.findtext('eNB_traffic_exec_args',default='') - eNB_terminate_missing_procs = testcase.findtext('eNB_terminate_missing_procs',default='True') + eNB_terminate_missing_procs = testcase.findtext('eNB_terminate_missing_procs',default='False') eNB_search_expr_true = testcase.findtext('eNB_search_expr_true','') if re.compile('\w+').match(eNB_search_expr_true) != None: eNB_search_expr_true = eNB_search_expr_true + ' duration=' + str(timeout_cmd-90) + 's' @@ -616,7 +616,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , UE_main_exec_args = testcase.findtext('UE_main_exec_args',default='') UE_traffic_exec = testcase.findtext('UE_traffic_exec',default='') UE_traffic_exec_args = testcase.findtext('UE_traffic_exec_args',default='') - UE_terminate_missing_procs = testcase.findtext('UE_terminate_missing_procs',default='True') + UE_terminate_missing_procs = testcase.findtext('UE_terminate_missing_procs',default='False') UE_search_expr_true = testcase.findtext('UE_search_expr_true','') UE_stop_script = testcase.findtext('UE_stop_script','') if re.compile('\w+').match(UE_search_expr_true) != None: @@ -637,7 +637,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , HSS_main_exec_args = testcase.findtext('HSS_main_exec_args',default='') EPC_traffic_exec = testcase.findtext('EPC_traffic_exec',default='') EPC_traffic_exec_args = testcase.findtext('EPC_traffic_exec_args',default='') - EPC_terminate_missing_procs = testcase.findtext('EPC_terminate_missing_procs',default='True') + EPC_terminate_missing_procs = testcase.findtext('EPC_terminate_missing_procs',default='False') EPC_search_expr_true = testcase.findtext('EPC_search_expr_true','') if re.compile('\w+').match(EPC_search_expr_true) != None: EPC_search_expr_true = EPC_search_expr_true + ' duration=' + str(timeout_cmd-90) + 's' From a4d3ec8dc455d23ae03a2112b137192051e52aaa Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 24 Sep 2016 21:14:31 +0200 Subject: [PATCH 238/340] Gitlab CI:minor fix to log directory creation --- cmake_targets/autotests/run_exec_lte-softmodem_tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index 86f8f605c5..91c46728f1 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -1304,6 +1304,8 @@ logdirOpenaircnRepo = logdir + 'openair-cn/' if flag_remove_logdir == True: print "Removing directory: " + locallogdir os.system(' rm -fr ' + locallogdir + '; mkdir -p ' + locallogdir ) +else: + oa.system('mkdir -p ' + locallogdir) paramiko_logfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/log/paramiko.log') res=os.system(' echo > ' + paramiko_logfile) From e584ce06c49de03eea27fe8d4f90e8fd066f43bb Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 24 Sep 2016 21:16:10 +0200 Subject: [PATCH 239/340] Gitlab CI:minor type in python script --- cmake_targets/autotests/run_exec_lte-softmodem_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index 91c46728f1..d128765a90 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -1305,7 +1305,7 @@ if flag_remove_logdir == True: print "Removing directory: " + locallogdir os.system(' rm -fr ' + locallogdir + '; mkdir -p ' + locallogdir ) else: - oa.system('mkdir -p ' + locallogdir) + os.system('mkdir -p ' + locallogdir) paramiko_logfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/log/paramiko.log') res=os.system(' echo > ' + paramiko_logfile) From 829ee59707605bc137cbeac1cef91aaf520cf4ee Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 24 Sep 2016 22:03:35 -0700 Subject: [PATCH 240/340] fixes for oaisim, testing TM2 --- openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 6 +-- openair1/SCHED/phy_procedures_lte_ue.c | 3 +- openair1/SIMULATION/RF/dac.c | 1 + targets/SIMU/USER/channel_sim.c | 51 ++++++++++++----------- targets/SIMU/USER/oaisim.c | 10 +++-- targets/SIMU/USER/oaisim_functions.c | 18 +++++--- 6 files changed, 50 insertions(+), 39 deletions(-) diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index da07687a9e..6b6d9e671d 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -35,9 +35,9 @@ phy_adjust_gain (PHY_VARS_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id) { LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n", - rx_power_fil_dB, - ue->measurements.rssi, - ue->measurements.rx_power_avg_dB[eNB_id] + rx_power_fil_dB, + ue->measurements.rssi, + ue->measurements.rx_power_avg_dB[eNB_id] ); // Gain control with hysterisis diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 16872ec879..a74d921fa4 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -2735,6 +2735,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin } } // for l=1..l2 + ue_measurement_procedures(l-1,ue,proc,eNB_id,abstraction_flag,mode); // If this is PMCH, call procedures and return if (pmch_flag == 1) { @@ -2748,7 +2749,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin ue->rx_offset, 0, 0); - + // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH) // do procedures for C-RNTI diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c index ba67eb1f32..8636353595 100755 --- a/openair1/SIMULATION/RF/dac.c +++ b/openair1/SIMULATION/RF/dac.c @@ -121,6 +121,7 @@ double dac_fixed_gain(double s_re[2][30720], //printf("DL: amp1 %f dB (%d,%d), tx_power %f\n",20*log10(amp1),input_offset,input_offset_meas,txpwr_dBm); */ + for (i=0; inb_rx; // number of rx antennas at UE uint8_t nb_antennas_tx = eNB2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB - double s_re[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; - double s_im[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; - double r_re0[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; - double r_im0[2][PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + double s_re[2][30720];//PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + double s_im[2][30720];//PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + double r_re0[2][30720];//PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + double r_im0[2][30720];//PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; + if (subframe==0) hold_channel = 0; else @@ -205,13 +206,13 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N } } // hold channel } - else { //abstraction_flag pthread_mutex_lock(&eNB_output_mutex[UE_id]); + if (eNB_output_mask[UE_id] == 0) { // This is the first eNodeB for this UE, clear the buffer - + for (aa=0; aasamples_per_tti)*sizeof(double)); memset((void*)r_im_DL[UE_id][aa],0,(frame_parms->samples_per_tti)*sizeof(double)); @@ -222,8 +223,8 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N for (eNB_id=0; eNB_idcommon_vars.txdata[0]; sf_offset = subframe*frame_parms->samples_per_tti; - tx_pwr = dac_fixed_gain((double**)s_re, - (double**)s_im, + tx_pwr = dac_fixed_gain(s_re, + s_im, txdata, sf_offset, nb_antennas_tx, @@ -243,7 +244,7 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N #endif //eNB2UE[eNB_id][UE_id]->path_loss_dB = 0; - multipath_channel(eNB2UE[eNB_id][UE_id][CC_id],(double**)s_re,(double**)s_im,(double**)r_re0,(double**)r_im0, + multipath_channel(eNB2UE[eNB_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0, frame_parms->samples_per_tti,hold_channel); #ifdef DEBUG_SIM rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id][CC_id]->ch[0], @@ -266,7 +267,7 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB); #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0,nb_antennas_rx, + rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx, frame_parms->ofdm_symbol_size, sf_offset)/(12.0*frame_parms->N_RB_DL); LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for subframe %d\n",UE_id, @@ -289,15 +290,15 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB-66.227,subframe); #endif - rf_rx_simple((double**)r_re0, - (double**)r_im0, + rf_rx_simple(r_re0, + r_im0, nb_antennas_rx, frame_parms->samples_per_tti, 1e3/eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate, // sampling time (ns) (double)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0, + rx_pwr = signal_energy_fp(r_re0,r_im0, nb_antennas_rx, frame_parms->ofdm_symbol_size, sf_offset)/(12.0*frame_parms->N_RB_DL); @@ -326,8 +327,8 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata; sf_offset = subframe*frame_parms->samples_per_tti; - adc((double**)r_re_DL[UE_id], - (double**)r_im_DL[UE_id], + adc(r_re_DL[UE_id], + r_im_DL[UE_id], 0, sf_offset, rxdata, @@ -383,10 +384,10 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N int ulfrrb2 ; uint8_t harq_pid; #endif - double s_re[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; - double s_im[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; - double r_re0[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; - double r_im0[2][PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double s_re[2][30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double s_im[2][30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double r_re0[2][30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double r_im0[2][30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; if (abstraction_flag!=0) { #ifdef PHY_ABSTRACTION_UL @@ -477,7 +478,7 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N hold_channel,UE2eNB[UE_id][eNB_id][CC_id]->channel_length, UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB); - rx_pwr = signal_energy_fp((double**)r_re0,(double**)r_im0,nb_antennas_rx,frame_parms->samples_per_tti,0); + rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti,0); LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for subframe %d, sptti %d\n", eNB_id,10*log10(rx_pwr),rx_pwr,subframe,frame_parms->samples_per_tti); @@ -497,23 +498,23 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N } } //UE_id - rf_rx_simple((double**)r_re_UL[eNB_id], - (double**)r_im_UL[eNB_id], + rf_rx_simple(r_re_UL[eNB_id], + r_im_UL[eNB_id], nb_antennas_rx, frame_parms->samples_per_tti, 1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns) (double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp((double**)r_re_UL[eNB_id],(double**)r_im_UL[eNB_id],nb_antennas_rx,frame_parms->samples_per_tti,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); + rx_pwr = signal_energy_fp(r_re_UL[eNB_id],r_im_UL[eNB_id],nb_antennas_rx,frame_parms->samples_per_tti,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d\n",10*log10(rx_pwr),subframe); #endif rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.rxdata[0]; sf_offset = subframe*frame_parms->samples_per_tti; - adc((double**)r_re_UL[eNB_id], - (double**)r_im_UL[eNB_id], + adc(r_re_UL[eNB_id], + r_im_UL[eNB_id], 0, sf_offset, rxdata, diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index c8214a0c65..345af74d18 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -749,7 +749,7 @@ l2l1_task (void *args_p) (subframe_UE_mask_local == ((1<proc[slot >> 1].subframe_tx, PHY_vars_eNB_g[eNB_inst][0]->proc[slot >> 1].subframe_rx, PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.frame_type, PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.tdd_config, PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.Nid_cell); + */ } for (eNB_inst = oai_emulation.info.first_enb_local; @@ -1825,7 +1827,7 @@ oai_shutdown (void) free(txdata); #endif */ - + /* for (int i = 0; i < 2; i++) { free (s_re[i]); free (s_im[i]); @@ -1840,7 +1842,7 @@ oai_shutdown (void) s_re = 0; s_im = 0; r_re = 0; - r_im = 0; + r_im = 0;*/ lte_sync_time_free (); } diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 88e8ea3ce0..674ca1312d 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1050,10 +1050,11 @@ int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void * eNB_id, CC_id); - last_eNB_rx_timestamp[eNB_id][CC_id] += PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti; sample_count += PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti; } + + return(nsamps); } @@ -1070,9 +1071,10 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** *ptimestamp = last_UE_rx_timestamp[UE_id][CC_id]; - LOG_D(PHY,"UE_trx_read nsamps %d TS(%llu,%llu)\n",nsamps, + LOG_D(EMU,"UE_trx_read nsamps %d TS(%llu,%llu) antenna %d\n",nsamps, (unsigned long long)current_UE_rx_timestamp[UE_id][CC_id], - (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id]); + (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id], + cc); if (nsamps < PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti) read_size = nsamps; @@ -1083,7 +1085,7 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** while (current_UE_rx_timestamp[UE_id][CC_id] < (last_UE_rx_timestamp[UE_id][CC_id]+read_size)) { LOG_D(EMU,"UE_trx_read : current TS %d, last TS %d, sleeping\n",current_UE_rx_timestamp[UE_id][CC_id],last_UE_rx_timestamp[UE_id][CC_id]); - + usleep(500); } @@ -1093,7 +1095,7 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** pthread_mutex_lock(&subframe_mutex); subframe_UE_mask|=(1<frame_parms.samples_per_tti)%10; @@ -1117,8 +1119,12 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** &PHY_vars_UE_g[UE_id][CC_id]->frame_parms, UE_id, CC_id); + + printf("Signaling main thread: UE subframe mask %x\n",subframe_UE_mask); + } - + + return(nsamps); } From 3124cb2c0038245c057f991d81b7efbd903876e2 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 25 Sep 2016 14:53:16 +0200 Subject: [PATCH 241/340] more fixes for oaisim, TM2. --- openair1/PHY/TOOLS/defs.h | 4 +- openair1/PHY/TOOLS/signal_energy.c | 2 +- openair1/SIMULATION/RF/adc.c | 4 +- openair1/SIMULATION/RF/dac.c | 8 +- openair1/SIMULATION/RF/defs.h | 16 ++-- openair1/SIMULATION/RF/rf.c | 4 +- openair1/SIMULATION/TOOLS/defs.h | 16 ++-- openair1/SIMULATION/TOOLS/multipath_channel.c | 8 +- ...band7.tm1.generic.oaisim.local_no_mme.conf | 3 + targets/SIMU/USER/channel_sim.c | 85 ++++++++++++++----- targets/SIMU/USER/oaisim_functions.c | 1 - 11 files changed, 97 insertions(+), 54 deletions(-) diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 3a8a58b6f2..fceb5972ed 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -296,10 +296,10 @@ int32_t subcarrier_energy(int32_t *,uint32_t, int32_t* subcarrier_energy, uint16 */ int32_t signal_energy_nodc(int32_t *,uint32_t); -/*!\fn double signal_energy_fp(double s_re[2][30720], double s_im[2][30720],uint32_t, uint32_t,uint32_t); +/*!\fn double signal_energy_fp(double *s_re[2], double *s_im[2],uint32_t, uint32_t,uint32_t); \brief Computes the signal energy per subcarrier */ -double signal_energy_fp(double s_re[2][30720], double s_im[2][30720], uint32_t nb_antennas, uint32_t length,uint32_t offset); +double signal_energy_fp(double *s_re[2], double *s_im[2], uint32_t nb_antennas, uint32_t length,uint32_t offset); /*!\fn double signal_energy_fp2(struct complex *, uint32_t); \brief Computes the signal energy per subcarrier diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c index afd1c727f3..4c5a4976f6 100755 --- a/openair1/PHY/TOOLS/signal_energy.c +++ b/openair1/PHY/TOOLS/signal_energy.c @@ -255,7 +255,7 @@ int32_t signal_energy_nodc(int32_t *input,uint32_t length) } #endif -double signal_energy_fp(double s_re[2][30720],double s_im[2][30720],uint32_t nb_antennas,uint32_t length,uint32_t offset) +double signal_energy_fp(double *s_re[2],double *s_im[2],uint32_t nb_antennas,uint32_t length,uint32_t offset) { int32_t aa,i; diff --git a/openair1/SIMULATION/RF/adc.c b/openair1/SIMULATION/RF/adc.c index 3f89a3cfe5..fb94b506d9 100755 --- a/openair1/SIMULATION/RF/adc.c +++ b/openair1/SIMULATION/RF/adc.c @@ -26,8 +26,8 @@ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE *******************************************************************************/ -void adc(double r_re[2][30720], - double r_im[2][30720], +void adc(double *r_re[2], + double *r_im[2], unsigned int input_offset, unsigned int output_offset, unsigned int **output, diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c index 8636353595..fe01ba3132 100755 --- a/openair1/SIMULATION/RF/dac.c +++ b/openair1/SIMULATION/RF/dac.c @@ -31,8 +31,8 @@ #include #include "PHY/TOOLS/defs.h" -void dac(double s_re[2][30720], - double s_im[2][30720], +void dac(double *s_re[2], + double *s_im[2], uint32_t **input, uint32_t input_offset, uint32_t nb_tx_antennas, @@ -81,8 +81,8 @@ void dac(double s_re[2][30720], } } -double dac_fixed_gain(double s_re[2][30720], - double s_im[2][30720], +double dac_fixed_gain(double *s_re[2], + double *s_im[2], uint32_t **input, uint32_t input_offset, uint32_t nb_tx_antennas, diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/defs.h index 4bd9528dae..75b84f3609 100644 --- a/openair1/SIMULATION/RF/defs.h +++ b/openair1/SIMULATION/RF/defs.h @@ -64,16 +64,16 @@ void rf_rx(double **r_re, double IQ_imb_dB, double IQ_phase); -void rf_rx_simple(double r_re[2][30720], - double r_im[2][30720], +void rf_rx_simple(double *r_re[2], + double *r_im[2], unsigned int nb_rx_antennas, unsigned int length, double s_time, double rx_gain_dB); -void adc(double r_re[2][30720], - double r_im[2][30720], +void adc(double *r_re[2], + double *r_im[2], unsigned int input_offset, unsigned int output_offset, int **output, @@ -81,8 +81,8 @@ void adc(double r_re[2][30720], unsigned int length, unsigned char B); -void dac(double s_re[2][30720], - double s_im[2][30720], +void dac(double *s_re[2], + double *s_im[2], int **input, unsigned int input_offset, unsigned int nb_tx_antennas, @@ -92,8 +92,8 @@ void dac(double s_re[2][30720], unsigned int meas_length, unsigned int meas_offset); -double dac_fixed_gain(double s_re[2][30720], - double s_im[2][30720], +double dac_fixed_gain(double *s_re[2], + double *s_im[2], int **input, unsigned int input_offset, unsigned int nb_tx_antennas, diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c index 2bcb64727d..135576b871 100644 --- a/openair1/SIMULATION/RF/rf.c +++ b/openair1/SIMULATION/RF/rf.c @@ -206,8 +206,8 @@ void rf_rx(double **r_re, } } -void rf_rx_simple(double r_re[2][30720], - double r_im[2][30720], +void rf_rx_simple(double *r_re[2], + double *r_im[2], unsigned int nb_rx_antennas, unsigned int length, double s_time, diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h index 3ebc8f523f..3113fb3df5 100644 --- a/openair1/SIMULATION/TOOLS/defs.h +++ b/openair1/SIMULATION/TOOLS/defs.h @@ -219,10 +219,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, int random_channel(channel_desc_t *desc, uint8_t abstraction_flag); /**\fn void multipath_channel(channel_desc_t *desc, - double tx_sig_re[2][30720*2], - double tx_sig_im[2][30720*2], - double rx_sig_re[2][30720*2], - double rx_sig_im[2][30720*2], + double tx_sig_re[2], + double tx_sig_im[2], + double rx_sig_re[2], + double rx_sig_im[2], uint32_t length, uint8_t keep_channel) @@ -237,10 +237,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag); */ void multipath_channel(channel_desc_t *desc, - double tx_sig_re[2][30720*2], - double tx_sig_im[2][30720*2], - double rx_sig_re[2][30720*2], - double rx_sig_im[2][30720*2], + double *tx_sig_re[2], + double *tx_sig_im[2], + double *rx_sig_re[2], + double *rx_sig_im[2], uint32_t length, uint8_t keep_channel); /* diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c index 9019f4224f..549075c7db 100644 --- a/openair1/SIMULATION/TOOLS/multipath_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_channel.c @@ -150,10 +150,10 @@ void multipath_channel(channel_desc_t *desc, #else void multipath_channel(channel_desc_t *desc, - double tx_sig_re[2][30720*2], - double tx_sig_im[2][30720*2], - double rx_sig_re[2][30720*2], - double rx_sig_im[2][30720*2], + double *tx_sig_re[2], + double *tx_sig_im[2], + double *rx_sig_re[2], + double *rx_sig_im[2], uint32_t length, uint8_t keep_channel) { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf index 22654ebdbb..ef7c1cc19c 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index e01f3d9b2d..c4df766532 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -108,12 +108,28 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N uint8_t nb_antennas_rx = eNB2UE[0][0][CC_id]->nb_rx; // number of rx antennas at UE uint8_t nb_antennas_tx = eNB2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB - double s_re[2][30720];//PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; - double s_im[2][30720];//PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; - double r_re0[2][30720];//PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; - double r_im0[2][30720];//PHY_vars_eNB_g[eNB_id][CC_id]->frame_parms.samples_per_tti]; - + double s_re0[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double s_re1[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double *s_re[2]; + double s_im0[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double s_im1[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double *s_im[2]; + double r_re00[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double r_re01[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double *r_re0[2]; + double r_im00[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double r_im01[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double *r_im0[2]; + s_re[0] = s_re0; + s_im[0] = s_im0; + s_re[1] = s_re1; + s_im[1] = s_im1; + + r_re0[0] = r_re00; + r_im0[0] = r_im00; + r_re0[1] = r_re01; + r_im0[1] = r_im01; if (subframe==0) hold_channel = 0; @@ -318,17 +334,21 @@ void do_DL_sig(channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_N if (eNB_output_mask[UE_id] == (1<ofdm_symbol_size,sf_offset)/(12.0*frame_parms->N_RB_DL); + rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->ofdm_symbol_size,sf_offset)/(12.0*frame_parms->N_RB_DL); LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for subframe %d\n",UE_id,10*log10(rx_pwr),subframe); #endif rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata; sf_offset = subframe*frame_parms->samples_per_tti; - - adc(r_re_DL[UE_id], - r_im_DL[UE_id], + + + adc(r_re_p, + r_im_p, 0, sf_offset, rxdata, @@ -384,10 +404,28 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N int ulfrrb2 ; uint8_t harq_pid; #endif - double s_re[2][30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; - double s_im[2][30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; - double r_re0[2][30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; - double r_im0[2][30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double s_re0[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double s_re1[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double *s_re[2]; + double s_im0[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double s_im1[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double *s_im[2]; + double r_re00[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double r_re01[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double *r_re0[2]; + double r_im00[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double r_im01[30720];//PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti]; + double *r_im0[2]; + + s_re[0] = s_re0; + s_im[0] = s_im0; + s_re[1] = s_re1; + s_im[1] = s_im1; + + r_re0[0] = r_re00; + r_im0[0] = r_im00; + r_re0[1] = r_re01; + r_im0[1] = r_im01; if (abstraction_flag!=0) { #ifdef PHY_ABSTRACTION_UL @@ -447,7 +485,6 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe], subframe,sf_offset); } else { - tx_pwr = dac_fixed_gain((double**)s_re, (double**)s_im, txdata, @@ -466,8 +503,8 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe], subframe,sf_offset); - - multipath_channel(UE2eNB[UE_id][eNB_id][CC_id],(double**)s_re,(double**)s_im,(double**)r_re0,(double**)r_im0, + + multipath_channel(UE2eNB[UE_id][eNB_id][CC_id],s_re,s_im,r_re0,r_im0, frame_parms->samples_per_tti,hold_channel); @@ -498,23 +535,27 @@ void do_UL_sig(channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_N } } //UE_id - rf_rx_simple(r_re_UL[eNB_id], - r_im_UL[eNB_id], + double *r_re_p[2] = {r_re_UL[eNB_id][0],r_re_UL[eNB_id][1]}; + double *r_im_p[2] = {r_im_UL[eNB_id][0],r_im_UL[eNB_id][1]}; + + rf_rx_simple(r_re_p, + r_im_p, nb_antennas_rx, frame_parms->samples_per_tti, 1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns) (double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re_UL[eNB_id],r_im_UL[eNB_id],nb_antennas_rx,frame_parms->samples_per_tti,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); + rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d\n",10*log10(rx_pwr),subframe); #endif rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->common_vars.rxdata[0]; sf_offset = subframe*frame_parms->samples_per_tti; + - adc(r_re_UL[eNB_id], - r_im_UL[eNB_id], + adc(r_re_p, + r_im_p, 0, sf_offset, rxdata, diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 674ca1312d..97820d2886 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1120,7 +1120,6 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** UE_id, CC_id); - printf("Signaling main thread: UE subframe mask %x\n",subframe_UE_mask); } From cc6926c559bda00830fcc0f57f4aea9cf0d458e7 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Sun, 25 Sep 2016 16:13:58 +0200 Subject: [PATCH 242/340] removing duplicate files --- openair2/UTIL/queue.h | 592 ----------------------- openair3/UTILS/HASHTABLE/COPYING | 0 openair3/UTILS/HASHTABLE/Makefile.am | 10 - openair3/UTILS/HASHTABLE/Makefile.eNB | 35 -- openair3/UTILS/HASHTABLE/hashtable.c | 332 ------------- openair3/UTILS/HASHTABLE/hashtable.h | 51 -- openair3/UTILS/HASHTABLE/obj_hashtable.c | 291 ----------- openair3/UTILS/HASHTABLE/obj_hashtable.h | 40 -- 8 files changed, 1351 deletions(-) delete mode 100644 openair2/UTIL/queue.h delete mode 100644 openair3/UTILS/HASHTABLE/COPYING delete mode 100755 openair3/UTILS/HASHTABLE/Makefile.am delete mode 100755 openair3/UTILS/HASHTABLE/Makefile.eNB delete mode 100755 openair3/UTILS/HASHTABLE/hashtable.c delete mode 100755 openair3/UTILS/HASHTABLE/hashtable.h delete mode 100644 openair3/UTILS/HASHTABLE/obj_hashtable.c delete mode 100644 openair3/UTILS/HASHTABLE/obj_hashtable.h diff --git a/openair2/UTIL/queue.h b/openair2/UTIL/queue.h deleted file mode 100644 index f8665c0f1a..0000000000 --- a/openair2/UTIL/queue.h +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - */ - -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - -/* - * This file defines five types of data structures: singly-linked lists, - * lists, simple queues, tail queues, and circular queues. - * - * A singly-linked list is headed by a single forward pointer. The - * elements are singly linked for minimum space and pointer manipulation - * overhead at the expense of O(n) removal for arbitrary elements. New - * elements can be added to the list after an existing element or at the - * head of the list. Elements being removed from the head of the list - * should use the explicit macro for this purpose for optimum - * efficiency. A singly-linked list may only be traversed in the forward - * direction. Singly-linked lists are ideal for applications with large - * datasets and few or no removals or for implementing a LIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A simple queue is headed by a pair of pointers, one the head of the - * list and the other to the tail of the list. The elements are singly - * linked to save space, so elements can only be removed from the - * head of the list. New elements can be added to the list after - * an existing element, at the head of the list, or at the end of the - * list. A simple queue may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may be traversed in either direction. - * - * A circle queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or after - * an existing element, at the head of the list, or at the end of the list. - * A circle queue may be traversed in either direction, but has a more - * complex end of list detection. - * - * For details on the use of these macros, see the queue(3) manual page. - * SLIST LIST STAILQ TAILQ CIRCLEQ - * _HEAD + + + + + - * _HEAD_INITIALIZER + + + + + - * _ENTRY + + + + + - * _INIT + + + + + - * _EMPTY + + + + + - * _FIRST + + + + + - * _NEXT + + + + + - * _PREV - - - + + - * _LAST - - + + + - * _FOREACH + + + + + - * _FOREACH_REVERSE - - - + + - * _INSERT_HEAD + + + + + - * _INSERT_BEFORE - + - + + - * _INSERT_AFTER + + + + + - * _INSERT_TAIL - - + + + - * _REMOVE_HEAD + - + - - - * _REMOVE + + + + + - */ - -/* - * List definitions. - */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} - -/* - * List functions. - */ -#define LIST_INIT(head) do { \ - (head)->lh_first = NULL; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ - (listelm)->field.le_next->field.le_prev = \ - &(elm)->field.le_next; \ - (listelm)->field.le_next = (elm); \ - (elm)->field.le_prev = &(listelm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - (elm)->field.le_next = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &(elm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.le_next = (head)->lh_first) != NULL) \ - (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ - (head)->lh_first = (elm); \ - (elm)->field.le_prev = &(head)->lh_first; \ -} while (/*CONSTCOND*/0) - -#define LIST_REMOVE(elm, field) do { \ - if ((elm)->field.le_next != NULL) \ - (elm)->field.le_next->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = (elm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = ((head)->lh_first); \ - (var); \ - (var) = ((var)->field.le_next)) - -/* - * List access methods. - */ -#define LIST_EMPTY(head) ((head)->lh_first == NULL) -#define LIST_FIRST(head) ((head)->lh_first) -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - - -/* - * Singly-linked List definitions. - */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define SLIST_INIT(head) do { \ - (head)->slh_first = NULL; \ -} while (/*CONSTCOND*/0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - (elm)->field.sle_next = (slistelm)->field.sle_next; \ - (slistelm)->field.sle_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.sle_next = (head)->slh_first; \ - (head)->slh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - (head)->slh_first = (head)->slh_first->field.sle_next; \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if ((head)->slh_first == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = (head)->slh_first; \ - while(curelm->field.sle_next != (elm)) \ - curelm = curelm->field.sle_next; \ - curelm->field.sle_next = \ - curelm->field.sle_next->field.sle_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define SLIST_FOREACH(var, head, field) \ - for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) - -/* - * Singly-linked List access methods. - */ -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) -#define SLIST_FIRST(head) ((head)->slh_first) -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type) \ -struct name { \ - struct type *stqh_first; /* first element */ \ - struct type **stqh_last; /* addr of last next element */ \ -} - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_ENTRY(type) \ -struct { \ - struct type *stqe_next; /* next element */ \ -} - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_INIT(head) do { \ - (head)->stqh_first = NULL; \ - (head)->stqh_last = &(head)->stqh_first; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (head)->stqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.stqe_next = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &(elm)->field.stqe_next; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (listelm)->field.stqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ - (head)->stqh_last = &(head)->stqh_first; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if ((head)->stqh_first == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->stqh_first; \ - while (curelm->field.stqe_next != (elm)) \ - curelm = curelm->field.stqe_next; \ - if ((curelm->field.stqe_next = \ - curelm->field.stqe_next->field.stqe_next) == NULL) \ - (head)->stqh_last = &(curelm)->field.stqe_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define STAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->stqh_first); \ - (var); \ - (var) = ((var)->field.stqe_next)) - -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) - -/* - * Singly-linked Tail queue access methods. - */ -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) -#define STAILQ_FIRST(head) ((head)->stqh_first) -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - - -/* - * Simple queue definitions. - */ -#define SIMPLEQ_HEAD(name, type) \ -struct name { \ - struct type *sqh_first; /* first element */ \ - struct type **sqh_last; /* addr of last next element */ \ -} - -#define SIMPLEQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).sqh_first } - -#define SIMPLEQ_ENTRY(type) \ -struct { \ - struct type *sqe_next; /* next element */ \ -} - -/* - * Simple queue functions. - */ -#define SIMPLEQ_INIT(head) do { \ - (head)->sqh_first = NULL; \ - (head)->sqh_last = &(head)->sqh_first; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (head)->sqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.sqe_next = NULL; \ - *(head)->sqh_last = (elm); \ - (head)->sqh_last = &(elm)->field.sqe_next; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (listelm)->field.sqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ - if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ - (head)->sqh_last = &(head)->sqh_first; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ - if ((head)->sqh_first == (elm)) { \ - SIMPLEQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->sqh_first; \ - while (curelm->field.sqe_next != (elm)) \ - curelm = curelm->field.sqe_next; \ - if ((curelm->field.sqe_next = \ - curelm->field.sqe_next->field.sqe_next) == NULL) \ - (head)->sqh_last = &(curelm)->field.sqe_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->sqh_first); \ - (var); \ - (var) = ((var)->field.sqe_next)) - -/* - * Simple queue access methods. - */ -#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL) -#define SIMPLEQ_FIRST(head) ((head)->sqh_first) -#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) - - -/* - * Tail queue definitions. - */ -#define _TAILQ_HEAD(name, type, qual) \ -struct name { \ - qual type *tqh_first; /* first element */ \ - qual type *qual *tqh_last; /* addr of last next element */ \ -} -#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define _TAILQ_ENTRY(type, qual) \ -struct { \ - qual type *tqe_next; /* next element */ \ - qual type *qual *tqe_prev; /* address of previous next element */\ -} -#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) - -/* - * Tail queue functions. - */ -#define TAILQ_INIT(head) do { \ - (head)->tqh_first = NULL; \ - (head)->tqh_last = &(head)->tqh_first; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ - (head)->tqh_first->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (head)->tqh_first = (elm); \ - (elm)->field.tqe_prev = &(head)->tqh_first; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.tqe_next = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &(elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ - (elm)->field.tqe_next->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (listelm)->field.tqe_next = (elm); \ - (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - (elm)->field.tqe_next = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if (((elm)->field.tqe_next) != NULL) \ - (elm)->field.tqe_next->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->tqh_first); \ - (var); \ - (var) = ((var)->field.tqe_next)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ - (var); \ - (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) - -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) - -/* - * Tail queue access methods. - */ -#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) -#define TAILQ_FIRST(head) ((head)->tqh_first) -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) - -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - - -/* - * Circular queue definitions. - */ -#define CIRCLEQ_HEAD(name, type) \ -struct name { \ - struct type *cqh_first; /* first element */ \ - struct type *cqh_last; /* last element */ \ -} - -#define CIRCLEQ_HEAD_INITIALIZER(head) \ - { (void *)&head, (void *)&head } - -#define CIRCLEQ_ENTRY(type) \ -struct { \ - struct type *cqe_next; /* next element */ \ - struct type *cqe_prev; /* previous element */ \ -} - -/* - * Circular queue functions. - */ -#define CIRCLEQ_INIT(head) do { \ - (head)->cqh_first = (void *)(head); \ - (head)->cqh_last = (void *)(head); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm)->field.cqe_next; \ - (elm)->field.cqe_prev = (listelm); \ - if ((listelm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (listelm)->field.cqe_next->field.cqe_prev = (elm); \ - (listelm)->field.cqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm); \ - (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ - if ((listelm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (listelm)->field.cqe_prev->field.cqe_next = (elm); \ - (listelm)->field.cqe_prev = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.cqe_next = (head)->cqh_first; \ - (elm)->field.cqe_prev = (void *)(head); \ - if ((head)->cqh_last == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (head)->cqh_first->field.cqe_prev = (elm); \ - (head)->cqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.cqe_next = (void *)(head); \ - (elm)->field.cqe_prev = (head)->cqh_last; \ - if ((head)->cqh_first == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (head)->cqh_last->field.cqe_next = (elm); \ - (head)->cqh_last = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_REMOVE(head, elm, field) do { \ - if ((elm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm)->field.cqe_prev; \ - else \ - (elm)->field.cqe_next->field.cqe_prev = \ - (elm)->field.cqe_prev; \ - if ((elm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm)->field.cqe_next; \ - else \ - (elm)->field.cqe_prev->field.cqe_next = \ - (elm)->field.cqe_next; \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->cqh_first); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_next)) - -#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ - for ((var) = ((head)->cqh_last); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_prev)) - -/* - * Circular queue access methods. - */ -#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) -#define CIRCLEQ_FIRST(head) ((head)->cqh_first) -#define CIRCLEQ_LAST(head) ((head)->cqh_last) -#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) -#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) - -#define CIRCLEQ_LOOP_NEXT(head, elm, field) \ - (((elm)->field.cqe_next == (void *)(head)) \ - ? ((head)->cqh_first) \ - : (elm->field.cqe_next)) -#define CIRCLEQ_LOOP_PREV(head, elm, field) \ - (((elm)->field.cqe_prev == (void *)(head)) \ - ? ((head)->cqh_last) \ - : (elm->field.cqe_prev)) - -#endif /* sys/queue.h */ diff --git a/openair3/UTILS/HASHTABLE/COPYING b/openair3/UTILS/HASHTABLE/COPYING deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair3/UTILS/HASHTABLE/Makefile.am b/openair3/UTILS/HASHTABLE/Makefile.am deleted file mode 100755 index d6bdbbc3c8..0000000000 --- a/openair3/UTILS/HASHTABLE/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ - -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON - -noinst_LTLIBRARIES = libhashtable.la -libhashtable_la_LDFLAGS = -all-static -libhashtable_la_SOURCES = \ - hashtable.c hashtable.h \ - obj_hashtable.c obj_hashtable.h - \ No newline at end of file diff --git a/openair3/UTILS/HASHTABLE/Makefile.eNB b/openair3/UTILS/HASHTABLE/Makefile.eNB deleted file mode 100755 index 2cde7da837..0000000000 --- a/openair3/UTILS/HASHTABLE/Makefile.eNB +++ /dev/null @@ -1,35 +0,0 @@ - -all: libhashtable.a - -libhashtable_OBJECTS = \ - hashtable.o \ - obj_hashtable.o \ - - -CFLAGS = \ - -DUSER_MODE \ - -DENABLE_USE_MME \ - -g \ - -O2 \ - -Wall \ - -Werror=implicit-function-declaration - --include .deps/*.d - -$(libhashtable_OBJECTS): %.o : %.c - $(CC) -c $(CFLAGS) -o $@ $< - @if ! test -d ".deps" ; then mkdir -p .deps/; fi - @$(CC) -MM $(CFLAGS) $*.c > .deps/$*.d - @mv -f .deps/$*.d .deps/$*.d.tmp - @sed -e 's|.*:|$*.o:|' < .deps/$*.d.tmp > .deps/$*.d - @sed -e 's/.*://' -e 's/\\$$//' < .deps/$*.d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> .deps/$*.d - @rm -f .deps/$*.d.tmp - -libhashtable.a: $(libhashtable_OBJECTS) - $(AR) rcvs $@ $(libhashtable_OBJECTS) - -clean: - rm -f libhashtable.a - rm -rf .deps/ - rm -f $(libhashtable_OBJECTS) \ No newline at end of file diff --git a/openair3/UTILS/HASHTABLE/hashtable.c b/openair3/UTILS/HASHTABLE/hashtable.c deleted file mode 100755 index 279eaebae8..0000000000 --- a/openair3/UTILS/HASHTABLE/hashtable.c +++ /dev/null @@ -1,332 +0,0 @@ -/* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node - * Original licence Creative Commons CC0 1.0 Waiver. - */ -#include -#include -#include -#include "hashtable.h" - - -//------------------------------------------------------------------------------------------------------------------------------- -char* hashtable_rc_code2string(hashtable_rc_t rcP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - switch (rcP) { - case HASH_TABLE_OK: - return "HASH_TABLE_OK"; - break; - - case HASH_TABLE_INSERT_OVERWRITTEN_DATA: - return "HASH_TABLE_INSERT_OVERWRITTEN_DATA"; - break; - - case HASH_TABLE_KEY_NOT_EXISTS: - return "HASH_TABLE_KEY_NOT_EXISTS"; - break; - - case HASH_TABLE_KEY_ALREADY_EXISTS: - return "HASH_TABLE_KEY_ALREADY_EXISTS"; - break; - - case HASH_TABLE_BAD_PARAMETER_HASHTABLE: - return "HASH_TABLE_BAD_PARAMETER_HASHTABLE"; - break; - - default: - return "UNKNOWN hashtable_rc_t"; - } -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * free int function - * hash_free_int_func() is used when this hashtable is used to store int values as data (pointer = value). - */ - -void hash_free_int_func(void* memoryP) {} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Default hash function - * def_hashfunc() is the default used by hashtable_create() when the user didn't specify one. - * This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables. - */ - -static hash_size_t def_hashfunc(const uint64_t keyP) -{ - return (hash_size_t)keyP; -} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Initialisation - * hashtable_create() sets up the initial structure of the hash table. The user specified size will be allocated and initialized to NULL. - * The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used. - * If an error occurred, NULL is returned. All other values in the returned hash_table_t pointer should be released with hashtable_destroy(). - */ -hash_table_t *hashtable_create(hash_size_t sizeP, hash_size_t (*hashfuncP)(const uint64_t ), void (*freefuncP)(void*)) -{ - hash_table_t *hashtbl; - - if(!(hashtbl=malloc(sizeof(hash_table_t)))) return NULL; - - if(!(hashtbl->nodes=calloc(sizeP, sizeof(hash_node_t*)))) { - free(hashtbl); - return NULL; - } - - hashtbl->size=sizeP; - - if(hashfuncP) hashtbl->hashfunc=hashfuncP; - else hashtbl->hashfunc=def_hashfunc; - - if(freefuncP) hashtbl->freefunc=freefuncP; - else hashtbl->freefunc=free; - - return hashtbl; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Cleanup - * The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the hash_table_t. - */ -hashtable_rc_t hashtable_destroy(hash_table_t *hashtblP) -{ - hash_size_t n; - hash_node_t *node, *oldnode; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - for(n=0; nsize; ++n) { - node=hashtblP->nodes[n]; - - while(node) { - oldnode=node; - node=node->next; - - if (oldnode->data) { - hashtblP->freefunc(oldnode->data); - } - - free(oldnode); - } - } - - free(hashtblP->nodes); - free(hashtblP); - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t hashtable_is_key_exists (hash_table_t *hashtblP, const uint64_t keyP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - return HASH_TABLE_OK; - } - - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *hashtblP, void functP(uint64_t keyP, void* dataP, void* parameterP), void* parameterP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - hash_node_t *node = NULL; - unsigned int i = 0; - unsigned int num_elements = 0; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - while ((num_elements < hashtblP->num_elements) && (i < hashtblP->size)) { - if (hashtblP->nodes[i] != NULL) { - node=hashtblP->nodes[i]; - - while(node) { - num_elements += 1; - functP(node->key, node->data, parameterP); - node=node->next; - } - } - - i += 1; - } - - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Adding a new element - * To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size. - */ -hashtable_rc_t hashtable_insert(hash_table_t *hashtblP, const uint64_t keyP, void *dataP) -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if (node->data) { - hashtblP->freefunc(node->data); - } - - node->data=dataP; - return HASH_TABLE_INSERT_OVERWRITTEN_DATA; - } - - node=node->next; - } - - if(!(node=malloc(sizeof(hash_node_t)))) return -1; - - node->key=keyP; - node->data=dataP; - - if (hashtblP->nodes[hash]) { - node->next=hashtblP->nodes[hash]; - } else { - node->next = NULL; - } - - hashtblP->nodes[hash]=node; - hashtblP->num_elements += 1; - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * To remove an element from the hash table, we just search for it in the linked list for that hash value, - * and remove it if it is found. If it was not found, it is an error and -1 is returned. - */ -hashtable_rc_t hashtable_remove(hash_table_t *hashtblP, const uint64_t keyP) -{ - hash_node_t *node, *prevnode=NULL; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if(prevnode) prevnode->next=node->next; - else hashtblP->nodes[hash]=node->next; - - if (node->data) { - hashtblP->freefunc(node->data); - } - - free(node); - hashtblP->num_elements -= 1; - return HASH_TABLE_OK; - } - - prevnode=node; - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Searching for an element is easy. We just search through the linked list for the corresponding hash value. - * NULL is returned if we didn't find it. - */ -hashtable_rc_t hashtable_get(hash_table_t *hashtblP, const uint64_t keyP, void** dataP) -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - *dataP = NULL; - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - /* fprintf(stderr, "hashtable_get() key=%s, hash=%d\n", key, hash);*/ - - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - *dataP = node->data; - return HASH_TABLE_OK; - } - - node=node->next; - } - - *dataP = NULL; - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Resizing - * The number of elements in a hash table is not always known when creating the table. - * If the number of elements grows too large, it will seriously reduce the performance of most hash table operations. - * If the number of elements are reduced, the hash table will waste memory. That is why we provide a function for resizing the table. - * Resizing a hash table is not as easy as a realloc(). All hash values must be recalculated and each element must be inserted into its new position. - * We create a temporary hash_table_t object (newtbl) to be used while building the new hashes. - * This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table. - * After that, we can just free the old table and copy the elements from newtbl to hashtbl. - */ - -hashtable_rc_t hashtable_resize(hash_table_t *hashtblP, hash_size_t sizeP) -{ - hash_table_t newtbl; - hash_size_t n; - hash_node_t *node,*next; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - newtbl.size = sizeP; - newtbl.hashfunc = hashtblP->hashfunc; - - if(!(newtbl.nodes=calloc(sizeP, sizeof(hash_node_t*)))) return -1; - - for(n=0; nsize; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - next = node->next; - hashtable_insert(&newtbl, node->key, node->data); - // Lionel GAUTHIER: BAD CODE TO BE REWRITTEN - hashtable_remove(hashtblP, node->key); - - } - } - - free(hashtblP->nodes); - hashtblP->size=newtbl.size; - hashtblP->nodes=newtbl.nodes; - - return HASH_TABLE_OK; -} - - - diff --git a/openair3/UTILS/HASHTABLE/hashtable.h b/openair3/UTILS/HASHTABLE/hashtable.h deleted file mode 100755 index fc9b368724..0000000000 --- a/openair3/UTILS/HASHTABLE/hashtable.h +++ /dev/null @@ -1,51 +0,0 @@ -/* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node - * Original licence Creative Commons CC0 1.0 Waiver.(http://creativecommons.org/publicdomain/zero/1.0/) - */ -#ifndef _UTILS_COLLECTION_HASH_TABLE_H_ -#define _UTILS_COLLECTION_HASH_TABLE_H_ -#include -#include -#include - -typedef size_t hash_size_t; - -typedef enum hashtable_return_code_e { - HASH_TABLE_OK = 0, - HASH_TABLE_INSERT_OVERWRITTEN_DATA = 1, - HASH_TABLE_KEY_NOT_EXISTS = 2, - HASH_TABLE_KEY_ALREADY_EXISTS = 3, - HASH_TABLE_BAD_PARAMETER_HASHTABLE = 4, - HASH_TABLE_SYSTEM_ERROR = 5, - HASH_TABLE_CODE_MAX -} hashtable_rc_t; - - -typedef struct hash_node_s { - uint64_t key; - void *data; - struct hash_node_s *next; -} hash_node_t; - -typedef struct hash_table_s { - hash_size_t size; - hash_size_t num_elements; - struct hash_node_s **nodes; - hash_size_t (*hashfunc)(const uint64_t); - void (*freefunc)(void*); -} hash_table_t; - -char* hashtable_rc_code2string(hashtable_rc_t rcP); -void hash_free_int_func(void* memoryP); -hash_table_t *hashtable_create (hash_size_t size, hash_size_t (*hashfunc)(const uint64_t ), void (*freefunc)(void*)); -hashtable_rc_t hashtable_destroy(hash_table_t *hashtbl); -hashtable_rc_t hashtable_is_key_exists (hash_table_t *hashtbl, const uint64_t key); -hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *hashtblP, void funct(uint64_t keyP, void* dataP, void* parameterP), void* parameterP); -hashtable_rc_t hashtable_insert (hash_table_t *hashtbl, const uint64_t key, void *data); -hashtable_rc_t hashtable_remove (hash_table_t *hashtbl, const uint64_t key); -hashtable_rc_t hashtable_get (hash_table_t *hashtbl, const uint64_t key, void **dataP); -hashtable_rc_t hashtable_resize (hash_table_t *hashtbl, hash_size_t size); - - - -#endif - diff --git a/openair3/UTILS/HASHTABLE/obj_hashtable.c b/openair3/UTILS/HASHTABLE/obj_hashtable.c deleted file mode 100644 index 81abfe03b7..0000000000 --- a/openair3/UTILS/HASHTABLE/obj_hashtable.c +++ /dev/null @@ -1,291 +0,0 @@ -#include -#include -#include -#include "obj_hashtable.h" -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Default hash function - * def_hashfunc() is the default used by hashtable_create() when the user didn't specify one. - * This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables. - */ - -static hash_size_t def_hashfunc(const void *keyP, int key_sizeP) -{ - hash_size_t hash=0; - - while(key_sizeP) hash^=((unsigned char*)keyP)[key_sizeP --]; - - return hash; -} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Initialisation - * hashtable_create() sets up the initial structure of the hash table. The user specified size will be allocated and initialized to NULL. - * The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used. - * If an error occurred, NULL is returned. All other values in the returned obj_hash_table_t pointer should be released with hashtable_destroy(). - */ -obj_hash_table_t *obj_hashtable_create(hash_size_t sizeP, hash_size_t (*hashfuncP)(const void*, int ), void (*freekeyfuncP)(void*), void (*freedatafuncP)(void*)) -{ - obj_hash_table_t *hashtbl; - - if(!(hashtbl=malloc(sizeof(obj_hash_table_t)))) return NULL; - - if(!(hashtbl->nodes=calloc(sizeP, sizeof(obj_hash_node_t*)))) { - free(hashtbl); - return NULL; - } - - hashtbl->size=sizeP; - - if(hashfuncP) hashtbl->hashfunc=hashfuncP; - else hashtbl->hashfunc=def_hashfunc; - - if(freekeyfuncP) hashtbl->freekeyfunc=freekeyfuncP; - else hashtbl->freekeyfunc=free; - - if(freedatafuncP) hashtbl->freedatafunc=freedatafuncP; - else hashtbl->freedatafunc=free; - - return hashtbl; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Cleanup - * The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the obj_hash_table_t. - */ -hashtable_rc_t obj_hashtable_destroy(obj_hash_table_t *hashtblP) -{ - hash_size_t n; - obj_hash_node_t *node, *oldnode; - - for(n=0; nsize; ++n) { - node=hashtblP->nodes[n]; - - while(node) { - oldnode=node; - node=node->next; - hashtblP->freekeyfunc(oldnode->key); - hashtblP->freedatafunc(oldnode->data); - free(oldnode); - } - } - - free(hashtblP->nodes); - free(hashtblP); - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t obj_hashtable_is_key_exists (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - return HASH_TABLE_OK; - } else if (node->key_size == key_sizeP) { - if (memcmp(node->key, keyP, key_sizeP) == 0) { - return HASH_TABLE_OK; - } - } - - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Adding a new element - * To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size. - */ -hashtable_rc_t obj_hashtable_insert(obj_hash_table_t *hashtblP, void* keyP, int key_sizeP, void *dataP) -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if (node->data) { - hashtblP->freedatafunc(node->data); - } - - node->data=dataP; - // waste of memory here (keyP is lost) we should free it now - return HASH_TABLE_INSERT_OVERWRITTEN_DATA; - } - - node=node->next; - } - - if(!(node=malloc(sizeof(obj_hash_node_t)))) return -1; - - node->key=keyP; - node->data=dataP; - - if (hashtblP->nodes[hash]) { - node->next=hashtblP->nodes[hash]; - } else { - node->next = NULL; - } - - hashtblP->nodes[hash]=node; - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * To remove an element from the hash table, we just search for it in the linked list for that hash value, - * and remove it if it is found. If it was not found, it is an error and -1 is returned. - */ -hashtable_rc_t obj_hashtable_remove(obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP) -{ - obj_hash_node_t *node, *prevnode=NULL; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if ((node->key == keyP) || ((node->key_size == key_sizeP) && (memcmp(node->key, keyP, key_sizeP) == 0))) { - if(prevnode) { - prevnode->next=node->next; - } else { - hashtblP->nodes[hash]=node->next; - } - - hashtblP->freekeyfunc(node->key); - hashtblP->freedatafunc(node->data); - free(node); - return HASH_TABLE_OK; - } - - prevnode=node; - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Searching for an element is easy. We just search through the linked list for the corresponding hash value. - * NULL is returned if we didn't find it. - */ -hashtable_rc_t obj_hashtable_get(obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP, void** dataP) -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - *dataP = NULL; - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - *dataP = node->data; - return HASH_TABLE_OK; - } else if (node->key_size == key_sizeP) { - if (memcmp(node->key, keyP, key_sizeP) == 0) { - *dataP = node->data; - return HASH_TABLE_OK; - } - } - - node=node->next; - } - - *dataP = NULL; - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Function to return all keys of an object hash table - */ -hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP, unsigned int *sizeP) -{ - size_t n = 0; - obj_hash_node_t *node = NULL; - obj_hash_node_t *next = NULL; - - *sizeP = 0; - keysP = calloc(hashtblP->num_elements, sizeof(void *)); - - if (keysP) { - for(n=0; nsize; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - keysP[*sizeP++] = node->key; - next = node->next; - } - } - - return HASH_TABLE_OK; - } - - return HASH_TABLE_SYSTEM_ERROR; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Resizing - * The number of elements in a hash table is not always known when creating the table. - * If the number of elements grows too large, it will seriously reduce the performance of most hash table operations. - * If the number of elements are reduced, the hash table will waste memory. That is why we provide a function for resizing the table. - * Resizing a hash table is not as easy as a realloc(). All hash values must be recalculated and each element must be inserted into its new position. - * We create a temporary obj_hash_table_t object (newtbl) to be used while building the new hashes. - * This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table. - * After that, we can just free the old table and copy the elements from newtbl to hashtbl. - */ -hashtable_rc_t obj_hashtable_resize(obj_hash_table_t *hashtblP, hash_size_t sizeP) -{ - obj_hash_table_t newtbl; - hash_size_t n; - obj_hash_node_t *node,*next; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - newtbl.size = sizeP; - newtbl.hashfunc = hashtblP->hashfunc; - - if(!(newtbl.nodes=calloc(sizeP, sizeof(obj_hash_node_t*)))) return HASH_TABLE_SYSTEM_ERROR; - - for(n=0; nsize; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - next = node->next; - obj_hashtable_insert(&newtbl, node->key, node->key_size, node->data); - obj_hashtable_remove(hashtblP, node->key, node->key_size); - } - } - - free(hashtblP->nodes); - hashtblP->size=newtbl.size; - hashtblP->nodes=newtbl.nodes; - - return HASH_TABLE_OK; -} - - - diff --git a/openair3/UTILS/HASHTABLE/obj_hashtable.h b/openair3/UTILS/HASHTABLE/obj_hashtable.h deleted file mode 100644 index d11a67e264..0000000000 --- a/openair3/UTILS/HASHTABLE/obj_hashtable.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _OBJ_HASH_TABLE_H_ -#define _OBJ_HASH_TABLE_H_ -#include -#include -#include - -#include "hashtable.h" - -typedef size_t hash_size_t; - - -typedef struct obj_hash_node_s { - int key_size; - void *key; - void *data; - struct obj_hash_node_s *next; -} obj_hash_node_t; - -typedef struct obj_hash_table_s { - hash_size_t size; - hash_size_t num_elements; - struct obj_hash_node_s **nodes; - hash_size_t (*hashfunc)(const void*, int); - void (*freekeyfunc)(void*); - void (*freedatafunc)(void*); -} obj_hash_table_t; - -obj_hash_table_t *obj_hashtable_create (hash_size_t size, hash_size_t (*hashfunc)(const void*, int ), void (*freekeyfunc)(void*), void (*freedatafunc)(void*)); -hashtable_rc_t obj_hashtable_destroy (obj_hash_table_t *hashtblP); -hashtable_rc_t obj_hashtable_is_key_exists (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP); -hashtable_rc_t obj_hashtable_insert (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP, void *dataP); -hashtable_rc_t obj_hashtable_remove (obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP); -hashtable_rc_t obj_hashtable_get (obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP, void ** dataP); -hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP, unsigned int *sizeP); -hashtable_rc_t obj_hashtable_resize (obj_hash_table_t *hashtblP, hash_size_t sizeP); - - - -#endif - From e94eb6673c43fa5d2da0dff7512d7e6a69cc4c3a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Sun, 25 Sep 2016 16:29:12 +0200 Subject: [PATCH 243/340] moving hastable into other directory and adding OAI license --- NOTICE.txt | 16 ++++ cmake_targets/CMakeLists.txt | 6 +- common/utils/collection/COPYING | 28 ------ common/utils/collection/hashtable/COPYING | 28 ------ common/utils/hashtable/COPYING | 94 +++++++++++++++++++ .../{collection => }/hashtable/hashtable.c | 21 +++++ .../{collection => }/hashtable/hashtable.h | 21 +++++ .../hashtable/obj_hashtable.c | 21 +++++ .../hashtable/obj_hashtable.h | 21 +++++ 9 files changed, 197 insertions(+), 59 deletions(-) create mode 100644 NOTICE.txt delete mode 100644 common/utils/collection/COPYING delete mode 100644 common/utils/collection/hashtable/COPYING create mode 100644 common/utils/hashtable/COPYING rename common/utils/{collection => }/hashtable/hashtable.c (91%) rename common/utils/{collection => }/hashtable/hashtable.h (66%) rename common/utils/{collection => }/hashtable/obj_hashtable.c (90%) rename common/utils/{collection => }/hashtable/obj_hashtable.h (60%) diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 0000000000..b9eee02ed5 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,16 @@ +Credits for LFDS user space source code located in folder openair2/UTILS/LFDS/liblfds6.1.1/ +http://liblfds.org/. +Extract from http://liblfds.org/pages/downloads_and_license.html: +"There is no license. You are free to use this software in any way, for any purpose. Go forth and create wealth! +If however for legal reasons a licence is required, the license of your choice will be granted." + + +Credits for source code common/utils/collection/queue.h: +The Regents of the University of California: BSD 3-Clause Licence. + + +Credits for source code common/utils/collection/tree.h: +Niels Provos : BSD 2-Clause Licence. + + + diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index e9bd7197c8..006ed1f21d 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -851,10 +851,10 @@ include_directories("${OPENAIR_DIR}") # Utilities Library ################ add_library(HASHTABLE - ${OPENAIR_DIR}/common/utils/collection/hashtable/hashtable.c - ${OPENAIR_DIR}/common/utils/collection/hashtable/obj_hashtable.c + ${OPENAIR_DIR}/common/utils/hashtable/hashtable.c + ${OPENAIR_DIR}/common/utils/hashtable/obj_hashtable.c ) -include_directories(${OPENAIR_DIR}/common/utils/collection/hashtable) +include_directories(${OPENAIR_DIR}/common/utils/hashtable) if (MESSAGE_CHART_GENERATOR) add_library(MSC diff --git a/common/utils/collection/COPYING b/common/utils/collection/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/collection/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/collection/hashtable/COPYING b/common/utils/collection/hashtable/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/collection/hashtable/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/hashtable/COPYING b/common/utils/hashtable/COPYING new file mode 100644 index 0000000000..3293c58ad3 --- /dev/null +++ b/common/utils/hashtable/COPYING @@ -0,0 +1,94 @@ + OAI PUBLIC LICENSE V1.0 + + Copyright (C) 2016 OpenAirInterface Software Alliance, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Definitions. +“License” shall mean the terms and conditions for use, reproduction, and distribution set forth in this document. + +“Licensor” shall mean the OpenAirInterface Software Alliance. + +“Legal Entity” shall mean the union, at the time an acting entity joins the Alliance, of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License. + +“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +“OpenAirInterface Software Alliance” shall mean the endowment fund established at the initiative of Eurecom, an educational and research establishment located at Campus Sophia Tech, 450 Route des Chappes, 06410 Biot, France, which statutes were signed on 18 November 2014. + +“ “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +“Contribution” shall mean any work of authorship that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, , or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work “Contributor License Agreement” shall mean the agreement signed by any Contributor setting forth the terms and conditions applicable to its Contribution. “Contributor” shall mean any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +Grant of Copyright License. +Subject to the terms and conditions of this License, Licensor and each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form + +3. Grant of Patent License. + +3.1 Grant of Patent License for non-commercial purposes: + +Subject to the terms and conditions of this License, Licensor and each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, import, and otherwise transfer the Work, for non-commercial purposes, where such license applies only to those patent claims licensable by such Contributor or Licensor that are necessarily infringed by the Work and/or their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. + +3.2 Grant of Patent License for commercial purposes: + +For commercial purposes, and subject to the terms and conditions of this License, You commits to be prepared to negotiate a patent license with each Contributor and/or the Licensor on Fair, Reasonable and Non-Discriminatory (“FRAND”) terms and conditions for the Work or Contribution(s) incorporated within the Work. + +Licensor and/or each Contributor, by submitting a Contribution, will identify any patent it owns related to the Work and/or its Contribution. + +3.3 Patent Litigation + +If You institute patent litigation against any entity making non-commercial use of the Work (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistibution + +Subject to terms and conditions set forth in articles 2 and 3, You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + + + +1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + +2. You must cause any modified files by You to carry prominent notices stating that You changed the files; and + +3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +4. If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement such as the Contributor License Agreement You may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall Licensor and any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor and/or the Licensor,and only if You agree to indemnify, defend, and hold each Contributor and/or the Licensor harmless for any liability incurred by, or claims asserted against, such Contributor and/or Licensor by reason of Your accepting any such warranty or additional liability. + +10. Applicable law. The present license shall be governed by the laws of France. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the PRESENT OPENAIR 5G License to your work +To apply the present License to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] +Licensed under the License terms and conditions for use, reproduction, and distribution of OPENAIR 5G software (the “License”); + +you may not use this file except in compliance with the License.You may obtain a copy of the License at +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an “AS IS” BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. \ No newline at end of file diff --git a/common/utils/collection/hashtable/hashtable.c b/common/utils/hashtable/hashtable.c similarity index 91% rename from common/utils/collection/hashtable/hashtable.c rename to common/utils/hashtable/hashtable.c index 9fc913c5fb..b82affb4a3 100644 --- a/common/utils/collection/hashtable/hashtable.c +++ b/common/utils/hashtable/hashtable.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/collection/hashtable/hashtable.h b/common/utils/hashtable/hashtable.h similarity index 66% rename from common/utils/collection/hashtable/hashtable.h rename to common/utils/hashtable/hashtable.h index e9aa7c7d3d..2fd08e6625 100644 --- a/common/utils/collection/hashtable/hashtable.h +++ b/common/utils/hashtable/hashtable.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _UTILS_COLLECTION_HASH_TABLE_H_ #define _UTILS_COLLECTION_HASH_TABLE_H_ #include diff --git a/common/utils/collection/hashtable/obj_hashtable.c b/common/utils/hashtable/obj_hashtable.c similarity index 90% rename from common/utils/collection/hashtable/obj_hashtable.c rename to common/utils/hashtable/obj_hashtable.c index d6f1a3a431..caae391ae2 100644 --- a/common/utils/collection/hashtable/obj_hashtable.c +++ b/common/utils/hashtable/obj_hashtable.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/collection/hashtable/obj_hashtable.h b/common/utils/hashtable/obj_hashtable.h similarity index 60% rename from common/utils/collection/hashtable/obj_hashtable.h rename to common/utils/hashtable/obj_hashtable.h index 1450022b52..45f97a6baa 100644 --- a/common/utils/collection/hashtable/obj_hashtable.h +++ b/common/utils/hashtable/obj_hashtable.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _UTILS_COLLECTION_OBJ_HASH_TABLE_H_ #define _UTILS_COLLECTION_OBJ_HASH_TABLE_H_ #include From 2f00edeb8e13410a2694105bbee3d2695ea27221 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 26 Sep 2016 12:53:50 +0200 Subject: [PATCH 244/340] minor compilation fixes to BladeRF driver --- targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index 6cc1d8c5d2..48c24a0c04 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -902,8 +902,8 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { brf_state_t *brf = (brf_state_t*)malloc(sizeof(brf_state_t)); memset(brf, 0, sizeof(brf_state_t)); /* device specific */ - openair0_cfg->txlaunch_wait = 1;//manage when TX processing is triggered - openair0_cfg->txlaunch_wait_slotcount = 1; //manage when TX processing is triggered + //openair0_cfg->txlaunch_wait = 1;//manage when TX processing is triggered + //openair0_cfg->txlaunch_wait_slotcount = 1; //manage when TX processing is triggered openair0_cfg->iq_txshift = 0;// shift openair0_cfg->iq_rxrescale = 15;//rescale iqs @@ -912,22 +912,18 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { case 30720000: openair0_cfg->samples_per_packet = 2048; openair0_cfg->tx_sample_advance = 0; - openair0_cfg->tx_scheduling_advance = 8*openair0_cfg->samples_per_packet; break; case 15360000: openair0_cfg->samples_per_packet = 2048; openair0_cfg->tx_sample_advance = 0; - openair0_cfg->tx_scheduling_advance = 4*openair0_cfg->samples_per_packet; break; case 7680000: openair0_cfg->samples_per_packet = 1024; openair0_cfg->tx_sample_advance = 0; - openair0_cfg->tx_scheduling_advance = 4*openair0_cfg->samples_per_packet; break; case 1920000: openair0_cfg->samples_per_packet = 256; openair0_cfg->tx_sample_advance = 50; - openair0_cfg->tx_scheduling_advance = 8*openair0_cfg->samples_per_packet; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg->sample_rate); From ce9c87026dc061943ca6b30bde6d16f819924e9c Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 26 Sep 2016 13:05:48 +0200 Subject: [PATCH 245/340] minor compilation fixes to LMSSDR driver --- targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 4be796e588..485fe5c0b4 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -324,7 +324,7 @@ int trx_lms_start(openair0_device *device){ * \param card Index of the RF card to use * \returns 0 on success */ -int trx_lms_stop(int card) { +int trx_lms_stop(openair0_device *device) { /* LMS_DeviceClose(usbport); LMS_DeviceClose(comport); @@ -410,28 +410,24 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ openair0_cfg[0].tx_sample_advance = 15; openair0_cfg[0].tx_bw = 30.72e6; openair0_cfg[0].rx_bw = 30.72e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 15360000: openair0_cfg[0].samples_per_packet = 2048; openair0_cfg[0].tx_sample_advance = 45; openair0_cfg[0].tx_bw = 28e6; openair0_cfg[0].rx_bw = 10e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 7680000: openair0_cfg[0].samples_per_packet = 1024; openair0_cfg[0].tx_sample_advance = 70; openair0_cfg[0].tx_bw = 28e6; openair0_cfg[0].rx_bw = 5.0e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 1920000: openair0_cfg[0].samples_per_packet = 256; openair0_cfg[0].tx_sample_advance = 50; openair0_cfg[0].tx_bw = 1.25e6; openair0_cfg[0].rx_bw = 1.25e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); From c7ae7540664f35800c490f020e5c9352d268e66d Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 26 Sep 2016 13:12:34 +0200 Subject: [PATCH 246/340] compilation fix for pbchsim --- openair1/SIMULATION/LTE_PHY/pbchsim.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 624ce7ad3e..c8d5b1161c 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -353,8 +353,8 @@ int main(int argc, char **argv) eNB2->frame_parms.nushift=(Nid_cell+2)%6; eNB2->Mod_id=2; - phy_init_lte_eNB(eNB1,0,0,0); - phy_init_lte_eNB(eNB2,0,0,0); + phy_init_lte_eNB(eNB1,0,0); + phy_init_lte_eNB(eNB2,0,0); #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); From 2d3333dd6b2522d2af7450178a538962f04f2ba8 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 26 Sep 2016 14:13:32 +0200 Subject: [PATCH 247/340] Gitlab CI: fix for cleaning memory only when critically low --- cmake_targets/autotests/tools/free_mem.bash | 22 ++++++++++++++++++++- cmake_targets/tools/build_helper | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/cmake_targets/autotests/tools/free_mem.bash b/cmake_targets/autotests/tools/free_mem.bash index 873d6121e7..f0a5b03d85 100755 --- a/cmake_targets/autotests/tools/free_mem.bash +++ b/cmake_targets/autotests/tools/free_mem.bash @@ -31,6 +31,26 @@ # \author Navid Nikaein, Rohit Gupta # To free unused memory else test setup runs out of memory -sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches ' + +mem_threshold=0.2 #If free memory is less than this threshold, then VM drop cache is called +mem_tot=`vmstat -s -S k |grep "total memory" | awk '{print $1}'` +mem_free=`vmstat -s -S k |grep "free memory" | awk '{print $1}'` + +mem_frac=`bc <<< "scale=4;$mem_free/$mem_tot"` +echo $mem_frac +#mem_frac=`bc <<< "scale=4;`echo $mem_free`/`echo $mem_tot`"` +echo "Total Memory = $mem_tot k " +echo "Free Memory = $mem_free k" +echo "Fraction free memory = $mem_frac " + +res=`bc <<< "$mem_frac < 0.2" ` + +echo "Comparison Result = $res" + +if [ "$res" == "1" ] +then + echo "Free memory less than threshold = $mem_threshold" + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches ' +fi diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 4ebe2be1b0..73df7cc640 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -284,7 +284,8 @@ check_install_additional_tools (){ wvdial \ python-numpy \ sshpass \ - nscd + nscd \ + bc $SUDO pip install paramiko $SUDO pip install pyroute2 From da100fb693eb5e30085eaf2e7944a3397a3ec71e Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 26 Sep 2016 14:21:35 +0200 Subject: [PATCH 248/340] add NTP for synch time between test setup machines --- cmake_targets/tools/build_helper | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 73df7cc640..b855b28e10 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -285,7 +285,8 @@ check_install_additional_tools (){ python-numpy \ sshpass \ nscd \ - bc + bc \ + ntp $SUDO pip install paramiko $SUDO pip install pyroute2 From 784c4e49410c7560c58cd2bc398491d38b494b45 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 26 Sep 2016 17:19:51 +0200 Subject: [PATCH 249/340] adding missing symbol to octave tools --- targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h | 1 + targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc | 1 + targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc | 1 + .../EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc | 1 + targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc | 1 + targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc | 1 + .../ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc | 1 + targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m | 4 ++-- 8 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h new file mode 100644 index 0000000000..ba6f2b142f --- /dev/null +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h @@ -0,0 +1 @@ +volatile int oai_exit=0; diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc index 4d0eef921b..367ac0b7f6 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc @@ -36,6 +36,7 @@ #include #include "pcie_interface.h" +#include "oarf.h" extern "C" { #include "openair0_lib.h" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc index 708910b4f7..c7190671eb 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc @@ -42,6 +42,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_get_frame" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc index a26b6a0a67..b7d20d9d69 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc @@ -39,6 +39,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_get_num_detected_cards" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc index 75cdef67b2..659e6125be 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc @@ -41,6 +41,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_send_frame" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc index 03b4b5324d..8d5669e043 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc @@ -40,6 +40,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_stop" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc index 058a8bba3e..d6684b5c43 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc @@ -39,6 +39,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_stop_without_reset" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m index ad33d26123..97fad27531 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m @@ -1,4 +1,4 @@ -fc = 1907600000; +fc = 2560000000 %fc = 1907600000; %fc = 859.5e6; @@ -6,7 +6,7 @@ rxgain=0; txgain=0; eNB_flag = 0; card = 0; -active_rf = [1 1 1 1]; +active_rf = [1 0 0 0]; autocal = [1 1 1 1]; resampling_factor = [2 2 2 2]; limeparms; From 265a2d01bdfa1ab8e3ad6e054b084746583b8cd9 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 26 Sep 2016 19:08:11 +0200 Subject: [PATCH 250/340] update USRP config files with calibration verified --- .../CONF/enb.band7.tm1.100PRB.usrpb210.conf | 2 +- .../CONF/enb.band7.tm1.50PRB.usrpb210.conf | 2 +- .../CONF/enb.band7.tm1.usrpb210.conf | 2 +- .../CONF/enb.band7.tm2.100PRB.usrpb210.conf | 2 +- .../CONF/enb.band7.tm2.100PRB.usrpx310.conf | 2 +- .../CONF/enb.band7.tm2.50PRB.usrpb210.conf | 177 ++++++++++++++++++ .../CONF/enb.band7.tm2.50PRB.usrpx310.conf | 175 +++++++++++++++++ .../CONF/enb.band7.tm2.usrpb210.conf | 2 +- 8 files changed, 358 insertions(+), 6 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index 6d4652183e..f4ed76a21e 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; + pdsch_referenceSignalPower = -30; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index b18055ed22..c3c88323aa 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; + pdsch_referenceSignalPower = -27; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf index b346a123e0..01cd014afc 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf index f50101a3e9..325af1c830 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -32; + pdsch_referenceSignalPower = -33; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf index 115082c530..06b27ba63c 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf @@ -49,7 +49,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf new file mode 100644 index 0000000000..39ff0481cc --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf @@ -0,0 +1,177 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "94"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2680000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 2; + nb_antennas_tx = 2; + nb_antennas_rx = 2; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -30; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; +/* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; +*/ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 2; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.171"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.150/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.150/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf new file mode 100644 index 0000000000..71e4472306 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf @@ -0,0 +1,175 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 2; + nb_antennas_tx = 2; + nb_antennas_rx = 2; + tx_gain = 32; + rx_gain = 116; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -21; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -108; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 2; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf index dc4e65f47d..688840015d 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -28; + pdsch_referenceSignalPower = -27; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; From ff90a54ad985d6e64515d99e38d539596baaea13 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 26 Sep 2016 12:08:33 -0700 Subject: [PATCH 251/340] bugfix for 4096 and 8192-point dfts. --- openair1/PHY/LTE_TRANSPORT/prach.c | 52 +++++++++++++++----- openair1/PHY/TOOLS/lte_dfts.c | 68 +++++++++++++++++++++----- openair1/PHY/TOOLS/twiddle12288.h | 4 +- openair1/PHY/TOOLS/twiddle24576.h | 4 +- openair1/PHY/TOOLS/twiddle6144.h | 4 +- openair1/SIMULATION/LTE_PHY/prachsim.c | 17 +++++-- 6 files changed, 112 insertions(+), 37 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index cab6544b62..aed5ab14c8 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -46,7 +46,7 @@ #include "SCHED/extern.h" #include "UTIL/LOG/vcd_signal_dumper.h" -//#define PRACH_DEBUG 1 +#define PRACH_DEBUG 1 uint16_t NCS_unrestricted[16] = {0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419}; uint16_t NCS_restricted[15] = {15,18,22,26,32,38,46,55,68,82,100,128,158,202,237}; // high-speed case @@ -818,11 +818,14 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 break; case 75: - memset((void*)prachF,0,4*19432); + memset((void*)prachF,0,4*18432); break; case 100: - memset((void*)prachF,0,4*24576); + if (ue->frame_parms.threequarter_fs == 0) + memset((void*)prachF,0,4*24576); + else + memset((void*)prachF,0,4*18432); break; } @@ -886,6 +889,9 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 break; } + if (ue->frame_parms.threequarter_fs == 1) + Ncp=(Ncp*3)>>2; + prach2 = prach+(Ncp<<1); // do IDFT @@ -986,21 +992,41 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 break; case 100: + if (ue->frame_parms.threequarter_fs == 0) { + if (prach_fmt == 4) { + idft4096(prachF,prach2,1); + memmove( prach, prach+8192, Ncp<<2 ); + prach_len = 4096+Ncp; + } else { + idft24576(prachF,prach2); + memmove( prach, prach+49152, Ncp<<2 ); + prach_len = 24576+Ncp; + + if (prach_fmt>1) { + memmove( prach2+49152, prach2, 98304 ); + prach_len = 2* 24576+Ncp; + } + } + } + else { if (prach_fmt == 4) { - idft4096(prachF,prach2,1); - memmove( prach, prach+8192, Ncp<<2 ); - prach_len = 4096+Ncp; + idft3072(prachF,prach2); + //TODO: account for repeated format in dft output + memmove( prach, prach+6144, Ncp<<2 ); + prach_len = 3072+Ncp; } else { - idft24576(prachF,prach2); - memmove( prach, prach+49152, Ncp<<2 ); - prach_len = 24576+Ncp; + idft18432(prachF,prach2); + memmove( prach, prach+36864, Ncp<<2 ); + prach_len = 18432+Ncp; if (prach_fmt>1) { - memmove( prach2+49152, prach2, 98304 ); - prach_len = 2* 24576+Ncp; + memmove( prach2+36834, prach2, 73728 ); + prach_len = 2*18432+Ncp; } } + } + break; } @@ -1496,7 +1522,7 @@ void rx_prach(PHY_VARS_eNB *eNB, #ifdef PRACH_DEBUG - if (en>40) { + // if (en>40) { k = (12*n_ra_prb) - 6*eNB->frame_parms.N_RB_UL; if (k<0) @@ -1510,7 +1536,7 @@ void rx_prach(PHY_VARS_eNB *eNB, write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); write_output("prach_ifft0.m","prach_t0",prach_ifft[0],1024,1,1); exit(-1); - } + // } #endif } // new dft diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index b50e6c5e34..6bc562811b 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -5229,7 +5229,7 @@ void dft8192(int16_t *x,int16_t *y,int scale) xtmpp = xtmp; - for (i=0; i<32; i++) { + for (i=0; i<16; i++) { transpose4_ooff_simd256(x256 ,xtmpp,512); transpose4_ooff_simd256(x256+2,xtmpp+1,512); transpose4_ooff_simd256(x256+4,xtmpp+2,512); @@ -5267,7 +5267,7 @@ void dft8192(int16_t *x,int16_t *y,int scale) } dft4096((int16_t*)(xtmp),(int16_t*)ytmp,1); - dft4096((int16_t*)(xtmp+1024),(int16_t*)(ytmp+512),1); + dft4096((int16_t*)(xtmp+512),(int16_t*)(ytmp+512),1); for (i=0; i<512; i++) { @@ -5319,7 +5319,7 @@ void idft8192(int16_t *x,int16_t *y,int scale) xtmpp = xtmp; - for (i=0; i<32; i++) { + for (i=0; i<16; i++) { transpose4_ooff_simd256(x256 ,xtmpp,512); transpose4_ooff_simd256(x256+2,xtmpp+1,512); transpose4_ooff_simd256(x256+4,xtmpp+2,512); @@ -5357,7 +5357,7 @@ void idft8192(int16_t *x,int16_t *y,int scale) } idft4096((int16_t*)(xtmp),(int16_t*)ytmp,1); - idft4096((int16_t*)(xtmp+1024),(int16_t*)(ytmp+512),1); + idft4096((int16_t*)(xtmp+512),(int16_t*)(ytmp+512),1); for (i=0; i<512; i++) { @@ -5733,8 +5733,8 @@ void dft24576(int16_t *input, int16_t *output) void idft24576(int16_t *input, int16_t *output) { int i,i2,j; - uint32_t tmp[3][16384] __attribute__((aligned(32))); - uint32_t tmpo[3][16384] __attribute__((aligned(32))); + uint32_t tmp[3][8192] __attribute__((aligned(32))); + uint32_t tmpo[3][8192] __attribute__((aligned(32))); for (i=0,j=0; i<8192; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5746,13 +5746,6 @@ void idft24576(int16_t *input, int16_t *output) idft8192((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); idft8192((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); - /* - for (i=1; i<8192; i++) { - tmpo[0][i] = tmpo[0][i<<1]; - tmpo[1][i] = tmpo[1][i<<1]; - tmpo[2][i] = tmpo[2][i<<1]; - }*/ - /* write_output("in.m","in",input,24576,1,1); write_output("out0.m","o0",tmpo[0],8192,1,1); @@ -19129,6 +19122,55 @@ int main(int argc, char**argv) write_output("y2048.m","y2048",y,2048,1,1); write_output("x2048.m","x2048",x,2048,1,1); + memset((void*)x,0,2048*sizeof(int32_t)); + for (i=2;i<2402;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(4096-1200);i<8192;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + + for (i=0; i<10000; i++) { + start_meas(&ts); + idft4096((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n4096-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + write_output("y4096.m","y4096",y,4096,1,1); + write_output("x4096.m","x4096",x,4096,1,1); + + memset((void*)x,0,8192*sizeof(int32_t)); + for (i=2;i<4802;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(4096-1200);i<8192;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + idft8192((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n8192-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + write_output("y8192.m","y8192",y,8192,1,1); + write_output("x8192.m","x8192",x,8192,1,1); + return(0); } diff --git a/openair1/PHY/TOOLS/twiddle12288.h b/openair1/PHY/TOOLS/twiddle12288.h index bc1226c67e..e9f0f22fbc 100644 --- a/openair1/PHY/TOOLS/twiddle12288.h +++ b/openair1/PHY/TOOLS/twiddle12288.h @@ -39,7 +39,7 @@ twb2(2:2:end) = imag(twb); */ -int16_t twa12288[8192] __attribute__((aligned(16))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386}; +int16_t twa12288[8192] __attribute__((aligned(32))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386}; -int16_t twb12288[8192] __attribute__((aligned(16))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394,-16384,-28378,-16413,-28361,-16442,-28344,-16471,-28327,-16500,-28310,-16529,-28293,-16558,-28276,-16587,-28260,-16616,-28243,-16644,-28226,-16673,-28209,-16702,-28191,-16731,-28174,-16760,-28157,-16789,-28140,-16817,-28123,-16846,-28106,-16875,-28088,-16904,-28071,-16932,-28054,-16961,-28037,-16990,-28019,-17018,-28002,-17047,-27984,-17075,-27967,-17104,-27949,-17133,-27932,-17161,-27914,-17190,-27897,-17218,-27879,-17247,-27862,-17275,-27844,-17304,-27826,-17332,-27809,-17361,-27791,-17389,-27773,-17417,-27755,-17446,-27737,-17474,-27720,-17502,-27702,-17531,-27684,-17559,-27666,-17587,-27648,-17616,-27630,-17644,-27612,-17672,-27594,-17700,-27576,-17728,-27558,-17757,-27539,-17785,-27521,-17813,-27503,-17841,-27485,-17869,-27467,-17897,-27448,-17925,-27430,-17953,-27412,-17981,-27393,-18009,-27375,-18037,-27356,-18065,-27338,-18093,-27320,-18121,-27301,-18149,-27282,-18177,-27264,-18205,-27245,-18233,-27227,-18261,-27208,-18288,-27189,-18316,-27171,-18344,-27152,-18372,-27133,-18399,-27114,-18427,-27095,-18455,-27077,-18483,-27058,-18510,-27039,-18538,-27020,-18565,-27001,-18593,-26982,-18621,-26963,-18648,-26944,-18676,-26925,-18703,-26906,-18731,-26886,-18758,-26867,-18786,-26848,-18813,-26829,-18841,-26810,-18868,-26790,-18895,-26771,-18923,-26752,-18950,-26732,-18977,-26713,-19005,-26693,-19032,-26674,-19059,-26655,-19087,-26635,-19114,-26616,-19141,-26596,-19168,-26576,-19195,-26557,-19222,-26537,-19250,-26517,-19277,-26498,-19304,-26478,-19331,-26458,-19358,-26438,-19385,-26419,-19412,-26399,-19439,-26379,-19466,-26359,-19493,-26339,-19520,-26319,-19547,-26299,-19574,-26279,-19600,-26259,-19627,-26239,-19654,-26219,-19681,-26199,-19708,-26179,-19734,-26159,-19761,-26138,-19788,-26118,-19815,-26098,-19841,-26078,-19868,-26057,-19895,-26037,-19921,-26017,-19948,-25996,-19974,-25976,-20001,-25955,-20027,-25935,-20054,-25914,-20080,-25894,-20107,-25873,-20133,-25853,-20160,-25832,-20186,-25812,-20213,-25791,-20239,-25770,-20265,-25750,-20292,-25729,-20318,-25708,-20344,-25687,-20370,-25666,-20397,-25646,-20423,-25625,-20449,-25604,-20475,-25583,-20501,-25562,-20528,-25541,-20554,-25520,-20580,-25499,-20606,-25478,-20632,-25457,-20658,-25436,-20684,-25415,-20710,-25393,-20736,-25372,-20762,-25351,-20788,-25330,-20814,-25308,-20839,-25287,-20865,-25266,-20891,-25244,-20917,-25223,-20943,-25202,-20968,-25180,-20994,-25159,-21020,-25137,-21046,-25116,-21071,-25094,-21097,-25073,-21123,-25051,-21148,-25030,-21174,-25008,-21199,-24986,-21225,-24965,-21250,-24943,-21276,-24921,-21301,-24899,-21327,-24878,-21352,-24856,-21378,-24834,-21403,-24812,-21428,-24790,-21454,-24768,-21479,-24746,-21504,-24724,-21530,-24702,-21555,-24680,-21580,-24658,-21605,-24636,-21630,-24614,-21656,-24592,-21681,-24570,-21706,-24547,-21731,-24525,-21756,-24503,-21781,-24481,-21806,-24458,-21831,-24436,-21856,-24414,-21881,-24391,-21906,-24369,-21931,-24347,-21956,-24324,-21981,-24302,-22005,-24279,-22030,-24257,-22055,-24234,-22080,-24212,-22105,-24189,-22129,-24166,-22154,-24144,-22179,-24121,-22203,-24098,-22228,-24076,-22253,-24053,-22277,-24030,-22302,-24007,-22326,-23985,-22351,-23962,-22375,-23939,-22400,-23916,-22424,-23893,-22449,-23870,-22473,-23847,-22497,-23824,-22522,-23801,-22546,-23778,-22570,-23755,-22595,-23732,-22619,-23709,-22643,-23686,-22667,-23662,-22692,-23639,-22716,-23616,-22740,-23593,-22764,-23570,-22788,-23546,-22812,-23523,-22836,-23500,-22860,-23476,-22884,-23453,-22908,-23429,-22932,-23406,-22956,-23383,-22980,-23359,-23004,-23336,-23028,-23312,-23051,-23288,-23075,-23265,-23099,-23241,-23123,-23218,-23147,-23194,-23170,-23170,-23194,-23147,-23218,-23123,-23241,-23099,-23265,-23075,-23288,-23051,-23312,-23028,-23336,-23004,-23359,-22980,-23383,-22956,-23406,-22932,-23429,-22908,-23453,-22884,-23476,-22860,-23500,-22836,-23523,-22812,-23546,-22788,-23570,-22764,-23593,-22740,-23616,-22716,-23639,-22692,-23662,-22667,-23686,-22643,-23709,-22619,-23732,-22595,-23755,-22570,-23778,-22546,-23801,-22522,-23824,-22497,-23847,-22473,-23870,-22449,-23893,-22424,-23916,-22400,-23939,-22375,-23962,-22351,-23985,-22326,-24007,-22302,-24030,-22277,-24053,-22253,-24076,-22228,-24098,-22203,-24121,-22179,-24144,-22154,-24166,-22129,-24189,-22105,-24212,-22080,-24234,-22055,-24257,-22030,-24279,-22005,-24302,-21981,-24324,-21956,-24347,-21931,-24369,-21906,-24391,-21881,-24414,-21856,-24436,-21831,-24458,-21806,-24481,-21781,-24503,-21756,-24525,-21731,-24547,-21706,-24570,-21681,-24592,-21656,-24614,-21630,-24636,-21605,-24658,-21580,-24680,-21555,-24702,-21530,-24724,-21504,-24746,-21479,-24768,-21454,-24790,-21428,-24812,-21403,-24834,-21378,-24856,-21352,-24878,-21327,-24899,-21301,-24921,-21276,-24943,-21250,-24965,-21225,-24986,-21199,-25008,-21174,-25030,-21148,-25051,-21123,-25073,-21097,-25094,-21071,-25116,-21046,-25137,-21020,-25159,-20994,-25180,-20968,-25202,-20943,-25223,-20917,-25244,-20891,-25266,-20865,-25287,-20839,-25308,-20814,-25330,-20788,-25351,-20762,-25372,-20736,-25393,-20710,-25415,-20684,-25436,-20658,-25457,-20632,-25478,-20606,-25499,-20580,-25520,-20554,-25541,-20528,-25562,-20501,-25583,-20475,-25604,-20449,-25625,-20423,-25646,-20397,-25666,-20370,-25687,-20344,-25708,-20318,-25729,-20292,-25750,-20265,-25770,-20239,-25791,-20213,-25812,-20186,-25832,-20160,-25853,-20133,-25873,-20107,-25894,-20080,-25914,-20054,-25935,-20027,-25955,-20001,-25976,-19974,-25996,-19948,-26017,-19921,-26037,-19895,-26057,-19868,-26078,-19841,-26098,-19815,-26118,-19788,-26138,-19761,-26159,-19734,-26179,-19708,-26199,-19681,-26219,-19654,-26239,-19627,-26259,-19600,-26279,-19574,-26299,-19547,-26319,-19520,-26339,-19493,-26359,-19466,-26379,-19439,-26399,-19412,-26419,-19385,-26438,-19358,-26458,-19331,-26478,-19304,-26498,-19277,-26517,-19250,-26537,-19222,-26557,-19195,-26576,-19168,-26596,-19141,-26616,-19114,-26635,-19087,-26655,-19059,-26674,-19032,-26693,-19005,-26713,-18977,-26732,-18950,-26752,-18923,-26771,-18895,-26790,-18868,-26810,-18841,-26829,-18813,-26848,-18786,-26867,-18758,-26886,-18731,-26906,-18703,-26925,-18676,-26944,-18648,-26963,-18621,-26982,-18593,-27001,-18565,-27020,-18538,-27039,-18510,-27058,-18483,-27077,-18455,-27095,-18427,-27114,-18399,-27133,-18372,-27152,-18344,-27171,-18316,-27189,-18288,-27208,-18261,-27227,-18233,-27245,-18205,-27264,-18177,-27282,-18149,-27301,-18121,-27320,-18093,-27338,-18065,-27356,-18037,-27375,-18009,-27393,-17981,-27412,-17953,-27430,-17925,-27448,-17897,-27467,-17869,-27485,-17841,-27503,-17813,-27521,-17785,-27539,-17757,-27558,-17728,-27576,-17700,-27594,-17672,-27612,-17644,-27630,-17616,-27648,-17587,-27666,-17559,-27684,-17531,-27702,-17502,-27720,-17474,-27737,-17446,-27755,-17417,-27773,-17389,-27791,-17361,-27809,-17332,-27826,-17304,-27844,-17275,-27862,-17247,-27879,-17218,-27897,-17190,-27914,-17161,-27932,-17133,-27949,-17104,-27967,-17075,-27984,-17047,-28002,-17018,-28019,-16990,-28037,-16961,-28054,-16932,-28071,-16904,-28088,-16875,-28106,-16846,-28123,-16817,-28140,-16789,-28157,-16760,-28174,-16731,-28191,-16702,-28209,-16673,-28226,-16644,-28243,-16616,-28260,-16587,-28276,-16558,-28293,-16529,-28310,-16500,-28327,-16471,-28344,-16442,-28361,-16413,-28378,-16384,-28394,-16355,-28411,-16326,-28428,-16297,-28444,-16268,-28461,-16239,-28478,-16210,-28494,-16180,-28511,-16151,-28527,-16122,-28544,-16093,-28560,-16064,-28576,-16035,-28593,-16005,-28609,-15976,-28626,-15947,-28642,-15918,-28658,-15888,-28674,-15859,-28691,-15830,-28707,-15800,-28723,-15771,-28739,-15741,-28755,-15712,-28771,-15683,-28787,-15653,-28803,-15624,-28819,-15594,-28835,-15565,-28851,-15535,-28867,-15506,-28883,-15476,-28898,-15447,-28914,-15417,-28930,-15388,-28946,-15358,-28961,-15328,-28977,-15299,-28993,-15269,-29008,-15239,-29024,-15210,-29039,-15180,-29055,-15150,-29070,-15121,-29086,-15091,-29101,-15061,-29117,-15031,-29132,-15002,-29147,-14972,-29163,-14942,-29178,-14912,-29193,-14882,-29208,-14853,-29223,-14823,-29239,-14793,-29254,-14763,-29269,-14733,-29284,-14703,-29299,-14673,-29314,-14643,-29329,-14613,-29344,-14583,-29359,-14553,-29373,-14523,-29388,-14493,-29403,-14463,-29418,-14433,-29433,-14403,-29447,-14373,-29462,-14343,-29477,-14312,-29491,-14282,-29506,-14252,-29520,-14222,-29535,-14192,-29549,-14161,-29564,-14131,-29578,-14101,-29593,-14071,-29607,-14040,-29622,-14010,-29636,-13980,-29650,-13950,-29664,-13919,-29679,-13889,-29693,-13859,-29707,-13828,-29721,-13798,-29735,-13767,-29749,-13737,-29763,-13707,-29777,-13676,-29791,-13646,-29805,-13615,-29819,-13585,-29833,-13554,-29847,-13524,-29861,-13493,-29874,-13463,-29888,-13432,-29902,-13401,-29916,-13371,-29929,-13340,-29943,-13310,-29956,-13279,-29970,-13248,-29984,-13218,-29997,-13187,-30010,-13156,-30024,-13126,-30037,-13095,-30051,-13064,-30064,-13034,-30077,-13003,-30091,-12972,-30104,-12941,-30117,-12910,-30130,-12880,-30143,-12849,-30157,-12818,-30170,-12787,-30183,-12756,-30196,-12725,-30209,-12695,-30222,-12664,-30235,-12633,-30248,-12602,-30260,-12571,-30273,-12540,-30286,-12509,-30299,-12478,-30312,-12447,-30324,-12416,-30337,-12385,-30350,-12354,-30362,-12323,-30375,-12292,-30387,-12261,-30400,-12230,-30412,-12199,-30425,-12167,-30437,-12136,-30450,-12105,-30462,-12074,-30474,-12043,-30487,-12012,-30499,-11981,-30511,-11949,-30523,-11918,-30536,-11887,-30548,-11856,-30560,-11824,-30572,-11793,-30584,-11762,-30596,-11731,-30608,-11699,-30620,-11668,-30632,-11637,-30644,-11605,-30656,-11574,-30667,-11543,-30679,-11511,-30691,-11480,-30703,-11449,-30714,-11417,-30726,-11386,-30738,-11354,-30749,-11323,-30761,-11291,-30772,-11260,-30784,-11228,-30795,-11197,-30807,-11165,-30818,-11134,-30829,-11102,-30841,-11071,-30852,-11039,-30863,-11008,-30875,-10976,-30886,-10945,-30897,-10913,-30908,-10881,-30919,-10850,-30930,-10818,-30941,-10787,-30952,-10755,-30963,-10723,-30974,-10692,-30985,-10660,-30996,-10628,-31007,-10597,-31018,-10565,-31029,-10533,-31039,-10501,-31050,-10470,-31061,-10438,-31071,-10406,-31082,-10374,-31093,-10343,-31103,-10311,-31114,-10279,-31124,-10247,-31135,-10215,-31145,-10183,-31155,-10152,-31166,-10120,-31176,-10088,-31186,-10056,-31197,-10024,-31207,-9992,-31217,-9960,-31227,-9928,-31237,-9896,-31248,-9864,-31258,-9832,-31268,-9800,-31278,-9768,-31288,-9736,-31298,-9704,-31308,-9672,-31317,-9640,-31327,-9608,-31337,-9576,-31347,-9544,-31357,-9512,-31366,-9480,-31376,-9448,-31386,-9416,-31395,-9384,-31405,-9352,-31414,-9320,-31424,-9288,-31433,-9255,-31443,-9223,-31452,-9191,-31462,-9159,-31471,-9127,-31480,-9095,-31490,-9062,-31499,-9030,-31508,-8998,-31517,-8966,-31526,-8933,-31535,-8901,-31545,-8869,-31554,-8837,-31563,-8804,-31572,-8772,-31581,-8740,-31589,-8708,-31598,-8675,-31607,-8643,-31616,-8611,-31625,-8578,-31634,-8546,-31642,-8514,-31651,-8481,-31660,-8449,-31668,-8416,-31677,-8384,-31685,-8352,-31694,-8319,-31702,-8287,-31711,-8254,-31719,-8222,-31728,-8190,-31736,-8157,-31744,-8125,-31753,-8092,-31761,-8060,-31769,-8027,-31777,-7995,-31786,-7962,-31794,-7930,-31802,-7897,-31810,-7865,-31818,-7832,-31826,-7800,-31834,-7767,-31842,-7734,-31850,-7702,-31857,-7669,-31865,-7637,-31873,-7604,-31881,-7572,-31889,-7539,-31896,-7506,-31904,-7474,-31912,-7441,-31919,-7408,-31927,-7376,-31934,-7343,-31942,-7311,-31949,-7278,-31957,-7245,-31964,-7212,-31971,-7180,-31979,-7147,-31986,-7114,-31993,-7082,-32000,-7049,-32008,-7016,-32015,-6983,-32022,-6951,-32029,-6918,-32036,-6885,-32043,-6852,-32050,-6820,-32057,-6787,-32064,-6754,-32071,-6721,-32078,-6689,-32085,-6656,-32091,-6623,-32098,-6590,-32105,-6557,-32111,-6524,-32118,-6492,-32125,-6459,-32131,-6426,-32138,-6393,-32144,-6360,-32151,-6327,-32157,-6294,-32164,-6262,-32170,-6229,-32177,-6196,-32183,-6163,-32189,-6130,-32195,-6097,-32202,-6064,-32208,-6031,-32214,-5998,-32220,-5965,-32226,-5932,-32232,-5899,-32238,-5866,-32244,-5833,-32250,-5800,-32256,-5767,-32262,-5734,-32268,-5701,-32274,-5668,-32279,-5635,-32285,-5602,-32291,-5569,-32296,-5536,-32302,-5503,-32308,-5470,-32313,-5437,-32319,-5404,-32324,-5371,-32330,-5338,-32335,-5305,-32341,-5272,-32346,-5239,-32351,-5206,-32357,-5173,-32362,-5140,-32367,-5107,-32372,-5073,-32378,-5040,-32383,-5007,-32388,-4974,-32393,-4941,-32398,-4908,-32403,-4875,-32408,-4842,-32413,-4808,-32418,-4775,-32423,-4742,-32427,-4709,-32432,-4676,-32437,-4643,-32442,-4609,-32446,-4576,-32451,-4543,-32456,-4510,-32460,-4477,-32465,-4444,-32469,-4410,-32474,-4377,-32478,-4344,-32483,-4311,-32487,-4277,-32492,-4244,-32496,-4211,-32500,-4178,-32504,-4145,-32509,-4111,-32513,-4078,-32517,-4045,-32521,-4012,-32525,-3978,-32529,-3945,-32533,-3912,-32537,-3878,-32541,-3845,-32545,-3812,-32549,-3779,-32553,-3745,-32557,-3712,-32560,-3679,-32564,-3645,-32568,-3612,-32572,-3579,-32575,-3546,-32579,-3512,-32582,-3479,-32586,-3446,-32589,-3412,-32593,-3379,-32596,-3346,-32600,-3312,-32603,-3279,-32606,-3246,-32610,-3212,-32613,-3179,-32616,-3146,-32619,-3112,-32623,-3079,-32626,-3045,-32629,-3012,-32632,-2979,-32635,-2945,-32638,-2912,-32641,-2879,-32644,-2845,-32647,-2812,-32650,-2778,-32652,-2745,-32655,-2712,-32658,-2678,-32661,-2645,-32663,-2611,-32666,-2578,-32669,-2545,-32671,-2511,-32674,-2478,-32676,-2444,-32679,-2411,-32681,-2378,-32684,-2344,-32686,-2311,-32688,-2277,-32691,-2244,-32693,-2210,-32695,-2177,-32697,-2144,-32700,-2110,-32702,-2077,-32704,-2043,-32706,-2010,-32708,-1976,-32710,-1943,-32712,-1909,-32714,-1876,-32716,-1843,-32718,-1809,-32719,-1776,-32721,-1742,-32723,-1709,-32725,-1675,-32726,-1642,-32728,-1608,-32730,-1575,-32731,-1541,-32733,-1508,-32734,-1474,-32736,-1441,-32737,-1407,-32739,-1374,-32740,-1340,-32741,-1307,-32743,-1274,-32744,-1240,-32745,-1207,-32747,-1173,-32748,-1140,-32749,-1106,-32750,-1073,-32751,-1039,-32752,-1006,-32753,-972,-32754,-939,-32755,-905,-32756,-872,-32757,-838,-32758,-805,-32758,-771,-32759,-738,-32760,-704,-32761,-671,-32761,-637,-32762,-604,-32763,-570,-32763,-537,-32764,-503,-32764,-470,-32765,-436,-32765,-403,-32765,-369,-32766,-336,-32766,-302,-32766,-269,-32767,-235,-32767,-202,-32767,-168,-32767,-135,-32767,-101,-32767,-68,-32767,-34,-32767,-1,-32767,33,-32767,67,-32767,100,-32767,134,-32767,167,-32767,201,-32767,234,-32766,268,-32766,301,-32766,335,-32765,368,-32765,402,-32765,435,-32764,469,-32764,502,-32763,536,-32763,569,-32762,603,-32761,636,-32761,670,-32760,703,-32759,737,-32758,770,-32758,804,-32757,837,-32756,871,-32755,904,-32754,938,-32753,971,-32752,1005,-32751,1038,-32750,1072,-32749,1105,-32748,1139,-32747,1172,-32745,1206,-32744,1239,-32743,1273,-32741,1306,-32740,1339,-32739,1373,-32737,1406,-32736,1440,-32734,1473,-32733,1507,-32731,1540,-32730,1574,-32728,1607,-32726,1641,-32725,1674,-32723,1708,-32721,1741,-32719,1775,-32718,1808,-32716,1842,-32714,1875,-32712,1908,-32710,1942,-32708,1975,-32706,2009,-32704,2042,-32702,2076,-32700,2109,-32697,2143,-32695,2176,-32693,2209,-32691,2243,-32688,2276,-32686,2310,-32684,2343,-32681,2377,-32679,2410,-32676,2443,-32674,2477,-32671,2510,-32669,2544,-32666,2577,-32663,2610,-32661,2644,-32658,2677,-32655,2711,-32652,2744,-32650,2777,-32647,2811,-32644,2844,-32641,2878,-32638,2911,-32635,2944,-32632,2978,-32629,3011,-32626,3044,-32623,3078,-32619,3111,-32616,3145,-32613,3178,-32610,3211,-32606,3245,-32603,3278,-32600,3311,-32596,3345,-32593,3378,-32589,3411,-32586,3445,-32582,3478,-32579,3511,-32575,3545,-32572,3578,-32568,3611,-32564,3644,-32560,3678,-32557,3711,-32553,3744,-32549,3778,-32545,3811,-32541,3844,-32537,3877,-32533,3911,-32529,3944,-32525,3977,-32521,4011,-32517,4044,-32513,4077,-32509,4110,-32504,4144,-32500,4177,-32496,4210,-32492,4243,-32487,4276,-32483,4310,-32478,4343,-32474,4376,-32469,4409,-32465,4443,-32460,4476,-32456,4509,-32451,4542,-32446,4575,-32442,4608,-32437,4642,-32432,4675,-32427,4708,-32423,4741,-32418,4774,-32413,4807,-32408,4841,-32403,4874,-32398,4907,-32393,4940,-32388,4973,-32383,5006,-32378,5039,-32372,5072,-32367,5106,-32362,5139,-32357,5172,-32351,5205,-32346,5238,-32341,5271,-32335,5304,-32330,5337,-32324,5370,-32319,5403,-32313,5436,-32308,5469,-32302,5502,-32296,5535,-32291,5568,-32285,5601,-32279,5634,-32274,5667,-32268,5700,-32262,5733,-32256,5766,-32250,5799,-32244,5832,-32238,5865,-32232,5898,-32226,5931,-32220,5964,-32214,5997,-32208,6030,-32202,6063,-32195,6096,-32189,6129,-32183,6162,-32177,6195,-32170,6228,-32164,6261,-32157,6293,-32151,6326,-32144,6359,-32138,6392,-32131,6425,-32125,6458,-32118,6491,-32111,6523,-32105,6556,-32098,6589,-32091,6622,-32085,6655,-32078,6688,-32071,6720,-32064,6753,-32057,6786,-32050,6819,-32043,6851,-32036,6884,-32029,6917,-32022,6950,-32015,6982,-32008,7015,-32000,7048,-31993,7081,-31986,7113,-31979,7146,-31971,7179,-31964,7211,-31957,7244,-31949,7277,-31942,7310,-31934,7342,-31927,7375,-31919,7407,-31912,7440,-31904,7473,-31896,7505,-31889,7538,-31881,7571,-31873,7603,-31865,7636,-31857,7668,-31850,7701,-31842,7733,-31834,7766,-31826,7799,-31818,7831,-31810,7864,-31802,7896,-31794,7929,-31786,7961,-31777,7994,-31769,8026,-31761,8059,-31753,8091,-31744,8124,-31736,8156,-31728,8189,-31719,8221,-31711,8253,-31702,8286,-31694,8318,-31685,8351,-31677,8383,-31668,8415,-31660,8448,-31651,8480,-31642,8513,-31634,8545,-31625,8577,-31616,8610,-31607,8642,-31598,8674,-31589,8707,-31581,8739,-31572,8771,-31563,8803,-31554,8836,-31545,8868,-31535,8900,-31526,8932,-31517,8965,-31508,8997,-31499,9029,-31490,9061,-31480,9094,-31471,9126,-31462,9158,-31452,9190,-31443,9222,-31433,9254,-31424,9287,-31414,9319,-31405,9351,-31395,9383,-31386,9415,-31376,9447,-31366,9479,-31357,9511,-31347,9543,-31337,9575,-31327,9607,-31317,9639,-31308,9671,-31298,9703,-31288,9735,-31278,9767,-31268,9799,-31258,9831,-31248,9863,-31237,9895,-31227,9927,-31217,9959,-31207,9991,-31197,10023,-31186,10055,-31176,10087,-31166,10119,-31155,10151,-31145,10182,-31135,10214,-31124,10246,-31114,10278,-31103,10310,-31093,10342,-31082,10373,-31071,10405,-31061,10437,-31050,10469,-31039,10500,-31029,10532,-31018,10564,-31007,10596,-30996,10627,-30985,10659,-30974,10691,-30963,10722,-30952,10754,-30941,10786,-30930,10817,-30919,10849,-30908,10880,-30897,10912,-30886,10944,-30875,10975,-30863,11007,-30852,11038,-30841,11070,-30829,11101,-30818,11133,-30807,11164,-30795,11196,-30784,11227,-30772,11259,-30761,11290,-30749,11322,-30738,11353,-30726,11385,-30714,11416,-30703,11448,-30691,11479,-30679,11510,-30667,11542,-30656,11573,-30644,11604,-30632,11636,-30620,11667,-30608,11698,-30596,11730,-30584,11761,-30572,11792,-30560,11823,-30548,11855,-30536,11886,-30523,11917,-30511,11948,-30499,11980,-30487,12011,-30474,12042,-30462,12073,-30450,12104,-30437,12135,-30425,12166,-30412,12198,-30400,12229,-30387,12260,-30375,12291,-30362,12322,-30350,12353,-30337,12384,-30324,12415,-30312,12446,-30299,12477,-30286,12508,-30273,12539,-30260,12570,-30248,12601,-30235,12632,-30222,12663,-30209,12694,-30196,12724,-30183,12755,-30170,12786,-30157,12817,-30143,12848,-30130,12879,-30117,12909,-30104,12940,-30091,12971,-30077,13002,-30064,13033,-30051,13063,-30037,13094,-30024,13125,-30010,13155,-29997,13186,-29984,13217,-29970,13247,-29956,13278,-29943,13309,-29929,13339,-29916,13370,-29902,13400,-29888,13431,-29874,13462,-29861,13492,-29847,13523,-29833,13553,-29819,13584,-29805,13614,-29791,13645,-29777,13675,-29763,13706,-29749,13736,-29735,13766,-29721,13797,-29707,13827,-29693,13858,-29679,13888,-29664,13918,-29650,13949,-29636,13979,-29622,14009,-29607,14039,-29593,14070,-29578,14100,-29564,14130,-29549,14160,-29535,14191,-29520,14221,-29506,14251,-29491,14281,-29477,14311,-29462,14342,-29447,14372,-29433,14402,-29418,14432,-29403,14462,-29388,14492,-29373,14522,-29359,14552,-29344,14582,-29329,14612,-29314,14642,-29299,14672,-29284,14702,-29269,14732,-29254,14762,-29239,14792,-29223,14822,-29208,14852,-29193,14881,-29178,14911,-29163,14941,-29147,14971,-29132,15001,-29117,15030,-29101,15060,-29086,15090,-29070,15120,-29055,15149,-29039,15179,-29024,15209,-29008,15238,-28993,15268,-28977,15298,-28961,15327,-28946,15357,-28930,15387,-28914,15416,-28898,15446,-28883,15475,-28867,15505,-28851,15534,-28835,15564,-28819,15593,-28803,15623,-28787,15652,-28771,15682,-28755,15711,-28739,15740,-28723,15770,-28707,15799,-28691,15829,-28674,15858,-28658,15887,-28642,15917,-28626,15946,-28609,15975,-28593,16004,-28576,16034,-28560,16063,-28544,16092,-28527,16121,-28511,16150,-28494,16179,-28478,16209,-28461,16238,-28444,16267,-28428,16296,-28411,16325,-28394,16354,-28378,16383,-28361,16412,-28344,16441,-28327,16470,-28310,16499,-28293,16528,-28276,16557,-28260,16586,-28243,16615,-28226,16643,-28209,16672,-28191,16701,-28174,16730,-28157,16759,-28140,16788,-28123,16816,-28106,16845,-28088,16874,-28071,16903,-28054,16931,-28037,16960,-28019,16989,-28002,17017,-27984,17046,-27967,17074,-27949,17103,-27932,17132,-27914,17160,-27897,17189,-27879,17217,-27862,17246,-27844,17274,-27826,17303,-27809,17331,-27791,17360,-27773,17388,-27755,17416,-27737,17445,-27720,17473,-27702,17501,-27684,17530,-27666,17558,-27648,17586,-27630,17615,-27612,17643,-27594,17671,-27576,17699,-27558,17727,-27539,17756,-27521,17784,-27503,17812,-27485,17840,-27467,17868,-27448,17896,-27430,17924,-27412,17952,-27393,17980,-27375,18008,-27356,18036,-27338,18064,-27320,18092,-27301,18120,-27282,18148,-27264,18176,-27245,18204,-27227,18232,-27208,18260,-27189,18287,-27171,18315,-27152,18343,-27133,18371,-27114,18398,-27095,18426,-27077,18454,-27058,18482,-27039,18509,-27020,18537,-27001,18564,-26982,18592,-26963,18620,-26944,18647,-26925,18675,-26906,18702,-26886,18730,-26867,18757,-26848,18785,-26829,18812,-26810,18840,-26790,18867,-26771,18894,-26752,18922,-26732,18949,-26713,18976,-26693,19004,-26674,19031,-26655,19058,-26635,19086,-26616,19113,-26596,19140,-26576,19167,-26557,19194,-26537,19221,-26517,19249,-26498,19276,-26478,19303,-26458,19330,-26438,19357,-26419,19384,-26399,19411,-26379,19438,-26359,19465,-26339,19492,-26319,19519,-26299,19546,-26279,19573,-26259,19599,-26239,19626,-26219,19653,-26199,19680,-26179,19707,-26159,19733,-26138,19760,-26118,19787,-26098,19814,-26078,19840,-26057,19867,-26037,19894,-26017,19920,-25996,19947,-25976,19973,-25955,20000,-25935,20026,-25914,20053,-25894,20079,-25873,20106,-25853,20132,-25832,20159,-25812,20185,-25791,20212,-25770,20238,-25750,20264,-25729,20291,-25708,20317,-25687,20343,-25666,20369,-25646,20396,-25625,20422,-25604,20448,-25583,20474,-25562,20500,-25541,20527,-25520,20553,-25499,20579,-25478,20605,-25457,20631,-25436,20657,-25415,20683,-25393,20709,-25372,20735,-25351,20761,-25330,20787,-25308,20813,-25287,20838,-25266,20864,-25244,20890,-25223,20916,-25202,20942,-25180,20967,-25159,20993,-25137,21019,-25116,21045,-25094,21070,-25073,21096,-25051,21122,-25030,21147,-25008,21173,-24986,21198,-24965,21224,-24943,21249,-24921,21275,-24899,21300,-24878,21326,-24856,21351,-24834,21377,-24812,21402,-24790,21427,-24768,21453,-24746,21478,-24724,21503,-24702,21529,-24680,21554,-24658,21579,-24636,21604,-24614,21629,-24592,21655,-24570,21680,-24547,21705,-24525,21730,-24503,21755,-24481,21780,-24458,21805,-24436,21830,-24414,21855,-24391,21880,-24369,21905,-24347,21930,-24324,21955,-24302,21980,-24279,22004,-24257,22029,-24234,22054,-24212,22079,-24189,22104,-24166,22128,-24144,22153,-24121,22178,-24098,22202,-24076,22227,-24053,22252,-24030,22276,-24007,22301,-23985,22325,-23962,22350,-23939,22374,-23916,22399,-23893,22423,-23870,22448,-23847,22472,-23824,22496,-23801,22521,-23778,22545,-23755,22569,-23732,22594,-23709,22618,-23686,22642,-23662,22666,-23639,22691,-23616,22715,-23593,22739,-23570,22763,-23546,22787,-23523,22811,-23500,22835,-23476,22859,-23453,22883,-23429,22907,-23406,22931,-23383,22955,-23359,22979,-23336,23003,-23312,23027,-23288,23050,-23265,23074,-23241,23098,-23218,23122,-23194,23146,-23170,23169,-23147,23193,-23123,23217,-23099,23240,-23075,23264,-23051,23287,-23028,23311,-23004,23335,-22980,23358,-22956,23382,-22932,23405,-22908,23428,-22884,23452,-22860,23475,-22836,23499,-22812,23522,-22788,23545,-22764,23569,-22740,23592,-22716,23615,-22692,23638,-22667,23661,-22643,23685,-22619,23708,-22595,23731,-22570,23754,-22546,23777,-22522,23800,-22497,23823,-22473,23846,-22449,23869,-22424,23892,-22400,23915,-22375,23938,-22351,23961,-22326,23984,-22302,24006,-22277,24029,-22253,24052,-22228,24075,-22203,24097,-22179,24120,-22154,24143,-22129,24165,-22105,24188,-22080,24211,-22055,24233,-22030,24256,-22005,24278,-21981,24301,-21956,24323,-21931,24346,-21906,24368,-21881,24390,-21856,24413,-21831,24435,-21806,24457,-21781,24480,-21756,24502,-21731,24524,-21706,24546,-21681,24569,-21656,24591,-21630,24613,-21605,24635,-21580,24657,-21555,24679,-21530,24701,-21504,24723,-21479,24745,-21454,24767,-21428,24789,-21403,24811,-21378,24833,-21352,24855,-21327,24877,-21301,24898,-21276,24920,-21250,24942,-21225,24964,-21199,24985,-21174,25007,-21148,25029,-21123,25050,-21097,25072,-21071,25093,-21046,25115,-21020,25136,-20994,25158,-20968,25179,-20943,25201,-20917,25222,-20891,25243,-20865,25265,-20839,25286,-20814,25307,-20788,25329,-20762,25350,-20736,25371,-20710,25392,-20684,25414,-20658,25435,-20632,25456,-20606,25477,-20580,25498,-20554,25519,-20528,25540,-20501,25561,-20475,25582,-20449,25603,-20423,25624,-20397,25645,-20370,25665,-20344,25686,-20318,25707,-20292,25728,-20265,25749,-20239,25769,-20213,25790,-20186,25811,-20160,25831,-20133,25852,-20107,25872,-20080,25893,-20054,25913,-20027,25934,-20001,25954,-19974,25975,-19948,25995,-19921,26016,-19895,26036,-19868,26056,-19841,26077,-19815,26097,-19788,26117,-19761,26137,-19734,26158,-19708,26178,-19681,26198,-19654,26218,-19627,26238,-19600,26258,-19574,26278,-19547,26298,-19520,26318,-19493,26338,-19466,26358,-19439,26378,-19412,26398,-19385,26418,-19358,26437,-19331,26457,-19304,26477,-19277,26497,-19250,26516,-19222,26536,-19195,26556,-19168,26575,-19141,26595,-19114,26615,-19087,26634,-19059,26654,-19032,26673,-19005,26692,-18977,26712,-18950,26731,-18923,26751,-18895,26770,-18868,26789,-18841,26809,-18813,26828,-18786,26847,-18758,26866,-18731,26885,-18703,26905,-18676,26924,-18648,26943,-18621,26962,-18593,26981,-18565,27000,-18538,27019,-18510,27038,-18483,27057,-18455,27076,-18427,27094,-18399,27113,-18372,27132,-18344,27151,-18316,27170,-18288,27188,-18261,27207,-18233,27226,-18205,27244,-18177,27263,-18149,27281,-18121,27300,-18093,27319,-18065,27337,-18037,27355,-18009,27374,-17981,27392,-17953,27411,-17925,27429,-17897,27447,-17869,27466,-17841,27484,-17813,27502,-17785,27520,-17757,27538,-17728,27557,-17700,27575,-17672,27593,-17644,27611,-17616,27629,-17587,27647,-17559,27665,-17531,27683,-17502,27701,-17474,27719,-17446,27736,-17417,27754,-17389,27772,-17361,27790,-17332,27808,-17304,27825,-17275,27843,-17247,27861,-17218,27878,-17190,27896,-17161,27913,-17133,27931,-17104,27948,-17075,27966,-17047,27983,-17018,28001,-16990,28018,-16961,28036,-16932,28053,-16904,28070,-16875,28087,-16846,28105,-16817,28122,-16789,28139,-16760,28156,-16731,28173,-16702,28190,-16673,28208,-16644,28225,-16616,28242,-16587,28259,-16558,28275,-16529,28292,-16500,28309,-16471,28326,-16442,28343,-16413,28360}; +int16_t twb12288[8192] __attribute__((aligned(32))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394,-16384,-28378,-16413,-28361,-16442,-28344,-16471,-28327,-16500,-28310,-16529,-28293,-16558,-28276,-16587,-28260,-16616,-28243,-16644,-28226,-16673,-28209,-16702,-28191,-16731,-28174,-16760,-28157,-16789,-28140,-16817,-28123,-16846,-28106,-16875,-28088,-16904,-28071,-16932,-28054,-16961,-28037,-16990,-28019,-17018,-28002,-17047,-27984,-17075,-27967,-17104,-27949,-17133,-27932,-17161,-27914,-17190,-27897,-17218,-27879,-17247,-27862,-17275,-27844,-17304,-27826,-17332,-27809,-17361,-27791,-17389,-27773,-17417,-27755,-17446,-27737,-17474,-27720,-17502,-27702,-17531,-27684,-17559,-27666,-17587,-27648,-17616,-27630,-17644,-27612,-17672,-27594,-17700,-27576,-17728,-27558,-17757,-27539,-17785,-27521,-17813,-27503,-17841,-27485,-17869,-27467,-17897,-27448,-17925,-27430,-17953,-27412,-17981,-27393,-18009,-27375,-18037,-27356,-18065,-27338,-18093,-27320,-18121,-27301,-18149,-27282,-18177,-27264,-18205,-27245,-18233,-27227,-18261,-27208,-18288,-27189,-18316,-27171,-18344,-27152,-18372,-27133,-18399,-27114,-18427,-27095,-18455,-27077,-18483,-27058,-18510,-27039,-18538,-27020,-18565,-27001,-18593,-26982,-18621,-26963,-18648,-26944,-18676,-26925,-18703,-26906,-18731,-26886,-18758,-26867,-18786,-26848,-18813,-26829,-18841,-26810,-18868,-26790,-18895,-26771,-18923,-26752,-18950,-26732,-18977,-26713,-19005,-26693,-19032,-26674,-19059,-26655,-19087,-26635,-19114,-26616,-19141,-26596,-19168,-26576,-19195,-26557,-19222,-26537,-19250,-26517,-19277,-26498,-19304,-26478,-19331,-26458,-19358,-26438,-19385,-26419,-19412,-26399,-19439,-26379,-19466,-26359,-19493,-26339,-19520,-26319,-19547,-26299,-19574,-26279,-19600,-26259,-19627,-26239,-19654,-26219,-19681,-26199,-19708,-26179,-19734,-26159,-19761,-26138,-19788,-26118,-19815,-26098,-19841,-26078,-19868,-26057,-19895,-26037,-19921,-26017,-19948,-25996,-19974,-25976,-20001,-25955,-20027,-25935,-20054,-25914,-20080,-25894,-20107,-25873,-20133,-25853,-20160,-25832,-20186,-25812,-20213,-25791,-20239,-25770,-20265,-25750,-20292,-25729,-20318,-25708,-20344,-25687,-20370,-25666,-20397,-25646,-20423,-25625,-20449,-25604,-20475,-25583,-20501,-25562,-20528,-25541,-20554,-25520,-20580,-25499,-20606,-25478,-20632,-25457,-20658,-25436,-20684,-25415,-20710,-25393,-20736,-25372,-20762,-25351,-20788,-25330,-20814,-25308,-20839,-25287,-20865,-25266,-20891,-25244,-20917,-25223,-20943,-25202,-20968,-25180,-20994,-25159,-21020,-25137,-21046,-25116,-21071,-25094,-21097,-25073,-21123,-25051,-21148,-25030,-21174,-25008,-21199,-24986,-21225,-24965,-21250,-24943,-21276,-24921,-21301,-24899,-21327,-24878,-21352,-24856,-21378,-24834,-21403,-24812,-21428,-24790,-21454,-24768,-21479,-24746,-21504,-24724,-21530,-24702,-21555,-24680,-21580,-24658,-21605,-24636,-21630,-24614,-21656,-24592,-21681,-24570,-21706,-24547,-21731,-24525,-21756,-24503,-21781,-24481,-21806,-24458,-21831,-24436,-21856,-24414,-21881,-24391,-21906,-24369,-21931,-24347,-21956,-24324,-21981,-24302,-22005,-24279,-22030,-24257,-22055,-24234,-22080,-24212,-22105,-24189,-22129,-24166,-22154,-24144,-22179,-24121,-22203,-24098,-22228,-24076,-22253,-24053,-22277,-24030,-22302,-24007,-22326,-23985,-22351,-23962,-22375,-23939,-22400,-23916,-22424,-23893,-22449,-23870,-22473,-23847,-22497,-23824,-22522,-23801,-22546,-23778,-22570,-23755,-22595,-23732,-22619,-23709,-22643,-23686,-22667,-23662,-22692,-23639,-22716,-23616,-22740,-23593,-22764,-23570,-22788,-23546,-22812,-23523,-22836,-23500,-22860,-23476,-22884,-23453,-22908,-23429,-22932,-23406,-22956,-23383,-22980,-23359,-23004,-23336,-23028,-23312,-23051,-23288,-23075,-23265,-23099,-23241,-23123,-23218,-23147,-23194,-23170,-23170,-23194,-23147,-23218,-23123,-23241,-23099,-23265,-23075,-23288,-23051,-23312,-23028,-23336,-23004,-23359,-22980,-23383,-22956,-23406,-22932,-23429,-22908,-23453,-22884,-23476,-22860,-23500,-22836,-23523,-22812,-23546,-22788,-23570,-22764,-23593,-22740,-23616,-22716,-23639,-22692,-23662,-22667,-23686,-22643,-23709,-22619,-23732,-22595,-23755,-22570,-23778,-22546,-23801,-22522,-23824,-22497,-23847,-22473,-23870,-22449,-23893,-22424,-23916,-22400,-23939,-22375,-23962,-22351,-23985,-22326,-24007,-22302,-24030,-22277,-24053,-22253,-24076,-22228,-24098,-22203,-24121,-22179,-24144,-22154,-24166,-22129,-24189,-22105,-24212,-22080,-24234,-22055,-24257,-22030,-24279,-22005,-24302,-21981,-24324,-21956,-24347,-21931,-24369,-21906,-24391,-21881,-24414,-21856,-24436,-21831,-24458,-21806,-24481,-21781,-24503,-21756,-24525,-21731,-24547,-21706,-24570,-21681,-24592,-21656,-24614,-21630,-24636,-21605,-24658,-21580,-24680,-21555,-24702,-21530,-24724,-21504,-24746,-21479,-24768,-21454,-24790,-21428,-24812,-21403,-24834,-21378,-24856,-21352,-24878,-21327,-24899,-21301,-24921,-21276,-24943,-21250,-24965,-21225,-24986,-21199,-25008,-21174,-25030,-21148,-25051,-21123,-25073,-21097,-25094,-21071,-25116,-21046,-25137,-21020,-25159,-20994,-25180,-20968,-25202,-20943,-25223,-20917,-25244,-20891,-25266,-20865,-25287,-20839,-25308,-20814,-25330,-20788,-25351,-20762,-25372,-20736,-25393,-20710,-25415,-20684,-25436,-20658,-25457,-20632,-25478,-20606,-25499,-20580,-25520,-20554,-25541,-20528,-25562,-20501,-25583,-20475,-25604,-20449,-25625,-20423,-25646,-20397,-25666,-20370,-25687,-20344,-25708,-20318,-25729,-20292,-25750,-20265,-25770,-20239,-25791,-20213,-25812,-20186,-25832,-20160,-25853,-20133,-25873,-20107,-25894,-20080,-25914,-20054,-25935,-20027,-25955,-20001,-25976,-19974,-25996,-19948,-26017,-19921,-26037,-19895,-26057,-19868,-26078,-19841,-26098,-19815,-26118,-19788,-26138,-19761,-26159,-19734,-26179,-19708,-26199,-19681,-26219,-19654,-26239,-19627,-26259,-19600,-26279,-19574,-26299,-19547,-26319,-19520,-26339,-19493,-26359,-19466,-26379,-19439,-26399,-19412,-26419,-19385,-26438,-19358,-26458,-19331,-26478,-19304,-26498,-19277,-26517,-19250,-26537,-19222,-26557,-19195,-26576,-19168,-26596,-19141,-26616,-19114,-26635,-19087,-26655,-19059,-26674,-19032,-26693,-19005,-26713,-18977,-26732,-18950,-26752,-18923,-26771,-18895,-26790,-18868,-26810,-18841,-26829,-18813,-26848,-18786,-26867,-18758,-26886,-18731,-26906,-18703,-26925,-18676,-26944,-18648,-26963,-18621,-26982,-18593,-27001,-18565,-27020,-18538,-27039,-18510,-27058,-18483,-27077,-18455,-27095,-18427,-27114,-18399,-27133,-18372,-27152,-18344,-27171,-18316,-27189,-18288,-27208,-18261,-27227,-18233,-27245,-18205,-27264,-18177,-27282,-18149,-27301,-18121,-27320,-18093,-27338,-18065,-27356,-18037,-27375,-18009,-27393,-17981,-27412,-17953,-27430,-17925,-27448,-17897,-27467,-17869,-27485,-17841,-27503,-17813,-27521,-17785,-27539,-17757,-27558,-17728,-27576,-17700,-27594,-17672,-27612,-17644,-27630,-17616,-27648,-17587,-27666,-17559,-27684,-17531,-27702,-17502,-27720,-17474,-27737,-17446,-27755,-17417,-27773,-17389,-27791,-17361,-27809,-17332,-27826,-17304,-27844,-17275,-27862,-17247,-27879,-17218,-27897,-17190,-27914,-17161,-27932,-17133,-27949,-17104,-27967,-17075,-27984,-17047,-28002,-17018,-28019,-16990,-28037,-16961,-28054,-16932,-28071,-16904,-28088,-16875,-28106,-16846,-28123,-16817,-28140,-16789,-28157,-16760,-28174,-16731,-28191,-16702,-28209,-16673,-28226,-16644,-28243,-16616,-28260,-16587,-28276,-16558,-28293,-16529,-28310,-16500,-28327,-16471,-28344,-16442,-28361,-16413,-28378,-16384,-28394,-16355,-28411,-16326,-28428,-16297,-28444,-16268,-28461,-16239,-28478,-16210,-28494,-16180,-28511,-16151,-28527,-16122,-28544,-16093,-28560,-16064,-28576,-16035,-28593,-16005,-28609,-15976,-28626,-15947,-28642,-15918,-28658,-15888,-28674,-15859,-28691,-15830,-28707,-15800,-28723,-15771,-28739,-15741,-28755,-15712,-28771,-15683,-28787,-15653,-28803,-15624,-28819,-15594,-28835,-15565,-28851,-15535,-28867,-15506,-28883,-15476,-28898,-15447,-28914,-15417,-28930,-15388,-28946,-15358,-28961,-15328,-28977,-15299,-28993,-15269,-29008,-15239,-29024,-15210,-29039,-15180,-29055,-15150,-29070,-15121,-29086,-15091,-29101,-15061,-29117,-15031,-29132,-15002,-29147,-14972,-29163,-14942,-29178,-14912,-29193,-14882,-29208,-14853,-29223,-14823,-29239,-14793,-29254,-14763,-29269,-14733,-29284,-14703,-29299,-14673,-29314,-14643,-29329,-14613,-29344,-14583,-29359,-14553,-29373,-14523,-29388,-14493,-29403,-14463,-29418,-14433,-29433,-14403,-29447,-14373,-29462,-14343,-29477,-14312,-29491,-14282,-29506,-14252,-29520,-14222,-29535,-14192,-29549,-14161,-29564,-14131,-29578,-14101,-29593,-14071,-29607,-14040,-29622,-14010,-29636,-13980,-29650,-13950,-29664,-13919,-29679,-13889,-29693,-13859,-29707,-13828,-29721,-13798,-29735,-13767,-29749,-13737,-29763,-13707,-29777,-13676,-29791,-13646,-29805,-13615,-29819,-13585,-29833,-13554,-29847,-13524,-29861,-13493,-29874,-13463,-29888,-13432,-29902,-13401,-29916,-13371,-29929,-13340,-29943,-13310,-29956,-13279,-29970,-13248,-29984,-13218,-29997,-13187,-30010,-13156,-30024,-13126,-30037,-13095,-30051,-13064,-30064,-13034,-30077,-13003,-30091,-12972,-30104,-12941,-30117,-12910,-30130,-12880,-30143,-12849,-30157,-12818,-30170,-12787,-30183,-12756,-30196,-12725,-30209,-12695,-30222,-12664,-30235,-12633,-30248,-12602,-30260,-12571,-30273,-12540,-30286,-12509,-30299,-12478,-30312,-12447,-30324,-12416,-30337,-12385,-30350,-12354,-30362,-12323,-30375,-12292,-30387,-12261,-30400,-12230,-30412,-12199,-30425,-12167,-30437,-12136,-30450,-12105,-30462,-12074,-30474,-12043,-30487,-12012,-30499,-11981,-30511,-11949,-30523,-11918,-30536,-11887,-30548,-11856,-30560,-11824,-30572,-11793,-30584,-11762,-30596,-11731,-30608,-11699,-30620,-11668,-30632,-11637,-30644,-11605,-30656,-11574,-30667,-11543,-30679,-11511,-30691,-11480,-30703,-11449,-30714,-11417,-30726,-11386,-30738,-11354,-30749,-11323,-30761,-11291,-30772,-11260,-30784,-11228,-30795,-11197,-30807,-11165,-30818,-11134,-30829,-11102,-30841,-11071,-30852,-11039,-30863,-11008,-30875,-10976,-30886,-10945,-30897,-10913,-30908,-10881,-30919,-10850,-30930,-10818,-30941,-10787,-30952,-10755,-30963,-10723,-30974,-10692,-30985,-10660,-30996,-10628,-31007,-10597,-31018,-10565,-31029,-10533,-31039,-10501,-31050,-10470,-31061,-10438,-31071,-10406,-31082,-10374,-31093,-10343,-31103,-10311,-31114,-10279,-31124,-10247,-31135,-10215,-31145,-10183,-31155,-10152,-31166,-10120,-31176,-10088,-31186,-10056,-31197,-10024,-31207,-9992,-31217,-9960,-31227,-9928,-31237,-9896,-31248,-9864,-31258,-9832,-31268,-9800,-31278,-9768,-31288,-9736,-31298,-9704,-31308,-9672,-31317,-9640,-31327,-9608,-31337,-9576,-31347,-9544,-31357,-9512,-31366,-9480,-31376,-9448,-31386,-9416,-31395,-9384,-31405,-9352,-31414,-9320,-31424,-9288,-31433,-9255,-31443,-9223,-31452,-9191,-31462,-9159,-31471,-9127,-31480,-9095,-31490,-9062,-31499,-9030,-31508,-8998,-31517,-8966,-31526,-8933,-31535,-8901,-31545,-8869,-31554,-8837,-31563,-8804,-31572,-8772,-31581,-8740,-31589,-8708,-31598,-8675,-31607,-8643,-31616,-8611,-31625,-8578,-31634,-8546,-31642,-8514,-31651,-8481,-31660,-8449,-31668,-8416,-31677,-8384,-31685,-8352,-31694,-8319,-31702,-8287,-31711,-8254,-31719,-8222,-31728,-8190,-31736,-8157,-31744,-8125,-31753,-8092,-31761,-8060,-31769,-8027,-31777,-7995,-31786,-7962,-31794,-7930,-31802,-7897,-31810,-7865,-31818,-7832,-31826,-7800,-31834,-7767,-31842,-7734,-31850,-7702,-31857,-7669,-31865,-7637,-31873,-7604,-31881,-7572,-31889,-7539,-31896,-7506,-31904,-7474,-31912,-7441,-31919,-7408,-31927,-7376,-31934,-7343,-31942,-7311,-31949,-7278,-31957,-7245,-31964,-7212,-31971,-7180,-31979,-7147,-31986,-7114,-31993,-7082,-32000,-7049,-32008,-7016,-32015,-6983,-32022,-6951,-32029,-6918,-32036,-6885,-32043,-6852,-32050,-6820,-32057,-6787,-32064,-6754,-32071,-6721,-32078,-6689,-32085,-6656,-32091,-6623,-32098,-6590,-32105,-6557,-32111,-6524,-32118,-6492,-32125,-6459,-32131,-6426,-32138,-6393,-32144,-6360,-32151,-6327,-32157,-6294,-32164,-6262,-32170,-6229,-32177,-6196,-32183,-6163,-32189,-6130,-32195,-6097,-32202,-6064,-32208,-6031,-32214,-5998,-32220,-5965,-32226,-5932,-32232,-5899,-32238,-5866,-32244,-5833,-32250,-5800,-32256,-5767,-32262,-5734,-32268,-5701,-32274,-5668,-32279,-5635,-32285,-5602,-32291,-5569,-32296,-5536,-32302,-5503,-32308,-5470,-32313,-5437,-32319,-5404,-32324,-5371,-32330,-5338,-32335,-5305,-32341,-5272,-32346,-5239,-32351,-5206,-32357,-5173,-32362,-5140,-32367,-5107,-32372,-5073,-32378,-5040,-32383,-5007,-32388,-4974,-32393,-4941,-32398,-4908,-32403,-4875,-32408,-4842,-32413,-4808,-32418,-4775,-32423,-4742,-32427,-4709,-32432,-4676,-32437,-4643,-32442,-4609,-32446,-4576,-32451,-4543,-32456,-4510,-32460,-4477,-32465,-4444,-32469,-4410,-32474,-4377,-32478,-4344,-32483,-4311,-32487,-4277,-32492,-4244,-32496,-4211,-32500,-4178,-32504,-4145,-32509,-4111,-32513,-4078,-32517,-4045,-32521,-4012,-32525,-3978,-32529,-3945,-32533,-3912,-32537,-3878,-32541,-3845,-32545,-3812,-32549,-3779,-32553,-3745,-32557,-3712,-32560,-3679,-32564,-3645,-32568,-3612,-32572,-3579,-32575,-3546,-32579,-3512,-32582,-3479,-32586,-3446,-32589,-3412,-32593,-3379,-32596,-3346,-32600,-3312,-32603,-3279,-32606,-3246,-32610,-3212,-32613,-3179,-32616,-3146,-32619,-3112,-32623,-3079,-32626,-3045,-32629,-3012,-32632,-2979,-32635,-2945,-32638,-2912,-32641,-2879,-32644,-2845,-32647,-2812,-32650,-2778,-32652,-2745,-32655,-2712,-32658,-2678,-32661,-2645,-32663,-2611,-32666,-2578,-32669,-2545,-32671,-2511,-32674,-2478,-32676,-2444,-32679,-2411,-32681,-2378,-32684,-2344,-32686,-2311,-32688,-2277,-32691,-2244,-32693,-2210,-32695,-2177,-32697,-2144,-32700,-2110,-32702,-2077,-32704,-2043,-32706,-2010,-32708,-1976,-32710,-1943,-32712,-1909,-32714,-1876,-32716,-1843,-32718,-1809,-32719,-1776,-32721,-1742,-32723,-1709,-32725,-1675,-32726,-1642,-32728,-1608,-32730,-1575,-32731,-1541,-32733,-1508,-32734,-1474,-32736,-1441,-32737,-1407,-32739,-1374,-32740,-1340,-32741,-1307,-32743,-1274,-32744,-1240,-32745,-1207,-32747,-1173,-32748,-1140,-32749,-1106,-32750,-1073,-32751,-1039,-32752,-1006,-32753,-972,-32754,-939,-32755,-905,-32756,-872,-32757,-838,-32758,-805,-32758,-771,-32759,-738,-32760,-704,-32761,-671,-32761,-637,-32762,-604,-32763,-570,-32763,-537,-32764,-503,-32764,-470,-32765,-436,-32765,-403,-32765,-369,-32766,-336,-32766,-302,-32766,-269,-32767,-235,-32767,-202,-32767,-168,-32767,-135,-32767,-101,-32767,-68,-32767,-34,-32767,-1,-32767,33,-32767,67,-32767,100,-32767,134,-32767,167,-32767,201,-32767,234,-32766,268,-32766,301,-32766,335,-32765,368,-32765,402,-32765,435,-32764,469,-32764,502,-32763,536,-32763,569,-32762,603,-32761,636,-32761,670,-32760,703,-32759,737,-32758,770,-32758,804,-32757,837,-32756,871,-32755,904,-32754,938,-32753,971,-32752,1005,-32751,1038,-32750,1072,-32749,1105,-32748,1139,-32747,1172,-32745,1206,-32744,1239,-32743,1273,-32741,1306,-32740,1339,-32739,1373,-32737,1406,-32736,1440,-32734,1473,-32733,1507,-32731,1540,-32730,1574,-32728,1607,-32726,1641,-32725,1674,-32723,1708,-32721,1741,-32719,1775,-32718,1808,-32716,1842,-32714,1875,-32712,1908,-32710,1942,-32708,1975,-32706,2009,-32704,2042,-32702,2076,-32700,2109,-32697,2143,-32695,2176,-32693,2209,-32691,2243,-32688,2276,-32686,2310,-32684,2343,-32681,2377,-32679,2410,-32676,2443,-32674,2477,-32671,2510,-32669,2544,-32666,2577,-32663,2610,-32661,2644,-32658,2677,-32655,2711,-32652,2744,-32650,2777,-32647,2811,-32644,2844,-32641,2878,-32638,2911,-32635,2944,-32632,2978,-32629,3011,-32626,3044,-32623,3078,-32619,3111,-32616,3145,-32613,3178,-32610,3211,-32606,3245,-32603,3278,-32600,3311,-32596,3345,-32593,3378,-32589,3411,-32586,3445,-32582,3478,-32579,3511,-32575,3545,-32572,3578,-32568,3611,-32564,3644,-32560,3678,-32557,3711,-32553,3744,-32549,3778,-32545,3811,-32541,3844,-32537,3877,-32533,3911,-32529,3944,-32525,3977,-32521,4011,-32517,4044,-32513,4077,-32509,4110,-32504,4144,-32500,4177,-32496,4210,-32492,4243,-32487,4276,-32483,4310,-32478,4343,-32474,4376,-32469,4409,-32465,4443,-32460,4476,-32456,4509,-32451,4542,-32446,4575,-32442,4608,-32437,4642,-32432,4675,-32427,4708,-32423,4741,-32418,4774,-32413,4807,-32408,4841,-32403,4874,-32398,4907,-32393,4940,-32388,4973,-32383,5006,-32378,5039,-32372,5072,-32367,5106,-32362,5139,-32357,5172,-32351,5205,-32346,5238,-32341,5271,-32335,5304,-32330,5337,-32324,5370,-32319,5403,-32313,5436,-32308,5469,-32302,5502,-32296,5535,-32291,5568,-32285,5601,-32279,5634,-32274,5667,-32268,5700,-32262,5733,-32256,5766,-32250,5799,-32244,5832,-32238,5865,-32232,5898,-32226,5931,-32220,5964,-32214,5997,-32208,6030,-32202,6063,-32195,6096,-32189,6129,-32183,6162,-32177,6195,-32170,6228,-32164,6261,-32157,6293,-32151,6326,-32144,6359,-32138,6392,-32131,6425,-32125,6458,-32118,6491,-32111,6523,-32105,6556,-32098,6589,-32091,6622,-32085,6655,-32078,6688,-32071,6720,-32064,6753,-32057,6786,-32050,6819,-32043,6851,-32036,6884,-32029,6917,-32022,6950,-32015,6982,-32008,7015,-32000,7048,-31993,7081,-31986,7113,-31979,7146,-31971,7179,-31964,7211,-31957,7244,-31949,7277,-31942,7310,-31934,7342,-31927,7375,-31919,7407,-31912,7440,-31904,7473,-31896,7505,-31889,7538,-31881,7571,-31873,7603,-31865,7636,-31857,7668,-31850,7701,-31842,7733,-31834,7766,-31826,7799,-31818,7831,-31810,7864,-31802,7896,-31794,7929,-31786,7961,-31777,7994,-31769,8026,-31761,8059,-31753,8091,-31744,8124,-31736,8156,-31728,8189,-31719,8221,-31711,8253,-31702,8286,-31694,8318,-31685,8351,-31677,8383,-31668,8415,-31660,8448,-31651,8480,-31642,8513,-31634,8545,-31625,8577,-31616,8610,-31607,8642,-31598,8674,-31589,8707,-31581,8739,-31572,8771,-31563,8803,-31554,8836,-31545,8868,-31535,8900,-31526,8932,-31517,8965,-31508,8997,-31499,9029,-31490,9061,-31480,9094,-31471,9126,-31462,9158,-31452,9190,-31443,9222,-31433,9254,-31424,9287,-31414,9319,-31405,9351,-31395,9383,-31386,9415,-31376,9447,-31366,9479,-31357,9511,-31347,9543,-31337,9575,-31327,9607,-31317,9639,-31308,9671,-31298,9703,-31288,9735,-31278,9767,-31268,9799,-31258,9831,-31248,9863,-31237,9895,-31227,9927,-31217,9959,-31207,9991,-31197,10023,-31186,10055,-31176,10087,-31166,10119,-31155,10151,-31145,10182,-31135,10214,-31124,10246,-31114,10278,-31103,10310,-31093,10342,-31082,10373,-31071,10405,-31061,10437,-31050,10469,-31039,10500,-31029,10532,-31018,10564,-31007,10596,-30996,10627,-30985,10659,-30974,10691,-30963,10722,-30952,10754,-30941,10786,-30930,10817,-30919,10849,-30908,10880,-30897,10912,-30886,10944,-30875,10975,-30863,11007,-30852,11038,-30841,11070,-30829,11101,-30818,11133,-30807,11164,-30795,11196,-30784,11227,-30772,11259,-30761,11290,-30749,11322,-30738,11353,-30726,11385,-30714,11416,-30703,11448,-30691,11479,-30679,11510,-30667,11542,-30656,11573,-30644,11604,-30632,11636,-30620,11667,-30608,11698,-30596,11730,-30584,11761,-30572,11792,-30560,11823,-30548,11855,-30536,11886,-30523,11917,-30511,11948,-30499,11980,-30487,12011,-30474,12042,-30462,12073,-30450,12104,-30437,12135,-30425,12166,-30412,12198,-30400,12229,-30387,12260,-30375,12291,-30362,12322,-30350,12353,-30337,12384,-30324,12415,-30312,12446,-30299,12477,-30286,12508,-30273,12539,-30260,12570,-30248,12601,-30235,12632,-30222,12663,-30209,12694,-30196,12724,-30183,12755,-30170,12786,-30157,12817,-30143,12848,-30130,12879,-30117,12909,-30104,12940,-30091,12971,-30077,13002,-30064,13033,-30051,13063,-30037,13094,-30024,13125,-30010,13155,-29997,13186,-29984,13217,-29970,13247,-29956,13278,-29943,13309,-29929,13339,-29916,13370,-29902,13400,-29888,13431,-29874,13462,-29861,13492,-29847,13523,-29833,13553,-29819,13584,-29805,13614,-29791,13645,-29777,13675,-29763,13706,-29749,13736,-29735,13766,-29721,13797,-29707,13827,-29693,13858,-29679,13888,-29664,13918,-29650,13949,-29636,13979,-29622,14009,-29607,14039,-29593,14070,-29578,14100,-29564,14130,-29549,14160,-29535,14191,-29520,14221,-29506,14251,-29491,14281,-29477,14311,-29462,14342,-29447,14372,-29433,14402,-29418,14432,-29403,14462,-29388,14492,-29373,14522,-29359,14552,-29344,14582,-29329,14612,-29314,14642,-29299,14672,-29284,14702,-29269,14732,-29254,14762,-29239,14792,-29223,14822,-29208,14852,-29193,14881,-29178,14911,-29163,14941,-29147,14971,-29132,15001,-29117,15030,-29101,15060,-29086,15090,-29070,15120,-29055,15149,-29039,15179,-29024,15209,-29008,15238,-28993,15268,-28977,15298,-28961,15327,-28946,15357,-28930,15387,-28914,15416,-28898,15446,-28883,15475,-28867,15505,-28851,15534,-28835,15564,-28819,15593,-28803,15623,-28787,15652,-28771,15682,-28755,15711,-28739,15740,-28723,15770,-28707,15799,-28691,15829,-28674,15858,-28658,15887,-28642,15917,-28626,15946,-28609,15975,-28593,16004,-28576,16034,-28560,16063,-28544,16092,-28527,16121,-28511,16150,-28494,16179,-28478,16209,-28461,16238,-28444,16267,-28428,16296,-28411,16325,-28394,16354,-28378,16383,-28361,16412,-28344,16441,-28327,16470,-28310,16499,-28293,16528,-28276,16557,-28260,16586,-28243,16615,-28226,16643,-28209,16672,-28191,16701,-28174,16730,-28157,16759,-28140,16788,-28123,16816,-28106,16845,-28088,16874,-28071,16903,-28054,16931,-28037,16960,-28019,16989,-28002,17017,-27984,17046,-27967,17074,-27949,17103,-27932,17132,-27914,17160,-27897,17189,-27879,17217,-27862,17246,-27844,17274,-27826,17303,-27809,17331,-27791,17360,-27773,17388,-27755,17416,-27737,17445,-27720,17473,-27702,17501,-27684,17530,-27666,17558,-27648,17586,-27630,17615,-27612,17643,-27594,17671,-27576,17699,-27558,17727,-27539,17756,-27521,17784,-27503,17812,-27485,17840,-27467,17868,-27448,17896,-27430,17924,-27412,17952,-27393,17980,-27375,18008,-27356,18036,-27338,18064,-27320,18092,-27301,18120,-27282,18148,-27264,18176,-27245,18204,-27227,18232,-27208,18260,-27189,18287,-27171,18315,-27152,18343,-27133,18371,-27114,18398,-27095,18426,-27077,18454,-27058,18482,-27039,18509,-27020,18537,-27001,18564,-26982,18592,-26963,18620,-26944,18647,-26925,18675,-26906,18702,-26886,18730,-26867,18757,-26848,18785,-26829,18812,-26810,18840,-26790,18867,-26771,18894,-26752,18922,-26732,18949,-26713,18976,-26693,19004,-26674,19031,-26655,19058,-26635,19086,-26616,19113,-26596,19140,-26576,19167,-26557,19194,-26537,19221,-26517,19249,-26498,19276,-26478,19303,-26458,19330,-26438,19357,-26419,19384,-26399,19411,-26379,19438,-26359,19465,-26339,19492,-26319,19519,-26299,19546,-26279,19573,-26259,19599,-26239,19626,-26219,19653,-26199,19680,-26179,19707,-26159,19733,-26138,19760,-26118,19787,-26098,19814,-26078,19840,-26057,19867,-26037,19894,-26017,19920,-25996,19947,-25976,19973,-25955,20000,-25935,20026,-25914,20053,-25894,20079,-25873,20106,-25853,20132,-25832,20159,-25812,20185,-25791,20212,-25770,20238,-25750,20264,-25729,20291,-25708,20317,-25687,20343,-25666,20369,-25646,20396,-25625,20422,-25604,20448,-25583,20474,-25562,20500,-25541,20527,-25520,20553,-25499,20579,-25478,20605,-25457,20631,-25436,20657,-25415,20683,-25393,20709,-25372,20735,-25351,20761,-25330,20787,-25308,20813,-25287,20838,-25266,20864,-25244,20890,-25223,20916,-25202,20942,-25180,20967,-25159,20993,-25137,21019,-25116,21045,-25094,21070,-25073,21096,-25051,21122,-25030,21147,-25008,21173,-24986,21198,-24965,21224,-24943,21249,-24921,21275,-24899,21300,-24878,21326,-24856,21351,-24834,21377,-24812,21402,-24790,21427,-24768,21453,-24746,21478,-24724,21503,-24702,21529,-24680,21554,-24658,21579,-24636,21604,-24614,21629,-24592,21655,-24570,21680,-24547,21705,-24525,21730,-24503,21755,-24481,21780,-24458,21805,-24436,21830,-24414,21855,-24391,21880,-24369,21905,-24347,21930,-24324,21955,-24302,21980,-24279,22004,-24257,22029,-24234,22054,-24212,22079,-24189,22104,-24166,22128,-24144,22153,-24121,22178,-24098,22202,-24076,22227,-24053,22252,-24030,22276,-24007,22301,-23985,22325,-23962,22350,-23939,22374,-23916,22399,-23893,22423,-23870,22448,-23847,22472,-23824,22496,-23801,22521,-23778,22545,-23755,22569,-23732,22594,-23709,22618,-23686,22642,-23662,22666,-23639,22691,-23616,22715,-23593,22739,-23570,22763,-23546,22787,-23523,22811,-23500,22835,-23476,22859,-23453,22883,-23429,22907,-23406,22931,-23383,22955,-23359,22979,-23336,23003,-23312,23027,-23288,23050,-23265,23074,-23241,23098,-23218,23122,-23194,23146,-23170,23169,-23147,23193,-23123,23217,-23099,23240,-23075,23264,-23051,23287,-23028,23311,-23004,23335,-22980,23358,-22956,23382,-22932,23405,-22908,23428,-22884,23452,-22860,23475,-22836,23499,-22812,23522,-22788,23545,-22764,23569,-22740,23592,-22716,23615,-22692,23638,-22667,23661,-22643,23685,-22619,23708,-22595,23731,-22570,23754,-22546,23777,-22522,23800,-22497,23823,-22473,23846,-22449,23869,-22424,23892,-22400,23915,-22375,23938,-22351,23961,-22326,23984,-22302,24006,-22277,24029,-22253,24052,-22228,24075,-22203,24097,-22179,24120,-22154,24143,-22129,24165,-22105,24188,-22080,24211,-22055,24233,-22030,24256,-22005,24278,-21981,24301,-21956,24323,-21931,24346,-21906,24368,-21881,24390,-21856,24413,-21831,24435,-21806,24457,-21781,24480,-21756,24502,-21731,24524,-21706,24546,-21681,24569,-21656,24591,-21630,24613,-21605,24635,-21580,24657,-21555,24679,-21530,24701,-21504,24723,-21479,24745,-21454,24767,-21428,24789,-21403,24811,-21378,24833,-21352,24855,-21327,24877,-21301,24898,-21276,24920,-21250,24942,-21225,24964,-21199,24985,-21174,25007,-21148,25029,-21123,25050,-21097,25072,-21071,25093,-21046,25115,-21020,25136,-20994,25158,-20968,25179,-20943,25201,-20917,25222,-20891,25243,-20865,25265,-20839,25286,-20814,25307,-20788,25329,-20762,25350,-20736,25371,-20710,25392,-20684,25414,-20658,25435,-20632,25456,-20606,25477,-20580,25498,-20554,25519,-20528,25540,-20501,25561,-20475,25582,-20449,25603,-20423,25624,-20397,25645,-20370,25665,-20344,25686,-20318,25707,-20292,25728,-20265,25749,-20239,25769,-20213,25790,-20186,25811,-20160,25831,-20133,25852,-20107,25872,-20080,25893,-20054,25913,-20027,25934,-20001,25954,-19974,25975,-19948,25995,-19921,26016,-19895,26036,-19868,26056,-19841,26077,-19815,26097,-19788,26117,-19761,26137,-19734,26158,-19708,26178,-19681,26198,-19654,26218,-19627,26238,-19600,26258,-19574,26278,-19547,26298,-19520,26318,-19493,26338,-19466,26358,-19439,26378,-19412,26398,-19385,26418,-19358,26437,-19331,26457,-19304,26477,-19277,26497,-19250,26516,-19222,26536,-19195,26556,-19168,26575,-19141,26595,-19114,26615,-19087,26634,-19059,26654,-19032,26673,-19005,26692,-18977,26712,-18950,26731,-18923,26751,-18895,26770,-18868,26789,-18841,26809,-18813,26828,-18786,26847,-18758,26866,-18731,26885,-18703,26905,-18676,26924,-18648,26943,-18621,26962,-18593,26981,-18565,27000,-18538,27019,-18510,27038,-18483,27057,-18455,27076,-18427,27094,-18399,27113,-18372,27132,-18344,27151,-18316,27170,-18288,27188,-18261,27207,-18233,27226,-18205,27244,-18177,27263,-18149,27281,-18121,27300,-18093,27319,-18065,27337,-18037,27355,-18009,27374,-17981,27392,-17953,27411,-17925,27429,-17897,27447,-17869,27466,-17841,27484,-17813,27502,-17785,27520,-17757,27538,-17728,27557,-17700,27575,-17672,27593,-17644,27611,-17616,27629,-17587,27647,-17559,27665,-17531,27683,-17502,27701,-17474,27719,-17446,27736,-17417,27754,-17389,27772,-17361,27790,-17332,27808,-17304,27825,-17275,27843,-17247,27861,-17218,27878,-17190,27896,-17161,27913,-17133,27931,-17104,27948,-17075,27966,-17047,27983,-17018,28001,-16990,28018,-16961,28036,-16932,28053,-16904,28070,-16875,28087,-16846,28105,-16817,28122,-16789,28139,-16760,28156,-16731,28173,-16702,28190,-16673,28208,-16644,28225,-16616,28242,-16587,28259,-16558,28275,-16529,28292,-16500,28309,-16471,28326,-16442,28343,-16413,28360}; diff --git a/openair1/PHY/TOOLS/twiddle24576.h b/openair1/PHY/TOOLS/twiddle24576.h index 46cdb97a5b..b233990bea 100644 --- a/openair1/PHY/TOOLS/twiddle24576.h +++ b/openair1/PHY/TOOLS/twiddle24576.h @@ -39,6 +39,6 @@ twb2(2:2:end) = imag(twb); */ -int16_t twa24576[16384] __attribute__((aligned(16))) = {32767,0,32766,-9,32766,-17,32766,-26,32766,-34,32766,-42,32766,-51,32766,-59,32766,-68,32766,-76,32766,-84,32766,-93,32766,-101,32766,-109,32766,-118,32766,-126,32766,-135,32766,-143,32766,-151,32766,-160,32766,-168,32766,-176,32766,-185,32766,-193,32766,-202,32766,-210,32766,-218,32766,-227,32766,-235,32766,-243,32766,-252,32765,-260,32765,-269,32765,-277,32765,-285,32765,-294,32765,-302,32765,-310,32765,-319,32765,-327,32765,-336,32765,-344,32765,-352,32765,-361,32764,-369,32764,-377,32764,-386,32764,-394,32764,-403,32764,-411,32764,-419,32764,-428,32764,-436,32763,-444,32763,-453,32763,-461,32763,-470,32763,-478,32763,-486,32763,-495,32763,-503,32763,-511,32762,-520,32762,-528,32762,-537,32762,-545,32762,-553,32762,-562,32762,-570,32761,-579,32761,-587,32761,-595,32761,-604,32761,-612,32761,-620,32760,-629,32760,-637,32760,-646,32760,-654,32760,-662,32760,-671,32759,-679,32759,-687,32759,-696,32759,-704,32759,-713,32759,-721,32758,-729,32758,-738,32758,-746,32758,-754,32758,-763,32757,-771,32757,-780,32757,-788,32757,-796,32757,-805,32756,-813,32756,-821,32756,-830,32756,-838,32756,-847,32755,-855,32755,-863,32755,-872,32755,-880,32754,-888,32754,-897,32754,-905,32754,-914,32754,-922,32753,-930,32753,-939,32753,-947,32753,-955,32752,-964,32752,-972,32752,-981,32752,-989,32751,-997,32751,-1006,32751,-1014,32751,-1022,32750,-1031,32750,-1039,32750,-1047,32750,-1056,32749,-1064,32749,-1073,32749,-1081,32748,-1089,32748,-1098,32748,-1106,32748,-1114,32747,-1123,32747,-1131,32747,-1140,32746,-1148,32746,-1156,32746,-1165,32746,-1173,32745,-1181,32745,-1190,32745,-1198,32744,-1207,32744,-1215,32744,-1223,32743,-1232,32743,-1240,32743,-1248,32742,-1257,32742,-1265,32742,-1274,32741,-1282,32741,-1290,32741,-1299,32740,-1307,32740,-1315,32740,-1324,32739,-1332,32739,-1340,32739,-1349,32738,-1357,32738,-1366,32738,-1374,32737,-1382,32737,-1391,32737,-1399,32736,-1407,32736,-1416,32736,-1424,32735,-1433,32735,-1441,32734,-1449,32734,-1458,32734,-1466,32733,-1474,32733,-1483,32733,-1491,32732,-1500,32732,-1508,32731,-1516,32731,-1525,32731,-1533,32730,-1541,32730,-1550,32729,-1558,32729,-1566,32729,-1575,32728,-1583,32728,-1592,32727,-1600,32727,-1608,32727,-1617,32726,-1625,32726,-1633,32725,-1642,32725,-1650,32725,-1659,32724,-1667,32724,-1675,32723,-1684,32723,-1692,32722,-1700,32722,-1709,32722,-1717,32721,-1725,32721,-1734,32720,-1742,32720,-1751,32719,-1759,32719,-1767,32718,-1776,32718,-1784,32717,-1792,32717,-1801,32717,-1809,32716,-1817,32716,-1826,32715,-1834,32715,-1843,32714,-1851,32714,-1859,32713,-1868,32713,-1876,32712,-1884,32712,-1893,32711,-1901,32711,-1909,32710,-1918,32710,-1926,32709,-1935,32709,-1943,32708,-1951,32708,-1960,32707,-1968,32707,-1976,32706,-1985,32706,-1993,32705,-2001,32705,-2010,32704,-2018,32704,-2027,32703,-2035,32703,-2043,32702,-2052,32702,-2060,32701,-2068,32701,-2077,32700,-2085,32700,-2093,32699,-2102,32699,-2110,32698,-2118,32697,-2127,32697,-2135,32696,-2144,32696,-2152,32695,-2160,32695,-2169,32694,-2177,32694,-2185,32693,-2194,32692,-2202,32692,-2210,32691,-2219,32691,-2227,32690,-2236,32690,-2244,32689,-2252,32688,-2261,32688,-2269,32687,-2277,32687,-2286,32686,-2294,32686,-2302,32685,-2311,32684,-2319,32684,-2327,32683,-2336,32683,-2344,32682,-2353,32681,-2361,32681,-2369,32680,-2378,32680,-2386,32679,-2394,32678,-2403,32678,-2411,32677,-2419,32676,-2428,32676,-2436,32675,-2444,32675,-2453,32674,-2461,32673,-2469,32673,-2478,32672,-2486,32671,-2495,32671,-2503,32670,-2511,32670,-2520,32669,-2528,32668,-2536,32668,-2545,32667,-2553,32666,-2561,32666,-2570,32665,-2578,32664,-2586,32664,-2595,32663,-2603,32662,-2611,32662,-2620,32661,-2628,32660,-2637,32660,-2645,32659,-2653,32658,-2662,32658,-2670,32657,-2678,32656,-2687,32656,-2695,32655,-2703,32654,-2712,32653,-2720,32653,-2728,32652,-2737,32651,-2745,32651,-2753,32650,-2762,32649,-2770,32649,-2778,32648,-2787,32647,-2795,32646,-2803,32646,-2812,32645,-2820,32644,-2829,32644,-2837,32643,-2845,32642,-2854,32641,-2862,32641,-2870,32640,-2879,32639,-2887,32638,-2895,32638,-2904,32637,-2912,32636,-2920,32635,-2929,32635,-2937,32634,-2945,32633,-2954,32632,-2962,32632,-2970,32631,-2979,32630,-2987,32629,-2995,32629,-3004,32628,-3012,32627,-3020,32626,-3029,32625,-3037,32625,-3045,32624,-3054,32623,-3062,32622,-3070,32622,-3079,32621,-3087,32620,-3095,32619,-3104,32618,-3112,32618,-3121,32617,-3129,32616,-3137,32615,-3146,32614,-3154,32614,-3162,32613,-3171,32612,-3179,32611,-3187,32610,-3196,32610,-3204,32609,-3212,32608,-3221,32607,-3229,32606,-3237,32605,-3246,32605,-3254,32604,-3262,32603,-3271,32602,-3279,32601,-3287,32600,-3296,32600,-3304,32599,-3312,32598,-3321,32597,-3329,32596,-3337,32595,-3346,32594,-3354,32594,-3362,32593,-3371,32592,-3379,32591,-3387,32590,-3396,32589,-3404,32588,-3412,32588,-3421,32587,-3429,32586,-3437,32585,-3446,32584,-3454,32583,-3462,32582,-3471,32581,-3479,32580,-3487,32580,-3496,32579,-3504,32578,-3512,32577,-3521,32576,-3529,32575,-3537,32574,-3546,32573,-3554,32572,-3562,32571,-3571,32571,-3579,32570,-3587,32569,-3595,32568,-3604,32567,-3612,32566,-3620,32565,-3629,32564,-3637,32563,-3645,32562,-3654,32561,-3662,32560,-3670,32559,-3679,32558,-3687,32558,-3695,32557,-3704,32556,-3712,32555,-3720,32554,-3729,32553,-3737,32552,-3745,32551,-3754,32550,-3762,32549,-3770,32548,-3779,32547,-3787,32546,-3795,32545,-3804,32544,-3812,32543,-3820,32542,-3829,32541,-3837,32540,-3845,32539,-3854,32538,-3862,32537,-3870,32536,-3878,32535,-3887,32534,-3895,32533,-3903,32532,-3912,32531,-3920,32530,-3928,32529,-3937,32528,-3945,32527,-3953,32526,-3962,32525,-3970,32524,-3978,32523,-3987,32522,-3995,32521,-4003,32520,-4012,32519,-4020,32518,-4028,32517,-4036,32516,-4045,32515,-4053,32514,-4061,32513,-4070,32512,-4078,32511,-4086,32510,-4095,32509,-4103,32508,-4111,32507,-4120,32506,-4128,32504,-4136,32503,-4145,32502,-4153,32501,-4161,32500,-4169,32499,-4178,32498,-4186,32497,-4194,32496,-4203,32495,-4211,32494,-4219,32493,-4228,32492,-4236,32491,-4244,32489,-4253,32488,-4261,32487,-4269,32486,-4277,32485,-4286,32484,-4294,32483,-4302,32482,-4311,32481,-4319,32480,-4327,32478,-4336,32477,-4344,32476,-4352,32475,-4360,32474,-4369,32473,-4377,32472,-4385,32471,-4394,32470,-4402,32468,-4410,32467,-4419,32466,-4427,32465,-4435,32464,-4444,32463,-4452,32462,-4460,32460,-4468,32459,-4477,32458,-4485,32457,-4493,32456,-4502,32455,-4510,32454,-4518,32452,-4526,32451,-4535,32450,-4543,32449,-4551,32448,-4560,32447,-4568,32445,-4576,32444,-4585,32443,-4593,32442,-4601,32441,-4609,32440,-4618,32438,-4626,32437,-4634,32436,-4643,32435,-4651,32434,-4659,32432,-4667,32431,-4676,32430,-4684,32429,-4692,32428,-4701,32426,-4709,32425,-4717,32424,-4726,32423,-4734,32422,-4742,32420,-4750,32419,-4759,32418,-4767,32417,-4775,32416,-4784,32414,-4792,32413,-4800,32412,-4808,32411,-4817,32409,-4825,32408,-4833,32407,-4842,32406,-4850,32404,-4858,32403,-4866,32402,-4875,32401,-4883,32399,-4891,32398,-4900,32397,-4908,32396,-4916,32394,-4924,32393,-4933,32392,-4941,32391,-4949,32389,-4958,32388,-4966,32387,-4974,32386,-4982,32384,-4991,32383,-4999,32382,-5007,32380,-5015,32379,-5024,32378,-5032,32377,-5040,32375,-5049,32374,-5057,32373,-5065,32371,-5073,32370,-5082,32369,-5090,32368,-5098,32366,-5107,32365,-5115,32364,-5123,32362,-5131,32361,-5140,32360,-5148,32358,-5156,32357,-5164,32356,-5173,32354,-5181,32353,-5189,32352,-5198,32350,-5206,32349,-5214,32348,-5222,32346,-5231,32345,-5239,32344,-5247,32342,-5255,32341,-5264,32340,-5272,32338,-5280,32337,-5288,32336,-5297,32334,-5305,32333,-5313,32332,-5322,32330,-5330,32329,-5338,32327,-5346,32326,-5355,32325,-5363,32323,-5371,32322,-5379,32321,-5388,32319,-5396,32318,-5404,32316,-5412,32315,-5421,32314,-5429,32312,-5437,32311,-5446,32310,-5454,32308,-5462,32307,-5470,32305,-5479,32304,-5487,32303,-5495,32301,-5503,32300,-5512,32298,-5520,32297,-5528,32295,-5536,32294,-5545,32293,-5553,32291,-5561,32290,-5569,32288,-5578,32287,-5586,32286,-5594,32284,-5602,32283,-5611,32281,-5619,32280,-5627,32278,-5635,32277,-5644,32275,-5652,32274,-5660,32273,-5668,32271,-5677,32270,-5685,32268,-5693,32267,-5701,32265,-5710,32264,-5718,32262,-5726,32261,-5734,32259,-5743,32258,-5751,32256,-5759,32255,-5767,32254,-5776,32252,-5784,32251,-5792,32249,-5800,32248,-5809,32246,-5817,32245,-5825,32243,-5833,32242,-5842,32240,-5850,32239,-5858,32237,-5866,32236,-5875,32234,-5883,32233,-5891,32231,-5899,32230,-5908,32228,-5916,32227,-5924,32225,-5932,32224,-5941,32222,-5949,32221,-5957,32219,-5965,32218,-5973,32216,-5982,32214,-5990,32213,-5998,32211,-6006,32210,-6015,32208,-6023,32207,-6031,32205,-6039,32204,-6048,32202,-6056,32201,-6064,32199,-6072,32197,-6081,32196,-6089,32194,-6097,32193,-6105,32191,-6113,32190,-6122,32188,-6130,32187,-6138,32185,-6146,32183,-6155,32182,-6163,32180,-6171,32179,-6179,32177,-6187,32176,-6196,32174,-6204,32172,-6212,32171,-6220,32169,-6229,32168,-6237,32166,-6245,32164,-6253,32163,-6262,32161,-6270,32160,-6278,32158,-6286,32156,-6294,32155,-6303,32153,-6311,32152,-6319,32150,-6327,32148,-6335,32147,-6344,32145,-6352,32143,-6360,32142,-6368,32140,-6377,32139,-6385,32137,-6393,32135,-6401,32134,-6409,32132,-6418,32130,-6426,32129,-6434,32127,-6442,32125,-6451,32124,-6459,32122,-6467,32120,-6475,32119,-6483,32117,-6492,32115,-6500,32114,-6508,32112,-6516,32110,-6524,32109,-6533,32107,-6541,32105,-6549,32104,-6557,32102,-6565,32100,-6574,32099,-6582,32097,-6590,32095,-6598,32094,-6607,32092,-6615,32090,-6623,32089,-6631,32087,-6639,32085,-6648,32084,-6656,32082,-6664,32080,-6672,32078,-6680,32077,-6689,32075,-6697,32073,-6705,32072,-6713,32070,-6721,32068,-6730,32066,-6738,32065,-6746,32063,-6754,32061,-6762,32059,-6771,32058,-6779,32056,-6787,32054,-6795,32053,-6803,32051,-6812,32049,-6820,32047,-6828,32046,-6836,32044,-6844,32042,-6852,32040,-6861,32039,-6869,32037,-6877,32035,-6885,32033,-6893,32032,-6902,32030,-6910,32028,-6918,32026,-6926,32024,-6934,32023,-6943,32021,-6951,32019,-6959,32017,-6967,32016,-6975,32014,-6983,32012,-6992,32010,-7000,32008,-7008,32007,-7016,32005,-7024,32003,-7033,32001,-7041,31999,-7049,31998,-7057,31996,-7065,31994,-7073,31992,-7082,31990,-7090,31989,-7098,31987,-7106,31985,-7114,31983,-7123,31981,-7131,31979,-7139,31978,-7147,31976,-7155,31974,-7163,31972,-7172,31970,-7180,31968,-7188,31967,-7196,31965,-7204,31963,-7212,31961,-7221,31959,-7229,31957,-7237,31956,-7245,31954,-7253,31952,-7262,31950,-7270,31948,-7278,31946,-7286,31944,-7294,31943,-7302,31941,-7311,31939,-7319,31937,-7327,31935,-7335,31933,-7343,31931,-7351,31929,-7359,31928,-7368,31926,-7376,31924,-7384,31922,-7392,31920,-7400,31918,-7408,31916,-7417,31914,-7425,31912,-7433,31911,-7441,31909,-7449,31907,-7457,31905,-7466,31903,-7474,31901,-7482,31899,-7490,31897,-7498,31895,-7506,31893,-7515,31891,-7523,31889,-7531,31888,-7539,31886,-7547,31884,-7555,31882,-7563,31880,-7572,31878,-7580,31876,-7588,31874,-7596,31872,-7604,31870,-7612,31868,-7620,31866,-7629,31864,-7637,31862,-7645,31860,-7653,31858,-7661,31856,-7669,31854,-7677,31853,-7686,31851,-7694,31849,-7702,31847,-7710,31845,-7718,31843,-7726,31841,-7734,31839,-7743,31837,-7751,31835,-7759,31833,-7767,31831,-7775,31829,-7783,31827,-7791,31825,-7800,31823,-7808,31821,-7816,31819,-7824,31817,-7832,31815,-7840,31813,-7848,31811,-7857,31809,-7865,31807,-7873,31805,-7881,31803,-7889,31801,-7897,31799,-7905,31797,-7913,31795,-7922,31793,-7930,31791,-7938,31789,-7946,31787,-7954,31785,-7962,31782,-7970,31780,-7978,31778,-7987,31776,-7995,31774,-8003,31772,-8011,31770,-8019,31768,-8027,31766,-8035,31764,-8043,31762,-8052,31760,-8060,31758,-8068,31756,-8076,31754,-8084,31752,-8092,31750,-8100,31748,-8108,31745,-8117,31743,-8125,31741,-8133,31739,-8141,31737,-8149,31735,-8157,31733,-8165,31731,-8173,31729,-8181,31727,-8190,31725,-8198,31723,-8206,31720,-8214,31718,-8222,31716,-8230,31714,-8238,31712,-8246,31710,-8254,31708,-8263,31706,-8271,31704,-8279,31701,-8287,31699,-8295,31697,-8303,31695,-8311,31693,-8319,31691,-8327,31689,-8335,31687,-8344,31684,-8352,31682,-8360,31680,-8368,31678,-8376,31676,-8384,31674,-8392,31672,-8400,31669,-8408,31667,-8416,31665,-8425,31663,-8433,31661,-8441,31659,-8449,31656,-8457,31654,-8465,31652,-8473,31650,-8481,31648,-8489,31646,-8497,31643,-8505,31641,-8514,31639,-8522,31637,-8530,31635,-8538,31633,-8546,31630,-8554,31628,-8562,31626,-8570,31624,-8578,31622,-8586,31619,-8594,31617,-8603,31615,-8611,31613,-8619,31611,-8627,31608,-8635,31606,-8643,31604,-8651,31602,-8659,31600,-8667,31597,-8675,31595,-8683,31593,-8691,31591,-8700,31588,-8708,31586,-8716,31584,-8724,31582,-8732,31580,-8740,31577,-8748,31575,-8756,31573,-8764,31571,-8772,31568,-8780,31566,-8788,31564,-8796,31562,-8804,31559,-8813,31557,-8821,31555,-8829,31553,-8837,31550,-8845,31548,-8853,31546,-8861,31544,-8869,31541,-8877,31539,-8885,31537,-8893,31534,-8901,31532,-8909,31530,-8917,31528,-8925,31525,-8933,31523,-8942,31521,-8950,31518,-8958,31516,-8966,31514,-8974,31512,-8982,31509,-8990,31507,-8998,31505,-9006,31502,-9014,31500,-9022,31498,-9030,31495,-9038,31493,-9046,31491,-9054,31489,-9062,31486,-9070,31484,-9078,31482,-9087,31479,-9095,31477,-9103,31475,-9111,31472,-9119,31470,-9127,31468,-9135,31465,-9143,31463,-9151,31461,-9159,31458,-9167,31456,-9175,31454,-9183,31451,-9191,31449,-9199,31446,-9207,31444,-9215,31442,-9223,31439,-9231,31437,-9239,31435,-9247,31432,-9255,31430,-9263,31428,-9271,31425,-9280,31423,-9288,31420,-9296,31418,-9304,31416,-9312,31413,-9320,31411,-9328,31409,-9336,31406,-9344,31404,-9352,31401,-9360,31399,-9368,31397,-9376,31394,-9384,31392,-9392,31389,-9400,31387,-9408,31385,-9416,31382,-9424,31380,-9432,31377,-9440,31375,-9448,31373,-9456,31370,-9464,31368,-9472,31365,-9480,31363,-9488,31360,-9496,31358,-9504,31356,-9512,31353,-9520,31351,-9528,31348,-9536,31346,-9544,31343,-9552,31341,-9560,31338,-9568,31336,-9576,31334,-9584,31331,-9592,31329,-9600,31326,-9608,31324,-9616,31321,-9624,31319,-9632,31316,-9640,31314,-9648,31311,-9656,31309,-9664,31307,-9672,31304,-9680,31302,-9688,31299,-9696,31297,-9704,31294,-9712,31292,-9720,31289,-9728,31287,-9736,31284,-9744,31282,-9752,31279,-9760,31277,-9768,31274,-9776,31272,-9784,31269,-9792,31267,-9800,31264,-9808,31262,-9816,31259,-9824,31257,-9832,31254,-9840,31252,-9848,31249,-9856,31247,-9864,31244,-9872,31242,-9880,31239,-9888,31236,-9896,31234,-9904,31231,-9912,31229,-9920,31226,-9928,31224,-9936,31221,-9944,31219,-9952,31216,-9960,31214,-9968,31211,-9976,31209,-9984,31206,-9992,31203,-10000,31201,-10008,31198,-10016,31196,-10024,31193,-10032,31191,-10040,31188,-10048,31185,-10056,31183,-10064,31180,-10072,31178,-10080,31175,-10088,31173,-10096,31170,-10104,31167,-10112,31165,-10120,31162,-10128,31160,-10136,31157,-10144,31154,-10152,31152,-10160,31149,-10167,31147,-10175,31144,-10183,31141,-10191,31139,-10199,31136,-10207,31134,-10215,31131,-10223,31128,-10231,31126,-10239,31123,-10247,31121,-10255,31118,-10263,31115,-10271,31113,-10279,31110,-10287,31107,-10295,31105,-10303,31102,-10311,31100,-10319,31097,-10327,31094,-10335,31092,-10343,31089,-10350,31086,-10358,31084,-10366,31081,-10374,31078,-10382,31076,-10390,31073,-10398,31070,-10406,31068,-10414,31065,-10422,31062,-10430,31060,-10438,31057,-10446,31054,-10454,31052,-10462,31049,-10470,31046,-10478,31044,-10485,31041,-10493,31038,-10501,31036,-10509,31033,-10517,31030,-10525,31028,-10533,31025,-10541,31022,-10549,31019,-10557,31017,-10565,31014,-10573,31011,-10581,31009,-10589,31006,-10597,31003,-10604,31001,-10612,30998,-10620,30995,-10628,30992,-10636,30990,-10644,30987,-10652,30984,-10660,30981,-10668,30979,-10676,30976,-10684,30973,-10692,30971,-10700,30968,-10707,30965,-10715,30962,-10723,30960,-10731,30957,-10739,30954,-10747,30951,-10755,30949,-10763,30946,-10771,30943,-10779,30940,-10787,30938,-10795,30935,-10802,30932,-10810,30929,-10818,30927,-10826,30924,-10834,30921,-10842,30918,-10850,30915,-10858,30913,-10866,30910,-10874,30907,-10881,30904,-10889,30902,-10897,30899,-10905,30896,-10913,30893,-10921,30890,-10929,30888,-10937,30885,-10945,30882,-10953,30879,-10960,30876,-10968,30874,-10976,30871,-10984,30868,-10992,30865,-11000,30862,-11008,30860,-11016,30857,-11024,30854,-11031,30851,-11039,30848,-11047,30845,-11055,30843,-11063,30840,-11071,30837,-11079,30834,-11087,30831,-11095,30828,-11102,30826,-11110,30823,-11118,30820,-11126,30817,-11134,30814,-11142,30811,-11150,30809,-11158,30806,-11165,30803,-11173,30800,-11181,30797,-11189,30794,-11197,30791,-11205,30788,-11213,30786,-11221,30783,-11228,30780,-11236,30777,-11244,30774,-11252,30771,-11260,30768,-11268,30766,-11276,30763,-11284,30760,-11291,30757,-11299,30754,-11307,30751,-11315,30748,-11323,30745,-11331,30742,-11339,30739,-11346,30737,-11354,30734,-11362,30731,-11370,30728,-11378,30725,-11386,30722,-11394,30719,-11401,30716,-11409,30713,-11417,30710,-11425,30707,-11433,30705,-11441,30702,-11449,30699,-11456,30696,-11464,30693,-11472,30690,-11480,30687,-11488,30684,-11496,30681,-11503,30678,-11511,30675,-11519,30672,-11527,30669,-11535,30666,-11543,30663,-11551,30660,-11558,30657,-11566,30655,-11574,30652,-11582,30649,-11590,30646,-11598,30643,-11605,30640,-11613,30637,-11621,30634,-11629,30631,-11637,30628,-11645,30625,-11652,30622,-11660,30619,-11668,30616,-11676,30613,-11684,30610,-11692,30607,-11699,30604,-11707,30601,-11715,30598,-11723,30595,-11731,30592,-11738,30589,-11746,30586,-11754,30583,-11762,30580,-11770,30577,-11778,30574,-11785,30571,-11793,30568,-11801,30565,-11809,30562,-11817,30559,-11824,30556,-11832,30553,-11840,30550,-11848,30547,-11856,30544,-11863,30541,-11871,30538,-11879,30535,-11887,30532,-11895,30528,-11903,30525,-11910,30522,-11918,30519,-11926,30516,-11934,30513,-11942,30510,-11949,30507,-11957,30504,-11965,30501,-11973,30498,-11981,30495,-11988,30492,-11996,30489,-12004,30486,-12012,30483,-12020,30480,-12027,30476,-12035,30473,-12043,30470,-12051,30467,-12058,30464,-12066,30461,-12074,30458,-12082,30455,-12090,30452,-12097,30449,-12105,30446,-12113,30442,-12121,30439,-12129,30436,-12136,30433,-12144,30430,-12152,30427,-12160,30424,-12167,30421,-12175,30418,-12183,30415,-12191,30411,-12199,30408,-12206,30405,-12214,30402,-12222,30399,-12230,30396,-12237,30393,-12245,30390,-12253,30386,-12261,30383,-12269,30380,-12276,30377,-12284,30374,-12292,30371,-12300,30368,-12307,30364,-12315,30361,-12323,30358,-12331,30355,-12338,30352,-12346,30349,-12354,30345,-12362,30342,-12369,30339,-12377,30336,-12385,30333,-12393,30330,-12400,30326,-12408,30323,-12416,30320,-12424,30317,-12431,30314,-12439,30311,-12447,30307,-12455,30304,-12462,30301,-12470,30298,-12478,30295,-12486,30291,-12493,30288,-12501,30285,-12509,30282,-12517,30279,-12524,30275,-12532,30272,-12540,30269,-12548,30266,-12555,30263,-12563,30259,-12571,30256,-12579,30253,-12586,30250,-12594,30247,-12602,30243,-12610,30240,-12617,30237,-12625,30234,-12633,30230,-12640,30227,-12648,30224,-12656,30221,-12664,30217,-12671,30214,-12679,30211,-12687,30208,-12695,30205,-12702,30201,-12710,30198,-12718,30195,-12725,30191,-12733,30188,-12741,30185,-12749,30182,-12756,30178,-12764,30175,-12772,30172,-12779,30169,-12787,30165,-12795,30162,-12803,30159,-12810,30156,-12818,30152,-12826,30149,-12833,30146,-12841,30142,-12849,30139,-12857,30136,-12864,30133,-12872,30129,-12880,30126,-12887,30123,-12895,30119,-12903,30116,-12910,30113,-12918,30109,-12926,30106,-12934,30103,-12941,30100,-12949,30096,-12957,30093,-12964,30090,-12972,30086,-12980,30083,-12987,30080,-12995,30076,-13003,30073,-13010,30070,-13018,30066,-13026,30063,-13034,30060,-13041,30056,-13049,30053,-13057,30050,-13064,30046,-13072,30043,-13080,30040,-13087,30036,-13095,30033,-13103,30030,-13110,30026,-13118,30023,-13126,30020,-13133,30016,-13141,30013,-13149,30009,-13156,30006,-13164,30003,-13172,29999,-13179,29996,-13187,29993,-13195,29989,-13202,29986,-13210,29983,-13218,29979,-13225,29976,-13233,29972,-13241,29969,-13248,29966,-13256,29962,-13264,29959,-13271,29955,-13279,29952,-13287,29949,-13294,29945,-13302,29942,-13310,29938,-13317,29935,-13325,29932,-13333,29928,-13340,29925,-13348,29921,-13356,29918,-13363,29915,-13371,29911,-13379,29908,-13386,29904,-13394,29901,-13401,29897,-13409,29894,-13417,29891,-13424,29887,-13432,29884,-13440,29880,-13447,29877,-13455,29873,-13463,29870,-13470,29866,-13478,29863,-13486,29860,-13493,29856,-13501,29853,-13508,29849,-13516,29846,-13524,29842,-13531,29839,-13539,29835,-13547,29832,-13554,29828,-13562,29825,-13569,29822,-13577,29818,-13585,29815,-13592,29811,-13600,29808,-13608,29804,-13615,29801,-13623,29797,-13630,29794,-13638,29790,-13646,29787,-13653,29783,-13661,29780,-13668,29776,-13676,29773,-13684,29769,-13691,29766,-13699,29762,-13707,29759,-13714,29755,-13722,29752,-13729,29748,-13737,29745,-13745,29741,-13752,29738,-13760,29734,-13767,29731,-13775,29727,-13783,29724,-13790,29720,-13798,29717,-13805,29713,-13813,29709,-13821,29706,-13828,29702,-13836,29699,-13843,29695,-13851,29692,-13859,29688,-13866,29685,-13874,29681,-13881,29678,-13889,29674,-13896,29670,-13904,29667,-13912,29663,-13919,29660,-13927,29656,-13934,29653,-13942,29649,-13950,29646,-13957,29642,-13965,29638,-13972,29635,-13980,29631,-13987,29628,-13995,29624,-14003,29621,-14010,29617,-14018,29613,-14025,29610,-14033,29606,-14040,29603,-14048,29599,-14056,29595,-14063,29592,-14071,29588,-14078,29585,-14086,29581,-14093,29577,-14101,29574,-14109,29570,-14116,29567,-14124,29563,-14131,29559,-14139,29556,-14146,29552,-14154,29548,-14161,29545,-14169,29541,-14177,29538,-14184,29534,-14192,29530,-14199,29527,-14207,29523,-14214,29519,-14222,29516,-14229,29512,-14237,29509,-14245,29505,-14252,29501,-14260,29498,-14267,29494,-14275,29490,-14282,29487,-14290,29483,-14297,29479,-14305,29476,-14312,29472,-14320,29468,-14327,29465,-14335,29461,-14343,29457,-14350,29454,-14358,29450,-14365,29446,-14373,29443,-14380,29439,-14388,29435,-14395,29432,-14403,29428,-14410,29424,-14418,29421,-14425,29417,-14433,29413,-14440,29410,-14448,29406,-14455,29402,-14463,29398,-14470,29395,-14478,29391,-14485,29387,-14493,29384,-14500,29380,-14508,29376,-14516,29372,-14523,29369,-14531,29365,-14538,29361,-14546,29358,-14553,29354,-14561,29350,-14568,29346,-14576,29343,-14583,29339,-14591,29335,-14598,29332,-14606,29328,-14613,29324,-14621,29320,-14628,29317,-14636,29313,-14643,29309,-14651,29305,-14658,29302,-14666,29298,-14673,29294,-14681,29290,-14688,29287,-14695,29283,-14703,29279,-14710,29275,-14718,29272,-14725,29268,-14733,29264,-14740,29260,-14748,29256,-14755,29253,-14763,29249,-14770,29245,-14778,29241,-14785,29238,-14793,29234,-14800,29230,-14808,29226,-14815,29222,-14823,29219,-14830,29215,-14838,29211,-14845,29207,-14853,29203,-14860,29200,-14867,29196,-14875,29192,-14882,29188,-14890,29184,-14897,29181,-14905,29177,-14912,29173,-14920,29169,-14927,29165,-14935,29162,-14942,29158,-14950,29154,-14957,29150,-14964,29146,-14972,29142,-14979,29139,-14987,29135,-14994,29131,-15002,29127,-15009,29123,-15017,29119,-15024,29116,-15031,29112,-15039,29108,-15046,29104,-15054,29100,-15061,29096,-15069,29092,-15076,29089,-15084,29085,-15091,29081,-15098,29077,-15106,29073,-15113,29069,-15121,29065,-15128,29062,-15136,29058,-15143,29054,-15150,29050,-15158,29046,-15165,29042,-15173,29038,-15180,29034,-15188,29031,-15195,29027,-15202,29023,-15210,29019,-15217,29015,-15225,29011,-15232,29007,-15239,29003,-15247,28999,-15254,28996,-15262,28992,-15269,28988,-15277,28984,-15284,28980,-15291,28976,-15299,28972,-15306,28968,-15314,28964,-15321,28960,-15328,28956,-15336,28953,-15343,28949,-15351,28945,-15358,28941,-15365,28937,-15373,28933,-15380,28929,-15388,28925,-15395,28921,-15402,28917,-15410,28913,-15417,28909,-15425,28905,-15432,28901,-15439,28897,-15447,28893,-15454,28890,-15462,28886,-15469,28882,-15476,28878,-15484,28874,-15491,28870,-15498,28866,-15506,28862,-15513,28858,-15521,28854,-15528,28850,-15535,28846,-15543,28842,-15550,28838,-15557,28834,-15565,28830,-15572,28826,-15580,28822,-15587,28818,-15594,28814,-15602,28810,-15609,28806,-15616,28802,-15624,28798,-15631,28794,-15639,28790,-15646,28786,-15653,28782,-15661,28778,-15668,28774,-15675,28770,-15683,28766,-15690,28762,-15697,28758,-15705,28754,-15712,28750,-15719,28746,-15727,28742,-15734,28738,-15741,28734,-15749,28730,-15756,28726,-15764,28722,-15771,28718,-15778,28714,-15786,28710,-15793,28706,-15800,28702,-15808,28698,-15815,28694,-15822,28690,-15830,28685,-15837,28681,-15844,28677,-15852,28673,-15859,28669,-15866,28665,-15874,28661,-15881,28657,-15888,28653,-15896,28649,-15903,28645,-15910,28641,-15918,28637,-15925,28633,-15932,28629,-15939,28625,-15947,28620,-15954,28616,-15961,28612,-15969,28608,-15976,28604,-15983,28600,-15991,28596,-15998,28592,-16005,28588,-16013,28584,-16020,28580,-16027,28575,-16035,28571,-16042,28567,-16049,28563,-16056,28559,-16064,28555,-16071,28551,-16078,28547,-16086,28543,-16093,28538,-16100,28534,-16108,28530,-16115,28526,-16122,28522,-16129,28518,-16137,28514,-16144,28510,-16151,28506,-16159,28501,-16166,28497,-16173,28493,-16180,28489,-16188,28485,-16195,28481,-16202,28477,-16210,28472,-16217,28468,-16224,28464,-16231,28460,-16239,28456,-16246,28452,-16253,28447,-16261,28443,-16268,28439,-16275,28435,-16282,28431,-16290,28427,-16297,28423,-16304,28418,-16311,28414,-16319,28410,-16326,28406,-16333,28402,-16340,28397,-16348,28393,-16355,28389,-16362,28385,-16369,28381,-16377,28377,-16384,28372,-16391,28368,-16399,28364,-16406,28360,-16413,28356,-16420,28351,-16428,28347,-16435,28343,-16442,28339,-16449,28335,-16456,28330,-16464,28326,-16471,28322,-16478,28318,-16485,28314,-16493,28309,-16500,28305,-16507,28301,-16514,28297,-16522,28292,-16529,28288,-16536,28284,-16543,28280,-16551,28275,-16558,28271,-16565,28267,-16572,28263,-16579,28259,-16587,28254,-16594,28250,-16601,28246,-16608,28242,-16616,28237,-16623,28233,-16630,28229,-16637,28225,-16644,28220,-16652,28216,-16659,28212,-16666,28208,-16673,28203,-16681,28199,-16688,28195,-16695,28190,-16702,28186,-16709,28182,-16717,28178,-16724,28173,-16731,28169,-16738,28165,-16745,28161,-16753,28156,-16760,28152,-16767,28148,-16774,28143,-16781,28139,-16789,28135,-16796,28131,-16803,28126,-16810,28122,-16817,28118,-16825,28113,-16832,28109,-16839,28105,-16846,28100,-16853,28096,-16860,28092,-16868,28087,-16875,28083,-16882,28079,-16889,28075,-16896,28070,-16904,28066,-16911,28062,-16918,28057,-16925,28053,-16932,28049,-16939,28044,-16947,28040,-16954,28036,-16961,28031,-16968,28027,-16975,28023,-16982,28018,-16990,28014,-16997,28009,-17004,28005,-17011,28001,-17018,27996,-17025,27992,-17033,27988,-17040,27983,-17047,27979,-17054,27975,-17061,27970,-17068,27966,-17075,27962,-17083,27957,-17090,27953,-17097,27948,-17104,27944,-17111,27940,-17118,27935,-17125,27931,-17133,27927,-17140,27922,-17147,27918,-17154,27913,-17161,27909,-17168,27905,-17175,27900,-17183,27896,-17190,27891,-17197,27887,-17204,27883,-17211,27878,-17218,27874,-17225,27869,-17233,27865,-17240,27861,-17247,27856,-17254,27852,-17261,27847,-17268,27843,-17275,27839,-17282,27834,-17289,27830,-17297,27825,-17304,27821,-17311,27816,-17318,27812,-17325,27808,-17332,27803,-17339,27799,-17346,27794,-17353,27790,-17361,27785,-17368,27781,-17375,27777,-17382,27772,-17389,27768,-17396,27763,-17403,27759,-17410,27754,-17417,27750,-17424,27745,-17432,27741,-17439,27736,-17446,27732,-17453,27728,-17460,27723,-17467,27719,-17474,27714,-17481,27710,-17488,27705,-17495,27701,-17502,27696,-17510,27692,-17517,27687,-17524,27683,-17531,27678,-17538,27674,-17545,27669,-17552,27665,-17559,27660,-17566,27656,-17573,27651,-17580,27647,-17587,27642,-17594,27638,-17601,27633,-17609,27629,-17616,27624,-17623,27620,-17630,27615,-17637,27611,-17644,27606,-17651,27602,-17658,27597,-17665,27593,-17672,27588,-17679,27584,-17686,27579,-17693,27575,-17700,27570,-17707,27566,-17714,27561,-17721,27557,-17728,27552,-17736,27548,-17743,27543,-17750,27538,-17757,27534,-17764,27529,-17771,27525,-17778,27520,-17785,27516,-17792,27511,-17799,27507,-17806,27502,-17813,27498,-17820,27493,-17827,27488,-17834,27484,-17841,27479,-17848,27475,-17855,27470,-17862,27466,-17869,27461,-17876,27456,-17883,27452,-17890,27447,-17897,27443,-17904,27438,-17911,27434,-17918,27429,-17925,27424,-17932,27420,-17939,27415,-17946,27411,-17953,27406,-17960,27401,-17967,27397,-17974,27392,-17981,27388,-17988,27383,-17995,27378,-18002,27374,-18009,27369,-18016,27365,-18023,27360,-18030,27355,-18037,27351,-18044,27346,-18051,27342,-18058,27337,-18065,27332,-18072,27328,-18079,27323,-18086,27319,-18093,27314,-18100,27309,-18107,27305,-18114,27300,-18121,27295,-18128,27291,-18135,27286,-18142,27281,-18149,27277,-18156,27272,-18163,27268,-18170,27263,-18177,27258,-18184,27254,-18191,27249,-18198,27244,-18205,27240,-18212,27235,-18219,27230,-18226,27226,-18233,27221,-18240,27216,-18247,27212,-18254,27207,-18261,27202,-18268,27198,-18274,27193,-18281,27188,-18288,27184,-18295,27179,-18302,27174,-18309,27170,-18316,27165,-18323,27160,-18330,27156,-18337,27151,-18344,27146,-18351,27141,-18358,27137,-18365,27132,-18372,27127,-18379,27123,-18386,27118,-18393,27113,-18399,27109,-18406,27104,-18413,27099,-18420,27094,-18427,27090,-18434,27085,-18441,27080,-18448,27076,-18455,27071,-18462,27066,-18469,27061,-18476,27057,-18483,27052,-18489,27047,-18496,27042,-18503,27038,-18510,27033,-18517,27028,-18524,27024,-18531,27019,-18538,27014,-18545,27009,-18552,27005,-18559,27000,-18565,26995,-18572,26990,-18579,26986,-18586,26981,-18593,26976,-18600,26971,-18607,26967,-18614,26962,-18621,26957,-18628,26952,-18634,26948,-18641,26943,-18648,26938,-18655,26933,-18662,26928,-18669,26924,-18676,26919,-18683,26914,-18690,26909,-18696,26905,-18703,26900,-18710,26895,-18717,26890,-18724,26885,-18731,26881,-18738,26876,-18745,26871,-18751,26866,-18758,26861,-18765,26857,-18772,26852,-18779,26847,-18786,26842,-18793,26837,-18799,26833,-18806,26828,-18813,26823,-18820,26818,-18827,26813,-18834,26809,-18841,26804,-18847,26799,-18854,26794,-18861,26789,-18868,26784,-18875,26780,-18882,26775,-18889,26770,-18895,26765,-18902,26760,-18909,26755,-18916,26751,-18923,26746,-18930,26741,-18936,26736,-18943,26731,-18950,26726,-18957,26722,-18964,26717,-18971,26712,-18977,26707,-18984,26702,-18991,26697,-18998,26692,-19005,26688,-19012,26683,-19018,26678,-19025,26673,-19032,26668,-19039,26663,-19046,26658,-19052,26654,-19059,26649,-19066,26644,-19073,26639,-19080,26634,-19087,26629,-19093,26624,-19100,26619,-19107,26615,-19114,26610,-19121,26605,-19127,26600,-19134,26595,-19141,26590,-19148,26585,-19155,26580,-19161,26575,-19168,26570,-19175,26566,-19182,26561,-19189,26556,-19195,26551,-19202,26546,-19209,26541,-19216,26536,-19222,26531,-19229,26526,-19236,26521,-19243,26516,-19250,26512,-19256,26507,-19263,26502,-19270,26497,-19277,26492,-19283,26487,-19290,26482,-19297,26477,-19304,26472,-19311,26467,-19317,26462,-19324,26457,-19331,26452,-19338,26447,-19344,26442,-19351,26437,-19358,26433,-19365,26428,-19371,26423,-19378,26418,-19385,26413,-19392,26408,-19398,26403,-19405,26398,-19412,26393,-19419,26388,-19425,26383,-19432,26378,-19439,26373,-19446,26368,-19452,26363,-19459,26358,-19466,26353,-19473,26348,-19479,26343,-19486,26338,-19493,26333,-19500,26328,-19506,26323,-19513,26318,-19520,26313,-19527,26308,-19533,26303,-19540,26298,-19547,26293,-19553,26288,-19560,26283,-19567,26278,-19574,26273,-19580,26268,-19587,26263,-19594,26258,-19600,26253,-19607,26248,-19614,26243,-19621,26238,-19627,26233,-19634,26228,-19641,26223,-19647,26218,-19654,26213,-19661,26208,-19668,26203,-19674,26198,-19681,26193,-19688,26188,-19694,26183,-19701,26178,-19708,26173,-19714,26168,-19721,26163,-19728,26158,-19734,26153,-19741,26148,-19748,26142,-19755,26137,-19761,26132,-19768,26127,-19775,26122,-19781,26117,-19788,26112,-19795,26107,-19801,26102,-19808,26097,-19815,26092,-19821,26087,-19828,26082,-19835,26077,-19841,26072,-19848,26067,-19855,26061,-19861,26056,-19868,26051,-19875,26046,-19881,26041,-19888,26036,-19895,26031,-19901,26026,-19908,26021,-19915,26016,-19921,26011,-19928,26006,-19934,26000,-19941,25995,-19948,25990,-19954,25985,-19961,25980,-19968,25975,-19974,25970,-19981,25965,-19988,25960,-19994,25954,-20001,25949,-20008,25944,-20014,25939,-20021,25934,-20027,25929,-20034,25924,-20041,25919,-20047,25913,-20054,25908,-20061,25903,-20067,25898,-20074,25893,-20080,25888,-20087,25883,-20094,25878,-20100,25872,-20107,25867,-20114,25862,-20120,25857,-20127,25852,-20133,25847,-20140,25842,-20147,25836,-20153,25831,-20160,25826,-20166,25821,-20173,25816,-20180,25811,-20186,25805,-20193,25800,-20199,25795,-20206,25790,-20213,25785,-20219,25780,-20226,25774,-20232,25769,-20239,25764,-20246,25759,-20252,25754,-20259,25749,-20265,25743,-20272,25738,-20278,25733,-20285,25728,-20292,25723,-20298,25717,-20305,25712,-20311,25707,-20318,25702,-20324,25697,-20331,25691,-20338,25686,-20344,25681,-20351,25676,-20357,25671,-20364,25665,-20370,25660,-20377,25655,-20384,25650,-20390,25645,-20397,25639,-20403,25634,-20410,25629,-20416,25624,-20423,25619,-20429,25613,-20436,25608,-20443,25603,-20449,25598,-20456,25592,-20462,25587,-20469,25582,-20475,25577,-20482,25571,-20488,25566,-20495,25561,-20501,25556,-20508,25550,-20514,25545,-20521,25540,-20528,25535,-20534,25529,-20541,25524,-20547,25519,-20554,25514,-20560,25508,-20567,25503,-20573,25498,-20580,25493,-20586,25487,-20593,25482,-20599,25477,-20606,25472,-20612,25466,-20619,25461,-20625,25456,-20632,25451,-20638,25445,-20645,25440,-20651,25435,-20658,25429,-20664,25424,-20671,25419,-20677,25414,-20684,25408,-20690,25403,-20697,25398,-20703,25392,-20710,25387,-20716,25382,-20723,25376,-20729,25371,-20736,25366,-20742,25361,-20749,25355,-20755,25350,-20762,25345,-20768,25339,-20775,25334,-20781,25329,-20788,25323,-20794,25318,-20801,25313,-20807,25307,-20814,25302,-20820,25297,-20826,25291,-20833,25286,-20839,25281,-20846,25276,-20852,25270,-20859,25265,-20865,25260,-20872,25254,-20878,25249,-20885,25243,-20891,25238,-20898,25233,-20904,25227,-20910,25222,-20917,25217,-20923,25211,-20930,25206,-20936,25201,-20943,25195,-20949,25190,-20956,25185,-20962,25179,-20968,25174,-20975,25169,-20981,25163,-20988,25158,-20994,25152,-21001,25147,-21007,25142,-21013,25136,-21020,25131,-21026,25126,-21033,25120,-21039,25115,-21046,25109,-21052,25104,-21058,25099,-21065,25093,-21071,25088,-21078,25083,-21084,25077,-21091,25072,-21097,25066,-21103,25061,-21110,25056,-21116,25050,-21123,25045,-21129,25039,-21135,25034,-21142,25029,-21148,25023,-21155,25018,-21161,25012,-21167,25007,-21174,25001,-21180,24996,-21187,24991,-21193,24985,-21199,24980,-21206,24974,-21212,24969,-21218,24964,-21225,24958,-21231,24953,-21238,24947,-21244,24942,-21250,24936,-21257,24931,-21263,24926,-21269,24920,-21276,24915,-21282,24909,-21289,24904,-21295,24898,-21301,24893,-21308,24887,-21314,24882,-21320,24877,-21327,24871,-21333,24866,-21340,24860,-21346,24855,-21352,24849,-21359,24844,-21365,24838,-21371,24833,-21378,24827,-21384,24822,-21390,24816,-21397,24811,-21403,24805,-21409,24800,-21416,24795,-21422,24789,-21428,24784,-21435,24778,-21441,24773,-21447,24767,-21454,24762,-21460,24756,-21466,24751,-21473,24745,-21479,24740,-21485,24734,-21492,24729,-21498,24723,-21504,24718,-21511,24712,-21517,24707,-21523,24701,-21530,24696,-21536,24690,-21542,24685,-21549,24679,-21555,24674,-21561,24668,-21567,24663,-21574,24657,-21580,24652,-21586,24646,-21593,24641,-21599,24635,-21605,24630,-21612,24624,-21618,24618,-21624,24613,-21630,24607,-21637,24602,-21643,24596,-21649,24591,-21656,24585,-21662,24580,-21668,24574,-21674,24569,-21681,24563,-21687,24558,-21693,24552,-21700,24546,-21706,24541,-21712,24535,-21718,24530,-21725,24524,-21731,24519,-21737,24513,-21744,24508,-21750,24502,-21756,24496,-21762,24491,-21769,24485,-21775,24480,-21781,24474,-21787,24469,-21794,24463,-21800,24457,-21806,24452,-21812,24446,-21819,24441,-21825,24435,-21831,24430,-21837,24424,-21844,24418,-21850,24413,-21856,24407,-21862,24402,-21869,24396,-21875,24390,-21881,24385,-21887,24379,-21894,24374,-21900,24368,-21906,24362,-21912,24357,-21918,24351,-21925,24346,-21931,24340,-21937,24334,-21943,24329,-21950,24323,-21956,24318,-21962,24312,-21968,24306,-21974,24301,-21981,24295,-21987,24289,-21993,24284,-21999,24278,-22005,24273,-22012,24267,-22018,24261,-22024,24256,-22030,24250,-22036,24244,-22043,24239,-22049,24233,-22055,24228,-22061,24222,-22067,24216,-22074,24211,-22080,24205,-22086,24199,-22092,24194,-22098,24188,-22105,24182,-22111,24177,-22117,24171,-22123,24165,-22129,24160,-22136,24154,-22142,24148,-22148,24143,-22154,24137,-22160,24131,-22166,24126,-22173,24120,-22179,24114,-22185,24109,-22191,24103,-22197,24097,-22203,24092,-22210,24086,-22216,24080,-22222,24075,-22228,24069,-22234,24063,-22240,24058,-22246,24052,-22253,24046,-22259,24041,-22265,24035,-22271,24029,-22277,24023,-22283,24018,-22289,24012,-22296,24006,-22302,24001,-22308,23995,-22314,23989,-22320,23984,-22326,23978,-22332,23972,-22339,23966,-22345,23961,-22351,23955,-22357,23949,-22363,23944,-22369,23938,-22375,23932,-22381,23926,-22388,23921,-22394,23915,-22400,23909,-22406,23903,-22412,23898,-22418,23892,-22424,23886,-22430,23881,-22436,23875,-22443,23869,-22449,23863,-22455,23858,-22461,23852,-22467,23846,-22473,23840,-22479,23835,-22485,23829,-22491,23823,-22497,23817,-22504,23812,-22510,23806,-22516,23800,-22522,23794,-22528,23789,-22534,23783,-22540,23777,-22546,23771,-22552,23766,-22558,23760,-22564,23754,-22570,23748,-22576,23742,-22583,23737,-22589,23731,-22595,23725,-22601,23719,-22607,23714,-22613,23708,-22619,23702,-22625,23696,-22631,23690,-22637,23685,-22643,23679,-22649,23673,-22655,23667,-22661,23661,-22667,23656,-22673,23650,-22679,23644,-22686,23638,-22692,23632,-22698,23627,-22704,23621,-22710,23615,-22716,23609,-22722,23603,-22728,23598,-22734,23592,-22740,23586,-22746,23580,-22752,23574,-22758,23569,-22764,23563,-22770,23557,-22776,23551,-22782,23545,-22788,23539,-22794,23534,-22800,23528,-22806,23522,-22812,23516,-22818,23510,-22824,23504,-22830,23499,-22836,23493,-22842,23487,-22848,23481,-22854,23475,-22860,23469,-22866,23464,-22872,23458,-22878,23452,-22884,23446,-22890,23440,-22896,23434,-22902,23428,-22908,23423,-22914,23417,-22920,23411,-22926,23405,-22932,23399,-22938,23393,-22944,23387,-22950,23382,-22956,23376,-22962,23370,-22968,23364,-22974,23358,-22980,23352,-22986,23346,-22992,23340,-22998,23335,-23004,23329,-23010,23323,-23016,23317,-23022,23311,-23028,23305,-23034,23299,-23040,23293,-23046,23287,-23051,23282,-23057,23276,-23063,23270,-23069,23264,-23075,23258,-23081,23252,-23087,23246,-23093,23240,-23099,23234,-23105,23228,-23111,23223,-23117,23217,-23123,23211,-23129,23205,-23135,23199,-23141,23193,-23147,23187,-23152,23181,-23158,23175,-23164,23169,-23170,23163,-23176,23157,-23182,23151,-23188,23146,-23194,23140,-23200,23134,-23206,23128,-23212,23122,-23218,23116,-23224,23110,-23229,23104,-23235,23098,-23241,23092,-23247,23086,-23253,23080,-23259,23074,-23265,23068,-23271,23062,-23277,23056,-23283,23050,-23288,23045,-23294,23039,-23300,23033,-23306,23027,-23312,23021,-23318,23015,-23324,23009,-23330,23003,-23336,22997,-23341,22991,-23347,22985,-23353,22979,-23359,22973,-23365,22967,-23371,22961,-23377,22955,-23383,22949,-23388,22943,-23394,22937,-23400,22931,-23406,22925,-23412,22919,-23418,22913,-23424,22907,-23429,22901,-23435,22895,-23441,22889,-23447,22883,-23453,22877,-23459,22871,-23465,22865,-23470,22859,-23476,22853,-23482,22847,-23488,22841,-23494,22835,-23500,22829,-23505,22823,-23511,22817,-23517,22811,-23523,22805,-23529,22799,-23535,22793,-23540,22787,-23546,22781,-23552,22775,-23558,22769,-23564,22763,-23570,22757,-23575,22751,-23581,22745,-23587,22739,-23593,22733,-23599,22727,-23604,22721,-23610,22715,-23616,22709,-23622,22703,-23628,22697,-23633,22691,-23639,22685,-23645,22678,-23651,22672,-23657,22666,-23662,22660,-23668,22654,-23674,22648,-23680,22642,-23686,22636,-23691,22630,-23697,22624,-23703,22618,-23709,22612,-23715,22606,-23720,22600,-23726,22594,-23732,22588,-23738,22582,-23743,22575,-23749,22569,-23755,22563,-23761,22557,-23767,22551,-23772,22545,-23778,22539,-23784,22533,-23790,22527,-23795,22521,-23801,22515,-23807,22509,-23813,22503,-23818,22496,-23824,22490,-23830,22484,-23836,22478,-23841,22472,-23847,22466,-23853,22460,-23859,22454,-23864,22448,-23870,22442,-23876,22435,-23882,22429,-23887,22423,-23893,22417,-23899,22411,-23904,22405,-23910,22399,-23916,22393,-23922,22387,-23927,22380,-23933,22374,-23939,22368,-23945,22362,-23950,22356,-23956,22350,-23962,22344,-23967,22338,-23973,22331,-23979,22325,-23985,22319,-23990,22313,-23996,22307,-24002,22301,-24007,22295,-24013,22288,-24019,22282,-24024,22276,-24030,22270,-24036,22264,-24042,22258,-24047,22252,-24053,22245,-24059,22239,-24064,22233,-24070,22227,-24076,22221,-24081,22215,-24087,22209,-24093,22202,-24098,22196,-24104,22190,-24110,22184,-24115,22178,-24121,22172,-24127,22165,-24132,22159,-24138,22153,-24144,22147,-24149,22141,-24155,22135,-24161,22128,-24166,22122,-24172,22116,-24178,22110,-24183,22104,-24189,22097,-24195,22091,-24200,22085,-24206,22079,-24212,22073,-24217,22066,-24223,22060,-24229,22054,-24234,22048,-24240,22042,-24245,22035,-24251,22029,-24257,22023,-24262,22017,-24268,22011,-24274,22004,-24279,21998,-24285,21992,-24290,21986,-24296,21980,-24302,21973,-24307,21967,-24313,21961,-24319,21955,-24324,21949,-24330,21942,-24335,21936,-24341,21930,-24347,21924,-24352,21917,-24358,21911,-24363,21905,-24369,21899,-24375,21893,-24380,21886,-24386,21880,-24391,21874,-24397,21868,-24403,21861,-24408,21855,-24414,21849,-24419,21843,-24425,21836,-24431,21830,-24436,21824,-24442,21818,-24447,21811,-24453,21805,-24458,21799,-24464,21793,-24470,21786,-24475,21780,-24481,21774,-24486,21768,-24492,21761,-24497,21755,-24503,21749,-24509,21743,-24514,21736,-24520,21730,-24525,21724,-24531,21717,-24536,21711,-24542,21705,-24547,21699,-24553,21692,-24559,21686,-24564,21680,-24570,21673,-24575,21667,-24581,21661,-24586,21655,-24592,21648,-24597,21642,-24603,21636,-24608,21629,-24614,21623,-24619,21617,-24625,21611,-24631,21604,-24636,21598,-24642,21592,-24647,21585,-24653,21579,-24658,21573,-24664,21566,-24669,21560,-24675,21554,-24680,21548,-24686,21541,-24691,21535,-24697,21529,-24702,21522,-24708,21516,-24713,21510,-24719,21503,-24724,21497,-24730,21491,-24735,21484,-24741,21478,-24746,21472,-24752,21465,-24757,21459,-24763,21453,-24768,21446,-24774,21440,-24779,21434,-24785,21427,-24790,21421,-24796,21415,-24801,21408,-24806,21402,-24812,21396,-24817,21389,-24823,21383,-24828,21377,-24834,21370,-24839,21364,-24845,21358,-24850,21351,-24856,21345,-24861,21339,-24867,21332,-24872,21326,-24878,21319,-24883,21313,-24888,21307,-24894,21300,-24899,21294,-24905,21288,-24910,21281,-24916,21275,-24921,21268,-24927,21262,-24932,21256,-24937,21249,-24943,21243,-24948,21237,-24954,21230,-24959,21224,-24965,21217,-24970,21211,-24975,21205,-24981,21198,-24986,21192,-24992,21186,-24997,21179,-25002,21173,-25008,21166,-25013,21160,-25019,21154,-25024,21147,-25030,21141,-25035,21134,-25040,21128,-25046,21122,-25051,21115,-25057,21109,-25062,21102,-25067,21096,-25073,21090,-25078,21083,-25084,21077,-25089,21070,-25094,21064,-25100,21057,-25105,21051,-25110,21045,-25116,21038,-25121,21032,-25127,21025,-25132,21019,-25137,21012,-25143,21006,-25148,21000,-25153,20993,-25159,20987,-25164,20980,-25170,20974,-25175,20967,-25180,20961,-25186,20955,-25191,20948,-25196,20942,-25202,20935,-25207,20929,-25212,20922,-25218,20916,-25223,20909,-25228,20903,-25234,20897,-25239,20890,-25244,20884,-25250,20877,-25255,20871,-25261,20864,-25266,20858,-25271,20851,-25277,20845,-25282,20838,-25287,20832,-25292,20825,-25298,20819,-25303,20813,-25308,20806,-25314,20800,-25319,20793,-25324,20787,-25330,20780,-25335,20774,-25340,20767,-25346,20761,-25351,20754,-25356,20748,-25362,20741,-25367,20735,-25372,20728,-25377,20722,-25383,20715,-25388,20709,-25393,20702,-25399,20696,-25404,20689,-25409,20683,-25415,20676,-25420,20670,-25425,20663,-25430,20657,-25436,20650,-25441,20644,-25446,20637,-25452,20631,-25457,20624,-25462,20618,-25467,20611,-25473,20605,-25478,20598,-25483,20592,-25488,20585,-25494,20579,-25499,20572,-25504,20566,-25509,20559,-25515,20553,-25520,20546,-25525,20540,-25530,20533,-25536,20527,-25541,20520,-25546,20513,-25551,20507,-25557,20500,-25562,20494,-25567,20487,-25572,20481,-25578,20474,-25583,20468,-25588,20461,-25593,20455,-25599,20448,-25604,20442,-25609,20435,-25614,20428,-25620,20422,-25625,20415,-25630,20409,-25635,20402,-25640,20396,-25646,20389,-25651,20383,-25656,20376,-25661,20369,-25666,20363,-25672,20356,-25677,20350,-25682,20343,-25687,20337,-25692,20330,-25698,20323,-25703,20317,-25708,20310,-25713,20304,-25718,20297,-25724,20291,-25729,20284,-25734,20277,-25739,20271,-25744,20264,-25750,20258,-25755,20251,-25760,20245,-25765,20238,-25770,20231,-25775,20225,-25781,20218,-25786,20212,-25791,20205,-25796,20198,-25801,20192,-25806,20185,-25812,20179,-25817,20172,-25822,20165,-25827,20159,-25832,20152,-25837,20146,-25843,20139,-25848,20132,-25853,20126,-25858,20119,-25863,20113,-25868,20106,-25873,20099,-25879,20093,-25884,20086,-25889,20079,-25894,20073,-25899,20066,-25904,20060,-25909,20053,-25914,20046,-25920,20040,-25925,20033,-25930,20026,-25935,20020,-25940,20013,-25945,20007,-25950,20000,-25955,19993,-25961,19987,-25966,19980,-25971,19973,-25976,19967,-25981,19960,-25986,19953,-25991,19947,-25996,19940,-26001,19933,-26007,19927,-26012,19920,-26017,19914,-26022,19907,-26027,19900,-26032,19894,-26037,19887,-26042,19880,-26047,19874,-26052,19867,-26057,19860,-26062,19854,-26068,19847,-26073,19840,-26078,19834,-26083,19827,-26088,19820,-26093,19814,-26098,19807,-26103,19800,-26108,19794,-26113,19787,-26118,19780,-26123,19774,-26128,19767,-26133,19760,-26138,19754,-26143,19747,-26149,19740,-26154,19733,-26159,19727,-26164,19720,-26169,19713,-26174,19707,-26179,19700,-26184,19693,-26189,19687,-26194,19680,-26199,19673,-26204,19667,-26209,19660,-26214,19653,-26219,19646,-26224,19640,-26229,19633,-26234,19626,-26239,19620,-26244,19613,-26249,19606,-26254,19599,-26259,19593,-26264,19586,-26269,19579,-26274,19573,-26279,19566,-26284,19559,-26289,19552,-26294,19546,-26299,19539,-26304,19532,-26309,19526,-26314,19519,-26319,19512,-26324,19505,-26329,19499,-26334,19492,-26339,19485,-26344,19478,-26349,19472,-26354,19465,-26359,19458,-26364,19451,-26369,19445,-26374,19438,-26379,19431,-26384,19424,-26389,19418,-26394,19411,-26399,19404,-26404,19397,-26409,19391,-26414,19384,-26419,19377,-26424,19370,-26429,19364,-26434,19357,-26438,19350,-26443,19343,-26448,19337,-26453,19330,-26458,19323,-26463,19316,-26468,19310,-26473,19303,-26478,19296,-26483,19289,-26488,19282,-26493,19276,-26498,19269,-26503,19262,-26508,19255,-26513,19249,-26517,19242,-26522,19235,-26527,19228,-26532,19221,-26537,19215,-26542,19208,-26547,19201,-26552,19194,-26557,19188,-26562,19181,-26567,19174,-26571,19167,-26576,19160,-26581,19154,-26586,19147,-26591,19140,-26596,19133,-26601,19126,-26606,19120,-26611,19113,-26616,19106,-26620,19099,-26625,19092,-26630,19086,-26635,19079,-26640,19072,-26645,19065,-26650,19058,-26655,19051,-26659,19045,-26664,19038,-26669,19031,-26674,19024,-26679,19017,-26684,19011,-26689,19004,-26693,18997,-26698,18990,-26703,18983,-26708,18976,-26713,18970,-26718,18963,-26723,18956,-26727,18949,-26732,18942,-26737,18935,-26742,18929,-26747,18922,-26752,18915,-26756,18908,-26761,18901,-26766,18894,-26771,18888,-26776,18881,-26781,18874,-26785,18867,-26790,18860,-26795,18853,-26800,18846,-26805,18840,-26810,18833,-26814,18826,-26819,18819,-26824,18812,-26829,18805,-26834,18798,-26838,18792,-26843,18785,-26848,18778,-26853,18771,-26858,18764,-26862,18757,-26867,18750,-26872,18744,-26877,18737,-26882,18730,-26886,18723,-26891,18716,-26896,18709,-26901,18702,-26906,18695,-26910,18689,-26915,18682,-26920,18675,-26925,18668,-26929,18661,-26934,18654,-26939,18647,-26944,18640,-26949,18633,-26953,18627,-26958,18620,-26963,18613,-26968,18606,-26972,18599,-26977,18592,-26982,18585,-26987,18578,-26991,18571,-26996,18564,-27001,18558,-27006,18551,-27010,18544,-27015,18537,-27020,18530,-27025,18523,-27029,18516,-27034,18509,-27039,18502,-27043,18495,-27048,18488,-27053,18482,-27058,18475,-27062,18468,-27067,18461,-27072,18454,-27077,18447,-27081,18440,-27086,18433,-27091,18426,-27095,18419,-27100,18412,-27105,18405,-27110,18398,-27114,18392,-27119,18385,-27124,18378,-27128,18371,-27133,18364,-27138,18357,-27142,18350,-27147,18343,-27152,18336,-27157,18329,-27161,18322,-27166,18315,-27171,18308,-27175,18301,-27180,18294,-27185,18287,-27189,18280,-27194,18273,-27199,18267,-27203,18260,-27208,18253,-27213,18246,-27217,18239,-27222,18232,-27227,18225,-27231,18218,-27236,18211,-27241,18204,-27245,18197,-27250,18190,-27255,18183,-27259,18176,-27264,18169,-27269,18162,-27273,18155,-27278,18148,-27282,18141,-27287,18134,-27292,18127,-27296,18120,-27301,18113,-27306,18106,-27310,18099,-27315,18092,-27320,18085,-27324,18078,-27329,18071,-27333,18064,-27338,18057,-27343,18050,-27347,18043,-27352,18036,-27356,18029,-27361,18022,-27366,18015,-27370,18008,-27375,18001,-27379,17994,-27384,17987,-27389,17980,-27393,17973,-27398,17966,-27402,17959,-27407,17952,-27412,17945,-27416,17938,-27421,17931,-27425,17924,-27430,17917,-27435,17910,-27439,17903,-27444,17896,-27448,17889,-27453,17882,-27457,17875,-27462,17868,-27467,17861,-27471,17854,-27476,17847,-27480,17840,-27485,17833,-27489,17826,-27494,17819,-27499,17812,-27503,17805,-27508,17798,-27512,17791,-27517,17784,-27521,17777,-27526,17770,-27530,17763,-27535,17756,-27539,17749,-27544,17742,-27549,17735,-27553,17727,-27558,17720,-27562,17713,-27567,17706,-27571,17699,-27576,17692,-27580,17685,-27585,17678,-27589,17671,-27594,17664,-27598,17657,-27603,17650,-27607,17643,-27612,17636,-27616,17629,-27621,17622,-27625,17615,-27630,17608,-27634,17600,-27639,17593,-27643,17586,-27648,17579,-27652,17572,-27657,17565,-27661,17558,-27666,17551,-27670,17544,-27675,17537,-27679,17530,-27684,17523,-27688,17516,-27693,17509,-27697,17501,-27702,17494,-27706,17487,-27711,17480,-27715,17473,-27720,17466,-27724,17459,-27729,17452,-27733,17445,-27737,17438,-27742,17431,-27746,17423,-27751,17416,-27755,17409,-27760,17402,-27764,17395,-27769,17388,-27773,17381,-27778,17374,-27782,17367,-27786,17360,-27791,17352,-27795,17345,-27800,17338,-27804,17331,-27809,17324,-27813,17317,-27817,17310,-27822,17303,-27826,17296,-27831,17288,-27835,17281,-27840,17274,-27844,17267,-27848,17260,-27853,17253,-27857,17246,-27862,17239,-27866,17232,-27870,17224,-27875,17217,-27879,17210,-27884,17203,-27888,17196,-27892,17189,-27897,17182,-27901,17174,-27906,17167,-27910,17160,-27914,17153,-27919,17146,-27923,17139,-27928,17132,-27932,17124,-27936,17117,-27941,17110,-27945,17103,-27949,17096,-27954,17089,-27958,17082,-27963,17074,-27967,17067,-27971,17060,-27976,17053,-27980,17046,-27984,17039,-27989,17032,-27993,17024,-27997,17017,-28002,17010,-28006,17003,-28010,16996,-28015,16989,-28019,16981,-28024,16974,-28028,16967,-28032,16960,-28037,16953,-28041,16946,-28045,16938,-28050,16931,-28054,16924,-28058,16917,-28063,16910,-28067,16903,-28071,16895,-28076,16888,-28080,16881,-28084,16874,-28088,16867,-28093,16859,-28097,16852,-28101,16845,-28106,16838,-28110,16831,-28114,16824,-28119,16816,-28123,16809,-28127,16802,-28132,16795,-28136,16788,-28140,16780,-28144,16773,-28149,16766,-28153,16759,-28157,16752,-28162,16744,-28166,16737,-28170,16730,-28174,16723,-28179,16716,-28183,16708,-28187,16701,-28191,16694,-28196,16687,-28200,16680,-28204,16672,-28209,16665,-28213,16658,-28217,16651,-28221,16643,-28226,16636,-28230,16629,-28234,16622,-28238,16615,-28243,16607,-28247,16600,-28251,16593,-28255,16586,-28260,16578,-28264,16571,-28268,16564,-28272,16557,-28276,16550,-28281,16542,-28285,16535,-28289,16528,-28293,16521,-28298,16513,-28302,16506,-28306,16499,-28310,16492,-28315,16484,-28319,16477,-28323,16470,-28327,16463,-28331,16455,-28336,16448,-28340,16441,-28344,16434,-28348,16427,-28352,16419,-28357,16412,-28361,16405,-28365,16398,-28369,16390,-28373,16383,-28378,16376,-28382,16368,-28386,16361,-28390,16354,-28394,16347,-28398,16339,-28403,16332,-28407,16325,-28411,16318,-28415,16310,-28419,16303,-28424,16296,-28428,16289,-28432,16281,-28436,16274,-28440,16267,-28444,16260,-28448,16252,-28453,16245,-28457,16238,-28461,16230,-28465,16223,-28469,16216,-28473,16209,-28478,16201,-28482,16194,-28486,16187,-28490,16179,-28494,16172,-28498,16165,-28502,16158,-28507,16150,-28511,16143,-28515,16136,-28519,16128,-28523,16121,-28527,16114,-28531,16107,-28535,16099,-28539,16092,-28544,16085,-28548,16077,-28552,16070,-28556,16063,-28560,16055,-28564,16048,-28568,16041,-28572,16034,-28576,16026,-28581,16019,-28585,16012,-28589,16004,-28593,15997,-28597,15990,-28601,15982,-28605,15975,-28609,15968,-28613,15960,-28617,15953,-28621,15946,-28626,15938,-28630,15931,-28634,15924,-28638,15917,-28642,15909,-28646,15902,-28650,15895,-28654,15887,-28658,15880,-28662,15873,-28666,15865,-28670,15858,-28674,15851,-28678,15843,-28682,15836,-28686,15829,-28691,15821,-28695,15814,-28699,15807,-28703,15799,-28707,15792,-28711,15785,-28715,15777,-28719,15770,-28723,15763,-28727,15755,-28731,15748,-28735,15740,-28739,15733,-28743,15726,-28747,15718,-28751,15711,-28755,15704,-28759,15696,-28763,15689,-28767,15682,-28771,15674,-28775,15667,-28779,15660,-28783,15652,-28787,15645,-28791,15638,-28795,15630,-28799,15623,-28803,15615,-28807,15608,-28811,15601,-28815,15593,-28819,15586,-28823,15579,-28827,15571,-28831,15564,-28835,15556,-28839,15549,-28843,15542,-28847,15534,-28851,15527,-28855,15520,-28859,15512,-28863,15505,-28867,15497,-28871,15490,-28875,15483,-28879,15475,-28883,15468,-28887,15461,-28891,15453,-28894,15446,-28898,15438,-28902,15431,-28906,15424,-28910,15416,-28914,15409,-28918,15401,-28922,15394,-28926,15387,-28930,15379,-28934,15372,-28938,15364,-28942,15357,-28946,15350,-28950,15342,-28954,15335,-28957,15327,-28961,15320,-28965,15313,-28969,15305,-28973,15298,-28977,15290,-28981,15283,-28985,15276,-28989,15268,-28993,15261,-28997,15253,-29000,15246,-29004,15238,-29008,15231,-29012,15224,-29016,15216,-29020,15209,-29024,15201,-29028,15194,-29032,15187,-29035,15179,-29039,15172,-29043,15164,-29047,15157,-29051,15149,-29055,15142,-29059,15135,-29063,15127,-29066,15120,-29070,15112,-29074,15105,-29078,15097,-29082,15090,-29086,15083,-29090,15075,-29093,15068,-29097,15060,-29101,15053,-29105,15045,-29109,15038,-29113,15030,-29117,15023,-29120,15016,-29124,15008,-29128,15001,-29132,14993,-29136,14986,-29140,14978,-29143,14971,-29147,14963,-29151,14956,-29155,14949,-29159,14941,-29163,14934,-29166,14926,-29170,14919,-29174,14911,-29178,14904,-29182,14896,-29185,14889,-29189,14881,-29193,14874,-29197,14866,-29201,14859,-29204,14852,-29208,14844,-29212,14837,-29216,14829,-29220,14822,-29223,14814,-29227,14807,-29231,14799,-29235,14792,-29239,14784,-29242,14777,-29246,14769,-29250,14762,-29254,14754,-29257,14747,-29261,14739,-29265,14732,-29269,14724,-29273,14717,-29276,14709,-29280,14702,-29284,14694,-29288,14687,-29291,14680,-29295,14672,-29299,14665,-29303,14657,-29306,14650,-29310,14642,-29314,14635,-29318,14627,-29321,14620,-29325,14612,-29329,14605,-29333,14597,-29336,14590,-29340,14582,-29344,14575,-29347,14567,-29351,14560,-29355,14552,-29359,14545,-29362,14537,-29366,14530,-29370,14522,-29373,14515,-29377,14507,-29381,14499,-29385,14492,-29388,14484,-29392,14477,-29396,14469,-29399,14462,-29403,14454,-29407,14447,-29411,14439,-29414,14432,-29418,14424,-29422,14417,-29425,14409,-29429,14402,-29433,14394,-29436,14387,-29440,14379,-29444,14372,-29447,14364,-29451,14357,-29455,14349,-29458,14342,-29462,14334,-29466,14326,-29469,14319,-29473,14311,-29477,14304,-29480,14296,-29484,14289,-29488,14281,-29491,14274,-29495,14266,-29499,14259,-29502,14251,-29506,14244,-29510,14236,-29513,14228,-29517,14221,-29520,14213,-29524,14206,-29528,14198,-29531,14191,-29535,14183,-29539,14176,-29542,14168,-29546,14160,-29549,14153,-29553,14145,-29557,14138,-29560,14130,-29564,14123,-29568,14115,-29571,14108,-29575,14100,-29578,14092,-29582,14085,-29586,14077,-29589,14070,-29593,14062,-29596,14055,-29600,14047,-29604,14039,-29607,14032,-29611,14024,-29614,14017,-29618,14009,-29622,14002,-29625,13994,-29629,13986,-29632,13979,-29636,13971,-29639,13964,-29643,13956,-29647,13949,-29650,13941,-29654,13933,-29657,13926,-29661,13918,-29664,13911,-29668,13903,-29671,13895,-29675,13888,-29679,13880,-29682,13873,-29686,13865,-29689,13858,-29693,13850,-29696,13842,-29700,13835,-29703,13827,-29707,13820,-29710,13812,-29714,13804,-29718,13797,-29721,13789,-29725,13782,-29728,13774,-29732,13766,-29735,13759,-29739,13751,-29742,13744,-29746,13736,-29749,13728,-29753,13721,-29756,13713,-29760,13706,-29763,13698,-29767,13690,-29770,13683,-29774,13675,-29777,13667,-29781,13660,-29784,13652,-29788,13645,-29791,13637,-29795,13629,-29798,13622,-29802,13614,-29805,13607,-29809,13599,-29812,13591,-29816,13584,-29819,13576,-29823,13568,-29826,13561,-29829,13553,-29833,13546,-29836,13538,-29840,13530,-29843,13523,-29847,13515,-29850,13507,-29854,13500,-29857,13492,-29861,13485,-29864,13477,-29867,13469,-29871,13462,-29874,13454,-29878,13446,-29881,13439,-29885,13431,-29888,13423,-29892,13416,-29895,13408,-29898,13400,-29902,13393,-29905,13385,-29909,13378,-29912,13370,-29916,13362,-29919,13355,-29922,13347,-29926,13339,-29929,13332,-29933,13324,-29936,13316,-29939,13309,-29943,13301,-29946,13293,-29950,13286,-29953,13278,-29956,13270,-29960,13263,-29963,13255,-29967,13247,-29970,13240,-29973,13232,-29977,13224,-29980,13217,-29984,13209,-29987,13201,-29990,13194,-29994,13186,-29997,13178,-30000,13171,-30004,13163,-30007,13155,-30010,13148,-30014,13140,-30017,13132,-30021,13125,-30024,13117,-30027,13109,-30031,13102,-30034,13094,-30037,13086,-30041,13079,-30044,13071,-30047,13063,-30051,13056,-30054,13048,-30057,13040,-30061,13033,-30064,13025,-30067,13017,-30071,13009,-30074,13002,-30077,12994,-30081,12986,-30084,12979,-30087,12971,-30091,12963,-30094,12956,-30097,12948,-30101,12940,-30104,12933,-30107,12925,-30110,12917,-30114,12909,-30117,12902,-30120,12894,-30124,12886,-30127,12879,-30130,12871,-30134,12863,-30137,12856,-30140,12848,-30143,12840,-30147,12832,-30150,12825,-30153,12817,-30157,12809,-30160,12802,-30163,12794,-30166,12786,-30170,12778,-30173,12771,-30176,12763,-30179,12755,-30183,12748,-30186,12740,-30189,12732,-30192,12724,-30196,12717,-30199,12709,-30202,12701,-30206,12694,-30209,12686,-30212,12678,-30215,12670,-30218,12663,-30222,12655,-30225,12647,-30228,12639,-30231,12632,-30235,12624,-30238,12616,-30241,12609,-30244,12601,-30248,12593,-30251,12585,-30254,12578,-30257,12570,-30260,12562,-30264,12554,-30267,12547,-30270,12539,-30273,12531,-30276,12523,-30280,12516,-30283,12508,-30286,12500,-30289,12492,-30292,12485,-30296,12477,-30299,12469,-30302,12461,-30305,12454,-30308,12446,-30312,12438,-30315,12430,-30318,12423,-30321,12415,-30324,12407,-30327,12399,-30331,12392,-30334,12384,-30337,12376,-30340,12368,-30343,12361,-30346,12353,-30350,12345,-30353,12337,-30356,12330,-30359,12322,-30362,12314,-30365,12306,-30369,12299,-30372,12291,-30375,12283,-30378,12275,-30381,12268,-30384,12260,-30387,12252,-30391,12244,-30394,12236,-30397,12229,-30400,12221,-30403,12213,-30406,12205,-30409,12198,-30412,12190,-30416,12182,-30419,12174,-30422,12166,-30425,12159,-30428,12151,-30431,12143,-30434,12135,-30437,12128,-30440,12120,-30443,12112,-30447,12104,-30450,12096,-30453,12089,-30456,12081,-30459,12073,-30462,12065,-30465,12057,-30468,12050,-30471,12042,-30474,12034,-30477,12026,-30481,12019,-30484,12011,-30487,12003,-30490,11995,-30493,11987,-30496,11980,-30499,11972,-30502,11964,-30505,11956,-30508,11948,-30511,11941,-30514,11933,-30517,11925,-30520,11917,-30523,11909,-30526,11902,-30529,11894,-30533,11886,-30536,11878,-30539,11870,-30542,11862,-30545,11855,-30548,11847,-30551,11839,-30554,11831,-30557,11823,-30560,11816,-30563,11808,-30566,11800,-30569,11792,-30572,11784,-30575,11777,-30578,11769,-30581,11761,-30584,11753,-30587,11745,-30590,11737,-30593,11730,-30596,11722,-30599,11714,-30602,11706,-30605,11698,-30608,11691,-30611,11683,-30614,11675,-30617,11667,-30620,11659,-30623,11651,-30626,11644,-30629,11636,-30632,11628,-30635,11620,-30638,11612,-30641,11604,-30644,11597,-30647,11589,-30650,11581,-30653,11573,-30656,11565,-30658,11557,-30661,11550,-30664,11542,-30667,11534,-30670,11526,-30673,11518,-30676,11510,-30679,11502,-30682,11495,-30685,11487,-30688,11479,-30691,11471,-30694,11463,-30697,11455,-30700,11448,-30703,11440,-30706,11432,-30708,11424,-30711,11416,-30714,11408,-30717,11400,-30720,11393,-30723,11385,-30726,11377,-30729,11369,-30732,11361,-30735,11353,-30738,11345,-30740,11338,-30743,11330,-30746,11322,-30749,11314,-30752,11306,-30755,11298,-30758,11290,-30761,11283,-30764,11275,-30767,11267,-30769,11259,-30772,11251,-30775,11243,-30778,11235,-30781,11227,-30784,11220,-30787,11212,-30789,11204,-30792,11196,-30795,11188,-30798,11180,-30801,11172,-30804,11164,-30807,11157,-30810,11149,-30812,11141,-30815,11133,-30818,11125,-30821,11117,-30824,11109,-30827,11101,-30829,11094,-30832,11086,-30835,11078,-30838,11070,-30841,11062,-30844,11054,-30846,11046,-30849,11038,-30852,11030,-30855,11023,-30858,11015,-30861,11007,-30863,10999,-30866,10991,-30869,10983,-30872,10975,-30875,10967,-30877,10959,-30880,10952,-30883,10944,-30886,10936,-30889,10928,-30891,10920,-30894,10912,-30897,10904,-30900,10896,-30903,10888,-30905,10880,-30908,10873,-30911,10865,-30914,10857,-30916,10849,-30919,10841,-30922,10833,-30925,10825,-30928,10817,-30930,10809,-30933,10801,-30936,10794,-30939,10786,-30941,10778,-30944,10770,-30947,10762,-30950,10754,-30952,10746,-30955,10738,-30958,10730,-30961,10722,-30963,10714,-30966,10706,-30969,10699,-30972,10691,-30974,10683,-30977,10675,-30980,10667,-30982,10659,-30985,10651,-30988,10643,-30991,10635,-30993,10627,-30996,10619,-30999,10611,-31002,10603,-31004,10596,-31007,10588,-31010,10580,-31012,10572,-31015,10564,-31018,10556,-31020,10548,-31023,10540,-31026,10532,-31029,10524,-31031,10516,-31034,10508,-31037,10500,-31039,10492,-31042,10484,-31045,10477,-31047,10469,-31050,10461,-31053,10453,-31055,10445,-31058,10437,-31061,10429,-31063,10421,-31066,10413,-31069,10405,-31071,10397,-31074,10389,-31077,10381,-31079,10373,-31082,10365,-31085,10357,-31087,10349,-31090,10342,-31093,10334,-31095,10326,-31098,10318,-31101,10310,-31103,10302,-31106,10294,-31108,10286,-31111,10278,-31114,10270,-31116,10262,-31119,10254,-31122,10246,-31124,10238,-31127,10230,-31129,10222,-31132,10214,-31135,10206,-31137,10198,-31140,10190,-31142,10182,-31145,10174,-31148,10166,-31150,10159,-31153,10151,-31155,10143,-31158,10135,-31161,10127,-31163,10119,-31166,10111,-31168,10103,-31171,10095,-31174,10087,-31176,10079,-31179,10071,-31181,10063,-31184,10055,-31186,10047,-31189,10039,-31192,10031,-31194,10023,-31197,10015,-31199,10007,-31202,9999,-31204,9991,-31207,9983,-31210,9975,-31212,9967,-31215,9959,-31217,9951,-31220,9943,-31222,9935,-31225,9927,-31227,9919,-31230,9911,-31232,9903,-31235,9895,-31237,9887,-31240,9879,-31243,9871,-31245,9863,-31248,9855,-31250,9847,-31253,9839,-31255,9831,-31258,9823,-31260,9815,-31263,9807,-31265,9799,-31268,9791,-31270,9783,-31273,9775,-31275,9767,-31278,9759,-31280,9751,-31283,9743,-31285,9735,-31288,9727,-31290,9719,-31293,9711,-31295,9703,-31298,9695,-31300,9687,-31303,9679,-31305,9671,-31308,9663,-31310,9655,-31312,9647,-31315,9639,-31317,9631,-31320,9623,-31322,9615,-31325,9607,-31327,9599,-31330,9591,-31332,9583,-31335,9575,-31337,9567,-31339,9559,-31342,9551,-31344,9543,-31347,9535,-31349,9527,-31352,9519,-31354,9511,-31357,9503,-31359,9495,-31361,9487,-31364,9479,-31366,9471,-31369,9463,-31371,9455,-31374,9447,-31376,9439,-31378,9431,-31381,9423,-31383,9415,-31386,9407,-31388,9399,-31390,9391,-31393,9383,-31395,9375,-31398,9367,-31400,9359,-31402,9351,-31405,9343,-31407,9335,-31410,9327,-31412,9319,-31414,9311,-31417,9303,-31419,9295,-31421,9287,-31424,9279,-31426,9270,-31429,9262,-31431,9254,-31433,9246,-31436,9238,-31438,9230,-31440,9222,-31443,9214,-31445,9206,-31447,9198,-31450,9190,-31452,9182,-31455,9174,-31457,9166,-31459,9158,-31462,9150,-31464,9142,-31466,9134,-31469,9126,-31471,9118,-31473,9110,-31476,9102,-31478,9094,-31480,9086,-31483,9077,-31485,9069,-31487,9061,-31490,9053,-31492,9045,-31494,9037,-31496,9029,-31499,9021,-31501,9013,-31503,9005,-31506,8997,-31508,8989,-31510,8981,-31513,8973,-31515,8965,-31517,8957,-31519,8949,-31522,8941,-31524,8932,-31526,8924,-31529,8916,-31531,8908,-31533,8900,-31535,8892,-31538,8884,-31540,8876,-31542,8868,-31545,8860,-31547,8852,-31549,8844,-31551,8836,-31554,8828,-31556,8820,-31558,8812,-31560,8803,-31563,8795,-31565,8787,-31567,8779,-31569,8771,-31572,8763,-31574,8755,-31576,8747,-31578,8739,-31581,8731,-31583,8723,-31585,8715,-31587,8707,-31589,8699,-31592,8690,-31594,8682,-31596,8674,-31598,8666,-31601,8658,-31603,8650,-31605,8642,-31607,8634,-31609,8626,-31612,8618,-31614,8610,-31616,8602,-31618,8593,-31620,8585,-31623,8577,-31625,8569,-31627,8561,-31629,8553,-31631,8545,-31634,8537,-31636,8529,-31638,8521,-31640,8513,-31642,8504,-31644,8496,-31647,8488,-31649,8480,-31651,8472,-31653,8464,-31655,8456,-31657,8448,-31660,8440,-31662,8432,-31664,8424,-31666,8415,-31668,8407,-31670,8399,-31673,8391,-31675,8383,-31677,8375,-31679,8367,-31681,8359,-31683,8351,-31685,8343,-31688,8334,-31690,8326,-31692,8318,-31694,8310,-31696,8302,-31698,8294,-31700,8286,-31702,8278,-31705,8270,-31707,8262,-31709,8253,-31711,8245,-31713,8237,-31715,8229,-31717,8221,-31719,8213,-31721,8205,-31724,8197,-31726,8189,-31728,8180,-31730,8172,-31732,8164,-31734,8156,-31736,8148,-31738,8140,-31740,8132,-31742,8124,-31744,8116,-31746,8107,-31749,8099,-31751,8091,-31753,8083,-31755,8075,-31757,8067,-31759,8059,-31761,8051,-31763,8042,-31765,8034,-31767,8026,-31769,8018,-31771,8010,-31773,8002,-31775,7994,-31777,7986,-31779,7977,-31781,7969,-31783,7961,-31786,7953,-31788,7945,-31790,7937,-31792,7929,-31794,7921,-31796,7912,-31798,7904,-31800,7896,-31802,7888,-31804,7880,-31806,7872,-31808,7864,-31810,7856,-31812,7847,-31814,7839,-31816,7831,-31818,7823,-31820,7815,-31822,7807,-31824,7799,-31826,7790,-31828,7782,-31830,7774,-31832,7766,-31834,7758,-31836,7750,-31838,7742,-31840,7733,-31842,7725,-31844,7717,-31846,7709,-31848,7701,-31850,7693,-31852,7685,-31854,7676,-31855,7668,-31857,7660,-31859,7652,-31861,7644,-31863,7636,-31865,7628,-31867,7619,-31869,7611,-31871,7603,-31873,7595,-31875,7587,-31877,7579,-31879,7571,-31881,7562,-31883,7554,-31885,7546,-31887,7538,-31889,7530,-31890,7522,-31892,7514,-31894,7505,-31896,7497,-31898,7489,-31900,7481,-31902,7473,-31904,7465,-31906,7456,-31908,7448,-31910,7440,-31912,7432,-31913,7424,-31915,7416,-31917,7407,-31919,7399,-31921,7391,-31923,7383,-31925,7375,-31927,7367,-31929,7358,-31930,7350,-31932,7342,-31934,7334,-31936,7326,-31938,7318,-31940,7310,-31942,7301,-31944,7293,-31945,7285,-31947,7277,-31949,7269,-31951,7261,-31953,7252,-31955,7244,-31957,7236,-31958,7228,-31960,7220,-31962,7211,-31964,7203,-31966,7195,-31968,7187,-31969,7179,-31971,7171,-31973,7162,-31975,7154,-31977,7146,-31979,7138,-31980,7130,-31982,7122,-31984,7113,-31986,7105,-31988,7097,-31990,7089,-31991,7081,-31993,7072,-31995,7064,-31997,7056,-31999,7048,-32000,7040,-32002,7032,-32004,7023,-32006,7015,-32008,7007,-32009,6999,-32011,6991,-32013,6982,-32015,6974,-32017,6966,-32018,6958,-32020,6950,-32022,6942,-32024,6933,-32025,6925,-32027,6917,-32029,6909,-32031,6901,-32033,6892,-32034,6884,-32036,6876,-32038,6868,-32040,6860,-32041,6851,-32043,6843,-32045,6835,-32047,6827,-32048,6819,-32050,6811,-32052,6802,-32054,6794,-32055,6786,-32057,6778,-32059,6770,-32060,6761,-32062,6753,-32064,6745,-32066,6737,-32067,6729,-32069,6720,-32071,6712,-32073,6704,-32074,6696,-32076,6688,-32078,6679,-32079,6671,-32081,6663,-32083,6655,-32085,6647,-32086,6638,-32088,6630,-32090,6622,-32091,6614,-32093,6606,-32095,6597,-32096,6589,-32098,6581,-32100,6573,-32101,6564,-32103,6556,-32105,6548,-32106,6540,-32108,6532,-32110,6523,-32111,6515,-32113,6507,-32115,6499,-32116,6491,-32118,6482,-32120,6474,-32121,6466,-32123,6458,-32125,6450,-32126,6441,-32128,6433,-32130,6425,-32131,6417,-32133,6408,-32135,6400,-32136,6392,-32138,6384,-32140,6376,-32141,6367,-32143,6359,-32144,6351,-32146,6343,-32148,6334,-32149,6326,-32151,6318,-32153,6310,-32154,6302,-32156,6293,-32157,6285,-32159,6277,-32161,6269,-32162,6261,-32164,6252,-32165,6244,-32167,6236,-32169,6228,-32170,6219,-32172,6211,-32173,6203,-32175,6195,-32177,6186,-32178,6178,-32180,6170,-32181,6162,-32183,6154,-32184,6145,-32186,6137,-32188,6129,-32189,6121,-32191,6112,-32192,6104,-32194,6096,-32195,6088,-32197,6080,-32198,6071,-32200,6063,-32202,6055,-32203,6047,-32205,6038,-32206,6030,-32208,6022,-32209,6014,-32211,6005,-32212,5997,-32214,5989,-32215,5981,-32217,5972,-32219,5964,-32220,5956,-32222,5948,-32223,5940,-32225,5931,-32226,5923,-32228,5915,-32229,5907,-32231,5898,-32232,5890,-32234,5882,-32235,5874,-32237,5865,-32238,5857,-32240,5849,-32241,5841,-32243,5832,-32244,5824,-32246,5816,-32247,5808,-32249,5799,-32250,5791,-32252,5783,-32253,5775,-32255,5766,-32256,5758,-32257,5750,-32259,5742,-32260,5733,-32262,5725,-32263,5717,-32265,5709,-32266,5700,-32268,5692,-32269,5684,-32271,5676,-32272,5667,-32274,5659,-32275,5651,-32276,5643,-32278,5634,-32279,5626,-32281,5618,-32282,5610,-32284,5601,-32285,5593,-32287,5585,-32288,5577,-32289,5568,-32291,5560,-32292,5552,-32294,5544,-32295,5535,-32296,5527,-32298,5519,-32299,5511,-32301,5502,-32302,5494,-32304,5486,-32305,5478,-32306,5469,-32308,5461,-32309,5453,-32311,5445,-32312,5436,-32313,5428,-32315,5420,-32316,5411,-32317,5403,-32319,5395,-32320,5387,-32322,5378,-32323,5370,-32324,5362,-32326,5354,-32327,5345,-32328,5337,-32330,5329,-32331,5321,-32333,5312,-32334,5304,-32335,5296,-32337,5287,-32338,5279,-32339,5271,-32341,5263,-32342,5254,-32343,5246,-32345,5238,-32346,5230,-32347,5221,-32349,5213,-32350,5205,-32351,5197,-32353,5188,-32354,5180,-32355,5172,-32357,5163,-32358,5155,-32359,5147,-32361,5139,-32362,5130,-32363,5122,-32365,5114,-32366,5106,-32367,5097,-32369,5089,-32370,5081,-32371,5072,-32372,5064,-32374,5056,-32375,5048,-32376,5039,-32378,5031,-32379,5023,-32380,5014,-32381,5006,-32383,4998,-32384,4990,-32385,4981,-32387,4973,-32388,4965,-32389,4957,-32390,4948,-32392,4940,-32393,4932,-32394,4923,-32395,4915,-32397,4907,-32398,4899,-32399,4890,-32400,4882,-32402,4874,-32403,4865,-32404,4857,-32405,4849,-32407,4841,-32408,4832,-32409,4824,-32410,4816,-32412,4807,-32413,4799,-32414,4791,-32415,4783,-32417,4774,-32418,4766,-32419,4758,-32420,4749,-32421,4741,-32423,4733,-32424,4725,-32425,4716,-32426,4708,-32427,4700,-32429,4691,-32430,4683,-32431,4675,-32432,4666,-32433,4658,-32435,4650,-32436,4642,-32437,4633,-32438,4625,-32439,4617,-32441,4608,-32442,4600,-32443,4592,-32444,4584,-32445,4575,-32446,4567,-32448,4559,-32449,4550,-32450,4542,-32451,4534,-32452,4525,-32453,4517,-32455,4509,-32456,4501,-32457,4492,-32458,4484,-32459,4476,-32460,4467,-32461,4459,-32463,4451,-32464,4443,-32465,4434,-32466,4426,-32467,4418,-32468,4409,-32469,4401,-32471,4393,-32472,4384,-32473,4376,-32474,4368,-32475,4359,-32476,4351,-32477,4343,-32478,4335,-32479,4326,-32481,4318,-32482,4310,-32483,4301,-32484,4293,-32485,4285,-32486,4276,-32487,4268,-32488,4260,-32489,4252,-32490,4243,-32492,4235,-32493,4227,-32494,4218,-32495,4210,-32496,4202,-32497,4193,-32498,4185,-32499,4177,-32500,4168,-32501,4160,-32502,4152,-32503,4144,-32504,4135,-32505,4127,-32507,4119,-32508,4110,-32509,4102,-32510,4094,-32511,4085,-32512,4077,-32513,4069,-32514,4060,-32515,4052,-32516,4044,-32517,4035,-32518,4027,-32519,4019,-32520,4011,-32521,4002,-32522,3994,-32523,3986,-32524,3977,-32525,3969,-32526,3961,-32527,3952,-32528,3944,-32529,3936,-32530,3927,-32531,3919,-32532,3911,-32533,3902,-32534,3894,-32535,3886,-32536,3877,-32537,3869,-32538,3861,-32539,3853,-32540,3844,-32541,3836,-32542,3828,-32543,3819,-32544,3811,-32545,3803,-32546,3794,-32547,3786,-32548,3778,-32549,3769,-32550,3761,-32551,3753,-32552,3744,-32553,3736,-32554,3728,-32555,3719,-32556,3711,-32557,3703,-32558,3694,-32559,3686,-32559,3678,-32560,3669,-32561,3661,-32562,3653,-32563,3644,-32564,3636,-32565,3628,-32566,3619,-32567,3611,-32568,3603,-32569,3594,-32570,3586,-32571,3578,-32572,3570,-32572,3561,-32573,3553,-32574,3545,-32575,3536,-32576,3528,-32577,3520,-32578,3511,-32579,3503,-32580,3495,-32581,3486,-32581,3478,-32582,3470,-32583,3461,-32584,3453,-32585,3445,-32586,3436,-32587,3428,-32588,3420,-32589,3411,-32589,3403,-32590,3395,-32591,3386,-32592,3378,-32593,3370,-32594,3361,-32595,3353,-32595,3345,-32596,3336,-32597,3328,-32598,3320,-32599,3311,-32600,3303,-32601,3295,-32601,3286,-32602,3278,-32603,3270,-32604,3261,-32605,3253,-32606,3245,-32606,3236,-32607,3228,-32608,3220,-32609,3211,-32610,3203,-32611,3195,-32611,3186,-32612,3178,-32613,3170,-32614,3161,-32615,3153,-32615,3145,-32616,3136,-32617,3128,-32618,3120,-32619,3111,-32619,3103,-32620,3094,-32621,3086,-32622,3078,-32623,3069,-32623,3061,-32624,3053,-32625,3044,-32626,3036,-32626,3028,-32627,3019,-32628,3011,-32629,3003,-32630,2994,-32630,2986,-32631,2978,-32632,2969,-32633,2961,-32633,2953,-32634,2944,-32635,2936,-32636,2928,-32636,2919,-32637,2911,-32638,2903,-32639,2894,-32639,2886,-32640,2878,-32641,2869,-32642,2861,-32642,2853,-32643,2844,-32644,2836,-32645,2828,-32645,2819,-32646,2811,-32647,2802,-32647,2794,-32648,2786,-32649,2777,-32650,2769,-32650,2761,-32651,2752,-32652,2744,-32652,2736,-32653,2727,-32654,2719,-32654,2711,-32655,2702,-32656,2694,-32657,2686,-32657,2677,-32658,2669,-32659,2661,-32659,2652,-32660,2644,-32661,2636,-32661,2627,-32662,2619,-32663,2610,-32663,2602,-32664,2594,-32665,2585,-32665,2577,-32666,2569,-32667,2560,-32667,2552,-32668,2544,-32669,2535,-32669,2527,-32670,2519,-32671,2510,-32671,2502,-32672,2494,-32672,2485,-32673,2477,-32674,2468,-32674,2460,-32675,2452,-32676,2443,-32676,2435,-32677,2427,-32677,2418,-32678,2410,-32679,2402,-32679,2393,-32680,2385,-32681,2377,-32681,2368,-32682,2360,-32682,2352,-32683,2343,-32684,2335,-32684,2326,-32685,2318,-32685,2310,-32686,2301,-32687,2293,-32687,2285,-32688,2276,-32688,2268,-32689,2260,-32689,2251,-32690,2243,-32691,2235,-32691,2226,-32692,2218,-32692,2209,-32693,2201,-32693,2193,-32694,2184,-32695,2176,-32695,2168,-32696,2159,-32696,2151,-32697,2143,-32697,2134,-32698,2126,-32698,2117,-32699,2109,-32700,2101,-32700,2092,-32701,2084,-32701,2076,-32702,2067,-32702,2059,-32703,2051,-32703,2042,-32704,2034,-32704,2026,-32705,2017,-32705,2009,-32706,2000,-32706,1992,-32707,1984,-32707,1975,-32708,1967,-32708,1959,-32709,1950,-32709,1942,-32710,1934,-32710,1925,-32711,1917,-32711,1908,-32712,1900,-32712,1892,-32713,1883,-32713,1875,-32714,1867,-32714,1858,-32715,1850,-32715,1842,-32716,1833,-32716,1825,-32717,1816,-32717,1808,-32718,1800,-32718,1791,-32718,1783,-32719,1775,-32719,1766,-32720,1758,-32720,1750,-32721,1741,-32721,1733,-32722,1724,-32722,1716,-32723,1708,-32723,1699,-32723,1691,-32724,1683,-32724,1674,-32725,1666,-32725,1658,-32726,1649,-32726,1641,-32726,1632,-32727,1624,-32727,1616,-32728,1607,-32728,1599,-32728,1591,-32729,1582,-32729,1574,-32730,1565,-32730,1557,-32730,1549,-32731,1540,-32731,1532,-32732,1524,-32732,1515,-32732,1507,-32733,1499,-32733,1490,-32734,1482,-32734,1473,-32734,1465,-32735,1457,-32735,1448,-32735,1440,-32736,1432,-32736,1423,-32737,1415,-32737,1406,-32737,1398,-32738,1390,-32738,1381,-32738,1373,-32739,1365,-32739,1356,-32739,1348,-32740,1339,-32740,1331,-32740,1323,-32741,1314,-32741,1306,-32741,1298,-32742,1289,-32742,1281,-32742,1273,-32743,1264,-32743,1256,-32743,1247,-32744,1239,-32744,1231,-32744,1222,-32745,1214,-32745,1206,-32745,1197,-32746,1189,-32746,1180,-32746,1172,-32747,1164,-32747,1155,-32747,1147,-32747,1139,-32748,1130,-32748,1122,-32748,1113,-32749,1105,-32749,1097,-32749,1088,-32749,1080,-32750,1072,-32750,1063,-32750,1055,-32751,1046,-32751,1038,-32751,1030,-32751,1021,-32752,1013,-32752,1005,-32752,996,-32752,988,-32753,980,-32753,971,-32753,963,-32753,954,-32754,946,-32754,938,-32754,929,-32754,921,-32755,913,-32755,904,-32755,896,-32755,887,-32755,879,-32756,871,-32756,862,-32756,854,-32756,846,-32757,837,-32757,829,-32757,820,-32757,812,-32757,804,-32758,795,-32758,787,-32758,779,-32758,770,-32758,762,-32759,753,-32759,745,-32759,737,-32759,728,-32759,720,-32760,712,-32760,703,-32760,695,-32760,686,-32760,678,-32760,670,-32761,661,-32761,653,-32761,645,-32761,636,-32761,628,-32761,619,-32762,611,-32762,603,-32762,594,-32762,586,-32762,578,-32762,569,-32763,561,-32763,552,-32763,544,-32763,536,-32763,527,-32763,519,-32763,510,-32764,502,-32764,494,-32764,485,-32764,477,-32764,469,-32764,460,-32764,452,-32764,443,-32764,435,-32765,427,-32765,418,-32765,410,-32765,402,-32765,393,-32765,385,-32765,376,-32765,368,-32765,360,-32766,351,-32766,343,-32766,335,-32766,326,-32766,318,-32766,309,-32766,301,-32766,293,-32766,284,-32766,276,-32766,268,-32766,259,-32766,251,-32767,242,-32767,234,-32767,226,-32767,217,-32767,209,-32767,201,-32767,192,-32767,184,-32767,175,-32767,167,-32767,159,-32767,150,-32767,142,-32767,134,-32767,125,-32767,117,-32767,108,-32767,100,-32767,92,-32767,83,-32767,75,-32767,67,-32767,58,-32767,50,-32767,41,-32767,33,-32767,25,-32767,16,-32767,8,-32767,0,-32767,-9,-32767,-17,-32767,-26,-32767,-34,-32767,-42,-32767,-51,-32767,-59,-32767,-68,-32767,-76,-32767,-84,-32767,-93,-32767,-101,-32767,-109,-32767,-118,-32767,-126,-32767,-135,-32767,-143,-32767,-151,-32767,-160,-32767,-168,-32767,-176,-32767,-185,-32767,-193,-32767,-202,-32767,-210,-32767,-218,-32767,-227,-32767,-235,-32767,-243,-32767,-252,-32767,-260,-32766,-269,-32766,-277,-32766,-285,-32766,-294,-32766,-302,-32766,-310,-32766,-319,-32766,-327,-32766,-336,-32766,-344,-32766,-352,-32766,-361,-32766,-369,-32765,-377,-32765,-386,-32765,-394,-32765,-403,-32765,-411,-32765,-419,-32765,-428,-32765,-436,-32765,-444,-32764,-453,-32764,-461,-32764,-470,-32764,-478,-32764,-486,-32764,-495,-32764,-503,-32764,-511,-32764,-520,-32763,-528,-32763,-537,-32763,-545,-32763,-553,-32763,-562,-32763,-570,-32763,-579,-32762,-587,-32762,-595,-32762,-604,-32762,-612,-32762,-620,-32762,-629,-32761,-637,-32761,-646,-32761,-654,-32761,-662,-32761,-671,-32761,-679,-32760,-687,-32760,-696,-32760,-704,-32760,-713,-32760,-721,-32760,-729,-32759,-738,-32759,-746,-32759,-754,-32759,-763,-32759,-771,-32758,-780,-32758,-788,-32758,-796,-32758,-805,-32758,-813,-32757,-821,-32757,-830,-32757,-838,-32757,-847,-32757,-855,-32756,-863,-32756,-872,-32756,-880,-32756,-888,-32755,-897,-32755,-905,-32755,-914,-32755,-922,-32755,-930,-32754,-939,-32754,-947,-32754,-955,-32754,-964,-32753,-972,-32753,-981,-32753,-989,-32753,-997,-32752,-1006,-32752,-1014,-32752,-1022,-32752,-1031,-32751,-1039,-32751,-1047,-32751,-1056,-32751,-1064,-32750,-1073,-32750,-1081,-32750,-1089,-32749,-1098,-32749,-1106,-32749,-1114,-32749,-1123,-32748,-1131,-32748,-1140,-32748,-1148,-32747,-1156,-32747,-1165,-32747,-1173,-32747,-1181,-32746,-1190,-32746,-1198,-32746,-1207,-32745,-1215,-32745,-1223,-32745,-1232,-32744,-1240,-32744,-1248,-32744,-1257,-32743,-1265,-32743,-1274,-32743,-1282,-32742,-1290,-32742,-1299,-32742,-1307,-32741,-1315,-32741,-1324,-32741,-1332,-32740,-1340,-32740,-1349,-32740,-1357,-32739,-1366,-32739,-1374,-32739,-1382,-32738,-1391,-32738,-1399,-32738,-1407,-32737,-1416,-32737,-1424,-32737,-1433,-32736,-1441,-32736,-1449,-32735,-1458,-32735,-1466,-32735,-1474,-32734,-1483,-32734,-1491,-32734,-1500,-32733,-1508,-32733,-1516,-32732,-1525,-32732,-1533,-32732,-1541,-32731,-1550,-32731,-1558,-32730,-1566,-32730,-1575,-32730,-1583,-32729,-1592,-32729,-1600,-32728,-1608,-32728,-1617,-32728,-1625,-32727,-1633,-32727,-1642,-32726,-1650,-32726,-1659,-32726,-1667,-32725,-1675,-32725,-1684,-32724,-1692,-32724,-1700,-32723,-1709,-32723,-1717,-32723,-1725,-32722,-1734,-32722,-1742,-32721,-1751,-32721,-1759,-32720,-1767,-32720,-1776,-32719,-1784,-32719,-1792,-32718,-1801,-32718,-1809,-32718,-1817,-32717,-1826,-32717,-1834,-32716,-1843,-32716,-1851,-32715,-1859,-32715,-1868,-32714,-1876,-32714,-1884,-32713,-1893,-32713,-1901,-32712,-1909,-32712,-1918,-32711,-1926,-32711,-1935,-32710,-1943,-32710,-1951,-32709,-1960,-32709,-1968,-32708,-1976,-32708,-1985,-32707,-1993,-32707,-2001,-32706,-2010,-32706,-2018,-32705,-2027,-32705,-2035,-32704,-2043,-32704,-2052,-32703,-2060,-32703,-2068,-32702,-2077,-32702,-2085,-32701,-2093,-32701,-2102,-32700,-2110,-32700,-2118,-32699,-2127,-32698,-2135,-32698,-2144,-32697,-2152,-32697,-2160,-32696,-2169,-32696,-2177,-32695,-2185,-32695,-2194,-32694,-2202,-32693,-2210,-32693,-2219,-32692,-2227,-32692,-2236,-32691,-2244,-32691,-2252,-32690,-2261,-32689,-2269,-32689,-2277,-32688,-2286,-32688,-2294,-32687,-2302,-32687,-2311,-32686,-2319,-32685,-2327,-32685,-2336,-32684,-2344,-32684,-2353,-32683,-2361,-32682,-2369,-32682,-2378,-32681,-2386,-32681,-2394,-32680,-2403,-32679,-2411,-32679,-2419,-32678,-2428,-32677,-2436,-32677,-2444,-32676,-2453,-32676,-2461,-32675,-2469,-32674,-2478,-32674,-2486,-32673,-2495,-32672,-2503,-32672,-2511,-32671,-2520,-32671,-2528,-32670,-2536,-32669,-2545,-32669,-2553,-32668,-2561,-32667,-2570,-32667,-2578,-32666,-2586,-32665,-2595,-32665,-2603,-32664,-2611,-32663,-2620,-32663,-2628,-32662,-2637,-32661,-2645,-32661,-2653,-32660,-2662,-32659,-2670,-32659,-2678,-32658,-2687,-32657,-2695,-32657,-2703,-32656,-2712,-32655,-2720,-32654,-2728,-32654,-2737,-32653,-2745,-32652,-2753,-32652,-2762,-32651,-2770,-32650,-2778,-32650,-2787,-32649,-2795,-32648,-2803,-32647,-2812,-32647,-2820,-32646,-2829,-32645,-2837,-32645,-2845,-32644,-2854,-32643,-2862,-32642,-2870,-32642,-2879,-32641,-2887,-32640,-2895,-32639,-2904,-32639,-2912,-32638,-2920,-32637,-2929,-32636,-2937,-32636,-2945,-32635,-2954,-32634,-2962,-32633,-2970,-32633,-2979,-32632,-2987,-32631,-2995,-32630,-3004,-32630,-3012,-32629,-3020,-32628,-3029,-32627,-3037,-32626,-3045,-32626,-3054,-32625,-3062,-32624,-3070,-32623,-3079,-32623,-3087,-32622,-3095,-32621,-3104,-32620,-3112,-32619,-3121,-32619,-3129,-32618,-3137,-32617,-3146,-32616,-3154,-32615,-3162,-32615,-3171,-32614,-3179,-32613,-3187,-32612,-3196,-32611,-3204,-32611,-3212,-32610,-3221,-32609,-3229,-32608,-3237,-32607,-3246,-32606,-3254,-32606,-3262,-32605,-3271,-32604,-3279,-32603,-3287,-32602,-3296,-32601,-3304,-32601,-3312,-32600,-3321,-32599,-3329,-32598,-3337,-32597,-3346,-32596,-3354,-32595,-3362,-32595,-3371,-32594,-3379,-32593,-3387,-32592,-3396,-32591,-3404,-32590,-3412,-32589,-3421,-32589,-3429,-32588,-3437,-32587,-3446,-32586,-3454,-32585,-3462,-32584,-3471,-32583,-3479,-32582,-3487,-32581,-3496,-32581,-3504,-32580,-3512,-32579,-3521,-32578,-3529,-32577,-3537,-32576,-3546,-32575,-3554,-32574,-3562,-32573,-3571,-32572,-3579,-32572,-3587,-32571,-3595,-32570,-3604,-32569,-3612,-32568,-3620,-32567,-3629,-32566,-3637,-32565,-3645,-32564,-3654,-32563,-3662,-32562,-3670,-32561,-3679,-32560,-3687,-32559,-3695,-32559,-3704,-32558,-3712,-32557,-3720,-32556,-3729,-32555,-3737,-32554,-3745,-32553,-3754,-32552,-3762,-32551,-3770,-32550,-3779,-32549,-3787,-32548,-3795,-32547,-3804,-32546,-3812,-32545,-3820,-32544,-3829,-32543,-3837,-32542,-3845,-32541,-3854,-32540,-3862,-32539,-3870,-32538,-3878,-32537,-3887,-32536,-3895,-32535,-3903,-32534,-3912,-32533,-3920,-32532,-3928,-32531,-3937,-32530,-3945,-32529,-3953,-32528,-3962,-32527,-3970,-32526,-3978,-32525,-3987,-32524,-3995,-32523,-4003,-32522,-4012,-32521,-4020,-32520,-4028,-32519,-4036,-32518,-4045,-32517,-4053,-32516,-4061,-32515,-4070,-32514,-4078,-32513,-4086,-32512,-4095,-32511,-4103,-32510,-4111,-32509,-4120,-32508,-4128,-32507,-4136,-32505,-4145,-32504,-4153,-32503,-4161,-32502,-4169,-32501,-4178,-32500,-4186,-32499,-4194,-32498,-4203,-32497,-4211,-32496,-4219,-32495,-4228,-32494,-4236,-32493,-4244,-32492,-4253,-32490,-4261,-32489,-4269,-32488,-4277,-32487,-4286,-32486,-4294,-32485,-4302,-32484,-4311,-32483,-4319,-32482,-4327,-32481,-4336,-32479,-4344,-32478,-4352,-32477,-4360,-32476,-4369,-32475,-4377,-32474,-4385,-32473,-4394,-32472,-4402,-32471,-4410,-32469,-4419,-32468,-4427,-32467,-4435,-32466,-4444,-32465,-4452,-32464,-4460,-32463,-4468,-32461,-4477,-32460,-4485,-32459,-4493,-32458,-4502,-32457,-4510,-32456,-4518,-32455,-4526,-32453,-4535,-32452,-4543,-32451,-4551,-32450,-4560,-32449,-4568,-32448,-4576,-32446,-4585,-32445,-4593,-32444,-4601,-32443,-4609,-32442,-4618,-32441,-4626,-32439,-4634,-32438,-4643,-32437,-4651,-32436,-4659,-32435,-4667,-32433,-4676,-32432,-4684,-32431,-4692,-32430,-4701,-32429,-4709,-32427,-4717,-32426,-4726,-32425,-4734,-32424,-4742,-32423,-4750,-32421,-4759,-32420,-4767,-32419,-4775,-32418,-4784,-32417,-4792,-32415,-4800,-32414,-4808,-32413,-4817,-32412,-4825,-32410,-4833,-32409,-4842,-32408,-4850,-32407,-4858,-32405,-4866,-32404,-4875,-32403,-4883,-32402,-4891,-32400,-4900,-32399,-4908,-32398,-4916,-32397,-4924,-32395,-4933,-32394,-4941,-32393,-4949,-32392,-4958,-32390,-4966,-32389,-4974,-32388,-4982,-32387,-4991,-32385,-4999,-32384,-5007,-32383,-5015,-32381,-5024,-32380,-5032,-32379,-5040,-32378,-5049,-32376,-5057,-32375,-5065,-32374,-5073,-32372,-5082,-32371,-5090,-32370,-5098,-32369,-5107,-32367,-5115,-32366,-5123,-32365,-5131,-32363,-5140,-32362,-5148,-32361,-5156,-32359,-5164,-32358,-5173,-32357,-5181,-32355,-5189,-32354,-5198,-32353,-5206,-32351,-5214,-32350,-5222,-32349,-5231,-32347,-5239,-32346,-5247,-32345,-5255,-32343,-5264,-32342,-5272,-32341,-5280,-32339,-5288,-32338,-5297,-32337,-5305,-32335,-5313,-32334,-5322,-32333,-5330,-32331,-5338,-32330,-5346,-32328,-5355,-32327,-5363,-32326,-5371,-32324,-5379,-32323,-5388,-32322,-5396,-32320,-5404,-32319,-5412,-32317,-5421,-32316,-5429,-32315,-5437,-32313,-5446,-32312,-5454,-32311,-5462,-32309,-5470,-32308,-5479,-32306,-5487,-32305,-5495,-32304,-5503,-32302,-5512,-32301,-5520,-32299,-5528,-32298,-5536,-32296,-5545,-32295,-5553,-32294,-5561,-32292,-5569,-32291,-5578,-32289,-5586,-32288,-5594,-32287,-5602,-32285,-5611,-32284,-5619,-32282,-5627,-32281,-5635,-32279,-5644,-32278,-5652,-32276,-5660,-32275,-5668,-32274,-5677,-32272,-5685,-32271,-5693,-32269,-5701,-32268,-5710,-32266,-5718,-32265,-5726,-32263,-5734,-32262,-5743,-32260,-5751,-32259,-5759,-32257,-5767,-32256,-5776,-32255,-5784,-32253,-5792,-32252,-5800,-32250,-5809,-32249,-5817,-32247,-5825,-32246,-5833,-32244,-5842,-32243,-5850,-32241,-5858,-32240,-5866,-32238,-5875,-32237,-5883,-32235,-5891,-32234,-5899,-32232,-5908,-32231,-5916,-32229,-5924,-32228,-5932,-32226,-5941,-32225,-5949,-32223,-5957,-32222,-5965,-32220,-5973,-32219,-5982,-32217,-5990,-32215,-5998,-32214,-6006,-32212,-6015,-32211,-6023,-32209,-6031,-32208,-6039,-32206,-6048,-32205,-6056,-32203,-6064,-32202,-6072,-32200,-6081,-32198,-6089,-32197,-6097,-32195,-6105,-32194,-6113,-32192,-6122,-32191,-6130,-32189,-6138,-32188,-6146,-32186,-6155,-32184,-6163,-32183,-6171,-32181,-6179,-32180,-6187,-32178,-6196,-32177,-6204,-32175,-6212,-32173,-6220,-32172,-6229,-32170,-6237,-32169,-6245,-32167,-6253,-32165,-6262,-32164,-6270,-32162,-6278,-32161,-6286,-32159,-6294,-32157,-6303,-32156,-6311,-32154,-6319,-32153,-6327,-32151,-6335,-32149,-6344,-32148,-6352,-32146,-6360,-32144,-6368,-32143,-6377,-32141,-6385,-32140,-6393,-32138,-6401,-32136,-6409,-32135,-6418,-32133,-6426,-32131,-6434,-32130,-6442,-32128,-6451,-32126,-6459,-32125,-6467,-32123,-6475,-32121,-6483,-32120,-6492,-32118,-6500,-32116,-6508,-32115,-6516,-32113,-6524,-32111,-6533,-32110,-6541,-32108,-6549,-32106,-6557,-32105,-6565,-32103,-6574,-32101,-6582,-32100,-6590,-32098,-6598,-32096,-6607,-32095,-6615,-32093,-6623,-32091,-6631,-32090,-6639,-32088,-6648,-32086,-6656,-32085,-6664,-32083,-6672,-32081,-6680,-32079,-6689,-32078,-6697,-32076,-6705,-32074,-6713,-32073,-6721,-32071,-6730,-32069,-6738,-32067,-6746,-32066,-6754,-32064,-6762,-32062,-6771,-32060,-6779,-32059,-6787,-32057,-6795,-32055,-6803,-32054,-6812,-32052,-6820,-32050,-6828,-32048,-6836,-32047,-6844,-32045,-6852,-32043,-6861,-32041,-6869,-32040,-6877,-32038,-6885,-32036,-6893,-32034,-6902,-32033,-6910,-32031,-6918,-32029,-6926,-32027,-6934,-32025,-6943,-32024,-6951,-32022,-6959,-32020,-6967,-32018,-6975,-32017,-6983,-32015,-6992,-32013,-7000,-32011,-7008,-32009,-7016,-32008,-7024,-32006,-7033,-32004,-7041,-32002,-7049,-32000,-7057,-31999,-7065,-31997,-7073,-31995,-7082,-31993,-7090,-31991,-7098,-31990,-7106,-31988,-7114,-31986,-7123,-31984,-7131,-31982,-7139,-31980,-7147,-31979,-7155,-31977,-7163,-31975,-7172,-31973,-7180,-31971,-7188,-31969,-7196,-31968,-7204,-31966,-7212,-31964,-7221,-31962,-7229,-31960,-7237,-31958,-7245,-31957,-7253,-31955,-7262,-31953,-7270,-31951,-7278,-31949,-7286,-31947,-7294,-31945,-7302,-31944,-7311,-31942,-7319,-31940,-7327,-31938,-7335,-31936,-7343,-31934,-7351,-31932,-7359,-31930,-7368,-31929,-7376,-31927,-7384,-31925,-7392,-31923,-7400,-31921,-7408,-31919,-7417,-31917,-7425,-31915,-7433,-31913,-7441,-31912,-7449,-31910,-7457,-31908,-7466,-31906,-7474,-31904,-7482,-31902,-7490,-31900,-7498,-31898,-7506,-31896,-7515,-31894,-7523,-31892,-7531,-31890,-7539,-31889,-7547,-31887,-7555,-31885,-7563,-31883,-7572,-31881,-7580,-31879,-7588,-31877,-7596,-31875,-7604,-31873,-7612,-31871,-7620,-31869,-7629,-31867,-7637,-31865,-7645,-31863,-7653,-31861,-7661,-31859,-7669,-31857,-7677,-31855,-7686,-31854,-7694,-31852,-7702,-31850,-7710,-31848,-7718,-31846,-7726,-31844,-7734,-31842,-7743,-31840,-7751,-31838,-7759,-31836,-7767,-31834,-7775,-31832,-7783,-31830,-7791,-31828,-7800,-31826,-7808,-31824,-7816,-31822,-7824,-31820,-7832,-31818,-7840,-31816,-7848,-31814,-7857,-31812,-7865,-31810,-7873,-31808,-7881,-31806,-7889,-31804,-7897,-31802,-7905,-31800,-7913,-31798,-7922,-31796,-7930,-31794,-7938,-31792,-7946,-31790,-7954,-31788,-7962,-31786,-7970,-31783,-7978,-31781,-7987,-31779,-7995,-31777,-8003,-31775,-8011,-31773,-8019,-31771,-8027,-31769,-8035,-31767,-8043,-31765,-8052,-31763,-8060,-31761,-8068,-31759,-8076,-31757,-8084,-31755,-8092,-31753,-8100,-31751,-8108,-31749,-8117,-31746,-8125,-31744,-8133,-31742,-8141,-31740,-8149,-31738,-8157,-31736,-8165,-31734,-8173,-31732,-8181,-31730,-8190,-31728,-8198,-31726,-8206,-31724,-8214,-31721,-8222,-31719,-8230,-31717,-8238,-31715,-8246,-31713,-8254,-31711,-8263,-31709,-8271,-31707,-8279,-31705,-8287,-31702,-8295,-31700,-8303,-31698,-8311,-31696,-8319,-31694,-8327,-31692,-8335,-31690,-8344,-31688,-8352,-31685,-8360,-31683,-8368,-31681,-8376,-31679,-8384,-31677,-8392,-31675,-8400,-31673,-8408,-31670,-8416,-31668,-8425,-31666,-8433,-31664,-8441,-31662,-8449,-31660,-8457,-31657,-8465,-31655,-8473,-31653,-8481,-31651,-8489,-31649,-8497,-31647,-8505,-31644,-8514,-31642,-8522,-31640,-8530,-31638,-8538,-31636,-8546,-31634,-8554,-31631,-8562,-31629,-8570,-31627,-8578,-31625,-8586,-31623,-8594,-31620,-8603,-31618,-8611,-31616,-8619,-31614,-8627,-31612,-8635,-31609,-8643,-31607,-8651,-31605,-8659,-31603,-8667,-31601,-8675,-31598,-8683,-31596,-8691,-31594,-8700,-31592,-8708,-31589,-8716,-31587,-8724,-31585,-8732,-31583,-8740,-31581,-8748,-31578,-8756,-31576,-8764,-31574,-8772,-31572,-8780,-31569,-8788,-31567,-8796,-31565,-8804,-31563,-8813,-31560,-8821,-31558,-8829,-31556,-8837,-31554,-8845,-31551,-8853,-31549,-8861,-31547,-8869,-31545,-8877,-31542,-8885,-31540,-8893,-31538,-8901,-31535,-8909,-31533,-8917,-31531,-8925,-31529,-8933,-31526,-8942,-31524,-8950,-31522,-8958,-31519,-8966,-31517,-8974,-31515,-8982,-31513,-8990,-31510,-8998,-31508,-9006,-31506,-9014,-31503,-9022,-31501,-9030,-31499,-9038,-31496,-9046,-31494,-9054,-31492,-9062,-31490,-9070,-31487,-9078,-31485,-9087,-31483,-9095,-31480,-9103,-31478,-9111,-31476,-9119,-31473,-9127,-31471,-9135,-31469,-9143,-31466,-9151,-31464,-9159,-31462,-9167,-31459,-9175,-31457,-9183,-31455,-9191,-31452,-9199,-31450,-9207,-31447,-9215,-31445,-9223,-31443,-9231,-31440,-9239,-31438,-9247,-31436,-9255,-31433,-9263,-31431,-9271,-31429,-9280,-31426,-9288,-31424,-9296,-31421,-9304,-31419,-9312,-31417,-9320,-31414,-9328,-31412,-9336,-31410,-9344,-31407,-9352,-31405,-9360,-31402,-9368,-31400,-9376,-31398,-9384,-31395,-9392,-31393,-9400,-31390,-9408,-31388,-9416,-31386,-9424,-31383,-9432,-31381,-9440,-31378,-9448,-31376,-9456,-31374,-9464,-31371,-9472,-31369,-9480,-31366,-9488,-31364,-9496,-31361,-9504,-31359,-9512,-31357,-9520,-31354,-9528,-31352,-9536,-31349,-9544,-31347,-9552,-31344,-9560,-31342,-9568,-31339,-9576,-31337,-9584,-31335,-9592,-31332,-9600,-31330,-9608,-31327,-9616,-31325,-9624,-31322,-9632,-31320,-9640,-31317,-9648,-31315,-9656,-31312,-9664,-31310,-9672,-31308,-9680,-31305,-9688,-31303,-9696,-31300,-9704,-31298,-9712,-31295,-9720,-31293,-9728,-31290,-9736,-31288,-9744,-31285,-9752,-31283,-9760,-31280,-9768,-31278,-9776,-31275,-9784,-31273,-9792,-31270,-9800,-31268,-9808,-31265,-9816,-31263,-9824,-31260,-9832,-31258,-9840,-31255,-9848,-31253,-9856,-31250,-9864,-31248,-9872,-31245,-9880,-31243,-9888,-31240,-9896,-31237,-9904,-31235,-9912,-31232,-9920,-31230,-9928,-31227,-9936,-31225,-9944,-31222,-9952,-31220,-9960,-31217,-9968,-31215,-9976,-31212,-9984,-31210,-9992,-31207,-10000,-31204,-10008,-31202,-10016,-31199,-10024,-31197,-10032,-31194,-10040,-31192,-10048,-31189,-10056,-31186,-10064,-31184,-10072,-31181,-10080,-31179,-10088,-31176,-10096,-31174,-10104,-31171,-10112,-31168,-10120,-31166,-10128,-31163,-10136,-31161,-10144,-31158,-10152,-31155,-10160,-31153,-10167,-31150,-10175,-31148,-10183,-31145,-10191,-31142,-10199,-31140,-10207,-31137,-10215,-31135,-10223,-31132,-10231,-31129,-10239,-31127,-10247,-31124,-10255,-31122,-10263,-31119,-10271,-31116,-10279,-31114,-10287,-31111,-10295,-31108,-10303,-31106,-10311,-31103,-10319,-31101,-10327,-31098,-10335,-31095,-10343,-31093,-10350,-31090,-10358,-31087,-10366,-31085,-10374,-31082,-10382,-31079,-10390,-31077,-10398,-31074,-10406,-31071,-10414,-31069,-10422,-31066,-10430,-31063,-10438,-31061,-10446,-31058,-10454,-31055,-10462,-31053,-10470,-31050,-10478,-31047,-10485,-31045,-10493,-31042,-10501,-31039,-10509,-31037,-10517,-31034,-10525,-31031,-10533,-31029,-10541,-31026,-10549,-31023,-10557,-31020,-10565,-31018,-10573,-31015,-10581,-31012,-10589,-31010,-10597,-31007,-10604,-31004,-10612,-31002,-10620,-30999,-10628,-30996,-10636,-30993,-10644,-30991,-10652,-30988,-10660,-30985,-10668,-30982,-10676,-30980,-10684,-30977,-10692,-30974,-10700,-30972,-10707,-30969,-10715,-30966,-10723,-30963,-10731,-30961,-10739,-30958,-10747,-30955,-10755,-30952,-10763,-30950,-10771,-30947,-10779,-30944,-10787,-30941,-10795,-30939,-10802,-30936,-10810,-30933,-10818,-30930,-10826,-30928,-10834,-30925,-10842,-30922,-10850,-30919,-10858,-30916,-10866,-30914,-10874,-30911,-10881,-30908,-10889,-30905,-10897,-30903,-10905,-30900,-10913,-30897,-10921,-30894,-10929,-30891,-10937,-30889,-10945,-30886,-10953,-30883,-10960,-30880,-10968,-30877,-10976,-30875,-10984,-30872,-10992,-30869,-11000,-30866,-11008,-30863,-11016,-30861,-11024,-30858,-11031,-30855,-11039,-30852,-11047,-30849,-11055,-30846,-11063,-30844,-11071,-30841,-11079,-30838,-11087,-30835,-11095,-30832,-11102,-30829,-11110,-30827,-11118,-30824,-11126,-30821,-11134,-30818,-11142,-30815,-11150,-30812,-11158,-30810,-11165,-30807,-11173,-30804,-11181,-30801,-11189,-30798,-11197,-30795,-11205,-30792,-11213,-30789,-11221,-30787,-11228,-30784,-11236,-30781,-11244,-30778,-11252,-30775,-11260,-30772,-11268,-30769,-11276,-30767,-11284,-30764,-11291,-30761,-11299,-30758,-11307,-30755,-11315,-30752,-11323,-30749,-11331,-30746,-11339,-30743,-11346,-30740,-11354,-30738,-11362,-30735,-11370,-30732,-11378,-30729,-11386,-30726,-11394,-30723,-11401,-30720,-11409,-30717,-11417,-30714,-11425,-30711,-11433,-30708,-11441,-30706,-11449,-30703,-11456,-30700,-11464,-30697,-11472,-30694,-11480,-30691,-11488,-30688,-11496,-30685,-11503,-30682,-11511,-30679,-11519,-30676,-11527,-30673,-11535,-30670,-11543,-30667,-11551,-30664,-11558,-30661,-11566,-30658,-11574,-30656,-11582,-30653,-11590,-30650,-11598,-30647,-11605,-30644,-11613,-30641,-11621,-30638,-11629,-30635,-11637,-30632,-11645,-30629,-11652,-30626,-11660,-30623,-11668,-30620,-11676,-30617,-11684,-30614,-11692,-30611,-11699,-30608,-11707,-30605,-11715,-30602,-11723,-30599,-11731,-30596,-11738,-30593,-11746,-30590,-11754,-30587,-11762,-30584,-11770,-30581,-11778,-30578,-11785,-30575,-11793,-30572,-11801,-30569,-11809,-30566,-11817,-30563,-11824,-30560,-11832,-30557,-11840,-30554,-11848,-30551,-11856,-30548,-11863,-30545,-11871,-30542,-11879,-30539,-11887,-30536,-11895,-30533,-11903,-30529,-11910,-30526,-11918,-30523,-11926,-30520,-11934,-30517,-11942,-30514,-11949,-30511,-11957,-30508,-11965,-30505,-11973,-30502,-11981,-30499,-11988,-30496,-11996,-30493,-12004,-30490,-12012,-30487,-12020,-30484,-12027,-30481,-12035,-30477,-12043,-30474,-12051,-30471,-12058,-30468,-12066,-30465,-12074,-30462,-12082,-30459,-12090,-30456,-12097,-30453,-12105,-30450,-12113,-30447,-12121,-30443,-12129,-30440,-12136,-30437,-12144,-30434,-12152,-30431,-12160,-30428,-12167,-30425,-12175,-30422,-12183,-30419,-12191,-30416,-12199,-30412,-12206,-30409,-12214,-30406,-12222,-30403,-12230,-30400,-12237,-30397,-12245,-30394,-12253,-30391,-12261,-30387,-12269,-30384,-12276,-30381,-12284,-30378,-12292,-30375,-12300,-30372,-12307,-30369,-12315,-30365,-12323,-30362,-12331,-30359,-12338,-30356,-12346,-30353,-12354,-30350,-12362,-30346,-12369,-30343,-12377,-30340,-12385,-30337,-12393,-30334,-12400,-30331,-12408,-30327,-12416,-30324,-12424,-30321,-12431,-30318,-12439,-30315,-12447,-30312,-12455,-30308,-12462,-30305,-12470,-30302,-12478,-30299,-12486,-30296,-12493,-30292,-12501,-30289,-12509,-30286,-12517,-30283,-12524,-30280,-12532,-30276,-12540,-30273,-12548,-30270,-12555,-30267,-12563,-30264,-12571,-30260,-12579,-30257,-12586,-30254,-12594,-30251,-12602,-30248,-12610,-30244,-12617,-30241,-12625,-30238,-12633,-30235,-12640,-30231,-12648,-30228,-12656,-30225,-12664,-30222,-12671,-30218,-12679,-30215,-12687,-30212,-12695,-30209,-12702,-30206,-12710,-30202,-12718,-30199,-12725,-30196,-12733,-30192,-12741,-30189,-12749,-30186,-12756,-30183,-12764,-30179,-12772,-30176,-12779,-30173,-12787,-30170,-12795,-30166,-12803,-30163,-12810,-30160,-12818,-30157,-12826,-30153,-12833,-30150,-12841,-30147,-12849,-30143,-12857,-30140,-12864,-30137,-12872,-30134,-12880,-30130,-12887,-30127,-12895,-30124,-12903,-30120,-12910,-30117,-12918,-30114,-12926,-30110,-12934,-30107,-12941,-30104,-12949,-30101,-12957,-30097,-12964,-30094,-12972,-30091,-12980,-30087,-12987,-30084,-12995,-30081,-13003,-30077,-13010,-30074,-13018,-30071,-13026,-30067,-13034,-30064,-13041,-30061,-13049,-30057,-13057,-30054,-13064,-30051,-13072,-30047,-13080,-30044,-13087,-30041,-13095,-30037,-13103,-30034,-13110,-30031,-13118,-30027,-13126,-30024,-13133,-30021,-13141,-30017,-13149,-30014,-13156,-30010,-13164,-30007,-13172,-30004,-13179,-30000,-13187,-29997,-13195,-29994,-13202,-29990,-13210,-29987,-13218,-29984,-13225,-29980,-13233,-29977,-13241,-29973,-13248,-29970,-13256,-29967,-13264,-29963,-13271,-29960,-13279,-29956,-13287,-29953,-13294,-29950,-13302,-29946,-13310,-29943,-13317,-29939,-13325,-29936,-13333,-29933,-13340,-29929,-13348,-29926,-13356,-29922,-13363,-29919,-13371,-29916,-13379,-29912,-13386,-29909,-13394,-29905,-13401,-29902,-13409,-29898,-13417,-29895,-13424,-29892,-13432,-29888,-13440,-29885,-13447,-29881,-13455,-29878,-13463,-29874,-13470,-29871,-13478,-29867,-13486,-29864,-13493,-29861,-13501,-29857,-13508,-29854,-13516,-29850,-13524,-29847,-13531,-29843,-13539,-29840,-13547,-29836,-13554,-29833,-13562,-29829,-13569,-29826,-13577,-29823,-13585,-29819,-13592,-29816,-13600,-29812,-13608,-29809,-13615,-29805,-13623,-29802,-13630,-29798,-13638,-29795,-13646,-29791,-13653,-29788,-13661,-29784,-13668,-29781,-13676,-29777,-13684,-29774,-13691,-29770,-13699,-29767,-13707,-29763,-13714,-29760,-13722,-29756,-13729,-29753,-13737,-29749,-13745,-29746,-13752,-29742,-13760,-29739,-13767,-29735,-13775,-29732,-13783,-29728,-13790,-29725,-13798,-29721,-13805,-29718,-13813,-29714,-13821,-29710,-13828,-29707,-13836,-29703,-13843,-29700,-13851,-29696,-13859,-29693,-13866,-29689,-13874,-29686,-13881,-29682,-13889,-29679,-13896,-29675,-13904,-29671,-13912,-29668,-13919,-29664,-13927,-29661,-13934,-29657,-13942,-29654,-13950,-29650,-13957,-29647,-13965,-29643,-13972,-29639,-13980,-29636,-13987,-29632,-13995,-29629,-14003,-29625,-14010,-29622,-14018,-29618,-14025,-29614,-14033,-29611,-14040,-29607,-14048,-29604,-14056,-29600,-14063,-29596,-14071,-29593,-14078,-29589,-14086,-29586,-14093,-29582,-14101,-29578,-14109,-29575,-14116,-29571,-14124,-29568,-14131,-29564,-14139,-29560,-14146,-29557,-14154,-29553,-14161,-29549,-14169,-29546,-14177,-29542,-14184,-29539,-14192,-29535,-14199,-29531,-14207,-29528,-14214,-29524,-14222,-29520,-14229,-29517,-14237,-29513,-14245,-29510,-14252,-29506,-14260,-29502,-14267,-29499,-14275,-29495,-14282,-29491,-14290,-29488,-14297,-29484,-14305,-29480,-14312,-29477,-14320,-29473,-14327,-29469,-14335,-29466,-14343,-29462,-14350,-29458,-14358,-29455,-14365,-29451,-14373,-29447,-14380,-29444,-14388,-29440,-14395,-29436,-14403,-29433,-14410,-29429,-14418,-29425,-14425,-29422,-14433,-29418,-14440,-29414,-14448,-29411,-14455,-29407,-14463,-29403,-14470,-29399,-14478,-29396,-14485,-29392,-14493,-29388,-14500,-29385,-14508,-29381,-14516,-29377,-14523,-29373,-14531,-29370,-14538,-29366,-14546,-29362,-14553,-29359,-14561,-29355,-14568,-29351,-14576,-29347,-14583,-29344,-14591,-29340,-14598,-29336,-14606,-29333,-14613,-29329,-14621,-29325,-14628,-29321,-14636,-29318,-14643,-29314,-14651,-29310,-14658,-29306,-14666,-29303,-14673,-29299,-14681,-29295,-14688,-29291,-14695,-29288,-14703,-29284,-14710,-29280,-14718,-29276,-14725,-29273,-14733,-29269,-14740,-29265,-14748,-29261,-14755,-29257,-14763,-29254,-14770,-29250,-14778,-29246,-14785,-29242,-14793,-29239,-14800,-29235,-14808,-29231,-14815,-29227,-14823,-29223,-14830,-29220,-14838,-29216,-14845,-29212,-14853,-29208,-14860,-29204,-14867,-29201,-14875,-29197,-14882,-29193,-14890,-29189,-14897,-29185,-14905,-29182,-14912,-29178,-14920,-29174,-14927,-29170,-14935,-29166,-14942,-29163,-14950,-29159,-14957,-29155,-14964,-29151,-14972,-29147,-14979,-29143,-14987,-29140,-14994,-29136,-15002,-29132,-15009,-29128,-15017,-29124,-15024,-29120,-15031,-29117,-15039,-29113,-15046,-29109,-15054,-29105,-15061,-29101,-15069,-29097,-15076,-29093,-15084,-29090,-15091,-29086,-15098,-29082,-15106,-29078,-15113,-29074,-15121,-29070,-15128,-29066,-15136,-29063,-15143,-29059,-15150,-29055,-15158,-29051,-15165,-29047,-15173,-29043,-15180,-29039,-15188,-29035,-15195,-29032,-15202,-29028,-15210,-29024,-15217,-29020,-15225,-29016,-15232,-29012,-15239,-29008,-15247,-29004,-15254,-29000,-15262,-28997,-15269,-28993,-15277,-28989,-15284,-28985,-15291,-28981,-15299,-28977,-15306,-28973,-15314,-28969,-15321,-28965,-15328,-28961,-15336,-28957,-15343,-28954,-15351,-28950,-15358,-28946,-15365,-28942,-15373,-28938,-15380,-28934,-15388,-28930,-15395,-28926,-15402,-28922,-15410,-28918,-15417,-28914,-15425,-28910,-15432,-28906,-15439,-28902,-15447,-28898,-15454,-28894,-15462,-28891,-15469,-28887,-15476,-28883,-15484,-28879,-15491,-28875,-15498,-28871,-15506,-28867,-15513,-28863,-15521,-28859,-15528,-28855,-15535,-28851,-15543,-28847,-15550,-28843,-15557,-28839,-15565,-28835,-15572,-28831,-15580,-28827,-15587,-28823,-15594,-28819,-15602,-28815,-15609,-28811,-15616,-28807,-15624,-28803,-15631,-28799,-15639,-28795,-15646,-28791,-15653,-28787,-15661,-28783,-15668,-28779,-15675,-28775,-15683,-28771,-15690,-28767,-15697,-28763,-15705,-28759,-15712,-28755,-15719,-28751,-15727,-28747,-15734,-28743,-15741,-28739,-15749,-28735,-15756,-28731,-15764,-28727,-15771,-28723,-15778,-28719,-15786,-28715,-15793,-28711,-15800,-28707,-15808,-28703,-15815,-28699,-15822,-28695,-15830,-28691,-15837,-28686,-15844,-28682,-15852,-28678,-15859,-28674,-15866,-28670,-15874,-28666,-15881,-28662,-15888,-28658,-15896,-28654,-15903,-28650,-15910,-28646,-15918,-28642,-15925,-28638,-15932,-28634,-15939,-28630,-15947,-28626,-15954,-28621,-15961,-28617,-15969,-28613,-15976,-28609,-15983,-28605,-15991,-28601,-15998,-28597,-16005,-28593,-16013,-28589,-16020,-28585,-16027,-28581,-16035,-28576,-16042,-28572,-16049,-28568,-16056,-28564,-16064,-28560,-16071,-28556,-16078,-28552,-16086,-28548,-16093,-28544,-16100,-28539,-16108,-28535,-16115,-28531,-16122,-28527,-16129,-28523,-16137,-28519,-16144,-28515,-16151,-28511,-16159,-28507,-16166,-28502,-16173,-28498,-16180,-28494,-16188,-28490,-16195,-28486,-16202,-28482,-16210,-28478,-16217,-28473,-16224,-28469,-16231,-28465,-16239,-28461,-16246,-28457,-16253,-28453,-16261,-28448,-16268,-28444,-16275,-28440,-16282,-28436,-16290,-28432,-16297,-28428,-16304,-28424,-16311,-28419,-16319,-28415,-16326,-28411,-16333,-28407,-16340,-28403,-16348,-28398,-16355,-28394,-16362,-28390,-16369,-28386,-16377,-28382}; +int16_t twa24576[16384] __attribute__((aligned(32))) = {32767,0,32766,-9,32766,-17,32766,-26,32766,-34,32766,-42,32766,-51,32766,-59,32766,-68,32766,-76,32766,-84,32766,-93,32766,-101,32766,-109,32766,-118,32766,-126,32766,-135,32766,-143,32766,-151,32766,-160,32766,-168,32766,-176,32766,-185,32766,-193,32766,-202,32766,-210,32766,-218,32766,-227,32766,-235,32766,-243,32766,-252,32765,-260,32765,-269,32765,-277,32765,-285,32765,-294,32765,-302,32765,-310,32765,-319,32765,-327,32765,-336,32765,-344,32765,-352,32765,-361,32764,-369,32764,-377,32764,-386,32764,-394,32764,-403,32764,-411,32764,-419,32764,-428,32764,-436,32763,-444,32763,-453,32763,-461,32763,-470,32763,-478,32763,-486,32763,-495,32763,-503,32763,-511,32762,-520,32762,-528,32762,-537,32762,-545,32762,-553,32762,-562,32762,-570,32761,-579,32761,-587,32761,-595,32761,-604,32761,-612,32761,-620,32760,-629,32760,-637,32760,-646,32760,-654,32760,-662,32760,-671,32759,-679,32759,-687,32759,-696,32759,-704,32759,-713,32759,-721,32758,-729,32758,-738,32758,-746,32758,-754,32758,-763,32757,-771,32757,-780,32757,-788,32757,-796,32757,-805,32756,-813,32756,-821,32756,-830,32756,-838,32756,-847,32755,-855,32755,-863,32755,-872,32755,-880,32754,-888,32754,-897,32754,-905,32754,-914,32754,-922,32753,-930,32753,-939,32753,-947,32753,-955,32752,-964,32752,-972,32752,-981,32752,-989,32751,-997,32751,-1006,32751,-1014,32751,-1022,32750,-1031,32750,-1039,32750,-1047,32750,-1056,32749,-1064,32749,-1073,32749,-1081,32748,-1089,32748,-1098,32748,-1106,32748,-1114,32747,-1123,32747,-1131,32747,-1140,32746,-1148,32746,-1156,32746,-1165,32746,-1173,32745,-1181,32745,-1190,32745,-1198,32744,-1207,32744,-1215,32744,-1223,32743,-1232,32743,-1240,32743,-1248,32742,-1257,32742,-1265,32742,-1274,32741,-1282,32741,-1290,32741,-1299,32740,-1307,32740,-1315,32740,-1324,32739,-1332,32739,-1340,32739,-1349,32738,-1357,32738,-1366,32738,-1374,32737,-1382,32737,-1391,32737,-1399,32736,-1407,32736,-1416,32736,-1424,32735,-1433,32735,-1441,32734,-1449,32734,-1458,32734,-1466,32733,-1474,32733,-1483,32733,-1491,32732,-1500,32732,-1508,32731,-1516,32731,-1525,32731,-1533,32730,-1541,32730,-1550,32729,-1558,32729,-1566,32729,-1575,32728,-1583,32728,-1592,32727,-1600,32727,-1608,32727,-1617,32726,-1625,32726,-1633,32725,-1642,32725,-1650,32725,-1659,32724,-1667,32724,-1675,32723,-1684,32723,-1692,32722,-1700,32722,-1709,32722,-1717,32721,-1725,32721,-1734,32720,-1742,32720,-1751,32719,-1759,32719,-1767,32718,-1776,32718,-1784,32717,-1792,32717,-1801,32717,-1809,32716,-1817,32716,-1826,32715,-1834,32715,-1843,32714,-1851,32714,-1859,32713,-1868,32713,-1876,32712,-1884,32712,-1893,32711,-1901,32711,-1909,32710,-1918,32710,-1926,32709,-1935,32709,-1943,32708,-1951,32708,-1960,32707,-1968,32707,-1976,32706,-1985,32706,-1993,32705,-2001,32705,-2010,32704,-2018,32704,-2027,32703,-2035,32703,-2043,32702,-2052,32702,-2060,32701,-2068,32701,-2077,32700,-2085,32700,-2093,32699,-2102,32699,-2110,32698,-2118,32697,-2127,32697,-2135,32696,-2144,32696,-2152,32695,-2160,32695,-2169,32694,-2177,32694,-2185,32693,-2194,32692,-2202,32692,-2210,32691,-2219,32691,-2227,32690,-2236,32690,-2244,32689,-2252,32688,-2261,32688,-2269,32687,-2277,32687,-2286,32686,-2294,32686,-2302,32685,-2311,32684,-2319,32684,-2327,32683,-2336,32683,-2344,32682,-2353,32681,-2361,32681,-2369,32680,-2378,32680,-2386,32679,-2394,32678,-2403,32678,-2411,32677,-2419,32676,-2428,32676,-2436,32675,-2444,32675,-2453,32674,-2461,32673,-2469,32673,-2478,32672,-2486,32671,-2495,32671,-2503,32670,-2511,32670,-2520,32669,-2528,32668,-2536,32668,-2545,32667,-2553,32666,-2561,32666,-2570,32665,-2578,32664,-2586,32664,-2595,32663,-2603,32662,-2611,32662,-2620,32661,-2628,32660,-2637,32660,-2645,32659,-2653,32658,-2662,32658,-2670,32657,-2678,32656,-2687,32656,-2695,32655,-2703,32654,-2712,32653,-2720,32653,-2728,32652,-2737,32651,-2745,32651,-2753,32650,-2762,32649,-2770,32649,-2778,32648,-2787,32647,-2795,32646,-2803,32646,-2812,32645,-2820,32644,-2829,32644,-2837,32643,-2845,32642,-2854,32641,-2862,32641,-2870,32640,-2879,32639,-2887,32638,-2895,32638,-2904,32637,-2912,32636,-2920,32635,-2929,32635,-2937,32634,-2945,32633,-2954,32632,-2962,32632,-2970,32631,-2979,32630,-2987,32629,-2995,32629,-3004,32628,-3012,32627,-3020,32626,-3029,32625,-3037,32625,-3045,32624,-3054,32623,-3062,32622,-3070,32622,-3079,32621,-3087,32620,-3095,32619,-3104,32618,-3112,32618,-3121,32617,-3129,32616,-3137,32615,-3146,32614,-3154,32614,-3162,32613,-3171,32612,-3179,32611,-3187,32610,-3196,32610,-3204,32609,-3212,32608,-3221,32607,-3229,32606,-3237,32605,-3246,32605,-3254,32604,-3262,32603,-3271,32602,-3279,32601,-3287,32600,-3296,32600,-3304,32599,-3312,32598,-3321,32597,-3329,32596,-3337,32595,-3346,32594,-3354,32594,-3362,32593,-3371,32592,-3379,32591,-3387,32590,-3396,32589,-3404,32588,-3412,32588,-3421,32587,-3429,32586,-3437,32585,-3446,32584,-3454,32583,-3462,32582,-3471,32581,-3479,32580,-3487,32580,-3496,32579,-3504,32578,-3512,32577,-3521,32576,-3529,32575,-3537,32574,-3546,32573,-3554,32572,-3562,32571,-3571,32571,-3579,32570,-3587,32569,-3595,32568,-3604,32567,-3612,32566,-3620,32565,-3629,32564,-3637,32563,-3645,32562,-3654,32561,-3662,32560,-3670,32559,-3679,32558,-3687,32558,-3695,32557,-3704,32556,-3712,32555,-3720,32554,-3729,32553,-3737,32552,-3745,32551,-3754,32550,-3762,32549,-3770,32548,-3779,32547,-3787,32546,-3795,32545,-3804,32544,-3812,32543,-3820,32542,-3829,32541,-3837,32540,-3845,32539,-3854,32538,-3862,32537,-3870,32536,-3878,32535,-3887,32534,-3895,32533,-3903,32532,-3912,32531,-3920,32530,-3928,32529,-3937,32528,-3945,32527,-3953,32526,-3962,32525,-3970,32524,-3978,32523,-3987,32522,-3995,32521,-4003,32520,-4012,32519,-4020,32518,-4028,32517,-4036,32516,-4045,32515,-4053,32514,-4061,32513,-4070,32512,-4078,32511,-4086,32510,-4095,32509,-4103,32508,-4111,32507,-4120,32506,-4128,32504,-4136,32503,-4145,32502,-4153,32501,-4161,32500,-4169,32499,-4178,32498,-4186,32497,-4194,32496,-4203,32495,-4211,32494,-4219,32493,-4228,32492,-4236,32491,-4244,32489,-4253,32488,-4261,32487,-4269,32486,-4277,32485,-4286,32484,-4294,32483,-4302,32482,-4311,32481,-4319,32480,-4327,32478,-4336,32477,-4344,32476,-4352,32475,-4360,32474,-4369,32473,-4377,32472,-4385,32471,-4394,32470,-4402,32468,-4410,32467,-4419,32466,-4427,32465,-4435,32464,-4444,32463,-4452,32462,-4460,32460,-4468,32459,-4477,32458,-4485,32457,-4493,32456,-4502,32455,-4510,32454,-4518,32452,-4526,32451,-4535,32450,-4543,32449,-4551,32448,-4560,32447,-4568,32445,-4576,32444,-4585,32443,-4593,32442,-4601,32441,-4609,32440,-4618,32438,-4626,32437,-4634,32436,-4643,32435,-4651,32434,-4659,32432,-4667,32431,-4676,32430,-4684,32429,-4692,32428,-4701,32426,-4709,32425,-4717,32424,-4726,32423,-4734,32422,-4742,32420,-4750,32419,-4759,32418,-4767,32417,-4775,32416,-4784,32414,-4792,32413,-4800,32412,-4808,32411,-4817,32409,-4825,32408,-4833,32407,-4842,32406,-4850,32404,-4858,32403,-4866,32402,-4875,32401,-4883,32399,-4891,32398,-4900,32397,-4908,32396,-4916,32394,-4924,32393,-4933,32392,-4941,32391,-4949,32389,-4958,32388,-4966,32387,-4974,32386,-4982,32384,-4991,32383,-4999,32382,-5007,32380,-5015,32379,-5024,32378,-5032,32377,-5040,32375,-5049,32374,-5057,32373,-5065,32371,-5073,32370,-5082,32369,-5090,32368,-5098,32366,-5107,32365,-5115,32364,-5123,32362,-5131,32361,-5140,32360,-5148,32358,-5156,32357,-5164,32356,-5173,32354,-5181,32353,-5189,32352,-5198,32350,-5206,32349,-5214,32348,-5222,32346,-5231,32345,-5239,32344,-5247,32342,-5255,32341,-5264,32340,-5272,32338,-5280,32337,-5288,32336,-5297,32334,-5305,32333,-5313,32332,-5322,32330,-5330,32329,-5338,32327,-5346,32326,-5355,32325,-5363,32323,-5371,32322,-5379,32321,-5388,32319,-5396,32318,-5404,32316,-5412,32315,-5421,32314,-5429,32312,-5437,32311,-5446,32310,-5454,32308,-5462,32307,-5470,32305,-5479,32304,-5487,32303,-5495,32301,-5503,32300,-5512,32298,-5520,32297,-5528,32295,-5536,32294,-5545,32293,-5553,32291,-5561,32290,-5569,32288,-5578,32287,-5586,32286,-5594,32284,-5602,32283,-5611,32281,-5619,32280,-5627,32278,-5635,32277,-5644,32275,-5652,32274,-5660,32273,-5668,32271,-5677,32270,-5685,32268,-5693,32267,-5701,32265,-5710,32264,-5718,32262,-5726,32261,-5734,32259,-5743,32258,-5751,32256,-5759,32255,-5767,32254,-5776,32252,-5784,32251,-5792,32249,-5800,32248,-5809,32246,-5817,32245,-5825,32243,-5833,32242,-5842,32240,-5850,32239,-5858,32237,-5866,32236,-5875,32234,-5883,32233,-5891,32231,-5899,32230,-5908,32228,-5916,32227,-5924,32225,-5932,32224,-5941,32222,-5949,32221,-5957,32219,-5965,32218,-5973,32216,-5982,32214,-5990,32213,-5998,32211,-6006,32210,-6015,32208,-6023,32207,-6031,32205,-6039,32204,-6048,32202,-6056,32201,-6064,32199,-6072,32197,-6081,32196,-6089,32194,-6097,32193,-6105,32191,-6113,32190,-6122,32188,-6130,32187,-6138,32185,-6146,32183,-6155,32182,-6163,32180,-6171,32179,-6179,32177,-6187,32176,-6196,32174,-6204,32172,-6212,32171,-6220,32169,-6229,32168,-6237,32166,-6245,32164,-6253,32163,-6262,32161,-6270,32160,-6278,32158,-6286,32156,-6294,32155,-6303,32153,-6311,32152,-6319,32150,-6327,32148,-6335,32147,-6344,32145,-6352,32143,-6360,32142,-6368,32140,-6377,32139,-6385,32137,-6393,32135,-6401,32134,-6409,32132,-6418,32130,-6426,32129,-6434,32127,-6442,32125,-6451,32124,-6459,32122,-6467,32120,-6475,32119,-6483,32117,-6492,32115,-6500,32114,-6508,32112,-6516,32110,-6524,32109,-6533,32107,-6541,32105,-6549,32104,-6557,32102,-6565,32100,-6574,32099,-6582,32097,-6590,32095,-6598,32094,-6607,32092,-6615,32090,-6623,32089,-6631,32087,-6639,32085,-6648,32084,-6656,32082,-6664,32080,-6672,32078,-6680,32077,-6689,32075,-6697,32073,-6705,32072,-6713,32070,-6721,32068,-6730,32066,-6738,32065,-6746,32063,-6754,32061,-6762,32059,-6771,32058,-6779,32056,-6787,32054,-6795,32053,-6803,32051,-6812,32049,-6820,32047,-6828,32046,-6836,32044,-6844,32042,-6852,32040,-6861,32039,-6869,32037,-6877,32035,-6885,32033,-6893,32032,-6902,32030,-6910,32028,-6918,32026,-6926,32024,-6934,32023,-6943,32021,-6951,32019,-6959,32017,-6967,32016,-6975,32014,-6983,32012,-6992,32010,-7000,32008,-7008,32007,-7016,32005,-7024,32003,-7033,32001,-7041,31999,-7049,31998,-7057,31996,-7065,31994,-7073,31992,-7082,31990,-7090,31989,-7098,31987,-7106,31985,-7114,31983,-7123,31981,-7131,31979,-7139,31978,-7147,31976,-7155,31974,-7163,31972,-7172,31970,-7180,31968,-7188,31967,-7196,31965,-7204,31963,-7212,31961,-7221,31959,-7229,31957,-7237,31956,-7245,31954,-7253,31952,-7262,31950,-7270,31948,-7278,31946,-7286,31944,-7294,31943,-7302,31941,-7311,31939,-7319,31937,-7327,31935,-7335,31933,-7343,31931,-7351,31929,-7359,31928,-7368,31926,-7376,31924,-7384,31922,-7392,31920,-7400,31918,-7408,31916,-7417,31914,-7425,31912,-7433,31911,-7441,31909,-7449,31907,-7457,31905,-7466,31903,-7474,31901,-7482,31899,-7490,31897,-7498,31895,-7506,31893,-7515,31891,-7523,31889,-7531,31888,-7539,31886,-7547,31884,-7555,31882,-7563,31880,-7572,31878,-7580,31876,-7588,31874,-7596,31872,-7604,31870,-7612,31868,-7620,31866,-7629,31864,-7637,31862,-7645,31860,-7653,31858,-7661,31856,-7669,31854,-7677,31853,-7686,31851,-7694,31849,-7702,31847,-7710,31845,-7718,31843,-7726,31841,-7734,31839,-7743,31837,-7751,31835,-7759,31833,-7767,31831,-7775,31829,-7783,31827,-7791,31825,-7800,31823,-7808,31821,-7816,31819,-7824,31817,-7832,31815,-7840,31813,-7848,31811,-7857,31809,-7865,31807,-7873,31805,-7881,31803,-7889,31801,-7897,31799,-7905,31797,-7913,31795,-7922,31793,-7930,31791,-7938,31789,-7946,31787,-7954,31785,-7962,31782,-7970,31780,-7978,31778,-7987,31776,-7995,31774,-8003,31772,-8011,31770,-8019,31768,-8027,31766,-8035,31764,-8043,31762,-8052,31760,-8060,31758,-8068,31756,-8076,31754,-8084,31752,-8092,31750,-8100,31748,-8108,31745,-8117,31743,-8125,31741,-8133,31739,-8141,31737,-8149,31735,-8157,31733,-8165,31731,-8173,31729,-8181,31727,-8190,31725,-8198,31723,-8206,31720,-8214,31718,-8222,31716,-8230,31714,-8238,31712,-8246,31710,-8254,31708,-8263,31706,-8271,31704,-8279,31701,-8287,31699,-8295,31697,-8303,31695,-8311,31693,-8319,31691,-8327,31689,-8335,31687,-8344,31684,-8352,31682,-8360,31680,-8368,31678,-8376,31676,-8384,31674,-8392,31672,-8400,31669,-8408,31667,-8416,31665,-8425,31663,-8433,31661,-8441,31659,-8449,31656,-8457,31654,-8465,31652,-8473,31650,-8481,31648,-8489,31646,-8497,31643,-8505,31641,-8514,31639,-8522,31637,-8530,31635,-8538,31633,-8546,31630,-8554,31628,-8562,31626,-8570,31624,-8578,31622,-8586,31619,-8594,31617,-8603,31615,-8611,31613,-8619,31611,-8627,31608,-8635,31606,-8643,31604,-8651,31602,-8659,31600,-8667,31597,-8675,31595,-8683,31593,-8691,31591,-8700,31588,-8708,31586,-8716,31584,-8724,31582,-8732,31580,-8740,31577,-8748,31575,-8756,31573,-8764,31571,-8772,31568,-8780,31566,-8788,31564,-8796,31562,-8804,31559,-8813,31557,-8821,31555,-8829,31553,-8837,31550,-8845,31548,-8853,31546,-8861,31544,-8869,31541,-8877,31539,-8885,31537,-8893,31534,-8901,31532,-8909,31530,-8917,31528,-8925,31525,-8933,31523,-8942,31521,-8950,31518,-8958,31516,-8966,31514,-8974,31512,-8982,31509,-8990,31507,-8998,31505,-9006,31502,-9014,31500,-9022,31498,-9030,31495,-9038,31493,-9046,31491,-9054,31489,-9062,31486,-9070,31484,-9078,31482,-9087,31479,-9095,31477,-9103,31475,-9111,31472,-9119,31470,-9127,31468,-9135,31465,-9143,31463,-9151,31461,-9159,31458,-9167,31456,-9175,31454,-9183,31451,-9191,31449,-9199,31446,-9207,31444,-9215,31442,-9223,31439,-9231,31437,-9239,31435,-9247,31432,-9255,31430,-9263,31428,-9271,31425,-9280,31423,-9288,31420,-9296,31418,-9304,31416,-9312,31413,-9320,31411,-9328,31409,-9336,31406,-9344,31404,-9352,31401,-9360,31399,-9368,31397,-9376,31394,-9384,31392,-9392,31389,-9400,31387,-9408,31385,-9416,31382,-9424,31380,-9432,31377,-9440,31375,-9448,31373,-9456,31370,-9464,31368,-9472,31365,-9480,31363,-9488,31360,-9496,31358,-9504,31356,-9512,31353,-9520,31351,-9528,31348,-9536,31346,-9544,31343,-9552,31341,-9560,31338,-9568,31336,-9576,31334,-9584,31331,-9592,31329,-9600,31326,-9608,31324,-9616,31321,-9624,31319,-9632,31316,-9640,31314,-9648,31311,-9656,31309,-9664,31307,-9672,31304,-9680,31302,-9688,31299,-9696,31297,-9704,31294,-9712,31292,-9720,31289,-9728,31287,-9736,31284,-9744,31282,-9752,31279,-9760,31277,-9768,31274,-9776,31272,-9784,31269,-9792,31267,-9800,31264,-9808,31262,-9816,31259,-9824,31257,-9832,31254,-9840,31252,-9848,31249,-9856,31247,-9864,31244,-9872,31242,-9880,31239,-9888,31236,-9896,31234,-9904,31231,-9912,31229,-9920,31226,-9928,31224,-9936,31221,-9944,31219,-9952,31216,-9960,31214,-9968,31211,-9976,31209,-9984,31206,-9992,31203,-10000,31201,-10008,31198,-10016,31196,-10024,31193,-10032,31191,-10040,31188,-10048,31185,-10056,31183,-10064,31180,-10072,31178,-10080,31175,-10088,31173,-10096,31170,-10104,31167,-10112,31165,-10120,31162,-10128,31160,-10136,31157,-10144,31154,-10152,31152,-10160,31149,-10167,31147,-10175,31144,-10183,31141,-10191,31139,-10199,31136,-10207,31134,-10215,31131,-10223,31128,-10231,31126,-10239,31123,-10247,31121,-10255,31118,-10263,31115,-10271,31113,-10279,31110,-10287,31107,-10295,31105,-10303,31102,-10311,31100,-10319,31097,-10327,31094,-10335,31092,-10343,31089,-10350,31086,-10358,31084,-10366,31081,-10374,31078,-10382,31076,-10390,31073,-10398,31070,-10406,31068,-10414,31065,-10422,31062,-10430,31060,-10438,31057,-10446,31054,-10454,31052,-10462,31049,-10470,31046,-10478,31044,-10485,31041,-10493,31038,-10501,31036,-10509,31033,-10517,31030,-10525,31028,-10533,31025,-10541,31022,-10549,31019,-10557,31017,-10565,31014,-10573,31011,-10581,31009,-10589,31006,-10597,31003,-10604,31001,-10612,30998,-10620,30995,-10628,30992,-10636,30990,-10644,30987,-10652,30984,-10660,30981,-10668,30979,-10676,30976,-10684,30973,-10692,30971,-10700,30968,-10707,30965,-10715,30962,-10723,30960,-10731,30957,-10739,30954,-10747,30951,-10755,30949,-10763,30946,-10771,30943,-10779,30940,-10787,30938,-10795,30935,-10802,30932,-10810,30929,-10818,30927,-10826,30924,-10834,30921,-10842,30918,-10850,30915,-10858,30913,-10866,30910,-10874,30907,-10881,30904,-10889,30902,-10897,30899,-10905,30896,-10913,30893,-10921,30890,-10929,30888,-10937,30885,-10945,30882,-10953,30879,-10960,30876,-10968,30874,-10976,30871,-10984,30868,-10992,30865,-11000,30862,-11008,30860,-11016,30857,-11024,30854,-11031,30851,-11039,30848,-11047,30845,-11055,30843,-11063,30840,-11071,30837,-11079,30834,-11087,30831,-11095,30828,-11102,30826,-11110,30823,-11118,30820,-11126,30817,-11134,30814,-11142,30811,-11150,30809,-11158,30806,-11165,30803,-11173,30800,-11181,30797,-11189,30794,-11197,30791,-11205,30788,-11213,30786,-11221,30783,-11228,30780,-11236,30777,-11244,30774,-11252,30771,-11260,30768,-11268,30766,-11276,30763,-11284,30760,-11291,30757,-11299,30754,-11307,30751,-11315,30748,-11323,30745,-11331,30742,-11339,30739,-11346,30737,-11354,30734,-11362,30731,-11370,30728,-11378,30725,-11386,30722,-11394,30719,-11401,30716,-11409,30713,-11417,30710,-11425,30707,-11433,30705,-11441,30702,-11449,30699,-11456,30696,-11464,30693,-11472,30690,-11480,30687,-11488,30684,-11496,30681,-11503,30678,-11511,30675,-11519,30672,-11527,30669,-11535,30666,-11543,30663,-11551,30660,-11558,30657,-11566,30655,-11574,30652,-11582,30649,-11590,30646,-11598,30643,-11605,30640,-11613,30637,-11621,30634,-11629,30631,-11637,30628,-11645,30625,-11652,30622,-11660,30619,-11668,30616,-11676,30613,-11684,30610,-11692,30607,-11699,30604,-11707,30601,-11715,30598,-11723,30595,-11731,30592,-11738,30589,-11746,30586,-11754,30583,-11762,30580,-11770,30577,-11778,30574,-11785,30571,-11793,30568,-11801,30565,-11809,30562,-11817,30559,-11824,30556,-11832,30553,-11840,30550,-11848,30547,-11856,30544,-11863,30541,-11871,30538,-11879,30535,-11887,30532,-11895,30528,-11903,30525,-11910,30522,-11918,30519,-11926,30516,-11934,30513,-11942,30510,-11949,30507,-11957,30504,-11965,30501,-11973,30498,-11981,30495,-11988,30492,-11996,30489,-12004,30486,-12012,30483,-12020,30480,-12027,30476,-12035,30473,-12043,30470,-12051,30467,-12058,30464,-12066,30461,-12074,30458,-12082,30455,-12090,30452,-12097,30449,-12105,30446,-12113,30442,-12121,30439,-12129,30436,-12136,30433,-12144,30430,-12152,30427,-12160,30424,-12167,30421,-12175,30418,-12183,30415,-12191,30411,-12199,30408,-12206,30405,-12214,30402,-12222,30399,-12230,30396,-12237,30393,-12245,30390,-12253,30386,-12261,30383,-12269,30380,-12276,30377,-12284,30374,-12292,30371,-12300,30368,-12307,30364,-12315,30361,-12323,30358,-12331,30355,-12338,30352,-12346,30349,-12354,30345,-12362,30342,-12369,30339,-12377,30336,-12385,30333,-12393,30330,-12400,30326,-12408,30323,-12416,30320,-12424,30317,-12431,30314,-12439,30311,-12447,30307,-12455,30304,-12462,30301,-12470,30298,-12478,30295,-12486,30291,-12493,30288,-12501,30285,-12509,30282,-12517,30279,-12524,30275,-12532,30272,-12540,30269,-12548,30266,-12555,30263,-12563,30259,-12571,30256,-12579,30253,-12586,30250,-12594,30247,-12602,30243,-12610,30240,-12617,30237,-12625,30234,-12633,30230,-12640,30227,-12648,30224,-12656,30221,-12664,30217,-12671,30214,-12679,30211,-12687,30208,-12695,30205,-12702,30201,-12710,30198,-12718,30195,-12725,30191,-12733,30188,-12741,30185,-12749,30182,-12756,30178,-12764,30175,-12772,30172,-12779,30169,-12787,30165,-12795,30162,-12803,30159,-12810,30156,-12818,30152,-12826,30149,-12833,30146,-12841,30142,-12849,30139,-12857,30136,-12864,30133,-12872,30129,-12880,30126,-12887,30123,-12895,30119,-12903,30116,-12910,30113,-12918,30109,-12926,30106,-12934,30103,-12941,30100,-12949,30096,-12957,30093,-12964,30090,-12972,30086,-12980,30083,-12987,30080,-12995,30076,-13003,30073,-13010,30070,-13018,30066,-13026,30063,-13034,30060,-13041,30056,-13049,30053,-13057,30050,-13064,30046,-13072,30043,-13080,30040,-13087,30036,-13095,30033,-13103,30030,-13110,30026,-13118,30023,-13126,30020,-13133,30016,-13141,30013,-13149,30009,-13156,30006,-13164,30003,-13172,29999,-13179,29996,-13187,29993,-13195,29989,-13202,29986,-13210,29983,-13218,29979,-13225,29976,-13233,29972,-13241,29969,-13248,29966,-13256,29962,-13264,29959,-13271,29955,-13279,29952,-13287,29949,-13294,29945,-13302,29942,-13310,29938,-13317,29935,-13325,29932,-13333,29928,-13340,29925,-13348,29921,-13356,29918,-13363,29915,-13371,29911,-13379,29908,-13386,29904,-13394,29901,-13401,29897,-13409,29894,-13417,29891,-13424,29887,-13432,29884,-13440,29880,-13447,29877,-13455,29873,-13463,29870,-13470,29866,-13478,29863,-13486,29860,-13493,29856,-13501,29853,-13508,29849,-13516,29846,-13524,29842,-13531,29839,-13539,29835,-13547,29832,-13554,29828,-13562,29825,-13569,29822,-13577,29818,-13585,29815,-13592,29811,-13600,29808,-13608,29804,-13615,29801,-13623,29797,-13630,29794,-13638,29790,-13646,29787,-13653,29783,-13661,29780,-13668,29776,-13676,29773,-13684,29769,-13691,29766,-13699,29762,-13707,29759,-13714,29755,-13722,29752,-13729,29748,-13737,29745,-13745,29741,-13752,29738,-13760,29734,-13767,29731,-13775,29727,-13783,29724,-13790,29720,-13798,29717,-13805,29713,-13813,29709,-13821,29706,-13828,29702,-13836,29699,-13843,29695,-13851,29692,-13859,29688,-13866,29685,-13874,29681,-13881,29678,-13889,29674,-13896,29670,-13904,29667,-13912,29663,-13919,29660,-13927,29656,-13934,29653,-13942,29649,-13950,29646,-13957,29642,-13965,29638,-13972,29635,-13980,29631,-13987,29628,-13995,29624,-14003,29621,-14010,29617,-14018,29613,-14025,29610,-14033,29606,-14040,29603,-14048,29599,-14056,29595,-14063,29592,-14071,29588,-14078,29585,-14086,29581,-14093,29577,-14101,29574,-14109,29570,-14116,29567,-14124,29563,-14131,29559,-14139,29556,-14146,29552,-14154,29548,-14161,29545,-14169,29541,-14177,29538,-14184,29534,-14192,29530,-14199,29527,-14207,29523,-14214,29519,-14222,29516,-14229,29512,-14237,29509,-14245,29505,-14252,29501,-14260,29498,-14267,29494,-14275,29490,-14282,29487,-14290,29483,-14297,29479,-14305,29476,-14312,29472,-14320,29468,-14327,29465,-14335,29461,-14343,29457,-14350,29454,-14358,29450,-14365,29446,-14373,29443,-14380,29439,-14388,29435,-14395,29432,-14403,29428,-14410,29424,-14418,29421,-14425,29417,-14433,29413,-14440,29410,-14448,29406,-14455,29402,-14463,29398,-14470,29395,-14478,29391,-14485,29387,-14493,29384,-14500,29380,-14508,29376,-14516,29372,-14523,29369,-14531,29365,-14538,29361,-14546,29358,-14553,29354,-14561,29350,-14568,29346,-14576,29343,-14583,29339,-14591,29335,-14598,29332,-14606,29328,-14613,29324,-14621,29320,-14628,29317,-14636,29313,-14643,29309,-14651,29305,-14658,29302,-14666,29298,-14673,29294,-14681,29290,-14688,29287,-14695,29283,-14703,29279,-14710,29275,-14718,29272,-14725,29268,-14733,29264,-14740,29260,-14748,29256,-14755,29253,-14763,29249,-14770,29245,-14778,29241,-14785,29238,-14793,29234,-14800,29230,-14808,29226,-14815,29222,-14823,29219,-14830,29215,-14838,29211,-14845,29207,-14853,29203,-14860,29200,-14867,29196,-14875,29192,-14882,29188,-14890,29184,-14897,29181,-14905,29177,-14912,29173,-14920,29169,-14927,29165,-14935,29162,-14942,29158,-14950,29154,-14957,29150,-14964,29146,-14972,29142,-14979,29139,-14987,29135,-14994,29131,-15002,29127,-15009,29123,-15017,29119,-15024,29116,-15031,29112,-15039,29108,-15046,29104,-15054,29100,-15061,29096,-15069,29092,-15076,29089,-15084,29085,-15091,29081,-15098,29077,-15106,29073,-15113,29069,-15121,29065,-15128,29062,-15136,29058,-15143,29054,-15150,29050,-15158,29046,-15165,29042,-15173,29038,-15180,29034,-15188,29031,-15195,29027,-15202,29023,-15210,29019,-15217,29015,-15225,29011,-15232,29007,-15239,29003,-15247,28999,-15254,28996,-15262,28992,-15269,28988,-15277,28984,-15284,28980,-15291,28976,-15299,28972,-15306,28968,-15314,28964,-15321,28960,-15328,28956,-15336,28953,-15343,28949,-15351,28945,-15358,28941,-15365,28937,-15373,28933,-15380,28929,-15388,28925,-15395,28921,-15402,28917,-15410,28913,-15417,28909,-15425,28905,-15432,28901,-15439,28897,-15447,28893,-15454,28890,-15462,28886,-15469,28882,-15476,28878,-15484,28874,-15491,28870,-15498,28866,-15506,28862,-15513,28858,-15521,28854,-15528,28850,-15535,28846,-15543,28842,-15550,28838,-15557,28834,-15565,28830,-15572,28826,-15580,28822,-15587,28818,-15594,28814,-15602,28810,-15609,28806,-15616,28802,-15624,28798,-15631,28794,-15639,28790,-15646,28786,-15653,28782,-15661,28778,-15668,28774,-15675,28770,-15683,28766,-15690,28762,-15697,28758,-15705,28754,-15712,28750,-15719,28746,-15727,28742,-15734,28738,-15741,28734,-15749,28730,-15756,28726,-15764,28722,-15771,28718,-15778,28714,-15786,28710,-15793,28706,-15800,28702,-15808,28698,-15815,28694,-15822,28690,-15830,28685,-15837,28681,-15844,28677,-15852,28673,-15859,28669,-15866,28665,-15874,28661,-15881,28657,-15888,28653,-15896,28649,-15903,28645,-15910,28641,-15918,28637,-15925,28633,-15932,28629,-15939,28625,-15947,28620,-15954,28616,-15961,28612,-15969,28608,-15976,28604,-15983,28600,-15991,28596,-15998,28592,-16005,28588,-16013,28584,-16020,28580,-16027,28575,-16035,28571,-16042,28567,-16049,28563,-16056,28559,-16064,28555,-16071,28551,-16078,28547,-16086,28543,-16093,28538,-16100,28534,-16108,28530,-16115,28526,-16122,28522,-16129,28518,-16137,28514,-16144,28510,-16151,28506,-16159,28501,-16166,28497,-16173,28493,-16180,28489,-16188,28485,-16195,28481,-16202,28477,-16210,28472,-16217,28468,-16224,28464,-16231,28460,-16239,28456,-16246,28452,-16253,28447,-16261,28443,-16268,28439,-16275,28435,-16282,28431,-16290,28427,-16297,28423,-16304,28418,-16311,28414,-16319,28410,-16326,28406,-16333,28402,-16340,28397,-16348,28393,-16355,28389,-16362,28385,-16369,28381,-16377,28377,-16384,28372,-16391,28368,-16399,28364,-16406,28360,-16413,28356,-16420,28351,-16428,28347,-16435,28343,-16442,28339,-16449,28335,-16456,28330,-16464,28326,-16471,28322,-16478,28318,-16485,28314,-16493,28309,-16500,28305,-16507,28301,-16514,28297,-16522,28292,-16529,28288,-16536,28284,-16543,28280,-16551,28275,-16558,28271,-16565,28267,-16572,28263,-16579,28259,-16587,28254,-16594,28250,-16601,28246,-16608,28242,-16616,28237,-16623,28233,-16630,28229,-16637,28225,-16644,28220,-16652,28216,-16659,28212,-16666,28208,-16673,28203,-16681,28199,-16688,28195,-16695,28190,-16702,28186,-16709,28182,-16717,28178,-16724,28173,-16731,28169,-16738,28165,-16745,28161,-16753,28156,-16760,28152,-16767,28148,-16774,28143,-16781,28139,-16789,28135,-16796,28131,-16803,28126,-16810,28122,-16817,28118,-16825,28113,-16832,28109,-16839,28105,-16846,28100,-16853,28096,-16860,28092,-16868,28087,-16875,28083,-16882,28079,-16889,28075,-16896,28070,-16904,28066,-16911,28062,-16918,28057,-16925,28053,-16932,28049,-16939,28044,-16947,28040,-16954,28036,-16961,28031,-16968,28027,-16975,28023,-16982,28018,-16990,28014,-16997,28009,-17004,28005,-17011,28001,-17018,27996,-17025,27992,-17033,27988,-17040,27983,-17047,27979,-17054,27975,-17061,27970,-17068,27966,-17075,27962,-17083,27957,-17090,27953,-17097,27948,-17104,27944,-17111,27940,-17118,27935,-17125,27931,-17133,27927,-17140,27922,-17147,27918,-17154,27913,-17161,27909,-17168,27905,-17175,27900,-17183,27896,-17190,27891,-17197,27887,-17204,27883,-17211,27878,-17218,27874,-17225,27869,-17233,27865,-17240,27861,-17247,27856,-17254,27852,-17261,27847,-17268,27843,-17275,27839,-17282,27834,-17289,27830,-17297,27825,-17304,27821,-17311,27816,-17318,27812,-17325,27808,-17332,27803,-17339,27799,-17346,27794,-17353,27790,-17361,27785,-17368,27781,-17375,27777,-17382,27772,-17389,27768,-17396,27763,-17403,27759,-17410,27754,-17417,27750,-17424,27745,-17432,27741,-17439,27736,-17446,27732,-17453,27728,-17460,27723,-17467,27719,-17474,27714,-17481,27710,-17488,27705,-17495,27701,-17502,27696,-17510,27692,-17517,27687,-17524,27683,-17531,27678,-17538,27674,-17545,27669,-17552,27665,-17559,27660,-17566,27656,-17573,27651,-17580,27647,-17587,27642,-17594,27638,-17601,27633,-17609,27629,-17616,27624,-17623,27620,-17630,27615,-17637,27611,-17644,27606,-17651,27602,-17658,27597,-17665,27593,-17672,27588,-17679,27584,-17686,27579,-17693,27575,-17700,27570,-17707,27566,-17714,27561,-17721,27557,-17728,27552,-17736,27548,-17743,27543,-17750,27538,-17757,27534,-17764,27529,-17771,27525,-17778,27520,-17785,27516,-17792,27511,-17799,27507,-17806,27502,-17813,27498,-17820,27493,-17827,27488,-17834,27484,-17841,27479,-17848,27475,-17855,27470,-17862,27466,-17869,27461,-17876,27456,-17883,27452,-17890,27447,-17897,27443,-17904,27438,-17911,27434,-17918,27429,-17925,27424,-17932,27420,-17939,27415,-17946,27411,-17953,27406,-17960,27401,-17967,27397,-17974,27392,-17981,27388,-17988,27383,-17995,27378,-18002,27374,-18009,27369,-18016,27365,-18023,27360,-18030,27355,-18037,27351,-18044,27346,-18051,27342,-18058,27337,-18065,27332,-18072,27328,-18079,27323,-18086,27319,-18093,27314,-18100,27309,-18107,27305,-18114,27300,-18121,27295,-18128,27291,-18135,27286,-18142,27281,-18149,27277,-18156,27272,-18163,27268,-18170,27263,-18177,27258,-18184,27254,-18191,27249,-18198,27244,-18205,27240,-18212,27235,-18219,27230,-18226,27226,-18233,27221,-18240,27216,-18247,27212,-18254,27207,-18261,27202,-18268,27198,-18274,27193,-18281,27188,-18288,27184,-18295,27179,-18302,27174,-18309,27170,-18316,27165,-18323,27160,-18330,27156,-18337,27151,-18344,27146,-18351,27141,-18358,27137,-18365,27132,-18372,27127,-18379,27123,-18386,27118,-18393,27113,-18399,27109,-18406,27104,-18413,27099,-18420,27094,-18427,27090,-18434,27085,-18441,27080,-18448,27076,-18455,27071,-18462,27066,-18469,27061,-18476,27057,-18483,27052,-18489,27047,-18496,27042,-18503,27038,-18510,27033,-18517,27028,-18524,27024,-18531,27019,-18538,27014,-18545,27009,-18552,27005,-18559,27000,-18565,26995,-18572,26990,-18579,26986,-18586,26981,-18593,26976,-18600,26971,-18607,26967,-18614,26962,-18621,26957,-18628,26952,-18634,26948,-18641,26943,-18648,26938,-18655,26933,-18662,26928,-18669,26924,-18676,26919,-18683,26914,-18690,26909,-18696,26905,-18703,26900,-18710,26895,-18717,26890,-18724,26885,-18731,26881,-18738,26876,-18745,26871,-18751,26866,-18758,26861,-18765,26857,-18772,26852,-18779,26847,-18786,26842,-18793,26837,-18799,26833,-18806,26828,-18813,26823,-18820,26818,-18827,26813,-18834,26809,-18841,26804,-18847,26799,-18854,26794,-18861,26789,-18868,26784,-18875,26780,-18882,26775,-18889,26770,-18895,26765,-18902,26760,-18909,26755,-18916,26751,-18923,26746,-18930,26741,-18936,26736,-18943,26731,-18950,26726,-18957,26722,-18964,26717,-18971,26712,-18977,26707,-18984,26702,-18991,26697,-18998,26692,-19005,26688,-19012,26683,-19018,26678,-19025,26673,-19032,26668,-19039,26663,-19046,26658,-19052,26654,-19059,26649,-19066,26644,-19073,26639,-19080,26634,-19087,26629,-19093,26624,-19100,26619,-19107,26615,-19114,26610,-19121,26605,-19127,26600,-19134,26595,-19141,26590,-19148,26585,-19155,26580,-19161,26575,-19168,26570,-19175,26566,-19182,26561,-19189,26556,-19195,26551,-19202,26546,-19209,26541,-19216,26536,-19222,26531,-19229,26526,-19236,26521,-19243,26516,-19250,26512,-19256,26507,-19263,26502,-19270,26497,-19277,26492,-19283,26487,-19290,26482,-19297,26477,-19304,26472,-19311,26467,-19317,26462,-19324,26457,-19331,26452,-19338,26447,-19344,26442,-19351,26437,-19358,26433,-19365,26428,-19371,26423,-19378,26418,-19385,26413,-19392,26408,-19398,26403,-19405,26398,-19412,26393,-19419,26388,-19425,26383,-19432,26378,-19439,26373,-19446,26368,-19452,26363,-19459,26358,-19466,26353,-19473,26348,-19479,26343,-19486,26338,-19493,26333,-19500,26328,-19506,26323,-19513,26318,-19520,26313,-19527,26308,-19533,26303,-19540,26298,-19547,26293,-19553,26288,-19560,26283,-19567,26278,-19574,26273,-19580,26268,-19587,26263,-19594,26258,-19600,26253,-19607,26248,-19614,26243,-19621,26238,-19627,26233,-19634,26228,-19641,26223,-19647,26218,-19654,26213,-19661,26208,-19668,26203,-19674,26198,-19681,26193,-19688,26188,-19694,26183,-19701,26178,-19708,26173,-19714,26168,-19721,26163,-19728,26158,-19734,26153,-19741,26148,-19748,26142,-19755,26137,-19761,26132,-19768,26127,-19775,26122,-19781,26117,-19788,26112,-19795,26107,-19801,26102,-19808,26097,-19815,26092,-19821,26087,-19828,26082,-19835,26077,-19841,26072,-19848,26067,-19855,26061,-19861,26056,-19868,26051,-19875,26046,-19881,26041,-19888,26036,-19895,26031,-19901,26026,-19908,26021,-19915,26016,-19921,26011,-19928,26006,-19934,26000,-19941,25995,-19948,25990,-19954,25985,-19961,25980,-19968,25975,-19974,25970,-19981,25965,-19988,25960,-19994,25954,-20001,25949,-20008,25944,-20014,25939,-20021,25934,-20027,25929,-20034,25924,-20041,25919,-20047,25913,-20054,25908,-20061,25903,-20067,25898,-20074,25893,-20080,25888,-20087,25883,-20094,25878,-20100,25872,-20107,25867,-20114,25862,-20120,25857,-20127,25852,-20133,25847,-20140,25842,-20147,25836,-20153,25831,-20160,25826,-20166,25821,-20173,25816,-20180,25811,-20186,25805,-20193,25800,-20199,25795,-20206,25790,-20213,25785,-20219,25780,-20226,25774,-20232,25769,-20239,25764,-20246,25759,-20252,25754,-20259,25749,-20265,25743,-20272,25738,-20278,25733,-20285,25728,-20292,25723,-20298,25717,-20305,25712,-20311,25707,-20318,25702,-20324,25697,-20331,25691,-20338,25686,-20344,25681,-20351,25676,-20357,25671,-20364,25665,-20370,25660,-20377,25655,-20384,25650,-20390,25645,-20397,25639,-20403,25634,-20410,25629,-20416,25624,-20423,25619,-20429,25613,-20436,25608,-20443,25603,-20449,25598,-20456,25592,-20462,25587,-20469,25582,-20475,25577,-20482,25571,-20488,25566,-20495,25561,-20501,25556,-20508,25550,-20514,25545,-20521,25540,-20528,25535,-20534,25529,-20541,25524,-20547,25519,-20554,25514,-20560,25508,-20567,25503,-20573,25498,-20580,25493,-20586,25487,-20593,25482,-20599,25477,-20606,25472,-20612,25466,-20619,25461,-20625,25456,-20632,25451,-20638,25445,-20645,25440,-20651,25435,-20658,25429,-20664,25424,-20671,25419,-20677,25414,-20684,25408,-20690,25403,-20697,25398,-20703,25392,-20710,25387,-20716,25382,-20723,25376,-20729,25371,-20736,25366,-20742,25361,-20749,25355,-20755,25350,-20762,25345,-20768,25339,-20775,25334,-20781,25329,-20788,25323,-20794,25318,-20801,25313,-20807,25307,-20814,25302,-20820,25297,-20826,25291,-20833,25286,-20839,25281,-20846,25276,-20852,25270,-20859,25265,-20865,25260,-20872,25254,-20878,25249,-20885,25243,-20891,25238,-20898,25233,-20904,25227,-20910,25222,-20917,25217,-20923,25211,-20930,25206,-20936,25201,-20943,25195,-20949,25190,-20956,25185,-20962,25179,-20968,25174,-20975,25169,-20981,25163,-20988,25158,-20994,25152,-21001,25147,-21007,25142,-21013,25136,-21020,25131,-21026,25126,-21033,25120,-21039,25115,-21046,25109,-21052,25104,-21058,25099,-21065,25093,-21071,25088,-21078,25083,-21084,25077,-21091,25072,-21097,25066,-21103,25061,-21110,25056,-21116,25050,-21123,25045,-21129,25039,-21135,25034,-21142,25029,-21148,25023,-21155,25018,-21161,25012,-21167,25007,-21174,25001,-21180,24996,-21187,24991,-21193,24985,-21199,24980,-21206,24974,-21212,24969,-21218,24964,-21225,24958,-21231,24953,-21238,24947,-21244,24942,-21250,24936,-21257,24931,-21263,24926,-21269,24920,-21276,24915,-21282,24909,-21289,24904,-21295,24898,-21301,24893,-21308,24887,-21314,24882,-21320,24877,-21327,24871,-21333,24866,-21340,24860,-21346,24855,-21352,24849,-21359,24844,-21365,24838,-21371,24833,-21378,24827,-21384,24822,-21390,24816,-21397,24811,-21403,24805,-21409,24800,-21416,24795,-21422,24789,-21428,24784,-21435,24778,-21441,24773,-21447,24767,-21454,24762,-21460,24756,-21466,24751,-21473,24745,-21479,24740,-21485,24734,-21492,24729,-21498,24723,-21504,24718,-21511,24712,-21517,24707,-21523,24701,-21530,24696,-21536,24690,-21542,24685,-21549,24679,-21555,24674,-21561,24668,-21567,24663,-21574,24657,-21580,24652,-21586,24646,-21593,24641,-21599,24635,-21605,24630,-21612,24624,-21618,24618,-21624,24613,-21630,24607,-21637,24602,-21643,24596,-21649,24591,-21656,24585,-21662,24580,-21668,24574,-21674,24569,-21681,24563,-21687,24558,-21693,24552,-21700,24546,-21706,24541,-21712,24535,-21718,24530,-21725,24524,-21731,24519,-21737,24513,-21744,24508,-21750,24502,-21756,24496,-21762,24491,-21769,24485,-21775,24480,-21781,24474,-21787,24469,-21794,24463,-21800,24457,-21806,24452,-21812,24446,-21819,24441,-21825,24435,-21831,24430,-21837,24424,-21844,24418,-21850,24413,-21856,24407,-21862,24402,-21869,24396,-21875,24390,-21881,24385,-21887,24379,-21894,24374,-21900,24368,-21906,24362,-21912,24357,-21918,24351,-21925,24346,-21931,24340,-21937,24334,-21943,24329,-21950,24323,-21956,24318,-21962,24312,-21968,24306,-21974,24301,-21981,24295,-21987,24289,-21993,24284,-21999,24278,-22005,24273,-22012,24267,-22018,24261,-22024,24256,-22030,24250,-22036,24244,-22043,24239,-22049,24233,-22055,24228,-22061,24222,-22067,24216,-22074,24211,-22080,24205,-22086,24199,-22092,24194,-22098,24188,-22105,24182,-22111,24177,-22117,24171,-22123,24165,-22129,24160,-22136,24154,-22142,24148,-22148,24143,-22154,24137,-22160,24131,-22166,24126,-22173,24120,-22179,24114,-22185,24109,-22191,24103,-22197,24097,-22203,24092,-22210,24086,-22216,24080,-22222,24075,-22228,24069,-22234,24063,-22240,24058,-22246,24052,-22253,24046,-22259,24041,-22265,24035,-22271,24029,-22277,24023,-22283,24018,-22289,24012,-22296,24006,-22302,24001,-22308,23995,-22314,23989,-22320,23984,-22326,23978,-22332,23972,-22339,23966,-22345,23961,-22351,23955,-22357,23949,-22363,23944,-22369,23938,-22375,23932,-22381,23926,-22388,23921,-22394,23915,-22400,23909,-22406,23903,-22412,23898,-22418,23892,-22424,23886,-22430,23881,-22436,23875,-22443,23869,-22449,23863,-22455,23858,-22461,23852,-22467,23846,-22473,23840,-22479,23835,-22485,23829,-22491,23823,-22497,23817,-22504,23812,-22510,23806,-22516,23800,-22522,23794,-22528,23789,-22534,23783,-22540,23777,-22546,23771,-22552,23766,-22558,23760,-22564,23754,-22570,23748,-22576,23742,-22583,23737,-22589,23731,-22595,23725,-22601,23719,-22607,23714,-22613,23708,-22619,23702,-22625,23696,-22631,23690,-22637,23685,-22643,23679,-22649,23673,-22655,23667,-22661,23661,-22667,23656,-22673,23650,-22679,23644,-22686,23638,-22692,23632,-22698,23627,-22704,23621,-22710,23615,-22716,23609,-22722,23603,-22728,23598,-22734,23592,-22740,23586,-22746,23580,-22752,23574,-22758,23569,-22764,23563,-22770,23557,-22776,23551,-22782,23545,-22788,23539,-22794,23534,-22800,23528,-22806,23522,-22812,23516,-22818,23510,-22824,23504,-22830,23499,-22836,23493,-22842,23487,-22848,23481,-22854,23475,-22860,23469,-22866,23464,-22872,23458,-22878,23452,-22884,23446,-22890,23440,-22896,23434,-22902,23428,-22908,23423,-22914,23417,-22920,23411,-22926,23405,-22932,23399,-22938,23393,-22944,23387,-22950,23382,-22956,23376,-22962,23370,-22968,23364,-22974,23358,-22980,23352,-22986,23346,-22992,23340,-22998,23335,-23004,23329,-23010,23323,-23016,23317,-23022,23311,-23028,23305,-23034,23299,-23040,23293,-23046,23287,-23051,23282,-23057,23276,-23063,23270,-23069,23264,-23075,23258,-23081,23252,-23087,23246,-23093,23240,-23099,23234,-23105,23228,-23111,23223,-23117,23217,-23123,23211,-23129,23205,-23135,23199,-23141,23193,-23147,23187,-23152,23181,-23158,23175,-23164,23169,-23170,23163,-23176,23157,-23182,23151,-23188,23146,-23194,23140,-23200,23134,-23206,23128,-23212,23122,-23218,23116,-23224,23110,-23229,23104,-23235,23098,-23241,23092,-23247,23086,-23253,23080,-23259,23074,-23265,23068,-23271,23062,-23277,23056,-23283,23050,-23288,23045,-23294,23039,-23300,23033,-23306,23027,-23312,23021,-23318,23015,-23324,23009,-23330,23003,-23336,22997,-23341,22991,-23347,22985,-23353,22979,-23359,22973,-23365,22967,-23371,22961,-23377,22955,-23383,22949,-23388,22943,-23394,22937,-23400,22931,-23406,22925,-23412,22919,-23418,22913,-23424,22907,-23429,22901,-23435,22895,-23441,22889,-23447,22883,-23453,22877,-23459,22871,-23465,22865,-23470,22859,-23476,22853,-23482,22847,-23488,22841,-23494,22835,-23500,22829,-23505,22823,-23511,22817,-23517,22811,-23523,22805,-23529,22799,-23535,22793,-23540,22787,-23546,22781,-23552,22775,-23558,22769,-23564,22763,-23570,22757,-23575,22751,-23581,22745,-23587,22739,-23593,22733,-23599,22727,-23604,22721,-23610,22715,-23616,22709,-23622,22703,-23628,22697,-23633,22691,-23639,22685,-23645,22678,-23651,22672,-23657,22666,-23662,22660,-23668,22654,-23674,22648,-23680,22642,-23686,22636,-23691,22630,-23697,22624,-23703,22618,-23709,22612,-23715,22606,-23720,22600,-23726,22594,-23732,22588,-23738,22582,-23743,22575,-23749,22569,-23755,22563,-23761,22557,-23767,22551,-23772,22545,-23778,22539,-23784,22533,-23790,22527,-23795,22521,-23801,22515,-23807,22509,-23813,22503,-23818,22496,-23824,22490,-23830,22484,-23836,22478,-23841,22472,-23847,22466,-23853,22460,-23859,22454,-23864,22448,-23870,22442,-23876,22435,-23882,22429,-23887,22423,-23893,22417,-23899,22411,-23904,22405,-23910,22399,-23916,22393,-23922,22387,-23927,22380,-23933,22374,-23939,22368,-23945,22362,-23950,22356,-23956,22350,-23962,22344,-23967,22338,-23973,22331,-23979,22325,-23985,22319,-23990,22313,-23996,22307,-24002,22301,-24007,22295,-24013,22288,-24019,22282,-24024,22276,-24030,22270,-24036,22264,-24042,22258,-24047,22252,-24053,22245,-24059,22239,-24064,22233,-24070,22227,-24076,22221,-24081,22215,-24087,22209,-24093,22202,-24098,22196,-24104,22190,-24110,22184,-24115,22178,-24121,22172,-24127,22165,-24132,22159,-24138,22153,-24144,22147,-24149,22141,-24155,22135,-24161,22128,-24166,22122,-24172,22116,-24178,22110,-24183,22104,-24189,22097,-24195,22091,-24200,22085,-24206,22079,-24212,22073,-24217,22066,-24223,22060,-24229,22054,-24234,22048,-24240,22042,-24245,22035,-24251,22029,-24257,22023,-24262,22017,-24268,22011,-24274,22004,-24279,21998,-24285,21992,-24290,21986,-24296,21980,-24302,21973,-24307,21967,-24313,21961,-24319,21955,-24324,21949,-24330,21942,-24335,21936,-24341,21930,-24347,21924,-24352,21917,-24358,21911,-24363,21905,-24369,21899,-24375,21893,-24380,21886,-24386,21880,-24391,21874,-24397,21868,-24403,21861,-24408,21855,-24414,21849,-24419,21843,-24425,21836,-24431,21830,-24436,21824,-24442,21818,-24447,21811,-24453,21805,-24458,21799,-24464,21793,-24470,21786,-24475,21780,-24481,21774,-24486,21768,-24492,21761,-24497,21755,-24503,21749,-24509,21743,-24514,21736,-24520,21730,-24525,21724,-24531,21717,-24536,21711,-24542,21705,-24547,21699,-24553,21692,-24559,21686,-24564,21680,-24570,21673,-24575,21667,-24581,21661,-24586,21655,-24592,21648,-24597,21642,-24603,21636,-24608,21629,-24614,21623,-24619,21617,-24625,21611,-24631,21604,-24636,21598,-24642,21592,-24647,21585,-24653,21579,-24658,21573,-24664,21566,-24669,21560,-24675,21554,-24680,21548,-24686,21541,-24691,21535,-24697,21529,-24702,21522,-24708,21516,-24713,21510,-24719,21503,-24724,21497,-24730,21491,-24735,21484,-24741,21478,-24746,21472,-24752,21465,-24757,21459,-24763,21453,-24768,21446,-24774,21440,-24779,21434,-24785,21427,-24790,21421,-24796,21415,-24801,21408,-24806,21402,-24812,21396,-24817,21389,-24823,21383,-24828,21377,-24834,21370,-24839,21364,-24845,21358,-24850,21351,-24856,21345,-24861,21339,-24867,21332,-24872,21326,-24878,21319,-24883,21313,-24888,21307,-24894,21300,-24899,21294,-24905,21288,-24910,21281,-24916,21275,-24921,21268,-24927,21262,-24932,21256,-24937,21249,-24943,21243,-24948,21237,-24954,21230,-24959,21224,-24965,21217,-24970,21211,-24975,21205,-24981,21198,-24986,21192,-24992,21186,-24997,21179,-25002,21173,-25008,21166,-25013,21160,-25019,21154,-25024,21147,-25030,21141,-25035,21134,-25040,21128,-25046,21122,-25051,21115,-25057,21109,-25062,21102,-25067,21096,-25073,21090,-25078,21083,-25084,21077,-25089,21070,-25094,21064,-25100,21057,-25105,21051,-25110,21045,-25116,21038,-25121,21032,-25127,21025,-25132,21019,-25137,21012,-25143,21006,-25148,21000,-25153,20993,-25159,20987,-25164,20980,-25170,20974,-25175,20967,-25180,20961,-25186,20955,-25191,20948,-25196,20942,-25202,20935,-25207,20929,-25212,20922,-25218,20916,-25223,20909,-25228,20903,-25234,20897,-25239,20890,-25244,20884,-25250,20877,-25255,20871,-25261,20864,-25266,20858,-25271,20851,-25277,20845,-25282,20838,-25287,20832,-25292,20825,-25298,20819,-25303,20813,-25308,20806,-25314,20800,-25319,20793,-25324,20787,-25330,20780,-25335,20774,-25340,20767,-25346,20761,-25351,20754,-25356,20748,-25362,20741,-25367,20735,-25372,20728,-25377,20722,-25383,20715,-25388,20709,-25393,20702,-25399,20696,-25404,20689,-25409,20683,-25415,20676,-25420,20670,-25425,20663,-25430,20657,-25436,20650,-25441,20644,-25446,20637,-25452,20631,-25457,20624,-25462,20618,-25467,20611,-25473,20605,-25478,20598,-25483,20592,-25488,20585,-25494,20579,-25499,20572,-25504,20566,-25509,20559,-25515,20553,-25520,20546,-25525,20540,-25530,20533,-25536,20527,-25541,20520,-25546,20513,-25551,20507,-25557,20500,-25562,20494,-25567,20487,-25572,20481,-25578,20474,-25583,20468,-25588,20461,-25593,20455,-25599,20448,-25604,20442,-25609,20435,-25614,20428,-25620,20422,-25625,20415,-25630,20409,-25635,20402,-25640,20396,-25646,20389,-25651,20383,-25656,20376,-25661,20369,-25666,20363,-25672,20356,-25677,20350,-25682,20343,-25687,20337,-25692,20330,-25698,20323,-25703,20317,-25708,20310,-25713,20304,-25718,20297,-25724,20291,-25729,20284,-25734,20277,-25739,20271,-25744,20264,-25750,20258,-25755,20251,-25760,20245,-25765,20238,-25770,20231,-25775,20225,-25781,20218,-25786,20212,-25791,20205,-25796,20198,-25801,20192,-25806,20185,-25812,20179,-25817,20172,-25822,20165,-25827,20159,-25832,20152,-25837,20146,-25843,20139,-25848,20132,-25853,20126,-25858,20119,-25863,20113,-25868,20106,-25873,20099,-25879,20093,-25884,20086,-25889,20079,-25894,20073,-25899,20066,-25904,20060,-25909,20053,-25914,20046,-25920,20040,-25925,20033,-25930,20026,-25935,20020,-25940,20013,-25945,20007,-25950,20000,-25955,19993,-25961,19987,-25966,19980,-25971,19973,-25976,19967,-25981,19960,-25986,19953,-25991,19947,-25996,19940,-26001,19933,-26007,19927,-26012,19920,-26017,19914,-26022,19907,-26027,19900,-26032,19894,-26037,19887,-26042,19880,-26047,19874,-26052,19867,-26057,19860,-26062,19854,-26068,19847,-26073,19840,-26078,19834,-26083,19827,-26088,19820,-26093,19814,-26098,19807,-26103,19800,-26108,19794,-26113,19787,-26118,19780,-26123,19774,-26128,19767,-26133,19760,-26138,19754,-26143,19747,-26149,19740,-26154,19733,-26159,19727,-26164,19720,-26169,19713,-26174,19707,-26179,19700,-26184,19693,-26189,19687,-26194,19680,-26199,19673,-26204,19667,-26209,19660,-26214,19653,-26219,19646,-26224,19640,-26229,19633,-26234,19626,-26239,19620,-26244,19613,-26249,19606,-26254,19599,-26259,19593,-26264,19586,-26269,19579,-26274,19573,-26279,19566,-26284,19559,-26289,19552,-26294,19546,-26299,19539,-26304,19532,-26309,19526,-26314,19519,-26319,19512,-26324,19505,-26329,19499,-26334,19492,-26339,19485,-26344,19478,-26349,19472,-26354,19465,-26359,19458,-26364,19451,-26369,19445,-26374,19438,-26379,19431,-26384,19424,-26389,19418,-26394,19411,-26399,19404,-26404,19397,-26409,19391,-26414,19384,-26419,19377,-26424,19370,-26429,19364,-26434,19357,-26438,19350,-26443,19343,-26448,19337,-26453,19330,-26458,19323,-26463,19316,-26468,19310,-26473,19303,-26478,19296,-26483,19289,-26488,19282,-26493,19276,-26498,19269,-26503,19262,-26508,19255,-26513,19249,-26517,19242,-26522,19235,-26527,19228,-26532,19221,-26537,19215,-26542,19208,-26547,19201,-26552,19194,-26557,19188,-26562,19181,-26567,19174,-26571,19167,-26576,19160,-26581,19154,-26586,19147,-26591,19140,-26596,19133,-26601,19126,-26606,19120,-26611,19113,-26616,19106,-26620,19099,-26625,19092,-26630,19086,-26635,19079,-26640,19072,-26645,19065,-26650,19058,-26655,19051,-26659,19045,-26664,19038,-26669,19031,-26674,19024,-26679,19017,-26684,19011,-26689,19004,-26693,18997,-26698,18990,-26703,18983,-26708,18976,-26713,18970,-26718,18963,-26723,18956,-26727,18949,-26732,18942,-26737,18935,-26742,18929,-26747,18922,-26752,18915,-26756,18908,-26761,18901,-26766,18894,-26771,18888,-26776,18881,-26781,18874,-26785,18867,-26790,18860,-26795,18853,-26800,18846,-26805,18840,-26810,18833,-26814,18826,-26819,18819,-26824,18812,-26829,18805,-26834,18798,-26838,18792,-26843,18785,-26848,18778,-26853,18771,-26858,18764,-26862,18757,-26867,18750,-26872,18744,-26877,18737,-26882,18730,-26886,18723,-26891,18716,-26896,18709,-26901,18702,-26906,18695,-26910,18689,-26915,18682,-26920,18675,-26925,18668,-26929,18661,-26934,18654,-26939,18647,-26944,18640,-26949,18633,-26953,18627,-26958,18620,-26963,18613,-26968,18606,-26972,18599,-26977,18592,-26982,18585,-26987,18578,-26991,18571,-26996,18564,-27001,18558,-27006,18551,-27010,18544,-27015,18537,-27020,18530,-27025,18523,-27029,18516,-27034,18509,-27039,18502,-27043,18495,-27048,18488,-27053,18482,-27058,18475,-27062,18468,-27067,18461,-27072,18454,-27077,18447,-27081,18440,-27086,18433,-27091,18426,-27095,18419,-27100,18412,-27105,18405,-27110,18398,-27114,18392,-27119,18385,-27124,18378,-27128,18371,-27133,18364,-27138,18357,-27142,18350,-27147,18343,-27152,18336,-27157,18329,-27161,18322,-27166,18315,-27171,18308,-27175,18301,-27180,18294,-27185,18287,-27189,18280,-27194,18273,-27199,18267,-27203,18260,-27208,18253,-27213,18246,-27217,18239,-27222,18232,-27227,18225,-27231,18218,-27236,18211,-27241,18204,-27245,18197,-27250,18190,-27255,18183,-27259,18176,-27264,18169,-27269,18162,-27273,18155,-27278,18148,-27282,18141,-27287,18134,-27292,18127,-27296,18120,-27301,18113,-27306,18106,-27310,18099,-27315,18092,-27320,18085,-27324,18078,-27329,18071,-27333,18064,-27338,18057,-27343,18050,-27347,18043,-27352,18036,-27356,18029,-27361,18022,-27366,18015,-27370,18008,-27375,18001,-27379,17994,-27384,17987,-27389,17980,-27393,17973,-27398,17966,-27402,17959,-27407,17952,-27412,17945,-27416,17938,-27421,17931,-27425,17924,-27430,17917,-27435,17910,-27439,17903,-27444,17896,-27448,17889,-27453,17882,-27457,17875,-27462,17868,-27467,17861,-27471,17854,-27476,17847,-27480,17840,-27485,17833,-27489,17826,-27494,17819,-27499,17812,-27503,17805,-27508,17798,-27512,17791,-27517,17784,-27521,17777,-27526,17770,-27530,17763,-27535,17756,-27539,17749,-27544,17742,-27549,17735,-27553,17727,-27558,17720,-27562,17713,-27567,17706,-27571,17699,-27576,17692,-27580,17685,-27585,17678,-27589,17671,-27594,17664,-27598,17657,-27603,17650,-27607,17643,-27612,17636,-27616,17629,-27621,17622,-27625,17615,-27630,17608,-27634,17600,-27639,17593,-27643,17586,-27648,17579,-27652,17572,-27657,17565,-27661,17558,-27666,17551,-27670,17544,-27675,17537,-27679,17530,-27684,17523,-27688,17516,-27693,17509,-27697,17501,-27702,17494,-27706,17487,-27711,17480,-27715,17473,-27720,17466,-27724,17459,-27729,17452,-27733,17445,-27737,17438,-27742,17431,-27746,17423,-27751,17416,-27755,17409,-27760,17402,-27764,17395,-27769,17388,-27773,17381,-27778,17374,-27782,17367,-27786,17360,-27791,17352,-27795,17345,-27800,17338,-27804,17331,-27809,17324,-27813,17317,-27817,17310,-27822,17303,-27826,17296,-27831,17288,-27835,17281,-27840,17274,-27844,17267,-27848,17260,-27853,17253,-27857,17246,-27862,17239,-27866,17232,-27870,17224,-27875,17217,-27879,17210,-27884,17203,-27888,17196,-27892,17189,-27897,17182,-27901,17174,-27906,17167,-27910,17160,-27914,17153,-27919,17146,-27923,17139,-27928,17132,-27932,17124,-27936,17117,-27941,17110,-27945,17103,-27949,17096,-27954,17089,-27958,17082,-27963,17074,-27967,17067,-27971,17060,-27976,17053,-27980,17046,-27984,17039,-27989,17032,-27993,17024,-27997,17017,-28002,17010,-28006,17003,-28010,16996,-28015,16989,-28019,16981,-28024,16974,-28028,16967,-28032,16960,-28037,16953,-28041,16946,-28045,16938,-28050,16931,-28054,16924,-28058,16917,-28063,16910,-28067,16903,-28071,16895,-28076,16888,-28080,16881,-28084,16874,-28088,16867,-28093,16859,-28097,16852,-28101,16845,-28106,16838,-28110,16831,-28114,16824,-28119,16816,-28123,16809,-28127,16802,-28132,16795,-28136,16788,-28140,16780,-28144,16773,-28149,16766,-28153,16759,-28157,16752,-28162,16744,-28166,16737,-28170,16730,-28174,16723,-28179,16716,-28183,16708,-28187,16701,-28191,16694,-28196,16687,-28200,16680,-28204,16672,-28209,16665,-28213,16658,-28217,16651,-28221,16643,-28226,16636,-28230,16629,-28234,16622,-28238,16615,-28243,16607,-28247,16600,-28251,16593,-28255,16586,-28260,16578,-28264,16571,-28268,16564,-28272,16557,-28276,16550,-28281,16542,-28285,16535,-28289,16528,-28293,16521,-28298,16513,-28302,16506,-28306,16499,-28310,16492,-28315,16484,-28319,16477,-28323,16470,-28327,16463,-28331,16455,-28336,16448,-28340,16441,-28344,16434,-28348,16427,-28352,16419,-28357,16412,-28361,16405,-28365,16398,-28369,16390,-28373,16383,-28378,16376,-28382,16368,-28386,16361,-28390,16354,-28394,16347,-28398,16339,-28403,16332,-28407,16325,-28411,16318,-28415,16310,-28419,16303,-28424,16296,-28428,16289,-28432,16281,-28436,16274,-28440,16267,-28444,16260,-28448,16252,-28453,16245,-28457,16238,-28461,16230,-28465,16223,-28469,16216,-28473,16209,-28478,16201,-28482,16194,-28486,16187,-28490,16179,-28494,16172,-28498,16165,-28502,16158,-28507,16150,-28511,16143,-28515,16136,-28519,16128,-28523,16121,-28527,16114,-28531,16107,-28535,16099,-28539,16092,-28544,16085,-28548,16077,-28552,16070,-28556,16063,-28560,16055,-28564,16048,-28568,16041,-28572,16034,-28576,16026,-28581,16019,-28585,16012,-28589,16004,-28593,15997,-28597,15990,-28601,15982,-28605,15975,-28609,15968,-28613,15960,-28617,15953,-28621,15946,-28626,15938,-28630,15931,-28634,15924,-28638,15917,-28642,15909,-28646,15902,-28650,15895,-28654,15887,-28658,15880,-28662,15873,-28666,15865,-28670,15858,-28674,15851,-28678,15843,-28682,15836,-28686,15829,-28691,15821,-28695,15814,-28699,15807,-28703,15799,-28707,15792,-28711,15785,-28715,15777,-28719,15770,-28723,15763,-28727,15755,-28731,15748,-28735,15740,-28739,15733,-28743,15726,-28747,15718,-28751,15711,-28755,15704,-28759,15696,-28763,15689,-28767,15682,-28771,15674,-28775,15667,-28779,15660,-28783,15652,-28787,15645,-28791,15638,-28795,15630,-28799,15623,-28803,15615,-28807,15608,-28811,15601,-28815,15593,-28819,15586,-28823,15579,-28827,15571,-28831,15564,-28835,15556,-28839,15549,-28843,15542,-28847,15534,-28851,15527,-28855,15520,-28859,15512,-28863,15505,-28867,15497,-28871,15490,-28875,15483,-28879,15475,-28883,15468,-28887,15461,-28891,15453,-28894,15446,-28898,15438,-28902,15431,-28906,15424,-28910,15416,-28914,15409,-28918,15401,-28922,15394,-28926,15387,-28930,15379,-28934,15372,-28938,15364,-28942,15357,-28946,15350,-28950,15342,-28954,15335,-28957,15327,-28961,15320,-28965,15313,-28969,15305,-28973,15298,-28977,15290,-28981,15283,-28985,15276,-28989,15268,-28993,15261,-28997,15253,-29000,15246,-29004,15238,-29008,15231,-29012,15224,-29016,15216,-29020,15209,-29024,15201,-29028,15194,-29032,15187,-29035,15179,-29039,15172,-29043,15164,-29047,15157,-29051,15149,-29055,15142,-29059,15135,-29063,15127,-29066,15120,-29070,15112,-29074,15105,-29078,15097,-29082,15090,-29086,15083,-29090,15075,-29093,15068,-29097,15060,-29101,15053,-29105,15045,-29109,15038,-29113,15030,-29117,15023,-29120,15016,-29124,15008,-29128,15001,-29132,14993,-29136,14986,-29140,14978,-29143,14971,-29147,14963,-29151,14956,-29155,14949,-29159,14941,-29163,14934,-29166,14926,-29170,14919,-29174,14911,-29178,14904,-29182,14896,-29185,14889,-29189,14881,-29193,14874,-29197,14866,-29201,14859,-29204,14852,-29208,14844,-29212,14837,-29216,14829,-29220,14822,-29223,14814,-29227,14807,-29231,14799,-29235,14792,-29239,14784,-29242,14777,-29246,14769,-29250,14762,-29254,14754,-29257,14747,-29261,14739,-29265,14732,-29269,14724,-29273,14717,-29276,14709,-29280,14702,-29284,14694,-29288,14687,-29291,14680,-29295,14672,-29299,14665,-29303,14657,-29306,14650,-29310,14642,-29314,14635,-29318,14627,-29321,14620,-29325,14612,-29329,14605,-29333,14597,-29336,14590,-29340,14582,-29344,14575,-29347,14567,-29351,14560,-29355,14552,-29359,14545,-29362,14537,-29366,14530,-29370,14522,-29373,14515,-29377,14507,-29381,14499,-29385,14492,-29388,14484,-29392,14477,-29396,14469,-29399,14462,-29403,14454,-29407,14447,-29411,14439,-29414,14432,-29418,14424,-29422,14417,-29425,14409,-29429,14402,-29433,14394,-29436,14387,-29440,14379,-29444,14372,-29447,14364,-29451,14357,-29455,14349,-29458,14342,-29462,14334,-29466,14326,-29469,14319,-29473,14311,-29477,14304,-29480,14296,-29484,14289,-29488,14281,-29491,14274,-29495,14266,-29499,14259,-29502,14251,-29506,14244,-29510,14236,-29513,14228,-29517,14221,-29520,14213,-29524,14206,-29528,14198,-29531,14191,-29535,14183,-29539,14176,-29542,14168,-29546,14160,-29549,14153,-29553,14145,-29557,14138,-29560,14130,-29564,14123,-29568,14115,-29571,14108,-29575,14100,-29578,14092,-29582,14085,-29586,14077,-29589,14070,-29593,14062,-29596,14055,-29600,14047,-29604,14039,-29607,14032,-29611,14024,-29614,14017,-29618,14009,-29622,14002,-29625,13994,-29629,13986,-29632,13979,-29636,13971,-29639,13964,-29643,13956,-29647,13949,-29650,13941,-29654,13933,-29657,13926,-29661,13918,-29664,13911,-29668,13903,-29671,13895,-29675,13888,-29679,13880,-29682,13873,-29686,13865,-29689,13858,-29693,13850,-29696,13842,-29700,13835,-29703,13827,-29707,13820,-29710,13812,-29714,13804,-29718,13797,-29721,13789,-29725,13782,-29728,13774,-29732,13766,-29735,13759,-29739,13751,-29742,13744,-29746,13736,-29749,13728,-29753,13721,-29756,13713,-29760,13706,-29763,13698,-29767,13690,-29770,13683,-29774,13675,-29777,13667,-29781,13660,-29784,13652,-29788,13645,-29791,13637,-29795,13629,-29798,13622,-29802,13614,-29805,13607,-29809,13599,-29812,13591,-29816,13584,-29819,13576,-29823,13568,-29826,13561,-29829,13553,-29833,13546,-29836,13538,-29840,13530,-29843,13523,-29847,13515,-29850,13507,-29854,13500,-29857,13492,-29861,13485,-29864,13477,-29867,13469,-29871,13462,-29874,13454,-29878,13446,-29881,13439,-29885,13431,-29888,13423,-29892,13416,-29895,13408,-29898,13400,-29902,13393,-29905,13385,-29909,13378,-29912,13370,-29916,13362,-29919,13355,-29922,13347,-29926,13339,-29929,13332,-29933,13324,-29936,13316,-29939,13309,-29943,13301,-29946,13293,-29950,13286,-29953,13278,-29956,13270,-29960,13263,-29963,13255,-29967,13247,-29970,13240,-29973,13232,-29977,13224,-29980,13217,-29984,13209,-29987,13201,-29990,13194,-29994,13186,-29997,13178,-30000,13171,-30004,13163,-30007,13155,-30010,13148,-30014,13140,-30017,13132,-30021,13125,-30024,13117,-30027,13109,-30031,13102,-30034,13094,-30037,13086,-30041,13079,-30044,13071,-30047,13063,-30051,13056,-30054,13048,-30057,13040,-30061,13033,-30064,13025,-30067,13017,-30071,13009,-30074,13002,-30077,12994,-30081,12986,-30084,12979,-30087,12971,-30091,12963,-30094,12956,-30097,12948,-30101,12940,-30104,12933,-30107,12925,-30110,12917,-30114,12909,-30117,12902,-30120,12894,-30124,12886,-30127,12879,-30130,12871,-30134,12863,-30137,12856,-30140,12848,-30143,12840,-30147,12832,-30150,12825,-30153,12817,-30157,12809,-30160,12802,-30163,12794,-30166,12786,-30170,12778,-30173,12771,-30176,12763,-30179,12755,-30183,12748,-30186,12740,-30189,12732,-30192,12724,-30196,12717,-30199,12709,-30202,12701,-30206,12694,-30209,12686,-30212,12678,-30215,12670,-30218,12663,-30222,12655,-30225,12647,-30228,12639,-30231,12632,-30235,12624,-30238,12616,-30241,12609,-30244,12601,-30248,12593,-30251,12585,-30254,12578,-30257,12570,-30260,12562,-30264,12554,-30267,12547,-30270,12539,-30273,12531,-30276,12523,-30280,12516,-30283,12508,-30286,12500,-30289,12492,-30292,12485,-30296,12477,-30299,12469,-30302,12461,-30305,12454,-30308,12446,-30312,12438,-30315,12430,-30318,12423,-30321,12415,-30324,12407,-30327,12399,-30331,12392,-30334,12384,-30337,12376,-30340,12368,-30343,12361,-30346,12353,-30350,12345,-30353,12337,-30356,12330,-30359,12322,-30362,12314,-30365,12306,-30369,12299,-30372,12291,-30375,12283,-30378,12275,-30381,12268,-30384,12260,-30387,12252,-30391,12244,-30394,12236,-30397,12229,-30400,12221,-30403,12213,-30406,12205,-30409,12198,-30412,12190,-30416,12182,-30419,12174,-30422,12166,-30425,12159,-30428,12151,-30431,12143,-30434,12135,-30437,12128,-30440,12120,-30443,12112,-30447,12104,-30450,12096,-30453,12089,-30456,12081,-30459,12073,-30462,12065,-30465,12057,-30468,12050,-30471,12042,-30474,12034,-30477,12026,-30481,12019,-30484,12011,-30487,12003,-30490,11995,-30493,11987,-30496,11980,-30499,11972,-30502,11964,-30505,11956,-30508,11948,-30511,11941,-30514,11933,-30517,11925,-30520,11917,-30523,11909,-30526,11902,-30529,11894,-30533,11886,-30536,11878,-30539,11870,-30542,11862,-30545,11855,-30548,11847,-30551,11839,-30554,11831,-30557,11823,-30560,11816,-30563,11808,-30566,11800,-30569,11792,-30572,11784,-30575,11777,-30578,11769,-30581,11761,-30584,11753,-30587,11745,-30590,11737,-30593,11730,-30596,11722,-30599,11714,-30602,11706,-30605,11698,-30608,11691,-30611,11683,-30614,11675,-30617,11667,-30620,11659,-30623,11651,-30626,11644,-30629,11636,-30632,11628,-30635,11620,-30638,11612,-30641,11604,-30644,11597,-30647,11589,-30650,11581,-30653,11573,-30656,11565,-30658,11557,-30661,11550,-30664,11542,-30667,11534,-30670,11526,-30673,11518,-30676,11510,-30679,11502,-30682,11495,-30685,11487,-30688,11479,-30691,11471,-30694,11463,-30697,11455,-30700,11448,-30703,11440,-30706,11432,-30708,11424,-30711,11416,-30714,11408,-30717,11400,-30720,11393,-30723,11385,-30726,11377,-30729,11369,-30732,11361,-30735,11353,-30738,11345,-30740,11338,-30743,11330,-30746,11322,-30749,11314,-30752,11306,-30755,11298,-30758,11290,-30761,11283,-30764,11275,-30767,11267,-30769,11259,-30772,11251,-30775,11243,-30778,11235,-30781,11227,-30784,11220,-30787,11212,-30789,11204,-30792,11196,-30795,11188,-30798,11180,-30801,11172,-30804,11164,-30807,11157,-30810,11149,-30812,11141,-30815,11133,-30818,11125,-30821,11117,-30824,11109,-30827,11101,-30829,11094,-30832,11086,-30835,11078,-30838,11070,-30841,11062,-30844,11054,-30846,11046,-30849,11038,-30852,11030,-30855,11023,-30858,11015,-30861,11007,-30863,10999,-30866,10991,-30869,10983,-30872,10975,-30875,10967,-30877,10959,-30880,10952,-30883,10944,-30886,10936,-30889,10928,-30891,10920,-30894,10912,-30897,10904,-30900,10896,-30903,10888,-30905,10880,-30908,10873,-30911,10865,-30914,10857,-30916,10849,-30919,10841,-30922,10833,-30925,10825,-30928,10817,-30930,10809,-30933,10801,-30936,10794,-30939,10786,-30941,10778,-30944,10770,-30947,10762,-30950,10754,-30952,10746,-30955,10738,-30958,10730,-30961,10722,-30963,10714,-30966,10706,-30969,10699,-30972,10691,-30974,10683,-30977,10675,-30980,10667,-30982,10659,-30985,10651,-30988,10643,-30991,10635,-30993,10627,-30996,10619,-30999,10611,-31002,10603,-31004,10596,-31007,10588,-31010,10580,-31012,10572,-31015,10564,-31018,10556,-31020,10548,-31023,10540,-31026,10532,-31029,10524,-31031,10516,-31034,10508,-31037,10500,-31039,10492,-31042,10484,-31045,10477,-31047,10469,-31050,10461,-31053,10453,-31055,10445,-31058,10437,-31061,10429,-31063,10421,-31066,10413,-31069,10405,-31071,10397,-31074,10389,-31077,10381,-31079,10373,-31082,10365,-31085,10357,-31087,10349,-31090,10342,-31093,10334,-31095,10326,-31098,10318,-31101,10310,-31103,10302,-31106,10294,-31108,10286,-31111,10278,-31114,10270,-31116,10262,-31119,10254,-31122,10246,-31124,10238,-31127,10230,-31129,10222,-31132,10214,-31135,10206,-31137,10198,-31140,10190,-31142,10182,-31145,10174,-31148,10166,-31150,10159,-31153,10151,-31155,10143,-31158,10135,-31161,10127,-31163,10119,-31166,10111,-31168,10103,-31171,10095,-31174,10087,-31176,10079,-31179,10071,-31181,10063,-31184,10055,-31186,10047,-31189,10039,-31192,10031,-31194,10023,-31197,10015,-31199,10007,-31202,9999,-31204,9991,-31207,9983,-31210,9975,-31212,9967,-31215,9959,-31217,9951,-31220,9943,-31222,9935,-31225,9927,-31227,9919,-31230,9911,-31232,9903,-31235,9895,-31237,9887,-31240,9879,-31243,9871,-31245,9863,-31248,9855,-31250,9847,-31253,9839,-31255,9831,-31258,9823,-31260,9815,-31263,9807,-31265,9799,-31268,9791,-31270,9783,-31273,9775,-31275,9767,-31278,9759,-31280,9751,-31283,9743,-31285,9735,-31288,9727,-31290,9719,-31293,9711,-31295,9703,-31298,9695,-31300,9687,-31303,9679,-31305,9671,-31308,9663,-31310,9655,-31312,9647,-31315,9639,-31317,9631,-31320,9623,-31322,9615,-31325,9607,-31327,9599,-31330,9591,-31332,9583,-31335,9575,-31337,9567,-31339,9559,-31342,9551,-31344,9543,-31347,9535,-31349,9527,-31352,9519,-31354,9511,-31357,9503,-31359,9495,-31361,9487,-31364,9479,-31366,9471,-31369,9463,-31371,9455,-31374,9447,-31376,9439,-31378,9431,-31381,9423,-31383,9415,-31386,9407,-31388,9399,-31390,9391,-31393,9383,-31395,9375,-31398,9367,-31400,9359,-31402,9351,-31405,9343,-31407,9335,-31410,9327,-31412,9319,-31414,9311,-31417,9303,-31419,9295,-31421,9287,-31424,9279,-31426,9270,-31429,9262,-31431,9254,-31433,9246,-31436,9238,-31438,9230,-31440,9222,-31443,9214,-31445,9206,-31447,9198,-31450,9190,-31452,9182,-31455,9174,-31457,9166,-31459,9158,-31462,9150,-31464,9142,-31466,9134,-31469,9126,-31471,9118,-31473,9110,-31476,9102,-31478,9094,-31480,9086,-31483,9077,-31485,9069,-31487,9061,-31490,9053,-31492,9045,-31494,9037,-31496,9029,-31499,9021,-31501,9013,-31503,9005,-31506,8997,-31508,8989,-31510,8981,-31513,8973,-31515,8965,-31517,8957,-31519,8949,-31522,8941,-31524,8932,-31526,8924,-31529,8916,-31531,8908,-31533,8900,-31535,8892,-31538,8884,-31540,8876,-31542,8868,-31545,8860,-31547,8852,-31549,8844,-31551,8836,-31554,8828,-31556,8820,-31558,8812,-31560,8803,-31563,8795,-31565,8787,-31567,8779,-31569,8771,-31572,8763,-31574,8755,-31576,8747,-31578,8739,-31581,8731,-31583,8723,-31585,8715,-31587,8707,-31589,8699,-31592,8690,-31594,8682,-31596,8674,-31598,8666,-31601,8658,-31603,8650,-31605,8642,-31607,8634,-31609,8626,-31612,8618,-31614,8610,-31616,8602,-31618,8593,-31620,8585,-31623,8577,-31625,8569,-31627,8561,-31629,8553,-31631,8545,-31634,8537,-31636,8529,-31638,8521,-31640,8513,-31642,8504,-31644,8496,-31647,8488,-31649,8480,-31651,8472,-31653,8464,-31655,8456,-31657,8448,-31660,8440,-31662,8432,-31664,8424,-31666,8415,-31668,8407,-31670,8399,-31673,8391,-31675,8383,-31677,8375,-31679,8367,-31681,8359,-31683,8351,-31685,8343,-31688,8334,-31690,8326,-31692,8318,-31694,8310,-31696,8302,-31698,8294,-31700,8286,-31702,8278,-31705,8270,-31707,8262,-31709,8253,-31711,8245,-31713,8237,-31715,8229,-31717,8221,-31719,8213,-31721,8205,-31724,8197,-31726,8189,-31728,8180,-31730,8172,-31732,8164,-31734,8156,-31736,8148,-31738,8140,-31740,8132,-31742,8124,-31744,8116,-31746,8107,-31749,8099,-31751,8091,-31753,8083,-31755,8075,-31757,8067,-31759,8059,-31761,8051,-31763,8042,-31765,8034,-31767,8026,-31769,8018,-31771,8010,-31773,8002,-31775,7994,-31777,7986,-31779,7977,-31781,7969,-31783,7961,-31786,7953,-31788,7945,-31790,7937,-31792,7929,-31794,7921,-31796,7912,-31798,7904,-31800,7896,-31802,7888,-31804,7880,-31806,7872,-31808,7864,-31810,7856,-31812,7847,-31814,7839,-31816,7831,-31818,7823,-31820,7815,-31822,7807,-31824,7799,-31826,7790,-31828,7782,-31830,7774,-31832,7766,-31834,7758,-31836,7750,-31838,7742,-31840,7733,-31842,7725,-31844,7717,-31846,7709,-31848,7701,-31850,7693,-31852,7685,-31854,7676,-31855,7668,-31857,7660,-31859,7652,-31861,7644,-31863,7636,-31865,7628,-31867,7619,-31869,7611,-31871,7603,-31873,7595,-31875,7587,-31877,7579,-31879,7571,-31881,7562,-31883,7554,-31885,7546,-31887,7538,-31889,7530,-31890,7522,-31892,7514,-31894,7505,-31896,7497,-31898,7489,-31900,7481,-31902,7473,-31904,7465,-31906,7456,-31908,7448,-31910,7440,-31912,7432,-31913,7424,-31915,7416,-31917,7407,-31919,7399,-31921,7391,-31923,7383,-31925,7375,-31927,7367,-31929,7358,-31930,7350,-31932,7342,-31934,7334,-31936,7326,-31938,7318,-31940,7310,-31942,7301,-31944,7293,-31945,7285,-31947,7277,-31949,7269,-31951,7261,-31953,7252,-31955,7244,-31957,7236,-31958,7228,-31960,7220,-31962,7211,-31964,7203,-31966,7195,-31968,7187,-31969,7179,-31971,7171,-31973,7162,-31975,7154,-31977,7146,-31979,7138,-31980,7130,-31982,7122,-31984,7113,-31986,7105,-31988,7097,-31990,7089,-31991,7081,-31993,7072,-31995,7064,-31997,7056,-31999,7048,-32000,7040,-32002,7032,-32004,7023,-32006,7015,-32008,7007,-32009,6999,-32011,6991,-32013,6982,-32015,6974,-32017,6966,-32018,6958,-32020,6950,-32022,6942,-32024,6933,-32025,6925,-32027,6917,-32029,6909,-32031,6901,-32033,6892,-32034,6884,-32036,6876,-32038,6868,-32040,6860,-32041,6851,-32043,6843,-32045,6835,-32047,6827,-32048,6819,-32050,6811,-32052,6802,-32054,6794,-32055,6786,-32057,6778,-32059,6770,-32060,6761,-32062,6753,-32064,6745,-32066,6737,-32067,6729,-32069,6720,-32071,6712,-32073,6704,-32074,6696,-32076,6688,-32078,6679,-32079,6671,-32081,6663,-32083,6655,-32085,6647,-32086,6638,-32088,6630,-32090,6622,-32091,6614,-32093,6606,-32095,6597,-32096,6589,-32098,6581,-32100,6573,-32101,6564,-32103,6556,-32105,6548,-32106,6540,-32108,6532,-32110,6523,-32111,6515,-32113,6507,-32115,6499,-32116,6491,-32118,6482,-32120,6474,-32121,6466,-32123,6458,-32125,6450,-32126,6441,-32128,6433,-32130,6425,-32131,6417,-32133,6408,-32135,6400,-32136,6392,-32138,6384,-32140,6376,-32141,6367,-32143,6359,-32144,6351,-32146,6343,-32148,6334,-32149,6326,-32151,6318,-32153,6310,-32154,6302,-32156,6293,-32157,6285,-32159,6277,-32161,6269,-32162,6261,-32164,6252,-32165,6244,-32167,6236,-32169,6228,-32170,6219,-32172,6211,-32173,6203,-32175,6195,-32177,6186,-32178,6178,-32180,6170,-32181,6162,-32183,6154,-32184,6145,-32186,6137,-32188,6129,-32189,6121,-32191,6112,-32192,6104,-32194,6096,-32195,6088,-32197,6080,-32198,6071,-32200,6063,-32202,6055,-32203,6047,-32205,6038,-32206,6030,-32208,6022,-32209,6014,-32211,6005,-32212,5997,-32214,5989,-32215,5981,-32217,5972,-32219,5964,-32220,5956,-32222,5948,-32223,5940,-32225,5931,-32226,5923,-32228,5915,-32229,5907,-32231,5898,-32232,5890,-32234,5882,-32235,5874,-32237,5865,-32238,5857,-32240,5849,-32241,5841,-32243,5832,-32244,5824,-32246,5816,-32247,5808,-32249,5799,-32250,5791,-32252,5783,-32253,5775,-32255,5766,-32256,5758,-32257,5750,-32259,5742,-32260,5733,-32262,5725,-32263,5717,-32265,5709,-32266,5700,-32268,5692,-32269,5684,-32271,5676,-32272,5667,-32274,5659,-32275,5651,-32276,5643,-32278,5634,-32279,5626,-32281,5618,-32282,5610,-32284,5601,-32285,5593,-32287,5585,-32288,5577,-32289,5568,-32291,5560,-32292,5552,-32294,5544,-32295,5535,-32296,5527,-32298,5519,-32299,5511,-32301,5502,-32302,5494,-32304,5486,-32305,5478,-32306,5469,-32308,5461,-32309,5453,-32311,5445,-32312,5436,-32313,5428,-32315,5420,-32316,5411,-32317,5403,-32319,5395,-32320,5387,-32322,5378,-32323,5370,-32324,5362,-32326,5354,-32327,5345,-32328,5337,-32330,5329,-32331,5321,-32333,5312,-32334,5304,-32335,5296,-32337,5287,-32338,5279,-32339,5271,-32341,5263,-32342,5254,-32343,5246,-32345,5238,-32346,5230,-32347,5221,-32349,5213,-32350,5205,-32351,5197,-32353,5188,-32354,5180,-32355,5172,-32357,5163,-32358,5155,-32359,5147,-32361,5139,-32362,5130,-32363,5122,-32365,5114,-32366,5106,-32367,5097,-32369,5089,-32370,5081,-32371,5072,-32372,5064,-32374,5056,-32375,5048,-32376,5039,-32378,5031,-32379,5023,-32380,5014,-32381,5006,-32383,4998,-32384,4990,-32385,4981,-32387,4973,-32388,4965,-32389,4957,-32390,4948,-32392,4940,-32393,4932,-32394,4923,-32395,4915,-32397,4907,-32398,4899,-32399,4890,-32400,4882,-32402,4874,-32403,4865,-32404,4857,-32405,4849,-32407,4841,-32408,4832,-32409,4824,-32410,4816,-32412,4807,-32413,4799,-32414,4791,-32415,4783,-32417,4774,-32418,4766,-32419,4758,-32420,4749,-32421,4741,-32423,4733,-32424,4725,-32425,4716,-32426,4708,-32427,4700,-32429,4691,-32430,4683,-32431,4675,-32432,4666,-32433,4658,-32435,4650,-32436,4642,-32437,4633,-32438,4625,-32439,4617,-32441,4608,-32442,4600,-32443,4592,-32444,4584,-32445,4575,-32446,4567,-32448,4559,-32449,4550,-32450,4542,-32451,4534,-32452,4525,-32453,4517,-32455,4509,-32456,4501,-32457,4492,-32458,4484,-32459,4476,-32460,4467,-32461,4459,-32463,4451,-32464,4443,-32465,4434,-32466,4426,-32467,4418,-32468,4409,-32469,4401,-32471,4393,-32472,4384,-32473,4376,-32474,4368,-32475,4359,-32476,4351,-32477,4343,-32478,4335,-32479,4326,-32481,4318,-32482,4310,-32483,4301,-32484,4293,-32485,4285,-32486,4276,-32487,4268,-32488,4260,-32489,4252,-32490,4243,-32492,4235,-32493,4227,-32494,4218,-32495,4210,-32496,4202,-32497,4193,-32498,4185,-32499,4177,-32500,4168,-32501,4160,-32502,4152,-32503,4144,-32504,4135,-32505,4127,-32507,4119,-32508,4110,-32509,4102,-32510,4094,-32511,4085,-32512,4077,-32513,4069,-32514,4060,-32515,4052,-32516,4044,-32517,4035,-32518,4027,-32519,4019,-32520,4011,-32521,4002,-32522,3994,-32523,3986,-32524,3977,-32525,3969,-32526,3961,-32527,3952,-32528,3944,-32529,3936,-32530,3927,-32531,3919,-32532,3911,-32533,3902,-32534,3894,-32535,3886,-32536,3877,-32537,3869,-32538,3861,-32539,3853,-32540,3844,-32541,3836,-32542,3828,-32543,3819,-32544,3811,-32545,3803,-32546,3794,-32547,3786,-32548,3778,-32549,3769,-32550,3761,-32551,3753,-32552,3744,-32553,3736,-32554,3728,-32555,3719,-32556,3711,-32557,3703,-32558,3694,-32559,3686,-32559,3678,-32560,3669,-32561,3661,-32562,3653,-32563,3644,-32564,3636,-32565,3628,-32566,3619,-32567,3611,-32568,3603,-32569,3594,-32570,3586,-32571,3578,-32572,3570,-32572,3561,-32573,3553,-32574,3545,-32575,3536,-32576,3528,-32577,3520,-32578,3511,-32579,3503,-32580,3495,-32581,3486,-32581,3478,-32582,3470,-32583,3461,-32584,3453,-32585,3445,-32586,3436,-32587,3428,-32588,3420,-32589,3411,-32589,3403,-32590,3395,-32591,3386,-32592,3378,-32593,3370,-32594,3361,-32595,3353,-32595,3345,-32596,3336,-32597,3328,-32598,3320,-32599,3311,-32600,3303,-32601,3295,-32601,3286,-32602,3278,-32603,3270,-32604,3261,-32605,3253,-32606,3245,-32606,3236,-32607,3228,-32608,3220,-32609,3211,-32610,3203,-32611,3195,-32611,3186,-32612,3178,-32613,3170,-32614,3161,-32615,3153,-32615,3145,-32616,3136,-32617,3128,-32618,3120,-32619,3111,-32619,3103,-32620,3094,-32621,3086,-32622,3078,-32623,3069,-32623,3061,-32624,3053,-32625,3044,-32626,3036,-32626,3028,-32627,3019,-32628,3011,-32629,3003,-32630,2994,-32630,2986,-32631,2978,-32632,2969,-32633,2961,-32633,2953,-32634,2944,-32635,2936,-32636,2928,-32636,2919,-32637,2911,-32638,2903,-32639,2894,-32639,2886,-32640,2878,-32641,2869,-32642,2861,-32642,2853,-32643,2844,-32644,2836,-32645,2828,-32645,2819,-32646,2811,-32647,2802,-32647,2794,-32648,2786,-32649,2777,-32650,2769,-32650,2761,-32651,2752,-32652,2744,-32652,2736,-32653,2727,-32654,2719,-32654,2711,-32655,2702,-32656,2694,-32657,2686,-32657,2677,-32658,2669,-32659,2661,-32659,2652,-32660,2644,-32661,2636,-32661,2627,-32662,2619,-32663,2610,-32663,2602,-32664,2594,-32665,2585,-32665,2577,-32666,2569,-32667,2560,-32667,2552,-32668,2544,-32669,2535,-32669,2527,-32670,2519,-32671,2510,-32671,2502,-32672,2494,-32672,2485,-32673,2477,-32674,2468,-32674,2460,-32675,2452,-32676,2443,-32676,2435,-32677,2427,-32677,2418,-32678,2410,-32679,2402,-32679,2393,-32680,2385,-32681,2377,-32681,2368,-32682,2360,-32682,2352,-32683,2343,-32684,2335,-32684,2326,-32685,2318,-32685,2310,-32686,2301,-32687,2293,-32687,2285,-32688,2276,-32688,2268,-32689,2260,-32689,2251,-32690,2243,-32691,2235,-32691,2226,-32692,2218,-32692,2209,-32693,2201,-32693,2193,-32694,2184,-32695,2176,-32695,2168,-32696,2159,-32696,2151,-32697,2143,-32697,2134,-32698,2126,-32698,2117,-32699,2109,-32700,2101,-32700,2092,-32701,2084,-32701,2076,-32702,2067,-32702,2059,-32703,2051,-32703,2042,-32704,2034,-32704,2026,-32705,2017,-32705,2009,-32706,2000,-32706,1992,-32707,1984,-32707,1975,-32708,1967,-32708,1959,-32709,1950,-32709,1942,-32710,1934,-32710,1925,-32711,1917,-32711,1908,-32712,1900,-32712,1892,-32713,1883,-32713,1875,-32714,1867,-32714,1858,-32715,1850,-32715,1842,-32716,1833,-32716,1825,-32717,1816,-32717,1808,-32718,1800,-32718,1791,-32718,1783,-32719,1775,-32719,1766,-32720,1758,-32720,1750,-32721,1741,-32721,1733,-32722,1724,-32722,1716,-32723,1708,-32723,1699,-32723,1691,-32724,1683,-32724,1674,-32725,1666,-32725,1658,-32726,1649,-32726,1641,-32726,1632,-32727,1624,-32727,1616,-32728,1607,-32728,1599,-32728,1591,-32729,1582,-32729,1574,-32730,1565,-32730,1557,-32730,1549,-32731,1540,-32731,1532,-32732,1524,-32732,1515,-32732,1507,-32733,1499,-32733,1490,-32734,1482,-32734,1473,-32734,1465,-32735,1457,-32735,1448,-32735,1440,-32736,1432,-32736,1423,-32737,1415,-32737,1406,-32737,1398,-32738,1390,-32738,1381,-32738,1373,-32739,1365,-32739,1356,-32739,1348,-32740,1339,-32740,1331,-32740,1323,-32741,1314,-32741,1306,-32741,1298,-32742,1289,-32742,1281,-32742,1273,-32743,1264,-32743,1256,-32743,1247,-32744,1239,-32744,1231,-32744,1222,-32745,1214,-32745,1206,-32745,1197,-32746,1189,-32746,1180,-32746,1172,-32747,1164,-32747,1155,-32747,1147,-32747,1139,-32748,1130,-32748,1122,-32748,1113,-32749,1105,-32749,1097,-32749,1088,-32749,1080,-32750,1072,-32750,1063,-32750,1055,-32751,1046,-32751,1038,-32751,1030,-32751,1021,-32752,1013,-32752,1005,-32752,996,-32752,988,-32753,980,-32753,971,-32753,963,-32753,954,-32754,946,-32754,938,-32754,929,-32754,921,-32755,913,-32755,904,-32755,896,-32755,887,-32755,879,-32756,871,-32756,862,-32756,854,-32756,846,-32757,837,-32757,829,-32757,820,-32757,812,-32757,804,-32758,795,-32758,787,-32758,779,-32758,770,-32758,762,-32759,753,-32759,745,-32759,737,-32759,728,-32759,720,-32760,712,-32760,703,-32760,695,-32760,686,-32760,678,-32760,670,-32761,661,-32761,653,-32761,645,-32761,636,-32761,628,-32761,619,-32762,611,-32762,603,-32762,594,-32762,586,-32762,578,-32762,569,-32763,561,-32763,552,-32763,544,-32763,536,-32763,527,-32763,519,-32763,510,-32764,502,-32764,494,-32764,485,-32764,477,-32764,469,-32764,460,-32764,452,-32764,443,-32764,435,-32765,427,-32765,418,-32765,410,-32765,402,-32765,393,-32765,385,-32765,376,-32765,368,-32765,360,-32766,351,-32766,343,-32766,335,-32766,326,-32766,318,-32766,309,-32766,301,-32766,293,-32766,284,-32766,276,-32766,268,-32766,259,-32766,251,-32767,242,-32767,234,-32767,226,-32767,217,-32767,209,-32767,201,-32767,192,-32767,184,-32767,175,-32767,167,-32767,159,-32767,150,-32767,142,-32767,134,-32767,125,-32767,117,-32767,108,-32767,100,-32767,92,-32767,83,-32767,75,-32767,67,-32767,58,-32767,50,-32767,41,-32767,33,-32767,25,-32767,16,-32767,8,-32767,0,-32767,-9,-32767,-17,-32767,-26,-32767,-34,-32767,-42,-32767,-51,-32767,-59,-32767,-68,-32767,-76,-32767,-84,-32767,-93,-32767,-101,-32767,-109,-32767,-118,-32767,-126,-32767,-135,-32767,-143,-32767,-151,-32767,-160,-32767,-168,-32767,-176,-32767,-185,-32767,-193,-32767,-202,-32767,-210,-32767,-218,-32767,-227,-32767,-235,-32767,-243,-32767,-252,-32767,-260,-32766,-269,-32766,-277,-32766,-285,-32766,-294,-32766,-302,-32766,-310,-32766,-319,-32766,-327,-32766,-336,-32766,-344,-32766,-352,-32766,-361,-32766,-369,-32765,-377,-32765,-386,-32765,-394,-32765,-403,-32765,-411,-32765,-419,-32765,-428,-32765,-436,-32765,-444,-32764,-453,-32764,-461,-32764,-470,-32764,-478,-32764,-486,-32764,-495,-32764,-503,-32764,-511,-32764,-520,-32763,-528,-32763,-537,-32763,-545,-32763,-553,-32763,-562,-32763,-570,-32763,-579,-32762,-587,-32762,-595,-32762,-604,-32762,-612,-32762,-620,-32762,-629,-32761,-637,-32761,-646,-32761,-654,-32761,-662,-32761,-671,-32761,-679,-32760,-687,-32760,-696,-32760,-704,-32760,-713,-32760,-721,-32760,-729,-32759,-738,-32759,-746,-32759,-754,-32759,-763,-32759,-771,-32758,-780,-32758,-788,-32758,-796,-32758,-805,-32758,-813,-32757,-821,-32757,-830,-32757,-838,-32757,-847,-32757,-855,-32756,-863,-32756,-872,-32756,-880,-32756,-888,-32755,-897,-32755,-905,-32755,-914,-32755,-922,-32755,-930,-32754,-939,-32754,-947,-32754,-955,-32754,-964,-32753,-972,-32753,-981,-32753,-989,-32753,-997,-32752,-1006,-32752,-1014,-32752,-1022,-32752,-1031,-32751,-1039,-32751,-1047,-32751,-1056,-32751,-1064,-32750,-1073,-32750,-1081,-32750,-1089,-32749,-1098,-32749,-1106,-32749,-1114,-32749,-1123,-32748,-1131,-32748,-1140,-32748,-1148,-32747,-1156,-32747,-1165,-32747,-1173,-32747,-1181,-32746,-1190,-32746,-1198,-32746,-1207,-32745,-1215,-32745,-1223,-32745,-1232,-32744,-1240,-32744,-1248,-32744,-1257,-32743,-1265,-32743,-1274,-32743,-1282,-32742,-1290,-32742,-1299,-32742,-1307,-32741,-1315,-32741,-1324,-32741,-1332,-32740,-1340,-32740,-1349,-32740,-1357,-32739,-1366,-32739,-1374,-32739,-1382,-32738,-1391,-32738,-1399,-32738,-1407,-32737,-1416,-32737,-1424,-32737,-1433,-32736,-1441,-32736,-1449,-32735,-1458,-32735,-1466,-32735,-1474,-32734,-1483,-32734,-1491,-32734,-1500,-32733,-1508,-32733,-1516,-32732,-1525,-32732,-1533,-32732,-1541,-32731,-1550,-32731,-1558,-32730,-1566,-32730,-1575,-32730,-1583,-32729,-1592,-32729,-1600,-32728,-1608,-32728,-1617,-32728,-1625,-32727,-1633,-32727,-1642,-32726,-1650,-32726,-1659,-32726,-1667,-32725,-1675,-32725,-1684,-32724,-1692,-32724,-1700,-32723,-1709,-32723,-1717,-32723,-1725,-32722,-1734,-32722,-1742,-32721,-1751,-32721,-1759,-32720,-1767,-32720,-1776,-32719,-1784,-32719,-1792,-32718,-1801,-32718,-1809,-32718,-1817,-32717,-1826,-32717,-1834,-32716,-1843,-32716,-1851,-32715,-1859,-32715,-1868,-32714,-1876,-32714,-1884,-32713,-1893,-32713,-1901,-32712,-1909,-32712,-1918,-32711,-1926,-32711,-1935,-32710,-1943,-32710,-1951,-32709,-1960,-32709,-1968,-32708,-1976,-32708,-1985,-32707,-1993,-32707,-2001,-32706,-2010,-32706,-2018,-32705,-2027,-32705,-2035,-32704,-2043,-32704,-2052,-32703,-2060,-32703,-2068,-32702,-2077,-32702,-2085,-32701,-2093,-32701,-2102,-32700,-2110,-32700,-2118,-32699,-2127,-32698,-2135,-32698,-2144,-32697,-2152,-32697,-2160,-32696,-2169,-32696,-2177,-32695,-2185,-32695,-2194,-32694,-2202,-32693,-2210,-32693,-2219,-32692,-2227,-32692,-2236,-32691,-2244,-32691,-2252,-32690,-2261,-32689,-2269,-32689,-2277,-32688,-2286,-32688,-2294,-32687,-2302,-32687,-2311,-32686,-2319,-32685,-2327,-32685,-2336,-32684,-2344,-32684,-2353,-32683,-2361,-32682,-2369,-32682,-2378,-32681,-2386,-32681,-2394,-32680,-2403,-32679,-2411,-32679,-2419,-32678,-2428,-32677,-2436,-32677,-2444,-32676,-2453,-32676,-2461,-32675,-2469,-32674,-2478,-32674,-2486,-32673,-2495,-32672,-2503,-32672,-2511,-32671,-2520,-32671,-2528,-32670,-2536,-32669,-2545,-32669,-2553,-32668,-2561,-32667,-2570,-32667,-2578,-32666,-2586,-32665,-2595,-32665,-2603,-32664,-2611,-32663,-2620,-32663,-2628,-32662,-2637,-32661,-2645,-32661,-2653,-32660,-2662,-32659,-2670,-32659,-2678,-32658,-2687,-32657,-2695,-32657,-2703,-32656,-2712,-32655,-2720,-32654,-2728,-32654,-2737,-32653,-2745,-32652,-2753,-32652,-2762,-32651,-2770,-32650,-2778,-32650,-2787,-32649,-2795,-32648,-2803,-32647,-2812,-32647,-2820,-32646,-2829,-32645,-2837,-32645,-2845,-32644,-2854,-32643,-2862,-32642,-2870,-32642,-2879,-32641,-2887,-32640,-2895,-32639,-2904,-32639,-2912,-32638,-2920,-32637,-2929,-32636,-2937,-32636,-2945,-32635,-2954,-32634,-2962,-32633,-2970,-32633,-2979,-32632,-2987,-32631,-2995,-32630,-3004,-32630,-3012,-32629,-3020,-32628,-3029,-32627,-3037,-32626,-3045,-32626,-3054,-32625,-3062,-32624,-3070,-32623,-3079,-32623,-3087,-32622,-3095,-32621,-3104,-32620,-3112,-32619,-3121,-32619,-3129,-32618,-3137,-32617,-3146,-32616,-3154,-32615,-3162,-32615,-3171,-32614,-3179,-32613,-3187,-32612,-3196,-32611,-3204,-32611,-3212,-32610,-3221,-32609,-3229,-32608,-3237,-32607,-3246,-32606,-3254,-32606,-3262,-32605,-3271,-32604,-3279,-32603,-3287,-32602,-3296,-32601,-3304,-32601,-3312,-32600,-3321,-32599,-3329,-32598,-3337,-32597,-3346,-32596,-3354,-32595,-3362,-32595,-3371,-32594,-3379,-32593,-3387,-32592,-3396,-32591,-3404,-32590,-3412,-32589,-3421,-32589,-3429,-32588,-3437,-32587,-3446,-32586,-3454,-32585,-3462,-32584,-3471,-32583,-3479,-32582,-3487,-32581,-3496,-32581,-3504,-32580,-3512,-32579,-3521,-32578,-3529,-32577,-3537,-32576,-3546,-32575,-3554,-32574,-3562,-32573,-3571,-32572,-3579,-32572,-3587,-32571,-3595,-32570,-3604,-32569,-3612,-32568,-3620,-32567,-3629,-32566,-3637,-32565,-3645,-32564,-3654,-32563,-3662,-32562,-3670,-32561,-3679,-32560,-3687,-32559,-3695,-32559,-3704,-32558,-3712,-32557,-3720,-32556,-3729,-32555,-3737,-32554,-3745,-32553,-3754,-32552,-3762,-32551,-3770,-32550,-3779,-32549,-3787,-32548,-3795,-32547,-3804,-32546,-3812,-32545,-3820,-32544,-3829,-32543,-3837,-32542,-3845,-32541,-3854,-32540,-3862,-32539,-3870,-32538,-3878,-32537,-3887,-32536,-3895,-32535,-3903,-32534,-3912,-32533,-3920,-32532,-3928,-32531,-3937,-32530,-3945,-32529,-3953,-32528,-3962,-32527,-3970,-32526,-3978,-32525,-3987,-32524,-3995,-32523,-4003,-32522,-4012,-32521,-4020,-32520,-4028,-32519,-4036,-32518,-4045,-32517,-4053,-32516,-4061,-32515,-4070,-32514,-4078,-32513,-4086,-32512,-4095,-32511,-4103,-32510,-4111,-32509,-4120,-32508,-4128,-32507,-4136,-32505,-4145,-32504,-4153,-32503,-4161,-32502,-4169,-32501,-4178,-32500,-4186,-32499,-4194,-32498,-4203,-32497,-4211,-32496,-4219,-32495,-4228,-32494,-4236,-32493,-4244,-32492,-4253,-32490,-4261,-32489,-4269,-32488,-4277,-32487,-4286,-32486,-4294,-32485,-4302,-32484,-4311,-32483,-4319,-32482,-4327,-32481,-4336,-32479,-4344,-32478,-4352,-32477,-4360,-32476,-4369,-32475,-4377,-32474,-4385,-32473,-4394,-32472,-4402,-32471,-4410,-32469,-4419,-32468,-4427,-32467,-4435,-32466,-4444,-32465,-4452,-32464,-4460,-32463,-4468,-32461,-4477,-32460,-4485,-32459,-4493,-32458,-4502,-32457,-4510,-32456,-4518,-32455,-4526,-32453,-4535,-32452,-4543,-32451,-4551,-32450,-4560,-32449,-4568,-32448,-4576,-32446,-4585,-32445,-4593,-32444,-4601,-32443,-4609,-32442,-4618,-32441,-4626,-32439,-4634,-32438,-4643,-32437,-4651,-32436,-4659,-32435,-4667,-32433,-4676,-32432,-4684,-32431,-4692,-32430,-4701,-32429,-4709,-32427,-4717,-32426,-4726,-32425,-4734,-32424,-4742,-32423,-4750,-32421,-4759,-32420,-4767,-32419,-4775,-32418,-4784,-32417,-4792,-32415,-4800,-32414,-4808,-32413,-4817,-32412,-4825,-32410,-4833,-32409,-4842,-32408,-4850,-32407,-4858,-32405,-4866,-32404,-4875,-32403,-4883,-32402,-4891,-32400,-4900,-32399,-4908,-32398,-4916,-32397,-4924,-32395,-4933,-32394,-4941,-32393,-4949,-32392,-4958,-32390,-4966,-32389,-4974,-32388,-4982,-32387,-4991,-32385,-4999,-32384,-5007,-32383,-5015,-32381,-5024,-32380,-5032,-32379,-5040,-32378,-5049,-32376,-5057,-32375,-5065,-32374,-5073,-32372,-5082,-32371,-5090,-32370,-5098,-32369,-5107,-32367,-5115,-32366,-5123,-32365,-5131,-32363,-5140,-32362,-5148,-32361,-5156,-32359,-5164,-32358,-5173,-32357,-5181,-32355,-5189,-32354,-5198,-32353,-5206,-32351,-5214,-32350,-5222,-32349,-5231,-32347,-5239,-32346,-5247,-32345,-5255,-32343,-5264,-32342,-5272,-32341,-5280,-32339,-5288,-32338,-5297,-32337,-5305,-32335,-5313,-32334,-5322,-32333,-5330,-32331,-5338,-32330,-5346,-32328,-5355,-32327,-5363,-32326,-5371,-32324,-5379,-32323,-5388,-32322,-5396,-32320,-5404,-32319,-5412,-32317,-5421,-32316,-5429,-32315,-5437,-32313,-5446,-32312,-5454,-32311,-5462,-32309,-5470,-32308,-5479,-32306,-5487,-32305,-5495,-32304,-5503,-32302,-5512,-32301,-5520,-32299,-5528,-32298,-5536,-32296,-5545,-32295,-5553,-32294,-5561,-32292,-5569,-32291,-5578,-32289,-5586,-32288,-5594,-32287,-5602,-32285,-5611,-32284,-5619,-32282,-5627,-32281,-5635,-32279,-5644,-32278,-5652,-32276,-5660,-32275,-5668,-32274,-5677,-32272,-5685,-32271,-5693,-32269,-5701,-32268,-5710,-32266,-5718,-32265,-5726,-32263,-5734,-32262,-5743,-32260,-5751,-32259,-5759,-32257,-5767,-32256,-5776,-32255,-5784,-32253,-5792,-32252,-5800,-32250,-5809,-32249,-5817,-32247,-5825,-32246,-5833,-32244,-5842,-32243,-5850,-32241,-5858,-32240,-5866,-32238,-5875,-32237,-5883,-32235,-5891,-32234,-5899,-32232,-5908,-32231,-5916,-32229,-5924,-32228,-5932,-32226,-5941,-32225,-5949,-32223,-5957,-32222,-5965,-32220,-5973,-32219,-5982,-32217,-5990,-32215,-5998,-32214,-6006,-32212,-6015,-32211,-6023,-32209,-6031,-32208,-6039,-32206,-6048,-32205,-6056,-32203,-6064,-32202,-6072,-32200,-6081,-32198,-6089,-32197,-6097,-32195,-6105,-32194,-6113,-32192,-6122,-32191,-6130,-32189,-6138,-32188,-6146,-32186,-6155,-32184,-6163,-32183,-6171,-32181,-6179,-32180,-6187,-32178,-6196,-32177,-6204,-32175,-6212,-32173,-6220,-32172,-6229,-32170,-6237,-32169,-6245,-32167,-6253,-32165,-6262,-32164,-6270,-32162,-6278,-32161,-6286,-32159,-6294,-32157,-6303,-32156,-6311,-32154,-6319,-32153,-6327,-32151,-6335,-32149,-6344,-32148,-6352,-32146,-6360,-32144,-6368,-32143,-6377,-32141,-6385,-32140,-6393,-32138,-6401,-32136,-6409,-32135,-6418,-32133,-6426,-32131,-6434,-32130,-6442,-32128,-6451,-32126,-6459,-32125,-6467,-32123,-6475,-32121,-6483,-32120,-6492,-32118,-6500,-32116,-6508,-32115,-6516,-32113,-6524,-32111,-6533,-32110,-6541,-32108,-6549,-32106,-6557,-32105,-6565,-32103,-6574,-32101,-6582,-32100,-6590,-32098,-6598,-32096,-6607,-32095,-6615,-32093,-6623,-32091,-6631,-32090,-6639,-32088,-6648,-32086,-6656,-32085,-6664,-32083,-6672,-32081,-6680,-32079,-6689,-32078,-6697,-32076,-6705,-32074,-6713,-32073,-6721,-32071,-6730,-32069,-6738,-32067,-6746,-32066,-6754,-32064,-6762,-32062,-6771,-32060,-6779,-32059,-6787,-32057,-6795,-32055,-6803,-32054,-6812,-32052,-6820,-32050,-6828,-32048,-6836,-32047,-6844,-32045,-6852,-32043,-6861,-32041,-6869,-32040,-6877,-32038,-6885,-32036,-6893,-32034,-6902,-32033,-6910,-32031,-6918,-32029,-6926,-32027,-6934,-32025,-6943,-32024,-6951,-32022,-6959,-32020,-6967,-32018,-6975,-32017,-6983,-32015,-6992,-32013,-7000,-32011,-7008,-32009,-7016,-32008,-7024,-32006,-7033,-32004,-7041,-32002,-7049,-32000,-7057,-31999,-7065,-31997,-7073,-31995,-7082,-31993,-7090,-31991,-7098,-31990,-7106,-31988,-7114,-31986,-7123,-31984,-7131,-31982,-7139,-31980,-7147,-31979,-7155,-31977,-7163,-31975,-7172,-31973,-7180,-31971,-7188,-31969,-7196,-31968,-7204,-31966,-7212,-31964,-7221,-31962,-7229,-31960,-7237,-31958,-7245,-31957,-7253,-31955,-7262,-31953,-7270,-31951,-7278,-31949,-7286,-31947,-7294,-31945,-7302,-31944,-7311,-31942,-7319,-31940,-7327,-31938,-7335,-31936,-7343,-31934,-7351,-31932,-7359,-31930,-7368,-31929,-7376,-31927,-7384,-31925,-7392,-31923,-7400,-31921,-7408,-31919,-7417,-31917,-7425,-31915,-7433,-31913,-7441,-31912,-7449,-31910,-7457,-31908,-7466,-31906,-7474,-31904,-7482,-31902,-7490,-31900,-7498,-31898,-7506,-31896,-7515,-31894,-7523,-31892,-7531,-31890,-7539,-31889,-7547,-31887,-7555,-31885,-7563,-31883,-7572,-31881,-7580,-31879,-7588,-31877,-7596,-31875,-7604,-31873,-7612,-31871,-7620,-31869,-7629,-31867,-7637,-31865,-7645,-31863,-7653,-31861,-7661,-31859,-7669,-31857,-7677,-31855,-7686,-31854,-7694,-31852,-7702,-31850,-7710,-31848,-7718,-31846,-7726,-31844,-7734,-31842,-7743,-31840,-7751,-31838,-7759,-31836,-7767,-31834,-7775,-31832,-7783,-31830,-7791,-31828,-7800,-31826,-7808,-31824,-7816,-31822,-7824,-31820,-7832,-31818,-7840,-31816,-7848,-31814,-7857,-31812,-7865,-31810,-7873,-31808,-7881,-31806,-7889,-31804,-7897,-31802,-7905,-31800,-7913,-31798,-7922,-31796,-7930,-31794,-7938,-31792,-7946,-31790,-7954,-31788,-7962,-31786,-7970,-31783,-7978,-31781,-7987,-31779,-7995,-31777,-8003,-31775,-8011,-31773,-8019,-31771,-8027,-31769,-8035,-31767,-8043,-31765,-8052,-31763,-8060,-31761,-8068,-31759,-8076,-31757,-8084,-31755,-8092,-31753,-8100,-31751,-8108,-31749,-8117,-31746,-8125,-31744,-8133,-31742,-8141,-31740,-8149,-31738,-8157,-31736,-8165,-31734,-8173,-31732,-8181,-31730,-8190,-31728,-8198,-31726,-8206,-31724,-8214,-31721,-8222,-31719,-8230,-31717,-8238,-31715,-8246,-31713,-8254,-31711,-8263,-31709,-8271,-31707,-8279,-31705,-8287,-31702,-8295,-31700,-8303,-31698,-8311,-31696,-8319,-31694,-8327,-31692,-8335,-31690,-8344,-31688,-8352,-31685,-8360,-31683,-8368,-31681,-8376,-31679,-8384,-31677,-8392,-31675,-8400,-31673,-8408,-31670,-8416,-31668,-8425,-31666,-8433,-31664,-8441,-31662,-8449,-31660,-8457,-31657,-8465,-31655,-8473,-31653,-8481,-31651,-8489,-31649,-8497,-31647,-8505,-31644,-8514,-31642,-8522,-31640,-8530,-31638,-8538,-31636,-8546,-31634,-8554,-31631,-8562,-31629,-8570,-31627,-8578,-31625,-8586,-31623,-8594,-31620,-8603,-31618,-8611,-31616,-8619,-31614,-8627,-31612,-8635,-31609,-8643,-31607,-8651,-31605,-8659,-31603,-8667,-31601,-8675,-31598,-8683,-31596,-8691,-31594,-8700,-31592,-8708,-31589,-8716,-31587,-8724,-31585,-8732,-31583,-8740,-31581,-8748,-31578,-8756,-31576,-8764,-31574,-8772,-31572,-8780,-31569,-8788,-31567,-8796,-31565,-8804,-31563,-8813,-31560,-8821,-31558,-8829,-31556,-8837,-31554,-8845,-31551,-8853,-31549,-8861,-31547,-8869,-31545,-8877,-31542,-8885,-31540,-8893,-31538,-8901,-31535,-8909,-31533,-8917,-31531,-8925,-31529,-8933,-31526,-8942,-31524,-8950,-31522,-8958,-31519,-8966,-31517,-8974,-31515,-8982,-31513,-8990,-31510,-8998,-31508,-9006,-31506,-9014,-31503,-9022,-31501,-9030,-31499,-9038,-31496,-9046,-31494,-9054,-31492,-9062,-31490,-9070,-31487,-9078,-31485,-9087,-31483,-9095,-31480,-9103,-31478,-9111,-31476,-9119,-31473,-9127,-31471,-9135,-31469,-9143,-31466,-9151,-31464,-9159,-31462,-9167,-31459,-9175,-31457,-9183,-31455,-9191,-31452,-9199,-31450,-9207,-31447,-9215,-31445,-9223,-31443,-9231,-31440,-9239,-31438,-9247,-31436,-9255,-31433,-9263,-31431,-9271,-31429,-9280,-31426,-9288,-31424,-9296,-31421,-9304,-31419,-9312,-31417,-9320,-31414,-9328,-31412,-9336,-31410,-9344,-31407,-9352,-31405,-9360,-31402,-9368,-31400,-9376,-31398,-9384,-31395,-9392,-31393,-9400,-31390,-9408,-31388,-9416,-31386,-9424,-31383,-9432,-31381,-9440,-31378,-9448,-31376,-9456,-31374,-9464,-31371,-9472,-31369,-9480,-31366,-9488,-31364,-9496,-31361,-9504,-31359,-9512,-31357,-9520,-31354,-9528,-31352,-9536,-31349,-9544,-31347,-9552,-31344,-9560,-31342,-9568,-31339,-9576,-31337,-9584,-31335,-9592,-31332,-9600,-31330,-9608,-31327,-9616,-31325,-9624,-31322,-9632,-31320,-9640,-31317,-9648,-31315,-9656,-31312,-9664,-31310,-9672,-31308,-9680,-31305,-9688,-31303,-9696,-31300,-9704,-31298,-9712,-31295,-9720,-31293,-9728,-31290,-9736,-31288,-9744,-31285,-9752,-31283,-9760,-31280,-9768,-31278,-9776,-31275,-9784,-31273,-9792,-31270,-9800,-31268,-9808,-31265,-9816,-31263,-9824,-31260,-9832,-31258,-9840,-31255,-9848,-31253,-9856,-31250,-9864,-31248,-9872,-31245,-9880,-31243,-9888,-31240,-9896,-31237,-9904,-31235,-9912,-31232,-9920,-31230,-9928,-31227,-9936,-31225,-9944,-31222,-9952,-31220,-9960,-31217,-9968,-31215,-9976,-31212,-9984,-31210,-9992,-31207,-10000,-31204,-10008,-31202,-10016,-31199,-10024,-31197,-10032,-31194,-10040,-31192,-10048,-31189,-10056,-31186,-10064,-31184,-10072,-31181,-10080,-31179,-10088,-31176,-10096,-31174,-10104,-31171,-10112,-31168,-10120,-31166,-10128,-31163,-10136,-31161,-10144,-31158,-10152,-31155,-10160,-31153,-10167,-31150,-10175,-31148,-10183,-31145,-10191,-31142,-10199,-31140,-10207,-31137,-10215,-31135,-10223,-31132,-10231,-31129,-10239,-31127,-10247,-31124,-10255,-31122,-10263,-31119,-10271,-31116,-10279,-31114,-10287,-31111,-10295,-31108,-10303,-31106,-10311,-31103,-10319,-31101,-10327,-31098,-10335,-31095,-10343,-31093,-10350,-31090,-10358,-31087,-10366,-31085,-10374,-31082,-10382,-31079,-10390,-31077,-10398,-31074,-10406,-31071,-10414,-31069,-10422,-31066,-10430,-31063,-10438,-31061,-10446,-31058,-10454,-31055,-10462,-31053,-10470,-31050,-10478,-31047,-10485,-31045,-10493,-31042,-10501,-31039,-10509,-31037,-10517,-31034,-10525,-31031,-10533,-31029,-10541,-31026,-10549,-31023,-10557,-31020,-10565,-31018,-10573,-31015,-10581,-31012,-10589,-31010,-10597,-31007,-10604,-31004,-10612,-31002,-10620,-30999,-10628,-30996,-10636,-30993,-10644,-30991,-10652,-30988,-10660,-30985,-10668,-30982,-10676,-30980,-10684,-30977,-10692,-30974,-10700,-30972,-10707,-30969,-10715,-30966,-10723,-30963,-10731,-30961,-10739,-30958,-10747,-30955,-10755,-30952,-10763,-30950,-10771,-30947,-10779,-30944,-10787,-30941,-10795,-30939,-10802,-30936,-10810,-30933,-10818,-30930,-10826,-30928,-10834,-30925,-10842,-30922,-10850,-30919,-10858,-30916,-10866,-30914,-10874,-30911,-10881,-30908,-10889,-30905,-10897,-30903,-10905,-30900,-10913,-30897,-10921,-30894,-10929,-30891,-10937,-30889,-10945,-30886,-10953,-30883,-10960,-30880,-10968,-30877,-10976,-30875,-10984,-30872,-10992,-30869,-11000,-30866,-11008,-30863,-11016,-30861,-11024,-30858,-11031,-30855,-11039,-30852,-11047,-30849,-11055,-30846,-11063,-30844,-11071,-30841,-11079,-30838,-11087,-30835,-11095,-30832,-11102,-30829,-11110,-30827,-11118,-30824,-11126,-30821,-11134,-30818,-11142,-30815,-11150,-30812,-11158,-30810,-11165,-30807,-11173,-30804,-11181,-30801,-11189,-30798,-11197,-30795,-11205,-30792,-11213,-30789,-11221,-30787,-11228,-30784,-11236,-30781,-11244,-30778,-11252,-30775,-11260,-30772,-11268,-30769,-11276,-30767,-11284,-30764,-11291,-30761,-11299,-30758,-11307,-30755,-11315,-30752,-11323,-30749,-11331,-30746,-11339,-30743,-11346,-30740,-11354,-30738,-11362,-30735,-11370,-30732,-11378,-30729,-11386,-30726,-11394,-30723,-11401,-30720,-11409,-30717,-11417,-30714,-11425,-30711,-11433,-30708,-11441,-30706,-11449,-30703,-11456,-30700,-11464,-30697,-11472,-30694,-11480,-30691,-11488,-30688,-11496,-30685,-11503,-30682,-11511,-30679,-11519,-30676,-11527,-30673,-11535,-30670,-11543,-30667,-11551,-30664,-11558,-30661,-11566,-30658,-11574,-30656,-11582,-30653,-11590,-30650,-11598,-30647,-11605,-30644,-11613,-30641,-11621,-30638,-11629,-30635,-11637,-30632,-11645,-30629,-11652,-30626,-11660,-30623,-11668,-30620,-11676,-30617,-11684,-30614,-11692,-30611,-11699,-30608,-11707,-30605,-11715,-30602,-11723,-30599,-11731,-30596,-11738,-30593,-11746,-30590,-11754,-30587,-11762,-30584,-11770,-30581,-11778,-30578,-11785,-30575,-11793,-30572,-11801,-30569,-11809,-30566,-11817,-30563,-11824,-30560,-11832,-30557,-11840,-30554,-11848,-30551,-11856,-30548,-11863,-30545,-11871,-30542,-11879,-30539,-11887,-30536,-11895,-30533,-11903,-30529,-11910,-30526,-11918,-30523,-11926,-30520,-11934,-30517,-11942,-30514,-11949,-30511,-11957,-30508,-11965,-30505,-11973,-30502,-11981,-30499,-11988,-30496,-11996,-30493,-12004,-30490,-12012,-30487,-12020,-30484,-12027,-30481,-12035,-30477,-12043,-30474,-12051,-30471,-12058,-30468,-12066,-30465,-12074,-30462,-12082,-30459,-12090,-30456,-12097,-30453,-12105,-30450,-12113,-30447,-12121,-30443,-12129,-30440,-12136,-30437,-12144,-30434,-12152,-30431,-12160,-30428,-12167,-30425,-12175,-30422,-12183,-30419,-12191,-30416,-12199,-30412,-12206,-30409,-12214,-30406,-12222,-30403,-12230,-30400,-12237,-30397,-12245,-30394,-12253,-30391,-12261,-30387,-12269,-30384,-12276,-30381,-12284,-30378,-12292,-30375,-12300,-30372,-12307,-30369,-12315,-30365,-12323,-30362,-12331,-30359,-12338,-30356,-12346,-30353,-12354,-30350,-12362,-30346,-12369,-30343,-12377,-30340,-12385,-30337,-12393,-30334,-12400,-30331,-12408,-30327,-12416,-30324,-12424,-30321,-12431,-30318,-12439,-30315,-12447,-30312,-12455,-30308,-12462,-30305,-12470,-30302,-12478,-30299,-12486,-30296,-12493,-30292,-12501,-30289,-12509,-30286,-12517,-30283,-12524,-30280,-12532,-30276,-12540,-30273,-12548,-30270,-12555,-30267,-12563,-30264,-12571,-30260,-12579,-30257,-12586,-30254,-12594,-30251,-12602,-30248,-12610,-30244,-12617,-30241,-12625,-30238,-12633,-30235,-12640,-30231,-12648,-30228,-12656,-30225,-12664,-30222,-12671,-30218,-12679,-30215,-12687,-30212,-12695,-30209,-12702,-30206,-12710,-30202,-12718,-30199,-12725,-30196,-12733,-30192,-12741,-30189,-12749,-30186,-12756,-30183,-12764,-30179,-12772,-30176,-12779,-30173,-12787,-30170,-12795,-30166,-12803,-30163,-12810,-30160,-12818,-30157,-12826,-30153,-12833,-30150,-12841,-30147,-12849,-30143,-12857,-30140,-12864,-30137,-12872,-30134,-12880,-30130,-12887,-30127,-12895,-30124,-12903,-30120,-12910,-30117,-12918,-30114,-12926,-30110,-12934,-30107,-12941,-30104,-12949,-30101,-12957,-30097,-12964,-30094,-12972,-30091,-12980,-30087,-12987,-30084,-12995,-30081,-13003,-30077,-13010,-30074,-13018,-30071,-13026,-30067,-13034,-30064,-13041,-30061,-13049,-30057,-13057,-30054,-13064,-30051,-13072,-30047,-13080,-30044,-13087,-30041,-13095,-30037,-13103,-30034,-13110,-30031,-13118,-30027,-13126,-30024,-13133,-30021,-13141,-30017,-13149,-30014,-13156,-30010,-13164,-30007,-13172,-30004,-13179,-30000,-13187,-29997,-13195,-29994,-13202,-29990,-13210,-29987,-13218,-29984,-13225,-29980,-13233,-29977,-13241,-29973,-13248,-29970,-13256,-29967,-13264,-29963,-13271,-29960,-13279,-29956,-13287,-29953,-13294,-29950,-13302,-29946,-13310,-29943,-13317,-29939,-13325,-29936,-13333,-29933,-13340,-29929,-13348,-29926,-13356,-29922,-13363,-29919,-13371,-29916,-13379,-29912,-13386,-29909,-13394,-29905,-13401,-29902,-13409,-29898,-13417,-29895,-13424,-29892,-13432,-29888,-13440,-29885,-13447,-29881,-13455,-29878,-13463,-29874,-13470,-29871,-13478,-29867,-13486,-29864,-13493,-29861,-13501,-29857,-13508,-29854,-13516,-29850,-13524,-29847,-13531,-29843,-13539,-29840,-13547,-29836,-13554,-29833,-13562,-29829,-13569,-29826,-13577,-29823,-13585,-29819,-13592,-29816,-13600,-29812,-13608,-29809,-13615,-29805,-13623,-29802,-13630,-29798,-13638,-29795,-13646,-29791,-13653,-29788,-13661,-29784,-13668,-29781,-13676,-29777,-13684,-29774,-13691,-29770,-13699,-29767,-13707,-29763,-13714,-29760,-13722,-29756,-13729,-29753,-13737,-29749,-13745,-29746,-13752,-29742,-13760,-29739,-13767,-29735,-13775,-29732,-13783,-29728,-13790,-29725,-13798,-29721,-13805,-29718,-13813,-29714,-13821,-29710,-13828,-29707,-13836,-29703,-13843,-29700,-13851,-29696,-13859,-29693,-13866,-29689,-13874,-29686,-13881,-29682,-13889,-29679,-13896,-29675,-13904,-29671,-13912,-29668,-13919,-29664,-13927,-29661,-13934,-29657,-13942,-29654,-13950,-29650,-13957,-29647,-13965,-29643,-13972,-29639,-13980,-29636,-13987,-29632,-13995,-29629,-14003,-29625,-14010,-29622,-14018,-29618,-14025,-29614,-14033,-29611,-14040,-29607,-14048,-29604,-14056,-29600,-14063,-29596,-14071,-29593,-14078,-29589,-14086,-29586,-14093,-29582,-14101,-29578,-14109,-29575,-14116,-29571,-14124,-29568,-14131,-29564,-14139,-29560,-14146,-29557,-14154,-29553,-14161,-29549,-14169,-29546,-14177,-29542,-14184,-29539,-14192,-29535,-14199,-29531,-14207,-29528,-14214,-29524,-14222,-29520,-14229,-29517,-14237,-29513,-14245,-29510,-14252,-29506,-14260,-29502,-14267,-29499,-14275,-29495,-14282,-29491,-14290,-29488,-14297,-29484,-14305,-29480,-14312,-29477,-14320,-29473,-14327,-29469,-14335,-29466,-14343,-29462,-14350,-29458,-14358,-29455,-14365,-29451,-14373,-29447,-14380,-29444,-14388,-29440,-14395,-29436,-14403,-29433,-14410,-29429,-14418,-29425,-14425,-29422,-14433,-29418,-14440,-29414,-14448,-29411,-14455,-29407,-14463,-29403,-14470,-29399,-14478,-29396,-14485,-29392,-14493,-29388,-14500,-29385,-14508,-29381,-14516,-29377,-14523,-29373,-14531,-29370,-14538,-29366,-14546,-29362,-14553,-29359,-14561,-29355,-14568,-29351,-14576,-29347,-14583,-29344,-14591,-29340,-14598,-29336,-14606,-29333,-14613,-29329,-14621,-29325,-14628,-29321,-14636,-29318,-14643,-29314,-14651,-29310,-14658,-29306,-14666,-29303,-14673,-29299,-14681,-29295,-14688,-29291,-14695,-29288,-14703,-29284,-14710,-29280,-14718,-29276,-14725,-29273,-14733,-29269,-14740,-29265,-14748,-29261,-14755,-29257,-14763,-29254,-14770,-29250,-14778,-29246,-14785,-29242,-14793,-29239,-14800,-29235,-14808,-29231,-14815,-29227,-14823,-29223,-14830,-29220,-14838,-29216,-14845,-29212,-14853,-29208,-14860,-29204,-14867,-29201,-14875,-29197,-14882,-29193,-14890,-29189,-14897,-29185,-14905,-29182,-14912,-29178,-14920,-29174,-14927,-29170,-14935,-29166,-14942,-29163,-14950,-29159,-14957,-29155,-14964,-29151,-14972,-29147,-14979,-29143,-14987,-29140,-14994,-29136,-15002,-29132,-15009,-29128,-15017,-29124,-15024,-29120,-15031,-29117,-15039,-29113,-15046,-29109,-15054,-29105,-15061,-29101,-15069,-29097,-15076,-29093,-15084,-29090,-15091,-29086,-15098,-29082,-15106,-29078,-15113,-29074,-15121,-29070,-15128,-29066,-15136,-29063,-15143,-29059,-15150,-29055,-15158,-29051,-15165,-29047,-15173,-29043,-15180,-29039,-15188,-29035,-15195,-29032,-15202,-29028,-15210,-29024,-15217,-29020,-15225,-29016,-15232,-29012,-15239,-29008,-15247,-29004,-15254,-29000,-15262,-28997,-15269,-28993,-15277,-28989,-15284,-28985,-15291,-28981,-15299,-28977,-15306,-28973,-15314,-28969,-15321,-28965,-15328,-28961,-15336,-28957,-15343,-28954,-15351,-28950,-15358,-28946,-15365,-28942,-15373,-28938,-15380,-28934,-15388,-28930,-15395,-28926,-15402,-28922,-15410,-28918,-15417,-28914,-15425,-28910,-15432,-28906,-15439,-28902,-15447,-28898,-15454,-28894,-15462,-28891,-15469,-28887,-15476,-28883,-15484,-28879,-15491,-28875,-15498,-28871,-15506,-28867,-15513,-28863,-15521,-28859,-15528,-28855,-15535,-28851,-15543,-28847,-15550,-28843,-15557,-28839,-15565,-28835,-15572,-28831,-15580,-28827,-15587,-28823,-15594,-28819,-15602,-28815,-15609,-28811,-15616,-28807,-15624,-28803,-15631,-28799,-15639,-28795,-15646,-28791,-15653,-28787,-15661,-28783,-15668,-28779,-15675,-28775,-15683,-28771,-15690,-28767,-15697,-28763,-15705,-28759,-15712,-28755,-15719,-28751,-15727,-28747,-15734,-28743,-15741,-28739,-15749,-28735,-15756,-28731,-15764,-28727,-15771,-28723,-15778,-28719,-15786,-28715,-15793,-28711,-15800,-28707,-15808,-28703,-15815,-28699,-15822,-28695,-15830,-28691,-15837,-28686,-15844,-28682,-15852,-28678,-15859,-28674,-15866,-28670,-15874,-28666,-15881,-28662,-15888,-28658,-15896,-28654,-15903,-28650,-15910,-28646,-15918,-28642,-15925,-28638,-15932,-28634,-15939,-28630,-15947,-28626,-15954,-28621,-15961,-28617,-15969,-28613,-15976,-28609,-15983,-28605,-15991,-28601,-15998,-28597,-16005,-28593,-16013,-28589,-16020,-28585,-16027,-28581,-16035,-28576,-16042,-28572,-16049,-28568,-16056,-28564,-16064,-28560,-16071,-28556,-16078,-28552,-16086,-28548,-16093,-28544,-16100,-28539,-16108,-28535,-16115,-28531,-16122,-28527,-16129,-28523,-16137,-28519,-16144,-28515,-16151,-28511,-16159,-28507,-16166,-28502,-16173,-28498,-16180,-28494,-16188,-28490,-16195,-28486,-16202,-28482,-16210,-28478,-16217,-28473,-16224,-28469,-16231,-28465,-16239,-28461,-16246,-28457,-16253,-28453,-16261,-28448,-16268,-28444,-16275,-28440,-16282,-28436,-16290,-28432,-16297,-28428,-16304,-28424,-16311,-28419,-16319,-28415,-16326,-28411,-16333,-28407,-16340,-28403,-16348,-28398,-16355,-28394,-16362,-28390,-16369,-28386,-16377,-28382}; -int16_t twb24576[16384] __attribute__((aligned(16))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386,-16384,-28378,-16399,-28369,-16413,-28361,-16428,-28352,-16442,-28344,-16456,-28336,-16471,-28327,-16485,-28319,-16500,-28310,-16514,-28302,-16529,-28293,-16543,-28285,-16558,-28276,-16572,-28268,-16587,-28260,-16601,-28251,-16616,-28243,-16630,-28234,-16644,-28226,-16659,-28217,-16673,-28209,-16688,-28200,-16702,-28191,-16717,-28183,-16731,-28174,-16745,-28166,-16760,-28157,-16774,-28149,-16789,-28140,-16803,-28132,-16817,-28123,-16832,-28114,-16846,-28106,-16860,-28097,-16875,-28088,-16889,-28080,-16904,-28071,-16918,-28063,-16932,-28054,-16947,-28045,-16961,-28037,-16975,-28028,-16990,-28019,-17004,-28010,-17018,-28002,-17033,-27993,-17047,-27984,-17061,-27976,-17075,-27967,-17090,-27958,-17104,-27949,-17118,-27941,-17133,-27932,-17147,-27923,-17161,-27914,-17175,-27906,-17190,-27897,-17204,-27888,-17218,-27879,-17233,-27870,-17247,-27862,-17261,-27853,-17275,-27844,-17289,-27835,-17304,-27826,-17318,-27817,-17332,-27809,-17346,-27800,-17361,-27791,-17375,-27782,-17389,-27773,-17403,-27764,-17417,-27755,-17432,-27746,-17446,-27737,-17460,-27729,-17474,-27720,-17488,-27711,-17502,-27702,-17517,-27693,-17531,-27684,-17545,-27675,-17559,-27666,-17573,-27657,-17587,-27648,-17601,-27639,-17616,-27630,-17630,-27621,-17644,-27612,-17658,-27603,-17672,-27594,-17686,-27585,-17700,-27576,-17714,-27567,-17728,-27558,-17743,-27549,-17757,-27539,-17771,-27530,-17785,-27521,-17799,-27512,-17813,-27503,-17827,-27494,-17841,-27485,-17855,-27476,-17869,-27467,-17883,-27457,-17897,-27448,-17911,-27439,-17925,-27430,-17939,-27421,-17953,-27412,-17967,-27402,-17981,-27393,-17995,-27384,-18009,-27375,-18023,-27366,-18037,-27356,-18051,-27347,-18065,-27338,-18079,-27329,-18093,-27320,-18107,-27310,-18121,-27301,-18135,-27292,-18149,-27282,-18163,-27273,-18177,-27264,-18191,-27255,-18205,-27245,-18219,-27236,-18233,-27227,-18247,-27217,-18261,-27208,-18274,-27199,-18288,-27189,-18302,-27180,-18316,-27171,-18330,-27161,-18344,-27152,-18358,-27142,-18372,-27133,-18386,-27124,-18399,-27114,-18413,-27105,-18427,-27095,-18441,-27086,-18455,-27077,-18469,-27067,-18483,-27058,-18496,-27048,-18510,-27039,-18524,-27029,-18538,-27020,-18552,-27010,-18565,-27001,-18579,-26991,-18593,-26982,-18607,-26972,-18621,-26963,-18634,-26953,-18648,-26944,-18662,-26934,-18676,-26925,-18690,-26915,-18703,-26906,-18717,-26896,-18731,-26886,-18745,-26877,-18758,-26867,-18772,-26858,-18786,-26848,-18799,-26838,-18813,-26829,-18827,-26819,-18841,-26810,-18854,-26800,-18868,-26790,-18882,-26781,-18895,-26771,-18909,-26761,-18923,-26752,-18936,-26742,-18950,-26732,-18964,-26723,-18977,-26713,-18991,-26703,-19005,-26693,-19018,-26684,-19032,-26674,-19046,-26664,-19059,-26655,-19073,-26645,-19087,-26635,-19100,-26625,-19114,-26616,-19127,-26606,-19141,-26596,-19155,-26586,-19168,-26576,-19182,-26567,-19195,-26557,-19209,-26547,-19222,-26537,-19236,-26527,-19250,-26517,-19263,-26508,-19277,-26498,-19290,-26488,-19304,-26478,-19317,-26468,-19331,-26458,-19344,-26448,-19358,-26438,-19371,-26429,-19385,-26419,-19398,-26409,-19412,-26399,-19425,-26389,-19439,-26379,-19452,-26369,-19466,-26359,-19479,-26349,-19493,-26339,-19506,-26329,-19520,-26319,-19533,-26309,-19547,-26299,-19560,-26289,-19574,-26279,-19587,-26269,-19600,-26259,-19614,-26249,-19627,-26239,-19641,-26229,-19654,-26219,-19668,-26209,-19681,-26199,-19694,-26189,-19708,-26179,-19721,-26169,-19734,-26159,-19748,-26149,-19761,-26138,-19775,-26128,-19788,-26118,-19801,-26108,-19815,-26098,-19828,-26088,-19841,-26078,-19855,-26068,-19868,-26057,-19881,-26047,-19895,-26037,-19908,-26027,-19921,-26017,-19934,-26007,-19948,-25996,-19961,-25986,-19974,-25976,-19988,-25966,-20001,-25955,-20014,-25945,-20027,-25935,-20041,-25925,-20054,-25914,-20067,-25904,-20080,-25894,-20094,-25884,-20107,-25873,-20120,-25863,-20133,-25853,-20147,-25843,-20160,-25832,-20173,-25822,-20186,-25812,-20199,-25801,-20213,-25791,-20226,-25781,-20239,-25770,-20252,-25760,-20265,-25750,-20278,-25739,-20292,-25729,-20305,-25718,-20318,-25708,-20331,-25698,-20344,-25687,-20357,-25677,-20370,-25666,-20384,-25656,-20397,-25646,-20410,-25635,-20423,-25625,-20436,-25614,-20449,-25604,-20462,-25593,-20475,-25583,-20488,-25572,-20501,-25562,-20514,-25551,-20528,-25541,-20541,-25530,-20554,-25520,-20567,-25509,-20580,-25499,-20593,-25488,-20606,-25478,-20619,-25467,-20632,-25457,-20645,-25446,-20658,-25436,-20671,-25425,-20684,-25415,-20697,-25404,-20710,-25393,-20723,-25383,-20736,-25372,-20749,-25362,-20762,-25351,-20775,-25340,-20788,-25330,-20801,-25319,-20814,-25308,-20826,-25298,-20839,-25287,-20852,-25277,-20865,-25266,-20878,-25255,-20891,-25244,-20904,-25234,-20917,-25223,-20930,-25212,-20943,-25202,-20956,-25191,-20968,-25180,-20981,-25170,-20994,-25159,-21007,-25148,-21020,-25137,-21033,-25127,-21046,-25116,-21058,-25105,-21071,-25094,-21084,-25084,-21097,-25073,-21110,-25062,-21123,-25051,-21135,-25040,-21148,-25030,-21161,-25019,-21174,-25008,-21187,-24997,-21199,-24986,-21212,-24975,-21225,-24965,-21238,-24954,-21250,-24943,-21263,-24932,-21276,-24921,-21289,-24910,-21301,-24899,-21314,-24888,-21327,-24878,-21340,-24867,-21352,-24856,-21365,-24845,-21378,-24834,-21390,-24823,-21403,-24812,-21416,-24801,-21428,-24790,-21441,-24779,-21454,-24768,-21466,-24757,-21479,-24746,-21492,-24735,-21504,-24724,-21517,-24713,-21530,-24702,-21542,-24691,-21555,-24680,-21567,-24669,-21580,-24658,-21593,-24647,-21605,-24636,-21618,-24625,-21630,-24614,-21643,-24603,-21656,-24592,-21668,-24581,-21681,-24570,-21693,-24559,-21706,-24547,-21718,-24536,-21731,-24525,-21744,-24514,-21756,-24503,-21769,-24492,-21781,-24481,-21794,-24470,-21806,-24458,-21819,-24447,-21831,-24436,-21844,-24425,-21856,-24414,-21869,-24403,-21881,-24391,-21894,-24380,-21906,-24369,-21918,-24358,-21931,-24347,-21943,-24335,-21956,-24324,-21968,-24313,-21981,-24302,-21993,-24290,-22005,-24279,-22018,-24268,-22030,-24257,-22043,-24245,-22055,-24234,-22067,-24223,-22080,-24212,-22092,-24200,-22105,-24189,-22117,-24178,-22129,-24166,-22142,-24155,-22154,-24144,-22166,-24132,-22179,-24121,-22191,-24110,-22203,-24098,-22216,-24087,-22228,-24076,-22240,-24064,-22253,-24053,-22265,-24042,-22277,-24030,-22289,-24019,-22302,-24007,-22314,-23996,-22326,-23985,-22339,-23973,-22351,-23962,-22363,-23950,-22375,-23939,-22388,-23927,-22400,-23916,-22412,-23904,-22424,-23893,-22436,-23882,-22449,-23870,-22461,-23859,-22473,-23847,-22485,-23836,-22497,-23824,-22510,-23813,-22522,-23801,-22534,-23790,-22546,-23778,-22558,-23767,-22570,-23755,-22583,-23743,-22595,-23732,-22607,-23720,-22619,-23709,-22631,-23697,-22643,-23686,-22655,-23674,-22667,-23662,-22679,-23651,-22692,-23639,-22704,-23628,-22716,-23616,-22728,-23604,-22740,-23593,-22752,-23581,-22764,-23570,-22776,-23558,-22788,-23546,-22800,-23535,-22812,-23523,-22824,-23511,-22836,-23500,-22848,-23488,-22860,-23476,-22872,-23465,-22884,-23453,-22896,-23441,-22908,-23429,-22920,-23418,-22932,-23406,-22944,-23394,-22956,-23383,-22968,-23371,-22980,-23359,-22992,-23347,-23004,-23336,-23016,-23324,-23028,-23312,-23040,-23300,-23051,-23288,-23063,-23277,-23075,-23265,-23087,-23253,-23099,-23241,-23111,-23229,-23123,-23218,-23135,-23206,-23147,-23194,-23158,-23182,-23170,-23170,-23182,-23158,-23194,-23147,-23206,-23135,-23218,-23123,-23229,-23111,-23241,-23099,-23253,-23087,-23265,-23075,-23277,-23063,-23288,-23051,-23300,-23040,-23312,-23028,-23324,-23016,-23336,-23004,-23347,-22992,-23359,-22980,-23371,-22968,-23383,-22956,-23394,-22944,-23406,-22932,-23418,-22920,-23429,-22908,-23441,-22896,-23453,-22884,-23465,-22872,-23476,-22860,-23488,-22848,-23500,-22836,-23511,-22824,-23523,-22812,-23535,-22800,-23546,-22788,-23558,-22776,-23570,-22764,-23581,-22752,-23593,-22740,-23604,-22728,-23616,-22716,-23628,-22704,-23639,-22692,-23651,-22679,-23662,-22667,-23674,-22655,-23686,-22643,-23697,-22631,-23709,-22619,-23720,-22607,-23732,-22595,-23743,-22583,-23755,-22570,-23767,-22558,-23778,-22546,-23790,-22534,-23801,-22522,-23813,-22510,-23824,-22497,-23836,-22485,-23847,-22473,-23859,-22461,-23870,-22449,-23882,-22436,-23893,-22424,-23904,-22412,-23916,-22400,-23927,-22388,-23939,-22375,-23950,-22363,-23962,-22351,-23973,-22339,-23985,-22326,-23996,-22314,-24007,-22302,-24019,-22289,-24030,-22277,-24042,-22265,-24053,-22253,-24064,-22240,-24076,-22228,-24087,-22216,-24098,-22203,-24110,-22191,-24121,-22179,-24132,-22166,-24144,-22154,-24155,-22142,-24166,-22129,-24178,-22117,-24189,-22105,-24200,-22092,-24212,-22080,-24223,-22067,-24234,-22055,-24245,-22043,-24257,-22030,-24268,-22018,-24279,-22005,-24290,-21993,-24302,-21981,-24313,-21968,-24324,-21956,-24335,-21943,-24347,-21931,-24358,-21918,-24369,-21906,-24380,-21894,-24391,-21881,-24403,-21869,-24414,-21856,-24425,-21844,-24436,-21831,-24447,-21819,-24458,-21806,-24470,-21794,-24481,-21781,-24492,-21769,-24503,-21756,-24514,-21744,-24525,-21731,-24536,-21718,-24547,-21706,-24559,-21693,-24570,-21681,-24581,-21668,-24592,-21656,-24603,-21643,-24614,-21630,-24625,-21618,-24636,-21605,-24647,-21593,-24658,-21580,-24669,-21567,-24680,-21555,-24691,-21542,-24702,-21530,-24713,-21517,-24724,-21504,-24735,-21492,-24746,-21479,-24757,-21466,-24768,-21454,-24779,-21441,-24790,-21428,-24801,-21416,-24812,-21403,-24823,-21390,-24834,-21378,-24845,-21365,-24856,-21352,-24867,-21340,-24878,-21327,-24888,-21314,-24899,-21301,-24910,-21289,-24921,-21276,-24932,-21263,-24943,-21250,-24954,-21238,-24965,-21225,-24975,-21212,-24986,-21199,-24997,-21187,-25008,-21174,-25019,-21161,-25030,-21148,-25040,-21135,-25051,-21123,-25062,-21110,-25073,-21097,-25084,-21084,-25094,-21071,-25105,-21058,-25116,-21046,-25127,-21033,-25137,-21020,-25148,-21007,-25159,-20994,-25170,-20981,-25180,-20968,-25191,-20956,-25202,-20943,-25212,-20930,-25223,-20917,-25234,-20904,-25244,-20891,-25255,-20878,-25266,-20865,-25277,-20852,-25287,-20839,-25298,-20826,-25308,-20814,-25319,-20801,-25330,-20788,-25340,-20775,-25351,-20762,-25362,-20749,-25372,-20736,-25383,-20723,-25393,-20710,-25404,-20697,-25415,-20684,-25425,-20671,-25436,-20658,-25446,-20645,-25457,-20632,-25467,-20619,-25478,-20606,-25488,-20593,-25499,-20580,-25509,-20567,-25520,-20554,-25530,-20541,-25541,-20528,-25551,-20514,-25562,-20501,-25572,-20488,-25583,-20475,-25593,-20462,-25604,-20449,-25614,-20436,-25625,-20423,-25635,-20410,-25646,-20397,-25656,-20384,-25666,-20370,-25677,-20357,-25687,-20344,-25698,-20331,-25708,-20318,-25718,-20305,-25729,-20292,-25739,-20278,-25750,-20265,-25760,-20252,-25770,-20239,-25781,-20226,-25791,-20213,-25801,-20199,-25812,-20186,-25822,-20173,-25832,-20160,-25843,-20147,-25853,-20133,-25863,-20120,-25873,-20107,-25884,-20094,-25894,-20080,-25904,-20067,-25914,-20054,-25925,-20041,-25935,-20027,-25945,-20014,-25955,-20001,-25966,-19988,-25976,-19974,-25986,-19961,-25996,-19948,-26007,-19934,-26017,-19921,-26027,-19908,-26037,-19895,-26047,-19881,-26057,-19868,-26068,-19855,-26078,-19841,-26088,-19828,-26098,-19815,-26108,-19801,-26118,-19788,-26128,-19775,-26138,-19761,-26149,-19748,-26159,-19734,-26169,-19721,-26179,-19708,-26189,-19694,-26199,-19681,-26209,-19668,-26219,-19654,-26229,-19641,-26239,-19627,-26249,-19614,-26259,-19600,-26269,-19587,-26279,-19574,-26289,-19560,-26299,-19547,-26309,-19533,-26319,-19520,-26329,-19506,-26339,-19493,-26349,-19479,-26359,-19466,-26369,-19452,-26379,-19439,-26389,-19425,-26399,-19412,-26409,-19398,-26419,-19385,-26429,-19371,-26438,-19358,-26448,-19344,-26458,-19331,-26468,-19317,-26478,-19304,-26488,-19290,-26498,-19277,-26508,-19263,-26517,-19250,-26527,-19236,-26537,-19222,-26547,-19209,-26557,-19195,-26567,-19182,-26576,-19168,-26586,-19155,-26596,-19141,-26606,-19127,-26616,-19114,-26625,-19100,-26635,-19087,-26645,-19073,-26655,-19059,-26664,-19046,-26674,-19032,-26684,-19018,-26693,-19005,-26703,-18991,-26713,-18977,-26723,-18964,-26732,-18950,-26742,-18936,-26752,-18923,-26761,-18909,-26771,-18895,-26781,-18882,-26790,-18868,-26800,-18854,-26810,-18841,-26819,-18827,-26829,-18813,-26838,-18799,-26848,-18786,-26858,-18772,-26867,-18758,-26877,-18745,-26886,-18731,-26896,-18717,-26906,-18703,-26915,-18690,-26925,-18676,-26934,-18662,-26944,-18648,-26953,-18634,-26963,-18621,-26972,-18607,-26982,-18593,-26991,-18579,-27001,-18565,-27010,-18552,-27020,-18538,-27029,-18524,-27039,-18510,-27048,-18496,-27058,-18483,-27067,-18469,-27077,-18455,-27086,-18441,-27095,-18427,-27105,-18413,-27114,-18399,-27124,-18386,-27133,-18372,-27142,-18358,-27152,-18344,-27161,-18330,-27171,-18316,-27180,-18302,-27189,-18288,-27199,-18274,-27208,-18261,-27217,-18247,-27227,-18233,-27236,-18219,-27245,-18205,-27255,-18191,-27264,-18177,-27273,-18163,-27282,-18149,-27292,-18135,-27301,-18121,-27310,-18107,-27320,-18093,-27329,-18079,-27338,-18065,-27347,-18051,-27356,-18037,-27366,-18023,-27375,-18009,-27384,-17995,-27393,-17981,-27402,-17967,-27412,-17953,-27421,-17939,-27430,-17925,-27439,-17911,-27448,-17897,-27457,-17883,-27467,-17869,-27476,-17855,-27485,-17841,-27494,-17827,-27503,-17813,-27512,-17799,-27521,-17785,-27530,-17771,-27539,-17757,-27549,-17743,-27558,-17728,-27567,-17714,-27576,-17700,-27585,-17686,-27594,-17672,-27603,-17658,-27612,-17644,-27621,-17630,-27630,-17616,-27639,-17601,-27648,-17587,-27657,-17573,-27666,-17559,-27675,-17545,-27684,-17531,-27693,-17517,-27702,-17502,-27711,-17488,-27720,-17474,-27729,-17460,-27737,-17446,-27746,-17432,-27755,-17417,-27764,-17403,-27773,-17389,-27782,-17375,-27791,-17361,-27800,-17346,-27809,-17332,-27817,-17318,-27826,-17304,-27835,-17289,-27844,-17275,-27853,-17261,-27862,-17247,-27870,-17233,-27879,-17218,-27888,-17204,-27897,-17190,-27906,-17175,-27914,-17161,-27923,-17147,-27932,-17133,-27941,-17118,-27949,-17104,-27958,-17090,-27967,-17075,-27976,-17061,-27984,-17047,-27993,-17033,-28002,-17018,-28010,-17004,-28019,-16990,-28028,-16975,-28037,-16961,-28045,-16947,-28054,-16932,-28063,-16918,-28071,-16904,-28080,-16889,-28088,-16875,-28097,-16860,-28106,-16846,-28114,-16832,-28123,-16817,-28132,-16803,-28140,-16789,-28149,-16774,-28157,-16760,-28166,-16745,-28174,-16731,-28183,-16717,-28191,-16702,-28200,-16688,-28209,-16673,-28217,-16659,-28226,-16644,-28234,-16630,-28243,-16616,-28251,-16601,-28260,-16587,-28268,-16572,-28276,-16558,-28285,-16543,-28293,-16529,-28302,-16514,-28310,-16500,-28319,-16485,-28327,-16471,-28336,-16456,-28344,-16442,-28352,-16428,-28361,-16413,-28369,-16399,-28378,-16384,-28386,-16369,-28394,-16355,-28403,-16340,-28411,-16326,-28419,-16311,-28428,-16297,-28436,-16282,-28444,-16268,-28453,-16253,-28461,-16239,-28469,-16224,-28478,-16210,-28486,-16195,-28494,-16180,-28502,-16166,-28511,-16151,-28519,-16137,-28527,-16122,-28535,-16108,-28544,-16093,-28552,-16078,-28560,-16064,-28568,-16049,-28576,-16035,-28585,-16020,-28593,-16005,-28601,-15991,-28609,-15976,-28617,-15961,-28626,-15947,-28634,-15932,-28642,-15918,-28650,-15903,-28658,-15888,-28666,-15874,-28674,-15859,-28682,-15844,-28691,-15830,-28699,-15815,-28707,-15800,-28715,-15786,-28723,-15771,-28731,-15756,-28739,-15741,-28747,-15727,-28755,-15712,-28763,-15697,-28771,-15683,-28779,-15668,-28787,-15653,-28795,-15639,-28803,-15624,-28811,-15609,-28819,-15594,-28827,-15580,-28835,-15565,-28843,-15550,-28851,-15535,-28859,-15521,-28867,-15506,-28875,-15491,-28883,-15476,-28891,-15462,-28898,-15447,-28906,-15432,-28914,-15417,-28922,-15402,-28930,-15388,-28938,-15373,-28946,-15358,-28954,-15343,-28961,-15328,-28969,-15314,-28977,-15299,-28985,-15284,-28993,-15269,-29000,-15254,-29008,-15239,-29016,-15225,-29024,-15210,-29032,-15195,-29039,-15180,-29047,-15165,-29055,-15150,-29063,-15136,-29070,-15121,-29078,-15106,-29086,-15091,-29093,-15076,-29101,-15061,-29109,-15046,-29117,-15031,-29124,-15017,-29132,-15002,-29140,-14987,-29147,-14972,-29155,-14957,-29163,-14942,-29170,-14927,-29178,-14912,-29185,-14897,-29193,-14882,-29201,-14867,-29208,-14853,-29216,-14838,-29223,-14823,-29231,-14808,-29239,-14793,-29246,-14778,-29254,-14763,-29261,-14748,-29269,-14733,-29276,-14718,-29284,-14703,-29291,-14688,-29299,-14673,-29306,-14658,-29314,-14643,-29321,-14628,-29329,-14613,-29336,-14598,-29344,-14583,-29351,-14568,-29359,-14553,-29366,-14538,-29373,-14523,-29381,-14508,-29388,-14493,-29396,-14478,-29403,-14463,-29411,-14448,-29418,-14433,-29425,-14418,-29433,-14403,-29440,-14388,-29447,-14373,-29455,-14358,-29462,-14343,-29469,-14327,-29477,-14312,-29484,-14297,-29491,-14282,-29499,-14267,-29506,-14252,-29513,-14237,-29520,-14222,-29528,-14207,-29535,-14192,-29542,-14177,-29549,-14161,-29557,-14146,-29564,-14131,-29571,-14116,-29578,-14101,-29586,-14086,-29593,-14071,-29600,-14056,-29607,-14040,-29614,-14025,-29622,-14010,-29629,-13995,-29636,-13980,-29643,-13965,-29650,-13950,-29657,-13934,-29664,-13919,-29671,-13904,-29679,-13889,-29686,-13874,-29693,-13859,-29700,-13843,-29707,-13828,-29714,-13813,-29721,-13798,-29728,-13783,-29735,-13767,-29742,-13752,-29749,-13737,-29756,-13722,-29763,-13707,-29770,-13691,-29777,-13676,-29784,-13661,-29791,-13646,-29798,-13630,-29805,-13615,-29812,-13600,-29819,-13585,-29826,-13569,-29833,-13554,-29840,-13539,-29847,-13524,-29854,-13508,-29861,-13493,-29867,-13478,-29874,-13463,-29881,-13447,-29888,-13432,-29895,-13417,-29902,-13401,-29909,-13386,-29916,-13371,-29922,-13356,-29929,-13340,-29936,-13325,-29943,-13310,-29950,-13294,-29956,-13279,-29963,-13264,-29970,-13248,-29977,-13233,-29984,-13218,-29990,-13202,-29997,-13187,-30004,-13172,-30010,-13156,-30017,-13141,-30024,-13126,-30031,-13110,-30037,-13095,-30044,-13080,-30051,-13064,-30057,-13049,-30064,-13034,-30071,-13018,-30077,-13003,-30084,-12987,-30091,-12972,-30097,-12957,-30104,-12941,-30110,-12926,-30117,-12910,-30124,-12895,-30130,-12880,-30137,-12864,-30143,-12849,-30150,-12833,-30157,-12818,-30163,-12803,-30170,-12787,-30176,-12772,-30183,-12756,-30189,-12741,-30196,-12725,-30202,-12710,-30209,-12695,-30215,-12679,-30222,-12664,-30228,-12648,-30235,-12633,-30241,-12617,-30248,-12602,-30254,-12586,-30260,-12571,-30267,-12555,-30273,-12540,-30280,-12524,-30286,-12509,-30292,-12493,-30299,-12478,-30305,-12462,-30312,-12447,-30318,-12431,-30324,-12416,-30331,-12400,-30337,-12385,-30343,-12369,-30350,-12354,-30356,-12338,-30362,-12323,-30369,-12307,-30375,-12292,-30381,-12276,-30387,-12261,-30394,-12245,-30400,-12230,-30406,-12214,-30412,-12199,-30419,-12183,-30425,-12167,-30431,-12152,-30437,-12136,-30443,-12121,-30450,-12105,-30456,-12090,-30462,-12074,-30468,-12058,-30474,-12043,-30481,-12027,-30487,-12012,-30493,-11996,-30499,-11981,-30505,-11965,-30511,-11949,-30517,-11934,-30523,-11918,-30529,-11903,-30536,-11887,-30542,-11871,-30548,-11856,-30554,-11840,-30560,-11824,-30566,-11809,-30572,-11793,-30578,-11778,-30584,-11762,-30590,-11746,-30596,-11731,-30602,-11715,-30608,-11699,-30614,-11684,-30620,-11668,-30626,-11652,-30632,-11637,-30638,-11621,-30644,-11605,-30650,-11590,-30656,-11574,-30661,-11558,-30667,-11543,-30673,-11527,-30679,-11511,-30685,-11496,-30691,-11480,-30697,-11464,-30703,-11449,-30708,-11433,-30714,-11417,-30720,-11401,-30726,-11386,-30732,-11370,-30738,-11354,-30743,-11339,-30749,-11323,-30755,-11307,-30761,-11291,-30767,-11276,-30772,-11260,-30778,-11244,-30784,-11228,-30789,-11213,-30795,-11197,-30801,-11181,-30807,-11165,-30812,-11150,-30818,-11134,-30824,-11118,-30829,-11102,-30835,-11087,-30841,-11071,-30846,-11055,-30852,-11039,-30858,-11024,-30863,-11008,-30869,-10992,-30875,-10976,-30880,-10960,-30886,-10945,-30891,-10929,-30897,-10913,-30903,-10897,-30908,-10881,-30914,-10866,-30919,-10850,-30925,-10834,-30930,-10818,-30936,-10802,-30941,-10787,-30947,-10771,-30952,-10755,-30958,-10739,-30963,-10723,-30969,-10707,-30974,-10692,-30980,-10676,-30985,-10660,-30991,-10644,-30996,-10628,-31002,-10612,-31007,-10597,-31012,-10581,-31018,-10565,-31023,-10549,-31029,-10533,-31034,-10517,-31039,-10501,-31045,-10485,-31050,-10470,-31055,-10454,-31061,-10438,-31066,-10422,-31071,-10406,-31077,-10390,-31082,-10374,-31087,-10358,-31093,-10343,-31098,-10327,-31103,-10311,-31108,-10295,-31114,-10279,-31119,-10263,-31124,-10247,-31129,-10231,-31135,-10215,-31140,-10199,-31145,-10183,-31150,-10167,-31155,-10152,-31161,-10136,-31166,-10120,-31171,-10104,-31176,-10088,-31181,-10072,-31186,-10056,-31192,-10040,-31197,-10024,-31202,-10008,-31207,-9992,-31212,-9976,-31217,-9960,-31222,-9944,-31227,-9928,-31232,-9912,-31237,-9896,-31243,-9880,-31248,-9864,-31253,-9848,-31258,-9832,-31263,-9816,-31268,-9800,-31273,-9784,-31278,-9768,-31283,-9752,-31288,-9736,-31293,-9720,-31298,-9704,-31303,-9688,-31308,-9672,-31312,-9656,-31317,-9640,-31322,-9624,-31327,-9608,-31332,-9592,-31337,-9576,-31342,-9560,-31347,-9544,-31352,-9528,-31357,-9512,-31361,-9496,-31366,-9480,-31371,-9464,-31376,-9448,-31381,-9432,-31386,-9416,-31390,-9400,-31395,-9384,-31400,-9368,-31405,-9352,-31410,-9336,-31414,-9320,-31419,-9304,-31424,-9288,-31429,-9271,-31433,-9255,-31438,-9239,-31443,-9223,-31447,-9207,-31452,-9191,-31457,-9175,-31462,-9159,-31466,-9143,-31471,-9127,-31476,-9111,-31480,-9095,-31485,-9078,-31490,-9062,-31494,-9046,-31499,-9030,-31503,-9014,-31508,-8998,-31513,-8982,-31517,-8966,-31522,-8950,-31526,-8933,-31531,-8917,-31535,-8901,-31540,-8885,-31545,-8869,-31549,-8853,-31554,-8837,-31558,-8821,-31563,-8804,-31567,-8788,-31572,-8772,-31576,-8756,-31581,-8740,-31585,-8724,-31589,-8708,-31594,-8691,-31598,-8675,-31603,-8659,-31607,-8643,-31612,-8627,-31616,-8611,-31620,-8594,-31625,-8578,-31629,-8562,-31634,-8546,-31638,-8530,-31642,-8514,-31647,-8497,-31651,-8481,-31655,-8465,-31660,-8449,-31664,-8433,-31668,-8416,-31673,-8400,-31677,-8384,-31681,-8368,-31685,-8352,-31690,-8335,-31694,-8319,-31698,-8303,-31702,-8287,-31707,-8271,-31711,-8254,-31715,-8238,-31719,-8222,-31724,-8206,-31728,-8190,-31732,-8173,-31736,-8157,-31740,-8141,-31744,-8125,-31749,-8108,-31753,-8092,-31757,-8076,-31761,-8060,-31765,-8043,-31769,-8027,-31773,-8011,-31777,-7995,-31781,-7978,-31786,-7962,-31790,-7946,-31794,-7930,-31798,-7913,-31802,-7897,-31806,-7881,-31810,-7865,-31814,-7848,-31818,-7832,-31822,-7816,-31826,-7800,-31830,-7783,-31834,-7767,-31838,-7751,-31842,-7734,-31846,-7718,-31850,-7702,-31854,-7686,-31857,-7669,-31861,-7653,-31865,-7637,-31869,-7620,-31873,-7604,-31877,-7588,-31881,-7572,-31885,-7555,-31889,-7539,-31892,-7523,-31896,-7506,-31900,-7490,-31904,-7474,-31908,-7457,-31912,-7441,-31915,-7425,-31919,-7408,-31923,-7392,-31927,-7376,-31930,-7359,-31934,-7343,-31938,-7327,-31942,-7311,-31945,-7294,-31949,-7278,-31953,-7262,-31957,-7245,-31960,-7229,-31964,-7212,-31968,-7196,-31971,-7180,-31975,-7163,-31979,-7147,-31982,-7131,-31986,-7114,-31990,-7098,-31993,-7082,-31997,-7065,-32000,-7049,-32004,-7033,-32008,-7016,-32011,-7000,-32015,-6983,-32018,-6967,-32022,-6951,-32025,-6934,-32029,-6918,-32033,-6902,-32036,-6885,-32040,-6869,-32043,-6852,-32047,-6836,-32050,-6820,-32054,-6803,-32057,-6787,-32060,-6771,-32064,-6754,-32067,-6738,-32071,-6721,-32074,-6705,-32078,-6689,-32081,-6672,-32085,-6656,-32088,-6639,-32091,-6623,-32095,-6607,-32098,-6590,-32101,-6574,-32105,-6557,-32108,-6541,-32111,-6524,-32115,-6508,-32118,-6492,-32121,-6475,-32125,-6459,-32128,-6442,-32131,-6426,-32135,-6409,-32138,-6393,-32141,-6377,-32144,-6360,-32148,-6344,-32151,-6327,-32154,-6311,-32157,-6294,-32161,-6278,-32164,-6262,-32167,-6245,-32170,-6229,-32173,-6212,-32177,-6196,-32180,-6179,-32183,-6163,-32186,-6146,-32189,-6130,-32192,-6113,-32195,-6097,-32198,-6081,-32202,-6064,-32205,-6048,-32208,-6031,-32211,-6015,-32214,-5998,-32217,-5982,-32220,-5965,-32223,-5949,-32226,-5932,-32229,-5916,-32232,-5899,-32235,-5883,-32238,-5866,-32241,-5850,-32244,-5833,-32247,-5817,-32250,-5800,-32253,-5784,-32256,-5767,-32259,-5751,-32262,-5734,-32265,-5718,-32268,-5701,-32271,-5685,-32274,-5668,-32276,-5652,-32279,-5635,-32282,-5619,-32285,-5602,-32288,-5586,-32291,-5569,-32294,-5553,-32296,-5536,-32299,-5520,-32302,-5503,-32305,-5487,-32308,-5470,-32311,-5454,-32313,-5437,-32316,-5421,-32319,-5404,-32322,-5388,-32324,-5371,-32327,-5355,-32330,-5338,-32333,-5322,-32335,-5305,-32338,-5288,-32341,-5272,-32343,-5255,-32346,-5239,-32349,-5222,-32351,-5206,-32354,-5189,-32357,-5173,-32359,-5156,-32362,-5140,-32365,-5123,-32367,-5107,-32370,-5090,-32372,-5073,-32375,-5057,-32378,-5040,-32380,-5024,-32383,-5007,-32385,-4991,-32388,-4974,-32390,-4958,-32393,-4941,-32395,-4924,-32398,-4908,-32400,-4891,-32403,-4875,-32405,-4858,-32408,-4842,-32410,-4825,-32413,-4808,-32415,-4792,-32418,-4775,-32420,-4759,-32423,-4742,-32425,-4726,-32427,-4709,-32430,-4692,-32432,-4676,-32435,-4659,-32437,-4643,-32439,-4626,-32442,-4609,-32444,-4593,-32446,-4576,-32449,-4560,-32451,-4543,-32453,-4526,-32456,-4510,-32458,-4493,-32460,-4477,-32463,-4460,-32465,-4444,-32467,-4427,-32469,-4410,-32472,-4394,-32474,-4377,-32476,-4360,-32478,-4344,-32481,-4327,-32483,-4311,-32485,-4294,-32487,-4277,-32489,-4261,-32492,-4244,-32494,-4228,-32496,-4211,-32498,-4194,-32500,-4178,-32502,-4161,-32504,-4145,-32507,-4128,-32509,-4111,-32511,-4095,-32513,-4078,-32515,-4061,-32517,-4045,-32519,-4028,-32521,-4012,-32523,-3995,-32525,-3978,-32527,-3962,-32529,-3945,-32531,-3928,-32533,-3912,-32535,-3895,-32537,-3878,-32539,-3862,-32541,-3845,-32543,-3829,-32545,-3812,-32547,-3795,-32549,-3779,-32551,-3762,-32553,-3745,-32555,-3729,-32557,-3712,-32559,-3695,-32560,-3679,-32562,-3662,-32564,-3645,-32566,-3629,-32568,-3612,-32570,-3595,-32572,-3579,-32573,-3562,-32575,-3546,-32577,-3529,-32579,-3512,-32581,-3496,-32582,-3479,-32584,-3462,-32586,-3446,-32588,-3429,-32589,-3412,-32591,-3396,-32593,-3379,-32595,-3362,-32596,-3346,-32598,-3329,-32600,-3312,-32601,-3296,-32603,-3279,-32605,-3262,-32606,-3246,-32608,-3229,-32610,-3212,-32611,-3196,-32613,-3179,-32615,-3162,-32616,-3146,-32618,-3129,-32619,-3112,-32621,-3095,-32623,-3079,-32624,-3062,-32626,-3045,-32627,-3029,-32629,-3012,-32630,-2995,-32632,-2979,-32633,-2962,-32635,-2945,-32636,-2929,-32638,-2912,-32639,-2895,-32641,-2879,-32642,-2862,-32644,-2845,-32645,-2829,-32647,-2812,-32648,-2795,-32650,-2778,-32651,-2762,-32652,-2745,-32654,-2728,-32655,-2712,-32657,-2695,-32658,-2678,-32659,-2662,-32661,-2645,-32662,-2628,-32663,-2611,-32665,-2595,-32666,-2578,-32667,-2561,-32669,-2545,-32670,-2528,-32671,-2511,-32672,-2495,-32674,-2478,-32675,-2461,-32676,-2444,-32677,-2428,-32679,-2411,-32680,-2394,-32681,-2378,-32682,-2361,-32684,-2344,-32685,-2327,-32686,-2311,-32687,-2294,-32688,-2277,-32689,-2261,-32691,-2244,-32692,-2227,-32693,-2210,-32694,-2194,-32695,-2177,-32696,-2160,-32697,-2144,-32698,-2127,-32700,-2110,-32701,-2093,-32702,-2077,-32703,-2060,-32704,-2043,-32705,-2027,-32706,-2010,-32707,-1993,-32708,-1976,-32709,-1960,-32710,-1943,-32711,-1926,-32712,-1909,-32713,-1893,-32714,-1876,-32715,-1859,-32716,-1843,-32717,-1826,-32718,-1809,-32718,-1792,-32719,-1776,-32720,-1759,-32721,-1742,-32722,-1725,-32723,-1709,-32724,-1692,-32725,-1675,-32726,-1659,-32726,-1642,-32727,-1625,-32728,-1608,-32729,-1592,-32730,-1575,-32730,-1558,-32731,-1541,-32732,-1525,-32733,-1508,-32734,-1491,-32734,-1474,-32735,-1458,-32736,-1441,-32737,-1424,-32737,-1407,-32738,-1391,-32739,-1374,-32739,-1357,-32740,-1340,-32741,-1324,-32741,-1307,-32742,-1290,-32743,-1274,-32743,-1257,-32744,-1240,-32745,-1223,-32745,-1207,-32746,-1190,-32747,-1173,-32747,-1156,-32748,-1140,-32748,-1123,-32749,-1106,-32749,-1089,-32750,-1073,-32751,-1056,-32751,-1039,-32752,-1022,-32752,-1006,-32753,-989,-32753,-972,-32754,-955,-32754,-939,-32755,-922,-32755,-905,-32755,-888,-32756,-872,-32756,-855,-32757,-838,-32757,-821,-32758,-805,-32758,-788,-32758,-771,-32759,-754,-32759,-738,-32760,-721,-32760,-704,-32760,-687,-32761,-671,-32761,-654,-32761,-637,-32762,-620,-32762,-604,-32762,-587,-32763,-570,-32763,-553,-32763,-537,-32763,-520,-32764,-503,-32764,-486,-32764,-470,-32764,-453,-32765,-436,-32765,-419,-32765,-403,-32765,-386,-32765,-369,-32766,-352,-32766,-336,-32766,-319,-32766,-302,-32766,-285,-32766,-269,-32767,-252,-32767,-235,-32767,-218,-32767,-202,-32767,-185,-32767,-168,-32767,-151,-32767,-135,-32767,-118,-32767,-101,-32767,-84,-32767,-68,-32767,-51,-32767,-34,-32767,-17,-32767,-1,-32767,16,-32767,33,-32767,50,-32767,67,-32767,83,-32767,100,-32767,117,-32767,134,-32767,150,-32767,167,-32767,184,-32767,201,-32767,217,-32767,234,-32767,251,-32766,268,-32766,284,-32766,301,-32766,318,-32766,335,-32766,351,-32765,368,-32765,385,-32765,402,-32765,418,-32765,435,-32764,452,-32764,469,-32764,485,-32764,502,-32763,519,-32763,536,-32763,552,-32763,569,-32762,586,-32762,603,-32762,619,-32761,636,-32761,653,-32761,670,-32760,686,-32760,703,-32760,720,-32759,737,-32759,753,-32758,770,-32758,787,-32758,804,-32757,820,-32757,837,-32756,854,-32756,871,-32755,887,-32755,904,-32755,921,-32754,938,-32754,954,-32753,971,-32753,988,-32752,1005,-32752,1021,-32751,1038,-32751,1055,-32750,1072,-32749,1088,-32749,1105,-32748,1122,-32748,1139,-32747,1155,-32747,1172,-32746,1189,-32745,1206,-32745,1222,-32744,1239,-32743,1256,-32743,1273,-32742,1289,-32741,1306,-32741,1323,-32740,1339,-32739,1356,-32739,1373,-32738,1390,-32737,1406,-32737,1423,-32736,1440,-32735,1457,-32734,1473,-32734,1490,-32733,1507,-32732,1524,-32731,1540,-32730,1557,-32730,1574,-32729,1591,-32728,1607,-32727,1624,-32726,1641,-32726,1658,-32725,1674,-32724,1691,-32723,1708,-32722,1724,-32721,1741,-32720,1758,-32719,1775,-32718,1791,-32718,1808,-32717,1825,-32716,1842,-32715,1858,-32714,1875,-32713,1892,-32712,1908,-32711,1925,-32710,1942,-32709,1959,-32708,1975,-32707,1992,-32706,2009,-32705,2026,-32704,2042,-32703,2059,-32702,2076,-32701,2092,-32700,2109,-32698,2126,-32697,2143,-32696,2159,-32695,2176,-32694,2193,-32693,2209,-32692,2226,-32691,2243,-32689,2260,-32688,2276,-32687,2293,-32686,2310,-32685,2326,-32684,2343,-32682,2360,-32681,2377,-32680,2393,-32679,2410,-32677,2427,-32676,2443,-32675,2460,-32674,2477,-32672,2494,-32671,2510,-32670,2527,-32669,2544,-32667,2560,-32666,2577,-32665,2594,-32663,2610,-32662,2627,-32661,2644,-32659,2661,-32658,2677,-32657,2694,-32655,2711,-32654,2727,-32652,2744,-32651,2761,-32650,2777,-32648,2794,-32647,2811,-32645,2828,-32644,2844,-32642,2861,-32641,2878,-32639,2894,-32638,2911,-32636,2928,-32635,2944,-32633,2961,-32632,2978,-32630,2994,-32629,3011,-32627,3028,-32626,3044,-32624,3061,-32623,3078,-32621,3094,-32619,3111,-32618,3128,-32616,3145,-32615,3161,-32613,3178,-32611,3195,-32610,3211,-32608,3228,-32606,3245,-32605,3261,-32603,3278,-32601,3295,-32600,3311,-32598,3328,-32596,3345,-32595,3361,-32593,3378,-32591,3395,-32589,3411,-32588,3428,-32586,3445,-32584,3461,-32582,3478,-32581,3495,-32579,3511,-32577,3528,-32575,3545,-32573,3561,-32572,3578,-32570,3594,-32568,3611,-32566,3628,-32564,3644,-32562,3661,-32560,3678,-32559,3694,-32557,3711,-32555,3728,-32553,3744,-32551,3761,-32549,3778,-32547,3794,-32545,3811,-32543,3828,-32541,3844,-32539,3861,-32537,3877,-32535,3894,-32533,3911,-32531,3927,-32529,3944,-32527,3961,-32525,3977,-32523,3994,-32521,4011,-32519,4027,-32517,4044,-32515,4060,-32513,4077,-32511,4094,-32509,4110,-32507,4127,-32504,4144,-32502,4160,-32500,4177,-32498,4193,-32496,4210,-32494,4227,-32492,4243,-32489,4260,-32487,4276,-32485,4293,-32483,4310,-32481,4326,-32478,4343,-32476,4359,-32474,4376,-32472,4393,-32469,4409,-32467,4426,-32465,4443,-32463,4459,-32460,4476,-32458,4492,-32456,4509,-32453,4525,-32451,4542,-32449,4559,-32446,4575,-32444,4592,-32442,4608,-32439,4625,-32437,4642,-32435,4658,-32432,4675,-32430,4691,-32427,4708,-32425,4725,-32423,4741,-32420,4758,-32418,4774,-32415,4791,-32413,4807,-32410,4824,-32408,4841,-32405,4857,-32403,4874,-32400,4890,-32398,4907,-32395,4923,-32393,4940,-32390,4957,-32388,4973,-32385,4990,-32383,5006,-32380,5023,-32378,5039,-32375,5056,-32372,5072,-32370,5089,-32367,5106,-32365,5122,-32362,5139,-32359,5155,-32357,5172,-32354,5188,-32351,5205,-32349,5221,-32346,5238,-32343,5254,-32341,5271,-32338,5287,-32335,5304,-32333,5321,-32330,5337,-32327,5354,-32324,5370,-32322,5387,-32319,5403,-32316,5420,-32313,5436,-32311,5453,-32308,5469,-32305,5486,-32302,5502,-32299,5519,-32296,5535,-32294,5552,-32291,5568,-32288,5585,-32285,5601,-32282,5618,-32279,5634,-32276,5651,-32274,5667,-32271,5684,-32268,5700,-32265,5717,-32262,5733,-32259,5750,-32256,5766,-32253,5783,-32250,5799,-32247,5816,-32244,5832,-32241,5849,-32238,5865,-32235,5882,-32232,5898,-32229,5915,-32226,5931,-32223,5948,-32220,5964,-32217,5981,-32214,5997,-32211,6014,-32208,6030,-32205,6047,-32202,6063,-32198,6080,-32195,6096,-32192,6112,-32189,6129,-32186,6145,-32183,6162,-32180,6178,-32177,6195,-32173,6211,-32170,6228,-32167,6244,-32164,6261,-32161,6277,-32157,6293,-32154,6310,-32151,6326,-32148,6343,-32144,6359,-32141,6376,-32138,6392,-32135,6408,-32131,6425,-32128,6441,-32125,6458,-32121,6474,-32118,6491,-32115,6507,-32111,6523,-32108,6540,-32105,6556,-32101,6573,-32098,6589,-32095,6606,-32091,6622,-32088,6638,-32085,6655,-32081,6671,-32078,6688,-32074,6704,-32071,6720,-32067,6737,-32064,6753,-32060,6770,-32057,6786,-32054,6802,-32050,6819,-32047,6835,-32043,6851,-32040,6868,-32036,6884,-32033,6901,-32029,6917,-32025,6933,-32022,6950,-32018,6966,-32015,6982,-32011,6999,-32008,7015,-32004,7032,-32000,7048,-31997,7064,-31993,7081,-31990,7097,-31986,7113,-31982,7130,-31979,7146,-31975,7162,-31971,7179,-31968,7195,-31964,7211,-31960,7228,-31957,7244,-31953,7261,-31949,7277,-31945,7293,-31942,7310,-31938,7326,-31934,7342,-31930,7358,-31927,7375,-31923,7391,-31919,7407,-31915,7424,-31912,7440,-31908,7456,-31904,7473,-31900,7489,-31896,7505,-31892,7522,-31889,7538,-31885,7554,-31881,7571,-31877,7587,-31873,7603,-31869,7619,-31865,7636,-31861,7652,-31857,7668,-31854,7685,-31850,7701,-31846,7717,-31842,7733,-31838,7750,-31834,7766,-31830,7782,-31826,7799,-31822,7815,-31818,7831,-31814,7847,-31810,7864,-31806,7880,-31802,7896,-31798,7912,-31794,7929,-31790,7945,-31786,7961,-31781,7977,-31777,7994,-31773,8010,-31769,8026,-31765,8042,-31761,8059,-31757,8075,-31753,8091,-31749,8107,-31744,8124,-31740,8140,-31736,8156,-31732,8172,-31728,8189,-31724,8205,-31719,8221,-31715,8237,-31711,8253,-31707,8270,-31702,8286,-31698,8302,-31694,8318,-31690,8334,-31685,8351,-31681,8367,-31677,8383,-31673,8399,-31668,8415,-31664,8432,-31660,8448,-31655,8464,-31651,8480,-31647,8496,-31642,8513,-31638,8529,-31634,8545,-31629,8561,-31625,8577,-31620,8593,-31616,8610,-31612,8626,-31607,8642,-31603,8658,-31598,8674,-31594,8690,-31589,8707,-31585,8723,-31581,8739,-31576,8755,-31572,8771,-31567,8787,-31563,8803,-31558,8820,-31554,8836,-31549,8852,-31545,8868,-31540,8884,-31535,8900,-31531,8916,-31526,8932,-31522,8949,-31517,8965,-31513,8981,-31508,8997,-31503,9013,-31499,9029,-31494,9045,-31490,9061,-31485,9077,-31480,9094,-31476,9110,-31471,9126,-31466,9142,-31462,9158,-31457,9174,-31452,9190,-31447,9206,-31443,9222,-31438,9238,-31433,9254,-31429,9270,-31424,9287,-31419,9303,-31414,9319,-31410,9335,-31405,9351,-31400,9367,-31395,9383,-31390,9399,-31386,9415,-31381,9431,-31376,9447,-31371,9463,-31366,9479,-31361,9495,-31357,9511,-31352,9527,-31347,9543,-31342,9559,-31337,9575,-31332,9591,-31327,9607,-31322,9623,-31317,9639,-31312,9655,-31308,9671,-31303,9687,-31298,9703,-31293,9719,-31288,9735,-31283,9751,-31278,9767,-31273,9783,-31268,9799,-31263,9815,-31258,9831,-31253,9847,-31248,9863,-31243,9879,-31237,9895,-31232,9911,-31227,9927,-31222,9943,-31217,9959,-31212,9975,-31207,9991,-31202,10007,-31197,10023,-31192,10039,-31186,10055,-31181,10071,-31176,10087,-31171,10103,-31166,10119,-31161,10135,-31155,10151,-31150,10166,-31145,10182,-31140,10198,-31135,10214,-31129,10230,-31124,10246,-31119,10262,-31114,10278,-31108,10294,-31103,10310,-31098,10326,-31093,10342,-31087,10357,-31082,10373,-31077,10389,-31071,10405,-31066,10421,-31061,10437,-31055,10453,-31050,10469,-31045,10484,-31039,10500,-31034,10516,-31029,10532,-31023,10548,-31018,10564,-31012,10580,-31007,10596,-31002,10611,-30996,10627,-30991,10643,-30985,10659,-30980,10675,-30974,10691,-30969,10706,-30963,10722,-30958,10738,-30952,10754,-30947,10770,-30941,10786,-30936,10801,-30930,10817,-30925,10833,-30919,10849,-30914,10865,-30908,10880,-30903,10896,-30897,10912,-30891,10928,-30886,10944,-30880,10959,-30875,10975,-30869,10991,-30863,11007,-30858,11023,-30852,11038,-30846,11054,-30841,11070,-30835,11086,-30829,11101,-30824,11117,-30818,11133,-30812,11149,-30807,11164,-30801,11180,-30795,11196,-30789,11212,-30784,11227,-30778,11243,-30772,11259,-30767,11275,-30761,11290,-30755,11306,-30749,11322,-30743,11338,-30738,11353,-30732,11369,-30726,11385,-30720,11400,-30714,11416,-30708,11432,-30703,11448,-30697,11463,-30691,11479,-30685,11495,-30679,11510,-30673,11526,-30667,11542,-30661,11557,-30656,11573,-30650,11589,-30644,11604,-30638,11620,-30632,11636,-30626,11651,-30620,11667,-30614,11683,-30608,11698,-30602,11714,-30596,11730,-30590,11745,-30584,11761,-30578,11777,-30572,11792,-30566,11808,-30560,11823,-30554,11839,-30548,11855,-30542,11870,-30536,11886,-30529,11902,-30523,11917,-30517,11933,-30511,11948,-30505,11964,-30499,11980,-30493,11995,-30487,12011,-30481,12026,-30474,12042,-30468,12057,-30462,12073,-30456,12089,-30450,12104,-30443,12120,-30437,12135,-30431,12151,-30425,12166,-30419,12182,-30412,12198,-30406,12213,-30400,12229,-30394,12244,-30387,12260,-30381,12275,-30375,12291,-30369,12306,-30362,12322,-30356,12337,-30350,12353,-30343,12368,-30337,12384,-30331,12399,-30324,12415,-30318,12430,-30312,12446,-30305,12461,-30299,12477,-30292,12492,-30286,12508,-30280,12523,-30273,12539,-30267,12554,-30260,12570,-30254,12585,-30248,12601,-30241,12616,-30235,12632,-30228,12647,-30222,12663,-30215,12678,-30209,12694,-30202,12709,-30196,12724,-30189,12740,-30183,12755,-30176,12771,-30170,12786,-30163,12802,-30157,12817,-30150,12832,-30143,12848,-30137,12863,-30130,12879,-30124,12894,-30117,12909,-30110,12925,-30104,12940,-30097,12956,-30091,12971,-30084,12986,-30077,13002,-30071,13017,-30064,13033,-30057,13048,-30051,13063,-30044,13079,-30037,13094,-30031,13109,-30024,13125,-30017,13140,-30010,13155,-30004,13171,-29997,13186,-29990,13201,-29984,13217,-29977,13232,-29970,13247,-29963,13263,-29956,13278,-29950,13293,-29943,13309,-29936,13324,-29929,13339,-29922,13355,-29916,13370,-29909,13385,-29902,13400,-29895,13416,-29888,13431,-29881,13446,-29874,13462,-29867,13477,-29861,13492,-29854,13507,-29847,13523,-29840,13538,-29833,13553,-29826,13568,-29819,13584,-29812,13599,-29805,13614,-29798,13629,-29791,13645,-29784,13660,-29777,13675,-29770,13690,-29763,13706,-29756,13721,-29749,13736,-29742,13751,-29735,13766,-29728,13782,-29721,13797,-29714,13812,-29707,13827,-29700,13842,-29693,13858,-29686,13873,-29679,13888,-29671,13903,-29664,13918,-29657,13933,-29650,13949,-29643,13964,-29636,13979,-29629,13994,-29622,14009,-29614,14024,-29607,14039,-29600,14055,-29593,14070,-29586,14085,-29578,14100,-29571,14115,-29564,14130,-29557,14145,-29549,14160,-29542,14176,-29535,14191,-29528,14206,-29520,14221,-29513,14236,-29506,14251,-29499,14266,-29491,14281,-29484,14296,-29477,14311,-29469,14326,-29462,14342,-29455,14357,-29447,14372,-29440,14387,-29433,14402,-29425,14417,-29418,14432,-29411,14447,-29403,14462,-29396,14477,-29388,14492,-29381,14507,-29373,14522,-29366,14537,-29359,14552,-29351,14567,-29344,14582,-29336,14597,-29329,14612,-29321,14627,-29314,14642,-29306,14657,-29299,14672,-29291,14687,-29284,14702,-29276,14717,-29269,14732,-29261,14747,-29254,14762,-29246,14777,-29239,14792,-29231,14807,-29223,14822,-29216,14837,-29208,14852,-29201,14866,-29193,14881,-29185,14896,-29178,14911,-29170,14926,-29163,14941,-29155,14956,-29147,14971,-29140,14986,-29132,15001,-29124,15016,-29117,15030,-29109,15045,-29101,15060,-29093,15075,-29086,15090,-29078,15105,-29070,15120,-29063,15135,-29055,15149,-29047,15164,-29039,15179,-29032,15194,-29024,15209,-29016,15224,-29008,15238,-29000,15253,-28993,15268,-28985,15283,-28977,15298,-28969,15313,-28961,15327,-28954,15342,-28946,15357,-28938,15372,-28930,15387,-28922,15401,-28914,15416,-28906,15431,-28898,15446,-28891,15461,-28883,15475,-28875,15490,-28867,15505,-28859,15520,-28851,15534,-28843,15549,-28835,15564,-28827,15579,-28819,15593,-28811,15608,-28803,15623,-28795,15638,-28787,15652,-28779,15667,-28771,15682,-28763,15696,-28755,15711,-28747,15726,-28739,15740,-28731,15755,-28723,15770,-28715,15785,-28707,15799,-28699,15814,-28691,15829,-28682,15843,-28674,15858,-28666,15873,-28658,15887,-28650,15902,-28642,15917,-28634,15931,-28626,15946,-28617,15960,-28609,15975,-28601,15990,-28593,16004,-28585,16019,-28576,16034,-28568,16048,-28560,16063,-28552,16077,-28544,16092,-28535,16107,-28527,16121,-28519,16136,-28511,16150,-28502,16165,-28494,16179,-28486,16194,-28478,16209,-28469,16223,-28461,16238,-28453,16252,-28444,16267,-28436,16281,-28428,16296,-28419,16310,-28411,16325,-28403,16339,-28394,16354,-28386,16368,-28378,16383,-28369,16398,-28361,16412,-28352,16427,-28344,16441,-28336,16455,-28327,16470,-28319,16484,-28310,16499,-28302,16513,-28293,16528,-28285,16542,-28276,16557,-28268,16571,-28260,16586,-28251,16600,-28243,16615,-28234,16629,-28226,16643,-28217,16658,-28209,16672,-28200,16687,-28191,16701,-28183,16716,-28174,16730,-28166,16744,-28157,16759,-28149,16773,-28140,16788,-28132,16802,-28123,16816,-28114,16831,-28106,16845,-28097,16859,-28088,16874,-28080,16888,-28071,16903,-28063,16917,-28054,16931,-28045,16946,-28037,16960,-28028,16974,-28019,16989,-28010,17003,-28002,17017,-27993,17032,-27984,17046,-27976,17060,-27967,17074,-27958,17089,-27949,17103,-27941,17117,-27932,17132,-27923,17146,-27914,17160,-27906,17174,-27897,17189,-27888,17203,-27879,17217,-27870,17232,-27862,17246,-27853,17260,-27844,17274,-27835,17288,-27826,17303,-27817,17317,-27809,17331,-27800,17345,-27791,17360,-27782,17374,-27773,17388,-27764,17402,-27755,17416,-27746,17431,-27737,17445,-27729,17459,-27720,17473,-27711,17487,-27702,17501,-27693,17516,-27684,17530,-27675,17544,-27666,17558,-27657,17572,-27648,17586,-27639,17600,-27630,17615,-27621,17629,-27612,17643,-27603,17657,-27594,17671,-27585,17685,-27576,17699,-27567,17713,-27558,17727,-27549,17742,-27539,17756,-27530,17770,-27521,17784,-27512,17798,-27503,17812,-27494,17826,-27485,17840,-27476,17854,-27467,17868,-27457,17882,-27448,17896,-27439,17910,-27430,17924,-27421,17938,-27412,17952,-27402,17966,-27393,17980,-27384,17994,-27375,18008,-27366,18022,-27356,18036,-27347,18050,-27338,18064,-27329,18078,-27320,18092,-27310,18106,-27301,18120,-27292,18134,-27282,18148,-27273,18162,-27264,18176,-27255,18190,-27245,18204,-27236,18218,-27227,18232,-27217,18246,-27208,18260,-27199,18273,-27189,18287,-27180,18301,-27171,18315,-27161,18329,-27152,18343,-27142,18357,-27133,18371,-27124,18385,-27114,18398,-27105,18412,-27095,18426,-27086,18440,-27077,18454,-27067,18468,-27058,18482,-27048,18495,-27039,18509,-27029,18523,-27020,18537,-27010,18551,-27001,18564,-26991,18578,-26982,18592,-26972,18606,-26963,18620,-26953,18633,-26944,18647,-26934,18661,-26925,18675,-26915,18689,-26906,18702,-26896,18716,-26886,18730,-26877,18744,-26867,18757,-26858,18771,-26848,18785,-26838,18798,-26829,18812,-26819,18826,-26810,18840,-26800,18853,-26790,18867,-26781,18881,-26771,18894,-26761,18908,-26752,18922,-26742,18935,-26732,18949,-26723,18963,-26713,18976,-26703,18990,-26693,19004,-26684,19017,-26674,19031,-26664,19045,-26655,19058,-26645,19072,-26635,19086,-26625,19099,-26616,19113,-26606,19126,-26596,19140,-26586,19154,-26576,19167,-26567,19181,-26557,19194,-26547,19208,-26537,19221,-26527,19235,-26517,19249,-26508,19262,-26498,19276,-26488,19289,-26478,19303,-26468,19316,-26458,19330,-26448,19343,-26438,19357,-26429,19370,-26419,19384,-26409,19397,-26399,19411,-26389,19424,-26379,19438,-26369,19451,-26359,19465,-26349,19478,-26339,19492,-26329,19505,-26319,19519,-26309,19532,-26299,19546,-26289,19559,-26279,19573,-26269,19586,-26259,19599,-26249,19613,-26239,19626,-26229,19640,-26219,19653,-26209,19667,-26199,19680,-26189,19693,-26179,19707,-26169,19720,-26159,19733,-26149,19747,-26138,19760,-26128,19774,-26118,19787,-26108,19800,-26098,19814,-26088,19827,-26078,19840,-26068,19854,-26057,19867,-26047,19880,-26037,19894,-26027,19907,-26017,19920,-26007,19933,-25996,19947,-25986,19960,-25976,19973,-25966,19987,-25955,20000,-25945,20013,-25935,20026,-25925,20040,-25914,20053,-25904,20066,-25894,20079,-25884,20093,-25873,20106,-25863,20119,-25853,20132,-25843,20146,-25832,20159,-25822,20172,-25812,20185,-25801,20198,-25791,20212,-25781,20225,-25770,20238,-25760,20251,-25750,20264,-25739,20277,-25729,20291,-25718,20304,-25708,20317,-25698,20330,-25687,20343,-25677,20356,-25666,20369,-25656,20383,-25646,20396,-25635,20409,-25625,20422,-25614,20435,-25604,20448,-25593,20461,-25583,20474,-25572,20487,-25562,20500,-25551,20513,-25541,20527,-25530,20540,-25520,20553,-25509,20566,-25499,20579,-25488,20592,-25478,20605,-25467,20618,-25457,20631,-25446,20644,-25436,20657,-25425,20670,-25415,20683,-25404,20696,-25393,20709,-25383,20722,-25372,20735,-25362,20748,-25351,20761,-25340,20774,-25330,20787,-25319,20800,-25308,20813,-25298,20825,-25287,20838,-25277,20851,-25266,20864,-25255,20877,-25244,20890,-25234,20903,-25223,20916,-25212,20929,-25202,20942,-25191,20955,-25180,20967,-25170,20980,-25159,20993,-25148,21006,-25137,21019,-25127,21032,-25116,21045,-25105,21057,-25094,21070,-25084,21083,-25073,21096,-25062,21109,-25051,21122,-25040,21134,-25030,21147,-25019,21160,-25008,21173,-24997,21186,-24986,21198,-24975,21211,-24965,21224,-24954,21237,-24943,21249,-24932,21262,-24921,21275,-24910,21288,-24899,21300,-24888,21313,-24878,21326,-24867,21339,-24856,21351,-24845,21364,-24834,21377,-24823,21389,-24812,21402,-24801,21415,-24790,21427,-24779,21440,-24768,21453,-24757,21465,-24746,21478,-24735,21491,-24724,21503,-24713,21516,-24702,21529,-24691,21541,-24680,21554,-24669,21566,-24658,21579,-24647,21592,-24636,21604,-24625,21617,-24614,21629,-24603,21642,-24592,21655,-24581,21667,-24570,21680,-24559,21692,-24547,21705,-24536,21717,-24525,21730,-24514,21743,-24503,21755,-24492,21768,-24481,21780,-24470,21793,-24458,21805,-24447,21818,-24436,21830,-24425,21843,-24414,21855,-24403,21868,-24391,21880,-24380,21893,-24369,21905,-24358,21917,-24347,21930,-24335,21942,-24324,21955,-24313,21967,-24302,21980,-24290,21992,-24279,22004,-24268,22017,-24257,22029,-24245,22042,-24234,22054,-24223,22066,-24212,22079,-24200,22091,-24189,22104,-24178,22116,-24166,22128,-24155,22141,-24144,22153,-24132,22165,-24121,22178,-24110,22190,-24098,22202,-24087,22215,-24076,22227,-24064,22239,-24053,22252,-24042,22264,-24030,22276,-24019,22288,-24007,22301,-23996,22313,-23985,22325,-23973,22338,-23962,22350,-23950,22362,-23939,22374,-23927,22387,-23916,22399,-23904,22411,-23893,22423,-23882,22435,-23870,22448,-23859,22460,-23847,22472,-23836,22484,-23824,22496,-23813,22509,-23801,22521,-23790,22533,-23778,22545,-23767,22557,-23755,22569,-23743,22582,-23732,22594,-23720,22606,-23709,22618,-23697,22630,-23686,22642,-23674,22654,-23662,22666,-23651,22678,-23639,22691,-23628,22703,-23616,22715,-23604,22727,-23593,22739,-23581,22751,-23570,22763,-23558,22775,-23546,22787,-23535,22799,-23523,22811,-23511,22823,-23500,22835,-23488,22847,-23476,22859,-23465,22871,-23453,22883,-23441,22895,-23429,22907,-23418,22919,-23406,22931,-23394,22943,-23383,22955,-23371,22967,-23359,22979,-23347,22991,-23336,23003,-23324,23015,-23312,23027,-23300,23039,-23288,23050,-23277,23062,-23265,23074,-23253,23086,-23241,23098,-23229,23110,-23218,23122,-23206,23134,-23194,23146,-23182,23157,-23170,23169,-23158,23181,-23147,23193,-23135,23205,-23123,23217,-23111,23228,-23099,23240,-23087,23252,-23075,23264,-23063,23276,-23051,23287,-23040,23299,-23028,23311,-23016,23323,-23004,23335,-22992,23346,-22980,23358,-22968,23370,-22956,23382,-22944,23393,-22932,23405,-22920,23417,-22908,23428,-22896,23440,-22884,23452,-22872,23464,-22860,23475,-22848,23487,-22836,23499,-22824,23510,-22812,23522,-22800,23534,-22788,23545,-22776,23557,-22764,23569,-22752,23580,-22740,23592,-22728,23603,-22716,23615,-22704,23627,-22692,23638,-22679,23650,-22667,23661,-22655,23673,-22643,23685,-22631,23696,-22619,23708,-22607,23719,-22595,23731,-22583,23742,-22570,23754,-22558,23766,-22546,23777,-22534,23789,-22522,23800,-22510,23812,-22497,23823,-22485,23835,-22473,23846,-22461,23858,-22449,23869,-22436,23881,-22424,23892,-22412,23903,-22400,23915,-22388,23926,-22375,23938,-22363,23949,-22351,23961,-22339,23972,-22326,23984,-22314,23995,-22302,24006,-22289,24018,-22277,24029,-22265,24041,-22253,24052,-22240,24063,-22228,24075,-22216,24086,-22203,24097,-22191,24109,-22179,24120,-22166,24131,-22154,24143,-22142,24154,-22129,24165,-22117,24177,-22105,24188,-22092,24199,-22080,24211,-22067,24222,-22055,24233,-22043,24244,-22030,24256,-22018,24267,-22005,24278,-21993,24289,-21981,24301,-21968,24312,-21956,24323,-21943,24334,-21931,24346,-21918,24357,-21906,24368,-21894,24379,-21881,24390,-21869,24402,-21856,24413,-21844,24424,-21831,24435,-21819,24446,-21806,24457,-21794,24469,-21781,24480,-21769,24491,-21756,24502,-21744,24513,-21731,24524,-21718,24535,-21706,24546,-21693,24558,-21681,24569,-21668,24580,-21656,24591,-21643,24602,-21630,24613,-21618,24624,-21605,24635,-21593,24646,-21580,24657,-21567,24668,-21555,24679,-21542,24690,-21530,24701,-21517,24712,-21504,24723,-21492,24734,-21479,24745,-21466,24756,-21454,24767,-21441,24778,-21428,24789,-21416,24800,-21403,24811,-21390,24822,-21378,24833,-21365,24844,-21352,24855,-21340,24866,-21327,24877,-21314,24887,-21301,24898,-21289,24909,-21276,24920,-21263,24931,-21250,24942,-21238,24953,-21225,24964,-21212,24974,-21199,24985,-21187,24996,-21174,25007,-21161,25018,-21148,25029,-21135,25039,-21123,25050,-21110,25061,-21097,25072,-21084,25083,-21071,25093,-21058,25104,-21046,25115,-21033,25126,-21020,25136,-21007,25147,-20994,25158,-20981,25169,-20968,25179,-20956,25190,-20943,25201,-20930,25211,-20917,25222,-20904,25233,-20891,25243,-20878,25254,-20865,25265,-20852,25276,-20839,25286,-20826,25297,-20814,25307,-20801,25318,-20788,25329,-20775,25339,-20762,25350,-20749,25361,-20736,25371,-20723,25382,-20710,25392,-20697,25403,-20684,25414,-20671,25424,-20658,25435,-20645,25445,-20632,25456,-20619,25466,-20606,25477,-20593,25487,-20580,25498,-20567,25508,-20554,25519,-20541,25529,-20528,25540,-20514,25550,-20501,25561,-20488,25571,-20475,25582,-20462,25592,-20449,25603,-20436,25613,-20423,25624,-20410,25634,-20397,25645,-20384,25655,-20370,25665,-20357,25676,-20344,25686,-20331,25697,-20318,25707,-20305,25717,-20292,25728,-20278,25738,-20265,25749,-20252,25759,-20239,25769,-20226,25780,-20213,25790,-20199,25800,-20186,25811,-20173,25821,-20160,25831,-20147,25842,-20133,25852,-20120,25862,-20107,25872,-20094,25883,-20080,25893,-20067,25903,-20054,25913,-20041,25924,-20027,25934,-20014,25944,-20001,25954,-19988,25965,-19974,25975,-19961,25985,-19948,25995,-19934,26006,-19921,26016,-19908,26026,-19895,26036,-19881,26046,-19868,26056,-19855,26067,-19841,26077,-19828,26087,-19815,26097,-19801,26107,-19788,26117,-19775,26127,-19761,26137,-19748,26148,-19734,26158,-19721,26168,-19708,26178,-19694,26188,-19681,26198,-19668,26208,-19654,26218,-19641,26228,-19627,26238,-19614,26248,-19600,26258,-19587,26268,-19574,26278,-19560,26288,-19547,26298,-19533,26308,-19520,26318,-19506,26328,-19493,26338,-19479,26348,-19466,26358,-19452,26368,-19439,26378,-19425,26388,-19412,26398,-19398,26408,-19385,26418,-19371,26428,-19358,26437,-19344,26447,-19331,26457,-19317,26467,-19304,26477,-19290,26487,-19277,26497,-19263,26507,-19250,26516,-19236,26526,-19222,26536,-19209,26546,-19195,26556,-19182,26566,-19168,26575,-19155,26585,-19141,26595,-19127,26605,-19114,26615,-19100,26624,-19087,26634,-19073,26644,-19059,26654,-19046,26663,-19032,26673,-19018,26683,-19005,26692,-18991,26702,-18977,26712,-18964,26722,-18950,26731,-18936,26741,-18923,26751,-18909,26760,-18895,26770,-18882,26780,-18868,26789,-18854,26799,-18841,26809,-18827,26818,-18813,26828,-18799,26837,-18786,26847,-18772,26857,-18758,26866,-18745,26876,-18731,26885,-18717,26895,-18703,26905,-18690,26914,-18676,26924,-18662,26933,-18648,26943,-18634,26952,-18621,26962,-18607,26971,-18593,26981,-18579,26990,-18565,27000,-18552,27009,-18538,27019,-18524,27028,-18510,27038,-18496,27047,-18483,27057,-18469,27066,-18455,27076,-18441,27085,-18427,27094,-18413,27104,-18399,27113,-18386,27123,-18372,27132,-18358,27141,-18344,27151,-18330,27160,-18316,27170,-18302,27179,-18288,27188,-18274,27198,-18261,27207,-18247,27216,-18233,27226,-18219,27235,-18205,27244,-18191,27254,-18177,27263,-18163,27272,-18149,27281,-18135,27291,-18121,27300,-18107,27309,-18093,27319,-18079,27328,-18065,27337,-18051,27346,-18037,27355,-18023,27365,-18009,27374,-17995,27383,-17981,27392,-17967,27401,-17953,27411,-17939,27420,-17925,27429,-17911,27438,-17897,27447,-17883,27456,-17869,27466,-17855,27475,-17841,27484,-17827,27493,-17813,27502,-17799,27511,-17785,27520,-17771,27529,-17757,27538,-17743,27548,-17728,27557,-17714,27566,-17700,27575,-17686,27584,-17672,27593,-17658,27602,-17644,27611,-17630,27620,-17616,27629,-17601,27638,-17587,27647,-17573,27656,-17559,27665,-17545,27674,-17531,27683,-17517,27692,-17502,27701,-17488,27710,-17474,27719,-17460,27728,-17446,27736,-17432,27745,-17417,27754,-17403,27763,-17389,27772,-17375,27781,-17361,27790,-17346,27799,-17332,27808,-17318,27816,-17304,27825,-17289,27834,-17275,27843,-17261,27852,-17247,27861,-17233,27869,-17218,27878,-17204,27887,-17190,27896,-17175,27905,-17161,27913,-17147,27922,-17133,27931,-17118,27940,-17104,27948,-17090,27957,-17075,27966,-17061,27975,-17047,27983,-17033,27992,-17018,28001,-17004,28009,-16990,28018,-16975,28027,-16961,28036,-16947,28044,-16932,28053,-16918,28062,-16904,28070,-16889,28079,-16875,28087,-16860,28096,-16846,28105,-16832,28113,-16817,28122,-16803,28131,-16789,28139,-16774,28148,-16760,28156,-16745,28165,-16731,28173,-16717,28182,-16702,28190,-16688,28199,-16673,28208,-16659,28216,-16644,28225,-16630,28233,-16616,28242,-16601,28250,-16587,28259,-16572,28267,-16558,28275,-16543,28284,-16529,28292,-16514,28301,-16500,28309,-16485,28318,-16471,28326,-16456,28335,-16442,28343,-16428,28351,-16413,28360,-16399,28368}; +int16_t twb24576[16384] __attribute__((aligned(32))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386,-16384,-28378,-16399,-28369,-16413,-28361,-16428,-28352,-16442,-28344,-16456,-28336,-16471,-28327,-16485,-28319,-16500,-28310,-16514,-28302,-16529,-28293,-16543,-28285,-16558,-28276,-16572,-28268,-16587,-28260,-16601,-28251,-16616,-28243,-16630,-28234,-16644,-28226,-16659,-28217,-16673,-28209,-16688,-28200,-16702,-28191,-16717,-28183,-16731,-28174,-16745,-28166,-16760,-28157,-16774,-28149,-16789,-28140,-16803,-28132,-16817,-28123,-16832,-28114,-16846,-28106,-16860,-28097,-16875,-28088,-16889,-28080,-16904,-28071,-16918,-28063,-16932,-28054,-16947,-28045,-16961,-28037,-16975,-28028,-16990,-28019,-17004,-28010,-17018,-28002,-17033,-27993,-17047,-27984,-17061,-27976,-17075,-27967,-17090,-27958,-17104,-27949,-17118,-27941,-17133,-27932,-17147,-27923,-17161,-27914,-17175,-27906,-17190,-27897,-17204,-27888,-17218,-27879,-17233,-27870,-17247,-27862,-17261,-27853,-17275,-27844,-17289,-27835,-17304,-27826,-17318,-27817,-17332,-27809,-17346,-27800,-17361,-27791,-17375,-27782,-17389,-27773,-17403,-27764,-17417,-27755,-17432,-27746,-17446,-27737,-17460,-27729,-17474,-27720,-17488,-27711,-17502,-27702,-17517,-27693,-17531,-27684,-17545,-27675,-17559,-27666,-17573,-27657,-17587,-27648,-17601,-27639,-17616,-27630,-17630,-27621,-17644,-27612,-17658,-27603,-17672,-27594,-17686,-27585,-17700,-27576,-17714,-27567,-17728,-27558,-17743,-27549,-17757,-27539,-17771,-27530,-17785,-27521,-17799,-27512,-17813,-27503,-17827,-27494,-17841,-27485,-17855,-27476,-17869,-27467,-17883,-27457,-17897,-27448,-17911,-27439,-17925,-27430,-17939,-27421,-17953,-27412,-17967,-27402,-17981,-27393,-17995,-27384,-18009,-27375,-18023,-27366,-18037,-27356,-18051,-27347,-18065,-27338,-18079,-27329,-18093,-27320,-18107,-27310,-18121,-27301,-18135,-27292,-18149,-27282,-18163,-27273,-18177,-27264,-18191,-27255,-18205,-27245,-18219,-27236,-18233,-27227,-18247,-27217,-18261,-27208,-18274,-27199,-18288,-27189,-18302,-27180,-18316,-27171,-18330,-27161,-18344,-27152,-18358,-27142,-18372,-27133,-18386,-27124,-18399,-27114,-18413,-27105,-18427,-27095,-18441,-27086,-18455,-27077,-18469,-27067,-18483,-27058,-18496,-27048,-18510,-27039,-18524,-27029,-18538,-27020,-18552,-27010,-18565,-27001,-18579,-26991,-18593,-26982,-18607,-26972,-18621,-26963,-18634,-26953,-18648,-26944,-18662,-26934,-18676,-26925,-18690,-26915,-18703,-26906,-18717,-26896,-18731,-26886,-18745,-26877,-18758,-26867,-18772,-26858,-18786,-26848,-18799,-26838,-18813,-26829,-18827,-26819,-18841,-26810,-18854,-26800,-18868,-26790,-18882,-26781,-18895,-26771,-18909,-26761,-18923,-26752,-18936,-26742,-18950,-26732,-18964,-26723,-18977,-26713,-18991,-26703,-19005,-26693,-19018,-26684,-19032,-26674,-19046,-26664,-19059,-26655,-19073,-26645,-19087,-26635,-19100,-26625,-19114,-26616,-19127,-26606,-19141,-26596,-19155,-26586,-19168,-26576,-19182,-26567,-19195,-26557,-19209,-26547,-19222,-26537,-19236,-26527,-19250,-26517,-19263,-26508,-19277,-26498,-19290,-26488,-19304,-26478,-19317,-26468,-19331,-26458,-19344,-26448,-19358,-26438,-19371,-26429,-19385,-26419,-19398,-26409,-19412,-26399,-19425,-26389,-19439,-26379,-19452,-26369,-19466,-26359,-19479,-26349,-19493,-26339,-19506,-26329,-19520,-26319,-19533,-26309,-19547,-26299,-19560,-26289,-19574,-26279,-19587,-26269,-19600,-26259,-19614,-26249,-19627,-26239,-19641,-26229,-19654,-26219,-19668,-26209,-19681,-26199,-19694,-26189,-19708,-26179,-19721,-26169,-19734,-26159,-19748,-26149,-19761,-26138,-19775,-26128,-19788,-26118,-19801,-26108,-19815,-26098,-19828,-26088,-19841,-26078,-19855,-26068,-19868,-26057,-19881,-26047,-19895,-26037,-19908,-26027,-19921,-26017,-19934,-26007,-19948,-25996,-19961,-25986,-19974,-25976,-19988,-25966,-20001,-25955,-20014,-25945,-20027,-25935,-20041,-25925,-20054,-25914,-20067,-25904,-20080,-25894,-20094,-25884,-20107,-25873,-20120,-25863,-20133,-25853,-20147,-25843,-20160,-25832,-20173,-25822,-20186,-25812,-20199,-25801,-20213,-25791,-20226,-25781,-20239,-25770,-20252,-25760,-20265,-25750,-20278,-25739,-20292,-25729,-20305,-25718,-20318,-25708,-20331,-25698,-20344,-25687,-20357,-25677,-20370,-25666,-20384,-25656,-20397,-25646,-20410,-25635,-20423,-25625,-20436,-25614,-20449,-25604,-20462,-25593,-20475,-25583,-20488,-25572,-20501,-25562,-20514,-25551,-20528,-25541,-20541,-25530,-20554,-25520,-20567,-25509,-20580,-25499,-20593,-25488,-20606,-25478,-20619,-25467,-20632,-25457,-20645,-25446,-20658,-25436,-20671,-25425,-20684,-25415,-20697,-25404,-20710,-25393,-20723,-25383,-20736,-25372,-20749,-25362,-20762,-25351,-20775,-25340,-20788,-25330,-20801,-25319,-20814,-25308,-20826,-25298,-20839,-25287,-20852,-25277,-20865,-25266,-20878,-25255,-20891,-25244,-20904,-25234,-20917,-25223,-20930,-25212,-20943,-25202,-20956,-25191,-20968,-25180,-20981,-25170,-20994,-25159,-21007,-25148,-21020,-25137,-21033,-25127,-21046,-25116,-21058,-25105,-21071,-25094,-21084,-25084,-21097,-25073,-21110,-25062,-21123,-25051,-21135,-25040,-21148,-25030,-21161,-25019,-21174,-25008,-21187,-24997,-21199,-24986,-21212,-24975,-21225,-24965,-21238,-24954,-21250,-24943,-21263,-24932,-21276,-24921,-21289,-24910,-21301,-24899,-21314,-24888,-21327,-24878,-21340,-24867,-21352,-24856,-21365,-24845,-21378,-24834,-21390,-24823,-21403,-24812,-21416,-24801,-21428,-24790,-21441,-24779,-21454,-24768,-21466,-24757,-21479,-24746,-21492,-24735,-21504,-24724,-21517,-24713,-21530,-24702,-21542,-24691,-21555,-24680,-21567,-24669,-21580,-24658,-21593,-24647,-21605,-24636,-21618,-24625,-21630,-24614,-21643,-24603,-21656,-24592,-21668,-24581,-21681,-24570,-21693,-24559,-21706,-24547,-21718,-24536,-21731,-24525,-21744,-24514,-21756,-24503,-21769,-24492,-21781,-24481,-21794,-24470,-21806,-24458,-21819,-24447,-21831,-24436,-21844,-24425,-21856,-24414,-21869,-24403,-21881,-24391,-21894,-24380,-21906,-24369,-21918,-24358,-21931,-24347,-21943,-24335,-21956,-24324,-21968,-24313,-21981,-24302,-21993,-24290,-22005,-24279,-22018,-24268,-22030,-24257,-22043,-24245,-22055,-24234,-22067,-24223,-22080,-24212,-22092,-24200,-22105,-24189,-22117,-24178,-22129,-24166,-22142,-24155,-22154,-24144,-22166,-24132,-22179,-24121,-22191,-24110,-22203,-24098,-22216,-24087,-22228,-24076,-22240,-24064,-22253,-24053,-22265,-24042,-22277,-24030,-22289,-24019,-22302,-24007,-22314,-23996,-22326,-23985,-22339,-23973,-22351,-23962,-22363,-23950,-22375,-23939,-22388,-23927,-22400,-23916,-22412,-23904,-22424,-23893,-22436,-23882,-22449,-23870,-22461,-23859,-22473,-23847,-22485,-23836,-22497,-23824,-22510,-23813,-22522,-23801,-22534,-23790,-22546,-23778,-22558,-23767,-22570,-23755,-22583,-23743,-22595,-23732,-22607,-23720,-22619,-23709,-22631,-23697,-22643,-23686,-22655,-23674,-22667,-23662,-22679,-23651,-22692,-23639,-22704,-23628,-22716,-23616,-22728,-23604,-22740,-23593,-22752,-23581,-22764,-23570,-22776,-23558,-22788,-23546,-22800,-23535,-22812,-23523,-22824,-23511,-22836,-23500,-22848,-23488,-22860,-23476,-22872,-23465,-22884,-23453,-22896,-23441,-22908,-23429,-22920,-23418,-22932,-23406,-22944,-23394,-22956,-23383,-22968,-23371,-22980,-23359,-22992,-23347,-23004,-23336,-23016,-23324,-23028,-23312,-23040,-23300,-23051,-23288,-23063,-23277,-23075,-23265,-23087,-23253,-23099,-23241,-23111,-23229,-23123,-23218,-23135,-23206,-23147,-23194,-23158,-23182,-23170,-23170,-23182,-23158,-23194,-23147,-23206,-23135,-23218,-23123,-23229,-23111,-23241,-23099,-23253,-23087,-23265,-23075,-23277,-23063,-23288,-23051,-23300,-23040,-23312,-23028,-23324,-23016,-23336,-23004,-23347,-22992,-23359,-22980,-23371,-22968,-23383,-22956,-23394,-22944,-23406,-22932,-23418,-22920,-23429,-22908,-23441,-22896,-23453,-22884,-23465,-22872,-23476,-22860,-23488,-22848,-23500,-22836,-23511,-22824,-23523,-22812,-23535,-22800,-23546,-22788,-23558,-22776,-23570,-22764,-23581,-22752,-23593,-22740,-23604,-22728,-23616,-22716,-23628,-22704,-23639,-22692,-23651,-22679,-23662,-22667,-23674,-22655,-23686,-22643,-23697,-22631,-23709,-22619,-23720,-22607,-23732,-22595,-23743,-22583,-23755,-22570,-23767,-22558,-23778,-22546,-23790,-22534,-23801,-22522,-23813,-22510,-23824,-22497,-23836,-22485,-23847,-22473,-23859,-22461,-23870,-22449,-23882,-22436,-23893,-22424,-23904,-22412,-23916,-22400,-23927,-22388,-23939,-22375,-23950,-22363,-23962,-22351,-23973,-22339,-23985,-22326,-23996,-22314,-24007,-22302,-24019,-22289,-24030,-22277,-24042,-22265,-24053,-22253,-24064,-22240,-24076,-22228,-24087,-22216,-24098,-22203,-24110,-22191,-24121,-22179,-24132,-22166,-24144,-22154,-24155,-22142,-24166,-22129,-24178,-22117,-24189,-22105,-24200,-22092,-24212,-22080,-24223,-22067,-24234,-22055,-24245,-22043,-24257,-22030,-24268,-22018,-24279,-22005,-24290,-21993,-24302,-21981,-24313,-21968,-24324,-21956,-24335,-21943,-24347,-21931,-24358,-21918,-24369,-21906,-24380,-21894,-24391,-21881,-24403,-21869,-24414,-21856,-24425,-21844,-24436,-21831,-24447,-21819,-24458,-21806,-24470,-21794,-24481,-21781,-24492,-21769,-24503,-21756,-24514,-21744,-24525,-21731,-24536,-21718,-24547,-21706,-24559,-21693,-24570,-21681,-24581,-21668,-24592,-21656,-24603,-21643,-24614,-21630,-24625,-21618,-24636,-21605,-24647,-21593,-24658,-21580,-24669,-21567,-24680,-21555,-24691,-21542,-24702,-21530,-24713,-21517,-24724,-21504,-24735,-21492,-24746,-21479,-24757,-21466,-24768,-21454,-24779,-21441,-24790,-21428,-24801,-21416,-24812,-21403,-24823,-21390,-24834,-21378,-24845,-21365,-24856,-21352,-24867,-21340,-24878,-21327,-24888,-21314,-24899,-21301,-24910,-21289,-24921,-21276,-24932,-21263,-24943,-21250,-24954,-21238,-24965,-21225,-24975,-21212,-24986,-21199,-24997,-21187,-25008,-21174,-25019,-21161,-25030,-21148,-25040,-21135,-25051,-21123,-25062,-21110,-25073,-21097,-25084,-21084,-25094,-21071,-25105,-21058,-25116,-21046,-25127,-21033,-25137,-21020,-25148,-21007,-25159,-20994,-25170,-20981,-25180,-20968,-25191,-20956,-25202,-20943,-25212,-20930,-25223,-20917,-25234,-20904,-25244,-20891,-25255,-20878,-25266,-20865,-25277,-20852,-25287,-20839,-25298,-20826,-25308,-20814,-25319,-20801,-25330,-20788,-25340,-20775,-25351,-20762,-25362,-20749,-25372,-20736,-25383,-20723,-25393,-20710,-25404,-20697,-25415,-20684,-25425,-20671,-25436,-20658,-25446,-20645,-25457,-20632,-25467,-20619,-25478,-20606,-25488,-20593,-25499,-20580,-25509,-20567,-25520,-20554,-25530,-20541,-25541,-20528,-25551,-20514,-25562,-20501,-25572,-20488,-25583,-20475,-25593,-20462,-25604,-20449,-25614,-20436,-25625,-20423,-25635,-20410,-25646,-20397,-25656,-20384,-25666,-20370,-25677,-20357,-25687,-20344,-25698,-20331,-25708,-20318,-25718,-20305,-25729,-20292,-25739,-20278,-25750,-20265,-25760,-20252,-25770,-20239,-25781,-20226,-25791,-20213,-25801,-20199,-25812,-20186,-25822,-20173,-25832,-20160,-25843,-20147,-25853,-20133,-25863,-20120,-25873,-20107,-25884,-20094,-25894,-20080,-25904,-20067,-25914,-20054,-25925,-20041,-25935,-20027,-25945,-20014,-25955,-20001,-25966,-19988,-25976,-19974,-25986,-19961,-25996,-19948,-26007,-19934,-26017,-19921,-26027,-19908,-26037,-19895,-26047,-19881,-26057,-19868,-26068,-19855,-26078,-19841,-26088,-19828,-26098,-19815,-26108,-19801,-26118,-19788,-26128,-19775,-26138,-19761,-26149,-19748,-26159,-19734,-26169,-19721,-26179,-19708,-26189,-19694,-26199,-19681,-26209,-19668,-26219,-19654,-26229,-19641,-26239,-19627,-26249,-19614,-26259,-19600,-26269,-19587,-26279,-19574,-26289,-19560,-26299,-19547,-26309,-19533,-26319,-19520,-26329,-19506,-26339,-19493,-26349,-19479,-26359,-19466,-26369,-19452,-26379,-19439,-26389,-19425,-26399,-19412,-26409,-19398,-26419,-19385,-26429,-19371,-26438,-19358,-26448,-19344,-26458,-19331,-26468,-19317,-26478,-19304,-26488,-19290,-26498,-19277,-26508,-19263,-26517,-19250,-26527,-19236,-26537,-19222,-26547,-19209,-26557,-19195,-26567,-19182,-26576,-19168,-26586,-19155,-26596,-19141,-26606,-19127,-26616,-19114,-26625,-19100,-26635,-19087,-26645,-19073,-26655,-19059,-26664,-19046,-26674,-19032,-26684,-19018,-26693,-19005,-26703,-18991,-26713,-18977,-26723,-18964,-26732,-18950,-26742,-18936,-26752,-18923,-26761,-18909,-26771,-18895,-26781,-18882,-26790,-18868,-26800,-18854,-26810,-18841,-26819,-18827,-26829,-18813,-26838,-18799,-26848,-18786,-26858,-18772,-26867,-18758,-26877,-18745,-26886,-18731,-26896,-18717,-26906,-18703,-26915,-18690,-26925,-18676,-26934,-18662,-26944,-18648,-26953,-18634,-26963,-18621,-26972,-18607,-26982,-18593,-26991,-18579,-27001,-18565,-27010,-18552,-27020,-18538,-27029,-18524,-27039,-18510,-27048,-18496,-27058,-18483,-27067,-18469,-27077,-18455,-27086,-18441,-27095,-18427,-27105,-18413,-27114,-18399,-27124,-18386,-27133,-18372,-27142,-18358,-27152,-18344,-27161,-18330,-27171,-18316,-27180,-18302,-27189,-18288,-27199,-18274,-27208,-18261,-27217,-18247,-27227,-18233,-27236,-18219,-27245,-18205,-27255,-18191,-27264,-18177,-27273,-18163,-27282,-18149,-27292,-18135,-27301,-18121,-27310,-18107,-27320,-18093,-27329,-18079,-27338,-18065,-27347,-18051,-27356,-18037,-27366,-18023,-27375,-18009,-27384,-17995,-27393,-17981,-27402,-17967,-27412,-17953,-27421,-17939,-27430,-17925,-27439,-17911,-27448,-17897,-27457,-17883,-27467,-17869,-27476,-17855,-27485,-17841,-27494,-17827,-27503,-17813,-27512,-17799,-27521,-17785,-27530,-17771,-27539,-17757,-27549,-17743,-27558,-17728,-27567,-17714,-27576,-17700,-27585,-17686,-27594,-17672,-27603,-17658,-27612,-17644,-27621,-17630,-27630,-17616,-27639,-17601,-27648,-17587,-27657,-17573,-27666,-17559,-27675,-17545,-27684,-17531,-27693,-17517,-27702,-17502,-27711,-17488,-27720,-17474,-27729,-17460,-27737,-17446,-27746,-17432,-27755,-17417,-27764,-17403,-27773,-17389,-27782,-17375,-27791,-17361,-27800,-17346,-27809,-17332,-27817,-17318,-27826,-17304,-27835,-17289,-27844,-17275,-27853,-17261,-27862,-17247,-27870,-17233,-27879,-17218,-27888,-17204,-27897,-17190,-27906,-17175,-27914,-17161,-27923,-17147,-27932,-17133,-27941,-17118,-27949,-17104,-27958,-17090,-27967,-17075,-27976,-17061,-27984,-17047,-27993,-17033,-28002,-17018,-28010,-17004,-28019,-16990,-28028,-16975,-28037,-16961,-28045,-16947,-28054,-16932,-28063,-16918,-28071,-16904,-28080,-16889,-28088,-16875,-28097,-16860,-28106,-16846,-28114,-16832,-28123,-16817,-28132,-16803,-28140,-16789,-28149,-16774,-28157,-16760,-28166,-16745,-28174,-16731,-28183,-16717,-28191,-16702,-28200,-16688,-28209,-16673,-28217,-16659,-28226,-16644,-28234,-16630,-28243,-16616,-28251,-16601,-28260,-16587,-28268,-16572,-28276,-16558,-28285,-16543,-28293,-16529,-28302,-16514,-28310,-16500,-28319,-16485,-28327,-16471,-28336,-16456,-28344,-16442,-28352,-16428,-28361,-16413,-28369,-16399,-28378,-16384,-28386,-16369,-28394,-16355,-28403,-16340,-28411,-16326,-28419,-16311,-28428,-16297,-28436,-16282,-28444,-16268,-28453,-16253,-28461,-16239,-28469,-16224,-28478,-16210,-28486,-16195,-28494,-16180,-28502,-16166,-28511,-16151,-28519,-16137,-28527,-16122,-28535,-16108,-28544,-16093,-28552,-16078,-28560,-16064,-28568,-16049,-28576,-16035,-28585,-16020,-28593,-16005,-28601,-15991,-28609,-15976,-28617,-15961,-28626,-15947,-28634,-15932,-28642,-15918,-28650,-15903,-28658,-15888,-28666,-15874,-28674,-15859,-28682,-15844,-28691,-15830,-28699,-15815,-28707,-15800,-28715,-15786,-28723,-15771,-28731,-15756,-28739,-15741,-28747,-15727,-28755,-15712,-28763,-15697,-28771,-15683,-28779,-15668,-28787,-15653,-28795,-15639,-28803,-15624,-28811,-15609,-28819,-15594,-28827,-15580,-28835,-15565,-28843,-15550,-28851,-15535,-28859,-15521,-28867,-15506,-28875,-15491,-28883,-15476,-28891,-15462,-28898,-15447,-28906,-15432,-28914,-15417,-28922,-15402,-28930,-15388,-28938,-15373,-28946,-15358,-28954,-15343,-28961,-15328,-28969,-15314,-28977,-15299,-28985,-15284,-28993,-15269,-29000,-15254,-29008,-15239,-29016,-15225,-29024,-15210,-29032,-15195,-29039,-15180,-29047,-15165,-29055,-15150,-29063,-15136,-29070,-15121,-29078,-15106,-29086,-15091,-29093,-15076,-29101,-15061,-29109,-15046,-29117,-15031,-29124,-15017,-29132,-15002,-29140,-14987,-29147,-14972,-29155,-14957,-29163,-14942,-29170,-14927,-29178,-14912,-29185,-14897,-29193,-14882,-29201,-14867,-29208,-14853,-29216,-14838,-29223,-14823,-29231,-14808,-29239,-14793,-29246,-14778,-29254,-14763,-29261,-14748,-29269,-14733,-29276,-14718,-29284,-14703,-29291,-14688,-29299,-14673,-29306,-14658,-29314,-14643,-29321,-14628,-29329,-14613,-29336,-14598,-29344,-14583,-29351,-14568,-29359,-14553,-29366,-14538,-29373,-14523,-29381,-14508,-29388,-14493,-29396,-14478,-29403,-14463,-29411,-14448,-29418,-14433,-29425,-14418,-29433,-14403,-29440,-14388,-29447,-14373,-29455,-14358,-29462,-14343,-29469,-14327,-29477,-14312,-29484,-14297,-29491,-14282,-29499,-14267,-29506,-14252,-29513,-14237,-29520,-14222,-29528,-14207,-29535,-14192,-29542,-14177,-29549,-14161,-29557,-14146,-29564,-14131,-29571,-14116,-29578,-14101,-29586,-14086,-29593,-14071,-29600,-14056,-29607,-14040,-29614,-14025,-29622,-14010,-29629,-13995,-29636,-13980,-29643,-13965,-29650,-13950,-29657,-13934,-29664,-13919,-29671,-13904,-29679,-13889,-29686,-13874,-29693,-13859,-29700,-13843,-29707,-13828,-29714,-13813,-29721,-13798,-29728,-13783,-29735,-13767,-29742,-13752,-29749,-13737,-29756,-13722,-29763,-13707,-29770,-13691,-29777,-13676,-29784,-13661,-29791,-13646,-29798,-13630,-29805,-13615,-29812,-13600,-29819,-13585,-29826,-13569,-29833,-13554,-29840,-13539,-29847,-13524,-29854,-13508,-29861,-13493,-29867,-13478,-29874,-13463,-29881,-13447,-29888,-13432,-29895,-13417,-29902,-13401,-29909,-13386,-29916,-13371,-29922,-13356,-29929,-13340,-29936,-13325,-29943,-13310,-29950,-13294,-29956,-13279,-29963,-13264,-29970,-13248,-29977,-13233,-29984,-13218,-29990,-13202,-29997,-13187,-30004,-13172,-30010,-13156,-30017,-13141,-30024,-13126,-30031,-13110,-30037,-13095,-30044,-13080,-30051,-13064,-30057,-13049,-30064,-13034,-30071,-13018,-30077,-13003,-30084,-12987,-30091,-12972,-30097,-12957,-30104,-12941,-30110,-12926,-30117,-12910,-30124,-12895,-30130,-12880,-30137,-12864,-30143,-12849,-30150,-12833,-30157,-12818,-30163,-12803,-30170,-12787,-30176,-12772,-30183,-12756,-30189,-12741,-30196,-12725,-30202,-12710,-30209,-12695,-30215,-12679,-30222,-12664,-30228,-12648,-30235,-12633,-30241,-12617,-30248,-12602,-30254,-12586,-30260,-12571,-30267,-12555,-30273,-12540,-30280,-12524,-30286,-12509,-30292,-12493,-30299,-12478,-30305,-12462,-30312,-12447,-30318,-12431,-30324,-12416,-30331,-12400,-30337,-12385,-30343,-12369,-30350,-12354,-30356,-12338,-30362,-12323,-30369,-12307,-30375,-12292,-30381,-12276,-30387,-12261,-30394,-12245,-30400,-12230,-30406,-12214,-30412,-12199,-30419,-12183,-30425,-12167,-30431,-12152,-30437,-12136,-30443,-12121,-30450,-12105,-30456,-12090,-30462,-12074,-30468,-12058,-30474,-12043,-30481,-12027,-30487,-12012,-30493,-11996,-30499,-11981,-30505,-11965,-30511,-11949,-30517,-11934,-30523,-11918,-30529,-11903,-30536,-11887,-30542,-11871,-30548,-11856,-30554,-11840,-30560,-11824,-30566,-11809,-30572,-11793,-30578,-11778,-30584,-11762,-30590,-11746,-30596,-11731,-30602,-11715,-30608,-11699,-30614,-11684,-30620,-11668,-30626,-11652,-30632,-11637,-30638,-11621,-30644,-11605,-30650,-11590,-30656,-11574,-30661,-11558,-30667,-11543,-30673,-11527,-30679,-11511,-30685,-11496,-30691,-11480,-30697,-11464,-30703,-11449,-30708,-11433,-30714,-11417,-30720,-11401,-30726,-11386,-30732,-11370,-30738,-11354,-30743,-11339,-30749,-11323,-30755,-11307,-30761,-11291,-30767,-11276,-30772,-11260,-30778,-11244,-30784,-11228,-30789,-11213,-30795,-11197,-30801,-11181,-30807,-11165,-30812,-11150,-30818,-11134,-30824,-11118,-30829,-11102,-30835,-11087,-30841,-11071,-30846,-11055,-30852,-11039,-30858,-11024,-30863,-11008,-30869,-10992,-30875,-10976,-30880,-10960,-30886,-10945,-30891,-10929,-30897,-10913,-30903,-10897,-30908,-10881,-30914,-10866,-30919,-10850,-30925,-10834,-30930,-10818,-30936,-10802,-30941,-10787,-30947,-10771,-30952,-10755,-30958,-10739,-30963,-10723,-30969,-10707,-30974,-10692,-30980,-10676,-30985,-10660,-30991,-10644,-30996,-10628,-31002,-10612,-31007,-10597,-31012,-10581,-31018,-10565,-31023,-10549,-31029,-10533,-31034,-10517,-31039,-10501,-31045,-10485,-31050,-10470,-31055,-10454,-31061,-10438,-31066,-10422,-31071,-10406,-31077,-10390,-31082,-10374,-31087,-10358,-31093,-10343,-31098,-10327,-31103,-10311,-31108,-10295,-31114,-10279,-31119,-10263,-31124,-10247,-31129,-10231,-31135,-10215,-31140,-10199,-31145,-10183,-31150,-10167,-31155,-10152,-31161,-10136,-31166,-10120,-31171,-10104,-31176,-10088,-31181,-10072,-31186,-10056,-31192,-10040,-31197,-10024,-31202,-10008,-31207,-9992,-31212,-9976,-31217,-9960,-31222,-9944,-31227,-9928,-31232,-9912,-31237,-9896,-31243,-9880,-31248,-9864,-31253,-9848,-31258,-9832,-31263,-9816,-31268,-9800,-31273,-9784,-31278,-9768,-31283,-9752,-31288,-9736,-31293,-9720,-31298,-9704,-31303,-9688,-31308,-9672,-31312,-9656,-31317,-9640,-31322,-9624,-31327,-9608,-31332,-9592,-31337,-9576,-31342,-9560,-31347,-9544,-31352,-9528,-31357,-9512,-31361,-9496,-31366,-9480,-31371,-9464,-31376,-9448,-31381,-9432,-31386,-9416,-31390,-9400,-31395,-9384,-31400,-9368,-31405,-9352,-31410,-9336,-31414,-9320,-31419,-9304,-31424,-9288,-31429,-9271,-31433,-9255,-31438,-9239,-31443,-9223,-31447,-9207,-31452,-9191,-31457,-9175,-31462,-9159,-31466,-9143,-31471,-9127,-31476,-9111,-31480,-9095,-31485,-9078,-31490,-9062,-31494,-9046,-31499,-9030,-31503,-9014,-31508,-8998,-31513,-8982,-31517,-8966,-31522,-8950,-31526,-8933,-31531,-8917,-31535,-8901,-31540,-8885,-31545,-8869,-31549,-8853,-31554,-8837,-31558,-8821,-31563,-8804,-31567,-8788,-31572,-8772,-31576,-8756,-31581,-8740,-31585,-8724,-31589,-8708,-31594,-8691,-31598,-8675,-31603,-8659,-31607,-8643,-31612,-8627,-31616,-8611,-31620,-8594,-31625,-8578,-31629,-8562,-31634,-8546,-31638,-8530,-31642,-8514,-31647,-8497,-31651,-8481,-31655,-8465,-31660,-8449,-31664,-8433,-31668,-8416,-31673,-8400,-31677,-8384,-31681,-8368,-31685,-8352,-31690,-8335,-31694,-8319,-31698,-8303,-31702,-8287,-31707,-8271,-31711,-8254,-31715,-8238,-31719,-8222,-31724,-8206,-31728,-8190,-31732,-8173,-31736,-8157,-31740,-8141,-31744,-8125,-31749,-8108,-31753,-8092,-31757,-8076,-31761,-8060,-31765,-8043,-31769,-8027,-31773,-8011,-31777,-7995,-31781,-7978,-31786,-7962,-31790,-7946,-31794,-7930,-31798,-7913,-31802,-7897,-31806,-7881,-31810,-7865,-31814,-7848,-31818,-7832,-31822,-7816,-31826,-7800,-31830,-7783,-31834,-7767,-31838,-7751,-31842,-7734,-31846,-7718,-31850,-7702,-31854,-7686,-31857,-7669,-31861,-7653,-31865,-7637,-31869,-7620,-31873,-7604,-31877,-7588,-31881,-7572,-31885,-7555,-31889,-7539,-31892,-7523,-31896,-7506,-31900,-7490,-31904,-7474,-31908,-7457,-31912,-7441,-31915,-7425,-31919,-7408,-31923,-7392,-31927,-7376,-31930,-7359,-31934,-7343,-31938,-7327,-31942,-7311,-31945,-7294,-31949,-7278,-31953,-7262,-31957,-7245,-31960,-7229,-31964,-7212,-31968,-7196,-31971,-7180,-31975,-7163,-31979,-7147,-31982,-7131,-31986,-7114,-31990,-7098,-31993,-7082,-31997,-7065,-32000,-7049,-32004,-7033,-32008,-7016,-32011,-7000,-32015,-6983,-32018,-6967,-32022,-6951,-32025,-6934,-32029,-6918,-32033,-6902,-32036,-6885,-32040,-6869,-32043,-6852,-32047,-6836,-32050,-6820,-32054,-6803,-32057,-6787,-32060,-6771,-32064,-6754,-32067,-6738,-32071,-6721,-32074,-6705,-32078,-6689,-32081,-6672,-32085,-6656,-32088,-6639,-32091,-6623,-32095,-6607,-32098,-6590,-32101,-6574,-32105,-6557,-32108,-6541,-32111,-6524,-32115,-6508,-32118,-6492,-32121,-6475,-32125,-6459,-32128,-6442,-32131,-6426,-32135,-6409,-32138,-6393,-32141,-6377,-32144,-6360,-32148,-6344,-32151,-6327,-32154,-6311,-32157,-6294,-32161,-6278,-32164,-6262,-32167,-6245,-32170,-6229,-32173,-6212,-32177,-6196,-32180,-6179,-32183,-6163,-32186,-6146,-32189,-6130,-32192,-6113,-32195,-6097,-32198,-6081,-32202,-6064,-32205,-6048,-32208,-6031,-32211,-6015,-32214,-5998,-32217,-5982,-32220,-5965,-32223,-5949,-32226,-5932,-32229,-5916,-32232,-5899,-32235,-5883,-32238,-5866,-32241,-5850,-32244,-5833,-32247,-5817,-32250,-5800,-32253,-5784,-32256,-5767,-32259,-5751,-32262,-5734,-32265,-5718,-32268,-5701,-32271,-5685,-32274,-5668,-32276,-5652,-32279,-5635,-32282,-5619,-32285,-5602,-32288,-5586,-32291,-5569,-32294,-5553,-32296,-5536,-32299,-5520,-32302,-5503,-32305,-5487,-32308,-5470,-32311,-5454,-32313,-5437,-32316,-5421,-32319,-5404,-32322,-5388,-32324,-5371,-32327,-5355,-32330,-5338,-32333,-5322,-32335,-5305,-32338,-5288,-32341,-5272,-32343,-5255,-32346,-5239,-32349,-5222,-32351,-5206,-32354,-5189,-32357,-5173,-32359,-5156,-32362,-5140,-32365,-5123,-32367,-5107,-32370,-5090,-32372,-5073,-32375,-5057,-32378,-5040,-32380,-5024,-32383,-5007,-32385,-4991,-32388,-4974,-32390,-4958,-32393,-4941,-32395,-4924,-32398,-4908,-32400,-4891,-32403,-4875,-32405,-4858,-32408,-4842,-32410,-4825,-32413,-4808,-32415,-4792,-32418,-4775,-32420,-4759,-32423,-4742,-32425,-4726,-32427,-4709,-32430,-4692,-32432,-4676,-32435,-4659,-32437,-4643,-32439,-4626,-32442,-4609,-32444,-4593,-32446,-4576,-32449,-4560,-32451,-4543,-32453,-4526,-32456,-4510,-32458,-4493,-32460,-4477,-32463,-4460,-32465,-4444,-32467,-4427,-32469,-4410,-32472,-4394,-32474,-4377,-32476,-4360,-32478,-4344,-32481,-4327,-32483,-4311,-32485,-4294,-32487,-4277,-32489,-4261,-32492,-4244,-32494,-4228,-32496,-4211,-32498,-4194,-32500,-4178,-32502,-4161,-32504,-4145,-32507,-4128,-32509,-4111,-32511,-4095,-32513,-4078,-32515,-4061,-32517,-4045,-32519,-4028,-32521,-4012,-32523,-3995,-32525,-3978,-32527,-3962,-32529,-3945,-32531,-3928,-32533,-3912,-32535,-3895,-32537,-3878,-32539,-3862,-32541,-3845,-32543,-3829,-32545,-3812,-32547,-3795,-32549,-3779,-32551,-3762,-32553,-3745,-32555,-3729,-32557,-3712,-32559,-3695,-32560,-3679,-32562,-3662,-32564,-3645,-32566,-3629,-32568,-3612,-32570,-3595,-32572,-3579,-32573,-3562,-32575,-3546,-32577,-3529,-32579,-3512,-32581,-3496,-32582,-3479,-32584,-3462,-32586,-3446,-32588,-3429,-32589,-3412,-32591,-3396,-32593,-3379,-32595,-3362,-32596,-3346,-32598,-3329,-32600,-3312,-32601,-3296,-32603,-3279,-32605,-3262,-32606,-3246,-32608,-3229,-32610,-3212,-32611,-3196,-32613,-3179,-32615,-3162,-32616,-3146,-32618,-3129,-32619,-3112,-32621,-3095,-32623,-3079,-32624,-3062,-32626,-3045,-32627,-3029,-32629,-3012,-32630,-2995,-32632,-2979,-32633,-2962,-32635,-2945,-32636,-2929,-32638,-2912,-32639,-2895,-32641,-2879,-32642,-2862,-32644,-2845,-32645,-2829,-32647,-2812,-32648,-2795,-32650,-2778,-32651,-2762,-32652,-2745,-32654,-2728,-32655,-2712,-32657,-2695,-32658,-2678,-32659,-2662,-32661,-2645,-32662,-2628,-32663,-2611,-32665,-2595,-32666,-2578,-32667,-2561,-32669,-2545,-32670,-2528,-32671,-2511,-32672,-2495,-32674,-2478,-32675,-2461,-32676,-2444,-32677,-2428,-32679,-2411,-32680,-2394,-32681,-2378,-32682,-2361,-32684,-2344,-32685,-2327,-32686,-2311,-32687,-2294,-32688,-2277,-32689,-2261,-32691,-2244,-32692,-2227,-32693,-2210,-32694,-2194,-32695,-2177,-32696,-2160,-32697,-2144,-32698,-2127,-32700,-2110,-32701,-2093,-32702,-2077,-32703,-2060,-32704,-2043,-32705,-2027,-32706,-2010,-32707,-1993,-32708,-1976,-32709,-1960,-32710,-1943,-32711,-1926,-32712,-1909,-32713,-1893,-32714,-1876,-32715,-1859,-32716,-1843,-32717,-1826,-32718,-1809,-32718,-1792,-32719,-1776,-32720,-1759,-32721,-1742,-32722,-1725,-32723,-1709,-32724,-1692,-32725,-1675,-32726,-1659,-32726,-1642,-32727,-1625,-32728,-1608,-32729,-1592,-32730,-1575,-32730,-1558,-32731,-1541,-32732,-1525,-32733,-1508,-32734,-1491,-32734,-1474,-32735,-1458,-32736,-1441,-32737,-1424,-32737,-1407,-32738,-1391,-32739,-1374,-32739,-1357,-32740,-1340,-32741,-1324,-32741,-1307,-32742,-1290,-32743,-1274,-32743,-1257,-32744,-1240,-32745,-1223,-32745,-1207,-32746,-1190,-32747,-1173,-32747,-1156,-32748,-1140,-32748,-1123,-32749,-1106,-32749,-1089,-32750,-1073,-32751,-1056,-32751,-1039,-32752,-1022,-32752,-1006,-32753,-989,-32753,-972,-32754,-955,-32754,-939,-32755,-922,-32755,-905,-32755,-888,-32756,-872,-32756,-855,-32757,-838,-32757,-821,-32758,-805,-32758,-788,-32758,-771,-32759,-754,-32759,-738,-32760,-721,-32760,-704,-32760,-687,-32761,-671,-32761,-654,-32761,-637,-32762,-620,-32762,-604,-32762,-587,-32763,-570,-32763,-553,-32763,-537,-32763,-520,-32764,-503,-32764,-486,-32764,-470,-32764,-453,-32765,-436,-32765,-419,-32765,-403,-32765,-386,-32765,-369,-32766,-352,-32766,-336,-32766,-319,-32766,-302,-32766,-285,-32766,-269,-32767,-252,-32767,-235,-32767,-218,-32767,-202,-32767,-185,-32767,-168,-32767,-151,-32767,-135,-32767,-118,-32767,-101,-32767,-84,-32767,-68,-32767,-51,-32767,-34,-32767,-17,-32767,-1,-32767,16,-32767,33,-32767,50,-32767,67,-32767,83,-32767,100,-32767,117,-32767,134,-32767,150,-32767,167,-32767,184,-32767,201,-32767,217,-32767,234,-32767,251,-32766,268,-32766,284,-32766,301,-32766,318,-32766,335,-32766,351,-32765,368,-32765,385,-32765,402,-32765,418,-32765,435,-32764,452,-32764,469,-32764,485,-32764,502,-32763,519,-32763,536,-32763,552,-32763,569,-32762,586,-32762,603,-32762,619,-32761,636,-32761,653,-32761,670,-32760,686,-32760,703,-32760,720,-32759,737,-32759,753,-32758,770,-32758,787,-32758,804,-32757,820,-32757,837,-32756,854,-32756,871,-32755,887,-32755,904,-32755,921,-32754,938,-32754,954,-32753,971,-32753,988,-32752,1005,-32752,1021,-32751,1038,-32751,1055,-32750,1072,-32749,1088,-32749,1105,-32748,1122,-32748,1139,-32747,1155,-32747,1172,-32746,1189,-32745,1206,-32745,1222,-32744,1239,-32743,1256,-32743,1273,-32742,1289,-32741,1306,-32741,1323,-32740,1339,-32739,1356,-32739,1373,-32738,1390,-32737,1406,-32737,1423,-32736,1440,-32735,1457,-32734,1473,-32734,1490,-32733,1507,-32732,1524,-32731,1540,-32730,1557,-32730,1574,-32729,1591,-32728,1607,-32727,1624,-32726,1641,-32726,1658,-32725,1674,-32724,1691,-32723,1708,-32722,1724,-32721,1741,-32720,1758,-32719,1775,-32718,1791,-32718,1808,-32717,1825,-32716,1842,-32715,1858,-32714,1875,-32713,1892,-32712,1908,-32711,1925,-32710,1942,-32709,1959,-32708,1975,-32707,1992,-32706,2009,-32705,2026,-32704,2042,-32703,2059,-32702,2076,-32701,2092,-32700,2109,-32698,2126,-32697,2143,-32696,2159,-32695,2176,-32694,2193,-32693,2209,-32692,2226,-32691,2243,-32689,2260,-32688,2276,-32687,2293,-32686,2310,-32685,2326,-32684,2343,-32682,2360,-32681,2377,-32680,2393,-32679,2410,-32677,2427,-32676,2443,-32675,2460,-32674,2477,-32672,2494,-32671,2510,-32670,2527,-32669,2544,-32667,2560,-32666,2577,-32665,2594,-32663,2610,-32662,2627,-32661,2644,-32659,2661,-32658,2677,-32657,2694,-32655,2711,-32654,2727,-32652,2744,-32651,2761,-32650,2777,-32648,2794,-32647,2811,-32645,2828,-32644,2844,-32642,2861,-32641,2878,-32639,2894,-32638,2911,-32636,2928,-32635,2944,-32633,2961,-32632,2978,-32630,2994,-32629,3011,-32627,3028,-32626,3044,-32624,3061,-32623,3078,-32621,3094,-32619,3111,-32618,3128,-32616,3145,-32615,3161,-32613,3178,-32611,3195,-32610,3211,-32608,3228,-32606,3245,-32605,3261,-32603,3278,-32601,3295,-32600,3311,-32598,3328,-32596,3345,-32595,3361,-32593,3378,-32591,3395,-32589,3411,-32588,3428,-32586,3445,-32584,3461,-32582,3478,-32581,3495,-32579,3511,-32577,3528,-32575,3545,-32573,3561,-32572,3578,-32570,3594,-32568,3611,-32566,3628,-32564,3644,-32562,3661,-32560,3678,-32559,3694,-32557,3711,-32555,3728,-32553,3744,-32551,3761,-32549,3778,-32547,3794,-32545,3811,-32543,3828,-32541,3844,-32539,3861,-32537,3877,-32535,3894,-32533,3911,-32531,3927,-32529,3944,-32527,3961,-32525,3977,-32523,3994,-32521,4011,-32519,4027,-32517,4044,-32515,4060,-32513,4077,-32511,4094,-32509,4110,-32507,4127,-32504,4144,-32502,4160,-32500,4177,-32498,4193,-32496,4210,-32494,4227,-32492,4243,-32489,4260,-32487,4276,-32485,4293,-32483,4310,-32481,4326,-32478,4343,-32476,4359,-32474,4376,-32472,4393,-32469,4409,-32467,4426,-32465,4443,-32463,4459,-32460,4476,-32458,4492,-32456,4509,-32453,4525,-32451,4542,-32449,4559,-32446,4575,-32444,4592,-32442,4608,-32439,4625,-32437,4642,-32435,4658,-32432,4675,-32430,4691,-32427,4708,-32425,4725,-32423,4741,-32420,4758,-32418,4774,-32415,4791,-32413,4807,-32410,4824,-32408,4841,-32405,4857,-32403,4874,-32400,4890,-32398,4907,-32395,4923,-32393,4940,-32390,4957,-32388,4973,-32385,4990,-32383,5006,-32380,5023,-32378,5039,-32375,5056,-32372,5072,-32370,5089,-32367,5106,-32365,5122,-32362,5139,-32359,5155,-32357,5172,-32354,5188,-32351,5205,-32349,5221,-32346,5238,-32343,5254,-32341,5271,-32338,5287,-32335,5304,-32333,5321,-32330,5337,-32327,5354,-32324,5370,-32322,5387,-32319,5403,-32316,5420,-32313,5436,-32311,5453,-32308,5469,-32305,5486,-32302,5502,-32299,5519,-32296,5535,-32294,5552,-32291,5568,-32288,5585,-32285,5601,-32282,5618,-32279,5634,-32276,5651,-32274,5667,-32271,5684,-32268,5700,-32265,5717,-32262,5733,-32259,5750,-32256,5766,-32253,5783,-32250,5799,-32247,5816,-32244,5832,-32241,5849,-32238,5865,-32235,5882,-32232,5898,-32229,5915,-32226,5931,-32223,5948,-32220,5964,-32217,5981,-32214,5997,-32211,6014,-32208,6030,-32205,6047,-32202,6063,-32198,6080,-32195,6096,-32192,6112,-32189,6129,-32186,6145,-32183,6162,-32180,6178,-32177,6195,-32173,6211,-32170,6228,-32167,6244,-32164,6261,-32161,6277,-32157,6293,-32154,6310,-32151,6326,-32148,6343,-32144,6359,-32141,6376,-32138,6392,-32135,6408,-32131,6425,-32128,6441,-32125,6458,-32121,6474,-32118,6491,-32115,6507,-32111,6523,-32108,6540,-32105,6556,-32101,6573,-32098,6589,-32095,6606,-32091,6622,-32088,6638,-32085,6655,-32081,6671,-32078,6688,-32074,6704,-32071,6720,-32067,6737,-32064,6753,-32060,6770,-32057,6786,-32054,6802,-32050,6819,-32047,6835,-32043,6851,-32040,6868,-32036,6884,-32033,6901,-32029,6917,-32025,6933,-32022,6950,-32018,6966,-32015,6982,-32011,6999,-32008,7015,-32004,7032,-32000,7048,-31997,7064,-31993,7081,-31990,7097,-31986,7113,-31982,7130,-31979,7146,-31975,7162,-31971,7179,-31968,7195,-31964,7211,-31960,7228,-31957,7244,-31953,7261,-31949,7277,-31945,7293,-31942,7310,-31938,7326,-31934,7342,-31930,7358,-31927,7375,-31923,7391,-31919,7407,-31915,7424,-31912,7440,-31908,7456,-31904,7473,-31900,7489,-31896,7505,-31892,7522,-31889,7538,-31885,7554,-31881,7571,-31877,7587,-31873,7603,-31869,7619,-31865,7636,-31861,7652,-31857,7668,-31854,7685,-31850,7701,-31846,7717,-31842,7733,-31838,7750,-31834,7766,-31830,7782,-31826,7799,-31822,7815,-31818,7831,-31814,7847,-31810,7864,-31806,7880,-31802,7896,-31798,7912,-31794,7929,-31790,7945,-31786,7961,-31781,7977,-31777,7994,-31773,8010,-31769,8026,-31765,8042,-31761,8059,-31757,8075,-31753,8091,-31749,8107,-31744,8124,-31740,8140,-31736,8156,-31732,8172,-31728,8189,-31724,8205,-31719,8221,-31715,8237,-31711,8253,-31707,8270,-31702,8286,-31698,8302,-31694,8318,-31690,8334,-31685,8351,-31681,8367,-31677,8383,-31673,8399,-31668,8415,-31664,8432,-31660,8448,-31655,8464,-31651,8480,-31647,8496,-31642,8513,-31638,8529,-31634,8545,-31629,8561,-31625,8577,-31620,8593,-31616,8610,-31612,8626,-31607,8642,-31603,8658,-31598,8674,-31594,8690,-31589,8707,-31585,8723,-31581,8739,-31576,8755,-31572,8771,-31567,8787,-31563,8803,-31558,8820,-31554,8836,-31549,8852,-31545,8868,-31540,8884,-31535,8900,-31531,8916,-31526,8932,-31522,8949,-31517,8965,-31513,8981,-31508,8997,-31503,9013,-31499,9029,-31494,9045,-31490,9061,-31485,9077,-31480,9094,-31476,9110,-31471,9126,-31466,9142,-31462,9158,-31457,9174,-31452,9190,-31447,9206,-31443,9222,-31438,9238,-31433,9254,-31429,9270,-31424,9287,-31419,9303,-31414,9319,-31410,9335,-31405,9351,-31400,9367,-31395,9383,-31390,9399,-31386,9415,-31381,9431,-31376,9447,-31371,9463,-31366,9479,-31361,9495,-31357,9511,-31352,9527,-31347,9543,-31342,9559,-31337,9575,-31332,9591,-31327,9607,-31322,9623,-31317,9639,-31312,9655,-31308,9671,-31303,9687,-31298,9703,-31293,9719,-31288,9735,-31283,9751,-31278,9767,-31273,9783,-31268,9799,-31263,9815,-31258,9831,-31253,9847,-31248,9863,-31243,9879,-31237,9895,-31232,9911,-31227,9927,-31222,9943,-31217,9959,-31212,9975,-31207,9991,-31202,10007,-31197,10023,-31192,10039,-31186,10055,-31181,10071,-31176,10087,-31171,10103,-31166,10119,-31161,10135,-31155,10151,-31150,10166,-31145,10182,-31140,10198,-31135,10214,-31129,10230,-31124,10246,-31119,10262,-31114,10278,-31108,10294,-31103,10310,-31098,10326,-31093,10342,-31087,10357,-31082,10373,-31077,10389,-31071,10405,-31066,10421,-31061,10437,-31055,10453,-31050,10469,-31045,10484,-31039,10500,-31034,10516,-31029,10532,-31023,10548,-31018,10564,-31012,10580,-31007,10596,-31002,10611,-30996,10627,-30991,10643,-30985,10659,-30980,10675,-30974,10691,-30969,10706,-30963,10722,-30958,10738,-30952,10754,-30947,10770,-30941,10786,-30936,10801,-30930,10817,-30925,10833,-30919,10849,-30914,10865,-30908,10880,-30903,10896,-30897,10912,-30891,10928,-30886,10944,-30880,10959,-30875,10975,-30869,10991,-30863,11007,-30858,11023,-30852,11038,-30846,11054,-30841,11070,-30835,11086,-30829,11101,-30824,11117,-30818,11133,-30812,11149,-30807,11164,-30801,11180,-30795,11196,-30789,11212,-30784,11227,-30778,11243,-30772,11259,-30767,11275,-30761,11290,-30755,11306,-30749,11322,-30743,11338,-30738,11353,-30732,11369,-30726,11385,-30720,11400,-30714,11416,-30708,11432,-30703,11448,-30697,11463,-30691,11479,-30685,11495,-30679,11510,-30673,11526,-30667,11542,-30661,11557,-30656,11573,-30650,11589,-30644,11604,-30638,11620,-30632,11636,-30626,11651,-30620,11667,-30614,11683,-30608,11698,-30602,11714,-30596,11730,-30590,11745,-30584,11761,-30578,11777,-30572,11792,-30566,11808,-30560,11823,-30554,11839,-30548,11855,-30542,11870,-30536,11886,-30529,11902,-30523,11917,-30517,11933,-30511,11948,-30505,11964,-30499,11980,-30493,11995,-30487,12011,-30481,12026,-30474,12042,-30468,12057,-30462,12073,-30456,12089,-30450,12104,-30443,12120,-30437,12135,-30431,12151,-30425,12166,-30419,12182,-30412,12198,-30406,12213,-30400,12229,-30394,12244,-30387,12260,-30381,12275,-30375,12291,-30369,12306,-30362,12322,-30356,12337,-30350,12353,-30343,12368,-30337,12384,-30331,12399,-30324,12415,-30318,12430,-30312,12446,-30305,12461,-30299,12477,-30292,12492,-30286,12508,-30280,12523,-30273,12539,-30267,12554,-30260,12570,-30254,12585,-30248,12601,-30241,12616,-30235,12632,-30228,12647,-30222,12663,-30215,12678,-30209,12694,-30202,12709,-30196,12724,-30189,12740,-30183,12755,-30176,12771,-30170,12786,-30163,12802,-30157,12817,-30150,12832,-30143,12848,-30137,12863,-30130,12879,-30124,12894,-30117,12909,-30110,12925,-30104,12940,-30097,12956,-30091,12971,-30084,12986,-30077,13002,-30071,13017,-30064,13033,-30057,13048,-30051,13063,-30044,13079,-30037,13094,-30031,13109,-30024,13125,-30017,13140,-30010,13155,-30004,13171,-29997,13186,-29990,13201,-29984,13217,-29977,13232,-29970,13247,-29963,13263,-29956,13278,-29950,13293,-29943,13309,-29936,13324,-29929,13339,-29922,13355,-29916,13370,-29909,13385,-29902,13400,-29895,13416,-29888,13431,-29881,13446,-29874,13462,-29867,13477,-29861,13492,-29854,13507,-29847,13523,-29840,13538,-29833,13553,-29826,13568,-29819,13584,-29812,13599,-29805,13614,-29798,13629,-29791,13645,-29784,13660,-29777,13675,-29770,13690,-29763,13706,-29756,13721,-29749,13736,-29742,13751,-29735,13766,-29728,13782,-29721,13797,-29714,13812,-29707,13827,-29700,13842,-29693,13858,-29686,13873,-29679,13888,-29671,13903,-29664,13918,-29657,13933,-29650,13949,-29643,13964,-29636,13979,-29629,13994,-29622,14009,-29614,14024,-29607,14039,-29600,14055,-29593,14070,-29586,14085,-29578,14100,-29571,14115,-29564,14130,-29557,14145,-29549,14160,-29542,14176,-29535,14191,-29528,14206,-29520,14221,-29513,14236,-29506,14251,-29499,14266,-29491,14281,-29484,14296,-29477,14311,-29469,14326,-29462,14342,-29455,14357,-29447,14372,-29440,14387,-29433,14402,-29425,14417,-29418,14432,-29411,14447,-29403,14462,-29396,14477,-29388,14492,-29381,14507,-29373,14522,-29366,14537,-29359,14552,-29351,14567,-29344,14582,-29336,14597,-29329,14612,-29321,14627,-29314,14642,-29306,14657,-29299,14672,-29291,14687,-29284,14702,-29276,14717,-29269,14732,-29261,14747,-29254,14762,-29246,14777,-29239,14792,-29231,14807,-29223,14822,-29216,14837,-29208,14852,-29201,14866,-29193,14881,-29185,14896,-29178,14911,-29170,14926,-29163,14941,-29155,14956,-29147,14971,-29140,14986,-29132,15001,-29124,15016,-29117,15030,-29109,15045,-29101,15060,-29093,15075,-29086,15090,-29078,15105,-29070,15120,-29063,15135,-29055,15149,-29047,15164,-29039,15179,-29032,15194,-29024,15209,-29016,15224,-29008,15238,-29000,15253,-28993,15268,-28985,15283,-28977,15298,-28969,15313,-28961,15327,-28954,15342,-28946,15357,-28938,15372,-28930,15387,-28922,15401,-28914,15416,-28906,15431,-28898,15446,-28891,15461,-28883,15475,-28875,15490,-28867,15505,-28859,15520,-28851,15534,-28843,15549,-28835,15564,-28827,15579,-28819,15593,-28811,15608,-28803,15623,-28795,15638,-28787,15652,-28779,15667,-28771,15682,-28763,15696,-28755,15711,-28747,15726,-28739,15740,-28731,15755,-28723,15770,-28715,15785,-28707,15799,-28699,15814,-28691,15829,-28682,15843,-28674,15858,-28666,15873,-28658,15887,-28650,15902,-28642,15917,-28634,15931,-28626,15946,-28617,15960,-28609,15975,-28601,15990,-28593,16004,-28585,16019,-28576,16034,-28568,16048,-28560,16063,-28552,16077,-28544,16092,-28535,16107,-28527,16121,-28519,16136,-28511,16150,-28502,16165,-28494,16179,-28486,16194,-28478,16209,-28469,16223,-28461,16238,-28453,16252,-28444,16267,-28436,16281,-28428,16296,-28419,16310,-28411,16325,-28403,16339,-28394,16354,-28386,16368,-28378,16383,-28369,16398,-28361,16412,-28352,16427,-28344,16441,-28336,16455,-28327,16470,-28319,16484,-28310,16499,-28302,16513,-28293,16528,-28285,16542,-28276,16557,-28268,16571,-28260,16586,-28251,16600,-28243,16615,-28234,16629,-28226,16643,-28217,16658,-28209,16672,-28200,16687,-28191,16701,-28183,16716,-28174,16730,-28166,16744,-28157,16759,-28149,16773,-28140,16788,-28132,16802,-28123,16816,-28114,16831,-28106,16845,-28097,16859,-28088,16874,-28080,16888,-28071,16903,-28063,16917,-28054,16931,-28045,16946,-28037,16960,-28028,16974,-28019,16989,-28010,17003,-28002,17017,-27993,17032,-27984,17046,-27976,17060,-27967,17074,-27958,17089,-27949,17103,-27941,17117,-27932,17132,-27923,17146,-27914,17160,-27906,17174,-27897,17189,-27888,17203,-27879,17217,-27870,17232,-27862,17246,-27853,17260,-27844,17274,-27835,17288,-27826,17303,-27817,17317,-27809,17331,-27800,17345,-27791,17360,-27782,17374,-27773,17388,-27764,17402,-27755,17416,-27746,17431,-27737,17445,-27729,17459,-27720,17473,-27711,17487,-27702,17501,-27693,17516,-27684,17530,-27675,17544,-27666,17558,-27657,17572,-27648,17586,-27639,17600,-27630,17615,-27621,17629,-27612,17643,-27603,17657,-27594,17671,-27585,17685,-27576,17699,-27567,17713,-27558,17727,-27549,17742,-27539,17756,-27530,17770,-27521,17784,-27512,17798,-27503,17812,-27494,17826,-27485,17840,-27476,17854,-27467,17868,-27457,17882,-27448,17896,-27439,17910,-27430,17924,-27421,17938,-27412,17952,-27402,17966,-27393,17980,-27384,17994,-27375,18008,-27366,18022,-27356,18036,-27347,18050,-27338,18064,-27329,18078,-27320,18092,-27310,18106,-27301,18120,-27292,18134,-27282,18148,-27273,18162,-27264,18176,-27255,18190,-27245,18204,-27236,18218,-27227,18232,-27217,18246,-27208,18260,-27199,18273,-27189,18287,-27180,18301,-27171,18315,-27161,18329,-27152,18343,-27142,18357,-27133,18371,-27124,18385,-27114,18398,-27105,18412,-27095,18426,-27086,18440,-27077,18454,-27067,18468,-27058,18482,-27048,18495,-27039,18509,-27029,18523,-27020,18537,-27010,18551,-27001,18564,-26991,18578,-26982,18592,-26972,18606,-26963,18620,-26953,18633,-26944,18647,-26934,18661,-26925,18675,-26915,18689,-26906,18702,-26896,18716,-26886,18730,-26877,18744,-26867,18757,-26858,18771,-26848,18785,-26838,18798,-26829,18812,-26819,18826,-26810,18840,-26800,18853,-26790,18867,-26781,18881,-26771,18894,-26761,18908,-26752,18922,-26742,18935,-26732,18949,-26723,18963,-26713,18976,-26703,18990,-26693,19004,-26684,19017,-26674,19031,-26664,19045,-26655,19058,-26645,19072,-26635,19086,-26625,19099,-26616,19113,-26606,19126,-26596,19140,-26586,19154,-26576,19167,-26567,19181,-26557,19194,-26547,19208,-26537,19221,-26527,19235,-26517,19249,-26508,19262,-26498,19276,-26488,19289,-26478,19303,-26468,19316,-26458,19330,-26448,19343,-26438,19357,-26429,19370,-26419,19384,-26409,19397,-26399,19411,-26389,19424,-26379,19438,-26369,19451,-26359,19465,-26349,19478,-26339,19492,-26329,19505,-26319,19519,-26309,19532,-26299,19546,-26289,19559,-26279,19573,-26269,19586,-26259,19599,-26249,19613,-26239,19626,-26229,19640,-26219,19653,-26209,19667,-26199,19680,-26189,19693,-26179,19707,-26169,19720,-26159,19733,-26149,19747,-26138,19760,-26128,19774,-26118,19787,-26108,19800,-26098,19814,-26088,19827,-26078,19840,-26068,19854,-26057,19867,-26047,19880,-26037,19894,-26027,19907,-26017,19920,-26007,19933,-25996,19947,-25986,19960,-25976,19973,-25966,19987,-25955,20000,-25945,20013,-25935,20026,-25925,20040,-25914,20053,-25904,20066,-25894,20079,-25884,20093,-25873,20106,-25863,20119,-25853,20132,-25843,20146,-25832,20159,-25822,20172,-25812,20185,-25801,20198,-25791,20212,-25781,20225,-25770,20238,-25760,20251,-25750,20264,-25739,20277,-25729,20291,-25718,20304,-25708,20317,-25698,20330,-25687,20343,-25677,20356,-25666,20369,-25656,20383,-25646,20396,-25635,20409,-25625,20422,-25614,20435,-25604,20448,-25593,20461,-25583,20474,-25572,20487,-25562,20500,-25551,20513,-25541,20527,-25530,20540,-25520,20553,-25509,20566,-25499,20579,-25488,20592,-25478,20605,-25467,20618,-25457,20631,-25446,20644,-25436,20657,-25425,20670,-25415,20683,-25404,20696,-25393,20709,-25383,20722,-25372,20735,-25362,20748,-25351,20761,-25340,20774,-25330,20787,-25319,20800,-25308,20813,-25298,20825,-25287,20838,-25277,20851,-25266,20864,-25255,20877,-25244,20890,-25234,20903,-25223,20916,-25212,20929,-25202,20942,-25191,20955,-25180,20967,-25170,20980,-25159,20993,-25148,21006,-25137,21019,-25127,21032,-25116,21045,-25105,21057,-25094,21070,-25084,21083,-25073,21096,-25062,21109,-25051,21122,-25040,21134,-25030,21147,-25019,21160,-25008,21173,-24997,21186,-24986,21198,-24975,21211,-24965,21224,-24954,21237,-24943,21249,-24932,21262,-24921,21275,-24910,21288,-24899,21300,-24888,21313,-24878,21326,-24867,21339,-24856,21351,-24845,21364,-24834,21377,-24823,21389,-24812,21402,-24801,21415,-24790,21427,-24779,21440,-24768,21453,-24757,21465,-24746,21478,-24735,21491,-24724,21503,-24713,21516,-24702,21529,-24691,21541,-24680,21554,-24669,21566,-24658,21579,-24647,21592,-24636,21604,-24625,21617,-24614,21629,-24603,21642,-24592,21655,-24581,21667,-24570,21680,-24559,21692,-24547,21705,-24536,21717,-24525,21730,-24514,21743,-24503,21755,-24492,21768,-24481,21780,-24470,21793,-24458,21805,-24447,21818,-24436,21830,-24425,21843,-24414,21855,-24403,21868,-24391,21880,-24380,21893,-24369,21905,-24358,21917,-24347,21930,-24335,21942,-24324,21955,-24313,21967,-24302,21980,-24290,21992,-24279,22004,-24268,22017,-24257,22029,-24245,22042,-24234,22054,-24223,22066,-24212,22079,-24200,22091,-24189,22104,-24178,22116,-24166,22128,-24155,22141,-24144,22153,-24132,22165,-24121,22178,-24110,22190,-24098,22202,-24087,22215,-24076,22227,-24064,22239,-24053,22252,-24042,22264,-24030,22276,-24019,22288,-24007,22301,-23996,22313,-23985,22325,-23973,22338,-23962,22350,-23950,22362,-23939,22374,-23927,22387,-23916,22399,-23904,22411,-23893,22423,-23882,22435,-23870,22448,-23859,22460,-23847,22472,-23836,22484,-23824,22496,-23813,22509,-23801,22521,-23790,22533,-23778,22545,-23767,22557,-23755,22569,-23743,22582,-23732,22594,-23720,22606,-23709,22618,-23697,22630,-23686,22642,-23674,22654,-23662,22666,-23651,22678,-23639,22691,-23628,22703,-23616,22715,-23604,22727,-23593,22739,-23581,22751,-23570,22763,-23558,22775,-23546,22787,-23535,22799,-23523,22811,-23511,22823,-23500,22835,-23488,22847,-23476,22859,-23465,22871,-23453,22883,-23441,22895,-23429,22907,-23418,22919,-23406,22931,-23394,22943,-23383,22955,-23371,22967,-23359,22979,-23347,22991,-23336,23003,-23324,23015,-23312,23027,-23300,23039,-23288,23050,-23277,23062,-23265,23074,-23253,23086,-23241,23098,-23229,23110,-23218,23122,-23206,23134,-23194,23146,-23182,23157,-23170,23169,-23158,23181,-23147,23193,-23135,23205,-23123,23217,-23111,23228,-23099,23240,-23087,23252,-23075,23264,-23063,23276,-23051,23287,-23040,23299,-23028,23311,-23016,23323,-23004,23335,-22992,23346,-22980,23358,-22968,23370,-22956,23382,-22944,23393,-22932,23405,-22920,23417,-22908,23428,-22896,23440,-22884,23452,-22872,23464,-22860,23475,-22848,23487,-22836,23499,-22824,23510,-22812,23522,-22800,23534,-22788,23545,-22776,23557,-22764,23569,-22752,23580,-22740,23592,-22728,23603,-22716,23615,-22704,23627,-22692,23638,-22679,23650,-22667,23661,-22655,23673,-22643,23685,-22631,23696,-22619,23708,-22607,23719,-22595,23731,-22583,23742,-22570,23754,-22558,23766,-22546,23777,-22534,23789,-22522,23800,-22510,23812,-22497,23823,-22485,23835,-22473,23846,-22461,23858,-22449,23869,-22436,23881,-22424,23892,-22412,23903,-22400,23915,-22388,23926,-22375,23938,-22363,23949,-22351,23961,-22339,23972,-22326,23984,-22314,23995,-22302,24006,-22289,24018,-22277,24029,-22265,24041,-22253,24052,-22240,24063,-22228,24075,-22216,24086,-22203,24097,-22191,24109,-22179,24120,-22166,24131,-22154,24143,-22142,24154,-22129,24165,-22117,24177,-22105,24188,-22092,24199,-22080,24211,-22067,24222,-22055,24233,-22043,24244,-22030,24256,-22018,24267,-22005,24278,-21993,24289,-21981,24301,-21968,24312,-21956,24323,-21943,24334,-21931,24346,-21918,24357,-21906,24368,-21894,24379,-21881,24390,-21869,24402,-21856,24413,-21844,24424,-21831,24435,-21819,24446,-21806,24457,-21794,24469,-21781,24480,-21769,24491,-21756,24502,-21744,24513,-21731,24524,-21718,24535,-21706,24546,-21693,24558,-21681,24569,-21668,24580,-21656,24591,-21643,24602,-21630,24613,-21618,24624,-21605,24635,-21593,24646,-21580,24657,-21567,24668,-21555,24679,-21542,24690,-21530,24701,-21517,24712,-21504,24723,-21492,24734,-21479,24745,-21466,24756,-21454,24767,-21441,24778,-21428,24789,-21416,24800,-21403,24811,-21390,24822,-21378,24833,-21365,24844,-21352,24855,-21340,24866,-21327,24877,-21314,24887,-21301,24898,-21289,24909,-21276,24920,-21263,24931,-21250,24942,-21238,24953,-21225,24964,-21212,24974,-21199,24985,-21187,24996,-21174,25007,-21161,25018,-21148,25029,-21135,25039,-21123,25050,-21110,25061,-21097,25072,-21084,25083,-21071,25093,-21058,25104,-21046,25115,-21033,25126,-21020,25136,-21007,25147,-20994,25158,-20981,25169,-20968,25179,-20956,25190,-20943,25201,-20930,25211,-20917,25222,-20904,25233,-20891,25243,-20878,25254,-20865,25265,-20852,25276,-20839,25286,-20826,25297,-20814,25307,-20801,25318,-20788,25329,-20775,25339,-20762,25350,-20749,25361,-20736,25371,-20723,25382,-20710,25392,-20697,25403,-20684,25414,-20671,25424,-20658,25435,-20645,25445,-20632,25456,-20619,25466,-20606,25477,-20593,25487,-20580,25498,-20567,25508,-20554,25519,-20541,25529,-20528,25540,-20514,25550,-20501,25561,-20488,25571,-20475,25582,-20462,25592,-20449,25603,-20436,25613,-20423,25624,-20410,25634,-20397,25645,-20384,25655,-20370,25665,-20357,25676,-20344,25686,-20331,25697,-20318,25707,-20305,25717,-20292,25728,-20278,25738,-20265,25749,-20252,25759,-20239,25769,-20226,25780,-20213,25790,-20199,25800,-20186,25811,-20173,25821,-20160,25831,-20147,25842,-20133,25852,-20120,25862,-20107,25872,-20094,25883,-20080,25893,-20067,25903,-20054,25913,-20041,25924,-20027,25934,-20014,25944,-20001,25954,-19988,25965,-19974,25975,-19961,25985,-19948,25995,-19934,26006,-19921,26016,-19908,26026,-19895,26036,-19881,26046,-19868,26056,-19855,26067,-19841,26077,-19828,26087,-19815,26097,-19801,26107,-19788,26117,-19775,26127,-19761,26137,-19748,26148,-19734,26158,-19721,26168,-19708,26178,-19694,26188,-19681,26198,-19668,26208,-19654,26218,-19641,26228,-19627,26238,-19614,26248,-19600,26258,-19587,26268,-19574,26278,-19560,26288,-19547,26298,-19533,26308,-19520,26318,-19506,26328,-19493,26338,-19479,26348,-19466,26358,-19452,26368,-19439,26378,-19425,26388,-19412,26398,-19398,26408,-19385,26418,-19371,26428,-19358,26437,-19344,26447,-19331,26457,-19317,26467,-19304,26477,-19290,26487,-19277,26497,-19263,26507,-19250,26516,-19236,26526,-19222,26536,-19209,26546,-19195,26556,-19182,26566,-19168,26575,-19155,26585,-19141,26595,-19127,26605,-19114,26615,-19100,26624,-19087,26634,-19073,26644,-19059,26654,-19046,26663,-19032,26673,-19018,26683,-19005,26692,-18991,26702,-18977,26712,-18964,26722,-18950,26731,-18936,26741,-18923,26751,-18909,26760,-18895,26770,-18882,26780,-18868,26789,-18854,26799,-18841,26809,-18827,26818,-18813,26828,-18799,26837,-18786,26847,-18772,26857,-18758,26866,-18745,26876,-18731,26885,-18717,26895,-18703,26905,-18690,26914,-18676,26924,-18662,26933,-18648,26943,-18634,26952,-18621,26962,-18607,26971,-18593,26981,-18579,26990,-18565,27000,-18552,27009,-18538,27019,-18524,27028,-18510,27038,-18496,27047,-18483,27057,-18469,27066,-18455,27076,-18441,27085,-18427,27094,-18413,27104,-18399,27113,-18386,27123,-18372,27132,-18358,27141,-18344,27151,-18330,27160,-18316,27170,-18302,27179,-18288,27188,-18274,27198,-18261,27207,-18247,27216,-18233,27226,-18219,27235,-18205,27244,-18191,27254,-18177,27263,-18163,27272,-18149,27281,-18135,27291,-18121,27300,-18107,27309,-18093,27319,-18079,27328,-18065,27337,-18051,27346,-18037,27355,-18023,27365,-18009,27374,-17995,27383,-17981,27392,-17967,27401,-17953,27411,-17939,27420,-17925,27429,-17911,27438,-17897,27447,-17883,27456,-17869,27466,-17855,27475,-17841,27484,-17827,27493,-17813,27502,-17799,27511,-17785,27520,-17771,27529,-17757,27538,-17743,27548,-17728,27557,-17714,27566,-17700,27575,-17686,27584,-17672,27593,-17658,27602,-17644,27611,-17630,27620,-17616,27629,-17601,27638,-17587,27647,-17573,27656,-17559,27665,-17545,27674,-17531,27683,-17517,27692,-17502,27701,-17488,27710,-17474,27719,-17460,27728,-17446,27736,-17432,27745,-17417,27754,-17403,27763,-17389,27772,-17375,27781,-17361,27790,-17346,27799,-17332,27808,-17318,27816,-17304,27825,-17289,27834,-17275,27843,-17261,27852,-17247,27861,-17233,27869,-17218,27878,-17204,27887,-17190,27896,-17175,27905,-17161,27913,-17147,27922,-17133,27931,-17118,27940,-17104,27948,-17090,27957,-17075,27966,-17061,27975,-17047,27983,-17033,27992,-17018,28001,-17004,28009,-16990,28018,-16975,28027,-16961,28036,-16947,28044,-16932,28053,-16918,28062,-16904,28070,-16889,28079,-16875,28087,-16860,28096,-16846,28105,-16832,28113,-16817,28122,-16803,28131,-16789,28139,-16774,28148,-16760,28156,-16745,28165,-16731,28173,-16717,28182,-16702,28190,-16688,28199,-16673,28208,-16659,28216,-16644,28225,-16630,28233,-16616,28242,-16601,28250,-16587,28259,-16572,28267,-16558,28275,-16543,28284,-16529,28292,-16514,28301,-16500,28309,-16485,28318,-16471,28326,-16456,28335,-16442,28343,-16428,28351,-16413,28360,-16399,28368}; diff --git a/openair1/PHY/TOOLS/twiddle6144.h b/openair1/PHY/TOOLS/twiddle6144.h index 3f9c3684dc..98a8628e07 100644 --- a/openair1/PHY/TOOLS/twiddle6144.h +++ b/openair1/PHY/TOOLS/twiddle6144.h @@ -38,8 +38,8 @@ twb2(2:2:end) = imag(twb); */ -int16_t twa6144[4096] __attribute__((aligned(16))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394}; +int16_t twa6144[4096] __attribute__((aligned(32))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394}; -int16_t twb6144[4096] __attribute__((aligned(16))) = {32767,0,32766,-68,32766,-135,32766,-202,32765,-269,32765,-336,32764,-403,32763,-470,32762,-537,32761,-604,32760,-671,32758,-738,32757,-805,32755,-872,32753,-939,32751,-1006,32749,-1073,32747,-1140,32744,-1207,32742,-1274,32739,-1340,32736,-1407,32733,-1474,32730,-1541,32727,-1608,32724,-1675,32720,-1742,32717,-1809,32713,-1876,32709,-1943,32705,-2010,32701,-2077,32696,-2144,32692,-2210,32687,-2277,32683,-2344,32678,-2411,32673,-2478,32668,-2545,32662,-2611,32657,-2678,32651,-2745,32646,-2812,32640,-2879,32634,-2945,32628,-3012,32622,-3079,32615,-3146,32609,-3212,32602,-3279,32595,-3346,32588,-3412,32581,-3479,32574,-3546,32567,-3612,32559,-3679,32552,-3745,32544,-3812,32536,-3878,32528,-3945,32520,-4012,32512,-4078,32503,-4145,32495,-4211,32486,-4277,32477,-4344,32468,-4410,32459,-4477,32450,-4543,32441,-4609,32431,-4676,32422,-4742,32412,-4808,32402,-4875,32392,-4941,32382,-5007,32371,-5073,32361,-5140,32350,-5206,32340,-5272,32329,-5338,32318,-5404,32307,-5470,32295,-5536,32284,-5602,32273,-5668,32261,-5734,32249,-5800,32237,-5866,32225,-5932,32213,-5998,32201,-6064,32188,-6130,32176,-6196,32163,-6262,32150,-6327,32137,-6393,32124,-6459,32110,-6524,32097,-6590,32084,-6656,32070,-6721,32056,-6787,32042,-6852,32028,-6918,32014,-6983,31999,-7049,31985,-7114,31970,-7180,31956,-7245,31941,-7311,31926,-7376,31911,-7441,31895,-7506,31880,-7572,31864,-7637,31849,-7702,31833,-7767,31817,-7832,31801,-7897,31785,-7962,31768,-8027,31752,-8092,31735,-8157,31718,-8222,31701,-8287,31684,-8352,31667,-8416,31650,-8481,31633,-8546,31615,-8611,31597,-8675,31580,-8740,31562,-8804,31544,-8869,31525,-8933,31507,-8998,31489,-9062,31470,-9127,31451,-9191,31432,-9255,31413,-9320,31394,-9384,31375,-9448,31356,-9512,31336,-9576,31316,-9640,31297,-9704,31277,-9768,31257,-9832,31236,-9896,31216,-9960,31196,-10024,31175,-10088,31154,-10152,31134,-10215,31113,-10279,31092,-10343,31070,-10406,31049,-10470,31028,-10533,31006,-10597,30984,-10660,30962,-10723,30940,-10787,30918,-10850,30896,-10913,30874,-10976,30851,-11039,30828,-11102,30806,-11165,30783,-11228,30760,-11291,30737,-11354,30713,-11417,30690,-11480,30666,-11543,30643,-11605,30619,-11668,30595,-11731,30571,-11793,30547,-11856,30522,-11918,30498,-11981,30473,-12043,30449,-12105,30424,-12167,30399,-12230,30374,-12292,30349,-12354,30323,-12416,30298,-12478,30272,-12540,30247,-12602,30221,-12664,30195,-12725,30169,-12787,30142,-12849,30116,-12910,30090,-12972,30063,-13034,30036,-13095,30009,-13156,29983,-13218,29955,-13279,29928,-13340,29901,-13401,29873,-13463,29846,-13524,29818,-13585,29790,-13646,29762,-13707,29734,-13767,29706,-13828,29678,-13889,29649,-13950,29621,-14010,29592,-14071,29563,-14131,29534,-14192,29505,-14252,29476,-14312,29446,-14373,29417,-14433,29387,-14493,29358,-14553,29328,-14613,29298,-14673,29268,-14733,29238,-14793,29207,-14853,29177,-14912,29146,-14972,29116,-15031,29085,-15091,29054,-15150,29023,-15210,28992,-15269,28960,-15328,28929,-15388,28897,-15447,28866,-15506,28834,-15565,28802,-15624,28770,-15683,28738,-15741,28706,-15800,28673,-15859,28641,-15918,28608,-15976,28575,-16035,28543,-16093,28510,-16151,28477,-16210,28443,-16268,28410,-16326,28377,-16384,28343,-16442,28309,-16500,28275,-16558,28242,-16616,28208,-16673,28173,-16731,28139,-16789,28105,-16846,28070,-16904,28036,-16961,28001,-17018,27966,-17075,27931,-17133,27896,-17190,27861,-17247,27825,-17304,27790,-17361,27754,-17417,27719,-17474,27683,-17531,27647,-17587,27611,-17644,27575,-17700,27538,-17757,27502,-17813,27466,-17869,27429,-17925,27392,-17981,27355,-18037,27319,-18093,27281,-18149,27244,-18205,27207,-18261,27170,-18316,27132,-18372,27094,-18427,27057,-18483,27019,-18538,26981,-18593,26943,-18648,26905,-18703,26866,-18758,26828,-18813,26789,-18868,26751,-18923,26712,-18977,26673,-19032,26634,-19087,26595,-19141,26556,-19195,26516,-19250,26477,-19304,26437,-19358,26398,-19412,26358,-19466,26318,-19520,26278,-19574,26238,-19627,26198,-19681,26158,-19734,26117,-19788,26077,-19841,26036,-19895,25995,-19948,25954,-20001,25913,-20054,25872,-20107,25831,-20160,25790,-20213,25749,-20265,25707,-20318,25665,-20370,25624,-20423,25582,-20475,25540,-20528,25498,-20580,25456,-20632,25414,-20684,25371,-20736,25329,-20788,25286,-20839,25243,-20891,25201,-20943,25158,-20994,25115,-21046,25072,-21097,25029,-21148,24985,-21199,24942,-21250,24898,-21301,24855,-21352,24811,-21403,24767,-21454,24723,-21504,24679,-21555,24635,-21605,24591,-21656,24546,-21706,24502,-21756,24457,-21806,24413,-21856,24368,-21906,24323,-21956,24278,-22005,24233,-22055,24188,-22105,24143,-22154,24097,-22203,24052,-22253,24006,-22302,23961,-22351,23915,-22400,23869,-22449,23823,-22497,23777,-22546,23731,-22595,23685,-22643,23638,-22692,23592,-22740,23545,-22788,23499,-22836,23452,-22884,23405,-22932,23358,-22980,23311,-23028,23264,-23075,23217,-23123,23169,-23170,23122,-23218,23074,-23265,23027,-23312,22979,-23359,22931,-23406,22883,-23453,22835,-23500,22787,-23546,22739,-23593,22691,-23639,22642,-23686,22594,-23732,22545,-23778,22496,-23824,22448,-23870,22399,-23916,22350,-23962,22301,-24007,22252,-24053,22202,-24098,22153,-24144,22104,-24189,22054,-24234,22004,-24279,21955,-24324,21905,-24369,21855,-24414,21805,-24458,21755,-24503,21705,-24547,21655,-24592,21604,-24636,21554,-24680,21503,-24724,21453,-24768,21402,-24812,21351,-24856,21300,-24899,21249,-24943,21198,-24986,21147,-25030,21096,-25073,21045,-25116,20993,-25159,20942,-25202,20890,-25244,20838,-25287,20787,-25330,20735,-25372,20683,-25415,20631,-25457,20579,-25499,20527,-25541,20474,-25583,20422,-25625,20369,-25666,20317,-25708,20264,-25750,20212,-25791,20159,-25832,20106,-25873,20053,-25914,20000,-25955,19947,-25996,19894,-26037,19840,-26078,19787,-26118,19733,-26159,19680,-26199,19626,-26239,19573,-26279,19519,-26319,19465,-26359,19411,-26399,19357,-26438,19303,-26478,19249,-26517,19194,-26557,19140,-26596,19086,-26635,19031,-26674,18976,-26713,18922,-26752,18867,-26790,18812,-26829,18757,-26867,18702,-26906,18647,-26944,18592,-26982,18537,-27020,18482,-27058,18426,-27095,18371,-27133,18315,-27171,18260,-27208,18204,-27245,18148,-27282,18092,-27320,18036,-27356,17980,-27393,17924,-27430,17868,-27467,17812,-27503,17756,-27539,17699,-27576,17643,-27612,17586,-27648,17530,-27684,17473,-27720,17416,-27755,17360,-27791,17303,-27826,17246,-27862,17189,-27897,17132,-27932,17074,-27967,17017,-28002,16960,-28037,16903,-28071,16845,-28106,16788,-28140,16730,-28174,16672,-28209,16615,-28243,16557,-28276,16499,-28310,16441,-28344,16383,-28378,16325,-28411,16267,-28444,16209,-28478,16150,-28511,16092,-28544,16034,-28576,15975,-28609,15917,-28642,15858,-28674,15799,-28707,15740,-28739,15682,-28771,15623,-28803,15564,-28835,15505,-28867,15446,-28898,15387,-28930,15327,-28961,15268,-28993,15209,-29024,15149,-29055,15090,-29086,15030,-29117,14971,-29147,14911,-29178,14852,-29208,14792,-29239,14732,-29269,14672,-29299,14612,-29329,14552,-29359,14492,-29388,14432,-29418,14372,-29447,14311,-29477,14251,-29506,14191,-29535,14130,-29564,14070,-29593,14009,-29622,13949,-29650,13888,-29679,13827,-29707,13766,-29735,13706,-29763,13645,-29791,13584,-29819,13523,-29847,13462,-29874,13400,-29902,13339,-29929,13278,-29956,13217,-29984,13155,-30010,13094,-30037,13033,-30064,12971,-30091,12909,-30117,12848,-30143,12786,-30170,12724,-30196,12663,-30222,12601,-30248,12539,-30273,12477,-30299,12415,-30324,12353,-30350,12291,-30375,12229,-30400,12166,-30425,12104,-30450,12042,-30474,11980,-30499,11917,-30523,11855,-30548,11792,-30572,11730,-30596,11667,-30620,11604,-30644,11542,-30667,11479,-30691,11416,-30714,11353,-30738,11290,-30761,11227,-30784,11164,-30807,11101,-30829,11038,-30852,10975,-30875,10912,-30897,10849,-30919,10786,-30941,10722,-30963,10659,-30985,10596,-31007,10532,-31029,10469,-31050,10405,-31071,10342,-31093,10278,-31114,10214,-31135,10151,-31155,10087,-31176,10023,-31197,9959,-31217,9895,-31237,9831,-31258,9767,-31278,9703,-31298,9639,-31317,9575,-31337,9511,-31357,9447,-31376,9383,-31395,9319,-31414,9254,-31433,9190,-31452,9126,-31471,9061,-31490,8997,-31508,8932,-31526,8868,-31545,8803,-31563,8739,-31581,8674,-31598,8610,-31616,8545,-31634,8480,-31651,8415,-31668,8351,-31685,8286,-31702,8221,-31719,8156,-31736,8091,-31753,8026,-31769,7961,-31786,7896,-31802,7831,-31818,7766,-31834,7701,-31850,7636,-31865,7571,-31881,7505,-31896,7440,-31912,7375,-31927,7310,-31942,7244,-31957,7179,-31971,7113,-31986,7048,-32000,6982,-32015,6917,-32029,6851,-32043,6786,-32057,6720,-32071,6655,-32085,6589,-32098,6523,-32111,6458,-32125,6392,-32138,6326,-32151,6261,-32164,6195,-32177,6129,-32189,6063,-32202,5997,-32214,5931,-32226,5865,-32238,5799,-32250,5733,-32262,5667,-32274,5601,-32285,5535,-32296,5469,-32308,5403,-32319,5337,-32330,5271,-32341,5205,-32351,5139,-32362,5072,-32372,5006,-32383,4940,-32393,4874,-32403,4807,-32413,4741,-32423,4675,-32432,4608,-32442,4542,-32451,4476,-32460,4409,-32469,4343,-32478,4276,-32487,4210,-32496,4144,-32504,4077,-32513,4011,-32521,3944,-32529,3877,-32537,3811,-32545,3744,-32553,3678,-32560,3611,-32568,3545,-32575,3478,-32582,3411,-32589,3345,-32596,3278,-32603,3211,-32610,3145,-32616,3078,-32623,3011,-32629,2944,-32635,2878,-32641,2811,-32647,2744,-32652,2677,-32658,2610,-32663,2544,-32669,2477,-32674,2410,-32679,2343,-32684,2276,-32688,2209,-32693,2143,-32697,2076,-32702,2009,-32706,1942,-32710,1875,-32714,1808,-32718,1741,-32721,1674,-32725,1607,-32728,1540,-32731,1473,-32734,1406,-32737,1339,-32740,1273,-32743,1206,-32745,1139,-32748,1072,-32750,1005,-32752,938,-32754,871,-32756,804,-32758,737,-32759,670,-32761,603,-32762,536,-32763,469,-32764,402,-32765,335,-32766,268,-32766,201,-32767,134,-32767,67,-32767,0,-32767,-68,-32767,-135,-32767,-202,-32767,-269,-32766,-336,-32766,-403,-32765,-470,-32764,-537,-32763,-604,-32762,-671,-32761,-738,-32759,-805,-32758,-872,-32756,-939,-32754,-1006,-32752,-1073,-32750,-1140,-32748,-1207,-32745,-1274,-32743,-1340,-32740,-1407,-32737,-1474,-32734,-1541,-32731,-1608,-32728,-1675,-32725,-1742,-32721,-1809,-32718,-1876,-32714,-1943,-32710,-2010,-32706,-2077,-32702,-2144,-32697,-2210,-32693,-2277,-32688,-2344,-32684,-2411,-32679,-2478,-32674,-2545,-32669,-2611,-32663,-2678,-32658,-2745,-32652,-2812,-32647,-2879,-32641,-2945,-32635,-3012,-32629,-3079,-32623,-3146,-32616,-3212,-32610,-3279,-32603,-3346,-32596,-3412,-32589,-3479,-32582,-3546,-32575,-3612,-32568,-3679,-32560,-3745,-32553,-3812,-32545,-3878,-32537,-3945,-32529,-4012,-32521,-4078,-32513,-4145,-32504,-4211,-32496,-4277,-32487,-4344,-32478,-4410,-32469,-4477,-32460,-4543,-32451,-4609,-32442,-4676,-32432,-4742,-32423,-4808,-32413,-4875,-32403,-4941,-32393,-5007,-32383,-5073,-32372,-5140,-32362,-5206,-32351,-5272,-32341,-5338,-32330,-5404,-32319,-5470,-32308,-5536,-32296,-5602,-32285,-5668,-32274,-5734,-32262,-5800,-32250,-5866,-32238,-5932,-32226,-5998,-32214,-6064,-32202,-6130,-32189,-6196,-32177,-6262,-32164,-6327,-32151,-6393,-32138,-6459,-32125,-6524,-32111,-6590,-32098,-6656,-32085,-6721,-32071,-6787,-32057,-6852,-32043,-6918,-32029,-6983,-32015,-7049,-32000,-7114,-31986,-7180,-31971,-7245,-31957,-7311,-31942,-7376,-31927,-7441,-31912,-7506,-31896,-7572,-31881,-7637,-31865,-7702,-31850,-7767,-31834,-7832,-31818,-7897,-31802,-7962,-31786,-8027,-31769,-8092,-31753,-8157,-31736,-8222,-31719,-8287,-31702,-8352,-31685,-8416,-31668,-8481,-31651,-8546,-31634,-8611,-31616,-8675,-31598,-8740,-31581,-8804,-31563,-8869,-31545,-8933,-31526,-8998,-31508,-9062,-31490,-9127,-31471,-9191,-31452,-9255,-31433,-9320,-31414,-9384,-31395,-9448,-31376,-9512,-31357,-9576,-31337,-9640,-31317,-9704,-31298,-9768,-31278,-9832,-31258,-9896,-31237,-9960,-31217,-10024,-31197,-10088,-31176,-10152,-31155,-10215,-31135,-10279,-31114,-10343,-31093,-10406,-31071,-10470,-31050,-10533,-31029,-10597,-31007,-10660,-30985,-10723,-30963,-10787,-30941,-10850,-30919,-10913,-30897,-10976,-30875,-11039,-30852,-11102,-30829,-11165,-30807,-11228,-30784,-11291,-30761,-11354,-30738,-11417,-30714,-11480,-30691,-11543,-30667,-11605,-30644,-11668,-30620,-11731,-30596,-11793,-30572,-11856,-30548,-11918,-30523,-11981,-30499,-12043,-30474,-12105,-30450,-12167,-30425,-12230,-30400,-12292,-30375,-12354,-30350,-12416,-30324,-12478,-30299,-12540,-30273,-12602,-30248,-12664,-30222,-12725,-30196,-12787,-30170,-12849,-30143,-12910,-30117,-12972,-30091,-13034,-30064,-13095,-30037,-13156,-30010,-13218,-29984,-13279,-29956,-13340,-29929,-13401,-29902,-13463,-29874,-13524,-29847,-13585,-29819,-13646,-29791,-13707,-29763,-13767,-29735,-13828,-29707,-13889,-29679,-13950,-29650,-14010,-29622,-14071,-29593,-14131,-29564,-14192,-29535,-14252,-29506,-14312,-29477,-14373,-29447,-14433,-29418,-14493,-29388,-14553,-29359,-14613,-29329,-14673,-29299,-14733,-29269,-14793,-29239,-14853,-29208,-14912,-29178,-14972,-29147,-15031,-29117,-15091,-29086,-15150,-29055,-15210,-29024,-15269,-28993,-15328,-28961,-15388,-28930,-15447,-28898,-15506,-28867,-15565,-28835,-15624,-28803,-15683,-28771,-15741,-28739,-15800,-28707,-15859,-28674,-15918,-28642,-15976,-28609,-16035,-28576,-16093,-28544,-16151,-28511,-16210,-28478,-16268,-28444,-16326,-28411,-16384,-28378,-16442,-28344,-16500,-28310,-16558,-28276,-16616,-28243,-16673,-28209,-16731,-28174,-16789,-28140,-16846,-28106,-16904,-28071,-16961,-28037,-17018,-28002,-17075,-27967,-17133,-27932,-17190,-27897,-17247,-27862,-17304,-27826,-17361,-27791,-17417,-27755,-17474,-27720,-17531,-27684,-17587,-27648,-17644,-27612,-17700,-27576,-17757,-27539,-17813,-27503,-17869,-27467,-17925,-27430,-17981,-27393,-18037,-27356,-18093,-27320,-18149,-27282,-18205,-27245,-18261,-27208,-18316,-27171,-18372,-27133,-18427,-27095,-18483,-27058,-18538,-27020,-18593,-26982,-18648,-26944,-18703,-26906,-18758,-26867,-18813,-26829,-18868,-26790,-18923,-26752,-18977,-26713,-19032,-26674,-19087,-26635,-19141,-26596,-19195,-26557,-19250,-26517,-19304,-26478,-19358,-26438,-19412,-26399,-19466,-26359,-19520,-26319,-19574,-26279,-19627,-26239,-19681,-26199,-19734,-26159,-19788,-26118,-19841,-26078,-19895,-26037,-19948,-25996,-20001,-25955,-20054,-25914,-20107,-25873,-20160,-25832,-20213,-25791,-20265,-25750,-20318,-25708,-20370,-25666,-20423,-25625,-20475,-25583,-20528,-25541,-20580,-25499,-20632,-25457,-20684,-25415,-20736,-25372,-20788,-25330,-20839,-25287,-20891,-25244,-20943,-25202,-20994,-25159,-21046,-25116,-21097,-25073,-21148,-25030,-21199,-24986,-21250,-24943,-21301,-24899,-21352,-24856,-21403,-24812,-21454,-24768,-21504,-24724,-21555,-24680,-21605,-24636,-21656,-24592,-21706,-24547,-21756,-24503,-21806,-24458,-21856,-24414,-21906,-24369,-21956,-24324,-22005,-24279,-22055,-24234,-22105,-24189,-22154,-24144,-22203,-24098,-22253,-24053,-22302,-24007,-22351,-23962,-22400,-23916,-22449,-23870,-22497,-23824,-22546,-23778,-22595,-23732,-22643,-23686,-22692,-23639,-22740,-23593,-22788,-23546,-22836,-23500,-22884,-23453,-22932,-23406,-22980,-23359,-23028,-23312,-23075,-23265,-23123,-23218,-23170,-23170,-23218,-23123,-23265,-23075,-23312,-23028,-23359,-22980,-23406,-22932,-23453,-22884,-23500,-22836,-23546,-22788,-23593,-22740,-23639,-22692,-23686,-22643,-23732,-22595,-23778,-22546,-23824,-22497,-23870,-22449,-23916,-22400,-23962,-22351,-24007,-22302,-24053,-22253,-24098,-22203,-24144,-22154,-24189,-22105,-24234,-22055,-24279,-22005,-24324,-21956,-24369,-21906,-24414,-21856,-24458,-21806,-24503,-21756,-24547,-21706,-24592,-21656,-24636,-21605,-24680,-21555,-24724,-21504,-24768,-21454,-24812,-21403,-24856,-21352,-24899,-21301,-24943,-21250,-24986,-21199,-25030,-21148,-25073,-21097,-25116,-21046,-25159,-20994,-25202,-20943,-25244,-20891,-25287,-20839,-25330,-20788,-25372,-20736,-25415,-20684,-25457,-20632,-25499,-20580,-25541,-20528,-25583,-20475,-25625,-20423,-25666,-20370,-25708,-20318,-25750,-20265,-25791,-20213,-25832,-20160,-25873,-20107,-25914,-20054,-25955,-20001,-25996,-19948,-26037,-19895,-26078,-19841,-26118,-19788,-26159,-19734,-26199,-19681,-26239,-19627,-26279,-19574,-26319,-19520,-26359,-19466,-26399,-19412,-26438,-19358,-26478,-19304,-26517,-19250,-26557,-19195,-26596,-19141,-26635,-19087,-26674,-19032,-26713,-18977,-26752,-18923,-26790,-18868,-26829,-18813,-26867,-18758,-26906,-18703,-26944,-18648,-26982,-18593,-27020,-18538,-27058,-18483,-27095,-18427,-27133,-18372,-27171,-18316,-27208,-18261,-27245,-18205,-27282,-18149,-27320,-18093,-27356,-18037,-27393,-17981,-27430,-17925,-27467,-17869,-27503,-17813,-27539,-17757,-27576,-17700,-27612,-17644,-27648,-17587,-27684,-17531,-27720,-17474,-27755,-17417,-27791,-17361,-27826,-17304,-27862,-17247,-27897,-17190,-27932,-17133,-27967,-17075,-28002,-17018,-28037,-16961,-28071,-16904,-28106,-16846,-28140,-16789,-28174,-16731,-28209,-16673,-28243,-16616,-28276,-16558,-28310,-16500,-28344,-16442,-28378,-16384,-28411,-16326,-28444,-16268,-28478,-16210,-28511,-16151,-28544,-16093,-28576,-16035,-28609,-15976,-28642,-15918,-28674,-15859,-28707,-15800,-28739,-15741,-28771,-15683,-28803,-15624,-28835,-15565,-28867,-15506,-28898,-15447,-28930,-15388,-28961,-15328,-28993,-15269,-29024,-15210,-29055,-15150,-29086,-15091,-29117,-15031,-29147,-14972,-29178,-14912,-29208,-14853,-29239,-14793,-29269,-14733,-29299,-14673,-29329,-14613,-29359,-14553,-29388,-14493,-29418,-14433,-29447,-14373,-29477,-14312,-29506,-14252,-29535,-14192,-29564,-14131,-29593,-14071,-29622,-14010,-29650,-13950,-29679,-13889,-29707,-13828,-29735,-13767,-29763,-13707,-29791,-13646,-29819,-13585,-29847,-13524,-29874,-13463,-29902,-13401,-29929,-13340,-29956,-13279,-29984,-13218,-30010,-13156,-30037,-13095,-30064,-13034,-30091,-12972,-30117,-12910,-30143,-12849,-30170,-12787,-30196,-12725,-30222,-12664,-30248,-12602,-30273,-12540,-30299,-12478,-30324,-12416,-30350,-12354,-30375,-12292,-30400,-12230,-30425,-12167,-30450,-12105,-30474,-12043,-30499,-11981,-30523,-11918,-30548,-11856,-30572,-11793,-30596,-11731,-30620,-11668,-30644,-11605,-30667,-11543,-30691,-11480,-30714,-11417,-30738,-11354,-30761,-11291,-30784,-11228,-30807,-11165,-30829,-11102,-30852,-11039,-30875,-10976,-30897,-10913,-30919,-10850,-30941,-10787,-30963,-10723,-30985,-10660,-31007,-10597,-31029,-10533,-31050,-10470,-31071,-10406,-31093,-10343,-31114,-10279,-31135,-10215,-31155,-10152,-31176,-10088,-31197,-10024,-31217,-9960,-31237,-9896,-31258,-9832,-31278,-9768,-31298,-9704,-31317,-9640,-31337,-9576,-31357,-9512,-31376,-9448,-31395,-9384,-31414,-9320,-31433,-9255,-31452,-9191,-31471,-9127,-31490,-9062,-31508,-8998,-31526,-8933,-31545,-8869,-31563,-8804,-31581,-8740,-31598,-8675,-31616,-8611,-31634,-8546,-31651,-8481,-31668,-8416,-31685,-8352,-31702,-8287,-31719,-8222,-31736,-8157,-31753,-8092,-31769,-8027,-31786,-7962,-31802,-7897,-31818,-7832,-31834,-7767,-31850,-7702,-31865,-7637,-31881,-7572,-31896,-7506,-31912,-7441,-31927,-7376,-31942,-7311,-31957,-7245,-31971,-7180,-31986,-7114,-32000,-7049,-32015,-6983,-32029,-6918,-32043,-6852,-32057,-6787,-32071,-6721,-32085,-6656,-32098,-6590,-32111,-6524,-32125,-6459,-32138,-6393,-32151,-6327,-32164,-6262,-32177,-6196,-32189,-6130,-32202,-6064,-32214,-5998,-32226,-5932,-32238,-5866,-32250,-5800,-32262,-5734,-32274,-5668,-32285,-5602,-32296,-5536,-32308,-5470,-32319,-5404,-32330,-5338,-32341,-5272,-32351,-5206,-32362,-5140,-32372,-5073,-32383,-5007,-32393,-4941,-32403,-4875,-32413,-4808,-32423,-4742,-32432,-4676,-32442,-4609,-32451,-4543,-32460,-4477,-32469,-4410,-32478,-4344,-32487,-4277,-32496,-4211,-32504,-4145,-32513,-4078,-32521,-4012,-32529,-3945,-32537,-3878,-32545,-3812,-32553,-3745,-32560,-3679,-32568,-3612,-32575,-3546,-32582,-3479,-32589,-3412,-32596,-3346,-32603,-3279,-32610,-3212,-32616,-3146,-32623,-3079,-32629,-3012,-32635,-2945,-32641,-2879,-32647,-2812,-32652,-2745,-32658,-2678,-32663,-2611,-32669,-2545,-32674,-2478,-32679,-2411,-32684,-2344,-32688,-2277,-32693,-2210,-32697,-2144,-32702,-2077,-32706,-2010,-32710,-1943,-32714,-1876,-32718,-1809,-32721,-1742,-32725,-1675,-32728,-1608,-32731,-1541,-32734,-1474,-32737,-1407,-32740,-1340,-32743,-1274,-32745,-1207,-32748,-1140,-32750,-1073,-32752,-1006,-32754,-939,-32756,-872,-32758,-805,-32759,-738,-32761,-671,-32762,-604,-32763,-537,-32764,-470,-32765,-403,-32766,-336,-32766,-269,-32767,-202,-32767,-135,-32767,-68,-32767,-1,-32767,67,-32767,134,-32767,201,-32766,268,-32766,335,-32765,402,-32764,469,-32763,536,-32762,603,-32761,670,-32759,737,-32758,804,-32756,871,-32754,938,-32752,1005,-32750,1072,-32748,1139,-32745,1206,-32743,1273,-32740,1339,-32737,1406,-32734,1473,-32731,1540,-32728,1607,-32725,1674,-32721,1741,-32718,1808,-32714,1875,-32710,1942,-32706,2009,-32702,2076,-32697,2143,-32693,2209,-32688,2276,-32684,2343,-32679,2410,-32674,2477,-32669,2544,-32663,2610,-32658,2677,-32652,2744,-32647,2811,-32641,2878,-32635,2944,-32629,3011,-32623,3078,-32616,3145,-32610,3211,-32603,3278,-32596,3345,-32589,3411,-32582,3478,-32575,3545,-32568,3611,-32560,3678,-32553,3744,-32545,3811,-32537,3877,-32529,3944,-32521,4011,-32513,4077,-32504,4144,-32496,4210,-32487,4276,-32478,4343,-32469,4409,-32460,4476,-32451,4542,-32442,4608,-32432,4675,-32423,4741,-32413,4807,-32403,4874,-32393,4940,-32383,5006,-32372,5072,-32362,5139,-32351,5205,-32341,5271,-32330,5337,-32319,5403,-32308,5469,-32296,5535,-32285,5601,-32274,5667,-32262,5733,-32250,5799,-32238,5865,-32226,5931,-32214,5997,-32202,6063,-32189,6129,-32177,6195,-32164,6261,-32151,6326,-32138,6392,-32125,6458,-32111,6523,-32098,6589,-32085,6655,-32071,6720,-32057,6786,-32043,6851,-32029,6917,-32015,6982,-32000,7048,-31986,7113,-31971,7179,-31957,7244,-31942,7310,-31927,7375,-31912,7440,-31896,7505,-31881,7571,-31865,7636,-31850,7701,-31834,7766,-31818,7831,-31802,7896,-31786,7961,-31769,8026,-31753,8091,-31736,8156,-31719,8221,-31702,8286,-31685,8351,-31668,8415,-31651,8480,-31634,8545,-31616,8610,-31598,8674,-31581,8739,-31563,8803,-31545,8868,-31526,8932,-31508,8997,-31490,9061,-31471,9126,-31452,9190,-31433,9254,-31414,9319,-31395,9383,-31376,9447,-31357,9511,-31337,9575,-31317,9639,-31298,9703,-31278,9767,-31258,9831,-31237,9895,-31217,9959,-31197,10023,-31176,10087,-31155,10151,-31135,10214,-31114,10278,-31093,10342,-31071,10405,-31050,10469,-31029,10532,-31007,10596,-30985,10659,-30963,10722,-30941,10786,-30919,10849,-30897,10912,-30875,10975,-30852,11038,-30829,11101,-30807,11164,-30784,11227,-30761,11290,-30738,11353,-30714,11416,-30691,11479,-30667,11542,-30644,11604,-30620,11667,-30596,11730,-30572,11792,-30548,11855,-30523,11917,-30499,11980,-30474,12042,-30450,12104,-30425,12166,-30400,12229,-30375,12291,-30350,12353,-30324,12415,-30299,12477,-30273,12539,-30248,12601,-30222,12663,-30196,12724,-30170,12786,-30143,12848,-30117,12909,-30091,12971,-30064,13033,-30037,13094,-30010,13155,-29984,13217,-29956,13278,-29929,13339,-29902,13400,-29874,13462,-29847,13523,-29819,13584,-29791,13645,-29763,13706,-29735,13766,-29707,13827,-29679,13888,-29650,13949,-29622,14009,-29593,14070,-29564,14130,-29535,14191,-29506,14251,-29477,14311,-29447,14372,-29418,14432,-29388,14492,-29359,14552,-29329,14612,-29299,14672,-29269,14732,-29239,14792,-29208,14852,-29178,14911,-29147,14971,-29117,15030,-29086,15090,-29055,15149,-29024,15209,-28993,15268,-28961,15327,-28930,15387,-28898,15446,-28867,15505,-28835,15564,-28803,15623,-28771,15682,-28739,15740,-28707,15799,-28674,15858,-28642,15917,-28609,15975,-28576,16034,-28544,16092,-28511,16150,-28478,16209,-28444,16267,-28411,16325,-28378,16383,-28344,16441,-28310,16499,-28276,16557,-28243,16615,-28209,16672,-28174,16730,-28140,16788,-28106,16845,-28071,16903,-28037,16960,-28002,17017,-27967,17074,-27932,17132,-27897,17189,-27862,17246,-27826,17303,-27791,17360,-27755,17416,-27720,17473,-27684,17530,-27648,17586,-27612,17643,-27576,17699,-27539,17756,-27503,17812,-27467,17868,-27430,17924,-27393,17980,-27356,18036,-27320,18092,-27282,18148,-27245,18204,-27208,18260,-27171,18315,-27133,18371,-27095,18426,-27058,18482,-27020,18537,-26982,18592,-26944,18647,-26906,18702,-26867,18757,-26829,18812,-26790,18867,-26752,18922,-26713,18976,-26674,19031,-26635,19086,-26596,19140,-26557,19194,-26517,19249,-26478,19303,-26438,19357,-26399,19411,-26359,19465,-26319,19519,-26279,19573,-26239,19626,-26199,19680,-26159,19733,-26118,19787,-26078,19840,-26037,19894,-25996,19947,-25955,20000,-25914,20053,-25873,20106,-25832,20159,-25791,20212,-25750,20264,-25708,20317,-25666,20369,-25625,20422,-25583,20474,-25541,20527,-25499,20579,-25457,20631,-25415,20683,-25372,20735,-25330,20787,-25287,20838,-25244,20890,-25202,20942,-25159,20993,-25116,21045,-25073,21096,-25030,21147,-24986,21198,-24943,21249,-24899,21300,-24856,21351,-24812,21402,-24768,21453,-24724,21503,-24680,21554,-24636,21604,-24592,21655,-24547,21705,-24503,21755,-24458,21805,-24414,21855,-24369,21905,-24324,21955,-24279,22004,-24234,22054,-24189,22104,-24144,22153,-24098,22202,-24053,22252,-24007,22301,-23962,22350,-23916,22399,-23870,22448,-23824,22496,-23778,22545,-23732,22594,-23686,22642,-23639,22691,-23593,22739,-23546,22787,-23500,22835,-23453,22883,-23406,22931,-23359,22979,-23312,23027,-23265,23074,-23218,23122,-23170,23169,-23123,23217,-23075,23264,-23028,23311,-22980,23358,-22932,23405,-22884,23452,-22836,23499,-22788,23545,-22740,23592,-22692,23638,-22643,23685,-22595,23731,-22546,23777,-22497,23823,-22449,23869,-22400,23915,-22351,23961,-22302,24006,-22253,24052,-22203,24097,-22154,24143,-22105,24188,-22055,24233,-22005,24278,-21956,24323,-21906,24368,-21856,24413,-21806,24457,-21756,24502,-21706,24546,-21656,24591,-21605,24635,-21555,24679,-21504,24723,-21454,24767,-21403,24811,-21352,24855,-21301,24898,-21250,24942,-21199,24985,-21148,25029,-21097,25072,-21046,25115,-20994,25158,-20943,25201,-20891,25243,-20839,25286,-20788,25329,-20736,25371,-20684,25414,-20632,25456,-20580,25498,-20528,25540,-20475,25582,-20423,25624,-20370,25665,-20318,25707,-20265,25749,-20213,25790,-20160,25831,-20107,25872,-20054,25913,-20001,25954,-19948,25995,-19895,26036,-19841,26077,-19788,26117,-19734,26158,-19681,26198,-19627,26238,-19574,26278,-19520,26318,-19466,26358,-19412,26398,-19358,26437,-19304,26477,-19250,26516,-19195,26556,-19141,26595,-19087,26634,-19032,26673,-18977,26712,-18923,26751,-18868,26789,-18813,26828,-18758,26866,-18703,26905,-18648,26943,-18593,26981,-18538,27019,-18483,27057,-18427,27094,-18372,27132,-18316,27170,-18261,27207,-18205,27244,-18149,27281,-18093,27319,-18037,27355,-17981,27392,-17925,27429,-17869,27466,-17813,27502,-17757,27538,-17700,27575,-17644,27611,-17587,27647,-17531,27683,-17474,27719,-17417,27754,-17361,27790,-17304,27825,-17247,27861,-17190,27896,-17133,27931,-17075,27966,-17018,28001,-16961,28036,-16904,28070,-16846,28105,-16789,28139,-16731,28173,-16673,28208,-16616,28242,-16558,28275,-16500,28309,-16442,28343}; +int16_t twb6144[4096] __attribute__((aligned(32))) = {32767,0,32766,-68,32766,-135,32766,-202,32765,-269,32765,-336,32764,-403,32763,-470,32762,-537,32761,-604,32760,-671,32758,-738,32757,-805,32755,-872,32753,-939,32751,-1006,32749,-1073,32747,-1140,32744,-1207,32742,-1274,32739,-1340,32736,-1407,32733,-1474,32730,-1541,32727,-1608,32724,-1675,32720,-1742,32717,-1809,32713,-1876,32709,-1943,32705,-2010,32701,-2077,32696,-2144,32692,-2210,32687,-2277,32683,-2344,32678,-2411,32673,-2478,32668,-2545,32662,-2611,32657,-2678,32651,-2745,32646,-2812,32640,-2879,32634,-2945,32628,-3012,32622,-3079,32615,-3146,32609,-3212,32602,-3279,32595,-3346,32588,-3412,32581,-3479,32574,-3546,32567,-3612,32559,-3679,32552,-3745,32544,-3812,32536,-3878,32528,-3945,32520,-4012,32512,-4078,32503,-4145,32495,-4211,32486,-4277,32477,-4344,32468,-4410,32459,-4477,32450,-4543,32441,-4609,32431,-4676,32422,-4742,32412,-4808,32402,-4875,32392,-4941,32382,-5007,32371,-5073,32361,-5140,32350,-5206,32340,-5272,32329,-5338,32318,-5404,32307,-5470,32295,-5536,32284,-5602,32273,-5668,32261,-5734,32249,-5800,32237,-5866,32225,-5932,32213,-5998,32201,-6064,32188,-6130,32176,-6196,32163,-6262,32150,-6327,32137,-6393,32124,-6459,32110,-6524,32097,-6590,32084,-6656,32070,-6721,32056,-6787,32042,-6852,32028,-6918,32014,-6983,31999,-7049,31985,-7114,31970,-7180,31956,-7245,31941,-7311,31926,-7376,31911,-7441,31895,-7506,31880,-7572,31864,-7637,31849,-7702,31833,-7767,31817,-7832,31801,-7897,31785,-7962,31768,-8027,31752,-8092,31735,-8157,31718,-8222,31701,-8287,31684,-8352,31667,-8416,31650,-8481,31633,-8546,31615,-8611,31597,-8675,31580,-8740,31562,-8804,31544,-8869,31525,-8933,31507,-8998,31489,-9062,31470,-9127,31451,-9191,31432,-9255,31413,-9320,31394,-9384,31375,-9448,31356,-9512,31336,-9576,31316,-9640,31297,-9704,31277,-9768,31257,-9832,31236,-9896,31216,-9960,31196,-10024,31175,-10088,31154,-10152,31134,-10215,31113,-10279,31092,-10343,31070,-10406,31049,-10470,31028,-10533,31006,-10597,30984,-10660,30962,-10723,30940,-10787,30918,-10850,30896,-10913,30874,-10976,30851,-11039,30828,-11102,30806,-11165,30783,-11228,30760,-11291,30737,-11354,30713,-11417,30690,-11480,30666,-11543,30643,-11605,30619,-11668,30595,-11731,30571,-11793,30547,-11856,30522,-11918,30498,-11981,30473,-12043,30449,-12105,30424,-12167,30399,-12230,30374,-12292,30349,-12354,30323,-12416,30298,-12478,30272,-12540,30247,-12602,30221,-12664,30195,-12725,30169,-12787,30142,-12849,30116,-12910,30090,-12972,30063,-13034,30036,-13095,30009,-13156,29983,-13218,29955,-13279,29928,-13340,29901,-13401,29873,-13463,29846,-13524,29818,-13585,29790,-13646,29762,-13707,29734,-13767,29706,-13828,29678,-13889,29649,-13950,29621,-14010,29592,-14071,29563,-14131,29534,-14192,29505,-14252,29476,-14312,29446,-14373,29417,-14433,29387,-14493,29358,-14553,29328,-14613,29298,-14673,29268,-14733,29238,-14793,29207,-14853,29177,-14912,29146,-14972,29116,-15031,29085,-15091,29054,-15150,29023,-15210,28992,-15269,28960,-15328,28929,-15388,28897,-15447,28866,-15506,28834,-15565,28802,-15624,28770,-15683,28738,-15741,28706,-15800,28673,-15859,28641,-15918,28608,-15976,28575,-16035,28543,-16093,28510,-16151,28477,-16210,28443,-16268,28410,-16326,28377,-16384,28343,-16442,28309,-16500,28275,-16558,28242,-16616,28208,-16673,28173,-16731,28139,-16789,28105,-16846,28070,-16904,28036,-16961,28001,-17018,27966,-17075,27931,-17133,27896,-17190,27861,-17247,27825,-17304,27790,-17361,27754,-17417,27719,-17474,27683,-17531,27647,-17587,27611,-17644,27575,-17700,27538,-17757,27502,-17813,27466,-17869,27429,-17925,27392,-17981,27355,-18037,27319,-18093,27281,-18149,27244,-18205,27207,-18261,27170,-18316,27132,-18372,27094,-18427,27057,-18483,27019,-18538,26981,-18593,26943,-18648,26905,-18703,26866,-18758,26828,-18813,26789,-18868,26751,-18923,26712,-18977,26673,-19032,26634,-19087,26595,-19141,26556,-19195,26516,-19250,26477,-19304,26437,-19358,26398,-19412,26358,-19466,26318,-19520,26278,-19574,26238,-19627,26198,-19681,26158,-19734,26117,-19788,26077,-19841,26036,-19895,25995,-19948,25954,-20001,25913,-20054,25872,-20107,25831,-20160,25790,-20213,25749,-20265,25707,-20318,25665,-20370,25624,-20423,25582,-20475,25540,-20528,25498,-20580,25456,-20632,25414,-20684,25371,-20736,25329,-20788,25286,-20839,25243,-20891,25201,-20943,25158,-20994,25115,-21046,25072,-21097,25029,-21148,24985,-21199,24942,-21250,24898,-21301,24855,-21352,24811,-21403,24767,-21454,24723,-21504,24679,-21555,24635,-21605,24591,-21656,24546,-21706,24502,-21756,24457,-21806,24413,-21856,24368,-21906,24323,-21956,24278,-22005,24233,-22055,24188,-22105,24143,-22154,24097,-22203,24052,-22253,24006,-22302,23961,-22351,23915,-22400,23869,-22449,23823,-22497,23777,-22546,23731,-22595,23685,-22643,23638,-22692,23592,-22740,23545,-22788,23499,-22836,23452,-22884,23405,-22932,23358,-22980,23311,-23028,23264,-23075,23217,-23123,23169,-23170,23122,-23218,23074,-23265,23027,-23312,22979,-23359,22931,-23406,22883,-23453,22835,-23500,22787,-23546,22739,-23593,22691,-23639,22642,-23686,22594,-23732,22545,-23778,22496,-23824,22448,-23870,22399,-23916,22350,-23962,22301,-24007,22252,-24053,22202,-24098,22153,-24144,22104,-24189,22054,-24234,22004,-24279,21955,-24324,21905,-24369,21855,-24414,21805,-24458,21755,-24503,21705,-24547,21655,-24592,21604,-24636,21554,-24680,21503,-24724,21453,-24768,21402,-24812,21351,-24856,21300,-24899,21249,-24943,21198,-24986,21147,-25030,21096,-25073,21045,-25116,20993,-25159,20942,-25202,20890,-25244,20838,-25287,20787,-25330,20735,-25372,20683,-25415,20631,-25457,20579,-25499,20527,-25541,20474,-25583,20422,-25625,20369,-25666,20317,-25708,20264,-25750,20212,-25791,20159,-25832,20106,-25873,20053,-25914,20000,-25955,19947,-25996,19894,-26037,19840,-26078,19787,-26118,19733,-26159,19680,-26199,19626,-26239,19573,-26279,19519,-26319,19465,-26359,19411,-26399,19357,-26438,19303,-26478,19249,-26517,19194,-26557,19140,-26596,19086,-26635,19031,-26674,18976,-26713,18922,-26752,18867,-26790,18812,-26829,18757,-26867,18702,-26906,18647,-26944,18592,-26982,18537,-27020,18482,-27058,18426,-27095,18371,-27133,18315,-27171,18260,-27208,18204,-27245,18148,-27282,18092,-27320,18036,-27356,17980,-27393,17924,-27430,17868,-27467,17812,-27503,17756,-27539,17699,-27576,17643,-27612,17586,-27648,17530,-27684,17473,-27720,17416,-27755,17360,-27791,17303,-27826,17246,-27862,17189,-27897,17132,-27932,17074,-27967,17017,-28002,16960,-28037,16903,-28071,16845,-28106,16788,-28140,16730,-28174,16672,-28209,16615,-28243,16557,-28276,16499,-28310,16441,-28344,16383,-28378,16325,-28411,16267,-28444,16209,-28478,16150,-28511,16092,-28544,16034,-28576,15975,-28609,15917,-28642,15858,-28674,15799,-28707,15740,-28739,15682,-28771,15623,-28803,15564,-28835,15505,-28867,15446,-28898,15387,-28930,15327,-28961,15268,-28993,15209,-29024,15149,-29055,15090,-29086,15030,-29117,14971,-29147,14911,-29178,14852,-29208,14792,-29239,14732,-29269,14672,-29299,14612,-29329,14552,-29359,14492,-29388,14432,-29418,14372,-29447,14311,-29477,14251,-29506,14191,-29535,14130,-29564,14070,-29593,14009,-29622,13949,-29650,13888,-29679,13827,-29707,13766,-29735,13706,-29763,13645,-29791,13584,-29819,13523,-29847,13462,-29874,13400,-29902,13339,-29929,13278,-29956,13217,-29984,13155,-30010,13094,-30037,13033,-30064,12971,-30091,12909,-30117,12848,-30143,12786,-30170,12724,-30196,12663,-30222,12601,-30248,12539,-30273,12477,-30299,12415,-30324,12353,-30350,12291,-30375,12229,-30400,12166,-30425,12104,-30450,12042,-30474,11980,-30499,11917,-30523,11855,-30548,11792,-30572,11730,-30596,11667,-30620,11604,-30644,11542,-30667,11479,-30691,11416,-30714,11353,-30738,11290,-30761,11227,-30784,11164,-30807,11101,-30829,11038,-30852,10975,-30875,10912,-30897,10849,-30919,10786,-30941,10722,-30963,10659,-30985,10596,-31007,10532,-31029,10469,-31050,10405,-31071,10342,-31093,10278,-31114,10214,-31135,10151,-31155,10087,-31176,10023,-31197,9959,-31217,9895,-31237,9831,-31258,9767,-31278,9703,-31298,9639,-31317,9575,-31337,9511,-31357,9447,-31376,9383,-31395,9319,-31414,9254,-31433,9190,-31452,9126,-31471,9061,-31490,8997,-31508,8932,-31526,8868,-31545,8803,-31563,8739,-31581,8674,-31598,8610,-31616,8545,-31634,8480,-31651,8415,-31668,8351,-31685,8286,-31702,8221,-31719,8156,-31736,8091,-31753,8026,-31769,7961,-31786,7896,-31802,7831,-31818,7766,-31834,7701,-31850,7636,-31865,7571,-31881,7505,-31896,7440,-31912,7375,-31927,7310,-31942,7244,-31957,7179,-31971,7113,-31986,7048,-32000,6982,-32015,6917,-32029,6851,-32043,6786,-32057,6720,-32071,6655,-32085,6589,-32098,6523,-32111,6458,-32125,6392,-32138,6326,-32151,6261,-32164,6195,-32177,6129,-32189,6063,-32202,5997,-32214,5931,-32226,5865,-32238,5799,-32250,5733,-32262,5667,-32274,5601,-32285,5535,-32296,5469,-32308,5403,-32319,5337,-32330,5271,-32341,5205,-32351,5139,-32362,5072,-32372,5006,-32383,4940,-32393,4874,-32403,4807,-32413,4741,-32423,4675,-32432,4608,-32442,4542,-32451,4476,-32460,4409,-32469,4343,-32478,4276,-32487,4210,-32496,4144,-32504,4077,-32513,4011,-32521,3944,-32529,3877,-32537,3811,-32545,3744,-32553,3678,-32560,3611,-32568,3545,-32575,3478,-32582,3411,-32589,3345,-32596,3278,-32603,3211,-32610,3145,-32616,3078,-32623,3011,-32629,2944,-32635,2878,-32641,2811,-32647,2744,-32652,2677,-32658,2610,-32663,2544,-32669,2477,-32674,2410,-32679,2343,-32684,2276,-32688,2209,-32693,2143,-32697,2076,-32702,2009,-32706,1942,-32710,1875,-32714,1808,-32718,1741,-32721,1674,-32725,1607,-32728,1540,-32731,1473,-32734,1406,-32737,1339,-32740,1273,-32743,1206,-32745,1139,-32748,1072,-32750,1005,-32752,938,-32754,871,-32756,804,-32758,737,-32759,670,-32761,603,-32762,536,-32763,469,-32764,402,-32765,335,-32766,268,-32766,201,-32767,134,-32767,67,-32767,0,-32767,-68,-32767,-135,-32767,-202,-32767,-269,-32766,-336,-32766,-403,-32765,-470,-32764,-537,-32763,-604,-32762,-671,-32761,-738,-32759,-805,-32758,-872,-32756,-939,-32754,-1006,-32752,-1073,-32750,-1140,-32748,-1207,-32745,-1274,-32743,-1340,-32740,-1407,-32737,-1474,-32734,-1541,-32731,-1608,-32728,-1675,-32725,-1742,-32721,-1809,-32718,-1876,-32714,-1943,-32710,-2010,-32706,-2077,-32702,-2144,-32697,-2210,-32693,-2277,-32688,-2344,-32684,-2411,-32679,-2478,-32674,-2545,-32669,-2611,-32663,-2678,-32658,-2745,-32652,-2812,-32647,-2879,-32641,-2945,-32635,-3012,-32629,-3079,-32623,-3146,-32616,-3212,-32610,-3279,-32603,-3346,-32596,-3412,-32589,-3479,-32582,-3546,-32575,-3612,-32568,-3679,-32560,-3745,-32553,-3812,-32545,-3878,-32537,-3945,-32529,-4012,-32521,-4078,-32513,-4145,-32504,-4211,-32496,-4277,-32487,-4344,-32478,-4410,-32469,-4477,-32460,-4543,-32451,-4609,-32442,-4676,-32432,-4742,-32423,-4808,-32413,-4875,-32403,-4941,-32393,-5007,-32383,-5073,-32372,-5140,-32362,-5206,-32351,-5272,-32341,-5338,-32330,-5404,-32319,-5470,-32308,-5536,-32296,-5602,-32285,-5668,-32274,-5734,-32262,-5800,-32250,-5866,-32238,-5932,-32226,-5998,-32214,-6064,-32202,-6130,-32189,-6196,-32177,-6262,-32164,-6327,-32151,-6393,-32138,-6459,-32125,-6524,-32111,-6590,-32098,-6656,-32085,-6721,-32071,-6787,-32057,-6852,-32043,-6918,-32029,-6983,-32015,-7049,-32000,-7114,-31986,-7180,-31971,-7245,-31957,-7311,-31942,-7376,-31927,-7441,-31912,-7506,-31896,-7572,-31881,-7637,-31865,-7702,-31850,-7767,-31834,-7832,-31818,-7897,-31802,-7962,-31786,-8027,-31769,-8092,-31753,-8157,-31736,-8222,-31719,-8287,-31702,-8352,-31685,-8416,-31668,-8481,-31651,-8546,-31634,-8611,-31616,-8675,-31598,-8740,-31581,-8804,-31563,-8869,-31545,-8933,-31526,-8998,-31508,-9062,-31490,-9127,-31471,-9191,-31452,-9255,-31433,-9320,-31414,-9384,-31395,-9448,-31376,-9512,-31357,-9576,-31337,-9640,-31317,-9704,-31298,-9768,-31278,-9832,-31258,-9896,-31237,-9960,-31217,-10024,-31197,-10088,-31176,-10152,-31155,-10215,-31135,-10279,-31114,-10343,-31093,-10406,-31071,-10470,-31050,-10533,-31029,-10597,-31007,-10660,-30985,-10723,-30963,-10787,-30941,-10850,-30919,-10913,-30897,-10976,-30875,-11039,-30852,-11102,-30829,-11165,-30807,-11228,-30784,-11291,-30761,-11354,-30738,-11417,-30714,-11480,-30691,-11543,-30667,-11605,-30644,-11668,-30620,-11731,-30596,-11793,-30572,-11856,-30548,-11918,-30523,-11981,-30499,-12043,-30474,-12105,-30450,-12167,-30425,-12230,-30400,-12292,-30375,-12354,-30350,-12416,-30324,-12478,-30299,-12540,-30273,-12602,-30248,-12664,-30222,-12725,-30196,-12787,-30170,-12849,-30143,-12910,-30117,-12972,-30091,-13034,-30064,-13095,-30037,-13156,-30010,-13218,-29984,-13279,-29956,-13340,-29929,-13401,-29902,-13463,-29874,-13524,-29847,-13585,-29819,-13646,-29791,-13707,-29763,-13767,-29735,-13828,-29707,-13889,-29679,-13950,-29650,-14010,-29622,-14071,-29593,-14131,-29564,-14192,-29535,-14252,-29506,-14312,-29477,-14373,-29447,-14433,-29418,-14493,-29388,-14553,-29359,-14613,-29329,-14673,-29299,-14733,-29269,-14793,-29239,-14853,-29208,-14912,-29178,-14972,-29147,-15031,-29117,-15091,-29086,-15150,-29055,-15210,-29024,-15269,-28993,-15328,-28961,-15388,-28930,-15447,-28898,-15506,-28867,-15565,-28835,-15624,-28803,-15683,-28771,-15741,-28739,-15800,-28707,-15859,-28674,-15918,-28642,-15976,-28609,-16035,-28576,-16093,-28544,-16151,-28511,-16210,-28478,-16268,-28444,-16326,-28411,-16384,-28378,-16442,-28344,-16500,-28310,-16558,-28276,-16616,-28243,-16673,-28209,-16731,-28174,-16789,-28140,-16846,-28106,-16904,-28071,-16961,-28037,-17018,-28002,-17075,-27967,-17133,-27932,-17190,-27897,-17247,-27862,-17304,-27826,-17361,-27791,-17417,-27755,-17474,-27720,-17531,-27684,-17587,-27648,-17644,-27612,-17700,-27576,-17757,-27539,-17813,-27503,-17869,-27467,-17925,-27430,-17981,-27393,-18037,-27356,-18093,-27320,-18149,-27282,-18205,-27245,-18261,-27208,-18316,-27171,-18372,-27133,-18427,-27095,-18483,-27058,-18538,-27020,-18593,-26982,-18648,-26944,-18703,-26906,-18758,-26867,-18813,-26829,-18868,-26790,-18923,-26752,-18977,-26713,-19032,-26674,-19087,-26635,-19141,-26596,-19195,-26557,-19250,-26517,-19304,-26478,-19358,-26438,-19412,-26399,-19466,-26359,-19520,-26319,-19574,-26279,-19627,-26239,-19681,-26199,-19734,-26159,-19788,-26118,-19841,-26078,-19895,-26037,-19948,-25996,-20001,-25955,-20054,-25914,-20107,-25873,-20160,-25832,-20213,-25791,-20265,-25750,-20318,-25708,-20370,-25666,-20423,-25625,-20475,-25583,-20528,-25541,-20580,-25499,-20632,-25457,-20684,-25415,-20736,-25372,-20788,-25330,-20839,-25287,-20891,-25244,-20943,-25202,-20994,-25159,-21046,-25116,-21097,-25073,-21148,-25030,-21199,-24986,-21250,-24943,-21301,-24899,-21352,-24856,-21403,-24812,-21454,-24768,-21504,-24724,-21555,-24680,-21605,-24636,-21656,-24592,-21706,-24547,-21756,-24503,-21806,-24458,-21856,-24414,-21906,-24369,-21956,-24324,-22005,-24279,-22055,-24234,-22105,-24189,-22154,-24144,-22203,-24098,-22253,-24053,-22302,-24007,-22351,-23962,-22400,-23916,-22449,-23870,-22497,-23824,-22546,-23778,-22595,-23732,-22643,-23686,-22692,-23639,-22740,-23593,-22788,-23546,-22836,-23500,-22884,-23453,-22932,-23406,-22980,-23359,-23028,-23312,-23075,-23265,-23123,-23218,-23170,-23170,-23218,-23123,-23265,-23075,-23312,-23028,-23359,-22980,-23406,-22932,-23453,-22884,-23500,-22836,-23546,-22788,-23593,-22740,-23639,-22692,-23686,-22643,-23732,-22595,-23778,-22546,-23824,-22497,-23870,-22449,-23916,-22400,-23962,-22351,-24007,-22302,-24053,-22253,-24098,-22203,-24144,-22154,-24189,-22105,-24234,-22055,-24279,-22005,-24324,-21956,-24369,-21906,-24414,-21856,-24458,-21806,-24503,-21756,-24547,-21706,-24592,-21656,-24636,-21605,-24680,-21555,-24724,-21504,-24768,-21454,-24812,-21403,-24856,-21352,-24899,-21301,-24943,-21250,-24986,-21199,-25030,-21148,-25073,-21097,-25116,-21046,-25159,-20994,-25202,-20943,-25244,-20891,-25287,-20839,-25330,-20788,-25372,-20736,-25415,-20684,-25457,-20632,-25499,-20580,-25541,-20528,-25583,-20475,-25625,-20423,-25666,-20370,-25708,-20318,-25750,-20265,-25791,-20213,-25832,-20160,-25873,-20107,-25914,-20054,-25955,-20001,-25996,-19948,-26037,-19895,-26078,-19841,-26118,-19788,-26159,-19734,-26199,-19681,-26239,-19627,-26279,-19574,-26319,-19520,-26359,-19466,-26399,-19412,-26438,-19358,-26478,-19304,-26517,-19250,-26557,-19195,-26596,-19141,-26635,-19087,-26674,-19032,-26713,-18977,-26752,-18923,-26790,-18868,-26829,-18813,-26867,-18758,-26906,-18703,-26944,-18648,-26982,-18593,-27020,-18538,-27058,-18483,-27095,-18427,-27133,-18372,-27171,-18316,-27208,-18261,-27245,-18205,-27282,-18149,-27320,-18093,-27356,-18037,-27393,-17981,-27430,-17925,-27467,-17869,-27503,-17813,-27539,-17757,-27576,-17700,-27612,-17644,-27648,-17587,-27684,-17531,-27720,-17474,-27755,-17417,-27791,-17361,-27826,-17304,-27862,-17247,-27897,-17190,-27932,-17133,-27967,-17075,-28002,-17018,-28037,-16961,-28071,-16904,-28106,-16846,-28140,-16789,-28174,-16731,-28209,-16673,-28243,-16616,-28276,-16558,-28310,-16500,-28344,-16442,-28378,-16384,-28411,-16326,-28444,-16268,-28478,-16210,-28511,-16151,-28544,-16093,-28576,-16035,-28609,-15976,-28642,-15918,-28674,-15859,-28707,-15800,-28739,-15741,-28771,-15683,-28803,-15624,-28835,-15565,-28867,-15506,-28898,-15447,-28930,-15388,-28961,-15328,-28993,-15269,-29024,-15210,-29055,-15150,-29086,-15091,-29117,-15031,-29147,-14972,-29178,-14912,-29208,-14853,-29239,-14793,-29269,-14733,-29299,-14673,-29329,-14613,-29359,-14553,-29388,-14493,-29418,-14433,-29447,-14373,-29477,-14312,-29506,-14252,-29535,-14192,-29564,-14131,-29593,-14071,-29622,-14010,-29650,-13950,-29679,-13889,-29707,-13828,-29735,-13767,-29763,-13707,-29791,-13646,-29819,-13585,-29847,-13524,-29874,-13463,-29902,-13401,-29929,-13340,-29956,-13279,-29984,-13218,-30010,-13156,-30037,-13095,-30064,-13034,-30091,-12972,-30117,-12910,-30143,-12849,-30170,-12787,-30196,-12725,-30222,-12664,-30248,-12602,-30273,-12540,-30299,-12478,-30324,-12416,-30350,-12354,-30375,-12292,-30400,-12230,-30425,-12167,-30450,-12105,-30474,-12043,-30499,-11981,-30523,-11918,-30548,-11856,-30572,-11793,-30596,-11731,-30620,-11668,-30644,-11605,-30667,-11543,-30691,-11480,-30714,-11417,-30738,-11354,-30761,-11291,-30784,-11228,-30807,-11165,-30829,-11102,-30852,-11039,-30875,-10976,-30897,-10913,-30919,-10850,-30941,-10787,-30963,-10723,-30985,-10660,-31007,-10597,-31029,-10533,-31050,-10470,-31071,-10406,-31093,-10343,-31114,-10279,-31135,-10215,-31155,-10152,-31176,-10088,-31197,-10024,-31217,-9960,-31237,-9896,-31258,-9832,-31278,-9768,-31298,-9704,-31317,-9640,-31337,-9576,-31357,-9512,-31376,-9448,-31395,-9384,-31414,-9320,-31433,-9255,-31452,-9191,-31471,-9127,-31490,-9062,-31508,-8998,-31526,-8933,-31545,-8869,-31563,-8804,-31581,-8740,-31598,-8675,-31616,-8611,-31634,-8546,-31651,-8481,-31668,-8416,-31685,-8352,-31702,-8287,-31719,-8222,-31736,-8157,-31753,-8092,-31769,-8027,-31786,-7962,-31802,-7897,-31818,-7832,-31834,-7767,-31850,-7702,-31865,-7637,-31881,-7572,-31896,-7506,-31912,-7441,-31927,-7376,-31942,-7311,-31957,-7245,-31971,-7180,-31986,-7114,-32000,-7049,-32015,-6983,-32029,-6918,-32043,-6852,-32057,-6787,-32071,-6721,-32085,-6656,-32098,-6590,-32111,-6524,-32125,-6459,-32138,-6393,-32151,-6327,-32164,-6262,-32177,-6196,-32189,-6130,-32202,-6064,-32214,-5998,-32226,-5932,-32238,-5866,-32250,-5800,-32262,-5734,-32274,-5668,-32285,-5602,-32296,-5536,-32308,-5470,-32319,-5404,-32330,-5338,-32341,-5272,-32351,-5206,-32362,-5140,-32372,-5073,-32383,-5007,-32393,-4941,-32403,-4875,-32413,-4808,-32423,-4742,-32432,-4676,-32442,-4609,-32451,-4543,-32460,-4477,-32469,-4410,-32478,-4344,-32487,-4277,-32496,-4211,-32504,-4145,-32513,-4078,-32521,-4012,-32529,-3945,-32537,-3878,-32545,-3812,-32553,-3745,-32560,-3679,-32568,-3612,-32575,-3546,-32582,-3479,-32589,-3412,-32596,-3346,-32603,-3279,-32610,-3212,-32616,-3146,-32623,-3079,-32629,-3012,-32635,-2945,-32641,-2879,-32647,-2812,-32652,-2745,-32658,-2678,-32663,-2611,-32669,-2545,-32674,-2478,-32679,-2411,-32684,-2344,-32688,-2277,-32693,-2210,-32697,-2144,-32702,-2077,-32706,-2010,-32710,-1943,-32714,-1876,-32718,-1809,-32721,-1742,-32725,-1675,-32728,-1608,-32731,-1541,-32734,-1474,-32737,-1407,-32740,-1340,-32743,-1274,-32745,-1207,-32748,-1140,-32750,-1073,-32752,-1006,-32754,-939,-32756,-872,-32758,-805,-32759,-738,-32761,-671,-32762,-604,-32763,-537,-32764,-470,-32765,-403,-32766,-336,-32766,-269,-32767,-202,-32767,-135,-32767,-68,-32767,-1,-32767,67,-32767,134,-32767,201,-32766,268,-32766,335,-32765,402,-32764,469,-32763,536,-32762,603,-32761,670,-32759,737,-32758,804,-32756,871,-32754,938,-32752,1005,-32750,1072,-32748,1139,-32745,1206,-32743,1273,-32740,1339,-32737,1406,-32734,1473,-32731,1540,-32728,1607,-32725,1674,-32721,1741,-32718,1808,-32714,1875,-32710,1942,-32706,2009,-32702,2076,-32697,2143,-32693,2209,-32688,2276,-32684,2343,-32679,2410,-32674,2477,-32669,2544,-32663,2610,-32658,2677,-32652,2744,-32647,2811,-32641,2878,-32635,2944,-32629,3011,-32623,3078,-32616,3145,-32610,3211,-32603,3278,-32596,3345,-32589,3411,-32582,3478,-32575,3545,-32568,3611,-32560,3678,-32553,3744,-32545,3811,-32537,3877,-32529,3944,-32521,4011,-32513,4077,-32504,4144,-32496,4210,-32487,4276,-32478,4343,-32469,4409,-32460,4476,-32451,4542,-32442,4608,-32432,4675,-32423,4741,-32413,4807,-32403,4874,-32393,4940,-32383,5006,-32372,5072,-32362,5139,-32351,5205,-32341,5271,-32330,5337,-32319,5403,-32308,5469,-32296,5535,-32285,5601,-32274,5667,-32262,5733,-32250,5799,-32238,5865,-32226,5931,-32214,5997,-32202,6063,-32189,6129,-32177,6195,-32164,6261,-32151,6326,-32138,6392,-32125,6458,-32111,6523,-32098,6589,-32085,6655,-32071,6720,-32057,6786,-32043,6851,-32029,6917,-32015,6982,-32000,7048,-31986,7113,-31971,7179,-31957,7244,-31942,7310,-31927,7375,-31912,7440,-31896,7505,-31881,7571,-31865,7636,-31850,7701,-31834,7766,-31818,7831,-31802,7896,-31786,7961,-31769,8026,-31753,8091,-31736,8156,-31719,8221,-31702,8286,-31685,8351,-31668,8415,-31651,8480,-31634,8545,-31616,8610,-31598,8674,-31581,8739,-31563,8803,-31545,8868,-31526,8932,-31508,8997,-31490,9061,-31471,9126,-31452,9190,-31433,9254,-31414,9319,-31395,9383,-31376,9447,-31357,9511,-31337,9575,-31317,9639,-31298,9703,-31278,9767,-31258,9831,-31237,9895,-31217,9959,-31197,10023,-31176,10087,-31155,10151,-31135,10214,-31114,10278,-31093,10342,-31071,10405,-31050,10469,-31029,10532,-31007,10596,-30985,10659,-30963,10722,-30941,10786,-30919,10849,-30897,10912,-30875,10975,-30852,11038,-30829,11101,-30807,11164,-30784,11227,-30761,11290,-30738,11353,-30714,11416,-30691,11479,-30667,11542,-30644,11604,-30620,11667,-30596,11730,-30572,11792,-30548,11855,-30523,11917,-30499,11980,-30474,12042,-30450,12104,-30425,12166,-30400,12229,-30375,12291,-30350,12353,-30324,12415,-30299,12477,-30273,12539,-30248,12601,-30222,12663,-30196,12724,-30170,12786,-30143,12848,-30117,12909,-30091,12971,-30064,13033,-30037,13094,-30010,13155,-29984,13217,-29956,13278,-29929,13339,-29902,13400,-29874,13462,-29847,13523,-29819,13584,-29791,13645,-29763,13706,-29735,13766,-29707,13827,-29679,13888,-29650,13949,-29622,14009,-29593,14070,-29564,14130,-29535,14191,-29506,14251,-29477,14311,-29447,14372,-29418,14432,-29388,14492,-29359,14552,-29329,14612,-29299,14672,-29269,14732,-29239,14792,-29208,14852,-29178,14911,-29147,14971,-29117,15030,-29086,15090,-29055,15149,-29024,15209,-28993,15268,-28961,15327,-28930,15387,-28898,15446,-28867,15505,-28835,15564,-28803,15623,-28771,15682,-28739,15740,-28707,15799,-28674,15858,-28642,15917,-28609,15975,-28576,16034,-28544,16092,-28511,16150,-28478,16209,-28444,16267,-28411,16325,-28378,16383,-28344,16441,-28310,16499,-28276,16557,-28243,16615,-28209,16672,-28174,16730,-28140,16788,-28106,16845,-28071,16903,-28037,16960,-28002,17017,-27967,17074,-27932,17132,-27897,17189,-27862,17246,-27826,17303,-27791,17360,-27755,17416,-27720,17473,-27684,17530,-27648,17586,-27612,17643,-27576,17699,-27539,17756,-27503,17812,-27467,17868,-27430,17924,-27393,17980,-27356,18036,-27320,18092,-27282,18148,-27245,18204,-27208,18260,-27171,18315,-27133,18371,-27095,18426,-27058,18482,-27020,18537,-26982,18592,-26944,18647,-26906,18702,-26867,18757,-26829,18812,-26790,18867,-26752,18922,-26713,18976,-26674,19031,-26635,19086,-26596,19140,-26557,19194,-26517,19249,-26478,19303,-26438,19357,-26399,19411,-26359,19465,-26319,19519,-26279,19573,-26239,19626,-26199,19680,-26159,19733,-26118,19787,-26078,19840,-26037,19894,-25996,19947,-25955,20000,-25914,20053,-25873,20106,-25832,20159,-25791,20212,-25750,20264,-25708,20317,-25666,20369,-25625,20422,-25583,20474,-25541,20527,-25499,20579,-25457,20631,-25415,20683,-25372,20735,-25330,20787,-25287,20838,-25244,20890,-25202,20942,-25159,20993,-25116,21045,-25073,21096,-25030,21147,-24986,21198,-24943,21249,-24899,21300,-24856,21351,-24812,21402,-24768,21453,-24724,21503,-24680,21554,-24636,21604,-24592,21655,-24547,21705,-24503,21755,-24458,21805,-24414,21855,-24369,21905,-24324,21955,-24279,22004,-24234,22054,-24189,22104,-24144,22153,-24098,22202,-24053,22252,-24007,22301,-23962,22350,-23916,22399,-23870,22448,-23824,22496,-23778,22545,-23732,22594,-23686,22642,-23639,22691,-23593,22739,-23546,22787,-23500,22835,-23453,22883,-23406,22931,-23359,22979,-23312,23027,-23265,23074,-23218,23122,-23170,23169,-23123,23217,-23075,23264,-23028,23311,-22980,23358,-22932,23405,-22884,23452,-22836,23499,-22788,23545,-22740,23592,-22692,23638,-22643,23685,-22595,23731,-22546,23777,-22497,23823,-22449,23869,-22400,23915,-22351,23961,-22302,24006,-22253,24052,-22203,24097,-22154,24143,-22105,24188,-22055,24233,-22005,24278,-21956,24323,-21906,24368,-21856,24413,-21806,24457,-21756,24502,-21706,24546,-21656,24591,-21605,24635,-21555,24679,-21504,24723,-21454,24767,-21403,24811,-21352,24855,-21301,24898,-21250,24942,-21199,24985,-21148,25029,-21097,25072,-21046,25115,-20994,25158,-20943,25201,-20891,25243,-20839,25286,-20788,25329,-20736,25371,-20684,25414,-20632,25456,-20580,25498,-20528,25540,-20475,25582,-20423,25624,-20370,25665,-20318,25707,-20265,25749,-20213,25790,-20160,25831,-20107,25872,-20054,25913,-20001,25954,-19948,25995,-19895,26036,-19841,26077,-19788,26117,-19734,26158,-19681,26198,-19627,26238,-19574,26278,-19520,26318,-19466,26358,-19412,26398,-19358,26437,-19304,26477,-19250,26516,-19195,26556,-19141,26595,-19087,26634,-19032,26673,-18977,26712,-18923,26751,-18868,26789,-18813,26828,-18758,26866,-18703,26905,-18648,26943,-18593,26981,-18538,27019,-18483,27057,-18427,27094,-18372,27132,-18316,27170,-18261,27207,-18205,27244,-18149,27281,-18093,27319,-18037,27355,-17981,27392,-17925,27429,-17869,27466,-17813,27502,-17757,27538,-17700,27575,-17644,27611,-17587,27647,-17531,27683,-17474,27719,-17417,27754,-17361,27790,-17304,27825,-17247,27861,-17190,27896,-17133,27931,-17075,27966,-17018,28001,-16961,28036,-16904,28070,-16846,28105,-16789,28139,-16731,28173,-16673,28208,-16616,28242,-16558,28275,-16500,28309,-16442,28343}; diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c index 58e5428e82..cee7e1c88a 100644 --- a/openair1/SIMULATION/LTE_PHY/prachsim.c +++ b/openair1/SIMULATION/LTE_PHY/prachsim.c @@ -104,13 +104,15 @@ int main(int argc, char **argv) double delay_avg=0; double ue_speed = 0; int NCS_config = 1,rootSequenceIndex=0; + int threequarter_fs = 0; + logInit(); number_of_cards = 1; - while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:")) != -1) { + while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) { switch (c) { case 'a': printf("Running AWGN simulation\n"); @@ -182,6 +184,10 @@ int main(int argc, char **argv) break; + case 'E': + threequarter_fs=1; + break; + case 'n': n_frames = atoi(optarg); break; @@ -316,7 +322,7 @@ int main(int argc, char **argv) Nid_cell, 3, N_RB_DL, - 0, + threequarter_fs, osf, 0); @@ -395,8 +401,9 @@ int main(int argc, char **argv) eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; - eNB->node_function = eNodeB_3GPP; - eNB->proc.subframe_rx = subframe; + eNB->node_function = eNodeB_3GPP; + eNB->proc.subframe_rx = subframe; + eNB->proc.subframe_prach = subframe; /* N_ZC not used later, so prach_fmt is also useless, don't set */ //prach_fmt = get_prach_fmt(eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, @@ -530,7 +537,7 @@ int main(int argc, char **argv) write_output("rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti], frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); + write_output("rxsigF0.m","rxsF0", eNB->prach_vars.rxsigF[0],6144,1,1); write_output("prach_preamble.m","prachp",&eNB->X_u[0],839,1,1); } } From 460f01f6d3d6b0efd7d66988b2214ae451fcb7e2 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 27 Sep 2016 10:38:13 +0200 Subject: [PATCH 252/340] Gitlab CI test case modified file + disable cpu affinity --- cmake_targets/autotests/test_case_list.xml | 340 ++++++++++----------- cmake_targets/build_oai | 6 +- 2 files changed, 173 insertions(+), 173 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 947763e803..8235963c52 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -11,7 +11,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010304 010305 0104+ 015502 015505 015508 015511 015514 015517 015518 015519 015520 015521 015522 015523 015602 015605 015702 015705 015802 015805 015808 015811 015814 015817 015818 015819 015820 015821 015822 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 025514 025517 025518 025519 025520 025521 025522 025523 + 010141 0102+ 010301 010303 010304 010305 0104+ 015518 015519 015520 015521 015522 015523 015602 015605 015702 015705 015818 015819 015820 015821 015822 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025518 025519 025520 025521 025522 025523 3 mozart hutch starsky stevens amerique calisson @@ -470,7 +470,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -s15 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -s15 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -s15 @@ -492,7 +492,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -a -s15 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -a -s15 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -a -s15 @@ -514,7 +514,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -s15 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -s15 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -s15 @@ -536,7 +536,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -a -s15 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -a -s15 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -a -s15 @@ -558,7 +558,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -c26 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -c26 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -c26 @@ -580,7 +580,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -c26 -a -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -c26 -a -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -c26 -a @@ -601,7 +601,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -s15 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -s15 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -s15 @@ -622,7 +622,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -a -s15 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -a -s15 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -a -s15 @@ -643,7 +643,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -F -s15 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -F -s15 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -F -s15 @@ -664,7 +664,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -F -a -s15 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -F -a -s15 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -F -a -s15 @@ -685,7 +685,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -c26 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -c26 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -c26 @@ -706,7 +706,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -c26 -a -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -c26 -a -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -c26 -a @@ -727,7 +727,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -l7 -Q3 -n 100 -b1 -u1 "Found MBSFNAreaConfiguration from eNB 0" segmentation fault|assertion|exiting|fatal @@ -743,7 +743,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -l7 -T mscbr -Q3 -n 100 -b1 -u1 "Received a multicast packet" segmentation fault|assertion|exiting|fatal @@ -759,7 +759,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -l7 -F -T mscbr -Q3 -n 100 -b1 -u1 "Received a multicast packet" segmentation fault|assertion|exiting|fatal @@ -775,7 +775,7 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -l7 -c43 -F -T mbvbr -Q4 -j1 -n120 "MTCH for sync area 1" segmentation fault|assertion|exiting|fatal @@ -791,7 +791,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_cmac_encrypt + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_cmac_encrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -807,7 +807,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_decrypt + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_decrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -823,7 +823,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_encrypt + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_encrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -839,7 +839,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_kenb + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_kenb --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -855,7 +855,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -871,7 +871,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea1 + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -887,7 +887,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea2 + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea2 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -903,7 +903,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -919,7 +919,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -935,7 +935,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_kdf + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_kdf --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -962,7 +962,7 @@ --phy_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim -m5 -gF -s-1 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 -L -m4 -gF -s0 -w1.0 -f.2 -n500 -B6 -c4 -z2 -O70 -m15 -gF -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 -L @@ -993,7 +993,7 @@ --phy_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/ulsim + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/ulsim -B25 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L -B25 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70 -L -B50 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L @@ -1032,11 +1032,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -1107,11 +1107,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -1183,11 +1183,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -1257,11 +1257,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -1330,11 +1330,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -1405,11 +1405,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -1482,11 +1482,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -1559,11 +1559,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -1635,11 +1635,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -1711,11 +1711,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -1787,11 +1787,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -1864,11 +1864,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -1938,11 +1938,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -2013,11 +2013,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -2089,11 +2089,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -2163,11 +2163,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -2236,11 +2236,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -2311,11 +2311,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -2390,11 +2390,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -2467,11 +2467,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -2543,11 +2543,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -2619,11 +2619,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -2695,11 +2695,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -2772,11 +2772,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -3915,11 +3915,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -3987,11 +3987,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4059,11 +4059,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4131,11 +4131,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4202,11 +4202,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4241,7 +4241,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m -u + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 32Mbits/s -i 1 -f m -u False @@ -4274,11 +4274,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4345,11 +4345,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4417,11 +4417,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4489,11 +4489,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4561,11 +4561,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4632,11 +4632,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4704,11 +4704,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf --single-thread @@ -4777,11 +4777,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -4851,11 +4851,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -4925,11 +4925,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -4999,11 +4999,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -5072,11 +5072,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -5146,11 +5146,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -5219,11 +5219,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -5293,11 +5293,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -5367,11 +5367,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -5441,11 +5441,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -5514,11 +5514,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -5588,11 +5588,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf --single-thread @@ -6145,17 +6145,17 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf --single-thread @@ -6223,11 +6223,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf --single-thread @@ -6368,11 +6368,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf --single-thread @@ -6387,7 +6387,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 10M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6407,7 +6407,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -u -f m -b 16M False @@ -6439,11 +6439,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf --single-thread @@ -6458,7 +6458,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 20M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6478,7 +6478,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -u -f m -b 32M False @@ -6510,11 +6510,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf --single-thread @@ -6529,7 +6529,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6549,7 +6549,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -u -b 10Mbits/s + OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -u -f m -b 16M False @@ -8489,7 +8489,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -8564,7 +8564,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -8639,7 +8639,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -E + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -8713,7 +8713,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -8787,7 +8787,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -8823,7 +8823,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m -u + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 31Mbits/s -i 1 -f m -u False @@ -8862,7 +8862,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -E + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -8936,7 +8936,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -9011,7 +9011,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -9086,7 +9086,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -9160,7 +9160,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -9217,7 +9217,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 50 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2680000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 @@ -9234,7 +9234,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -9309,7 +9309,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf --single-thread @@ -9386,7 +9386,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -9463,7 +9463,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -9540,7 +9540,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -9616,7 +9616,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -9692,7 +9692,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -9769,7 +9769,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -9845,7 +9845,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -9923,7 +9923,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -10000,7 +10000,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -10076,7 +10076,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -10152,7 +10152,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread @@ -10229,7 +10229,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 63ce21f728..9a9209db2c 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -48,7 +48,7 @@ PRINT_STATS="False" VCD_TIMING="False" DEADLINE_SCHEDULER_FLAG_USER="False" FORCE_DEADLINE_SCHEDULER_FLAG_USER="" -CPU_AFFINITY_FLAG_USER="True" #Only valid when lowlatecy flag is set to False +CPU_AFFINITY_FLAG_USER="False" #Only valid when lowlatecy flag is set to False REL="Rel10" HW="None" TP="None" @@ -330,9 +330,9 @@ function main() { #By default: EXMIMO: enable if [ "$FORCE_DEADLINE_SCHEDULER_FLAG_USER" = "" ]; then if [ "$HW" = "EXMIMO" ] ; then - DEADLINE_SCHEDULER_FLAG_USER="True" + DEADLINE_SCHEDULER_FLAG_USER="False" elif [ "$HW" = "ETHERNET" ] ; then - DEADLINE_SCHEDULER_FLAG_USER="True" + DEADLINE_SCHEDULER_FLAG_USER="False" elif [ "$HW" = "OAI_USRP" ] ; then DEADLINE_SCHEDULER_FLAG_USER="False" elif [ "$HW" = "OAI_BLADERF" ] ; then From e08e2577f5033e887695fdb745cd3f799618f37f Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 27 Sep 2016 10:57:03 +0200 Subject: [PATCH 253/340] hotfix: bad copy from userspace by ExpressMIMO2 kernel driver The ExpressMIMO2 kernel driver did not use proper mechanisms to copy from user space. It is very surprising that it ever worked at all... This commit is a quick fix. It is not the end of the story and some more work may be needed if things don't work. The remaining issue is that we pass pointer addresses to the kernel as 32 bits values, but pointers are 64 bits values (on x86_64, our supported platform). Some checks have been put in place to detect if upper 32 bits of a pointer are not 0 and print a strong error message in case of problem, but no clean solution has been implemented. --- targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c | 41 +++++++++++++++---- .../EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c | 20 +++++++++ 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c index 4427f4c8af..ecedb562d7 100755 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c @@ -179,6 +179,8 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd int tmp; + unsigned int user_args[4]; + static unsigned int update_firmware_command; static unsigned int update_firmware_address; static unsigned int update_firmware_length; @@ -328,15 +330,38 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd acknowledge with no limit */ #define MAX_IOCTL_ACK_CNT 500 - update_firmware_command = *((unsigned int*)arg); + /* 'arg' is an unsigned long and is supposed to be big enough + * to hold an address - this hypothesis is okay for i386 and x86_64 + * maybe not somewhere else + * this will probably fail with older kernels + * (works with 3.17 on x86_64) + */ + tmp = copy_from_user(&user_args, (void*)arg, 4*sizeof(unsigned int)); + if (tmp) { + printk("[openair][IOCTL] UPDATE_FIRMWARE: error copying parameters to kernel-space (%d bytes uncopied).\n", tmp); + return -1; + } + + update_firmware_command = user_args[0]; switch (update_firmware_command) { case UPDATE_FIRMWARE_TRANSFER_BLOCK: - update_firmware_address = ((unsigned int*)arg)[1]; - update_firmware_length = ((unsigned int*)arg)[2]; + update_firmware_address = user_args[1]; + update_firmware_length = user_args[2]; + + /* This is totally wrong on x86_64: a pointer is 64 bits and + * unsigned int is 32 bits. The userspace program has to ensure + * that its buffer address fits into 32 bits. + * If it proves a too strong requirement, we may change things + * in the future. + * The compiler emits a warning here. Do not remove this warning! + * This is to clearly remember this problem. + * If you require the compilation to work with zero warning, + * consider this one as an exception and find a proper workaround. + */ + update_firmware_ubuffer = user_args[3]; - update_firmware_ubuffer = (unsigned int*)((unsigned int*)arg)[3]; update_firmware_kbuffer = (unsigned int*)kmalloc(update_firmware_length * 4 /* 4 because kmalloc expects bytes */, GFP_KERNEL); @@ -390,8 +415,8 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd case UPDATE_FIRMWARE_CLEAR_BSS: - update_firmware_bss_address = ((unsigned int*)arg)[1]; - update_firmware_bss_size = ((unsigned int*)arg)[2]; + update_firmware_bss_address = user_args[1]; + update_firmware_bss_size = user_args[2]; sparc_tmp_0 = update_firmware_bss_address; sparc_tmp_1 = update_firmware_bss_size; @@ -411,8 +436,8 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd case UPDATE_FIRMWARE_START_EXECUTION: - update_firmware_start_address = ((unsigned int*)arg)[1]; - update_firmware_stack_pointer = ((unsigned int*)arg)[2]; + update_firmware_start_address = user_args[1]; + update_firmware_stack_pointer = user_args[2]; sparc_tmp_0 = update_firmware_start_address; sparc_tmp_1 = update_firmware_stack_pointer; diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c index 692742c7cf..cd873725c0 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include "openair_device.h" @@ -239,6 +240,18 @@ void find_and_transfer_section(char* section_name, unsigned int verboselevel) { /* Dynamically allocate a chunk of memory to store the section into. */ section_content = (char*)malloc(elf_Shdr.sh_size); + /* Fail if the address returned by malloc does not fit in 32 bits. + * The kernel driver gets this address as 32 bits and uses it to copy + * from userspace. If the address does not fit into 32 bits the kernel + * will copy garbage or fail to copy completely. + * To be reworked if things do not work on some setups. + */ + if (sizeof(char*) > 4 && (((uintptr_t)section_content)>>32)) { + fprintf(stderr, "FATAL ERROR: an internal serious problem has been encountered.\n"); + fprintf(stderr, "Contact the authors so as to solve this issue.\n"); + exit(-1); + } + if (!section_content) { fprintf(stderr, "Error: could not dynamically allocate %d bytes for section %s.\n", elf_Shdr.sh_size, SecNameStnTable + elf_Shdr.sh_name); @@ -281,6 +294,13 @@ void find_and_transfer_section(char* section_name, unsigned int verboselevel) { ioctl_params[0] = UPDATE_FIRMWARE_TRANSFER_BLOCK; ioctl_params[1] = elf_Shdr.sh_addr; ioctl_params[2] = elf_Shdr.sh_size / 4; + /* This is wrong on x86_64 because a pointer is 64 bits and + * an unsigned int is only 32 bits. + * The compiler emits a warning, but the test + * above on the value of section_content makes it work + * (hopefully). + * To be changed if things do not work. + */ ioctl_params[3] = (unsigned int)((unsigned int*)section_content); //invert4(ioctl_params[1]); //invert4(ioctl_params[2]); From 2c45e04951a7cd0dc18d1525398feed5cfedcb3b Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Tue, 27 Sep 2016 15:46:34 +0530 Subject: [PATCH 254/340] add static to the declaration of inline in PHY/defs.h --- openair1/PHY/defs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 7f73f98bd7..0808bdc5ba 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -875,7 +875,7 @@ typedef struct { void exit_fun(const char* s); -inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { +static inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { if (pthread_mutex_lock(mutex) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); @@ -897,7 +897,7 @@ inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *in return(0); } -inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { +static inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { if (pthread_mutex_lock(mutex) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); @@ -919,7 +919,7 @@ inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,in return(0); } -inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) { +static inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) { if (pthread_mutex_lock(mutex) != 0) { LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); From f06dd02fe88e09537dffd199030df4ca30ff332f Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 27 Sep 2016 14:36:06 +0200 Subject: [PATCH 255/340] change COPYING to the new license --- COPYING | 760 +++++++------------------------------------------------- 1 file changed, 90 insertions(+), 670 deletions(-) diff --git a/COPYING b/COPYING index 94a9ed024d..05b42e7c30 100644 --- a/COPYING +++ b/COPYING @@ -1,674 +1,94 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 + OAI PUBLIC LICENSE V1.0 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2016 OpenAirInterface Software Alliance, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +Definitions. +“License� shall mean the terms and conditions for use, reproduction, and distribution set forth in this document. + +“Licensor� shall mean the OpenAirInterface Software Alliance. + +“Legal Entity� shall mean the union, at the time an acting entity joins the Alliance, of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control� means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +“You� (or “Your�) shall mean an individual or Legal Entity exercising permissions granted by this License. + +“Source� form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +“Object� form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +“OpenAirInterface Software Alliance� shall mean the endowment fund established at the initiative of Eurecom, an educational and research establishment located at Campus Sophia Tech, 450 Route des Chappes, 06410 Biot, France, which statutes were signed on 18 November 2014. + +“ “Work� shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +“Derivative Works� shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +“Contribution� shall mean any work of authorship that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted� means any form of electronic, , or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work “Contributor License Agreement� shall mean the agreement signed by any Contributor setting forth the terms and conditions applicable to its Contribution. “Contributor� shall mean any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +Grant of Copyright License. +Subject to the terms and conditions of this License, Licensor and each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form + +3. Grant of Patent License. + +3.1 Grant of Patent License for non-commercial purposes: + +Subject to the terms and conditions of this License, Licensor and each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, import, and otherwise transfer the Work, for non-commercial purposes, where such license applies only to those patent claims licensable by such Contributor or Licensor that are necessarily infringed by the Work and/or their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. + +3.2 Grant of Patent License for commercial purposes: + +For commercial purposes, and subject to the terms and conditions of this License, You commits to be prepared to negotiate a patent license with each Contributor and/or the Licensor on Fair, Reasonable and Non-Discriminatory (“FRAND�) terms and conditions for the Work or Contribution(s) incorporated within the Work. + +Licensor and/or each Contributor, by submitting a Contribution, will identify any patent it owns related to the Work and/or its Contribution. + +3.3 Patent Litigation + +If You institute patent litigation against any entity making non-commercial use of the Work (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistibution + +Subject to terms and conditions set forth in articles 2 and 3, You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + + + +1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + +2. You must cause any modified files by You to carry prominent notices stating that You changed the files; and + +3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +4. If the Work includes a “NOTICE� text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement such as the Contributor License Agreement You may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS� BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall Licensor and any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor and/or the Licensor,and only if You agree to indemnify, defend, and hold each Contributor and/or the Licensor harmless for any liability incurred by, or claims asserted against, such Contributor and/or Licensor by reason of Your accepting any such warranty or additional liability. + +10. Applicable law. The present license shall be governed by the laws of France. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the PRESENT OPENAIR 5G License to your work +To apply the present License to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]� replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page� as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] +Licensed under the License terms and conditions for use, reproduction, and distribution of OPENAIR 5G software (the “License�); + +you may not use this file except in compliance with the License.You may obtain a copy of the License at +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an “AS IS� BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. From 0d7039d36ab32e59c423c41a224c7782f175f567 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 27 Sep 2016 15:06:56 +0200 Subject: [PATCH 256/340] rename COPYING to LICENSE --- COPYING => LICENSE | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename COPYING => LICENSE (100%) diff --git a/COPYING b/LICENSE similarity index 100% rename from COPYING rename to LICENSE From 52880e0c17de4441c6b58bd39041ffe21c9cbb20 Mon Sep 17 00:00:00 2001 From: "S. Sandeep Kumar" Date: Tue, 27 Sep 2016 18:53:05 +0530 Subject: [PATCH 257/340] fix node_function in oaisim conf files --- .../CONF/enb.band7.generic.oaisim.local_mme.conf | 6 +++++- .../CONF/enb.band7.tm1.generic.oaisim.local_mme.conf | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf index 6ddb223182..20589158d7 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf @@ -22,7 +22,11 @@ eNBs = ////////// Physical parameters: component_carriers = ( - { + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_mme.conf index 96107a508e..495675c871 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_mme.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_mme.conf @@ -23,6 +23,9 @@ eNBs = component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; From db3c2b4d71dac59e59be814194ee1a101ad5ed13 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 27 Sep 2016 16:54:39 +0200 Subject: [PATCH 258/340] add licensing info at top of source files only .c, .h and .cpp processed. Changes to be committed: modified: common/utils/asn1_conversions.h modified: common/utils/assertions.h modified: common/utils/itti/assertions.h modified: common/utils/itti/backtrace.c modified: common/utils/itti/backtrace.h modified: common/utils/itti/intertask_interface.c modified: common/utils/itti/intertask_interface.h modified: common/utils/itti/intertask_interface_dump.c modified: common/utils/itti/intertask_interface_dump.h modified: common/utils/itti/intertask_interface_init.h modified: common/utils/itti/intertask_interface_types.h modified: common/utils/itti/intertask_messages_def.h modified: common/utils/itti/intertask_messages_types.h modified: common/utils/itti/itti_types.h modified: common/utils/itti/memory_pools.c modified: common/utils/itti/memory_pools.h modified: common/utils/itti/messages_def.h modified: common/utils/itti/messages_types.h modified: common/utils/itti/signals.c modified: common/utils/itti/signals.h modified: common/utils/itti/tasks_def.h modified: common/utils/itti/timer.c modified: common/utils/itti/timer.h modified: common/utils/itti/timer_messages_def.h modified: common/utils/itti/timer_messages_types.h modified: common/utils/itti_analyzer/common/itti_types.h modified: common/utils/itti_analyzer/common/logs.h modified: common/utils/itti_analyzer/common/rc.h modified: common/utils/itti_analyzer/itti_analyzer.c modified: common/utils/itti_analyzer/libbuffers/buffers.c modified: common/utils/itti_analyzer/libbuffers/buffers.h modified: common/utils/itti_analyzer/libbuffers/file.c modified: common/utils/itti_analyzer/libbuffers/file.h modified: common/utils/itti_analyzer/libbuffers/socket.c modified: common/utils/itti_analyzer/libbuffers/socket.h modified: common/utils/itti_analyzer/libparser/array_type.c modified: common/utils/itti_analyzer/libparser/array_type.h modified: common/utils/itti_analyzer/libparser/enum_type.c modified: common/utils/itti_analyzer/libparser/enum_type.h modified: common/utils/itti_analyzer/libparser/enum_value_type.c modified: common/utils/itti_analyzer/libparser/enum_value_type.h modified: common/utils/itti_analyzer/libparser/field_type.c modified: common/utils/itti_analyzer/libparser/field_type.h modified: common/utils/itti_analyzer/libparser/file_type.c modified: common/utils/itti_analyzer/libparser/file_type.h modified: common/utils/itti_analyzer/libparser/fundamental_type.c modified: common/utils/itti_analyzer/libparser/fundamental_type.h modified: common/utils/itti_analyzer/libparser/intertask_contexts.h modified: common/utils/itti_analyzer/libparser/pointer_type.c modified: common/utils/itti_analyzer/libparser/pointer_type.h modified: common/utils/itti_analyzer/libparser/reference_type.c modified: common/utils/itti_analyzer/libparser/reference_type.h modified: common/utils/itti_analyzer/libparser/struct_type.c modified: common/utils/itti_analyzer/libparser/struct_type.h modified: common/utils/itti_analyzer/libparser/typedef_type.c modified: common/utils/itti_analyzer/libparser/typedef_type.h modified: common/utils/itti_analyzer/libparser/types.c modified: common/utils/itti_analyzer/libparser/types.h modified: common/utils/itti_analyzer/libparser/union_type.c modified: common/utils/itti_analyzer/libparser/union_type.h modified: common/utils/itti_analyzer/libparser/xml_parse.c modified: common/utils/itti_analyzer/libparser/xml_parse.h modified: common/utils/itti_analyzer/libresolver/locate_root.c modified: common/utils/itti_analyzer/libresolver/locate_root.h modified: common/utils/itti_analyzer/libresolver/resolvers.c modified: common/utils/itti_analyzer/libresolver/resolvers.h modified: common/utils/itti_analyzer/libui/ui_callbacks.c modified: common/utils/itti_analyzer/libui/ui_callbacks.h modified: common/utils/itti_analyzer/libui/ui_filters.c modified: common/utils/itti_analyzer/libui/ui_filters.h modified: common/utils/itti_analyzer/libui/ui_interface.c modified: common/utils/itti_analyzer/libui/ui_interface.h modified: common/utils/itti_analyzer/libui/ui_main_screen.c modified: common/utils/itti_analyzer/libui/ui_main_screen.h modified: common/utils/itti_analyzer/libui/ui_menu_bar.c modified: common/utils/itti_analyzer/libui/ui_menu_bar.h modified: common/utils/itti_analyzer/libui/ui_notebook.c modified: common/utils/itti_analyzer/libui/ui_notebook.h modified: common/utils/itti_analyzer/libui/ui_notif_dlg.c modified: common/utils/itti_analyzer/libui/ui_notif_dlg.h modified: common/utils/itti_analyzer/libui/ui_notifications.c modified: common/utils/itti_analyzer/libui/ui_notifications.h modified: common/utils/itti_analyzer/libui/ui_signal_dissect_view.c modified: common/utils/itti_analyzer/libui/ui_signal_dissect_view.h modified: common/utils/itti_analyzer/libui/ui_tree_view.c modified: common/utils/itti_analyzer/libui/ui_tree_view.h modified: common/utils/msc/msc.c modified: common/utils/msc/msc.h modified: openair1/PHY/CODING/3gpplte.c modified: openair1/PHY/CODING/3gpplte_sse.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c modified: openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c modified: openair1/PHY/CODING/TESTBENCH/ltetest.c modified: openair1/PHY/CODING/TESTBENCH/pdcch_test.c modified: openair1/PHY/CODING/TESTBENCH/viterbi_test.c modified: openair1/PHY/CODING/ccoding_byte.c modified: openair1/PHY/CODING/ccoding_byte_lte.c modified: openair1/PHY/CODING/crc_byte.c modified: openair1/PHY/CODING/defs.h modified: openair1/PHY/CODING/extern.h modified: openair1/PHY/CODING/extern_3GPPinterleaver.h modified: openair1/PHY/CODING/lte_interleaver.h modified: openair1/PHY/CODING/lte_interleaver2.h modified: openair1/PHY/CODING/lte_interleaver_inline.h modified: openair1/PHY/CODING/lte_rate_matching.c modified: openair1/PHY/CODING/lte_segmentation.c modified: openair1/PHY/CODING/rate_matching.c modified: openair1/PHY/CODING/scrambler.h modified: openair1/PHY/CODING/vars.h modified: openair1/PHY/CODING/viterbi.c modified: openair1/PHY/CODING/viterbi_lte.c modified: openair1/PHY/INIT/defs.h modified: openair1/PHY/INIT/extern.h modified: openair1/PHY/INIT/init_top.c modified: openair1/PHY/INIT/lte_init.c modified: openair1/PHY/INIT/lte_param_init.c modified: openair1/PHY/INIT/lte_parms.c modified: openair1/PHY/INIT/vars.h modified: openair1/PHY/LTE_ESTIMATION/adjust_gain.c modified: openair1/PHY/LTE_ESTIMATION/defs.h modified: openair1/PHY/LTE_ESTIMATION/extern.h modified: openair1/PHY/LTE_ESTIMATION/filt96_32.h modified: openair1/PHY/LTE_ESTIMATION/freq_equalization.c modified: openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c modified: openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c modified: openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c modified: openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c modified: openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c modified: openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c modified: openair1/PHY/LTE_ESTIMATION/lte_sync_time.c modified: openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c modified: openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c modified: openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c modified: openair1/PHY/LTE_ESTIMATION/pss6144.h modified: openair1/PHY/LTE_ESTIMATION/vars.h modified: openair1/PHY/LTE_REFSIG/defs.h modified: openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c modified: openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c modified: openair1/PHY/LTE_REFSIG/lte_dl_uespec.c modified: openair1/PHY/LTE_REFSIG/lte_gold.c modified: openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c modified: openair1/PHY/LTE_REFSIG/lte_ul_ref.c modified: openair1/PHY/LTE_REFSIG/mod_table.h modified: openair1/PHY/LTE_REFSIG/primary_synch.h modified: openair1/PHY/LTE_TRANSPORT/dci.c modified: openair1/PHY/LTE_TRANSPORT/dci.h modified: openair1/PHY/LTE_TRANSPORT/dci_tools.c modified: openair1/PHY/LTE_TRANSPORT/defs.h modified: openair1/PHY/LTE_TRANSPORT/dlsch_coding.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c modified: openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h modified: openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h modified: openair1/PHY/LTE_TRANSPORT/drs_modulation.c modified: openair1/PHY/LTE_TRANSPORT/extern.h modified: openair1/PHY/LTE_TRANSPORT/group_hopping.c modified: openair1/PHY/LTE_TRANSPORT/if4_tools.c modified: openair1/PHY/LTE_TRANSPORT/if4_tools.h modified: openair1/PHY/LTE_TRANSPORT/if5_tools.c modified: openair1/PHY/LTE_TRANSPORT/if5_tools.h modified: openair1/PHY/LTE_TRANSPORT/initial_sync.c modified: openair1/PHY/LTE_TRANSPORT/lte_mcs.c modified: openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h modified: openair1/PHY/LTE_TRANSPORT/pbch.c modified: openair1/PHY/LTE_TRANSPORT/pcfich.c modified: openair1/PHY/LTE_TRANSPORT/pch.c modified: openair1/PHY/LTE_TRANSPORT/phich.c modified: openair1/PHY/LTE_TRANSPORT/pilots.c modified: openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c modified: openair1/PHY/LTE_TRANSPORT/pmch.c modified: openair1/PHY/LTE_TRANSPORT/power_control.c modified: openair1/PHY/LTE_TRANSPORT/prach.c modified: openair1/PHY/LTE_TRANSPORT/prach.h modified: openair1/PHY/LTE_TRANSPORT/print_stats.c modified: openair1/PHY/LTE_TRANSPORT/proto.h modified: openair1/PHY/LTE_TRANSPORT/pss.c modified: openair1/PHY/LTE_TRANSPORT/pucch.c modified: openair1/PHY/LTE_TRANSPORT/rar_tools.c modified: openair1/PHY/LTE_TRANSPORT/srs_modulation.c modified: openair1/PHY/LTE_TRANSPORT/sss.c modified: openair1/PHY/LTE_TRANSPORT/sss.h modified: openair1/PHY/LTE_TRANSPORT/uci.h modified: openair1/PHY/LTE_TRANSPORT/uci_tools.c modified: openair1/PHY/LTE_TRANSPORT/ulsch_coding.c modified: openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c modified: openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c modified: openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c modified: openair1/PHY/LTE_TRANSPORT/vars.h modified: openair1/PHY/MODULATION/defs.h modified: openair1/PHY/MODULATION/extern.h modified: openair1/PHY/MODULATION/kHz_7_5.h modified: openair1/PHY/MODULATION/ofdm_mod.c modified: openair1/PHY/MODULATION/prach625Hz.h modified: openair1/PHY/MODULATION/slot_fep.c modified: openair1/PHY/MODULATION/slot_fep_mbsfn.c modified: openair1/PHY/MODULATION/slot_fep_ul.c modified: openair1/PHY/MODULATION/ul_7_5_kHz.c modified: openair1/PHY/MODULATION/vars.h modified: openair1/PHY/TOOLS/8bit_rxdemux.c modified: openair1/PHY/TOOLS/8bit_txmux.c modified: openair1/PHY/TOOLS/alaw_lut.h modified: openair1/PHY/TOOLS/angle.c modified: openair1/PHY/TOOLS/cadd_sv.c modified: openair1/PHY/TOOLS/cadd_vv.c modified: openair1/PHY/TOOLS/cdot_prod.c modified: openair1/PHY/TOOLS/cmult_sv.c modified: openair1/PHY/TOOLS/cmult_vv.c modified: openair1/PHY/TOOLS/costable.h modified: openair1/PHY/TOOLS/dB_routines.c modified: openair1/PHY/TOOLS/dB_routines.h modified: openair1/PHY/TOOLS/defs.h modified: openair1/PHY/TOOLS/extern.h modified: openair1/PHY/TOOLS/file_output.c modified: openair1/PHY/TOOLS/invSqrt.c modified: openair1/PHY/TOOLS/log2_approx.c modified: openair1/PHY/TOOLS/lte_dfts.c modified: openair1/PHY/TOOLS/lte_phy_scope.c modified: openair1/PHY/TOOLS/lte_phy_scope.h modified: openair1/PHY/TOOLS/lut.c modified: openair1/PHY/TOOLS/memory_routines.c modified: openair1/PHY/TOOLS/signal_energy.c modified: openair1/PHY/TOOLS/smbv.c modified: openair1/PHY/TOOLS/smbv.h modified: openair1/PHY/TOOLS/sqrt.c modified: openair1/PHY/TOOLS/time_meas.c modified: openair1/PHY/TOOLS/time_meas.h modified: openair1/PHY/TOOLS/twiddle12288.h modified: openair1/PHY/TOOLS/twiddle1536.h modified: openair1/PHY/TOOLS/twiddle24576.h modified: openair1/PHY/TOOLS/twiddle6144.h modified: openair1/PHY/TOOLS/twiddles4096.h modified: openair1/PHY/TOOLS/twiddles8192.h modified: openair1/PHY/TOOLS/vars.h modified: openair1/PHY/defs.h modified: openair1/PHY/extern.h modified: openair1/PHY/impl_defs_lte.h modified: openair1/PHY/impl_defs_top.h modified: openair1/PHY/sse_intrin.h modified: openair1/PHY/types.h modified: openair1/PHY/vars.h modified: openair1/SCHED/defs.h modified: openair1/SCHED/extern.h modified: openair1/SCHED/phy_mac_stub.c modified: openair1/SCHED/phy_procedures_emos.h modified: openair1/SCHED/phy_procedures_lte_common.c modified: openair1/SCHED/phy_procedures_lte_eNb.c modified: openair1/SCHED/phy_procedures_lte_ue.c modified: openair1/SCHED/pucch_pc.c modified: openair1/SCHED/pusch_pc.c modified: openair1/SCHED/rt_compat.h modified: openair1/SCHED/vars.h modified: openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c modified: openair1/SIMULATION/ETH_TRANSPORT/defs.h modified: openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c modified: openair1/SIMULATION/ETH_TRANSPORT/extern.h modified: openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c modified: openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h modified: openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c modified: openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c modified: openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h modified: openair1/SIMULATION/ETH_TRANSPORT/proto.h modified: openair1/SIMULATION/ETH_TRANSPORT/socket.c modified: openair1/SIMULATION/ETH_TRANSPORT/socket.h modified: openair1/SIMULATION/ETH_TRANSPORT/vars.h modified: openair1/SIMULATION/LTE_PHY/LTE_Configuration.c modified: openair1/SIMULATION/LTE_PHY/LTE_Configuration.h modified: openair1/SIMULATION/LTE_PHY/dlsim.c modified: openair1/SIMULATION/LTE_PHY/framegen.c modified: openair1/SIMULATION/LTE_PHY/gpib_send.c modified: openair1/SIMULATION/LTE_PHY/gpib_send.h modified: openair1/SIMULATION/LTE_PHY/mbmssim.c modified: openair1/SIMULATION/LTE_PHY/pbchsim.c modified: openair1/SIMULATION/LTE_PHY/pdcchsim.c modified: openair1/SIMULATION/LTE_PHY/prachsim.c modified: openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h modified: openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c modified: openair1/SIMULATION/LTE_PHY/pucchsim.c modified: openair1/SIMULATION/LTE_PHY/scansim.c modified: openair1/SIMULATION/LTE_PHY/signalanalyzer.c modified: openair1/SIMULATION/LTE_PHY/signalanalyzer.h modified: openair1/SIMULATION/LTE_PHY/syncsim.c modified: openair1/SIMULATION/LTE_PHY/test.c modified: openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c modified: openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h modified: openair1/SIMULATION/LTE_PHY/ulsim.c modified: openair1/SIMULATION/LTE_PHY/ulsim2.c modified: openair1/SIMULATION/LTE_PHY/unitary_defs.h modified: openair1/SIMULATION/RF/adc.c modified: openair1/SIMULATION/RF/dac.c modified: openair1/SIMULATION/RF/defs.h modified: openair1/SIMULATION/RF/rf.c modified: openair1/SIMULATION/TOOLS/abstraction.c modified: openair1/SIMULATION/TOOLS/ch_desc_proto.c modified: openair1/SIMULATION/TOOLS/defs.h modified: openair1/SIMULATION/TOOLS/gauss.c modified: openair1/SIMULATION/TOOLS/llr_quantization.c modified: openair1/SIMULATION/TOOLS/multipath_channel.c modified: openair1/SIMULATION/TOOLS/multipath_tv_channel.c modified: openair1/SIMULATION/TOOLS/random_channel.c modified: openair1/SIMULATION/TOOLS/rangen_double.c modified: openair1/SIMULATION/TOOLS/scm_corrmat.h modified: openair1/SIMULATION/TOOLS/taus.c modified: openair2/COMMON/as_message.h modified: openair2/COMMON/commonDef.h modified: openair2/COMMON/gtpv1_u_messages_def.h modified: openair2/COMMON/gtpv1_u_messages_types.h modified: openair2/COMMON/intertask_interface_conf.h modified: openair2/COMMON/mac_messages_def.h modified: openair2/COMMON/mac_messages_types.h modified: openair2/COMMON/mac_primitives.h modified: openair2/COMMON/mac_rlc_primitives.h modified: openair2/COMMON/mac_rrc_primitives.h modified: openair2/COMMON/messages_def.h modified: openair2/COMMON/messages_types.h modified: openair2/COMMON/nas_messages_def.h modified: openair2/COMMON/nas_messages_types.h modified: openair2/COMMON/networkDef.h modified: openair2/COMMON/openair_defs.h modified: openair2/COMMON/openair_types.h modified: openair2/COMMON/pdcp_messages_def.h modified: openair2/COMMON/pdcp_messages_types.h modified: openair2/COMMON/phy_messages_def.h modified: openair2/COMMON/phy_messages_types.h modified: openair2/COMMON/platform_constants.h modified: openair2/COMMON/platform_types.h modified: openair2/COMMON/ral_messages_def.h modified: openair2/COMMON/ral_messages_types.h modified: openair2/COMMON/rlc_messages_def.h modified: openair2/COMMON/rlc_messages_types.h modified: openair2/COMMON/rrc_messages_def.h modified: openair2/COMMON/rrc_messages_types.h modified: openair2/COMMON/rrm_config_structs.h modified: openair2/COMMON/rrm_constants.h modified: openair2/COMMON/rtos_header.h modified: openair2/COMMON/s1ap_messages_def.h modified: openair2/COMMON/s1ap_messages_types.h modified: openair2/COMMON/sctp_messages_def.h modified: openair2/COMMON/sctp_messages_types.h modified: openair2/COMMON/tasks_def.h modified: openair2/COMMON/udp_messages_def.h modified: openair2/COMMON/udp_messages_types.h modified: openair2/COMMON/x2ap_messages_def.h modified: openair2/COMMON/x2ap_messages_types.h modified: openair2/DOCS/TEMPLATES/CODE/example_doxy.h modified: openair2/ENB_APP/enb_app.c modified: openair2/ENB_APP/enb_app.h modified: openair2/ENB_APP/enb_config.c modified: openair2/ENB_APP/enb_config.h modified: openair2/LAYER2/MAC/config.c modified: openair2/LAYER2/MAC/defs.h modified: openair2/LAYER2/MAC/eNB_scheduler.c modified: openair2/LAYER2/MAC/eNB_scheduler_RA.c modified: openair2/LAYER2/MAC/eNB_scheduler_bch.c modified: openair2/LAYER2/MAC/eNB_scheduler_dlsch.c modified: openair2/LAYER2/MAC/eNB_scheduler_mch.c modified: openair2/LAYER2/MAC/eNB_scheduler_primitives.c modified: openair2/LAYER2/MAC/eNB_scheduler_ulsch.c modified: openair2/LAYER2/MAC/extern.h modified: openair2/LAYER2/MAC/l1_helpers.c modified: openair2/LAYER2/MAC/lte_transport_init.c modified: openair2/LAYER2/MAC/main.c modified: openair2/LAYER2/MAC/openair2_proc.c modified: openair2/LAYER2/MAC/pre_processor.c modified: openair2/LAYER2/MAC/proto.h modified: openair2/LAYER2/MAC/ra_procedures.c modified: openair2/LAYER2/MAC/rar_tools.c modified: openair2/LAYER2/MAC/ue_procedures.c modified: openair2/LAYER2/MAC/vars.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c modified: openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c modified: openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h modified: openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c modified: openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h modified: openair2/LAYER2/RLC/mac_primitives.h modified: openair2/LAYER2/RLC/rlc.c modified: openair2/LAYER2/RLC/rlc.h modified: openair2/LAYER2/RLC/rlc_def.h modified: openair2/LAYER2/RLC/rlc_def_lte.h modified: openair2/LAYER2/RLC/rlc_mac.c modified: openair2/LAYER2/RLC/rlc_mpls.c modified: openair2/LAYER2/RLC/rlc_primitives.h modified: openair2/LAYER2/RLC/rlc_rrc.c modified: openair2/LAYER2/layer2_top.c modified: openair2/LAYER2/openair2_proc.c modified: openair2/LAYER2/register.c modified: openair2/LAYER2/register.h modified: openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c modified: openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c modified: openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c modified: openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h modified: openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c modified: openair2/NAS/DRIVER/CELLULAR/NETLTEST/nettestPDCP.c modified: openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h modified: openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c modified: openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c modified: openair2/NAS/nas_ue_task.h modified: openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c modified: openair2/NETWORK_DRIVER/LITE/classifier.c modified: openair2/NETWORK_DRIVER/LITE/common.c modified: openair2/NETWORK_DRIVER/LITE/constant.h modified: openair2/NETWORK_DRIVER/LITE/device.c modified: openair2/NETWORK_DRIVER/LITE/ioctl.c modified: openair2/NETWORK_DRIVER/LITE/ioctl.h modified: openair2/NETWORK_DRIVER/LITE/local.h modified: openair2/NETWORK_DRIVER/LITE/netlink.c modified: openair2/NETWORK_DRIVER/LITE/proto_extern.h modified: openair2/NETWORK_DRIVER/LITE/sap.h modified: openair2/NETWORK_DRIVER/LITE/tool.c modified: openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c modified: openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c modified: openair2/NETWORK_DRIVER/MESH/classifier.c modified: openair2/NETWORK_DRIVER/MESH/common.c modified: openair2/NETWORK_DRIVER/MESH/constant.h modified: openair2/NETWORK_DRIVER/MESH/device.c modified: openair2/NETWORK_DRIVER/MESH/ioctl.c modified: openair2/NETWORK_DRIVER/MESH/ioctl.h modified: openair2/NETWORK_DRIVER/MESH/local.h modified: openair2/NETWORK_DRIVER/MESH/mesh.c modified: openair2/NETWORK_DRIVER/MESH/netlink.c modified: openair2/NETWORK_DRIVER/MESH/proto_extern.h modified: openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h modified: openair2/NETWORK_DRIVER/MESH/sap.h modified: openair2/NETWORK_DRIVER/MESH/tool.c modified: openair2/NETWORK_DRIVER/UE_IP/common.c modified: openair2/NETWORK_DRIVER/UE_IP/constant.h modified: openair2/NETWORK_DRIVER/UE_IP/device.c modified: openair2/NETWORK_DRIVER/UE_IP/local.h modified: openair2/NETWORK_DRIVER/UE_IP/netlink.c modified: openair2/NETWORK_DRIVER/UE_IP/proto_extern.h modified: openair2/NETWORK_DRIVER/UE_IP/sap.h modified: openair2/PHY_INTERFACE/defs.h modified: openair2/PHY_INTERFACE/extern.h modified: openair2/PHY_INTERFACE/mac_phy_primitives.c modified: openair2/PHY_INTERFACE/mac_phy_primitives.h modified: openair2/PHY_INTERFACE/vars.h modified: openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c modified: openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h modified: openair2/RRC/LITE/L2_interface.c modified: openair2/RRC/LITE/MESSAGES/asn1_msg.c modified: openair2/RRC/LITE/MESSAGES/asn1_msg.h modified: openair2/RRC/LITE/MESSAGES/rtai_mem.c modified: openair2/RRC/LITE/MESSAGES/rtai_mem.h modified: openair2/RRC/LITE/defs.h modified: openair2/RRC/LITE/extern.h modified: openair2/RRC/LITE/mesh_top.c modified: openair2/RRC/LITE/plmn_data.h modified: openair2/RRC/LITE/proto.h modified: openair2/RRC/LITE/rrc_2_rrm_msg.c modified: openair2/RRC/LITE/rrc_UE.c modified: openair2/RRC/LITE/rrc_UE_ral.c modified: openair2/RRC/LITE/rrc_UE_ral.h modified: openair2/RRC/LITE/rrc_common.c modified: openair2/RRC/LITE/rrc_config.c modified: openair2/RRC/LITE/rrc_eNB.c modified: openair2/RRC/LITE/rrc_eNB_GTPV1U.c modified: openair2/RRC/LITE/rrc_eNB_GTPV1U.h modified: openair2/RRC/LITE/rrc_eNB_S1AP.c modified: openair2/RRC/LITE/rrc_eNB_S1AP.h modified: openair2/RRC/LITE/rrc_eNB_UE_context.c modified: openair2/RRC/LITE/rrc_eNB_UE_context.h modified: openair2/RRC/LITE/rrc_eNB_ral.c modified: openair2/RRC/LITE/rrc_eNB_ral.h modified: openair2/RRC/LITE/rrc_rrm_interface.c modified: openair2/RRC/LITE/rrc_rrm_interface.h modified: openair2/RRC/LITE/rrc_types.h modified: openair2/RRC/LITE/rrm_2_rrc_msg.c modified: openair2/RRC/LITE/utils.c modified: openair2/RRC/LITE/vars.h modified: openair2/RRC/NAS/nas_config.c modified: openair2/RRC/NAS/nas_config.h modified: openair2/RRC/NAS/rb_config.c modified: openair2/RRC/NAS/rb_config.h modified: openair2/RRM_4_RRC_LITE/src/com/Message.cpp modified: openair2/RRM_4_RRC_LITE/src/com/Message.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h modified: openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h modified: openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp modified: openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h modified: openair2/RRM_4_RRC_LITE/src/platform.h modified: openair2/RRM_4_RRC_LITE/src/platform_constants.h modified: openair2/RRM_4_RRC_LITE/src/platform_defines.h modified: openair2/RRM_4_RRC_LITE/src/platform_dim.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp modified: openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h modified: openair2/RRM_4_RRC_LITE/src/rrm.cpp modified: openair2/RRM_4_RRC_LITE/src/test/TestScenario.cpp modified: openair2/RRM_4_RRC_LITE/src/test/TestScenario.h modified: openair2/RRM_4_RRC_LITE/src/test/test.cpp modified: openair2/RRM_4_RRC_LITE/src/version.h modified: openair2/UTIL/BIGPHYS/bigphys.c modified: openair2/UTIL/BIGPHYS/defs.h modified: openair2/UTIL/CLI/cli.c modified: openair2/UTIL/CLI/cli.h modified: openair2/UTIL/CLI/cli_cmd.c modified: openair2/UTIL/CLI/cli_if.h modified: openair2/UTIL/CLI/cli_server.c modified: openair2/UTIL/FIFO/pad_list.c modified: openair2/UTIL/FIFO/pad_list.h modified: openair2/UTIL/FIFO/types.h modified: openair2/UTIL/LISTS/list.c modified: openair2/UTIL/LISTS/list.h modified: openair2/UTIL/LISTS/list2.c modified: openair2/UTIL/LOG/log.c modified: openair2/UTIL/LOG/log.h modified: openair2/UTIL/LOG/log_extern.h modified: openair2/UTIL/LOG/log_if.h modified: openair2/UTIL/LOG/vcd_signal_dumper.c modified: openair2/UTIL/LOG/vcd_signal_dumper.h modified: openair2/UTIL/MATH/crc_byte.c modified: openair2/UTIL/MATH/oml.c modified: openair2/UTIL/MATH/oml.h modified: openair2/UTIL/MATH/random.c modified: openair2/UTIL/MATH/random_proto_extern.h modified: openair2/UTIL/MATH/taus.c modified: openair2/UTIL/MEM/mem_block.c modified: openair2/UTIL/MEM/mem_block.h modified: openair2/UTIL/MEM/mem_mngt.c modified: openair2/UTIL/MEM/mem_mngt_proto_extern.h modified: openair2/UTIL/MEM/mem_pool.h modified: openair2/UTIL/OCG/OCG.c modified: openair2/UTIL/OCG/OCG.h modified: openair2/UTIL/OCG/OCG_call_emu.c modified: openair2/UTIL/OCG/OCG_call_emu.h modified: openair2/UTIL/OCG/OCG_config_mobi.c modified: openair2/UTIL/OCG/OCG_config_mobi.h modified: openair2/UTIL/OCG/OCG_create_dir.c modified: openair2/UTIL/OCG/OCG_create_dir.h modified: openair2/UTIL/OCG/OCG_detect_file.c modified: openair2/UTIL/OCG/OCG_detect_file.h modified: openair2/UTIL/OCG/OCG_extern.h modified: openair2/UTIL/OCG/OCG_generate_report.c modified: openair2/UTIL/OCG/OCG_generate_report.h modified: openair2/UTIL/OCG/OCG_get_opt.c modified: openair2/UTIL/OCG/OCG_get_opt.h modified: openair2/UTIL/OCG/OCG_if.h modified: openair2/UTIL/OCG/OCG_parse_XML.c modified: openair2/UTIL/OCG/OCG_parse_XML.h modified: openair2/UTIL/OCG/OCG_parse_filename.c modified: openair2/UTIL/OCG/OCG_parse_filename.h modified: openair2/UTIL/OCG/OCG_save_XML.c modified: openair2/UTIL/OCG/OCG_save_XML.h modified: openair2/UTIL/OCG/OCG_vars.h modified: openair2/UTIL/OMG/client_traci_OMG.c modified: openair2/UTIL/OMG/client_traci_OMG.h modified: openair2/UTIL/OMG/common.c modified: openair2/UTIL/OMG/defs.h modified: openair2/UTIL/OMG/grid.c modified: openair2/UTIL/OMG/grid.h modified: openair2/UTIL/OMG/id_manager.c modified: openair2/UTIL/OMG/id_manager.h modified: openair2/UTIL/OMG/job.c modified: openair2/UTIL/OMG/mobility_parser.c modified: openair2/UTIL/OMG/mobility_parser.h modified: openair2/UTIL/OMG/omg.c modified: openair2/UTIL/OMG/omg.h modified: openair2/UTIL/OMG/omg_constants.h modified: openair2/UTIL/OMG/omg_hashtable.c modified: openair2/UTIL/OMG/omg_hashtable.h modified: openair2/UTIL/OMG/omg_vars.h modified: openair2/UTIL/OMG/rwalk.c modified: openair2/UTIL/OMG/rwalk.h modified: openair2/UTIL/OMG/rwp.c modified: openair2/UTIL/OMG/rwp.h modified: openair2/UTIL/OMG/socket_traci_OMG.c modified: openair2/UTIL/OMG/socket_traci_OMG.h modified: openair2/UTIL/OMG/static.c modified: openair2/UTIL/OMG/static.h modified: openair2/UTIL/OMG/steadystaterwp.c modified: openair2/UTIL/OMG/steadystaterwp.h modified: openair2/UTIL/OMG/storage_traci_OMG.c modified: openair2/UTIL/OMG/storage_traci_OMG.h modified: openair2/UTIL/OMG/sumo.c modified: openair2/UTIL/OMG/sumo.h modified: openair2/UTIL/OMG/trace.c modified: openair2/UTIL/OMG/trace.h modified: openair2/UTIL/OMG/trace_hashtable.c modified: openair2/UTIL/OMG/trace_hashtable.h modified: openair2/UTIL/OMV/communicationthread.cpp modified: openair2/UTIL/OMV/communicationthread.h modified: openair2/UTIL/OMV/mywindow.cpp modified: openair2/UTIL/OMV/mywindow.h modified: openair2/UTIL/OMV/omv.cpp modified: openair2/UTIL/OMV/openglwidget.cpp modified: openair2/UTIL/OMV/openglwidget.h modified: openair2/UTIL/OMV/structures.h modified: openair2/UTIL/OPT/opt.h modified: openair2/UTIL/OPT/socket_sender.c modified: openair2/UTIL/OPT/vars.h modified: openair2/UTIL/OSA/osa_defs.h modified: openair2/UTIL/OSA/osa_internal.h modified: openair2/UTIL/OSA/osa_key_deriver.c modified: openair2/UTIL/OSA/osa_rijndael.c modified: openair2/UTIL/OSA/osa_rijndael.h modified: openair2/UTIL/OSA/osa_snow3g.c modified: openair2/UTIL/OSA/osa_snow3g.h modified: openair2/UTIL/OSA/osa_stream_eea.c modified: openair2/UTIL/OSA/osa_stream_eia.c modified: openair2/UTIL/OTG/main.c modified: openair2/UTIL/OTG/otg.c modified: openair2/UTIL/OTG/otg.h modified: openair2/UTIL/OTG/otg_config.h modified: openair2/UTIL/OTG/otg_defs.h modified: openair2/UTIL/OTG/otg_externs.h modified: openair2/UTIL/OTG/otg_form.c modified: openair2/UTIL/OTG/otg_form.h modified: openair2/UTIL/OTG/otg_kpi.c modified: openair2/UTIL/OTG/otg_kpi.h modified: openair2/UTIL/OTG/otg_models.c modified: openair2/UTIL/OTG/otg_models.h modified: openair2/UTIL/OTG/otg_rx.c modified: openair2/UTIL/OTG/otg_rx.h modified: openair2/UTIL/OTG/otg_rx_socket.c modified: openair2/UTIL/OTG/otg_rx_socket.h modified: openair2/UTIL/OTG/otg_tx.c modified: openair2/UTIL/OTG/otg_tx.h modified: openair2/UTIL/OTG/otg_tx_socket.c modified: openair2/UTIL/OTG/otg_tx_socket.h modified: openair2/UTIL/OTG/otg_vars.h modified: openair2/UTIL/OTG/traffic_config.h modified: openair2/UTIL/TIMER/umts_timer.c modified: openair2/UTIL/TIMER/umts_timer.h modified: openair2/UTIL/TIMER/umts_timer_proto_extern.h modified: openair2/UTIL/TIMER/umts_timer_struct.h modified: openair2/UTIL/TRACE/fifo_printf.c modified: openair2/UTIL/TRACE/fifo_printf.h modified: openair2/UTIL/TRACE/fifo_printf_proto_extern.h modified: openair2/UTIL/TRACE/print.h modified: openair2/X2AP/x2ap.c modified: openair2/X2AP/x2ap.h modified: openair2/X2AP/x2ap_common.c modified: openair2/X2AP/x2ap_common.h modified: openair3/COMMON/common_types.h modified: openair3/COMMON/gtpv1_u_messages_def.h modified: openair3/COMMON/gtpv1_u_messages_types.h modified: openair3/COMMON/intertask_interface_conf.h modified: openair3/COMMON/messages_def.h modified: openair3/COMMON/messages_types.h modified: openair3/COMMON/nas_messages_def.h modified: openair3/COMMON/nas_messages_types.h modified: openair3/COMMON/s1ap_messages_def.h modified: openair3/COMMON/s1ap_messages_types.h modified: openair3/COMMON/sctp_messages_def.h modified: openair3/COMMON/sctp_messages_types.h modified: openair3/COMMON/security_types.h modified: openair3/COMMON/tasks_def.h modified: openair3/COMMON/udp_messages_def.h modified: openair3/COMMON/udp_messages_types.h modified: openair3/GTPV1-U/gtpv1u.h modified: openair3/GTPV1-U/gtpv1u_eNB.c modified: openair3/GTPV1-U/gtpv1u_eNB_defs.h modified: openair3/GTPV1-U/gtpv1u_eNB_task.h modified: openair3/GTPV1-U/gtpv1u_sgw_defs.h modified: openair3/GTPV1-U/gtpv1u_task.c modified: openair3/GTPV1-U/gtpv1u_teid_pool.c modified: openair3/NAS/COMMON/API/NETWORK/as_message.c modified: openair3/NAS/COMMON/API/NETWORK/l2_message.h modified: openair3/NAS/COMMON/API/NETWORK/nas_message.c modified: openair3/NAS/COMMON/API/NETWORK/nas_message.h modified: openair3/NAS/COMMON/API/NETWORK/network_api.c modified: openair3/NAS/COMMON/API/NETWORK/network_api.h modified: openair3/NAS/COMMON/EMM/MSG/AttachAccept.c modified: openair3/NAS/COMMON/EMM/MSG/AttachAccept.h modified: openair3/NAS/COMMON/EMM/MSG/AttachComplete.c modified: openair3/NAS/COMMON/EMM/MSG/AttachComplete.h modified: openair3/NAS/COMMON/EMM/MSG/AttachReject.c modified: openair3/NAS/COMMON/EMM/MSG/AttachReject.h modified: openair3/NAS/COMMON/EMM/MSG/AttachRequest.c modified: openair3/NAS/COMMON/EMM/MSG/AttachRequest.h modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c modified: openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h modified: openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c modified: openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h modified: openair3/NAS/COMMON/EMM/MSG/DetachAccept.c modified: openair3/NAS/COMMON/EMM/MSG/DetachAccept.h modified: openair3/NAS/COMMON/EMM/MSG/DetachRequest.c modified: openair3/NAS/COMMON/EMM/MSG/DetachRequest.h modified: openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c modified: openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h modified: openair3/NAS/COMMON/EMM/MSG/EmmInformation.c modified: openair3/NAS/COMMON/EMM/MSG/EmmInformation.h modified: openair3/NAS/COMMON/EMM/MSG/EmmStatus.c modified: openair3/NAS/COMMON/EMM/MSG/EmmStatus.h modified: openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c modified: openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h modified: openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c modified: openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h modified: openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c modified: openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h modified: openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c modified: openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h modified: openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c modified: openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h modified: openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h modified: openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h modified: openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c modified: openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c modified: openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c modified: openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h modified: openair3/NAS/COMMON/EMM/MSG/ServiceReject.c modified: openair3/NAS/COMMON/EMM/MSG/ServiceReject.h modified: openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c modified: openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c modified: openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h modified: openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c modified: openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h modified: openair3/NAS/COMMON/EMM/MSG/emm_cause.h modified: openair3/NAS/COMMON/EMM/MSG/emm_msg.c modified: openair3/NAS/COMMON/EMM/MSG/emm_msg.h modified: openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c modified: openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c modified: openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h modified: openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c modified: openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h modified: openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c modified: openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h modified: openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c modified: openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h modified: openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c modified: openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h modified: openair3/NAS/COMMON/ESM/MSG/EsmStatus.c modified: openair3/NAS/COMMON/ESM/MSG/EsmStatus.h modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c modified: openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h modified: openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c modified: openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h modified: openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c modified: openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h modified: openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c modified: openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h modified: openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c modified: openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h modified: openair3/NAS/COMMON/ESM/MSG/esm_cause.h modified: openair3/NAS/COMMON/ESM/MSG/esm_msg.c modified: openair3/NAS/COMMON/ESM/MSG/esm_msg.h modified: openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h modified: openair3/NAS/COMMON/IES/AccessPointName.c modified: openair3/NAS/COMMON/IES/AccessPointName.h modified: openair3/NAS/COMMON/IES/AdditionalUpdateResult.c modified: openair3/NAS/COMMON/IES/AdditionalUpdateResult.h modified: openair3/NAS/COMMON/IES/AdditionalUpdateType.c modified: openair3/NAS/COMMON/IES/AdditionalUpdateType.h modified: openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c modified: openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h modified: openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c modified: openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h modified: openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c modified: openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h modified: openair3/NAS/COMMON/IES/AuthenticationParameterRand.c modified: openair3/NAS/COMMON/IES/AuthenticationParameterRand.h modified: openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c modified: openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h modified: openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c modified: openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h modified: openair3/NAS/COMMON/IES/Cli.c modified: openair3/NAS/COMMON/IES/Cli.h modified: openair3/NAS/COMMON/IES/CsfbResponse.c modified: openair3/NAS/COMMON/IES/CsfbResponse.h modified: openair3/NAS/COMMON/IES/DaylightSavingTime.c modified: openair3/NAS/COMMON/IES/DaylightSavingTime.h modified: openair3/NAS/COMMON/IES/DetachType.c modified: openair3/NAS/COMMON/IES/DetachType.h modified: openair3/NAS/COMMON/IES/DrxParameter.c modified: openair3/NAS/COMMON/IES/DrxParameter.h modified: openair3/NAS/COMMON/IES/EmergencyNumberList.c modified: openair3/NAS/COMMON/IES/EmergencyNumberList.h modified: openair3/NAS/COMMON/IES/EmmCause.c modified: openair3/NAS/COMMON/IES/EmmCause.h modified: openair3/NAS/COMMON/IES/EpsAttachResult.c modified: openair3/NAS/COMMON/IES/EpsAttachResult.h modified: openair3/NAS/COMMON/IES/EpsAttachType.c modified: openair3/NAS/COMMON/IES/EpsAttachType.h modified: openair3/NAS/COMMON/IES/EpsBearerContextStatus.c modified: openair3/NAS/COMMON/IES/EpsBearerContextStatus.h modified: openair3/NAS/COMMON/IES/EpsBearerIdentity.c modified: openair3/NAS/COMMON/IES/EpsBearerIdentity.h modified: openair3/NAS/COMMON/IES/EpsMobileIdentity.c modified: openair3/NAS/COMMON/IES/EpsMobileIdentity.h modified: openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c modified: openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h modified: openair3/NAS/COMMON/IES/EpsQualityOfService.c modified: openair3/NAS/COMMON/IES/EpsQualityOfService.h modified: openair3/NAS/COMMON/IES/EpsUpdateResult.c modified: openair3/NAS/COMMON/IES/EpsUpdateResult.h modified: openair3/NAS/COMMON/IES/EpsUpdateType.c modified: openair3/NAS/COMMON/IES/EpsUpdateType.h modified: openair3/NAS/COMMON/IES/EsmCause.c modified: openair3/NAS/COMMON/IES/EsmCause.h modified: openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c modified: openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h modified: openair3/NAS/COMMON/IES/EsmMessageContainer.c modified: openair3/NAS/COMMON/IES/EsmMessageContainer.h modified: openair3/NAS/COMMON/IES/GprsTimer.c modified: openair3/NAS/COMMON/IES/GprsTimer.h modified: openair3/NAS/COMMON/IES/GutiType.c modified: openair3/NAS/COMMON/IES/GutiType.h modified: openair3/NAS/COMMON/IES/IdentityType2.c modified: openair3/NAS/COMMON/IES/IdentityType2.h modified: openair3/NAS/COMMON/IES/ImeisvRequest.c modified: openair3/NAS/COMMON/IES/ImeisvRequest.h modified: openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c modified: openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h modified: openair3/NAS/COMMON/IES/LcsClientIdentity.c modified: openair3/NAS/COMMON/IES/LcsClientIdentity.h modified: openair3/NAS/COMMON/IES/LcsIndicator.c modified: openair3/NAS/COMMON/IES/LcsIndicator.h modified: openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c modified: openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h modified: openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c modified: openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h modified: openair3/NAS/COMMON/IES/LocationAreaIdentification.c modified: openair3/NAS/COMMON/IES/LocationAreaIdentification.h modified: openair3/NAS/COMMON/IES/MessageType.c modified: openair3/NAS/COMMON/IES/MessageType.h modified: openair3/NAS/COMMON/IES/MobileIdentity.c modified: openair3/NAS/COMMON/IES/MobileIdentity.h modified: openair3/NAS/COMMON/IES/MobileStationClassmark2.c modified: openair3/NAS/COMMON/IES/MobileStationClassmark2.h modified: openair3/NAS/COMMON/IES/MobileStationClassmark3.c modified: openair3/NAS/COMMON/IES/MobileStationClassmark3.h modified: openair3/NAS/COMMON/IES/MsNetworkCapability.c modified: openair3/NAS/COMMON/IES/MsNetworkCapability.h modified: openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c modified: openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h modified: openair3/NAS/COMMON/IES/NasKeySetIdentifier.c modified: openair3/NAS/COMMON/IES/NasKeySetIdentifier.h modified: openair3/NAS/COMMON/IES/NasMessageContainer.c modified: openair3/NAS/COMMON/IES/NasMessageContainer.h modified: openair3/NAS/COMMON/IES/NasRequestType.c modified: openair3/NAS/COMMON/IES/NasRequestType.h modified: openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c modified: openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h modified: openair3/NAS/COMMON/IES/NetworkName.c modified: openair3/NAS/COMMON/IES/NetworkName.h modified: openair3/NAS/COMMON/IES/Nonce.c modified: openair3/NAS/COMMON/IES/Nonce.h modified: openair3/NAS/COMMON/IES/PTmsiSignature.c modified: openair3/NAS/COMMON/IES/PTmsiSignature.h modified: openair3/NAS/COMMON/IES/PacketFlowIdentifier.c modified: openair3/NAS/COMMON/IES/PacketFlowIdentifier.h modified: openair3/NAS/COMMON/IES/PagingIdentity.c modified: openair3/NAS/COMMON/IES/PagingIdentity.h modified: openair3/NAS/COMMON/IES/PdnAddress.c modified: openair3/NAS/COMMON/IES/PdnAddress.h modified: openair3/NAS/COMMON/IES/PdnType.c modified: openair3/NAS/COMMON/IES/PdnType.h modified: openair3/NAS/COMMON/IES/PlmnList.c modified: openair3/NAS/COMMON/IES/PlmnList.h modified: openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c modified: openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h modified: openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c modified: openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h modified: openair3/NAS/COMMON/IES/ProtocolDiscriminator.c modified: openair3/NAS/COMMON/IES/ProtocolDiscriminator.h modified: openair3/NAS/COMMON/IES/QualityOfService.c modified: openair3/NAS/COMMON/IES/QualityOfService.h modified: openair3/NAS/COMMON/IES/RadioPriority.c modified: openair3/NAS/COMMON/IES/RadioPriority.h modified: openair3/NAS/COMMON/IES/SecurityHeaderType.c modified: openair3/NAS/COMMON/IES/SecurityHeaderType.h modified: openair3/NAS/COMMON/IES/ServiceType.c modified: openair3/NAS/COMMON/IES/ServiceType.h modified: openair3/NAS/COMMON/IES/ShortMac.c modified: openair3/NAS/COMMON/IES/ShortMac.h modified: openair3/NAS/COMMON/IES/SsCode.c modified: openair3/NAS/COMMON/IES/SsCode.h modified: openair3/NAS/COMMON/IES/SupportedCodecList.c modified: openair3/NAS/COMMON/IES/SupportedCodecList.h modified: openair3/NAS/COMMON/IES/TimeZone.c modified: openair3/NAS/COMMON/IES/TimeZone.h modified: openair3/NAS/COMMON/IES/TimeZoneAndTime.c modified: openair3/NAS/COMMON/IES/TimeZoneAndTime.h modified: openair3/NAS/COMMON/IES/TmsiStatus.c modified: openair3/NAS/COMMON/IES/TmsiStatus.h modified: openair3/NAS/COMMON/IES/TrackingAreaIdentity.c modified: openair3/NAS/COMMON/IES/TrackingAreaIdentity.h modified: openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c modified: openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h modified: openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c modified: openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h modified: openair3/NAS/COMMON/IES/TrafficFlowTemplate.c modified: openair3/NAS/COMMON/IES/TrafficFlowTemplate.h modified: openair3/NAS/COMMON/IES/TransactionIdentifier.c modified: openair3/NAS/COMMON/IES/TransactionIdentifier.h modified: openair3/NAS/COMMON/IES/UeNetworkCapability.c modified: openair3/NAS/COMMON/IES/UeNetworkCapability.h modified: openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c modified: openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h modified: openair3/NAS/COMMON/IES/UeSecurityCapability.c modified: openair3/NAS/COMMON/IES/UeSecurityCapability.h modified: openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c modified: openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h modified: openair3/NAS/COMMON/UTIL/OctetString.c modified: openair3/NAS/COMMON/UTIL/OctetString.h modified: openair3/NAS/COMMON/UTIL/TLVDecoder.c modified: openair3/NAS/COMMON/UTIL/TLVDecoder.h modified: openair3/NAS/COMMON/UTIL/TLVEncoder.c modified: openair3/NAS/COMMON/UTIL/TLVEncoder.h modified: openair3/NAS/COMMON/UTIL/device.c modified: openair3/NAS/COMMON/UTIL/device.h modified: openair3/NAS/COMMON/UTIL/memory.c modified: openair3/NAS/COMMON/UTIL/memory.h modified: openair3/NAS/COMMON/UTIL/nas_log.c modified: openair3/NAS/COMMON/UTIL/nas_log.h modified: openair3/NAS/COMMON/UTIL/nas_timer.c modified: openair3/NAS/COMMON/UTIL/nas_timer.h modified: openair3/NAS/COMMON/UTIL/parser.c modified: openair3/NAS/COMMON/UTIL/parser.h modified: openair3/NAS/COMMON/UTIL/socket.c modified: openair3/NAS/COMMON/UTIL/socket.h modified: openair3/NAS/COMMON/UTIL/stty.c modified: openair3/NAS/COMMON/UTIL/tst/timer.c modified: openair3/NAS/COMMON/securityDef.h modified: openair3/NAS/COMMON/userDef.h modified: openair3/NAS/TEST/AS_SIMULATOR/as_data.c modified: openair3/NAS/TEST/AS_SIMULATOR/as_data.h modified: openair3/NAS/TEST/AS_SIMULATOR/as_process.c modified: openair3/NAS/TEST/AS_SIMULATOR/as_process.h modified: openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c modified: openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c modified: openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h modified: openair3/NAS/TEST/AS_SIMULATOR/nas_data.c modified: openair3/NAS/TEST/AS_SIMULATOR/nas_data.h modified: openair3/NAS/TEST/AS_SIMULATOR/nas_process.c modified: openair3/NAS/TEST/AS_SIMULATOR/nas_process.h modified: openair3/NAS/TEST/NETWORK/network_parser.c modified: openair3/NAS/TEST/NETWORK/network_parser.h modified: openair3/NAS/TEST/NETWORK/network_simulator.c modified: openair3/NAS/TEST/USER/user_parser.c modified: openair3/NAS/TEST/USER/user_parser.h modified: openair3/NAS/TEST/USER/user_simulator.c modified: openair3/NAS/TOOLS/network.h modified: openair3/NAS/TOOLS/ue_data.c modified: openair3/NAS/TOOLS/usim_data.c modified: openair3/NAS/UE/API/USER/at_command.c modified: openair3/NAS/UE/API/USER/at_command.h modified: openair3/NAS/UE/API/USER/at_error.c modified: openair3/NAS/UE/API/USER/at_error.h modified: openair3/NAS/UE/API/USER/at_response.c modified: openair3/NAS/UE/API/USER/at_response.h modified: openair3/NAS/UE/API/USER/tst/at_parser.c modified: openair3/NAS/UE/API/USER/user_api.c modified: openair3/NAS/UE/API/USER/user_api.h modified: openair3/NAS/UE/API/USER/user_indication.c modified: openair3/NAS/UE/API/USER/user_indication.h modified: openair3/NAS/UE/API/USIM/aka_functions.c modified: openair3/NAS/UE/API/USIM/aka_functions.h modified: openair3/NAS/UE/API/USIM/usim_api.c modified: openair3/NAS/UE/API/USIM/usim_api.h modified: openair3/NAS/UE/EMM/Attach.c modified: openair3/NAS/UE/EMM/Authentication.c modified: openair3/NAS/UE/EMM/Detach.c modified: openair3/NAS/UE/EMM/EmmStatusHdl.c modified: openair3/NAS/UE/EMM/Identification.c modified: openair3/NAS/UE/EMM/IdleMode.c modified: openair3/NAS/UE/EMM/IdleMode.h modified: openair3/NAS/UE/EMM/LowerLayer.c modified: openair3/NAS/UE/EMM/LowerLayer.h modified: openair3/NAS/UE/EMM/SAP/EmmDeregistered.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c modified: openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c modified: openair3/NAS/UE/EMM/SAP/EmmNull.c modified: openair3/NAS/UE/EMM/SAP/EmmRegistered.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c modified: openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c modified: openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c modified: openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c modified: openair3/NAS/UE/EMM/SAP/emm_as.c modified: openair3/NAS/UE/EMM/SAP/emm_as.h modified: openair3/NAS/UE/EMM/SAP/emm_asDef.h modified: openair3/NAS/UE/EMM/SAP/emm_esm.c modified: openair3/NAS/UE/EMM/SAP/emm_esm.h modified: openair3/NAS/UE/EMM/SAP/emm_esmDef.h modified: openair3/NAS/UE/EMM/SAP/emm_fsm.c modified: openair3/NAS/UE/EMM/SAP/emm_fsm.h modified: openair3/NAS/UE/EMM/SAP/emm_recv.c modified: openair3/NAS/UE/EMM/SAP/emm_recv.h modified: openair3/NAS/UE/EMM/SAP/emm_reg.c modified: openair3/NAS/UE/EMM/SAP/emm_reg.h modified: openair3/NAS/UE/EMM/SAP/emm_regDef.h modified: openair3/NAS/UE/EMM/SAP/emm_sap.c modified: openair3/NAS/UE/EMM/SAP/emm_sap.h modified: openair3/NAS/UE/EMM/SAP/emm_send.c modified: openair3/NAS/UE/EMM/SAP/emm_send.h modified: openair3/NAS/UE/EMM/SecurityModeControl.c modified: openair3/NAS/UE/EMM/ServiceRequestHdl.c modified: openair3/NAS/UE/EMM/TrackingAreaUpdate.c modified: openair3/NAS/UE/EMM/emmData.h modified: openair3/NAS/UE/EMM/emm_main.c modified: openair3/NAS/UE/EMM/emm_main.h modified: openair3/NAS/UE/EMM/emm_proc.h modified: openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c modified: openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c modified: openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c modified: openair3/NAS/UE/ESM/EsmStatusHdl.c modified: openair3/NAS/UE/ESM/PdnConnectivity.c modified: openair3/NAS/UE/ESM/PdnDisconnect.c modified: openair3/NAS/UE/ESM/SAP/esm_recv.c modified: openair3/NAS/UE/ESM/SAP/esm_recv.h modified: openair3/NAS/UE/ESM/SAP/esm_sap.c modified: openair3/NAS/UE/ESM/SAP/esm_sap.h modified: openair3/NAS/UE/ESM/SAP/esm_sapDef.h modified: openair3/NAS/UE/ESM/SAP/esm_send.c modified: openair3/NAS/UE/ESM/SAP/esm_send.h modified: openair3/NAS/UE/ESM/esmData.h modified: openair3/NAS/UE/ESM/esm_ebr.c modified: openair3/NAS/UE/ESM/esm_ebr.h modified: openair3/NAS/UE/ESM/esm_ebr_context.c modified: openair3/NAS/UE/ESM/esm_ebr_context.h modified: openair3/NAS/UE/ESM/esm_ip.c modified: openair3/NAS/UE/ESM/esm_main.c modified: openair3/NAS/UE/ESM/esm_main.h modified: openair3/NAS/UE/ESM/esm_proc.h modified: openair3/NAS/UE/ESM/esm_pt.c modified: openair3/NAS/UE/ESM/esm_pt.h modified: openair3/NAS/UE/UEprocess.c modified: openair3/NAS/UE/nas_itti_messaging.c modified: openair3/NAS/UE/nas_itti_messaging.h modified: openair3/NAS/UE/nas_network.c modified: openair3/NAS/UE/nas_network.h modified: openair3/NAS/UE/nas_parser.c modified: openair3/NAS/UE/nas_parser.h modified: openair3/NAS/UE/nas_proc.c modified: openair3/NAS/UE/nas_proc.h modified: openair3/NAS/UE/nas_ue_task.c modified: openair3/NAS/UE/nas_user.c modified: openair3/NAS/UE/nas_user.h modified: openair3/S1AP/s1ap_common.c modified: openair3/S1AP/s1ap_common.h modified: openair3/S1AP/s1ap_eNB.c modified: openair3/S1AP/s1ap_eNB.h modified: openair3/S1AP/s1ap_eNB_context_management_procedures.c modified: openair3/S1AP/s1ap_eNB_context_management_procedures.h modified: openair3/S1AP/s1ap_eNB_decoder.c modified: openair3/S1AP/s1ap_eNB_decoder.h modified: openair3/S1AP/s1ap_eNB_default_values.h modified: openair3/S1AP/s1ap_eNB_defs.h modified: openair3/S1AP/s1ap_eNB_encoder.c modified: openair3/S1AP/s1ap_eNB_encoder.h modified: openair3/S1AP/s1ap_eNB_handlers.c modified: openair3/S1AP/s1ap_eNB_handlers.h modified: openair3/S1AP/s1ap_eNB_itti_messaging.c modified: openair3/S1AP/s1ap_eNB_itti_messaging.h modified: openair3/S1AP/s1ap_eNB_management_procedures.c modified: openair3/S1AP/s1ap_eNB_management_procedures.h modified: openair3/S1AP/s1ap_eNB_nas_procedures.c modified: openair3/S1AP/s1ap_eNB_nas_procedures.h modified: openair3/S1AP/s1ap_eNB_nnsf.c modified: openair3/S1AP/s1ap_eNB_nnsf.h modified: openair3/S1AP/s1ap_eNB_overload.c modified: openair3/S1AP/s1ap_eNB_overload.h modified: openair3/S1AP/s1ap_eNB_trace.c modified: openair3/S1AP/s1ap_eNB_trace.h modified: openair3/S1AP/s1ap_eNB_ue_context.c modified: openair3/S1AP/s1ap_eNB_ue_context.h modified: openair3/SCTP/sctp_common.c modified: openair3/SCTP/sctp_common.h modified: openair3/SCTP/sctp_default_values.h modified: openair3/SCTP/sctp_eNB_defs.h modified: openair3/SCTP/sctp_eNB_itti_messaging.c modified: openair3/SCTP/sctp_eNB_itti_messaging.h modified: openair3/SCTP/sctp_eNB_task.c modified: openair3/SCTP/sctp_eNB_task.h modified: openair3/SCTP/sctp_primitives_client.c modified: openair3/SCTP/sctp_primitives_client.h modified: openair3/SECU/kdf.c modified: openair3/SECU/key_nas_deriver.c modified: openair3/SECU/key_nas_encryption.c modified: openair3/SECU/nas_stream_eea1.c modified: openair3/SECU/nas_stream_eea2.c modified: openair3/SECU/nas_stream_eia1.c modified: openair3/SECU/nas_stream_eia2.c modified: openair3/SECU/rijndael.c modified: openair3/SECU/rijndael.h modified: openair3/SECU/secu_defs.h modified: openair3/SECU/snow3g.c modified: openair3/SECU/snow3g.h modified: openair3/TEST/EPC_TEST/generate_scenario.c modified: openair3/TEST/EPC_TEST/generate_scenario.h modified: openair3/TEST/EPC_TEST/play_scenario.c modified: openair3/TEST/EPC_TEST/play_scenario.h modified: openair3/TEST/EPC_TEST/play_scenario_decode.c modified: openair3/TEST/EPC_TEST/play_scenario_display.c modified: openair3/TEST/EPC_TEST/play_scenario_fsm.c modified: openair3/TEST/EPC_TEST/play_scenario_parse.c modified: openair3/TEST/EPC_TEST/play_scenario_s1ap.c modified: openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c modified: openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h modified: openair3/TEST/EPC_TEST/play_scenario_sctp.c modified: openair3/TEST/oaisim_mme_client_test.c modified: openair3/TEST/oaisim_mme_itti_test.c modified: openair3/TEST/oaisim_mme_list_benchmark.c modified: openair3/TEST/oaisim_mme_s1ap_test.c modified: openair3/TEST/oaisim_mme_sctp_test.c modified: openair3/TEST/oaisim_mme_test_s1c.c modified: openair3/TEST/oaisim_mme_test_s1c.h modified: openair3/TEST/oaisim_mme_test_s1c_s1ap.c modified: openair3/TEST/oaisim_mme_test_s1c_s1ap.h modified: openair3/TEST/oaisim_mme_test_s1c_scenario.c modified: openair3/TEST/oaisim_mme_test_s1c_scenario.h modified: openair3/TEST/oaisim_mme_test_s1c_scenario1.c modified: openair3/TEST/test_aes128_cmac_encrypt.c modified: openair3/TEST/test_aes128_ctr_decrypt.c modified: openair3/TEST/test_aes128_ctr_encrypt.c modified: openair3/TEST/test_kdf.c modified: openair3/TEST/test_s1ap.c modified: openair3/TEST/test_secu.c modified: openair3/TEST/test_secu_kenb.c modified: openair3/TEST/test_secu_knas.c modified: openair3/TEST/test_secu_knas_encrypt_eea1.c modified: openair3/TEST/test_secu_knas_encrypt_eea2.c modified: openair3/TEST/test_secu_knas_encrypt_eia1.c modified: openair3/TEST/test_secu_knas_encrypt_eia2.c modified: openair3/TEST/test_secu_knas_stream_int.c modified: openair3/UDP/udp_eNB_task.c modified: openair3/UDP/udp_eNB_task.h modified: openair3/UTILS/conversions.c modified: openair3/UTILS/conversions.h modified: openair3/UTILS/enum_string.c modified: openair3/UTILS/enum_string.h modified: openair3/UTILS/log.c modified: openair3/UTILS/log.h modified: openair3/UTILS/mcc_mnc_itu.c modified: openair3/UTILS/mcc_mnc_itu.h modified: openair3/UTILS/mme_config.c modified: openair3/UTILS/mme_config.h modified: openair3/UTILS/mme_default_values.h modified: targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c modified: targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h modified: targets/ARCH/COMMON/common_lib.c modified: targets/ARCH/COMMON/common_lib.h modified: targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c modified: targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c modified: targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c modified: targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h modified: targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h modified: targets/ARCH/EXMIMO/DEFS/openair_device.h modified: targets/ARCH/EXMIMO/DEFS/pcie_interface.h modified: targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h modified: targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c modified: targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h modified: targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c modified: targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c modified: targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c modified: targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c modified: targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c modified: targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c modified: targets/ARCH/EXMIMO/USERSPACE/LIB/example.c modified: targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c modified: targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h modified: targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c modified: targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h modified: targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c modified: targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h modified: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h modified: targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp modified: targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp modified: targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp modified: targets/COMMON/create_tasks.c modified: targets/COMMON/create_tasks.h modified: targets/RT/USER/TOOLS/thread_ipc.c modified: targets/RT/USER/TOOLS/thread_ipc.h modified: targets/RT/USER/UE_transport_IQ.c modified: targets/RT/USER/condtest.c modified: targets/RT/USER/eNB_transport_IQ.c modified: targets/RT/USER/emos-raw.c modified: targets/RT/USER/lte-enb.c modified: targets/RT/USER/lte-softmodem.c modified: targets/RT/USER/lte-ue.c modified: targets/RT/USER/msg_helper.c modified: targets/RT/USER/msg_many.c modified: targets/RT/USER/msg_many.h modified: targets/RT/USER/rrh.c modified: targets/RT/USER/rrh_gw.c modified: targets/RT/USER/rrh_gw.h modified: targets/RT/USER/rrh_gw_externs.h modified: targets/RT/USER/rt_wrapper.c modified: targets/RT/USER/rt_wrapper.h modified: targets/RT/USER/sleeptest.c modified: targets/RT/USER/stats.c modified: targets/RT/USER/stats.h modified: targets/RT/USER/synctest.c modified: targets/SIMU/PROC/Process.c modified: targets/SIMU/PROC/Process.h modified: targets/SIMU/PROC/Tsync.h modified: targets/SIMU/PROC/channel_sim_proc.c modified: targets/SIMU/PROC/channel_sim_proc.h modified: targets/SIMU/PROC/interface.h modified: targets/SIMU/USER/channel_sim.c modified: targets/SIMU/USER/cor_SF_sim.c modified: targets/SIMU/USER/cor_SF_sim.h modified: targets/SIMU/USER/event_handler.c modified: targets/SIMU/USER/event_handler.h modified: targets/SIMU/USER/init_lte.c modified: targets/SIMU/USER/init_lte.h modified: targets/SIMU/USER/oaisim.c modified: targets/SIMU/USER/oaisim.h modified: targets/SIMU/USER/oaisim_config.c modified: targets/SIMU/USER/oaisim_config.h modified: targets/SIMU/USER/oaisim_functions.c modified: targets/SIMU/USER/oaisim_functions.h modified: targets/SIMU/USER/oaisim_pad.c modified: targets/SIMU/USER/phy_procedures_sim_form.c modified: targets/SIMU/USER/phy_procedures_sim_form.h modified: targets/SIMU/USER/sinr_sim.c modified: targets/TEST/AT_COMMANDS/oaisim.c modified: targets/TEST/PACKET_TRACER/pt.c modified: targets/TEST/PDCP/test_pdcp.c modified: targets/TEST/PDCP/test_pdcp.h modified: targets/TEST/PDCP/test_util.h modified: targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c modified: targets/TEST/RLC_AM_V9.3.0/oaisim.c modified: targets/TEST/RLC_UM_V9.3.0/oaisim.c modified: targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp modified: targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp modified: targets/TEST/ROHDE_SCHWARZ/TcpClient.h --- common/utils/asn1_conversions.h | 21 +++++++++++++++++++ common/utils/assertions.h | 21 +++++++++++++++++++ common/utils/itti/assertions.h | 21 +++++++++++++++++++ common/utils/itti/backtrace.c | 21 +++++++++++++++++++ common/utils/itti/backtrace.h | 21 +++++++++++++++++++ common/utils/itti/intertask_interface.c | 21 +++++++++++++++++++ common/utils/itti/intertask_interface.h | 21 +++++++++++++++++++ common/utils/itti/intertask_interface_dump.c | 21 +++++++++++++++++++ common/utils/itti/intertask_interface_dump.h | 21 +++++++++++++++++++ common/utils/itti/intertask_interface_init.h | 21 +++++++++++++++++++ common/utils/itti/intertask_interface_types.h | 21 +++++++++++++++++++ common/utils/itti/intertask_messages_def.h | 21 +++++++++++++++++++ common/utils/itti/intertask_messages_types.h | 21 +++++++++++++++++++ common/utils/itti/itti_types.h | 21 +++++++++++++++++++ common/utils/itti/memory_pools.c | 21 +++++++++++++++++++ common/utils/itti/memory_pools.h | 21 +++++++++++++++++++ common/utils/itti/messages_def.h | 21 +++++++++++++++++++ common/utils/itti/messages_types.h | 21 +++++++++++++++++++ common/utils/itti/signals.c | 21 +++++++++++++++++++ common/utils/itti/signals.h | 21 +++++++++++++++++++ common/utils/itti/tasks_def.h | 21 +++++++++++++++++++ common/utils/itti/timer.c | 21 +++++++++++++++++++ common/utils/itti/timer.h | 21 +++++++++++++++++++ common/utils/itti/timer_messages_def.h | 21 +++++++++++++++++++ common/utils/itti/timer_messages_types.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/common/itti_types.h | 21 +++++++++++++++++++ common/utils/itti_analyzer/common/logs.h | 21 +++++++++++++++++++ common/utils/itti_analyzer/common/rc.h | 21 +++++++++++++++++++ common/utils/itti_analyzer/itti_analyzer.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libbuffers/buffers.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libbuffers/buffers.h | 21 +++++++++++++++++++ common/utils/itti_analyzer/libbuffers/file.c | 21 +++++++++++++++++++ common/utils/itti_analyzer/libbuffers/file.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libbuffers/socket.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libbuffers/socket.h | 21 +++++++++++++++++++ .../itti_analyzer/libparser/array_type.c | 21 +++++++++++++++++++ .../itti_analyzer/libparser/array_type.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libparser/enum_type.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libparser/enum_type.h | 21 +++++++++++++++++++ .../itti_analyzer/libparser/enum_value_type.c | 21 +++++++++++++++++++ .../itti_analyzer/libparser/enum_value_type.h | 21 +++++++++++++++++++ .../itti_analyzer/libparser/field_type.c | 21 +++++++++++++++++++ .../itti_analyzer/libparser/field_type.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libparser/file_type.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libparser/file_type.h | 21 +++++++++++++++++++ .../libparser/fundamental_type.c | 21 +++++++++++++++++++ .../libparser/fundamental_type.h | 21 +++++++++++++++++++ .../libparser/intertask_contexts.h | 21 +++++++++++++++++++ .../itti_analyzer/libparser/pointer_type.c | 21 +++++++++++++++++++ .../itti_analyzer/libparser/pointer_type.h | 21 +++++++++++++++++++ .../itti_analyzer/libparser/reference_type.c | 21 +++++++++++++++++++ .../itti_analyzer/libparser/reference_type.h | 21 +++++++++++++++++++ .../itti_analyzer/libparser/struct_type.c | 21 +++++++++++++++++++ .../itti_analyzer/libparser/struct_type.h | 21 +++++++++++++++++++ .../itti_analyzer/libparser/typedef_type.c | 21 +++++++++++++++++++ .../itti_analyzer/libparser/typedef_type.h | 21 +++++++++++++++++++ common/utils/itti_analyzer/libparser/types.c | 21 +++++++++++++++++++ common/utils/itti_analyzer/libparser/types.h | 21 +++++++++++++++++++ .../itti_analyzer/libparser/union_type.c | 21 +++++++++++++++++++ .../itti_analyzer/libparser/union_type.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libparser/xml_parse.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libparser/xml_parse.h | 21 +++++++++++++++++++ .../itti_analyzer/libresolver/locate_root.c | 21 +++++++++++++++++++ .../itti_analyzer/libresolver/locate_root.h | 21 +++++++++++++++++++ .../itti_analyzer/libresolver/resolvers.c | 21 +++++++++++++++++++ .../itti_analyzer/libresolver/resolvers.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_callbacks.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_callbacks.h | 21 +++++++++++++++++++ common/utils/itti_analyzer/libui/ui_filters.c | 21 +++++++++++++++++++ common/utils/itti_analyzer/libui/ui_filters.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_interface.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_interface.h | 21 +++++++++++++++++++ .../itti_analyzer/libui/ui_main_screen.c | 21 +++++++++++++++++++ .../itti_analyzer/libui/ui_main_screen.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_menu_bar.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_menu_bar.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_notebook.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_notebook.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_notif_dlg.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_notif_dlg.h | 21 +++++++++++++++++++ .../itti_analyzer/libui/ui_notifications.c | 21 +++++++++++++++++++ .../itti_analyzer/libui/ui_notifications.h | 21 +++++++++++++++++++ .../libui/ui_signal_dissect_view.c | 21 +++++++++++++++++++ .../libui/ui_signal_dissect_view.h | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_tree_view.c | 21 +++++++++++++++++++ .../utils/itti_analyzer/libui/ui_tree_view.h | 21 +++++++++++++++++++ common/utils/msc/msc.c | 21 +++++++++++++++++++ common/utils/msc/msc.h | 21 +++++++++++++++++++ openair1/PHY/CODING/3gpplte.c | 21 +++++++++++++++++++ openair1/PHY/CODING/3gpplte_sse.c | 21 +++++++++++++++++++ openair1/PHY/CODING/3gpplte_turbo_decoder.c | 21 +++++++++++++++++++ .../CODING/3gpplte_turbo_decoder_avx2_16bit.c | 21 +++++++++++++++++++ .../PHY/CODING/3gpplte_turbo_decoder_sse.c | 21 +++++++++++++++++++ .../CODING/3gpplte_turbo_decoder_sse_16bit.c | 21 +++++++++++++++++++ .../CODING/3gpplte_turbo_decoder_sse_8bit.c | 21 +++++++++++++++++++ openair1/PHY/CODING/TESTBENCH/ltetest.c | 21 +++++++++++++++++++ openair1/PHY/CODING/TESTBENCH/pdcch_test.c | 21 +++++++++++++++++++ openair1/PHY/CODING/TESTBENCH/viterbi_test.c | 21 +++++++++++++++++++ openair1/PHY/CODING/ccoding_byte.c | 21 +++++++++++++++++++ openair1/PHY/CODING/ccoding_byte_lte.c | 21 +++++++++++++++++++ openair1/PHY/CODING/crc_byte.c | 21 +++++++++++++++++++ openair1/PHY/CODING/defs.h | 21 +++++++++++++++++++ openair1/PHY/CODING/extern.h | 21 +++++++++++++++++++ openair1/PHY/CODING/extern_3GPPinterleaver.h | 21 +++++++++++++++++++ openair1/PHY/CODING/lte_interleaver.h | 21 +++++++++++++++++++ openair1/PHY/CODING/lte_interleaver2.h | 21 +++++++++++++++++++ openair1/PHY/CODING/lte_interleaver_inline.h | 21 +++++++++++++++++++ openair1/PHY/CODING/lte_rate_matching.c | 21 +++++++++++++++++++ openair1/PHY/CODING/lte_segmentation.c | 21 +++++++++++++++++++ openair1/PHY/CODING/rate_matching.c | 21 +++++++++++++++++++ openair1/PHY/CODING/scrambler.h | 21 +++++++++++++++++++ openair1/PHY/CODING/vars.h | 21 +++++++++++++++++++ openair1/PHY/CODING/viterbi.c | 21 +++++++++++++++++++ openair1/PHY/CODING/viterbi_lte.c | 21 +++++++++++++++++++ openair1/PHY/INIT/defs.h | 21 +++++++++++++++++++ openair1/PHY/INIT/extern.h | 21 +++++++++++++++++++ openair1/PHY/INIT/init_top.c | 21 +++++++++++++++++++ openair1/PHY/INIT/lte_init.c | 21 +++++++++++++++++++ openair1/PHY/INIT/lte_param_init.c | 21 +++++++++++++++++++ openair1/PHY/INIT/lte_parms.c | 21 +++++++++++++++++++ openair1/PHY/INIT/vars.h | 21 +++++++++++++++++++ openair1/PHY/LTE_ESTIMATION/adjust_gain.c | 21 +++++++++++++++++++ openair1/PHY/LTE_ESTIMATION/defs.h | 21 +++++++++++++++++++ openair1/PHY/LTE_ESTIMATION/extern.h | 21 +++++++++++++++++++ openair1/PHY/LTE_ESTIMATION/filt96_32.h | 21 +++++++++++++++++++ .../PHY/LTE_ESTIMATION/freq_equalization.c | 21 +++++++++++++++++++ openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 21 +++++++++++++++++++ .../lte_dl_channel_estimation.c | 21 +++++++++++++++++++ .../lte_dl_channel_estimation_emos.c | 21 +++++++++++++++++++ .../lte_dl_mbsfn_channel_estimation.c | 21 +++++++++++++++++++ .../PHY/LTE_ESTIMATION/lte_eNB_measurements.c | 21 +++++++++++++++++++ .../PHY/LTE_ESTIMATION/lte_est_freq_offset.c | 21 +++++++++++++++++++ openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 21 +++++++++++++++++++ .../PHY/LTE_ESTIMATION/lte_sync_timefreq.c | 21 +++++++++++++++++++ .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 21 +++++++++++++++++++ .../lte_ul_channel_estimation.c | 21 +++++++++++++++++++ openair1/PHY/LTE_ESTIMATION/pss6144.h | 21 +++++++++++++++++++ openair1/PHY/LTE_ESTIMATION/vars.h | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/defs.h | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/lte_dl_uespec.c | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/lte_gold.c | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/lte_ul_ref.c | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/mod_table.h | 21 +++++++++++++++++++ openair1/PHY/LTE_REFSIG/primary_synch.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dci.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dci.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dci_tools.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/defs.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 21 +++++++++++++++++++ .../PHY/LTE_TRANSPORT/dlsch_demodulation.c | 21 +++++++++++++++++++ .../PHY/LTE_TRANSPORT/dlsch_llr_computation.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/drs_modulation.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/extern.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/group_hopping.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/if4_tools.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/if4_tools.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/if5_tools.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/if5_tools.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/initial_sync.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/lte_mcs.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/pbch.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/pcfich.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/pch.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/phich.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/pilots.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/pmch.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/power_control.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/prach.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/prach.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/print_stats.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/proto.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/pss.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/pucch.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/rar_tools.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/srs_modulation.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/sss.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/sss.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/uci.h | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/uci_tools.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 21 +++++++++++++++++++ .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c | 21 +++++++++++++++++++ openair1/PHY/LTE_TRANSPORT/vars.h | 21 +++++++++++++++++++ openair1/PHY/MODULATION/defs.h | 21 +++++++++++++++++++ openair1/PHY/MODULATION/extern.h | 21 +++++++++++++++++++ openair1/PHY/MODULATION/kHz_7_5.h | 21 +++++++++++++++++++ openair1/PHY/MODULATION/ofdm_mod.c | 21 +++++++++++++++++++ openair1/PHY/MODULATION/prach625Hz.h | 21 +++++++++++++++++++ openair1/PHY/MODULATION/slot_fep.c | 21 +++++++++++++++++++ openair1/PHY/MODULATION/slot_fep_mbsfn.c | 21 +++++++++++++++++++ openair1/PHY/MODULATION/slot_fep_ul.c | 21 +++++++++++++++++++ openair1/PHY/MODULATION/ul_7_5_kHz.c | 21 +++++++++++++++++++ openair1/PHY/MODULATION/vars.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/8bit_rxdemux.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/8bit_txmux.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/alaw_lut.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/angle.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/cadd_sv.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/cadd_vv.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/cdot_prod.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/cmult_sv.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/cmult_vv.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/costable.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/dB_routines.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/dB_routines.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/defs.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/extern.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/file_output.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/invSqrt.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/log2_approx.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/lte_dfts.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/lte_phy_scope.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/lte_phy_scope.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/lut.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/memory_routines.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/signal_energy.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/smbv.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/smbv.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/sqrt.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/time_meas.c | 21 +++++++++++++++++++ openair1/PHY/TOOLS/time_meas.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/twiddle12288.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/twiddle1536.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/twiddle24576.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/twiddle6144.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/twiddles4096.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/twiddles8192.h | 21 +++++++++++++++++++ openair1/PHY/TOOLS/vars.h | 21 +++++++++++++++++++ openair1/PHY/defs.h | 21 +++++++++++++++++++ openair1/PHY/extern.h | 21 +++++++++++++++++++ openair1/PHY/impl_defs_lte.h | 21 +++++++++++++++++++ openair1/PHY/impl_defs_top.h | 21 +++++++++++++++++++ openair1/PHY/sse_intrin.h | 21 +++++++++++++++++++ openair1/PHY/types.h | 21 +++++++++++++++++++ openair1/PHY/vars.h | 21 +++++++++++++++++++ openair1/SCHED/defs.h | 21 +++++++++++++++++++ openair1/SCHED/extern.h | 21 +++++++++++++++++++ openair1/SCHED/phy_mac_stub.c | 21 +++++++++++++++++++ openair1/SCHED/phy_procedures_emos.h | 21 +++++++++++++++++++ openair1/SCHED/phy_procedures_lte_common.c | 21 +++++++++++++++++++ openair1/SCHED/phy_procedures_lte_eNb.c | 21 +++++++++++++++++++ openair1/SCHED/phy_procedures_lte_ue.c | 21 +++++++++++++++++++ openair1/SCHED/pucch_pc.c | 21 +++++++++++++++++++ openair1/SCHED/pusch_pc.c | 21 +++++++++++++++++++ openair1/SCHED/rt_compat.h | 21 +++++++++++++++++++ openair1/SCHED/vars.h | 21 +++++++++++++++++++ .../ETH_TRANSPORT/bypass_session_layer.c | 21 +++++++++++++++++++ openair1/SIMULATION/ETH_TRANSPORT/defs.h | 21 +++++++++++++++++++ .../SIMULATION/ETH_TRANSPORT/emu_transport.c | 21 +++++++++++++++++++ openair1/SIMULATION/ETH_TRANSPORT/extern.h | 21 +++++++++++++++++++ .../SIMULATION/ETH_TRANSPORT/multicast_link.c | 21 +++++++++++++++++++ .../SIMULATION/ETH_TRANSPORT/multicast_link.h | 21 +++++++++++++++++++ .../SIMULATION/ETH_TRANSPORT/netlink_init.c | 21 +++++++++++++++++++ openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c | 21 +++++++++++++++++++ openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h | 21 +++++++++++++++++++ openair1/SIMULATION/ETH_TRANSPORT/proto.h | 21 +++++++++++++++++++ openair1/SIMULATION/ETH_TRANSPORT/socket.c | 21 +++++++++++++++++++ openair1/SIMULATION/ETH_TRANSPORT/socket.h | 21 +++++++++++++++++++ openair1/SIMULATION/ETH_TRANSPORT/vars.h | 21 +++++++++++++++++++ .../SIMULATION/LTE_PHY/LTE_Configuration.c | 21 +++++++++++++++++++ .../SIMULATION/LTE_PHY/LTE_Configuration.h | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/dlsim.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/framegen.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/gpib_send.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/gpib_send.h | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/mbmssim.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/pbchsim.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/pdcchsim.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/prachsim.c | 21 +++++++++++++++++++ .../SIMULATION/LTE_PHY/pucchsignalgegerator.h | 21 +++++++++++++++++++ .../SIMULATION/LTE_PHY/pucchsignalgenerator.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/pucchsim.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/scansim.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/signalanalyzer.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/signalanalyzer.h | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/syncsim.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/test.c | 21 +++++++++++++++++++ .../SIMULATION/LTE_PHY/ulsignalgenerator.c | 21 +++++++++++++++++++ .../SIMULATION/LTE_PHY/ulsignalgenerator.h | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/ulsim.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/ulsim2.c | 21 +++++++++++++++++++ openair1/SIMULATION/LTE_PHY/unitary_defs.h | 21 +++++++++++++++++++ openair1/SIMULATION/RF/adc.c | 21 +++++++++++++++++++ openair1/SIMULATION/RF/dac.c | 21 +++++++++++++++++++ openair1/SIMULATION/RF/defs.h | 21 +++++++++++++++++++ openair1/SIMULATION/RF/rf.c | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/abstraction.c | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/ch_desc_proto.c | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/defs.h | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/gauss.c | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/llr_quantization.c | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/multipath_channel.c | 21 +++++++++++++++++++ .../SIMULATION/TOOLS/multipath_tv_channel.c | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/random_channel.c | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/rangen_double.c | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/scm_corrmat.h | 21 +++++++++++++++++++ openair1/SIMULATION/TOOLS/taus.c | 21 +++++++++++++++++++ openair2/COMMON/as_message.h | 21 +++++++++++++++++++ openair2/COMMON/commonDef.h | 21 +++++++++++++++++++ openair2/COMMON/gtpv1_u_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/gtpv1_u_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/intertask_interface_conf.h | 21 +++++++++++++++++++ openair2/COMMON/mac_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/mac_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/mac_primitives.h | 21 +++++++++++++++++++ openair2/COMMON/mac_rlc_primitives.h | 21 +++++++++++++++++++ openair2/COMMON/mac_rrc_primitives.h | 21 +++++++++++++++++++ openair2/COMMON/messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/nas_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/nas_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/networkDef.h | 21 +++++++++++++++++++ openair2/COMMON/openair_defs.h | 21 +++++++++++++++++++ openair2/COMMON/openair_types.h | 21 +++++++++++++++++++ openair2/COMMON/pdcp_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/pdcp_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/phy_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/phy_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/platform_constants.h | 21 +++++++++++++++++++ openair2/COMMON/platform_types.h | 21 +++++++++++++++++++ openair2/COMMON/ral_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/ral_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/rlc_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/rlc_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/rrc_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/rrc_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/rrm_config_structs.h | 21 +++++++++++++++++++ openair2/COMMON/rrm_constants.h | 21 +++++++++++++++++++ openair2/COMMON/rtos_header.h | 21 +++++++++++++++++++ openair2/COMMON/s1ap_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/s1ap_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/sctp_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/sctp_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/tasks_def.h | 21 +++++++++++++++++++ openair2/COMMON/udp_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/udp_messages_types.h | 21 +++++++++++++++++++ openair2/COMMON/x2ap_messages_def.h | 21 +++++++++++++++++++ openair2/COMMON/x2ap_messages_types.h | 21 +++++++++++++++++++ openair2/DOCS/TEMPLATES/CODE/example_doxy.h | 21 +++++++++++++++++++ openair2/ENB_APP/enb_app.c | 21 +++++++++++++++++++ openair2/ENB_APP/enb_app.h | 21 +++++++++++++++++++ openair2/ENB_APP/enb_config.c | 21 +++++++++++++++++++ openair2/ENB_APP/enb_config.h | 21 +++++++++++++++++++ openair2/LAYER2/MAC/config.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/defs.h | 21 +++++++++++++++++++ openair2/LAYER2/MAC/eNB_scheduler.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/eNB_scheduler_RA.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/eNB_scheduler_bch.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/eNB_scheduler_mch.c | 21 +++++++++++++++++++ .../LAYER2/MAC/eNB_scheduler_primitives.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/extern.h | 21 +++++++++++++++++++ openair2/LAYER2/MAC/l1_helpers.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/lte_transport_init.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/main.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/openair2_proc.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/pre_processor.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/proto.h | 21 +++++++++++++++++++ openair2/LAYER2/MAC/ra_procedures.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/rar_tools.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/ue_procedures.c | 21 +++++++++++++++++++ openair2/LAYER2/MAC/vars.h | 21 +++++++++++++++++++ openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 21 +++++++++++++++++++ openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 21 +++++++++++++++++++ .../PDCP_v10.1.0/pdcp_control_primitive.c | 21 +++++++++++++++++++ .../pdcp_control_primitives_proto_extern.h | 21 +++++++++++++++++++ openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c | 21 +++++++++++++++++++ openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c | 21 +++++++++++++++++++ .../LAYER2/PDCP_v10.1.0/pdcp_primitives.c | 21 +++++++++++++++++++ .../LAYER2/PDCP_v10.1.0/pdcp_primitives.h | 21 +++++++++++++++++++ .../LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h | 21 +++++++++++++++++++ openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c | 21 +++++++++++++++++++ .../PDCP_v10.1.0/pdcp_sequence_manager.c | 21 +++++++++++++++++++ .../PDCP_v10.1.0/pdcp_sequence_manager.h | 21 +++++++++++++++++++ openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c | 21 +++++++++++++++++++ openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c | 21 +++++++++++++++++++ openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h | 21 +++++++++++++++++++ .../RLC/AM_v9.3.0/rlc_am_proto_extern.h | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h | 21 +++++++++++++++++++ .../RLC/AM_v9.3.0/rlc_am_segments_holes.c | 21 +++++++++++++++++++ .../RLC/AM_v9.3.0/rlc_am_segments_holes.h | 21 +++++++++++++++++++ .../RLC/AM_v9.3.0/rlc_am_status_report.c | 21 +++++++++++++++++++ .../RLC/AM_v9.3.0/rlc_am_status_report.h | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h | 21 +++++++++++++++++++ .../AM_v9.3.0/rlc_am_timer_poll_retransmit.c | 21 +++++++++++++++++++ .../AM_v9.3.0/rlc_am_timer_poll_retransmit.h | 21 +++++++++++++++++++ .../RLC/AM_v9.3.0/rlc_am_timer_reordering.c | 21 +++++++++++++++++++ .../RLC/AM_v9.3.0/rlc_am_timer_reordering.h | 21 +++++++++++++++++++ .../AM_v9.3.0/rlc_am_timer_status_prohibit.c | 21 +++++++++++++++++++ .../AM_v9.3.0/rlc_am_timer_status_prohibit.h | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c | 21 +++++++++++++++++++ .../LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h | 21 +++++++++++++++++++ .../LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h | 21 +++++++++++++++++++ .../LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h | 21 +++++++++++++++++++ .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 21 +++++++++++++++++++ .../RLC/UM_v9.3.0/rlc_um_control_primitives.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h | 21 +++++++++++++++++++ .../LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c | 21 +++++++++++++++++++ .../LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h | 21 +++++++++++++++++++ .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c | 21 +++++++++++++++++++ .../LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h | 21 +++++++++++++++++++ .../LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c | 21 +++++++++++++++++++ .../LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h | 21 +++++++++++++++++++ .../LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h | 21 +++++++++++++++++++ .../RLC/UM_v9.3.0/rlc_um_very_simple_test.c | 21 +++++++++++++++++++ .../RLC/UM_v9.3.0/rlc_um_very_simple_test.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/mac_primitives.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/rlc.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/rlc.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/rlc_def.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/rlc_def_lte.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/rlc_mac.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/rlc_mpls.c | 21 +++++++++++++++++++ openair2/LAYER2/RLC/rlc_primitives.h | 21 +++++++++++++++++++ openair2/LAYER2/RLC/rlc_rrc.c | 21 +++++++++++++++++++ openair2/LAYER2/layer2_top.c | 21 +++++++++++++++++++ openair2/LAYER2/openair2_proc.c | 21 +++++++++++++++++++ openair2/LAYER2/register.c | 21 +++++++++++++++++++ openair2/LAYER2/register.h | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASMT/nasmt_classifier.c | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASMT/nasmt_constant.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASMT/nasmt_variables.h | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASRG/nasrg_classifier.c | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASRG/nasrg_constant.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NASRG/nasrg_variables.h | 21 +++++++++++++++++++ .../NAS/DRIVER/CELLULAR/NETLTEST/netltest.c | 21 +++++++++++++++++++ .../DRIVER/CELLULAR/NETLTEST/nettestPDCP.c | 21 +++++++++++++++++++ openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h | 21 +++++++++++++++++++ openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c | 21 +++++++++++++++++++ .../NAS/SIMU_CELLULAR/rrm_fifo_standalone.c | 21 +++++++++++++++++++ openair2/NAS/nas_ue_task.h | 21 +++++++++++++++++++ .../NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/classifier.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/common.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/constant.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/device.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/ioctl.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/ioctl.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/local.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/netlink.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/proto_extern.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/sap.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/LITE/tool.c | 21 +++++++++++++++++++ .../NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c | 21 +++++++++++++++++++ .../NETWORK_DRIVER/MESH/TESTBENCH/testbench.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/classifier.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/common.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/constant.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/device.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/ioctl.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/ioctl.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/local.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/mesh.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/netlink.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/proto_extern.h | 21 +++++++++++++++++++ .../NETWORK_DRIVER/MESH/rrc_nas_primitives.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/sap.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/MESH/tool.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/UE_IP/common.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/UE_IP/constant.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/UE_IP/device.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/UE_IP/local.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/UE_IP/netlink.c | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/UE_IP/proto_extern.h | 21 +++++++++++++++++++ openair2/NETWORK_DRIVER/UE_IP/sap.h | 21 +++++++++++++++++++ openair2/PHY_INTERFACE/defs.h | 21 +++++++++++++++++++ openair2/PHY_INTERFACE/extern.h | 21 +++++++++++++++++++ openair2/PHY_INTERFACE/mac_phy_primitives.c | 21 +++++++++++++++++++ openair2/PHY_INTERFACE/mac_phy_primitives.h | 21 +++++++++++++++++++ openair2/PHY_INTERFACE/vars.h | 21 +++++++++++++++++++ .../L2_INTERFACE/openair_rrc_L2_interface.c | 21 +++++++++++++++++++ .../L2_INTERFACE/openair_rrc_L2_interface.h | 21 +++++++++++++++++++ openair2/RRC/LITE/L2_interface.c | 21 +++++++++++++++++++ openair2/RRC/LITE/MESSAGES/asn1_msg.c | 21 +++++++++++++++++++ openair2/RRC/LITE/MESSAGES/asn1_msg.h | 21 +++++++++++++++++++ openair2/RRC/LITE/MESSAGES/rtai_mem.c | 21 +++++++++++++++++++ openair2/RRC/LITE/MESSAGES/rtai_mem.h | 21 +++++++++++++++++++ openair2/RRC/LITE/defs.h | 21 +++++++++++++++++++ openair2/RRC/LITE/extern.h | 21 +++++++++++++++++++ openair2/RRC/LITE/mesh_top.c | 21 +++++++++++++++++++ openair2/RRC/LITE/plmn_data.h | 21 +++++++++++++++++++ openair2/RRC/LITE/proto.h | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_2_rrm_msg.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_UE.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_UE_ral.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_UE_ral.h | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_common.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_config.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB_GTPV1U.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB_GTPV1U.h | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB_S1AP.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB_S1AP.h | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB_UE_context.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB_UE_context.h | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB_ral.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_eNB_ral.h | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_rrm_interface.c | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_rrm_interface.h | 21 +++++++++++++++++++ openair2/RRC/LITE/rrc_types.h | 21 +++++++++++++++++++ openair2/RRC/LITE/rrm_2_rrc_msg.c | 21 +++++++++++++++++++ openair2/RRC/LITE/utils.c | 21 +++++++++++++++++++ openair2/RRC/LITE/vars.h | 21 +++++++++++++++++++ openair2/RRC/NAS/nas_config.c | 21 +++++++++++++++++++ openair2/RRC/NAS/nas_config.h | 21 +++++++++++++++++++ openair2/RRC/NAS/rb_config.c | 21 +++++++++++++++++++ openair2/RRC/NAS/rb_config.h | 21 +++++++++++++++++++ openair2/RRM_4_RRC_LITE/src/com/Message.cpp | 21 +++++++++++++++++++ openair2/RRM_4_RRC_LITE/src/com/Message.h | 21 +++++++++++++++++++ ...2RRMMessageAddRadioAccessBearerConfirm.cpp | 21 +++++++++++++++++++ ...RC2RRMMessageAddRadioAccessBearerConfirm.h | 21 +++++++++++++++++++ ...2RRMMessageAddRadioAccessBearerRequest.cpp | 21 +++++++++++++++++++ ...RC2RRMMessageAddRadioAccessBearerRequest.h | 21 +++++++++++++++++++ .../com/rrc/RRC2RRMMessageAddUserConfirm.cpp | 21 +++++++++++++++++++ .../com/rrc/RRC2RRMMessageAddUserConfirm.h | 21 +++++++++++++++++++ .../com/rrc/RRC2RRMMessageAddUserRequest.cpp | 21 +++++++++++++++++++ .../com/rrc/RRC2RRMMessageAddUserRequest.h | 21 +++++++++++++++++++ .../rrc/RRC2RRMMessageConnectionRequest.cpp | 21 +++++++++++++++++++ .../com/rrc/RRC2RRMMessageConnectionRequest.h | 21 +++++++++++++++++++ ...MMessageRemoveRadioAccessBearerRequest.cpp | 21 +++++++++++++++++++ ...RRMMessageRemoveRadioAccessBearerRequest.h | 21 +++++++++++++++++++ .../rrc/RRC2RRMMessageRemoveUserRequest.cpp | 21 +++++++++++++++++++ .../com/rrc/RRC2RRMMessageRemoveUserRequest.h | 21 +++++++++++++++++++ ...2RRMMessageUserReconfigurationComplete.cpp | 21 +++++++++++++++++++ ...RC2RRMMessageUserReconfigurationComplete.h | 21 +++++++++++++++++++ .../src/com/rrc/RRCMessageHandler.cpp | 21 +++++++++++++++++++ .../src/com/rrc/RRCMessageHandler.h | 21 +++++++++++++++++++ .../src/com/rrc/RRCUdpSocket.cpp | 21 +++++++++++++++++++ .../RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h | 21 +++++++++++++++++++ ...RRCMessageAddRadioAccessBearerResponse.cpp | 21 +++++++++++++++++++ ...M2RRCMessageAddRadioAccessBearerResponse.h | 21 +++++++++++++++++++ .../com/rrc/RRM2RRCMessageAddUserResponse.cpp | 21 +++++++++++++++++++ .../com/rrc/RRM2RRCMessageAddUserResponse.h | 21 +++++++++++++++++++ .../rrc/RRM2RRCMessageConnectionResponse.cpp | 21 +++++++++++++++++++ .../rrc/RRM2RRCMessageConnectionResponse.h | 21 +++++++++++++++++++ ...MessageRemoveRadioAccessBearerResponse.cpp | 21 +++++++++++++++++++ ...RCMessageRemoveRadioAccessBearerResponse.h | 21 +++++++++++++++++++ .../rrc/RRM2RRCMessageRemoveUserResponse.cpp | 21 +++++++++++++++++++ .../rrc/RRM2RRCMessageRemoveUserResponse.h | 21 +++++++++++++++++++ .../rrc/RRM2RRCMessageUserReconfiguration.cpp | 21 +++++++++++++++++++ .../rrc/RRM2RRCMessageUserReconfiguration.h | 21 +++++++++++++++++++ .../src/com/rrm/RRMMessageHandler.cpp | 21 +++++++++++++++++++ .../src/com/rrm/RRMMessageHandler.h | 21 +++++++++++++++++++ .../src/com/rrm/RRMUdpSocket.cpp | 21 +++++++++++++++++++ .../RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h | 21 +++++++++++++++++++ openair2/RRM_4_RRC_LITE/src/platform.h | 21 +++++++++++++++++++ .../RRM_4_RRC_LITE/src/platform_constants.h | 21 +++++++++++++++++++ .../RRM_4_RRC_LITE/src/platform_defines.h | 21 +++++++++++++++++++ openair2/RRM_4_RRC_LITE/src/platform_dim.h | 21 +++++++++++++++++++ .../src/radio_resources/Asn1Utils.cpp | 21 +++++++++++++++++++ .../src/radio_resources/Asn1Utils.h | 21 +++++++++++++++++++ .../src/radio_resources/Command.cpp | 21 +++++++++++++++++++ .../src/radio_resources/Command.h | 21 +++++++++++++++++++ .../src/radio_resources/DataRadioBearer.cpp | 21 +++++++++++++++++++ .../src/radio_resources/DataRadioBearer.h | 21 +++++++++++++++++++ .../src/radio_resources/ENodeB.cpp | 21 +++++++++++++++++++ .../src/radio_resources/ENodeB.h | 21 +++++++++++++++++++ .../src/radio_resources/Exceptions.h | 21 +++++++++++++++++++ .../src/radio_resources/LogicalChannel.cpp | 21 +++++++++++++++++++ .../src/radio_resources/LogicalChannel.h | 21 +++++++++++++++++++ .../src/radio_resources/Mobile.cpp | 21 +++++++++++++++++++ .../src/radio_resources/Mobile.h | 21 +++++++++++++++++++ .../src/radio_resources/RadioBearer.cpp | 21 +++++++++++++++++++ .../src/radio_resources/RadioBearer.h | 21 +++++++++++++++++++ .../src/radio_resources/RadioResources.cpp | 21 +++++++++++++++++++ .../src/radio_resources/RadioResources.h | 21 +++++++++++++++++++ .../radio_resources/SignallingRadioBearer.cpp | 21 +++++++++++++++++++ .../radio_resources/SignallingRadioBearer.h | 21 +++++++++++++++++++ .../src/radio_resources/Transaction.cpp | 21 +++++++++++++++++++ .../src/radio_resources/Transaction.h | 21 +++++++++++++++++++ .../src/radio_resources/Transactions.cpp | 21 +++++++++++++++++++ .../src/radio_resources/Transactions.h | 21 +++++++++++++++++++ openair2/RRM_4_RRC_LITE/src/rrm.cpp | 21 +++++++++++++++++++ .../RRM_4_RRC_LITE/src/test/TestScenario.cpp | 21 +++++++++++++++++++ .../RRM_4_RRC_LITE/src/test/TestScenario.h | 21 +++++++++++++++++++ openair2/RRM_4_RRC_LITE/src/test/test.cpp | 21 +++++++++++++++++++ openair2/RRM_4_RRC_LITE/src/version.h | 21 +++++++++++++++++++ openair2/UTIL/BIGPHYS/bigphys.c | 21 +++++++++++++++++++ openair2/UTIL/BIGPHYS/defs.h | 21 +++++++++++++++++++ openair2/UTIL/CLI/cli.c | 21 +++++++++++++++++++ openair2/UTIL/CLI/cli.h | 21 +++++++++++++++++++ openair2/UTIL/CLI/cli_cmd.c | 21 +++++++++++++++++++ openair2/UTIL/CLI/cli_if.h | 21 +++++++++++++++++++ openair2/UTIL/CLI/cli_server.c | 21 +++++++++++++++++++ openair2/UTIL/FIFO/pad_list.c | 21 +++++++++++++++++++ openair2/UTIL/FIFO/pad_list.h | 21 +++++++++++++++++++ openair2/UTIL/FIFO/types.h | 21 +++++++++++++++++++ openair2/UTIL/LISTS/list.c | 21 +++++++++++++++++++ openair2/UTIL/LISTS/list.h | 21 +++++++++++++++++++ openair2/UTIL/LISTS/list2.c | 21 +++++++++++++++++++ openair2/UTIL/LOG/log.c | 21 +++++++++++++++++++ openair2/UTIL/LOG/log.h | 21 +++++++++++++++++++ openair2/UTIL/LOG/log_extern.h | 21 +++++++++++++++++++ openair2/UTIL/LOG/log_if.h | 21 +++++++++++++++++++ openair2/UTIL/LOG/vcd_signal_dumper.c | 21 +++++++++++++++++++ openair2/UTIL/LOG/vcd_signal_dumper.h | 21 +++++++++++++++++++ openair2/UTIL/MATH/crc_byte.c | 21 +++++++++++++++++++ openair2/UTIL/MATH/oml.c | 21 +++++++++++++++++++ openair2/UTIL/MATH/oml.h | 21 +++++++++++++++++++ openair2/UTIL/MATH/random.c | 21 +++++++++++++++++++ openair2/UTIL/MATH/random_proto_extern.h | 21 +++++++++++++++++++ openair2/UTIL/MATH/taus.c | 21 +++++++++++++++++++ openair2/UTIL/MEM/mem_block.c | 21 +++++++++++++++++++ openair2/UTIL/MEM/mem_block.h | 21 +++++++++++++++++++ openair2/UTIL/MEM/mem_mngt.c | 21 +++++++++++++++++++ openair2/UTIL/MEM/mem_mngt_proto_extern.h | 21 +++++++++++++++++++ openair2/UTIL/MEM/mem_pool.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_call_emu.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_call_emu.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_config_mobi.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_config_mobi.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_create_dir.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_create_dir.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_detect_file.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_detect_file.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_extern.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_generate_report.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_generate_report.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_get_opt.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_get_opt.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_if.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_parse_XML.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_parse_XML.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_parse_filename.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_parse_filename.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_save_XML.c | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_save_XML.h | 21 +++++++++++++++++++ openair2/UTIL/OCG/OCG_vars.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/client_traci_OMG.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/client_traci_OMG.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/common.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/defs.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/grid.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/grid.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/id_manager.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/id_manager.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/job.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/mobility_parser.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/mobility_parser.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/omg.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/omg.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/omg_constants.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/omg_hashtable.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/omg_hashtable.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/omg_vars.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/rwalk.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/rwalk.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/rwp.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/rwp.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/socket_traci_OMG.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/socket_traci_OMG.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/static.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/static.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/steadystaterwp.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/steadystaterwp.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/storage_traci_OMG.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/storage_traci_OMG.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/sumo.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/sumo.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/trace.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/trace.h | 21 +++++++++++++++++++ openair2/UTIL/OMG/trace_hashtable.c | 21 +++++++++++++++++++ openair2/UTIL/OMG/trace_hashtable.h | 21 +++++++++++++++++++ openair2/UTIL/OMV/communicationthread.cpp | 21 +++++++++++++++++++ openair2/UTIL/OMV/communicationthread.h | 21 +++++++++++++++++++ openair2/UTIL/OMV/mywindow.cpp | 21 +++++++++++++++++++ openair2/UTIL/OMV/mywindow.h | 21 +++++++++++++++++++ openair2/UTIL/OMV/omv.cpp | 21 +++++++++++++++++++ openair2/UTIL/OMV/openglwidget.cpp | 21 +++++++++++++++++++ openair2/UTIL/OMV/openglwidget.h | 21 +++++++++++++++++++ openair2/UTIL/OMV/structures.h | 21 +++++++++++++++++++ openair2/UTIL/OPT/opt.h | 21 +++++++++++++++++++ openair2/UTIL/OPT/socket_sender.c | 21 +++++++++++++++++++ openair2/UTIL/OPT/vars.h | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_defs.h | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_internal.h | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_key_deriver.c | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_rijndael.c | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_rijndael.h | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_snow3g.c | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_snow3g.h | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_stream_eea.c | 21 +++++++++++++++++++ openair2/UTIL/OSA/osa_stream_eia.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/main.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_config.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_defs.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_externs.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_form.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_form.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_kpi.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_kpi.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_models.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_models.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_rx.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_rx.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_rx_socket.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_rx_socket.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_tx.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_tx.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_tx_socket.c | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_tx_socket.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/otg_vars.h | 21 +++++++++++++++++++ openair2/UTIL/OTG/traffic_config.h | 21 +++++++++++++++++++ openair2/UTIL/TIMER/umts_timer.c | 21 +++++++++++++++++++ openair2/UTIL/TIMER/umts_timer.h | 21 +++++++++++++++++++ openair2/UTIL/TIMER/umts_timer_proto_extern.h | 21 +++++++++++++++++++ openair2/UTIL/TIMER/umts_timer_struct.h | 21 +++++++++++++++++++ openair2/UTIL/TRACE/fifo_printf.c | 21 +++++++++++++++++++ openair2/UTIL/TRACE/fifo_printf.h | 21 +++++++++++++++++++ .../UTIL/TRACE/fifo_printf_proto_extern.h | 21 +++++++++++++++++++ openair2/UTIL/TRACE/print.h | 21 +++++++++++++++++++ openair2/X2AP/x2ap.c | 21 +++++++++++++++++++ openair2/X2AP/x2ap.h | 21 +++++++++++++++++++ openair2/X2AP/x2ap_common.c | 21 +++++++++++++++++++ openair2/X2AP/x2ap_common.h | 21 +++++++++++++++++++ openair3/COMMON/common_types.h | 21 +++++++++++++++++++ openair3/COMMON/gtpv1_u_messages_def.h | 21 +++++++++++++++++++ openair3/COMMON/gtpv1_u_messages_types.h | 21 +++++++++++++++++++ openair3/COMMON/intertask_interface_conf.h | 21 +++++++++++++++++++ openair3/COMMON/messages_def.h | 21 +++++++++++++++++++ openair3/COMMON/messages_types.h | 21 +++++++++++++++++++ openair3/COMMON/nas_messages_def.h | 21 +++++++++++++++++++ openair3/COMMON/nas_messages_types.h | 21 +++++++++++++++++++ openair3/COMMON/s1ap_messages_def.h | 21 +++++++++++++++++++ openair3/COMMON/s1ap_messages_types.h | 21 +++++++++++++++++++ openair3/COMMON/sctp_messages_def.h | 21 +++++++++++++++++++ openair3/COMMON/sctp_messages_types.h | 21 +++++++++++++++++++ openair3/COMMON/security_types.h | 21 +++++++++++++++++++ openair3/COMMON/tasks_def.h | 21 +++++++++++++++++++ openair3/COMMON/udp_messages_def.h | 21 +++++++++++++++++++ openair3/COMMON/udp_messages_types.h | 21 +++++++++++++++++++ openair3/GTPV1-U/gtpv1u.h | 21 +++++++++++++++++++ openair3/GTPV1-U/gtpv1u_eNB.c | 21 +++++++++++++++++++ openair3/GTPV1-U/gtpv1u_eNB_defs.h | 21 +++++++++++++++++++ openair3/GTPV1-U/gtpv1u_eNB_task.h | 21 +++++++++++++++++++ openair3/GTPV1-U/gtpv1u_sgw_defs.h | 21 +++++++++++++++++++ openair3/GTPV1-U/gtpv1u_task.c | 21 +++++++++++++++++++ openair3/GTPV1-U/gtpv1u_teid_pool.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/API/NETWORK/as_message.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/API/NETWORK/l2_message.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/API/NETWORK/nas_message.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/API/NETWORK/nas_message.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/API/NETWORK/network_api.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/API/NETWORK/network_api.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/AttachAccept.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/AttachAccept.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/AttachComplete.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/AttachComplete.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/AttachReject.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/AttachReject.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/AttachRequest.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/AttachRequest.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/AuthenticationFailure.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/AuthenticationFailure.h | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/AuthenticationReject.c | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/AuthenticationReject.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/AuthenticationRequest.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/AuthenticationRequest.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/AuthenticationResponse.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/AuthenticationResponse.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/CsServiceNotification.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/CsServiceNotification.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/DetachAccept.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/DetachAccept.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/DetachRequest.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/DetachRequest.h | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/DownlinkNasTransport.c | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/DownlinkNasTransport.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/EmmInformation.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/EmmInformation.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/EmmStatus.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/EmmStatus.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/ExtendedServiceRequest.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/ExtendedServiceRequest.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/GutiReallocationCommand.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/GutiReallocationCommand.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/GutiReallocationComplete.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/GutiReallocationComplete.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/IdentityResponse.c | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/IdentityResponse.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/NASSecurityModeCommand.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/NASSecurityModeComplete.h | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/SecurityModeCommand.c | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/SecurityModeComplete.c | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/SecurityModeReject.c | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/SecurityModeReject.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/ServiceReject.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/ServiceReject.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/TrackingAreaUpdateAccept.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/TrackingAreaUpdateAccept.h | 21 +++++++++++++++++++ .../EMM/MSG/TrackingAreaUpdateComplete.c | 21 +++++++++++++++++++ .../EMM/MSG/TrackingAreaUpdateComplete.h | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/TrackingAreaUpdateReject.c | 21 +++++++++++++++++++ .../COMMON/EMM/MSG/TrackingAreaUpdateReject.h | 21 +++++++++++++++++++ .../EMM/MSG/TrackingAreaUpdateRequest.c | 21 +++++++++++++++++++ .../EMM/MSG/TrackingAreaUpdateRequest.h | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/UplinkNasTransport.c | 21 +++++++++++++++++++ .../NAS/COMMON/EMM/MSG/UplinkNasTransport.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/emm_cause.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/emm_msg.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/emm_msg.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h | 21 +++++++++++++++++++ .../ActivateDedicatedEpsBearerContextAccept.c | 21 +++++++++++++++++++ .../ActivateDedicatedEpsBearerContextAccept.h | 21 +++++++++++++++++++ .../ActivateDedicatedEpsBearerContextReject.c | 21 +++++++++++++++++++ .../ActivateDedicatedEpsBearerContextReject.h | 21 +++++++++++++++++++ ...ActivateDedicatedEpsBearerContextRequest.c | 21 +++++++++++++++++++ ...ActivateDedicatedEpsBearerContextRequest.h | 21 +++++++++++++++++++ .../ActivateDefaultEpsBearerContextAccept.c | 21 +++++++++++++++++++ .../ActivateDefaultEpsBearerContextAccept.h | 21 +++++++++++++++++++ .../ActivateDefaultEpsBearerContextReject.c | 21 +++++++++++++++++++ .../ActivateDefaultEpsBearerContextReject.h | 21 +++++++++++++++++++ .../ActivateDefaultEpsBearerContextRequest.c | 21 +++++++++++++++++++ .../ActivateDefaultEpsBearerContextRequest.h | 21 +++++++++++++++++++ .../ESM/MSG/BearerResourceAllocationReject.c | 21 +++++++++++++++++++ .../ESM/MSG/BearerResourceAllocationReject.h | 21 +++++++++++++++++++ .../ESM/MSG/BearerResourceAllocationRequest.c | 21 +++++++++++++++++++ .../ESM/MSG/BearerResourceAllocationRequest.h | 21 +++++++++++++++++++ .../MSG/BearerResourceModificationReject.c | 21 +++++++++++++++++++ .../MSG/BearerResourceModificationReject.h | 21 +++++++++++++++++++ .../MSG/BearerResourceModificationRequest.c | 21 +++++++++++++++++++ .../MSG/BearerResourceModificationRequest.h | 21 +++++++++++++++++++ .../MSG/DeactivateEpsBearerContextAccept.c | 21 +++++++++++++++++++ .../MSG/DeactivateEpsBearerContextAccept.h | 21 +++++++++++++++++++ .../MSG/DeactivateEpsBearerContextRequest.c | 21 +++++++++++++++++++ .../MSG/DeactivateEpsBearerContextRequest.h | 21 +++++++++++++++++++ .../COMMON/ESM/MSG/EsmInformationRequest.c | 21 +++++++++++++++++++ .../COMMON/ESM/MSG/EsmInformationRequest.h | 21 +++++++++++++++++++ .../COMMON/ESM/MSG/EsmInformationResponse.c | 21 +++++++++++++++++++ .../COMMON/ESM/MSG/EsmInformationResponse.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/ESM/MSG/EsmStatus.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/ESM/MSG/EsmStatus.h | 21 +++++++++++++++++++ .../ESM/MSG/ModifyEpsBearerContextAccept.c | 21 +++++++++++++++++++ .../ESM/MSG/ModifyEpsBearerContextAccept.h | 21 +++++++++++++++++++ .../ESM/MSG/ModifyEpsBearerContextReject.c | 21 +++++++++++++++++++ .../ESM/MSG/ModifyEpsBearerContextReject.h | 21 +++++++++++++++++++ .../ESM/MSG/ModifyEpsBearerContextRequest.c | 21 +++++++++++++++++++ .../ESM/MSG/ModifyEpsBearerContextRequest.h | 21 +++++++++++++++++++ .../COMMON/ESM/MSG/PdnConnectivityReject.c | 21 +++++++++++++++++++ .../COMMON/ESM/MSG/PdnConnectivityReject.h | 21 +++++++++++++++++++ .../COMMON/ESM/MSG/PdnConnectivityRequest.c | 21 +++++++++++++++++++ .../COMMON/ESM/MSG/PdnConnectivityRequest.h | 21 +++++++++++++++++++ .../NAS/COMMON/ESM/MSG/PdnDisconnectReject.c | 21 +++++++++++++++++++ .../NAS/COMMON/ESM/MSG/PdnDisconnectReject.h | 21 +++++++++++++++++++ .../NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c | 21 +++++++++++++++++++ .../NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/ESM/MSG/esm_cause.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/ESM/MSG/esm_msg.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/ESM/MSG/esm_msg.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/AccessPointName.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/AccessPointName.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/AdditionalUpdateResult.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/AdditionalUpdateResult.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/AdditionalUpdateType.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/AdditionalUpdateType.h | 21 +++++++++++++++++++ .../COMMON/IES/ApnAggregateMaximumBitRate.c | 21 +++++++++++++++++++ .../COMMON/IES/ApnAggregateMaximumBitRate.h | 21 +++++++++++++++++++ .../IES/AuthenticationFailureParameter.c | 21 +++++++++++++++++++ .../IES/AuthenticationFailureParameter.h | 21 +++++++++++++++++++ .../COMMON/IES/AuthenticationParameterAutn.c | 21 +++++++++++++++++++ .../COMMON/IES/AuthenticationParameterAutn.h | 21 +++++++++++++++++++ .../COMMON/IES/AuthenticationParameterRand.c | 21 +++++++++++++++++++ .../COMMON/IES/AuthenticationParameterRand.h | 21 +++++++++++++++++++ .../IES/AuthenticationResponseParameter.c | 21 +++++++++++++++++++ .../IES/AuthenticationResponseParameter.h | 21 +++++++++++++++++++ .../COMMON/IES/CipheringKeySequenceNumber.c | 21 +++++++++++++++++++ .../COMMON/IES/CipheringKeySequenceNumber.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/Cli.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/Cli.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/CsfbResponse.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/CsfbResponse.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/DaylightSavingTime.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/DaylightSavingTime.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/DetachType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/DetachType.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/DrxParameter.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/DrxParameter.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EmergencyNumberList.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EmergencyNumberList.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EmmCause.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EmmCause.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsAttachResult.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsAttachResult.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsAttachType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsAttachType.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/EpsBearerContextStatus.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/EpsBearerContextStatus.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsBearerIdentity.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsBearerIdentity.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsMobileIdentity.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsMobileIdentity.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/EpsNetworkFeatureSupport.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/EpsNetworkFeatureSupport.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsQualityOfService.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsQualityOfService.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsUpdateResult.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsUpdateResult.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsUpdateType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EpsUpdateType.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EsmCause.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EsmCause.h | 21 +++++++++++++++++++ .../COMMON/IES/EsmInformationTransferFlag.c | 21 +++++++++++++++++++ .../COMMON/IES/EsmInformationTransferFlag.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EsmMessageContainer.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/EsmMessageContainer.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/GprsTimer.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/GprsTimer.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/GutiType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/GutiType.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/IdentityType2.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/IdentityType2.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/ImeisvRequest.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/ImeisvRequest.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/KsiAndSequenceNumber.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/KsiAndSequenceNumber.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/LcsClientIdentity.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/LcsClientIdentity.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/LcsIndicator.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/LcsIndicator.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/LinkedEpsBearerIdentity.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/LinkedEpsBearerIdentity.h | 21 +++++++++++++++++++ .../IES/LlcServiceAccessPointIdentifier.c | 21 +++++++++++++++++++ .../IES/LlcServiceAccessPointIdentifier.h | 21 +++++++++++++++++++ .../COMMON/IES/LocationAreaIdentification.c | 21 +++++++++++++++++++ .../COMMON/IES/LocationAreaIdentification.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/MessageType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/MessageType.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/MobileIdentity.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/MobileIdentity.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/MobileStationClassmark2.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/MobileStationClassmark2.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/MobileStationClassmark3.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/MobileStationClassmark3.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/MsNetworkCapability.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/MsNetworkCapability.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/MsNetworkFeatureSupport.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/MsNetworkFeatureSupport.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/NasKeySetIdentifier.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/NasKeySetIdentifier.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/NasMessageContainer.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/NasMessageContainer.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/NasRequestType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/NasRequestType.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/NasSecurityAlgorithms.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/NasSecurityAlgorithms.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/NetworkName.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/NetworkName.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/Nonce.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/Nonce.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PTmsiSignature.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PTmsiSignature.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/PacketFlowIdentifier.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/PacketFlowIdentifier.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PagingIdentity.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PagingIdentity.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PdnAddress.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PdnAddress.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PdnType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PdnType.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PlmnList.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/PlmnList.h | 21 +++++++++++++++++++ .../COMMON/IES/ProcedureTransactionIdentity.c | 21 +++++++++++++++++++ .../COMMON/IES/ProcedureTransactionIdentity.h | 21 +++++++++++++++++++ .../COMMON/IES/ProtocolConfigurationOptions.c | 21 +++++++++++++++++++ .../COMMON/IES/ProtocolConfigurationOptions.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/ProtocolDiscriminator.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/ProtocolDiscriminator.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/QualityOfService.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/QualityOfService.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/RadioPriority.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/RadioPriority.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/SecurityHeaderType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/SecurityHeaderType.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/ServiceType.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/ServiceType.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/ShortMac.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/ShortMac.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/SsCode.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/SsCode.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/SupportedCodecList.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/SupportedCodecList.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/TimeZone.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/TimeZone.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/TimeZoneAndTime.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/TimeZoneAndTime.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/TmsiStatus.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/TmsiStatus.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/TrackingAreaIdentity.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/TrackingAreaIdentity.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/TrackingAreaIdentityList.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/TrackingAreaIdentityList.h | 21 +++++++++++++++++++ .../IES/TrafficFlowAggregateDescription.c | 21 +++++++++++++++++++ .../IES/TrafficFlowAggregateDescription.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/TrafficFlowTemplate.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/TrafficFlowTemplate.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/TransactionIdentifier.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/TransactionIdentifier.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/UeNetworkCapability.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/IES/UeNetworkCapability.h | 21 +++++++++++++++++++ ...UeRadioCapabilityInformationUpdateNeeded.c | 21 +++++++++++++++++++ ...UeRadioCapabilityInformationUpdateNeeded.h | 21 +++++++++++++++++++ .../NAS/COMMON/IES/UeSecurityCapability.c | 21 +++++++++++++++++++ .../NAS/COMMON/IES/UeSecurityCapability.h | 21 +++++++++++++++++++ .../VoiceDomainPreferenceAndUeUsageSetting.c | 21 +++++++++++++++++++ .../VoiceDomainPreferenceAndUeUsageSetting.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/OctetString.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/OctetString.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/TLVDecoder.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/TLVDecoder.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/TLVEncoder.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/TLVEncoder.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/device.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/device.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/memory.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/memory.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/nas_log.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/nas_log.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/nas_timer.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/nas_timer.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/parser.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/parser.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/socket.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/socket.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/stty.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/UTIL/tst/timer.c | 21 +++++++++++++++++++ openair3/NAS/COMMON/securityDef.h | 21 +++++++++++++++++++ openair3/NAS/COMMON/userDef.h | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/as_data.c | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/as_data.h | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/as_process.c | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/as_process.h | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c | 21 +++++++++++++++++++ .../TEST/AS_SIMULATOR/as_simulator_parser.c | 21 +++++++++++++++++++ .../TEST/AS_SIMULATOR/as_simulator_parser.h | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/nas_data.c | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/nas_data.h | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/nas_process.c | 21 +++++++++++++++++++ openair3/NAS/TEST/AS_SIMULATOR/nas_process.h | 21 +++++++++++++++++++ openair3/NAS/TEST/NETWORK/network_parser.c | 21 +++++++++++++++++++ openair3/NAS/TEST/NETWORK/network_parser.h | 21 +++++++++++++++++++ openair3/NAS/TEST/NETWORK/network_simulator.c | 21 +++++++++++++++++++ openair3/NAS/TEST/USER/user_parser.c | 21 +++++++++++++++++++ openair3/NAS/TEST/USER/user_parser.h | 21 +++++++++++++++++++ openair3/NAS/TEST/USER/user_simulator.c | 21 +++++++++++++++++++ openair3/NAS/TOOLS/network.h | 21 +++++++++++++++++++ openair3/NAS/TOOLS/ue_data.c | 21 +++++++++++++++++++ openair3/NAS/TOOLS/usim_data.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/at_command.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/at_command.h | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/at_error.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/at_error.h | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/at_response.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/at_response.h | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/tst/at_parser.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/user_api.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/user_api.h | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/user_indication.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USER/user_indication.h | 21 +++++++++++++++++++ openair3/NAS/UE/API/USIM/aka_functions.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USIM/aka_functions.h | 21 +++++++++++++++++++ openair3/NAS/UE/API/USIM/usim_api.c | 21 +++++++++++++++++++ openair3/NAS/UE/API/USIM/usim_api.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/Attach.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/Authentication.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/Detach.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/EmmStatusHdl.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/Identification.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/IdleMode.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/IdleMode.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/LowerLayer.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/LowerLayer.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/EmmDeregistered.c | 21 +++++++++++++++++++ .../UE/EMM/SAP/EmmDeregisteredAttachNeeded.c | 21 +++++++++++++++++++ .../SAP/EmmDeregisteredAttemptingToAttach.c | 21 +++++++++++++++++++ .../NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c | 21 +++++++++++++++++++ .../EMM/SAP/EmmDeregisteredLimitedService.c | 21 +++++++++++++++++++ .../EMM/SAP/EmmDeregisteredNoCellAvailable.c | 21 +++++++++++++++++++ .../NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c | 21 +++++++++++++++++++ .../UE/EMM/SAP/EmmDeregisteredNormalService.c | 21 +++++++++++++++++++ .../UE/EMM/SAP/EmmDeregisteredPlmnSearch.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/EmmNull.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/EmmRegistered.c | 21 +++++++++++++++++++ .../EMM/SAP/EmmRegisteredAttemptingToUpdate.c | 21 +++++++++++++++++++ .../SAP/EmmRegisteredImsiDetachInitiated.c | 21 +++++++++++++++++++ .../NAS/UE/EMM/SAP/EmmRegisteredInitiated.c | 21 +++++++++++++++++++ .../UE/EMM/SAP/EmmRegisteredLimitedService.c | 21 +++++++++++++++++++ .../UE/EMM/SAP/EmmRegisteredNoCellAvailable.c | 21 +++++++++++++++++++ .../UE/EMM/SAP/EmmRegisteredNormalService.c | 21 +++++++++++++++++++ .../NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c | 21 +++++++++++++++++++ .../UE/EMM/SAP/EmmRegisteredUpdateNeeded.c | 21 +++++++++++++++++++ .../UE/EMM/SAP/EmmServiceRequestInitiated.c | 21 +++++++++++++++++++ .../SAP/EmmTrackingAreaUpdatingInitiated.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_as.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_as.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_asDef.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_esm.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_esm.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_esmDef.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_fsm.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_fsm.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_recv.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_recv.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_reg.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_reg.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_regDef.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_sap.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_sap.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_send.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SAP/emm_send.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/SecurityModeControl.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/ServiceRequestHdl.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/TrackingAreaUpdate.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/emmData.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/emm_main.c | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/emm_main.h | 21 +++++++++++++++++++ openair3/NAS/UE/EMM/emm_proc.h | 21 +++++++++++++++++++ .../ESM/DedicatedEpsBearerContextActivation.c | 21 +++++++++++++++++++ .../ESM/DefaultEpsBearerContextActivation.c | 21 +++++++++++++++++++ .../NAS/UE/ESM/EpsBearerContextDeactivation.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/EsmStatusHdl.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/PdnConnectivity.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/PdnDisconnect.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/SAP/esm_recv.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/SAP/esm_recv.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/SAP/esm_sap.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/SAP/esm_sap.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/SAP/esm_sapDef.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/SAP/esm_send.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/SAP/esm_send.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esmData.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_ebr.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_ebr.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_ebr_context.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_ebr_context.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_ip.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_main.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_main.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_proc.h | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_pt.c | 21 +++++++++++++++++++ openair3/NAS/UE/ESM/esm_pt.h | 21 +++++++++++++++++++ openair3/NAS/UE/UEprocess.c | 21 +++++++++++++++++++ openair3/NAS/UE/nas_itti_messaging.c | 21 +++++++++++++++++++ openair3/NAS/UE/nas_itti_messaging.h | 21 +++++++++++++++++++ openair3/NAS/UE/nas_network.c | 21 +++++++++++++++++++ openair3/NAS/UE/nas_network.h | 21 +++++++++++++++++++ openair3/NAS/UE/nas_parser.c | 21 +++++++++++++++++++ openair3/NAS/UE/nas_parser.h | 21 +++++++++++++++++++ openair3/NAS/UE/nas_proc.c | 21 +++++++++++++++++++ openair3/NAS/UE/nas_proc.h | 21 +++++++++++++++++++ openair3/NAS/UE/nas_ue_task.c | 21 +++++++++++++++++++ openair3/NAS/UE/nas_user.c | 21 +++++++++++++++++++ openair3/NAS/UE/nas_user.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_common.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_common.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB.h | 21 +++++++++++++++++++ .../s1ap_eNB_context_management_procedures.c | 21 +++++++++++++++++++ .../s1ap_eNB_context_management_procedures.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_decoder.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_decoder.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_default_values.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_defs.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_encoder.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_encoder.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_handlers.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_handlers.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_itti_messaging.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_itti_messaging.h | 21 +++++++++++++++++++ .../S1AP/s1ap_eNB_management_procedures.c | 21 +++++++++++++++++++ .../S1AP/s1ap_eNB_management_procedures.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_nas_procedures.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_nas_procedures.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_nnsf.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_nnsf.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_overload.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_overload.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_trace.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_trace.h | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_ue_context.c | 21 +++++++++++++++++++ openair3/S1AP/s1ap_eNB_ue_context.h | 21 +++++++++++++++++++ openair3/SCTP/sctp_common.c | 21 +++++++++++++++++++ openair3/SCTP/sctp_common.h | 21 +++++++++++++++++++ openair3/SCTP/sctp_default_values.h | 21 +++++++++++++++++++ openair3/SCTP/sctp_eNB_defs.h | 21 +++++++++++++++++++ openair3/SCTP/sctp_eNB_itti_messaging.c | 21 +++++++++++++++++++ openair3/SCTP/sctp_eNB_itti_messaging.h | 21 +++++++++++++++++++ openair3/SCTP/sctp_eNB_task.c | 21 +++++++++++++++++++ openair3/SCTP/sctp_eNB_task.h | 21 +++++++++++++++++++ openair3/SCTP/sctp_primitives_client.c | 21 +++++++++++++++++++ openair3/SCTP/sctp_primitives_client.h | 21 +++++++++++++++++++ openair3/SECU/kdf.c | 21 +++++++++++++++++++ openair3/SECU/key_nas_deriver.c | 21 +++++++++++++++++++ openair3/SECU/key_nas_encryption.c | 21 +++++++++++++++++++ openair3/SECU/nas_stream_eea1.c | 21 +++++++++++++++++++ openair3/SECU/nas_stream_eea2.c | 21 +++++++++++++++++++ openair3/SECU/nas_stream_eia1.c | 21 +++++++++++++++++++ openair3/SECU/nas_stream_eia2.c | 21 +++++++++++++++++++ openair3/SECU/rijndael.c | 21 +++++++++++++++++++ openair3/SECU/rijndael.h | 21 +++++++++++++++++++ openair3/SECU/secu_defs.h | 21 +++++++++++++++++++ openair3/SECU/snow3g.c | 21 +++++++++++++++++++ openair3/SECU/snow3g.h | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/generate_scenario.c | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/generate_scenario.h | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario.c | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario.h | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario_decode.c | 21 +++++++++++++++++++ .../TEST/EPC_TEST/play_scenario_display.c | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario_fsm.c | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario_parse.c | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 21 +++++++++++++++++++ .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 21 +++++++++++++++++++ .../EPC_TEST/play_scenario_s1ap_eNB_defs.h | 21 +++++++++++++++++++ openair3/TEST/EPC_TEST/play_scenario_sctp.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_client_test.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_itti_test.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_list_benchmark.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_s1ap_test.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_sctp_test.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_test_s1c.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_test_s1c.h | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_test_s1c_s1ap.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_test_s1c_s1ap.h | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_test_s1c_scenario.c | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_test_s1c_scenario.h | 21 +++++++++++++++++++ openair3/TEST/oaisim_mme_test_s1c_scenario1.c | 21 +++++++++++++++++++ openair3/TEST/test_aes128_cmac_encrypt.c | 21 +++++++++++++++++++ openair3/TEST/test_aes128_ctr_decrypt.c | 21 +++++++++++++++++++ openair3/TEST/test_aes128_ctr_encrypt.c | 21 +++++++++++++++++++ openair3/TEST/test_kdf.c | 21 +++++++++++++++++++ openair3/TEST/test_s1ap.c | 21 +++++++++++++++++++ openair3/TEST/test_secu.c | 21 +++++++++++++++++++ openair3/TEST/test_secu_kenb.c | 21 +++++++++++++++++++ openair3/TEST/test_secu_knas.c | 21 +++++++++++++++++++ openair3/TEST/test_secu_knas_encrypt_eea1.c | 21 +++++++++++++++++++ openair3/TEST/test_secu_knas_encrypt_eea2.c | 21 +++++++++++++++++++ openair3/TEST/test_secu_knas_encrypt_eia1.c | 21 +++++++++++++++++++ openair3/TEST/test_secu_knas_encrypt_eia2.c | 21 +++++++++++++++++++ openair3/TEST/test_secu_knas_stream_int.c | 21 +++++++++++++++++++ openair3/UDP/udp_eNB_task.c | 21 +++++++++++++++++++ openair3/UDP/udp_eNB_task.h | 21 +++++++++++++++++++ openair3/UTILS/conversions.c | 21 +++++++++++++++++++ openair3/UTILS/conversions.h | 21 +++++++++++++++++++ openair3/UTILS/enum_string.c | 21 +++++++++++++++++++ openair3/UTILS/enum_string.h | 21 +++++++++++++++++++ openair3/UTILS/log.c | 21 +++++++++++++++++++ openair3/UTILS/log.h | 21 +++++++++++++++++++ openair3/UTILS/mcc_mnc_itu.c | 21 +++++++++++++++++++ openair3/UTILS/mcc_mnc_itu.h | 21 +++++++++++++++++++ openair3/UTILS/mme_config.c | 21 +++++++++++++++++++ openair3/UTILS/mme_config.h | 21 +++++++++++++++++++ openair3/UTILS/mme_default_values.h | 21 +++++++++++++++++++ .../ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c | 21 +++++++++++++++++++ .../ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h | 21 +++++++++++++++++++ targets/ARCH/COMMON/common_lib.c | 21 +++++++++++++++++++ targets/ARCH/COMMON/common_lib.h | 21 +++++++++++++++++++ targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c | 21 +++++++++++++++++++ targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c | 21 +++++++++++++++++++ .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 21 +++++++++++++++++++ .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 21 +++++++++++++++++++ targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DEFS/openair_device.h | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DEFS/pcie_interface.h | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h | 21 +++++++++++++++++++ .../ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c | 21 +++++++++++++++++++ .../ARCH/EXMIMO/DRIVER/eurecom/module_main.c | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h | 21 +++++++++++++++++++ .../ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c | 21 +++++++++++++++++++ .../ARCH/EXMIMO/DRIVER/exmimo3/module_main.c | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h | 21 +++++++++++++++++++ .../EXMIMO/DRIVER/telecomparistech/em1_dev.c | 21 +++++++++++++++++++ .../EXMIMO/DRIVER/telecomparistech/em1_drv.c | 21 +++++++++++++++++++ .../EXMIMO/DRIVER/telecomparistech/em1_drv.h | 21 +++++++++++++++++++ .../DRIVER/telecomparistech/em1_fifos.c | 21 +++++++++++++++++++ .../DRIVER/telecomparistech/em1_ioctl.c | 21 +++++++++++++++++++ .../EXMIMO/DRIVER/telecomparistech/em1_mmap.c | 21 +++++++++++++++++++ .../EXMIMO/DRIVER/telecomparistech/em1_rw.c | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/USERSPACE/LIB/example.c | 21 +++++++++++++++++++ .../ARCH/EXMIMO/USERSPACE/LIB/gain_control.c | 21 +++++++++++++++++++ .../ARCH/EXMIMO/USERSPACE/LIB/gain_control.h | 21 +++++++++++++++++++ .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 21 +++++++++++++++++++ .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h | 21 +++++++++++++++++++ .../EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c | 21 +++++++++++++++++++ .../EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h | 21 +++++++++++++++++++ targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h | 21 +++++++++++++++++++ targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp | 21 +++++++++++++++++++ .../ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp | 21 +++++++++++++++++++ targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 21 +++++++++++++++++++ targets/COMMON/create_tasks.c | 21 +++++++++++++++++++ targets/COMMON/create_tasks.h | 21 +++++++++++++++++++ targets/RT/USER/TOOLS/thread_ipc.c | 21 +++++++++++++++++++ targets/RT/USER/TOOLS/thread_ipc.h | 21 +++++++++++++++++++ targets/RT/USER/UE_transport_IQ.c | 21 +++++++++++++++++++ targets/RT/USER/condtest.c | 21 +++++++++++++++++++ targets/RT/USER/eNB_transport_IQ.c | 21 +++++++++++++++++++ targets/RT/USER/emos-raw.c | 21 +++++++++++++++++++ targets/RT/USER/lte-enb.c | 21 +++++++++++++++++++ targets/RT/USER/lte-softmodem.c | 21 +++++++++++++++++++ targets/RT/USER/lte-ue.c | 21 +++++++++++++++++++ targets/RT/USER/msg_helper.c | 21 +++++++++++++++++++ targets/RT/USER/msg_many.c | 21 +++++++++++++++++++ targets/RT/USER/msg_many.h | 21 +++++++++++++++++++ targets/RT/USER/rrh.c | 21 +++++++++++++++++++ targets/RT/USER/rrh_gw.c | 21 +++++++++++++++++++ targets/RT/USER/rrh_gw.h | 21 +++++++++++++++++++ targets/RT/USER/rrh_gw_externs.h | 21 +++++++++++++++++++ targets/RT/USER/rt_wrapper.c | 21 +++++++++++++++++++ targets/RT/USER/rt_wrapper.h | 21 +++++++++++++++++++ targets/RT/USER/sleeptest.c | 21 +++++++++++++++++++ targets/RT/USER/stats.c | 21 +++++++++++++++++++ targets/RT/USER/stats.h | 21 +++++++++++++++++++ targets/RT/USER/synctest.c | 21 +++++++++++++++++++ targets/SIMU/PROC/Process.c | 21 +++++++++++++++++++ targets/SIMU/PROC/Process.h | 21 +++++++++++++++++++ targets/SIMU/PROC/Tsync.h | 21 +++++++++++++++++++ targets/SIMU/PROC/channel_sim_proc.c | 21 +++++++++++++++++++ targets/SIMU/PROC/channel_sim_proc.h | 21 +++++++++++++++++++ targets/SIMU/PROC/interface.h | 21 +++++++++++++++++++ targets/SIMU/USER/channel_sim.c | 21 +++++++++++++++++++ targets/SIMU/USER/cor_SF_sim.c | 21 +++++++++++++++++++ targets/SIMU/USER/cor_SF_sim.h | 21 +++++++++++++++++++ targets/SIMU/USER/event_handler.c | 21 +++++++++++++++++++ targets/SIMU/USER/event_handler.h | 21 +++++++++++++++++++ targets/SIMU/USER/init_lte.c | 21 +++++++++++++++++++ targets/SIMU/USER/init_lte.h | 21 +++++++++++++++++++ targets/SIMU/USER/oaisim.c | 21 +++++++++++++++++++ targets/SIMU/USER/oaisim.h | 21 +++++++++++++++++++ targets/SIMU/USER/oaisim_config.c | 21 +++++++++++++++++++ targets/SIMU/USER/oaisim_config.h | 21 +++++++++++++++++++ targets/SIMU/USER/oaisim_functions.c | 21 +++++++++++++++++++ targets/SIMU/USER/oaisim_functions.h | 21 +++++++++++++++++++ targets/SIMU/USER/oaisim_pad.c | 21 +++++++++++++++++++ targets/SIMU/USER/phy_procedures_sim_form.c | 21 +++++++++++++++++++ targets/SIMU/USER/phy_procedures_sim_form.h | 21 +++++++++++++++++++ targets/SIMU/USER/sinr_sim.c | 21 +++++++++++++++++++ targets/TEST/AT_COMMANDS/oaisim.c | 21 +++++++++++++++++++ targets/TEST/PACKET_TRACER/pt.c | 21 +++++++++++++++++++ targets/TEST/PDCP/test_pdcp.c | 21 +++++++++++++++++++ targets/TEST/PDCP/test_pdcp.h | 21 +++++++++++++++++++ targets/TEST/PDCP/test_util.h | 21 +++++++++++++++++++ targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c | 21 +++++++++++++++++++ targets/TEST/RLC_AM_V9.3.0/oaisim.c | 21 +++++++++++++++++++ targets/TEST/RLC_UM_V9.3.0/oaisim.c | 21 +++++++++++++++++++ .../TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp | 21 +++++++++++++++++++ targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp | 21 +++++++++++++++++++ targets/TEST/ROHDE_SCHWARZ/TcpClient.h | 21 +++++++++++++++++++ 1426 files changed, 29946 insertions(+) mode change 100755 => 100644 openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/Message.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/Message.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/platform_dim.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/test/TestScenario.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/test/TestScenario.h mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/test/test.cpp mode change 100755 => 100644 openair2/RRM_4_RRC_LITE/src/version.h mode change 100755 => 100644 openair2/UTIL/LISTS/list.h mode change 100755 => 100644 targets/TEST/AT_COMMANDS/oaisim.c mode change 100755 => 100644 targets/TEST/PDCP/test_pdcp.c mode change 100755 => 100644 targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c mode change 100755 => 100644 targets/TEST/RLC_AM_V9.3.0/oaisim.c mode change 100755 => 100644 targets/TEST/RLC_UM_V9.3.0/oaisim.c diff --git a/common/utils/asn1_conversions.h b/common/utils/asn1_conversions.h index 9afa670cb4..8eed4faaad 100644 --- a/common/utils/asn1_conversions.h +++ b/common/utils/asn1_conversions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef ASN1_CONVERSIONS_H_ #define ASN1_CONVERSIONS_H_ diff --git a/common/utils/assertions.h b/common/utils/assertions.h index aa77fa0e59..18675fb8fb 100644 --- a/common/utils/assertions.h +++ b/common/utils/assertions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UTILS_ASSERTIONS_H_ #define UTILS_ASSERTIONS_H_ diff --git a/common/utils/itti/assertions.h b/common/utils/itti/assertions.h index 7e90d63d15..77bd9e4bcf 100644 --- a/common/utils/itti/assertions.h +++ b/common/utils/itti/assertions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti/backtrace.c b/common/utils/itti/backtrace.c index b44cd8fd8d..5044c01e5e 100644 --- a/common/utils/itti/backtrace.c +++ b/common/utils/itti/backtrace.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti/backtrace.h b/common/utils/itti/backtrace.h index 1db8e4d4f3..701bc0ab0e 100644 --- a/common/utils/itti/backtrace.h +++ b/common/utils/itti/backtrace.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #ifndef BACKTRACE_H_ diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c index 9469f0fbfc..387c23e1cc 100644 --- a/common/utils/itti/intertask_interface.c +++ b/common/utils/itti/intertask_interface.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define _GNU_SOURCE #include #include diff --git a/common/utils/itti/intertask_interface.h b/common/utils/itti/intertask_interface.h index a235ae86e8..a2137c119d 100644 --- a/common/utils/itti/intertask_interface.h +++ b/common/utils/itti/intertask_interface.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation * @ingroup _ref_implementation_ diff --git a/common/utils/itti/intertask_interface_dump.c b/common/utils/itti/intertask_interface_dump.c index 22082c9840..8f08475c6a 100644 --- a/common/utils/itti/intertask_interface_dump.c +++ b/common/utils/itti/intertask_interface_dump.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** @brief Intertask Interface Signal Dumper * Allows users to connect their itti_analyzer to this process and dump * signals exchanged between tasks. diff --git a/common/utils/itti/intertask_interface_dump.h b/common/utils/itti/intertask_interface_dump.h index d69424e89a..14b3b4dbb6 100644 --- a/common/utils/itti/intertask_interface_dump.h +++ b/common/utils/itti/intertask_interface_dump.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef INTERTASK_INTERFACE_DUMP_H_ #define INTERTASK_INTERFACE_DUMP_H_ diff --git a/common/utils/itti/intertask_interface_init.h b/common/utils/itti/intertask_interface_init.h index 6f30111b1f..df87202955 100644 --- a/common/utils/itti/intertask_interface_init.h +++ b/common/utils/itti/intertask_interface_init.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation * @ingroup _ref_implementation_ diff --git a/common/utils/itti/intertask_interface_types.h b/common/utils/itti/intertask_interface_types.h index b7d9d47eaf..d7386b0b73 100644 --- a/common/utils/itti/intertask_interface_types.h +++ b/common/utils/itti/intertask_interface_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms * Implementation * @ingroup _ref_implementation_ diff --git a/common/utils/itti/intertask_messages_def.h b/common/utils/itti/intertask_messages_def.h index 0023afb27d..d75f927a92 100644 --- a/common/utils/itti/intertask_messages_def.h +++ b/common/utils/itti/intertask_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* This message asks for task initialization */ MESSAGE_DEF(INITIALIZE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, initialize_message) diff --git a/common/utils/itti/intertask_messages_types.h b/common/utils/itti/intertask_messages_types.h index c75637c5d6..2aa8545ee0 100644 --- a/common/utils/itti/intertask_messages_types.h +++ b/common/utils/itti/intertask_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * intertask_messages_types.h * diff --git a/common/utils/itti/itti_types.h b/common/utils/itti/itti_types.h index c67ac2b85f..8cf0d7a581 100644 --- a/common/utils/itti/itti_types.h +++ b/common/utils/itti/itti_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** @brief Intertask Interface common types * Contains type definitions used for generating and parsing ITTI messages. * @author Laurent Winckel diff --git a/common/utils/itti/memory_pools.c b/common/utils/itti/memory_pools.c index 24edcc5761..b317cfd2fa 100644 --- a/common/utils/itti/memory_pools.c +++ b/common/utils/itti/memory_pools.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef RTAI # include #endif diff --git a/common/utils/itti/memory_pools.h b/common/utils/itti/memory_pools.h index b95904c741..6c6e5a5d80 100644 --- a/common/utils/itti/memory_pools.h +++ b/common/utils/itti/memory_pools.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef MEMORY_POOLS_H_ #define MEMORY_POOLS_H_ diff --git a/common/utils/itti/messages_def.h b/common/utils/itti/messages_def.h index 384a404993..0366cf8f50 100644 --- a/common/utils/itti/messages_def.h +++ b/common/utils/itti/messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" #include "timer_messages_def.h" diff --git a/common/utils/itti/messages_types.h b/common/utils/itti/messages_types.h index e300eca53b..0fbdf29ecc 100644 --- a/common/utils/itti/messages_types.h +++ b/common/utils/itti/messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * messages_types.h * diff --git a/common/utils/itti/signals.c b/common/utils/itti/signals.c index d5732d296b..e495e301f8 100644 --- a/common/utils/itti/signals.c +++ b/common/utils/itti/signals.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti/signals.h b/common/utils/itti/signals.h index 7a1f335e83..efb25f34d8 100644 --- a/common/utils/itti/signals.h +++ b/common/utils/itti/signals.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef SIGNALS_H_ #define SIGNALS_H_ diff --git a/common/utils/itti/tasks_def.h b/common/utils/itti/tasks_def.h index e762a77b9d..18ac6ac5c9 100644 --- a/common/utils/itti/tasks_def.h +++ b/common/utils/itti/tasks_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10) diff --git a/common/utils/itti/timer.c b/common/utils/itti/timer.c index 8c3d359294..5486c76d83 100644 --- a/common/utils/itti/timer.c +++ b/common/utils/itti/timer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti/timer.h b/common/utils/itti/timer.h index 336ef8da05..22d1d75d46 100644 --- a/common/utils/itti/timer.h +++ b/common/utils/itti/timer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef TIMER_H_ #define TIMER_H_ diff --git a/common/utils/itti/timer_messages_def.h b/common/utils/itti/timer_messages_def.h index 47955de591..4cef672c13 100644 --- a/common/utils/itti/timer_messages_def.h +++ b/common/utils/itti/timer_messages_def.h @@ -1 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + MESSAGE_DEF(TIMER_HAS_EXPIRED, MESSAGE_PRIORITY_MED_PLUS, timer_has_expired_t, timer_has_expired) diff --git a/common/utils/itti/timer_messages_types.h b/common/utils/itti/timer_messages_types.h index d245c12987..4abf34605d 100644 --- a/common/utils/itti/timer_messages_types.h +++ b/common/utils/itti/timer_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef TIMER_MESSAGES_TYPES_H_ #define TIMER_MESSAGES_TYPES_H_ diff --git a/common/utils/itti_analyzer/common/itti_types.h b/common/utils/itti_analyzer/common/itti_types.h index 3abea6d0ae..a423458349 100644 --- a/common/utils/itti_analyzer/common/itti_types.h +++ b/common/utils/itti_analyzer/common/itti_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** @brief Intertask Interface common types * Contains type definitions used for generating and parsing ITTI messages. * @author Laurent Winckel diff --git a/common/utils/itti_analyzer/common/logs.h b/common/utils/itti_analyzer/common/logs.h index 166e54258f..8d5c4876ff 100644 --- a/common/utils/itti_analyzer/common/logs.h +++ b/common/utils/itti_analyzer/common/logs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * logs.h * diff --git a/common/utils/itti_analyzer/common/rc.h b/common/utils/itti_analyzer/common/rc.h index ff72228fc7..9643d712eb 100644 --- a/common/utils/itti_analyzer/common/rc.h +++ b/common/utils/itti_analyzer/common/rc.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/common/utils/itti_analyzer/itti_analyzer.c b/common/utils/itti_analyzer/itti_analyzer.c index 681d6af509..e19b375798 100644 --- a/common/utils/itti_analyzer/itti_analyzer.c +++ b/common/utils/itti_analyzer/itti_analyzer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/buffers.c b/common/utils/itti_analyzer/libbuffers/buffers.c index d9f802f54b..a2d526d584 100644 --- a/common/utils/itti_analyzer/libbuffers/buffers.c +++ b/common/utils/itti_analyzer/libbuffers/buffers.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/buffers.h b/common/utils/itti_analyzer/libbuffers/buffers.h index a98e8417ce..7dd59b8067 100644 --- a/common/utils/itti_analyzer/libbuffers/buffers.h +++ b/common/utils/itti_analyzer/libbuffers/buffers.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #ifndef BUFFERS_H_ diff --git a/common/utils/itti_analyzer/libbuffers/file.c b/common/utils/itti_analyzer/libbuffers/file.c index 2b530521a4..ea429a66d1 100644 --- a/common/utils/itti_analyzer/libbuffers/file.c +++ b/common/utils/itti_analyzer/libbuffers/file.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/file.h b/common/utils/itti_analyzer/libbuffers/file.h index 8dc4b141cc..36912a69ba 100644 --- a/common/utils/itti_analyzer/libbuffers/file.h +++ b/common/utils/itti_analyzer/libbuffers/file.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef FILE_H_ #define FILE_H_ diff --git a/common/utils/itti_analyzer/libbuffers/socket.c b/common/utils/itti_analyzer/libbuffers/socket.c index 24ef122946..0e1ad49e49 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.c +++ b/common/utils/itti_analyzer/libbuffers/socket.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/socket.h b/common/utils/itti_analyzer/libbuffers/socket.h index 0e7c0ab1e5..d64fd46b91 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.h +++ b/common/utils/itti_analyzer/libbuffers/socket.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/common/utils/itti_analyzer/libparser/array_type.c b/common/utils/itti_analyzer/libparser/array_type.c index 8235024fa7..028835e9d2 100644 --- a/common/utils/itti_analyzer/libparser/array_type.c +++ b/common/utils/itti_analyzer/libparser/array_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/array_type.h b/common/utils/itti_analyzer/libparser/array_type.h index 3d7273c1e2..9e13dec282 100644 --- a/common/utils/itti_analyzer/libparser/array_type.h +++ b/common/utils/itti_analyzer/libparser/array_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef ARRAY_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/enum_type.c b/common/utils/itti_analyzer/libparser/enum_type.c index 35fef35b4f..a00f654556 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.c +++ b/common/utils/itti_analyzer/libparser/enum_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/enum_type.h b/common/utils/itti_analyzer/libparser/enum_type.h index 3c3d918b1c..9faa21b79a 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.h +++ b/common/utils/itti_analyzer/libparser/enum_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef ENUM_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.c b/common/utils/itti_analyzer/libparser/enum_value_type.c index 89e0f86e90..8035acb257 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.c +++ b/common/utils/itti_analyzer/libparser/enum_value_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.h b/common/utils/itti_analyzer/libparser/enum_value_type.h index 8f6249733a..d30e3a6706 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.h +++ b/common/utils/itti_analyzer/libparser/enum_value_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef ENUM_VALUE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/field_type.c b/common/utils/itti_analyzer/libparser/field_type.c index bf62a06a24..9415ad0eff 100644 --- a/common/utils/itti_analyzer/libparser/field_type.c +++ b/common/utils/itti_analyzer/libparser/field_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/field_type.h b/common/utils/itti_analyzer/libparser/field_type.h index 9e2b5d56ad..f9bdd78cb7 100644 --- a/common/utils/itti_analyzer/libparser/field_type.h +++ b/common/utils/itti_analyzer/libparser/field_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef FIELD_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/file_type.c b/common/utils/itti_analyzer/libparser/file_type.c index c63ab4946a..3e9bf697a6 100644 --- a/common/utils/itti_analyzer/libparser/file_type.c +++ b/common/utils/itti_analyzer/libparser/file_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/file_type.h b/common/utils/itti_analyzer/libparser/file_type.h index 5f9a864054..7142f30d51 100644 --- a/common/utils/itti_analyzer/libparser/file_type.h +++ b/common/utils/itti_analyzer/libparser/file_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef FILE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.c b/common/utils/itti_analyzer/libparser/fundamental_type.c index 66117c9ec5..9383431c84 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.c +++ b/common/utils/itti_analyzer/libparser/fundamental_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.h b/common/utils/itti_analyzer/libparser/fundamental_type.h index 3d0870321b..94e939e117 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.h +++ b/common/utils/itti_analyzer/libparser/fundamental_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef FUNDAMENTAL_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/intertask_contexts.h b/common/utils/itti_analyzer/libparser/intertask_contexts.h index 0968d8f6aa..a490064612 100644 --- a/common/utils/itti_analyzer/libparser/intertask_contexts.h +++ b/common/utils/itti_analyzer/libparser/intertask_contexts.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "fundamental_type.h" #include "struct_type.h" diff --git a/common/utils/itti_analyzer/libparser/pointer_type.c b/common/utils/itti_analyzer/libparser/pointer_type.c index f35b96e29c..8b263f64a9 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.c +++ b/common/utils/itti_analyzer/libparser/pointer_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/pointer_type.h b/common/utils/itti_analyzer/libparser/pointer_type.h index 6560f4f45d..6f4f644e73 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.h +++ b/common/utils/itti_analyzer/libparser/pointer_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef POINTER_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/reference_type.c b/common/utils/itti_analyzer/libparser/reference_type.c index e6d080e656..7cd3b0a509 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.c +++ b/common/utils/itti_analyzer/libparser/reference_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/reference_type.h b/common/utils/itti_analyzer/libparser/reference_type.h index fe0c84f9d8..5f9d0a0b88 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.h +++ b/common/utils/itti_analyzer/libparser/reference_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef REFERENCE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/struct_type.c b/common/utils/itti_analyzer/libparser/struct_type.c index 0cc3510947..758851269d 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.c +++ b/common/utils/itti_analyzer/libparser/struct_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/struct_type.h b/common/utils/itti_analyzer/libparser/struct_type.h index a3e1fcf12f..1efa4ef324 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.h +++ b/common/utils/itti_analyzer/libparser/struct_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef STRUCT_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/typedef_type.c b/common/utils/itti_analyzer/libparser/typedef_type.c index dc42dca9f3..6c7246b47c 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.c +++ b/common/utils/itti_analyzer/libparser/typedef_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/typedef_type.h b/common/utils/itti_analyzer/libparser/typedef_type.h index 878176005f..cad3436a63 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.h +++ b/common/utils/itti_analyzer/libparser/typedef_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef TYPEDEF_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/types.c b/common/utils/itti_analyzer/libparser/types.c index 3248115ba3..6f36089a7b 100644 --- a/common/utils/itti_analyzer/libparser/types.c +++ b/common/utils/itti_analyzer/libparser/types.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/types.h b/common/utils/itti_analyzer/libparser/types.h index 2a8e55951a..0f7812b84b 100644 --- a/common/utils/itti_analyzer/libparser/types.h +++ b/common/utils/itti_analyzer/libparser/types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "buffers.h" diff --git a/common/utils/itti_analyzer/libparser/union_type.c b/common/utils/itti_analyzer/libparser/union_type.c index 13db1f1755..f2518685c6 100644 --- a/common/utils/itti_analyzer/libparser/union_type.c +++ b/common/utils/itti_analyzer/libparser/union_type.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libparser/union_type.h b/common/utils/itti_analyzer/libparser/union_type.h index 2df5be43c0..e4552bf770 100644 --- a/common/utils/itti_analyzer/libparser/union_type.h +++ b/common/utils/itti_analyzer/libparser/union_type.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "types.h" #ifndef UNION_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c index 27b07afa66..651fcde2f7 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.c +++ b/common/utils/itti_analyzer/libparser/xml_parse.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/common/utils/itti_analyzer/libparser/xml_parse.h b/common/utils/itti_analyzer/libparser/xml_parse.h index d699ed5eeb..968fb96b68 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.h +++ b/common/utils/itti_analyzer/libparser/xml_parse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "rc.h" #include "types.h" diff --git a/common/utils/itti_analyzer/libresolver/locate_root.c b/common/utils/itti_analyzer/libresolver/locate_root.c index 61c0b45de5..f78674108c 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.c +++ b/common/utils/itti_analyzer/libresolver/locate_root.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/common/utils/itti_analyzer/libresolver/locate_root.h b/common/utils/itti_analyzer/libresolver/locate_root.h index 9582b10192..0e952d8f59 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.h +++ b/common/utils/itti_analyzer/libresolver/locate_root.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef LOCATE_ROOT_H_ #define LOCATE_ROOT_H_ diff --git a/common/utils/itti_analyzer/libresolver/resolvers.c b/common/utils/itti_analyzer/libresolver/resolvers.c index 840d5ab2d0..856a212396 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.c +++ b/common/utils/itti_analyzer/libresolver/resolvers.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libresolver/resolvers.h b/common/utils/itti_analyzer/libresolver/resolvers.h index c73dcedee2..4d8a5c08d1 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.h +++ b/common/utils/itti_analyzer/libresolver/resolvers.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef RESOLVERS_H_ #define RESOLVERS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c index 3647c12166..3dd4218abc 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.c +++ b/common/utils/itti_analyzer/libui/ui_callbacks.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.h b/common/utils/itti_analyzer/libui/ui_callbacks.h index 5266ff013b..e09abdbc7e 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.h +++ b/common/utils/itti_analyzer/libui/ui_callbacks.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UI_CALLBACKS_H_ #define UI_CALLBACKS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_filters.c b/common/utils/itti_analyzer/libui/ui_filters.c index cffd3e6b62..38ab6ac909 100644 --- a/common/utils/itti_analyzer/libui/ui_filters.c +++ b/common/utils/itti_analyzer/libui/ui_filters.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/common/utils/itti_analyzer/libui/ui_filters.h b/common/utils/itti_analyzer/libui/ui_filters.h index 43cfc55839..575a46b808 100644 --- a/common/utils/itti_analyzer/libui/ui_filters.h +++ b/common/utils/itti_analyzer/libui/ui_filters.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UI_FILTERS_H_ #define UI_FILTERS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_interface.c b/common/utils/itti_analyzer/libui/ui_interface.c index 806dce8b6c..4b8582ef97 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.c +++ b/common/utils/itti_analyzer/libui/ui_interface.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libui/ui_interface.h b/common/utils/itti_analyzer/libui/ui_interface.h index 922bd89554..7f219b68f7 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.h +++ b/common/utils/itti_analyzer/libui/ui_interface.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #ifndef UI_INTERFACE_H_ diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c index b326233fc8..7ae2485cb7 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.c +++ b/common/utils/itti_analyzer/libui/ui_main_screen.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.h b/common/utils/itti_analyzer/libui/ui_main_screen.h index 634525ad5b..98a38ebbde 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.h +++ b/common/utils/itti_analyzer/libui/ui_main_screen.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UI_MAIN_SCREEN_H_ #define UI_MAIN_SCREEN_H_ diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.c b/common/utils/itti_analyzer/libui/ui_menu_bar.c index 7aea1a1ae1..da6b133a29 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.c +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define G_LOG_DOMAIN ("UI") #include diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.h b/common/utils/itti_analyzer/libui/ui_menu_bar.h index f7f1c808b8..b66d4bf95a 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.h +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UI_MENU_BAR_H_ #define UI_MENU_BAR_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notebook.c b/common/utils/itti_analyzer/libui/ui_notebook.c index 5beef83afc..f04cbb77ab 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.c +++ b/common/utils/itti_analyzer/libui/ui_notebook.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_notebook.h b/common/utils/itti_analyzer/libui/ui_notebook.h index aafc30e114..2b17be16a7 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.h +++ b/common/utils/itti_analyzer/libui/ui_notebook.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UI_NOTEBOOK_H_ #define UI_NOTEBOOK_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notif_dlg.c b/common/utils/itti_analyzer/libui/ui_notif_dlg.c index 8179eb0670..cf1f1b5eec 100644 --- a/common/utils/itti_analyzer/libui/ui_notif_dlg.c +++ b/common/utils/itti_analyzer/libui/ui_notif_dlg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define G_LOG_DOMAIN ("UI") #include "rc.h" diff --git a/common/utils/itti_analyzer/libui/ui_notif_dlg.h b/common/utils/itti_analyzer/libui/ui_notif_dlg.h index d17371c434..51856e0487 100644 --- a/common/utils/itti_analyzer/libui/ui_notif_dlg.h +++ b/common/utils/itti_analyzer/libui/ui_notif_dlg.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #ifndef UI_NOTIF_DLG_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c index 3039dd683c..99d6b8bc1c 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.c +++ b/common/utils/itti_analyzer/libui/ui_notifications.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/common/utils/itti_analyzer/libui/ui_notifications.h b/common/utils/itti_analyzer/libui/ui_notifications.h index c941b2af24..90f4c5909d 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.h +++ b/common/utils/itti_analyzer/libui/ui_notifications.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UI_NOTIFICATIONS_H_ #define UI_NOTIFICATIONS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c index e1a588b86b..dcf2acd8b2 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #define G_LOG_DOMAIN ("UI") diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h index d4db1777dd..936d3ee27d 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UI_SIGNAL_DISSECT_VIEW_H_ #define UI_SIGNAL_DISSECT_VIEW_H_ diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.c b/common/utils/itti_analyzer/libui/ui_tree_view.c index 4c7c8e7147..0de6bde945 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.c +++ b/common/utils/itti_analyzer/libui/ui_tree_view.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.h b/common/utils/itti_analyzer/libui/ui_tree_view.h index 6d555dd7e7..d1eac10c60 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.h +++ b/common/utils/itti_analyzer/libui/ui_tree_view.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UI_TREE_VIEW_H_ #define UI_TREE_VIEW_H_ diff --git a/common/utils/msc/msc.c b/common/utils/msc/msc.c index a01b849018..7de2a47f98 100644 --- a/common/utils/msc/msc.c +++ b/common/utils/msc/msc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file msc.c * \brief Message chart generator logging utility (generated files to processed by a script to produce a mscgen input file for generating a sequence diagram document) * \author Lionel GAUTHIER diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h index b3e3f4d9f7..eccff79518 100644 --- a/common/utils/msc/msc.h +++ b/common/utils/msc/msc.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef MSC_H_ #define MSC_H_ #include diff --git a/openair1/PHY/CODING/3gpplte.c b/openair1/PHY/CODING/3gpplte.c index 438d6eb10c..99b3923746 100644 --- a/openair1/PHY/CODING/3gpplte.c +++ b/openair1/PHY/CODING/3gpplte.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: 3gpplte.c purpose: Encoding routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c index cf1fbf9cc7..aeec529562 100644 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: 3gpplte_sse.c purpose: Encoding routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 author: Laurent Thomas diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder.c b/openair1/PHY/CODING/3gpplte_turbo_decoder.c index 3c8e097f30..931758c03b 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: 3gpplte_turbo_decoder.c purpose: Fixed-point routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 Modified from TI C6x reference design. diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c index 85c229bf34..49bb9d102c 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: 3gpplte_turbo_decoder_sse_16bit.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c index d1d03fe473..abcdc0521b 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: 3gpplte_turbo_decoder_sse.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c index 4dfcfeb416..dc789d0404 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: 3gpplte_turbo_decoder_sse_16bit.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index 421e493822..5a8e565888 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: 3gpplte_turbo_decoder_sse.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) diff --git a/openair1/PHY/CODING/TESTBENCH/ltetest.c b/openair1/PHY/CODING/TESTBENCH/ltetest.c index 809b06bccc..bb4c136af0 100644 --- a/openair1/PHY/CODING/TESTBENCH/ltetest.c +++ b/openair1/PHY/CODING/TESTBENCH/ltetest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c index 1d30cceba9..c083da85a7 100644 --- a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c +++ b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/PHY/CODING/TESTBENCH/viterbi_test.c b/openair1/PHY/CODING/TESTBENCH/viterbi_test.c index 03e369fc63..907d7b6384 100644 --- a/openair1/PHY/CODING/TESTBENCH/viterbi_test.c +++ b/openair1/PHY/CODING/TESTBENCH/viterbi_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/PHY/CODING/ccoding_byte.c b/openair1/PHY/CODING/ccoding_byte.c index e02f2b16bb..5595ee9af3 100644 --- a/openair1/PHY/CODING/ccoding_byte.c +++ b/openair1/PHY/CODING/ccoding_byte.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: ccoding_byte.c purpose: Encoding routines for implementing 802.11 convolutionally-coded waveforms author: raymond.knopp@eurecom.fr, based on similar code for 3GPP convolutional code (UMTS) by P. Humblet (2000) diff --git a/openair1/PHY/CODING/ccoding_byte_lte.c b/openair1/PHY/CODING/ccoding_byte_lte.c index 8718a98ecf..ac3ff1cd7b 100644 --- a/openair1/PHY/CODING/ccoding_byte_lte.c +++ b/openair1/PHY/CODING/ccoding_byte_lte.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: ccoding_byte_lte.c purpose: Tail-biting convolutional code from 36-212, V8.6 2009-03. Includes CRC (8-UCI,16-DCI)and RNTI scrambling (DCI) author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index 9b0de0962e..46d48e5d69 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: crc_byte.c purpose: generate 3GPP LTE CRCs. Byte-oriented implementation of CRC's author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h index 42faee1ac5..0cf444edc4 100644 --- a/openair1/PHY/CODING/defs.h +++ b/openair1/PHY/CODING/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: PHY/CODING/defs.h purpose: Top-level definitions, data types and function prototypes for openairinterface coding blocks author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/extern.h b/openair1/PHY/CODING/extern.h index 469371adf2..aed8e90d75 100644 --- a/openair1/PHY/CODING/extern.h +++ b/openair1/PHY/CODING/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + extern unsigned short f1f2mat_old[2*188]; diff --git a/openair1/PHY/CODING/extern_3GPPinterleaver.h b/openair1/PHY/CODING/extern_3GPPinterleaver.h index a346876769..e7134b5690 100644 --- a/openair1/PHY/CODING/extern_3GPPinterleaver.h +++ b/openair1/PHY/CODING/extern_3GPPinterleaver.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + typedef struct interleaver_codebook { unsigned long nb_bits; unsigned short f1; diff --git a/openair1/PHY/CODING/lte_interleaver.h b/openair1/PHY/CODING/lte_interleaver.h index 6aac7f80eb..165dcfac27 100644 --- a/openair1/PHY/CODING/lte_interleaver.h +++ b/openair1/PHY/CODING/lte_interleaver.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __LTE_INTERLEAVER_H #define __LTE_INTERLEAVER_H #define INCL_INTERLEAVE diff --git a/openair1/PHY/CODING/lte_interleaver2.h b/openair1/PHY/CODING/lte_interleaver2.h index ffdf3ff608..74805922f9 100644 --- a/openair1/PHY/CODING/lte_interleaver2.h +++ b/openair1/PHY/CODING/lte_interleaver2.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + unsigned short f1f2mat_old[2*188] = {3, 10, 7, 12, 19, 42, diff --git a/openair1/PHY/CODING/lte_interleaver_inline.h b/openair1/PHY/CODING/lte_interleaver_inline.h index 4797d11d5b..8dc56f869e 100644 --- a/openair1/PHY/CODING/lte_interleaver_inline.h +++ b/openair1/PHY/CODING/lte_interleaver_inline.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + extern unsigned int threegpplte_interleaver_output; extern unsigned int threegpplte_interleaver_tmp; diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index eaaaccbac6..e5a0fec027 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: lte_rate_matching.c purpose: Procedures for rate matching/interleaving for LTE (turbo-coded transport channels) (TX/RX) author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/lte_segmentation.c b/openair1/PHY/CODING/lte_segmentation.c index 4bed57ef15..746344a6ac 100644 --- a/openair1/PHY/CODING/lte_segmentation.c +++ b/openair1/PHY/CODING/lte_segmentation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: lte_segmentation.c purpose: Procedures for transport block segmentation for LTE (turbo-coded transport channels) author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/rate_matching.c b/openair1/PHY/CODING/rate_matching.c index c17812ce7a..51ee26ce28 100644 --- a/openair1/PHY/CODING/rate_matching.c +++ b/openair1/PHY/CODING/rate_matching.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef DEBUG #include #include diff --git a/openair1/PHY/CODING/scrambler.h b/openair1/PHY/CODING/scrambler.h index cbc1d0be83..06ff2d7663 100644 --- a/openair1/PHY/CODING/scrambler.h +++ b/openair1/PHY/CODING/scrambler.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + unsigned char scrambling_sequence[1024] = { 208, 127, diff --git a/openair1/PHY/CODING/vars.h b/openair1/PHY/CODING/vars.h index f2b770141b..9c0cf66c3e 100644 --- a/openair1/PHY/CODING/vars.h +++ b/openair1/PHY/CODING/vars.h @@ -1,2 +1,23 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "lte_interleaver.h" #include "lte_interleaver2.h" diff --git a/openair1/PHY/CODING/viterbi.c b/openair1/PHY/CODING/viterbi.c index 16e6bb479d..b2ab26e91c 100644 --- a/openair1/PHY/CODING/viterbi.c +++ b/openair1/PHY/CODING/viterbi.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: viterbi.c purpose: SIMD Optimized 802.11/802.16 Viterbi Decoder author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/viterbi_lte.c b/openair1/PHY/CODING/viterbi_lte.c index 3b9183504c..e1d3a99cbe 100644 --- a/openair1/PHY/CODING/viterbi_lte.c +++ b/openair1/PHY/CODING/viterbi_lte.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: viterbit_lte.c purpose: SIMD optimized LTE Viterbi Decoder for rate 1/3 Tail-biting convolutional code. Performs two iterations of code. First pass does Viterbi with all initial partial metrics set to zero. Second pass does Viterbi diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/defs.h index d4e309dd87..1874c4e8c7 100644 --- a/openair1/PHY/INIT/defs.h +++ b/openair1/PHY/INIT/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __INIT_DEFS__H__ #define __INIT_DEFS__H__ diff --git a/openair1/PHY/INIT/extern.h b/openair1/PHY/INIT/extern.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair1/PHY/INIT/extern.h +++ b/openair1/PHY/INIT/extern.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c index 0c9cd5f4e2..33ff141203 100644 --- a/openair1/PHY/INIT/init_top.c +++ b/openair1/PHY/INIT/init_top.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*!\brief Initilization and reconfiguration routines for LTE PHY */ #ifndef USER_MODE #define __NO_VERSION__ diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index d27fb9e903..3fb1d0c26b 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" #include "SCHED/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c index 114e1f285a..9aca71612c 100644 --- a/openair1/PHY/INIT/lte_param_init.c +++ b/openair1/PHY/INIT/lte_param_init.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c index 9a44923ae9..611a141656 100644 --- a/openair1/PHY/INIT/lte_parms.c +++ b/openair1/PHY/INIT/lte_parms.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" #include "log.h" diff --git a/openair1/PHY/INIT/vars.h b/openair1/PHY/INIT/vars.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair1/PHY/INIT/vars.h +++ b/openair1/PHY/INIT/vars.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index 0908644c0d..4f6763fa07 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index 9584ad08d5..0a38265461 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __LTE_ESTIMATION_DEFS__H__ #define __LTE_ESTIMATION_DEFS__H__ diff --git a/openair1/PHY/LTE_ESTIMATION/extern.h b/openair1/PHY/LTE_ESTIMATION/extern.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair1/PHY/LTE_ESTIMATION/extern.h +++ b/openair1/PHY/LTE_ESTIMATION/extern.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair1/PHY/LTE_ESTIMATION/filt96_32.h b/openair1/PHY/LTE_ESTIMATION/filt96_32.h index 02c41b6322..14f80ef1ee 100644 --- a/openair1/PHY/LTE_ESTIMATION/filt96_32.h +++ b/openair1/PHY/LTE_ESTIMATION/filt96_32.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + short filt24_0[24] __attribute__((aligned(32))) ={ 2730,5461,8192,10922,13653,16384,13653,10922,8192,5461,2730,0,0,0,0,0,0,0,0,0,0,0,0,0 }; diff --git a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c index 3f7e4f206d..3e513d49fc 100644 --- a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c +++ b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 2a95546a49..8f9b9cc047 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index 7a60cd26b6..65e2101d99 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef USER_MODE #include #endif diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c index 677df26145..331140de0a 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef USER_MODE #include #endif diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c index f56f8e95d0..271187b447 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef USER_MODE #include #endif diff --git a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c index 8db366ac2d..a1d315dfed 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c index 679dcb7fe1..6ebd8948cf 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: lte_est_freq_offset.c author (c): florian.kaltenberger@eurecom.fr diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index 808e681439..6c7399fcbe 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* file: lte_sync_time.c purpose: coarse timing synchronization for LTE (using PSS) author: florian.kaltenberger@eurecom.fr, oscar.tonelli@yahoo.it diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c index 9bc3d98854..64ff012d53 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_ESTIMATION/lte_sync_timefreq.c * \brief Initial time frequency scan of entire LTE band * \author R. Knopp diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 45f07cda84..b7b36efa0b 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // this function fills the PHY_vars->PHY_measurement structure #include "PHY/defs.h" diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index 8b8096fd41..d8a627020d 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/LTE_ESTIMATION/pss6144.h b/openair1/PHY/LTE_ESTIMATION/pss6144.h index 0c8329d95a..0fb5e1569d 100644 --- a/openair1/PHY/LTE_ESTIMATION/pss6144.h +++ b/openair1/PHY/LTE_ESTIMATION/pss6144.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_ESTIMATION/lte_sync_timefreq.c * \brief Initial time frequency scan of entire LTE band * \author R. Knopp diff --git a/openair1/PHY/LTE_ESTIMATION/vars.h b/openair1/PHY/LTE_ESTIMATION/vars.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair1/PHY/LTE_ESTIMATION/vars.h +++ b/openair1/PHY/LTE_ESTIMATION/vars.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair1/PHY/LTE_REFSIG/defs.h b/openair1/PHY/LTE_REFSIG/defs.h index c6bb1a4078..a1d2d3aaf8 100644 --- a/openair1/PHY/LTE_REFSIG/defs.h +++ b/openair1/PHY/LTE_REFSIG/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Definitions for LTE Reference signals */ /* Author R. Knopp / EURECOM / OpenAirInterface.org */ #ifndef __LTE_REFSIG_DEFS__H__ diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c index eb7ffc59b7..022e8bb373 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef USER_MODE #include #include diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c index c552ce8522..cb255d7896 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // 6.10.2.2 MBSFN reference signals Mapping to resource elements #ifdef USER_MODE diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c index 43cb505f54..fba122eef4 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_REFSIG/lte_dl_uespec.c * \brief Top-level routines for generating UE-specific Reference signals from 36-211, V11.3.0 2013-06 * \author R. Knopp diff --git a/openair1/PHY/LTE_REFSIG/lte_gold.c b/openair1/PHY/LTE_REFSIG/lte_gold.c index 7d05faf806..3f0a09a27e 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c index 8a4079f8cb..f5c8095396 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // 7.2 Pseudo-random sequence generation by a length-31 Gold sequence // for MBSFN reference signals diff --git a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c index 418735d794..52cd65fb92 100644 --- a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c +++ b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef MAIN #include #include diff --git a/openair1/PHY/LTE_REFSIG/mod_table.h b/openair1/PHY/LTE_REFSIG/mod_table.h index 2dd86fb937..776ae8acf1 100644 --- a/openair1/PHY/LTE_REFSIG/mod_table.h +++ b/openair1/PHY/LTE_REFSIG/mod_table.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define MOD_TABLE_SIZE_SHORT 304 #define MOD_TABLE_QPSK_OFFSET 1 #define MOD_TABLE_16QAM_OFFSET 5 diff --git a/openair1/PHY/LTE_REFSIG/primary_synch.h b/openair1/PHY/LTE_REFSIG/primary_synch.h index 717f2e552c..f2b0affd88 100644 --- a/openair1/PHY/LTE_REFSIG/primary_synch.h +++ b/openair1/PHY/LTE_REFSIG/primary_synch.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + short primary_synch0[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0}; short primary_synch1[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,-8086,-24020,-22288,2448,32675,-26120,19784,27073,18458,-16384,28377,25100,21062,-29523,14217,-7292,31945,-13477,-29868,-24020,-22288,27073,18458,25100,21062,-16384,-28378,2448,-32676,-26120,19784,-29523,-14218,-7292,31945,-31754,-8086,-16384,28377,-16384,-28378,-31754,-8086,31311,-9659,27073,-18459,-26120,19784,-29523,14217,32767,-1,25100,21062,2448,-32676,31311,-9659,31311,-9659,2448,-32676,25100,21062,32767,0,-29523,14217,-26120,19784,27073,-18459,31311,-9659,-31754,-8086,-16384,-28378,-16384,28377,-31754,-8086,-7292,31945,-29523,-14218,-26120,19784,2448,-32676,-16384,-28378,25100,21062,27073,18458,-24020,-22288,-13477,-29868,-7292,31945,-29523,14217,25100,21062,-16384,28377,27073,18458,-26120,19784,2448,32675,-24020,-22288,-31754,-8086,32767,0,0,0,0,0,0,0,0,0,0,0}; short primary_synch2[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,8085,-24020,22287,2448,-32676,-26120,-19785,27073,-18459,-16384,-28378,25100,-21063,-29523,-14218,-7292,-31946,-13477,29867,-24020,22287,27073,-18459,25100,-21063,-16384,28377,2448,32675,-26120,-19785,-29523,14217,-7292,-31946,-31754,8085,-16384,-28378,-16384,28377,-31754,8085,31311,9658,27073,18458,-26120,-19785,-29523,-14218,32767,0,25100,-21063,2448,32675,31311,9658,31311,9658,2448,32675,25100,-21063,32767,0,-29523,-14218,-26120,-19785,27073,18458,31311,9658,-31754,8085,-16384,28377,-16384,-28378,-31754,8085,-7292,-31946,-29523,14217,-26120,-19785,2448,32675,-16384,28377,25100,-21063,27073,-18459,-24020,22287,-13477,29867,-7292,-31946,-29523,-14218,25100,-21063,-16384,-28378,27073,-18459,-26120,-19785,2448,-32676,-24020,22287,-31754,8085,32767,-1,0,0,0,0,0,0,0,0,0,0}; diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 929045c596..4bc93e6133 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dci.c * \brief Implements PDCCH physical channel TX/RX procedures (36.211) and DCI encoding/decoding (36.212/36.213). Current LTE compliance V8.6 2009-03. * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h index 62bdd5260a..74c150ccab 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.h +++ b/openair1/PHY/LTE_TRANSPORT/dci.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dci.h * \brief typedefs for LTE DCI structures from 36-212, V8.6 2009-03. Limited to 5 MHz formats for the moment.Current LTE compliance V8.6 2009-03. * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 6ee7433a64..aa2daf8ebb 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dci_tools.c * \brief PHY Support routines (eNB/UE) for filling PDSCH/PUSCH/DLSCH/ULSCH data structures based on DCI PDUs generated by eNB MAC scheduler. * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 025c90f3f7..1f3179a969 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/defs.h * \brief data structures for PDSCH/DLSCH/PUSCH/ULSCH physical and transport channel descriptors (TX/RX) * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index cc390d8756..0284ca27ad 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dlsch_coding.c * \brief Top-level routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 9765b2ca4c..f4ab4c0924 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dlsch_decoding.c * \brief Top-level routines for decoding Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index d12a81a81a..036eb86b24 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dlsch_demodulation.c * \brief Top-level routines for demodulating the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c index 6c56e81f4b..9216985815 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dlsch_llr_computation.c * \brief Top-level routines for LLR computation of the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index f25e248188..bafa37b96f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dlsch_modulation.c * \brief Top-level routines for generating the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c index eacfb0c30c..079cfcbc52 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/dlsch_scrambling.c * \brief Routines for the scrambling procedure of the PDSCH physical channel from 36-211, V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h index fdb2c5b50a..5428aa3f83 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + unsigned int dlsch_tbs25[27][25] = {{16,32,56,88,120,152,176,208,224,256,288,328,344,376,392,424,456,488,504,536,568,600,616,648,680}, {24,56,88,144,176,208,224,256,328,344,376,424,456,488,520,568,600,632,680,712,744,776,808,872,904}, {32,72,144,176,208,256,296,328,376,424,472,520,568,616,648,696,744,776,840,872,936,968,1000,1064,1096}, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h index 193df272da..10ac5f866b 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define TBStable_rowCnt 27 /** \brief "Transport block size table" diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c index 344fc24e7b..170ca4ce76 100644 --- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/drs_modulation.c * \brief Top-level routines for generating the Demodulation Reference Signals from 36-211, V8.6 2009-03 * \author R. Knopp, F. Kaltenberger, A. Bhamri diff --git a/openair1/PHY/LTE_TRANSPORT/extern.h b/openair1/PHY/LTE_TRANSPORT/extern.h index fbd115ec08..88c034e9db 100644 --- a/openair1/PHY/LTE_TRANSPORT/extern.h +++ b/openair1/PHY/LTE_TRANSPORT/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + extern unsigned int dlsch_tbs25[27][25],TBStable[27][110],TBStable1C[32]; extern unsigned short lte_cqi_eff1024[16]; extern char lte_cqi_snr_dB[15]; diff --git a/openair1/PHY/LTE_TRANSPORT/group_hopping.c b/openair1/PHY/LTE_TRANSPORT/group_hopping.c index 2e47214312..be3acce5bd 100644 --- a/openair1/PHY/LTE_TRANSPORT/group_hopping.c +++ b/openair1/PHY/LTE_TRANSPORT/group_hopping.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/group_hopping.c * \brief Top-level routines for group/sequence hopping and nPRS sequence generationg for DRS and PUCCH from 36-211, V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 8afa0d4481..68bf46da78 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/if4_tools.c * \brief * \author S. Sandeep Kumar, Raymond Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index fe29200494..1f78e7f77a 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/if4_tools.h * \brief * \author S. Sandeep Kumar, Raymond Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 02725095cd..d35b91768b 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/if5_tools.c * \brief * \author S. Sandeep Kumar, Raymond Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.h b/openair1/PHY/LTE_TRANSPORT/if5_tools.h index 97f477e472..b6ebe8c841 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/if5_tools.h * \brief * \author S. Sandeep Kumar, Raymond Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 64eb64068d..661fe96be8 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/initial_sync.c * \brief Routines for initial UE synchronization procedure (PSS,SSS,PBCH and frame format detection) * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c index ae63b18d97..b4f158f873 100644 --- a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c +++ b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/lte_mcs.c * \brief Some support routines for MCS computations * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h b/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h index 03d04f1d14..be7f6a7529 100644 --- a/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define modOrder(I_MCS,I_TBS) ((I_MCS-I_TBS)*2+2) // Find modulation order from I_TBS and I_MCS /** \fn unsigned char I_TBS2I_MCS(unsigned char I_TBS); diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c index d0a2e05c4c..03190de43b 100644 --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/pbch.c * \brief Top-level routines for generating and decoding the PBCH/BCH physical/transport channel V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c index fb1d83e76d..8af540eea1 100644 --- a/openair1/PHY/LTE_TRANSPORT/pcfich.c +++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/pcfich.c * \brief Top-level routines for generating and decoding the PCFICH/CFI physical/transport channel V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/pch.c b/openair1/PHY/LTE_TRANSPORT/pch.c index 3e03fe4078..f3dd046373 100644 --- a/openair1/PHY/LTE_TRANSPORT/pch.c +++ b/openair1/PHY/LTE_TRANSPORT/pch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "PHY/extern.h" #include "assertions.h" diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index bfc373ec89..06e17488a5 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/phich.c * \brief Top-level routines for generating and decoding the PHICH/HI physical/transport channel V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/pilots.c b/openair1/PHY/LTE_TRANSPORT/pilots.c index 0ad6265731..a1f7d5bac6 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/pilots.c * \brief Top-level routines for generating DL cell-specific reference signals V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c index 053b3fa90d..0393a77f0c 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/pilots_mbsfn.c * \brief Top-level routines for generating DL mbsfn reference signals * \authors S. Paranche, R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 63536c09dc..c4088a8a5b 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c index 621bc492a0..4de2b6b775 100644 --- a/openair1/PHY/LTE_TRANSPORT/power_control.c +++ b/openair1/PHY/LTE_TRANSPORT/power_control.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "PHY/impl_defs_lte.h" diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 2ec36cc26a..422ac5156e 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/prach.c * \brief Top-level routines for generating and decoding the PRACH physical channel V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/prach.h b/openair1/PHY/LTE_TRANSPORT/prach.h index 1c9aba645f..efdb257785 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.h +++ b/openair1/PHY/LTE_TRANSPORT/prach.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + short __attribute__((aligned(16))) X_u839[4][2*839] = {{25792,20209,24697,21533,21208,24977,14453,29407,3673,32560,-10603,31004,-25018,21161,-32697,2145,-25717,-20307,-2330,-32685,24778,-21441,31178,10078,4403,32469,-28990,15273,-22038,-24250,20546,-25526,26673,19030,-20065,25905,-22930,-23408,28086,-16877,6820,32049,-31985,-7121,22218,-24084,6580,32099,-28459,-16242,31873,-7599,-20642,25448,4038,-32518,10834,30923,-21115,-25058,26955,18629,-29699,-13845,30607,11698,-30291,-12497,28519,16134,-24291,-21993,16188,28488,-3308,-32600,-13118,30026,27959,-17087,-32353,-5193,18679,26921,9552,-31344,-31534,8904,22308,24000,14122,-29568,-32314,-5435,490,32763,32605,-3247,-2819,-32646,-32758,-798,-7539,31887,28149,16771,26458,-19330,-4283,-32487,-29271,-14729,-30052,13061,-12213,30405,9669,31307,25331,20784,32111,6520,32182,-6160,29046,-15165,25563,-20499,23450,-22887,23450,-22887,25563,-20499,29046,-15165,32182,-6160,32111,6520,25331,20784,9669,31307,-12213,30405,-30052,13061,-29271,-14729,-4283,-32487,26458,-19330,28149,16771,-7539,31887,-32758,-798,-2819,-32646,32605,-3247,490,32763,-32314,-5435,14122,-29568,22308,24000,-31534,8904,9552,-31344,18679,26921,-32353,-5193,27959,-17087,-13118,30026,-3308,-32600,16188,28488,-24291,-21993,28519,16134,-30291,-12497,30607,11698,-29699,-13845,26955,18629,-21115,-25058,10834,30923,4038,-32518,-20642,25448,31873,-7599,-28459,-16242,6580,32099,22218,-24084,-31985,-7121,6820,32049,28086,-16877,-22930,-23408,-20065,25905,26673,19030,20546,-25526,-22038,-24250,-28990,15273,4403,32469,31178,10078,24778,-21441,-2330,-32685,-25717,-20307,-32697,2145,-25018,21161,-10603,31004,3673,32560,14453,29407,21208,24977,24697,21533,25792,20209,24858,21348,21579,24657,15110,29074,4646,32435,-9435,31379,-24042,22263,-32540,3855,-26887,-18731,-4526,-32454,23104,-23235,31902,7479,7299,31943,-27368,18019,-24455,-21810,17555,-27668,28757,15705,-16614,28243,-25868,-20114,25409,-20690,11526,30672,-32705,-2024,17967,-27402,11984,30496,-30904,-10893,29902,-13399,-15328,28960,-2574,-32666,17034,27991,-26018,-19919,30428,12155,-32088,-6641,32509,4099,-32428,-4708,31663,8431,-29160,-14947,23191,23148,-12099,-30452,-4161,32501,21855,-24414,-32445,4585,25942,20016,-614,-32762,-27095,18426,28874,15490,3551,-32575,-32251,5797,11756,30585,29379,-14509,-14344,-29461,-30780,11238,4889,32400,32409,4828,16929,-28055,-16719,-28181,-32719,-1779,-22129,24166,1471,32733,21946,24331,31786,7956,31756,-8076,26166,-19724,19180,-26567,13454,-29878,10253,-31122,10020,-31198,12779,-30173,18172,-27267,25096,-21068,31140,-10196,32333,5313,24207,22082,5131,32362,-18881,26780,-32641,2879,-20927,-25215,11870,-30542,32741,-1288,11296,30758,-27635,17607,-20737,-25371,24938,-21255,19279,26494,-29435,14398,-5979,-32218,32205,6038,-19871,26054,-11412,-30716,31253,9845,-28640,15920,11181,-30801,8727,31583,-23278,-23062,30694,11469,-32751,-1043,32135,-6401,-31024,10544,30651,-11585,-31326,9610,32461,-4465,-32525,-3978,29103,15056,-19577,-26277,2940,32634,17347,-27799,-31600,8668,27501,17813,-1840,-32716,-27232,18223,28023,16981,6700,-32075,-32747,1165,5857,32239,31929,-7360,-5737,-32261,-32755,920,-7061,31997,27765,17399,27568,-17711,-1105,-32749,-27026,-18529,-31846,7717,-18275,27197,1716,32721,18477,27060,28397,16348,32292,5555,32650,-2758,31815,-7838,31289,-9729,31631,-8550,32493,-4222,32593,3368,29750,13733,21394,24818,6098,32194,-13790,29724,-29953,13286,-30196,-12724,-8373,-31680,22398,-23917,31396,9375,2451,32675,-30863,11008,-16082,-28550,27300,-18122,17451,27732,-29647,13955,-7181,-31971,32617,3123,-15975,28609,-17140,-27928,32711,1900,-22666,23663,-123,-32767,20450,25601,-31064,-10429,32390,-4951,-28275,16560,22576,-23748,-17866,27468,15436,-28904,-15760,28728,18780,-26851,-23875,22443,29487,-14289,-32726,1655,29541,14177,-16508,-28306,-5375,32323,26745,-18931,-31567,-8787,10137,31159,22754,-23579,-30475,-12042,-2697,32655,32553,-3735,-6941,-32024,-32011,7000,3916,32532,32679,2390,11641,-30630,-23959,-22354,-30945,10776,-8016,31771,19674,26202,32477,4342,27700,-17504,13005,-30076,-3063,-32624,-15653,-28787,-23621,-22710,-27831,-17296,-29594,-14067,-29802,-13623,-28580,-16029,-25254,-20879,-18579,-26991,-7420,-31916,7896,-31802,23790,-22533,32629,-3002,25640,20402,1226,32744,-26092,19821,-30100,-12950,-369,-32765,30984,-10661,17243,27862,-25487,20593,-21302,-24899,26312,-19527,14892,29187,-32062,6760,5010,-32382,26815,18830,-30149,12836,8134,-31742,17658,27601,-31501,-9023,30821,-11124,-21021,25135,8609,-31616,2206,32692,-9787,-31272,14011,29620,-15220,-29019,13566,29826,-8846,-31551,736,32758,10486,-31044,-22843,23492,31695,-8313,-30384,-12270,14232,29514,12326,-30361,-31726,8193,23364,22973,10718,-30965,-32765,429,8490,31647,30001,-13175,-14783,-29243,-29853,13510,9199,31449,32731,-1534,9317,-31415,-24617,-21626,-31103,10312,-9904,31234,16824,28117,31466,9140,30563,-11814,19772,-26130,6219,-32172,-5496,-32303,-13678,-29776,-18377,-27130,-20162,-25830,-19379,-26423,-15868,-28669,-9082,-31484,1349,-32740,14563,-29353,27163,-18326,32760,674,24372,21901,981,32752,-25176,20973,-31216,-9963,-5254,-32344,28212,-16667,23705,22621,-18071,27333,-28699,-15814,16294,-28429,26385,19428,-24536,21717,-13231,-29978,32765,-307,-15545,28845,-15002,-29132,31957,7240,-27896,17191,10950,-30884,7777,31830,-21672,-24577,29325,14618,-32272,-5677,32762,-553,-32568,3612,32580,-3491,-32767,184,32159,6279,-28933,-15382,20831,25292,-6461,-32124,-12441,30313,28816,-15599,-31432,-9259,12892,30123,17762,-27536,-32671,-2513,10370,31082,26602,-19131,-24125,-22174,-19478,26349,26530,19230,21487,-24739,-20355,-25679,-30337,12383,245,32766,29215,14837,28336,-16455,4768,-32419,-19968,-25981,-32037,-6881,-30244,12610,-20259,25754,-8254,31710,1961,32708,8963,31517,12666,30219,13342,29927,11065,30841,5616,32282,-3186,32611,-14674,29297,-26240,19625,-32661,2635,-27435,-17917,-7659,-31860,18980,-26710,32766,-62,16401,28366,-19081,26638,-31362,-9494,2084,-32701,32688,-2269,3429,32587,-32737,1410,3794,-32547,30518,11927,-21764,24495,-12554,-30267,32372,5071,-23536,22798,-859,-32756,22487,23832,-32229,-5919,30736,-11355,-23018,23321,13900,-29673,-6340,32147,1594,-32729,0,32767,1594,-32729,-6340,32147,13900,-29673,-23018,23321,30736,-11355,-32229,-5919,22487,23832,-859,-32756,-23536,22798,32372,5071,-12554,-30267,-21764,24495,30518,11927,3794,-32547,-32737,1410,3429,32587,32688,-2269,2084,-32701,-31362,-9494,-19081,26638,16401,28366,32766,-62,18980,-26710,-7659,-31860,-27435,-17917,-32661,2635,-26240,19625,-14674,29297,-3186,32611,5616,32282,11065,30841,13342,29927,12666,30219,8963,31517,1961,32708,-8254,31710,-20259,25754,-30244,12610,-32037,-6881,-19968,-25981,4768,-32419,28336,-16455,29215,14837,245,32766,-30337,12383,-20355,-25679,21487,-24739,26530,19230,-19478,26349,-24125,-22174,26602,-19131,10370,31082,-32671,-2513,17762,-27536,12892,30123,-31432,-9259,28816,-15599,-12441,30313,-6461,-32124,20831,25292,-28933,-15382,32159,6279,-32767,184,32580,-3491,-32568,3612,32762,-553,-32272,-5677,29325,14618,-21672,-24577,7777,31830,10950,-30884,-27896,17191,31957,7240,-15002,-29132,-15545,28845,32765,-307,-13231,-29978,-24536,21717,26385,19428,16294,-28429,-28699,-15814,-18071,27333,23705,22621,28212,-16667,-5254,-32344,-31216,-9963,-25176,20973,981,32752,24372,21901,32760,674,27163,-18326,14563,-29353,1349,-32740,-9082,-31484,-15868,-28669,-19379,-26423,-20162,-25830,-18377,-27130,-13678,-29776,-5496,-32303,6219,-32172,19772,-26130,30563,-11814,31466,9140,16824,28117,-9904,31234,-31103,10312,-24617,-21626,9317,-31415,32731,-1534,9199,31449,-29853,13510,-14783,-29243,30001,-13175,8490,31647,-32765,429,10718,-30965,23364,22973,-31726,8193,12326,-30361,14232,29514,-30384,-12270,31695,-8313,-22843,23492,10486,-31044,736,32758,-8846,-31551,13566,29826,-15220,-29019,14011,29620,-9787,-31272,2206,32692,8609,-31616,-21021,25135,30821,-11124,-31501,-9023,17658,27601,8134,-31742,-30149,12836,26815,18830,5010,-32382,-32062,6760,14892,29187,26312,-19527,-21302,-24899,-25487,20593,17243,27862,30984,-10661,-369,-32765,-30100,-12950,-26092,19821,1226,32744,25640,20402,32629,-3002,23790,-22533,7896,-31802,-7420,-31916,-18579,-26991,-25254,-20879,-28580,-16029,-29802,-13623,-29594,-14067,-27831,-17296,-23621,-22710,-15653,-28787,-3063,-32624,13005,-30076,27700,-17504,32477,4342,19674,26202,-8016,31771,-30945,10776,-23959,-22354,11641,-30630,32679,2390,3916,32532,-32011,7000,-6941,-32024,32553,-3735,-2697,32655,-30475,-12042,22754,-23579,10137,31159,-31567,-8787,26745,-18931,-5375,32323,-16508,-28306,29541,14177,-32726,1655,29487,-14289,-23875,22443,18780,-26851,-15760,28728,15436,-28904,-17866,27468,22576,-23748,-28275,16560,32390,-4951,-31064,-10429,20450,25601,-123,-32767,-22666,23663,32711,1900,-17140,-27928,-15975,28609,32617,3123,-7181,-31971,-29647,13955,17451,27732,27300,-18122,-16082,-28550,-30863,11008,2451,32675,31396,9375,22398,-23917,-8373,-31680,-30196,-12724,-29953,13286,-13790,29724,6098,32194,21394,24818,29750,13733,32593,3368,32493,-4222,31631,-8550,31289,-9729,31815,-7838,32650,-2758,32292,5555,28397,16348,18477,27060,1716,32721,-18275,27197,-31846,7717,-27026,-18529,-1105,-32749,27568,-17711,27765,17399,-7061,31997,-32755,920,-5737,-32261,31929,-7360,5857,32239,-32747,1165,6700,-32075,28023,16981,-27232,18223,-1840,-32716,27501,17813,-31600,8668,17347,-27799,2940,32634,-19577,-26277,29103,15056,-32525,-3978,32461,-4465,-31326,9610,30651,-11585,-31024,10544,32135,-6401,-32751,-1043,30694,11469,-23278,-23062,8727,31583,11181,-30801,-28640,15920,31253,9845,-11412,-30716,-19871,26054,32205,6038,-5979,-32218,-29435,14398,19279,26494,24938,-21255,-20737,-25371,-27635,17607,11296,30758,32741,-1288,11870,-30542,-20927,-25215,-32641,2879,-18881,26780,5131,32362,24207,22082,32333,5313,31140,-10196,25096,-21068,18172,-27267,12779,-30173,10020,-31198,10253,-31122,13454,-29878,19180,-26567,26166,-19724,31756,-8076,31786,7956,21946,24331,1471,32733,-22129,24166,-32719,-1779,-16719,-28181,16929,-28055,32409,4828,4889,32400,-30780,11238,-14344,-29461,29379,-14509,11756,30585,-32251,5797,3551,-32575,28874,15490,-27095,18426,-614,-32762,25942,20016,-32445,4585,21855,-24414,-4161,32501,-12099,-30452,23191,23148,-29160,-14947,31663,8431,-32428,-4708,32509,4099,-32088,-6641,30428,12155,-26018,-19919,17034,27991,-2574,-32666,-15328,28960,29902,-13399,-30904,-10893,11984,30496,17967,-27402,-32705,-2024,11526,30672,25409,-20690,-25868,-20114,-16614,28243,28757,15705,17555,-27668,-24455,-21810,-27368,18019,7299,31943,31902,7479,23104,-23235,-4526,-32454,-26887,-18731,-32540,3855,-24042,22263,-9435,31379,4646,32435,15110,29074,21579,24657,24858,21348}, {25792,-20210,24858,-21349,21579,-24658,15110,-29075,4646,-32436,-9435,-31380,-24042,-22264,-32540,-3856,-26887,18730,-4526,32453,23104,23234,31902,-7480,7299,-31944,-27368,-18020,-24455,21809,17555,27667,28757,-15706,-16614,-28244,-25868,20113,25409,20689,11526,-30673,-32705,2023,17967,27401,11984,-30497,-30904,10892,29902,13398,-15328,-28961,-2574,32665,17034,-27992,-26018,19918,30428,-12156,-32088,6640,32509,-4100,-32428,4707,31663,-8432,-29160,14946,23191,-23149,-12099,30451,-4161,-32502,21855,24413,-32445,-4586,25942,-20017,-614,32761,-27095,-18427,28874,-15491,3551,32574,-32251,-5798,11756,-30586,29379,14508,-14344,29460,-30780,-11239,4889,-32401,32409,-4829,16929,28054,-16719,28180,-32719,1778,-22129,-24167,1471,-32734,21946,-24332,31786,-7957,31756,8075,26166,19723,19180,26566,13454,29877,10253,31121,10020,31197,12779,30172,18172,27266,25096,21067,31140,10195,32333,-5314,24207,-22083,5131,-32363,-18881,-26781,-32641,-2880,-20927,25214,11870,30541,32741,1287,11296,-30759,-27635,-17608,-20737,25370,24938,21254,19279,-26495,-29435,-14399,-5979,32217,32205,-6039,-19871,-26055,-11412,30715,31253,-9846,-28640,-15921,11181,30800,8727,-31584,-23278,23061,30694,-11470,-32751,1042,32135,6400,-31024,-10545,30651,11584,-31326,-9611,32461,4464,-32525,3977,29103,-15057,-19577,26276,2940,-32635,17347,27798,-31600,-8669,27501,-17814,-1840,32715,-27232,-18224,28023,-16982,6700,32074,-32747,-1166,5857,-32240,31929,7359,-5737,32260,-32755,-921,-7061,-31998,27765,-17400,27568,17710,-1105,32748,-27026,18528,-31846,-7718,-18275,-27198,1716,-32722,18477,-27061,28397,-16349,32292,-5556,32650,2757,31815,7837,31289,9728,31631,8549,32493,4221,32593,-3369,29750,-13734,21394,-24819,6098,-32195,-13790,-29725,-29953,-13287,-30196,12723,-8373,31679,22398,23916,31396,-9376,2451,-32676,-30863,-11009,-16082,28549,27300,18121,17451,-27733,-29647,-13956,-7181,31970,32617,-3124,-15975,-28610,-17140,27927,32711,-1901,-22666,-23664,-123,32766,20450,-25602,-31064,10428,32390,4950,-28275,-16561,22576,23747,-17866,-27469,15436,28903,-15760,-28729,18780,26850,-23875,-22444,29487,14288,-32726,-1656,29541,-14178,-16508,28305,-5375,-32324,26745,18930,-31567,8786,10137,-31160,22754,23578,-30475,12041,-2697,-32656,32553,3734,-6941,32023,-32011,-7001,3916,-32533,32679,-2391,11641,30629,-23959,22353,-30945,-10777,-8016,-31772,19674,-26203,32477,-4343,27700,17503,13005,30075,-3063,32623,-15653,28786,-23621,22709,-27831,17295,-29594,14066,-29802,13622,-28580,16028,-25254,20878,-18579,26990,-7420,31915,7896,31801,23790,22532,32629,3001,25640,-20403,1226,-32745,-26092,-19822,-30100,12949,-369,32764,30984,10660,17243,-27863,-25487,-20594,-21302,24898,26312,19526,14892,-29188,-32062,-6761,5010,32381,26815,-18831,-30149,-12837,8134,31741,17658,-27602,-31501,9022,30821,11123,-21021,-25136,8609,31615,2206,-32693,-9787,31271,14011,-29621,-15220,29018,13566,-29827,-8846,31550,736,-32759,10486,31043,-22843,-23493,31695,8312,-30384,12269,14232,-29515,12326,30360,-31726,-8194,23364,-22974,10718,30964,-32765,-430,8490,-31648,30001,13174,-14783,29242,-29853,-13511,9199,-31450,32731,1533,9317,31414,-24617,21625,-31103,-10313,-9904,-31235,16824,-28118,31466,-9141,30563,11813,19772,26129,6219,32171,-5496,32302,-13678,29775,-18377,27129,-20162,25829,-19379,26422,-15868,28668,-9082,31483,1349,32739,14563,29352,27163,18325,32760,-675,24372,-21902,981,-32753,-25176,-20974,-31216,9962,-5254,32343,28212,16666,23705,-22622,-18071,-27334,-28699,15813,16294,28428,26385,-19429,-24536,-21718,-13231,29977,32765,306,-15545,-28846,-15002,29131,31957,-7241,-27896,-17192,10950,30883,7777,-31831,-21672,24576,29325,-14619,-32272,5676,32762,552,-32568,-3613,32580,3490,-32767,-185,32159,-6280,-28933,15381,20831,-25293,-6461,32123,-12441,-30314,28816,15598,-31432,9258,12892,-30124,17762,27535,-32671,2512,10370,-31083,26602,19130,-24125,22173,-19478,-26350,26530,-19231,21487,24738,-20355,25678,-30337,-12384,245,-32767,29215,-14838,28336,16454,4768,32418,-19968,25980,-32037,6880,-30244,-12611,-20259,-25755,-8254,-31711,1961,-32709,8963,-31518,12666,-30220,13342,-29928,11065,-30842,5616,-32283,-3186,-32612,-14674,-29298,-26240,-19626,-32661,-2636,-27435,17916,-7659,31859,18980,26709,32766,61,16401,-28367,-19081,-26639,-31362,9493,2084,32700,32688,2268,3429,-32588,-32737,-1411,3794,32546,30518,-11928,-21764,-24496,-12554,30266,32372,-5072,-23536,-22799,-859,32755,22487,-23833,-32229,5918,30736,11354,-23018,-23322,13900,29672,-6340,-32148,1594,32728,-1,-32767,1594,32728,-6340,-32148,13900,29672,-23018,-23322,30736,11354,-32229,5918,22487,-23833,-859,32755,-23536,-22799,32372,-5072,-12554,30266,-21764,-24496,30518,-11928,3794,32546,-32737,-1411,3429,-32588,32688,2268,2084,32700,-31362,9493,-19081,-26639,16401,-28367,32766,61,18980,26709,-7659,31859,-27435,17916,-32661,-2636,-26240,-19626,-14674,-29298,-3186,-32612,5616,-32283,11065,-30842,13342,-29928,12666,-30220,8963,-31518,1961,-32709,-8254,-31711,-20259,-25755,-30244,-12611,-32037,6880,-19968,25980,4768,32418,28336,16454,29215,-14838,245,-32767,-30337,-12384,-20355,25678,21487,24738,26530,-19231,-19478,-26350,-24125,22173,26602,19130,10370,-31083,-32671,2512,17762,27535,12892,-30124,-31432,9258,28816,15598,-12441,-30314,-6461,32123,20831,-25293,-28933,15381,32159,-6280,-32767,-185,32580,3490,-32568,-3613,32762,552,-32272,5676,29325,-14619,-21672,24576,7777,-31831,10950,30883,-27896,-17192,31957,-7241,-15002,29131,-15545,-28846,32765,306,-13231,29977,-24536,-21718,26385,-19429,16294,28428,-28699,15813,-18071,-27334,23705,-22622,28212,16666,-5254,32343,-31216,9962,-25176,-20974,981,-32753,24372,-21902,32760,-675,27163,18325,14563,29352,1349,32739,-9082,31483,-15868,28668,-19379,26422,-20162,25829,-18377,27129,-13678,29775,-5496,32302,6219,32171,19772,26129,30563,11813,31466,-9141,16824,-28118,-9904,-31235,-31103,-10313,-24617,21625,9317,31414,32731,1533,9199,-31450,-29853,-13511,-14783,29242,30001,13174,8490,-31648,-32765,-430,10718,30964,23364,-22974,-31726,-8194,12326,30360,14232,-29515,-30384,12269,31695,8312,-22843,-23493,10486,31043,736,-32759,-8846,31550,13566,-29827,-15220,29018,14011,-29621,-9787,31271,2206,-32693,8609,31615,-21021,-25136,30821,11123,-31501,9022,17658,-27602,8134,31741,-30149,-12837,26815,-18831,5010,32381,-32062,-6761,14892,-29188,26312,19526,-21302,24898,-25487,-20594,17243,-27863,30984,10660,-369,32764,-30100,12949,-26092,-19822,1226,-32745,25640,-20403,32629,3001,23790,22532,7896,31801,-7420,31915,-18579,26990,-25254,20878,-28580,16028,-29802,13622,-29594,14066,-27831,17295,-23621,22709,-15653,28786,-3063,32623,13005,30075,27700,17503,32477,-4343,19674,-26203,-8016,-31772,-30945,-10777,-23959,22353,11641,30629,32679,-2391,3916,-32533,-32011,-7001,-6941,32023,32553,3734,-2697,-32656,-30475,12041,22754,23578,10137,-31160,-31567,8786,26745,18930,-5375,-32324,-16508,28305,29541,-14178,-32726,-1656,29487,14288,-23875,-22444,18780,26850,-15760,-28729,15436,28903,-17866,-27469,22576,23747,-28275,-16561,32390,4950,-31064,10428,20450,-25602,-123,32766,-22666,-23664,32711,-1901,-17140,27927,-15975,-28610,32617,-3124,-7181,31970,-29647,-13956,17451,-27733,27300,18121,-16082,28549,-30863,-11009,2451,-32676,31396,-9376,22398,23916,-8373,31679,-30196,12723,-29953,-13287,-13790,-29725,6098,-32195,21394,-24819,29750,-13734,32593,-3369,32493,4221,31631,8549,31289,9728,31815,7837,32650,2757,32292,-5556,28397,-16349,18477,-27061,1716,-32722,-18275,-27198,-31846,-7718,-27026,18528,-1105,32748,27568,17710,27765,-17400,-7061,-31998,-32755,-921,-5737,32260,31929,7359,5857,-32240,-32747,-1166,6700,32074,28023,-16982,-27232,-18224,-1840,32715,27501,-17814,-31600,-8669,17347,27798,2940,-32635,-19577,26276,29103,-15057,-32525,3977,32461,4464,-31326,-9611,30651,11584,-31024,-10545,32135,6400,-32751,1042,30694,-11470,-23278,23061,8727,-31584,11181,30800,-28640,-15921,31253,-9846,-11412,30715,-19871,-26055,32205,-6039,-5979,32217,-29435,-14399,19279,-26495,24938,21254,-20737,25370,-27635,-17608,11296,-30759,32741,1287,11870,30541,-20927,25214,-32641,-2880,-18881,-26781,5131,-32363,24207,-22083,32333,-5314,31140,10195,25096,21067,18172,27266,12779,30172,10020,31197,10253,31121,13454,29877,19180,26566,26166,19723,31756,8075,31786,-7957,21946,-24332,1471,-32734,-22129,-24167,-32719,1778,-16719,28180,16929,28054,32409,-4829,4889,-32401,-30780,-11239,-14344,29460,29379,14508,11756,-30586,-32251,-5798,3551,32574,28874,-15491,-27095,-18427,-614,32761,25942,-20017,-32445,-4586,21855,24413,-4161,-32502,-12099,30451,23191,-23149,-29160,14946,31663,-8432,-32428,4707,32509,-4100,-32088,6640,30428,-12156,-26018,19918,17034,-27992,-2574,32665,-15328,-28961,29902,13398,-30904,10892,11984,-30497,17967,27401,-32705,2023,11526,-30673,25409,20689,-25868,20113,-16614,-28244,28757,-15706,17555,27667,-24455,21809,-27368,-18020,7299,-31944,31902,-7480,23104,23234,-4526,32453,-26887,18730,-32540,-3856,-24042,-22264,-9435,-31380,4646,-32436,15110,-29075,21579,-24658,24858,-21349,25792,-20210,24697,-21534,21208,-24978,14453,-29408,3673,-32561,-10603,-31005,-25018,-21162,-32697,-2146,-25717,20306,-2330,32684,24778,21440,31178,-10079,4403,-32470,-28990,-15274,-22038,24249,20546,25525,26673,-19031,-20065,-25906,-22930,23407,28086,16876,6820,-32050,-31985,7120,22218,24083,6580,-32100,-28459,16241,31873,7598,-20642,-25449,4038,32517,10834,-30924,-21115,25057,26955,-18630,-29699,13844,30607,-11699,-30291,12496,28519,-16135,-24291,21992,16188,-28489,-3308,32599,-13118,-30027,27959,17086,-32353,5192,18679,-26922,9552,31343,-31534,-8905,22308,-24001,14122,29567,-32314,5434,490,-32764,32605,3246,-2819,32645,-32758,797,-7539,-31888,28149,-16772,26458,19329,-4283,32486,-29271,14728,-30052,-13062,-12213,-30406,9669,-31308,25331,-20785,32111,-6521,32182,6159,29046,15164,25563,20498,23450,22886,23450,22886,25563,20498,29046,15164,32182,6159,32111,-6521,25331,-20785,9669,-31308,-12213,-30406,-30052,-13062,-29271,14728,-4283,32486,26458,19329,28149,-16772,-7539,-31888,-32758,797,-2819,32645,32605,3246,490,-32764,-32314,5434,14122,29567,22308,-24001,-31534,-8905,9552,31343,18679,-26922,-32353,5192,27959,17086,-13118,-30027,-3308,32599,16188,-28489,-24291,21992,28519,-16135,-30291,12496,30607,-11699,-29699,13844,26955,-18630,-21115,25057,10834,-30924,4038,32517,-20642,-25449,31873,7598,-28459,16241,6580,-32100,22218,24083,-31985,7120,6820,-32050,28086,16876,-22930,23407,-20065,-25906,26673,-19031,20546,25525,-22038,24249,-28990,-15274,4403,-32470,31178,-10079,24778,21440,-2330,32684,-25717,20306,-32697,-2146,-25018,-21162,-10603,-31005,3673,-32561,14453,-29408,21208,-24978,24697,-21534}, {-4283,-32487,4889,32400,-6941,-32024,10370,31082,-15002,-29132,20450,25601,-26018,-19919,30607,11698,-32751,-1043,30821,-11124,-23536,22798,10718,-30965,5857,32239,-22038,-24250,31902,7479,-29953,13286,14563,-29353,8963,31517,-28580,-16029,31140,-10196,-12213,30405,-16719,-28181,32679,2390,-19478,26349,-13231,-29978,32711,1900,-15328,28960,-21115,-25058,30651,-11585,2206,32692,-32229,-5919,12326,-30361,28023,16981,-20065,25905,-24455,-21810,22398,-23917,24372,21901,-20259,25754,-27831,-17296,12779,-30173,32111,6520,1471,32733,-30945,10776,-20355,-25679,16294,-28429,32617,3123,11984,30496,-20642,25448,-32525,-3978,-15220,-29019,13900,-29673,31695,-8313,27501,17813,6820,32049,-16614,28243,-30863,11008,-31216,-9963,-19968,-25981,-3063,-32624,13454,-29878,25563,-20499,31756,-8076,32477,4342,29215,14837,23705,22621,17451,27732,11526,30672,6580,32099,2940,32634,736,32758,0,32767,736,32758,2940,32634,6580,32099,11526,30672,17451,27732,23705,22621,29215,14837,32477,4342,31756,-8076,25563,-20499,13454,-29878,-3063,-32624,-19968,-25981,-31216,-9963,-30863,11008,-16614,28243,6820,32049,27501,17813,31695,-8313,13900,-29673,-15220,-29019,-32525,-3978,-20642,25448,11984,30496,32617,3123,16294,-28429,-20355,-25679,-30945,10776,1471,32733,32111,6520,12779,-30173,-27831,-17296,-20259,25754,24372,21901,22398,-23917,-24455,-21810,-20065,25905,28023,16981,12326,-30361,-32229,-5919,2206,32692,30651,-11585,-21115,-25058,-15328,28960,32711,1900,-13231,-29978,-19478,26349,32679,2390,-16719,-28181,-12213,30405,31140,-10196,-28580,-16029,8963,31517,14563,-29353,-29953,13286,31902,7479,-22038,-24250,5857,32239,10718,-30965,-23536,22798,30821,-11124,-32751,-1043,30607,11698,-26018,-19919,20450,25601,-15002,-29132,10370,31082,-6941,-32024,4889,32400,-4283,-32487,5131,32362,-7420,-31916,11065,30841,-15868,-28669,21394,24818,-26887,-18731,31178,10078,-32755,920,30001,-13175,-21764,24495,8134,-31742,8727,31583,-24291,-21993,32509,4099,-28275,16560,10950,-30884,12892,30123,-30475,-12042,29379,-14509,-7539,31887,-20927,-25215,32629,-3002,-14674,29297,-18377,-27130,32493,-4222,-9435,31379,-25717,-20307,27568,-17711,9199,31449,-32737,1410,5010,-32382,31253,9845,-13118,30026,-29160,-14947,15436,-28904,29325,14618,-12441,30313,-31567,-8787,3551,-32575,32605,-3247,11296,30758,-26092,19821,-27435,-17917,6219,-32172,31815,-7838,21579,24657,-10603,31004,-31846,7717,-24617,-21626,2084,-32701,26312,-19527,32205,6038,18679,26921,-4161,32501,-23875,22443,-32568,3612,-28933,-15382,-16508,-28306,-614,-32762,14122,-29568,24938,-21255,30984,-10661,32766,-62,31466,9140,28397,16348,24697,21533,21208,24977,18477,27060,16824,28117,16401,28366,17243,27862,19279,26494,22308,24000,25942,20016,29541,14177,32159,6279,32580,-3491,29487,-14289,21855,-24414,9552,-31344,-5979,-32218,-21302,-24899,-31362,-9494,-31103,10312,-18275,27197,3673,32560,24858,21348,32650,-2758,19772,-26130,-7659,-31860,-30100,-12950,-27635,17607,490,32763,28874,15490,26745,-18931,-6461,-32124,-32272,-5677,-15760,28728,23191,23148,27959,-17087,-11412,-30716,-32062,6760,3429,32587,32731,-1534,-1105,-32749,-32697,2145,4646,32435,31631,-8550,-13678,-29776,-26240,19625,25640,20402,11870,-30542,-32758,-798,11756,30585,22754,-23579,-31432,-9259,7777,31830,22576,-23748,-32428,-4708,16188,28488,11181,-30801,-30149,12836,30518,11927,-14783,-29243,-7061,31997,24778,-21441,-32540,3855,29750,13733,-19379,-26423,5616,32282,7896,-31802,-18881,26780,26458,-19330,-30780,11238,32553,-3735,-32671,-2513,31957,7240,-31064,-10429,30428,12155,-30291,-12497,30694,11469,-31501,-9023,32372,5071,-32765,429,31929,-7360,-28990,15273,23104,-23235,-13790,29724,1349,-32740,12666,30219,-25254,-20879,32333,5313,-30052,13061,16929,-28055,3916,32532,-24125,-22174,32765,-307,-22666,23663,-2574,-32666,26955,18629,-31024,10544,8609,-31616,22487,23832,-31726,8193,6700,-32075,26673,19030,-27368,18019,-8373,-31680,32760,674,-8254,31710,-29594,-14067,18172,-27267,25331,20784,-22129,24166,-23959,-22354,21487,-24739,26385,19428,-15975,28609,-30904,-10893,4038,-32518,32461,-4465,14011,29620,-23018,23321,-30384,-12270,-1840,-32716,28086,-16877,28757,15705,2451,32675,-25176,20973,-32037,-6881,-15653,-28787,10253,-31122,29046,-15165,31786,7956,19674,26202,245,32766,-18071,27333,-29647,13955,-32705,-2024,-28459,-16242,-19577,-26277,-8846,-31551,1594,-32729,10486,-31044,17347,-27799,22218,-24084,25409,-20690,27300,-18122,28212,-16667,28336,-16455,27700,-17504,26166,-19724,23450,-22887,19180,-26567,13005,-30076,4768,-32419,-5254,-32344,-16082,-28550,-25868,-20114,-31985,-7121,-31600,8668,-22843,23492,-6340,32147,13566,29826,29103,15056,31873,-7599,17967,-27402,-7181,-31971,-28699,-15814,-30337,12383,-8016,31771,21946,24331,32182,-6160,10020,-31198,-23621,-22710,-30244,12610,981,32752,31396,9375,17555,-27668,-22930,-23408,-27232,18223,14232,29514,30736,-11355,-9787,-31272,-31326,9610,10834,30923,29902,-13399,-17140,-27928,-24536,21717,26530,19230,11641,-30630,-32719,-1779,9669,31307,25096,-21068,-29802,-13623,1961,32708,27163,-18326,-30196,-12724,7299,31943,20546,-25526,-32747,1165,23364,22973,-859,-32756,-21021,25135,32135,-6401,-29699,-13845,17034,27991,-123,-32767,-15545,28845,26602,-19131,-32011,7000,32409,4828,-29271,-14729,24207,22082,-18579,-26991,13342,29927,-9082,-31484,6098,32194,-4526,-32454,4403,32469,-5737,-32261,8490,31647,-12554,-30267,17658,27601,-23278,-23062,28519,16134,-32088,-6641,32390,-4951,-27896,17191,17762,-27536,-2697,32655,-14344,-29461,28149,16771,-32641,2879,23790,-22533,-3186,32611,-20162,-25830,32593,3368,-24042,22263,-2330,-32685,27765,17399,-29853,13510,3794,-32547,26815,18830,-28640,15920,-3308,-32600,31663,8431,-17866,27468,-21672,-24577,28816,-15599,10137,31159,-32251,5797,-2819,-32646,32741,-1288,1226,32744,-32661,2635,-5496,-32303,31289,-9729,15110,29074,-25018,21161,-27026,-18529,9317,-31415,32688,-2269,14892,29187,-19871,26054,-32353,-5193,-12099,-30452,18780,-26851,32762,-553,20831,25292,-5375,32323,-27095,18426,-32314,-5435,-20737,-25371,-369,-32765,18980,-26710,30563,-11814,32292,5555,25792,20209,14453,29407,1716,32721,-9904,31234,-19081,26638,-25487,20593,-29435,14398,-31534,8904,-32445,4585,-32726,1655,-32767,184,-32767,184,-32726,1655,-32445,4585,-31534,8904,-29435,14398,-25487,20593,-19081,26638,-9904,31234,1716,32721,14453,29407,25792,20209,32292,5555,30563,-11814,18980,-26710,-369,-32765,-20737,-25371,-32314,-5435,-27095,18426,-5375,32323,20831,25292,32762,-553,18780,-26851,-12099,-30452,-32353,-5193,-19871,26054,14892,29187,32688,-2269,9317,-31415,-27026,-18529,-25018,21161,15110,29074,31289,-9729,-5496,-32303,-32661,2635,1226,32744,32741,-1288,-2819,-32646,-32251,5797,10137,31159,28816,-15599,-21672,-24577,-17866,27468,31663,8431,-3308,-32600,-28640,15920,26815,18830,3794,-32547,-29853,13510,27765,17399,-2330,-32685,-24042,22263,32593,3368,-20162,-25830,-3186,32611,23790,-22533,-32641,2879,28149,16771,-14344,-29461,-2697,32655,17762,-27536,-27896,17191,32390,-4951,-32088,-6641,28519,16134,-23278,-23062,17658,27601,-12554,-30267,8490,31647,-5737,-32261,4403,32469,-4526,-32454,6098,32194,-9082,-31484,13342,29927,-18579,-26991,24207,22082,-29271,-14729,32409,4828,-32011,7000,26602,-19131,-15545,28845,-123,-32767,17034,27991,-29699,-13845,32135,-6401,-21021,25135,-859,-32756,23364,22973,-32747,1165,20546,-25526,7299,31943,-30196,-12724,27163,-18326,1961,32708,-29802,-13623,25096,-21068,9669,31307,-32719,-1779,11641,-30630,26530,19230,-24536,21717,-17140,-27928,29902,-13399,10834,30923,-31326,9610,-9787,-31272,30736,-11355,14232,29514,-27232,18223,-22930,-23408,17555,-27668,31396,9375,981,32752,-30244,12610,-23621,-22710,10020,-31198,32182,-6160,21946,24331,-8016,31771,-30337,12383,-28699,-15814,-7181,-31971,17967,-27402,31873,-7599,29103,15056,13566,29826,-6340,32147,-22843,23492,-31600,8668,-31985,-7121,-25868,-20114,-16082,-28550,-5254,-32344,4768,-32419,13005,-30076,19180,-26567,23450,-22887,26166,-19724,27700,-17504,28336,-16455,28212,-16667,27300,-18122,25409,-20690,22218,-24084,17347,-27799,10486,-31044,1594,-32729,-8846,-31551,-19577,-26277,-28459,-16242,-32705,-2024,-29647,13955,-18071,27333,245,32766,19674,26202,31786,7956,29046,-15165,10253,-31122,-15653,-28787,-32037,-6881,-25176,20973,2451,32675,28757,15705,28086,-16877,-1840,-32716,-30384,-12270,-23018,23321,14011,29620,32461,-4465,4038,-32518,-30904,-10893,-15975,28609,26385,19428,21487,-24739,-23959,-22354,-22129,24166,25331,20784,18172,-27267,-29594,-14067,-8254,31710,32760,674,-8373,-31680,-27368,18019,26673,19030,6700,-32075,-31726,8193,22487,23832,8609,-31616,-31024,10544,26955,18629,-2574,-32666,-22666,23663,32765,-307,-24125,-22174,3916,32532,16929,-28055,-30052,13061,32333,5313,-25254,-20879,12666,30219,1349,-32740,-13790,29724,23104,-23235,-28990,15273,31929,-7360,-32765,429,32372,5071,-31501,-9023,30694,11469,-30291,-12497,30428,12155,-31064,-10429,31957,7240,-32671,-2513,32553,-3735,-30780,11238,26458,-19330,-18881,26780,7896,-31802,5616,32282,-19379,-26423,29750,13733,-32540,3855,24778,-21441,-7061,31997,-14783,-29243,30518,11927,-30149,12836,11181,-30801,16188,28488,-32428,-4708,22576,-23748,7777,31830,-31432,-9259,22754,-23579,11756,30585,-32758,-798,11870,-30542,25640,20402,-26240,19625,-13678,-29776,31631,-8550,4646,32435,-32697,2145,-1105,-32749,32731,-1534,3429,32587,-32062,6760,-11412,-30716,27959,-17087,23191,23148,-15760,28728,-32272,-5677,-6461,-32124,26745,-18931,28874,15490,490,32763,-27635,17607,-30100,-12950,-7659,-31860,19772,-26130,32650,-2758,24858,21348,3673,32560,-18275,27197,-31103,10312,-31362,-9494,-21302,-24899,-5979,-32218,9552,-31344,21855,-24414,29487,-14289,32580,-3491,32159,6279,29541,14177,25942,20016,22308,24000,19279,26494,17243,27862,16401,28366,16824,28117,18477,27060,21208,24977,24697,21533,28397,16348,31466,9140,32766,-62,30984,-10661,24938,-21255,14122,-29568,-614,-32762,-16508,-28306,-28933,-15382,-32568,3612,-23875,22443,-4161,32501,18679,26921,32205,6038,26312,-19527,2084,-32701,-24617,-21626,-31846,7717,-10603,31004,21579,24657,31815,-7838,6219,-32172,-27435,-17917,-26092,19821,11296,30758,32605,-3247,3551,-32575,-31567,-8787,-12441,30313,29325,14618,15436,-28904,-29160,-14947,-13118,30026,31253,9845,5010,-32382,-32737,1410,9199,31449,27568,-17711,-25717,-20307,-9435,31379,32493,-4222,-18377,-27130,-14674,29297,32629,-3002,-20927,-25215,-7539,31887,29379,-14509,-30475,-12042,12892,30123,10950,-30884,-28275,16560,32509,4099,-24291,-21993,8727,31583,8134,-31742,-21764,24495,30001,-13175,-32755,920,31178,10078,-26887,-18731,21394,24818,-15868,-28669,11065,30841,-7420,-31916,5131,32362}, diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index cf6c40d7df..c8d4292e8d 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/print_stats.c * \brief PHY statstic logging function * \author R. Knopp, F. Kaltenberger, navid nikaein diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 4586b0c56c..86bc3723af 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/proto.h * \brief Function prototypes for PHY physical/transport channel processing and generation V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/pss.c b/openair1/PHY/LTE_TRANSPORT/pss.c index 982cdeed9a..f74675157b 100644 --- a/openair1/PHY/LTE_TRANSPORT/pss.c +++ b/openair1/PHY/LTE_TRANSPORT/pss.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/pss.c * \brief Top-level routines for generating primary synchronization signal (PSS) V8.6 2009-03 * \author F. Kaltenberger, O. Tonelli, R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 4cf716e867..7ba52bed5f 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/pucch.c * \brief Top-level routines for generating and decoding the PUCCH physical channel V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c index deaf25a488..f86c009543 100644 --- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/rar_tools.c * \brief Routine for filling the PUSCH/ULSCH data structures based on a random-access response (RAR) SDU from MAC. Note this is both for UE and eNB. V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c index c96b6c197d..a78536246f 100644 --- a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/srs_modulation.c * \brief Top-level routines for generating sounding reference signal (SRS) V8.6 2009-03 * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c index 292095dde4..39112725b1 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.c +++ b/openair1/PHY/LTE_TRANSPORT/sss.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/sss.c * \brief Top-level routines for generating and decoding the secondary synchronization signal (SSS) V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/sss.h b/openair1/PHY/LTE_TRANSPORT/sss.h index bce9b669ef..290e2453e2 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.h +++ b/openair1/PHY/LTE_TRANSPORT/sss.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + int16_t d0_sss[504*62] = {1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1}; int16_t d5_sss[504*62] = {1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1}; diff --git a/openair1/PHY/LTE_TRANSPORT/uci.h b/openair1/PHY/LTE_TRANSPORT/uci.h index 94f511a8cb..8b479ed9ba 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci.h +++ b/openair1/PHY/LTE_TRANSPORT/uci.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c index 73c69b3b74..a8f9f6ba57 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/phich.c * \brief Routines for generation of and computations regarding the uplink control information (UCI) for PUSCH. V8.6 2009-03 * \author R. Knopp, F. Kaltenberger, A. Bhamri diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index bbe09054a7..53eaa849fd 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/ulsch_coding.c * \brief Top-level routines for coding the ULSCH transport channel as described in 36.212 V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index aafa9a381a..030bd02b55 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/ulsch_decoding.c * \brief Top-level routines for decoding the ULSCH transport channel from 36.212 V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 16d16063c7..28d7cbbd01 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/ulsch_demodulation.c * \brief Top-level routines for demodulating the PUSCH physical channel from 36.211 V8.6 2009-03 * \author R. Knopp diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c index 0c785c7236..80168dd3c5 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/LTE_TRANSPORT/ulsch_modulation.c * \brief Top-level routines for generating PUSCH physical channel from 36.211 V8.6 2009-03 * \author R. Knopp, F. Kaltenberger, A. Bhamri diff --git a/openair1/PHY/LTE_TRANSPORT/vars.h b/openair1/PHY/LTE_TRANSPORT/vars.h index 714ed6fcfc..ba58939878 100644 --- a/openair1/PHY/LTE_TRANSPORT/vars.h +++ b/openair1/PHY/LTE_TRANSPORT/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "dlsch_tbs.h" //#include "dlsch_tbs_full.h" #include "sss.h" diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h index 637fcb823a..fdf76e61aa 100644 --- a/openair1/PHY/MODULATION/defs.h +++ b/openair1/PHY/MODULATION/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __MODULATION_DEFS__H__ #define __MODULATION_DEFS__H__ #include "PHY/defs.h" diff --git a/openair1/PHY/MODULATION/extern.h b/openair1/PHY/MODULATION/extern.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair1/PHY/MODULATION/extern.h +++ b/openair1/PHY/MODULATION/extern.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair1/PHY/MODULATION/kHz_7_5.h b/openair1/PHY/MODULATION/kHz_7_5.h index 7200627040..c6d484143a 100644 --- a/openair1/PHY/MODULATION/kHz_7_5.h +++ b/openair1/PHY/MODULATION/kHz_7_5.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + int16_t s6n_kHz_7_5[1920]__attribute__((aligned(16))) = {31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805}; int16_t s6e_kHz_7_5[1920]__attribute__((aligned(16))) = {23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805}; diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 51361ada7d..ab8d376ac5 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * @defgroup _PHY_MODULATION_ * @ingroup _physical_layer_ref_implementation_ diff --git a/openair1/PHY/MODULATION/prach625Hz.h b/openair1/PHY/MODULATION/prach625Hz.h index a04b8b7669..63606ae57b 100644 --- a/openair1/PHY/MODULATION/prach625Hz.h +++ b/openair1/PHY/MODULATION/prach625Hz.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + int16_t sig625_1_25MHz[2850*2]; int16_t sig625_2_5MHz[5700*2]; int16_t sig625_5MHz[11400*2]; diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index 72adbd9bfe..0a592a1a19 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "defs.h" //#define DEBUG_FEP diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index 44d4514d14..cf7737bf1a 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "defs.h" //#define DEBUG_FEP diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index de76b547c5..b079896580 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "PHY/extern.h" #include "defs.h" diff --git a/openair1/PHY/MODULATION/ul_7_5_kHz.c b/openair1/PHY/MODULATION/ul_7_5_kHz.c index 20d2c145ba..21a3dc7c43 100644 --- a/openair1/PHY/MODULATION/ul_7_5_kHz.c +++ b/openair1/PHY/MODULATION/ul_7_5_kHz.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/defs.h" #include "PHY/extern.h" #include "extern.h" diff --git a/openair1/PHY/MODULATION/vars.h b/openair1/PHY/MODULATION/vars.h index 69b32e6b44..adda18dffc 100644 --- a/openair1/PHY/MODULATION/vars.h +++ b/openair1/PHY/MODULATION/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + mod_sym_t qpsk_table[4]; mod_sym_t qam16_table[16]; mod_sym_t qam64_table[64]; diff --git a/openair1/PHY/TOOLS/8bit_rxdemux.c b/openair1/PHY/TOOLS/8bit_rxdemux.c index a0bd13a2a0..47d7b27571 100644 --- a/openair1/PHY/TOOLS/8bit_rxdemux.c +++ b/openair1/PHY/TOOLS/8bit_rxdemux.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/TOOLS/8bit_txmux.c b/openair1/PHY/TOOLS/8bit_txmux.c index 2a6b5034ea..761f15c4f0 100644 --- a/openair1/PHY/TOOLS/8bit_txmux.c +++ b/openair1/PHY/TOOLS/8bit_txmux.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/TOOLS/alaw_lut.h b/openair1/PHY/TOOLS/alaw_lut.h index 45e48a5c33..7e6b93c9f0 100644 --- a/openair1/PHY/TOOLS/alaw_lut.h +++ b/openair1/PHY/TOOLS/alaw_lut.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/TOOLS/ALAW/alaw_lut.h * \brief * \author S. Sandeep Kumar, Raymond Knopp diff --git a/openair1/PHY/TOOLS/angle.c b/openair1/PHY/TOOLS/angle.c index 5319b6e2c3..9ea714b4fc 100644 --- a/openair1/PHY/TOOLS/angle.c +++ b/openair1/PHY/TOOLS/angle.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /****************************** * file: angle.c * purpose: compute the angle of a 8 bit complex number diff --git a/openair1/PHY/TOOLS/cadd_sv.c b/openair1/PHY/TOOLS/cadd_sv.c index be12659d1c..b83f9e1fce 100644 --- a/openair1/PHY/TOOLS/cadd_sv.c +++ b/openair1/PHY/TOOLS/cadd_sv.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" static __m128i alpha_128 __attribute__ ((aligned(16))); diff --git a/openair1/PHY/TOOLS/cadd_vv.c b/openair1/PHY/TOOLS/cadd_vv.c index edac4adbc3..0707f02085 100644 --- a/openair1/PHY/TOOLS/cadd_vv.c +++ b/openair1/PHY/TOOLS/cadd_vv.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" diff --git a/openair1/PHY/TOOLS/cdot_prod.c b/openair1/PHY/TOOLS/cdot_prod.c index 987b94b335..d7c7dd3fea 100644 --- a/openair1/PHY/TOOLS/cdot_prod.c +++ b/openair1/PHY/TOOLS/cdot_prod.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c index 1a65b5962f..aebab9b38f 100644 --- a/openair1/PHY/TOOLS/cmult_sv.c +++ b/openair1/PHY/TOOLS/cmult_sv.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/sse_intrin.h" #include "defs.h" diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c index 444c66665a..cefa972061 100644 --- a/openair1/PHY/TOOLS/cmult_vv.c +++ b/openair1/PHY/TOOLS/cmult_vv.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" //#include "MAC_INTERFACE/extern.h" #ifdef USER_MODE diff --git a/openair1/PHY/TOOLS/costable.h b/openair1/PHY/TOOLS/costable.h index d1d6428cf3..03682f84dc 100644 --- a/openair1/PHY/TOOLS/costable.h +++ b/openair1/PHY/TOOLS/costable.h @@ -1 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + unsigned int acostable[256] = {16384,16343,16302,16261,16220,16179,16139,16098,16057,16016,15975,15934,15893,15852,15811,15770,15729,15688,15647,15606,15565,15524,15483,15442,15401,15360,15319,15278,15236,15195,15154,15113,15072,15030,14989,14948,14907,14865,14824,14782,14741,14700,14658,14617,14575,14534,14492,14450,14409,14367,14325,14284,14242,14200,14158,14116,14075,14033,13991,13949,13907,13864,13822,13780,13738,13696,13653,13611,13568,13526,13484,13441,13398,13356,13313,13270,13227,13184,13142,13099,13056,13012,12969,12926,12883,12839,12796,12752,12709,12665,12622,12578,12534,12490,12446,12402,12358,12314,12270,12225,12181,12136,12092,12047,12002,11957,11913,11868,11822,11777,11732,11687,11641,11595,11550,11504,11458,11412,11366,11320,11274,11227,11181,11134,11087,11040,10993,10946,10899,10852,10804,10757,10709,10661,10613,10565,10517,10468,10420,10371,10322,10273,10224,10174,10125,10075,10026,9976,9925,9875,9825,9774,9723,9672,9621,9569,9518,9466,9414,9362,9309,9257,9204,9151,9097,9044,8990,8936,8882,8827,8773,8718,8662,8607,8551,8495,8439,8382,8325,8268,8210,8152,8094,8035,7976,7917,7858,7798,7737,7676,7615,7554,7492,7430,7367,7303,7240,7176,7111,7046,6980,6914,6847,6780,6712,6643,6574,6505,6434,6363,6292,6219,6146,6072,5997,5921,5845,5767,5689,5610,5529,5448,5365,5282,5197,5110,5023,4934,4843,4751,4657,4562,4464,4364,4263,4159,4052,3942,3830,3715,3595,3472,3345,3213,3075,2931,2779,2620,2450,2267,2069,1850,1602,1307,924,0}; diff --git a/openair1/PHY/TOOLS/dB_routines.c b/openair1/PHY/TOOLS/dB_routines.c index 8b0b293728..1bcefbba03 100644 --- a/openair1/PHY/TOOLS/dB_routines.c +++ b/openair1/PHY/TOOLS/dB_routines.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" // Approximate 10*log10(x) in fixed point : x = 0...(2^32)-1 diff --git a/openair1/PHY/TOOLS/dB_routines.h b/openair1/PHY/TOOLS/dB_routines.h index 1e29358fe7..965caf76d7 100644 --- a/openair1/PHY/TOOLS/dB_routines.h +++ b/openair1/PHY/TOOLS/dB_routines.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * dB_routines.h * diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 1fb8ad6ff4..453efc028a 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __PHY_TOOLS_DEFS__H__ #define __PHY_TOOLS_DEFS__H__ diff --git a/openair1/PHY/TOOLS/extern.h b/openair1/PHY/TOOLS/extern.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair1/PHY/TOOLS/extern.h +++ b/openair1/PHY/TOOLS/extern.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair1/PHY/TOOLS/file_output.c b/openair1/PHY/TOOLS/file_output.c index 29376568b3..1eb9f25b5a 100644 --- a/openair1/PHY/TOOLS/file_output.c +++ b/openair1/PHY/TOOLS/file_output.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef USER_MODE #include diff --git a/openair1/PHY/TOOLS/invSqrt.c b/openair1/PHY/TOOLS/invSqrt.c index a098fe728a..332cb63886 100644 --- a/openair1/PHY/TOOLS/invSqrt.c +++ b/openair1/PHY/TOOLS/invSqrt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + static short lookup_table[1025] = {0x7fff, 0x16a0, 0x1000, 0xd10, 0xb50, 0xa1e, 0x93c, 0x88d, 0x800, 0x78a, 0x727, 0x6d2, 0x688, 0x646, 0x60c, 0x5d7, 0x5a8, 0x57c, 0x555, 0x530, 0x50f, 0x4f0, 0x4d2, 0x4b7, 0x49e, 0x486, 0x470, 0x45a, 0x446, 0x433, 0x421, 0x410, 0x400, 0x3f0, 0x3e1, 0x3d3, 0x3c5, 0x3b8, 0x3ab, 0x39f, 0x393, 0x388, 0x37d, 0x373, 0x369, 0x35f, 0x356, 0x34c, 0x344, 0x33b, 0x333, 0x32b, 0x323, 0x31b, 0x314, 0x30d, 0x306, 0x2ff, 0x2f8, 0x2f2, 0x2eb, 0x2e5, 0x2df, 0x2d9, 0x2d4, 0x2ce, 0x2c9, 0x2c3, 0x2be, 0x2b9, 0x2b4, 0x2af, 0x2aa, 0x2a5, 0x2a1, 0x29c, 0x298, 0x294, 0x28f, 0x28b, 0x287, 0x283, 0x27f, 0x27b, 0x278, 0x274, 0x270, 0x26d, 0x269, 0x266, 0x262, 0x25f, 0x25b, 0x258, 0x255, 0x252, 0x24f, 0x24c, 0x249, 0x246, 0x243, 0x240, 0x23d, 0x23a, 0x238, 0x235, 0x232, 0x22f, 0x22d, 0x22a, 0x228, 0x225, 0x223, 0x220, 0x21e, 0x21c, 0x219, 0x217, 0x215, 0x213, 0x210, 0x20e, 0x20c, 0x20a, 0x208, 0x206, 0x204, 0x202, 0x200, 0x1fe, 0x1fc, 0x1fa, 0x1f8, 0x1f6, 0x1f4, 0x1f2, 0x1f0, 0x1ee, 0x1ed, 0x1eb, 0x1e9, 0x1e7, 0x1e6, 0x1e4, 0x1e2, 0x1e1, 0x1df, 0x1dd, 0x1dc, 0x1da, 0x1d8, 0x1d7, 0x1d5, 0x1d4, 0x1d2, 0x1d1, 0x1cf, 0x1ce, 0x1cc, 0x1cb, 0x1c9, 0x1c8, 0x1c7, 0x1c5, 0x1c4, 0x1c2, 0x1c1, 0x1c0, 0x1be, 0x1bd, 0x1bc, 0x1ba, 0x1b9, 0x1b8, 0x1b7, 0x1b5, 0x1b4, 0x1b3, 0x1b2, 0x1b0, 0x1af, 0x1ae, 0x1ad, 0x1ac, 0x1ab, 0x1a9, 0x1a8, 0x1a7, 0x1a6, 0x1a5, 0x1a4, 0x1a3, 0x1a2, 0x1a0, 0x19f, 0x19e, 0x19d, 0x19c, 0x19b, 0x19a, 0x199, 0x198, 0x197, 0x196, 0x195, 0x194, 0x193, 0x192, 0x191, 0x190, 0x18f, 0x18e, 0x18d, 0x18c, 0x18b, 0x18b, 0x18a, 0x189, 0x188, 0x187, 0x186, 0x185, 0x184, 0x183, 0x183, 0x182, 0x181, 0x180, 0x17f, 0x17e, 0x17d, 0x17d, 0x17c, 0x17b, 0x17a, 0x179, 0x179, 0x178, 0x177, 0x176, 0x175, 0x175, 0x174, 0x173, 0x172, 0x172, 0x171, 0x170, 0x16f, 0x16f, 0x16e, 0x16d, 0x16c, 0x16c, 0x16b, 0x16a, 0x16a, 0x169, 0x168, 0x167, 0x167, 0x166, 0x165, 0x165, 0x164, 0x163, 0x163, 0x162, 0x161, 0x161, 0x160, 0x15f, 0x15f, 0x15e, 0x15d, 0x15d, 0x15c, 0x15c, 0x15b, 0x15a, 0x15a, 0x159, 0x158, 0x158, 0x157, 0x157, 0x156, 0x155, 0x155, 0x154, 0x154, 0x153, 0x152, 0x152, 0x151, 0x151, 0x150, 0x150, 0x14f, 0x14e, 0x14e, 0x14d, 0x14d, 0x14c, 0x14c, 0x14b, 0x14b, 0x14a, 0x14a, 0x149, 0x148, 0x148, 0x147, 0x147, 0x146, 0x146, 0x145, 0x145, 0x144, 0x144, 0x143, 0x143, 0x142, 0x142, 0x141, 0x141, 0x140, 0x140, 0x13f, 0x13f, 0x13e, 0x13e, 0x13d, 0x13d, 0x13c, 0x13c, 0x13c, 0x13b, 0x13b, 0x13a, 0x13a, 0x139, 0x139, 0x138, 0x138, 0x137, 0x137, 0x136, 0x136, 0x136, 0x135, 0x135, 0x134, 0x134, 0x133, 0x133, 0x133, 0x132, 0x132, 0x131, 0x131, 0x130, 0x130, 0x130, 0x12f, 0x12f, 0x12e, 0x12e, 0x12d, 0x12d, 0x12d, 0x12c, 0x12c, 0x12b, 0x12b, 0x12b, 0x12a, 0x12a, 0x129, 0x129, 0x129, 0x128, 0x128, 0x127, 0x127, 0x127, 0x126, 0x126, 0x126, 0x125, 0x125, 0x124, 0x124, 0x124, 0x123, 0x123, 0x123, 0x122, 0x122, 0x121, 0x121, 0x121, 0x120, 0x120, 0x120, 0x11f, 0x11f, 0x11f, 0x11e, 0x11e, 0x11e, 0x11d, 0x11d, 0x11d, 0x11c, 0x11c, 0x11c, 0x11b, 0x11b, 0x11a, 0x11a, 0x11a, 0x119, 0x119, 0x119, 0x118, 0x118, 0x118, 0x117, 0x117, 0x117, 0x117, 0x116, 0x116, 0x116, 0x115, 0x115, 0x115, 0x114, 0x114, 0x114, 0x113, 0x113, 0x113, 0x112, 0x112, 0x112, 0x111, 0x111, 0x111, 0x111, 0x110, 0x110, 0x110, 0x10f, 0x10f, 0x10f, 0x10e, 0x10e, 0x10e, 0x10e, 0x10d, 0x10d, 0x10d, 0x10c, 0x10c, 0x10c, 0x10c, 0x10b, 0x10b, 0x10b, 0x10a, 0x10a, 0x10a, 0x10a, 0x109, 0x109, 0x109, 0x108, 0x108, 0x108, 0x108, 0x107, 0x107, 0x107, 0x107, 0x106, 0x106, 0x106, 0x105, 0x105, 0x105, 0x105, 0x104, 0x104, 0x104, 0x104, 0x103, 0x103, 0x103, 0x103, 0x102, 0x102, 0x102, 0x102, 0x101, 0x101, 0x101, 0x101, 0x100, 0x100, 0x100, 0x100, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf7, 0xf7, 0xf7, 0xf7, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5}; short invSqrt(short x) diff --git a/openair1/PHY/TOOLS/log2_approx.c b/openair1/PHY/TOOLS/log2_approx.c index 9870d35067..0317a97d2f 100644 --- a/openair1/PHY/TOOLS/log2_approx.c +++ b/openair1/PHY/TOOLS/log2_approx.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + unsigned char log2_approx(unsigned int x) { diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index bb8267c242..fe12014fd3 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef USER_MODE #include #include diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index bfcae57c04..1465da6544 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Form definition file generated by fdesign */ #include diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h index 6f84f631e1..a5bcfa1ce6 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.h +++ b/openair1/PHY/TOOLS/lte_phy_scope.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Header file generated by fdesign on Tue Nov 13 09:42:50 2012 */ #ifndef FD_lte_scope_h_ diff --git a/openair1/PHY/TOOLS/lut.c b/openair1/PHY/TOOLS/lut.c index f0a5db11ab..ba9da904e3 100644 --- a/openair1/PHY/TOOLS/lut.c +++ b/openair1/PHY/TOOLS/lut.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + double interp(double x, double *xs, double *ys, int count) { int i; diff --git a/openair1/PHY/TOOLS/memory_routines.c b/openair1/PHY/TOOLS/memory_routines.c index 6c9a4be610..c7015ff46e 100644 --- a/openair1/PHY/TOOLS/memory_routines.c +++ b/openair1/PHY/TOOLS/memory_routines.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/sse_intrin.h" void Zero_Buffer(void *buf,unsigned int length) diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c index 8b5aca9335..2ae49ae87f 100644 --- a/openair1/PHY/TOOLS/signal_energy.c +++ b/openair1/PHY/TOOLS/signal_energy.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" #include "PHY/sse_intrin.h" diff --git a/openair1/PHY/TOOLS/smbv.c b/openair1/PHY/TOOLS/smbv.c index 9daa725330..f00bc017a0 100644 --- a/openair1/PHY/TOOLS/smbv.c +++ b/openair1/PHY/TOOLS/smbv.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* This library offers some functions to remotely program the R&S SMBV100A. */ diff --git a/openair1/PHY/TOOLS/smbv.h b/openair1/PHY/TOOLS/smbv.h index a89f38d6a2..40a954d6e3 100644 --- a/openair1/PHY/TOOLS/smbv.h +++ b/openair1/PHY/TOOLS/smbv.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* This library offers some functions to remotely program the R&S SMBV100A. */ diff --git a/openair1/PHY/TOOLS/sqrt.c b/openair1/PHY/TOOLS/sqrt.c index bca05b5a50..b950f4b542 100644 --- a/openair1/PHY/TOOLS/sqrt.c +++ b/openair1/PHY/TOOLS/sqrt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //---------------------------------------------- // // Integer square root. Take the square root of an integer. diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c index 0e123bf128..19e9d64d1f 100644 --- a/openair1/PHY/TOOLS/time_meas.c +++ b/openair1/PHY/TOOLS/time_meas.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "time_meas.h" #include diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index b4b81f5afd..7791306d6d 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __TIME_MEAS_DEFS__H__ #define __TIME_MEAS_DEFS__H__ diff --git a/openair1/PHY/TOOLS/twiddle12288.h b/openair1/PHY/TOOLS/twiddle12288.h index 4214d00084..0cca2ec4b3 100644 --- a/openair1/PHY/TOOLS/twiddle12288.h +++ b/openair1/PHY/TOOLS/twiddle12288.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:4095)/12288)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:8190)/12288)); diff --git a/openair1/PHY/TOOLS/twiddle1536.h b/openair1/PHY/TOOLS/twiddle1536.h index 8eb6b8e565..c84724904e 100644 --- a/openair1/PHY/TOOLS/twiddle1536.h +++ b/openair1/PHY/TOOLS/twiddle1536.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include /* Twiddles generated with diff --git a/openair1/PHY/TOOLS/twiddle24576.h b/openair1/PHY/TOOLS/twiddle24576.h index 01af22474f..a8c3c2119f 100644 --- a/openair1/PHY/TOOLS/twiddle24576.h +++ b/openair1/PHY/TOOLS/twiddle24576.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:8191)/24576)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:16382)/24576)); diff --git a/openair1/PHY/TOOLS/twiddle6144.h b/openair1/PHY/TOOLS/twiddle6144.h index 324f5a2a3d..fe7a985461 100644 --- a/openair1/PHY/TOOLS/twiddle6144.h +++ b/openair1/PHY/TOOLS/twiddle6144.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:2047)/6144)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:4094)/6144)); diff --git a/openair1/PHY/TOOLS/twiddles4096.h b/openair1/PHY/TOOLS/twiddles4096.h index df25ae5364..3122e1fbb9 100644 --- a/openair1/PHY/TOOLS/twiddles4096.h +++ b/openair1/PHY/TOOLS/twiddles4096.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:1023)/4096)); twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(0:1023)/4096)); diff --git a/openair1/PHY/TOOLS/twiddles8192.h b/openair1/PHY/TOOLS/twiddles8192.h index ddb8ab2273..344f5e3325 100644 --- a/openair1/PHY/TOOLS/twiddles8192.h +++ b/openair1/PHY/TOOLS/twiddles8192.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:4095)/8192)); twa2 = zeros(1,2*4096); diff --git a/openair1/PHY/TOOLS/vars.h b/openair1/PHY/TOOLS/vars.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair1/PHY/TOOLS/vars.h +++ b/openair1/PHY/TOOLS/vars.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 7c31f955ae..29f0715785 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/defs.h \brief Top-level defines and structure definitions \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h index 47a92cbcc1..293da8f572 100644 --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __PHY_EXTERN_H__ #define __PHY_EXTERN_H__ diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 058534594b..3000f13a19 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/impl_defs_lte.h * \brief LTE Physical channel configuration and variable structure definitions * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index 1c1844aa46..c9e468948e 100644 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/impl_defs_top.h * \brief More defines and structure definitions * \author R. Knopp, F. Kaltenberger diff --git a/openair1/PHY/sse_intrin.h b/openair1/PHY/sse_intrin.h index 8857c424ca..8ae5de547a 100644 --- a/openair1/PHY/sse_intrin.h +++ b/openair1/PHY/sse_intrin.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY/sse_intrin.h * \brief SSE includes and compatibility functions. * diff --git a/openair1/PHY/types.h b/openair1/PHY/types.h index 868ccb0743..61cafaefa9 100644 --- a/openair1/PHY/types.h +++ b/openair1/PHY/types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __openair_TYPES_H__ #define __openair_TYPES_H__ diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h index 956963a13d..f920973368 100644 --- a/openair1/PHY/vars.h +++ b/openair1/PHY/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __PHY_VARS_H__ #define __PHY_VARS_H__ diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index eed7418f7a..ae0e3c0b3a 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* \author R. Knopp, F. Kaltenberger \company EURECOM diff --git a/openair1/SCHED/extern.h b/openair1/SCHED/extern.h index 63fd7370d7..2c5ac12ca5 100644 --- a/openair1/SCHED/extern.h +++ b/openair1/SCHED/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*!\brief SCHED external variables */ #ifndef __SCHED_EXTERN_H__ diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index f90b717f9d..939023b2c8 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file phy_mac_stub.c * \brief stimulates the phy without mac * \author R. Knopp, F. Kaltenberger, N. Nikaein diff --git a/openair1/SCHED/phy_procedures_emos.h b/openair1/SCHED/phy_procedures_emos.h index fe7991ca1b..567ec7ec80 100644 --- a/openair1/SCHED/phy_procedures_emos.h +++ b/openair1/SCHED/phy_procedures_emos.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __PHY_PROCEDURES_EMOS_H__ #define __PHY_PROCEDURES_EMOS_H__ diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c index 4ebe01487a..239a5e2f8d 100644 --- a/openair1/SCHED/phy_procedures_lte_common.c +++ b/openair1/SCHED/phy_procedures_lte_common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file phy_procedures_lte_eNB.c * \brief Implementation of common utilities for eNB/UE procedures from 36.213 LTE specifications * \author R. Knopp, F. Kaltenberger diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 94c862245d..4163b8340c 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file phy_procedures_lte_eNB.c * \brief Implementation of eNB procedures from 36.213 LTE specifications * \author R. Knopp, F. Kaltenberger, N. Nikaein diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 6814940160..1e7137b174 100644 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file phy_procedures_lte_ue.c * \brief Implementation of UE procedures from 36.213 LTE specifications * \author R. Knopp, F. Kaltenberger, N. Nikaein diff --git a/openair1/SCHED/pucch_pc.c b/openair1/SCHED/pucch_pc.c index 1b93f6842d..5afd57e6a0 100644 --- a/openair1/SCHED/pucch_pc.c +++ b/openair1/SCHED/pucch_pc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pusch_pc.c * \brief Implementation of UE PUSCH Power Control procedures from 36.213 LTE specifications (Section * \author R. Knopp diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c index aac4eb3ba1..fca0fdc441 100644 --- a/openair1/SCHED/pusch_pc.c +++ b/openair1/SCHED/pusch_pc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pusch_pc.c * \brief Implementation of UE PUSCH Power Control procedures from 36.213 LTE specifications (Section * \author R. Knopp diff --git a/openair1/SCHED/rt_compat.h b/openair1/SCHED/rt_compat.h index f387bb9eba..b220d6f06a 100644 --- a/openair1/SCHED/rt_compat.h +++ b/openair1/SCHED/rt_compat.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Header file for making PLATON work on both RTLinux and RTAI using pthreads * Copyright Frank Wartena, 2004 * Version: 0.1 January 28th, 2004 ## First version for scheduling test diff --git a/openair1/SCHED/vars.h b/openair1/SCHED/vars.h index 35f0ea150f..39eaf7f118 100644 --- a/openair1/SCHED/vars.h +++ b/openair1/SCHED/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" diff --git a/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c b/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c index 31f39d3836..c7815b087d 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file bypass_session_layer.h * \brief implementation of emultor tx and rx * \author Navid Nikaein and Raymond Knopp diff --git a/openair1/SIMULATION/ETH_TRANSPORT/defs.h b/openair1/SIMULATION/ETH_TRANSPORT/defs.h index 8da6bb0a05..48531a2da6 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/defs.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file phy_emulation.h * \brief specifies the data structure and variable for phy emulation * \author Navid Nikaein, Raymomd Knopp and Hicham Anouar diff --git a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c index 6e4f704d53..6d3d4cabb3 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file phy_emulation.c * \brief implements the underlying protocol for emulated data exchange over Ethernet using IP multicast * \author Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/extern.h b/openair1/SIMULATION/ETH_TRANSPORT/extern.h index 9930a74152..89cf38f15b 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/extern.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file extern.h * \brief specifies the extern variables for phy emulation * \author Navid Nikaein and Raymomd Knopp and Hicham Anouar diff --git a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c index 4f56c1dff5..306ec12ad2 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file multicast.h * \brief * \author Lionel Gauthier and Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h index ca109ca90b..d4071e7ff2 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file multicast.h * \brief * \author Lionel Gauthier and Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c index d321b6268b..b0c01706fd 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file netlink_init.c * \brief initiate the netlink socket for communication with nas dirver * \author Navid Nikaein and Raymomd Knopp diff --git a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c index 22fc1c0bbd..9feeeca457 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pgm_link.c * \brief implementation a warpper for openpgm for reliable multicast transmission * \author Navid Nikaein and S. Roux diff --git a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h index 81942bd4c1..b444d123bc 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef PGM_LINK_H_ #define PGM_LINK_H_ diff --git a/openair1/SIMULATION/ETH_TRANSPORT/proto.h b/openair1/SIMULATION/ETH_TRANSPORT/proto.h index 304c6e0842..5b43c86217 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/proto.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/proto.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file proto.h * \brief * \author Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.c b/openair1/SIMULATION/ETH_TRANSPORT/socket.c index 295a65e104..d8dd81ffdc 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/socket.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file socket.c * \brief * \author Lionel Gauthier diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.h b/openair1/SIMULATION/ETH_TRANSPORT/socket.h index 2543928061..ede14f8db1 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/socket.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file socket.h * \brief * \author Lionel Gauthier diff --git a/openair1/SIMULATION/ETH_TRANSPORT/vars.h b/openair1/SIMULATION/ETH_TRANSPORT/vars.h index fdf457a0dd..09d9c94295 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/vars.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file vars.h * \brief specifies the variables for phy emulation * \author Navid Nikaein and Raymomd Knopp and Hicham Anouar diff --git a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c index 3a9e12151c..6507a656a1 100644 --- a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c +++ b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h index 0cdd884f73..ce8a3b994f 100644 --- a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h +++ b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 68dc5ca311..59bcc26031 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file dlsim.c \brief Top-level DL simulator \author R. Knopp diff --git a/openair1/SIMULATION/LTE_PHY/framegen.c b/openair1/SIMULATION/LTE_PHY/framegen.c index 9894539862..9d6530414e 100644 --- a/openair1/SIMULATION/LTE_PHY/framegen.c +++ b/openair1/SIMULATION/LTE_PHY/framegen.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.c b/openair1/SIMULATION/LTE_PHY/gpib_send.c index 64ba15dfc5..40bcfa8722 100644 --- a/openair1/SIMULATION/LTE_PHY/gpib_send.c +++ b/openair1/SIMULATION/LTE_PHY/gpib_send.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.h b/openair1/SIMULATION/LTE_PHY/gpib_send.h index 5402ada9a5..1f1f14e956 100644 --- a/openair1/SIMULATION/LTE_PHY/gpib_send.h +++ b/openair1/SIMULATION/LTE_PHY/gpib_send.h @@ -1 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + void gpib_send(unsigned int gpib_board, unsigned int gpib_device, char* command_string); diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 2eedb50869..d96ac645d6 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index dac581f4bd..f696cc8da4 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index eb48182161..0b79ec52ba 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c index 34d4d4149a..d50b4ab7e9 100644 --- a/openair1/SIMULATION/LTE_PHY/prachsim.c +++ b/openair1/SIMULATION/LTE_PHY/prachsim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h b/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h index c743949238..a17d708747 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h +++ b/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c b/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c index 30f8cf0cf0..20f044eb93 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index 88b33caefa..8774a76ec7 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/scansim.c b/openair1/SIMULATION/LTE_PHY/scansim.c index 0bc48ec4dd..20c3f374d0 100644 --- a/openair1/SIMULATION/LTE_PHY/scansim.c +++ b/openair1/SIMULATION/LTE_PHY/scansim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/signalanalyzer.c b/openair1/SIMULATION/LTE_PHY/signalanalyzer.c index 90c372e556..cf63bd8312 100644 --- a/openair1/SIMULATION/LTE_PHY/signalanalyzer.c +++ b/openair1/SIMULATION/LTE_PHY/signalanalyzer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/signalanalyzer.h b/openair1/SIMULATION/LTE_PHY/signalanalyzer.h index 169f6cdc7c..8be2f1b6cb 100644 --- a/openair1/SIMULATION/LTE_PHY/signalanalyzer.h +++ b/openair1/SIMULATION/LTE_PHY/signalanalyzer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c index b46c7a7282..7e94122e68 100644 --- a/openair1/SIMULATION/LTE_PHY/syncsim.c +++ b/openair1/SIMULATION/LTE_PHY/syncsim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/test.c b/openair1/SIMULATION/LTE_PHY/test.c index a4350718b9..16a7b636f5 100644 --- a/openair1/SIMULATION/LTE_PHY/test.c +++ b/openair1/SIMULATION/LTE_PHY/test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include "SIMULATION/TOOLS/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c index 67f7bc4bcd..7c46d057e0 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c +++ b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h index 8d9f611bc4..0a676be00f 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h +++ b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index b9f6378535..f9ae729902 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file ulsim.c \brief Top-level DL simulator \author R. Knopp diff --git a/openair1/SIMULATION/LTE_PHY/ulsim2.c b/openair1/SIMULATION/LTE_PHY/ulsim2.c index 8beb71453b..26cec52187 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim2.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim2.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include "SIMULATION/TOOLS/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/unitary_defs.h b/openair1/SIMULATION/LTE_PHY/unitary_defs.h index 6fefc47a72..73d0bc0900 100644 --- a/openair1/SIMULATION/LTE_PHY/unitary_defs.h +++ b/openair1/SIMULATION/LTE_PHY/unitary_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + openair0_device openair0; int oai_exit=0; diff --git a/openair1/SIMULATION/RF/adc.c b/openair1/SIMULATION/RF/adc.c index 381fdbcb18..8bb32778fe 100644 --- a/openair1/SIMULATION/RF/adc.c +++ b/openair1/SIMULATION/RF/adc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + void adc(double *r_re[2], double *r_im[2], unsigned int input_offset, diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c index fe62c82c2e..4bd006c476 100644 --- a/openair1/SIMULATION/RF/dac.c +++ b/openair1/SIMULATION/RF/dac.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //#define DEBUG_DAC 1 #include #include diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/defs.h index b3619f5035..b3d5e47e6b 100644 --- a/openair1/SIMULATION/RF/defs.h +++ b/openair1/SIMULATION/RF/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** \brief Apply RF impairments to received signal @param r_re Double two-dimensional array of Real part of received signal @param r_im Double two-dimensional array of Imag part of received signal diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c index 611b76df7c..cb2af38367 100644 --- a/openair1/SIMULATION/RF/rf.c +++ b/openair1/SIMULATION/RF/rf.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //#include "defs.h" #include #include diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c index 27b37989d0..8fce4d25a6 100644 --- a/openair1/SIMULATION/TOOLS/abstraction.c +++ b/openair1/SIMULATION/TOOLS/abstraction.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/TOOLS/ch_desc_proto.c b/openair1/SIMULATION/TOOLS/ch_desc_proto.c index 3e9a8b5572..e47ac81440 100644 --- a/openair1/SIMULATION/TOOLS/ch_desc_proto.c +++ b/openair1/SIMULATION/TOOLS/ch_desc_proto.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h index 104dff6c6d..336187ff1c 100644 --- a/openair1/SIMULATION/TOOLS/defs.h +++ b/openair1/SIMULATION/TOOLS/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __SIMULATION_TOOLS_DEFS_H__ #define __SIMULATION_TOOLS_DEFS_H__ #include "PHY/defs.h" diff --git a/openair1/SIMULATION/TOOLS/gauss.c b/openair1/SIMULATION/TOOLS/gauss.c index 1c63e5a66a..ff3ff14e24 100644 --- a/openair1/SIMULATION/TOOLS/gauss.c +++ b/openair1/SIMULATION/TOOLS/gauss.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/TOOLS/llr_quantization.c b/openair1/SIMULATION/TOOLS/llr_quantization.c index b97fa17a3d..3cb221e675 100644 --- a/openair1/SIMULATION/TOOLS/llr_quantization.c +++ b/openair1/SIMULATION/TOOLS/llr_quantization.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //#include #include //#include diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c index de09d634e5..43af2efb87 100644 --- a/openair1/SIMULATION/TOOLS/multipath_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_channel.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c index fb9bc76772..a75d432120 100644 --- a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 6f434935a8..6e034332c0 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c index b1ae5535b4..a1dee2a553 100644 --- a/openair1/SIMULATION/TOOLS/rangen_double.c +++ b/openair1/SIMULATION/TOOLS/rangen_double.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef USER_MODE #include #include diff --git a/openair1/SIMULATION/TOOLS/scm_corrmat.h b/openair1/SIMULATION/TOOLS/scm_corrmat.h index 5cc137b2eb..ff89b2f33e 100644 --- a/openair1/SIMULATION/TOOLS/scm_corrmat.h +++ b/openair1/SIMULATION/TOOLS/scm_corrmat.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + double R22_sqrt[6][32] = { {0.921700, -0.000000, 0.010380, -0.027448, -0.250153, 0.294754, 0.005961, 0.010769, 0.010380, 0.027448, 0.921700, 0.000000, -0.011595, -0.004130, -0.250153, 0.294754, -0.250153, -0.294754, -0.011595, 0.004130, 0.921700, 0.000000, 0.010380, -0.027448, 0.005961, -0.010769, -0.250153, -0.294754, 0.010380, 0.027448, 0.921700, 0.000000}, {0.923810, 0.000000, 0.004069, 0.027832, 0.151730, 0.350180, -0.009882, 0.006114, 0.004069, -0.027832, 0.923810, 0.000000, 0.011218, -0.003029, 0.151730, 0.350180, 0.151730, -0.350180, 0.011218, 0.003029, 0.923810, -0.000000, 0.004069, 0.027832, -0.009882, -0.006114, 0.151730, -0.350180, 0.004069, -0.027832, 0.923810, 0.000000}, diff --git a/openair1/SIMULATION/TOOLS/taus.c b/openair1/SIMULATION/TOOLS/taus.c index 7fc15781c7..326c743e69 100644 --- a/openair1/SIMULATION/TOOLS/taus.c +++ b/openair1/SIMULATION/TOOLS/taus.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifdef USER_MODE #include #include diff --git a/openair2/COMMON/as_message.h b/openair2/COMMON/as_message.h index bd20b1257c..c8cd92b060 100644 --- a/openair2/COMMON/as_message.h +++ b/openair2/COMMON/as_message.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source as_message.h diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h index 0e4948c618..cfd5d68e40 100644 --- a/openair2/COMMON/commonDef.h +++ b/openair2/COMMON/commonDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Source commonDef.h diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h index bd4f972965..4abbbf85b4 100644 --- a/openair2/COMMON/gtpv1_u_messages_def.h +++ b/openair2/COMMON/gtpv1_u_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + MESSAGE_DEF(GTPV1U_ENB_UPDATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_update_tunnel_req_t, Gtpv1uUpdateTunnelReq) MESSAGE_DEF(GTPV1U_ENB_UPDATE_TUNNEL_RESP, MESSAGE_PRIORITY_MED, gtpv1u_enb_update_tunnel_resp_t, Gtpv1uUpdateTunnelResp) MESSAGE_DEF(GTPV1U_ENB_DELETE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_delete_tunnel_req_t, Gtpv1uDeleteTunnelReq) diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h index 0f297949e0..c791b25cf7 100644 --- a/openair2/COMMON/gtpv1_u_messages_types.h +++ b/openair2/COMMON/gtpv1_u_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef GTPV1_U_MESSAGES_TYPES_H_ #define GTPV1_U_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/intertask_interface_conf.h b/openair2/COMMON/intertask_interface_conf.h index 4f5494b4dd..2d4bebdee8 100644 --- a/openair2/COMMON/intertask_interface_conf.h +++ b/openair2/COMMON/intertask_interface_conf.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * intertask_interface_conf.h * diff --git a/openair2/COMMON/mac_messages_def.h b/openair2/COMMON/mac_messages_def.h index e6d4db0fa8..0aa9a6f909 100644 --- a/openair2/COMMON/mac_messages_def.h +++ b/openair2/COMMON/mac_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * mac_messages_def.h * diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h index 83d6e28655..91c06b847a 100644 --- a/openair2/COMMON/mac_messages_types.h +++ b/openair2/COMMON/mac_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * mac_messages_types.h * diff --git a/openair2/COMMON/mac_primitives.h b/openair2/COMMON/mac_primitives.h index 9434eb02c9..aa6bbd6cae 100644 --- a/openair2/COMMON/mac_primitives.h +++ b/openair2/COMMON/mac_primitives.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __MAC_PRIMITIVES_H__ #define __MAC_PRIMITIVES_H__ diff --git a/openair2/COMMON/mac_rlc_primitives.h b/openair2/COMMON/mac_rlc_primitives.h index a2ede949eb..0033e24499 100644 --- a/openair2/COMMON/mac_rlc_primitives.h +++ b/openair2/COMMON/mac_rlc_primitives.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** mac_rlc_primitives.h - description ------------------- diff --git a/openair2/COMMON/mac_rrc_primitives.h b/openair2/COMMON/mac_rrc_primitives.h index 3891488e79..dfa641ee66 100644 --- a/openair2/COMMON/mac_rrc_primitives.h +++ b/openair2/COMMON/mac_rrc_primitives.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __MAC_RRC_PRIMITIVES_H__ # define __MAC_RRC_PRIMITIVES_H__ diff --git a/openair2/COMMON/messages_def.h b/openair2/COMMON/messages_def.h index 04d6a65fe6..fd3a4e9ea1 100644 --- a/openair2/COMMON/messages_def.h +++ b/openair2/COMMON/messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" #include "timer_messages_def.h" diff --git a/openair2/COMMON/messages_types.h b/openair2/COMMON/messages_types.h index fa14f2fa7c..a8bb0d8d7e 100644 --- a/openair2/COMMON/messages_types.h +++ b/openair2/COMMON/messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * messages_types.h * diff --git a/openair2/COMMON/nas_messages_def.h b/openair2/COMMON/nas_messages_def.h index 20ea454427..db766fe99c 100644 --- a/openair2/COMMON/nas_messages_def.h +++ b/openair2/COMMON/nas_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * nas_messages_def.h * diff --git a/openair2/COMMON/nas_messages_types.h b/openair2/COMMON/nas_messages_types.h index b9a26f69e7..6d43324196 100644 --- a/openair2/COMMON/nas_messages_types.h +++ b/openair2/COMMON/nas_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * nas_messages_types.h * diff --git a/openair2/COMMON/networkDef.h b/openair2/COMMON/networkDef.h index 7659076f51..c52a58a527 100644 --- a/openair2/COMMON/networkDef.h +++ b/openair2/COMMON/networkDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source networkDef.h diff --git a/openair2/COMMON/openair_defs.h b/openair2/COMMON/openair_defs.h index 40e296e181..58be0e58e9 100644 --- a/openair2/COMMON/openair_defs.h +++ b/openair2/COMMON/openair_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __openair_DEFS_H__ #define __openair_DEFS_H__ diff --git a/openair2/COMMON/openair_types.h b/openair2/COMMON/openair_types.h index 053a8427b2..0971d7648f 100644 --- a/openair2/COMMON/openair_types.h +++ b/openair2/COMMON/openair_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __openair_TYPES_H__ #define __openair_TYPES_H__ diff --git a/openair2/COMMON/pdcp_messages_def.h b/openair2/COMMON/pdcp_messages_def.h index 9c06d13359..9ac1e4e95a 100644 --- a/openair2/COMMON/pdcp_messages_def.h +++ b/openair2/COMMON/pdcp_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * pdcp_messages_def.h * diff --git a/openair2/COMMON/pdcp_messages_types.h b/openair2/COMMON/pdcp_messages_types.h index a926b36187..ca5af05b18 100644 --- a/openair2/COMMON/pdcp_messages_types.h +++ b/openair2/COMMON/pdcp_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * pdcp_messages_types.h * diff --git a/openair2/COMMON/phy_messages_def.h b/openair2/COMMON/phy_messages_def.h index ae7204f2a0..d0e2b83e3a 100644 --- a/openair2/COMMON/phy_messages_def.h +++ b/openair2/COMMON/phy_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * mphy_messages_def.h * diff --git a/openair2/COMMON/phy_messages_types.h b/openair2/COMMON/phy_messages_types.h index 808a5f3730..1742fac8d4 100644 --- a/openair2/COMMON/phy_messages_types.h +++ b/openair2/COMMON/phy_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * phy_messages_types.h * diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h index f4aeb18f95..6ad9ef078b 100644 --- a/openair2/COMMON/platform_constants.h +++ b/openair2/COMMON/platform_constants.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* platform_constants.h ------------------- diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h index 4086b7028a..327523f1d0 100644 --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* platform_types.h ------------------- diff --git a/openair2/COMMON/ral_messages_def.h b/openair2/COMMON/ral_messages_def.h index feb0ddd9d9..b10c645362 100644 --- a/openair2/COMMON/ral_messages_def.h +++ b/openair2/COMMON/ral_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + MESSAGE_DEF(RRC_RAL_SYSTEM_CONFIGURATION_IND, MESSAGE_PRIORITY_MED, rrc_ral_system_configuration_ind_t, rrc_ral_system_configuration_ind) MESSAGE_DEF(RRC_RAL_SYSTEM_INFORMATION_IND, MESSAGE_PRIORITY_MED, rrc_ral_system_information_ind_t, rrc_ral_system_information_ind) diff --git a/openair2/COMMON/ral_messages_types.h b/openair2/COMMON/ral_messages_types.h index 01e202546f..a9817a5550 100644 --- a/openair2/COMMON/ral_messages_types.h +++ b/openair2/COMMON/ral_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef RAL_MESSAGES_TYPES_H_ #define RAL_MESSAGES_TYPES_H_ #include "asn1_constants.h" diff --git a/openair2/COMMON/rlc_messages_def.h b/openair2/COMMON/rlc_messages_def.h index 93e3030807..36ec94a773 100644 --- a/openair2/COMMON/rlc_messages_def.h +++ b/openair2/COMMON/rlc_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * rlc_messages_def.h * diff --git a/openair2/COMMON/rlc_messages_types.h b/openair2/COMMON/rlc_messages_types.h index 9c32946a16..127b686cf7 100644 --- a/openair2/COMMON/rlc_messages_types.h +++ b/openair2/COMMON/rlc_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * rlc_messages_types.h * diff --git a/openair2/COMMON/rrc_messages_def.h b/openair2/COMMON/rrc_messages_def.h index 852736c4f8..18a7678436 100644 --- a/openair2/COMMON/rrc_messages_def.h +++ b/openair2/COMMON/rrc_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * rrc_messages_def.h * diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 826123d832..c2df8bab38 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * rrc_messages_types.h * diff --git a/openair2/COMMON/rrm_config_structs.h b/openair2/COMMON/rrm_config_structs.h index 9062a98f6c..73f5997932 100644 --- a/openair2/COMMON/rrm_config_structs.h +++ b/openair2/COMMON/rrm_config_structs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* rrm_config_structs.h ------------------- diff --git a/openair2/COMMON/rrm_constants.h b/openair2/COMMON/rrm_constants.h index 29b0d9d9ea..9fe3a28d9b 100644 --- a/openair2/COMMON/rrm_constants.h +++ b/openair2/COMMON/rrm_constants.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* rrm_constants.h ------------------- diff --git a/openair2/COMMON/rtos_header.h b/openair2/COMMON/rtos_header.h index f22c34e624..ed10ef4a10 100644 --- a/openair2/COMMON/rtos_header.h +++ b/openair2/COMMON/rtos_header.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RTOS_HEADER_H_ # define _RTOS_HEADER_H_ # if defined(RTAI) && !defined(USER_MODE) diff --git a/openair2/COMMON/s1ap_messages_def.h b/openair2/COMMON/s1ap_messages_def.h index a186de2c0b..10c70439d2 100644 --- a/openair2/COMMON/s1ap_messages_def.h +++ b/openair2/COMMON/s1ap_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Messages for S1AP logging */ MESSAGE_DEF(S1AP_UPLINK_NAS_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_uplink_nas_log) MESSAGE_DEF(S1AP_UE_CAPABILITY_IND_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_capability_ind_log) diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h index 712c8920aa..d6b793fd7c 100644 --- a/openair2/COMMON/s1ap_messages_types.h +++ b/openair2/COMMON/s1ap_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_MESSAGES_TYPES_H_ #define S1AP_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/sctp_messages_def.h b/openair2/COMMON/sctp_messages_def.h index c872a0fcfa..ffe13bae56 100644 --- a/openair2/COMMON/sctp_messages_def.h +++ b/openair2/COMMON/sctp_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + MESSAGE_DEF(SCTP_NEW_ASSOCIATION_REQ , MESSAGE_PRIORITY_MED, sctp_new_association_req_t , sctp_new_association_req) MESSAGE_DEF(SCTP_NEW_ASSOCIATION_RESP, MESSAGE_PRIORITY_MED, sctp_new_association_resp_t , sctp_new_association_resp) MESSAGE_DEF(SCTP_NEW_ASSOCIATION_IND , MESSAGE_PRIORITY_MED, sctp_new_association_ind_t , sctp_new_association_ind) diff --git a/openair2/COMMON/sctp_messages_types.h b/openair2/COMMON/sctp_messages_types.h index 7f01960d2e..57e0f37e71 100644 --- a/openair2/COMMON/sctp_messages_types.h +++ b/openair2/COMMON/sctp_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef SCTP_MESSAGES_TYPES_H_ #define SCTP_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/tasks_def.h b/openair2/COMMON/tasks_def.h index 53a531ff20..5fe555e117 100644 --- a/openair2/COMMON/tasks_def.h +++ b/openair2/COMMON/tasks_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MAX, 10) diff --git a/openair2/COMMON/udp_messages_def.h b/openair2/COMMON/udp_messages_def.h index 08e98b801e..41b5e8aa52 100644 --- a/openair2/COMMON/udp_messages_def.h +++ b/openair2/COMMON/udp_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + MESSAGE_DEF(UDP_INIT, MESSAGE_PRIORITY_MED, udp_init_t, udp_init) MESSAGE_DEF(UDP_DATA_REQ, MESSAGE_PRIORITY_MED, udp_data_req_t, udp_data_req) MESSAGE_DEF(UDP_DATA_IND, MESSAGE_PRIORITY_MED, udp_data_ind_t, udp_data_ind) diff --git a/openair2/COMMON/udp_messages_types.h b/openair2/COMMON/udp_messages_types.h index d609cb8d14..1ec878782a 100644 --- a/openair2/COMMON/udp_messages_types.h +++ b/openair2/COMMON/udp_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UDP_MESSAGES_TYPES_H_ #define UDP_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/x2ap_messages_def.h b/openair2/COMMON/x2ap_messages_def.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair2/COMMON/x2ap_messages_def.h +++ b/openair2/COMMON/x2ap_messages_def.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair2/COMMON/x2ap_messages_types.h +++ b/openair2/COMMON/x2ap_messages_types.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair2/DOCS/TEMPLATES/CODE/example_doxy.h b/openair2/DOCS/TEMPLATES/CODE/example_doxy.h index 62656eda1b..27691f46f1 100644 --- a/openair2/DOCS/TEMPLATES/CODE/example_doxy.h +++ b/openair2/DOCS/TEMPLATES/CODE/example_doxy.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file doxy_template.h * \brief explain how this block is organized, and how it works * \author Navid Nikaein diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 581f69274b..217f44fcf5 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* enb_app.c ------------------- diff --git a/openair2/ENB_APP/enb_app.h b/openair2/ENB_APP/enb_app.h index da276d870a..8e3c28760b 100644 --- a/openair2/ENB_APP/enb_app.h +++ b/openair2/ENB_APP/enb_app.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* enb_app.h ------------------- diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 4f14436297..f7f2c831fb 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* enb_config.c ------------------- diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 39524b4351..43f33d7673 100644 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* enb_config.h ------------------- diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index a50cb84b38..3fbcadafbb 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file config.c * \brief UE and eNB configuration performed by RRC or as a consequence of RRC procedures * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 02cb0a1579..d3daa92753 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file LAYER2/MAC/defs.h * \brief MAC data structures, constant, and function prototype * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index adaa461927..373bfd05cb 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file eNB_scheduler.c * \brief eNB scheduler top level function operates on per subframe basis * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index cacf41900e..d10dccc423 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file eNB_scheduler_RA.c * \brief primitives used for random access * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_bch.c b/openair2/LAYER2/MAC/eNB_scheduler_bch.c index 102b0c567f..312de660a4 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_bch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_bch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file eNB_scheduler_bch.c * \brief procedures related to eNB for the BCH transport channel * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 36a13e962a..b79bde2efe 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file eNB_scheduler_dlsch.c * \brief procedures related to eNB for the DLSCH transport channel * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index 53a1e8cc0e..383c18f736 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file eNB_scheduler_mch.c * \brief procedures related to eNB for the MCH transport channel * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index aac8d3573f..def972adb8 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file eNB_scheduler_primitives.c * \brief primitives used by eNB for BCH, RACH, ULSCH, DLSCH scheduling * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 89d861329b..c7501232cf 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file eNB_scheduler_ulsch.c * \brief eNB procedures for the ULSCH transport channel * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/extern.h b/openair2/LAYER2/MAC/extern.h index 7c5748d38f..8726cb1349 100644 --- a/openair2/LAYER2/MAC/extern.h +++ b/openair2/LAYER2/MAC/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file extern.h * \brief mac externs * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/l1_helpers.c b/openair2/LAYER2/MAC/l1_helpers.c index e923fc505d..e5dcd5add5 100644 --- a/openair2/LAYER2/MAC/l1_helpers.c +++ b/openair2/LAYER2/MAC/l1_helpers.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file l1_helper.c * \brief phy helper function * \author Navid Nikaein, Raymond Knopp diff --git a/openair2/LAYER2/MAC/lte_transport_init.c b/openair2/LAYER2/MAC/lte_transport_init.c index 8b104e4932..07aadc3715 100644 --- a/openair2/LAYER2/MAC/lte_transport_init.c +++ b/openair2/LAYER2/MAC/lte_transport_init.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define UL_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,24) #define BCCH_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,4) #define RA_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,4) diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index 7ae7483499..4fee906f74 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file main.c * \brief top init of Layer 2 * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/openair2_proc.c b/openair2/LAYER2/MAC/openair2_proc.c index 8d810b7fad..950713de5a 100644 --- a/openair2/LAYER2/MAC/openair2_proc.c +++ b/openair2/LAYER2/MAC/openair2_proc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* \file openair2_proc.c \brief MAC layer online statistics \author Navid Nikaein diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index c775b2630e..4aea92c3e2 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pre_processor.c * \brief eNB scheduler preprocessing fuction prior to scheduling * \author Navid Nikaein and Ankit Bhamri diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index d71bcfebe8..59d6c352fe 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file LAYER2/MAC/proto.h * \brief MAC functions prototypes for eNB and UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index 5374c0ee2f..ffc8df4792 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file ra_procedures.c * \brief Routines for UE MAC-layer Random-access procedures (36.321) V8.6 2009-03 * \author R. Knopp and Navid Nikaein diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c index fe70c6403b..a637ddf18c 100644 --- a/openair2/LAYER2/MAC/rar_tools.c +++ b/openair2/LAYER2/MAC/rar_tools.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rar_tools.c * \brief random access tools * \author Raymond Knopp and navid nikaein diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index b8d318448a..c91c977c3a 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file ue_procedures.c * \brief procedures related to UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/MAC/vars.h b/openair2/LAYER2/MAC/vars.h index bfc4c9d5b1..83d159f910 100644 --- a/openair2/LAYER2/MAC/vars.h +++ b/openair2/LAYER2/MAC/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file vars.h * \brief mac vars * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 9ffdaa792a..577a7ecc96 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp.c * \brief pdcp interface with RLC * \author Navid Nikaein and Lionel GAUTHIER diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index 8b39878ad5..5bff425abe 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file LAYER2/PDCP_v10.1.0/pdcp.h * \brief pdcp interface with RLC, RRC * \author Lionel GAUTHIER and Navid Nikaein diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c index 569a5cd09e..d584cb1e64 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** pdcp_control_primitives.c ------------------- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h index 1c510c83d2..b7930ab1e1 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** pdcp_control_primitives_proto_extern.h ------------------- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index 2d8f4c8bf7..8f5d0635f0 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_fifo.c * \brief pdcp interface with linux IP interface, have a look at http://man7.org/linux/man-pages/man7/netlink.7.html for netlink * \author Navid Nikaein and Lionel GAUTHIER diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c index 91eaaf3463..68cf6facde 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_netlink.c * \brief pdcp communication with linux IP interface, * have a look at http://man7.org/linux/man-pages/man7/netlink.7.html for netlink. diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c index d9efcb6ca3..6cef21c493 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_primitives.c * \brief PDCP PDU buffer dissector code * \author Baris Demiray diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h index 72a75bf64a..cc86a1cd6a 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file LAYER2/PDCP_v10.1.0/pdcp_primitives.h * \brief pdcp primitives * \author Baris Demiray and Navid Nikaein diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h index b09774466e..8bb383e615 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* pdcp_proto_extern.h ------------------- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c index 27b5194a24..030505d9ac 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_security.c * \brief PDCP Security Methods * \author ROUX Sebastie and Navid Nikaein diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c index fdaabd92e1..3eff6e335c 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_sequence_manager.c * \brief PDCP Sequence Numbering Methods * \author Baris Demiray and Navid Nikaein diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h index 61a1ed6424..3faa001575 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_sequence_manager.h * \brief PDCP Sequence Numbering Methods * \author Baris Demiray diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c index 7a1a3515b1..a4d6b7d112 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_thread.c * \brief * \author F. Kaltenberger diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c index 2c7b80b43a..fd339b6277 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_util.c * \brief PDCP Util Methods * \author Baris Demiray diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h index 4891659fbd..4934e0c635 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pdcp_util.h * \brief PDCP Util Methods * \author Baris Demiray diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c index fe7bd57686..2ff1a6c4b6 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h index 5976bad84b..5d038dfdbc 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am.h * \brief This file, and only this file must be included by code that interact with RLC AM layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h index 6ab11d8f23..dcc5f2de8f 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_constants.h * \brief This file defines constant values used in RLC AM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h index 4c597fa0c7..42114d4269 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_entity.h * \brief This file defines the RLC AM variables stored in a struct called rlc_am_entity_t. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c index c3042abe73..a767e94dc7 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** rlc_am_in_sdu.c - ------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h index 643eb17516..3201dfc941 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_in_sdu.h * \brief This file defines the prototypes of the utility functions manipulating the incoming SDU buffer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c index a5687f3b70..d1c3d68c52 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_INIT_C 1 #ifdef USER_MODE diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h index edfb8a7aed..52034b7c77 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_init.h * \brief This file defines the prototypes of the functions initializing a RLC AM protocol instance. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c index a5c4da5618..d13b89f1dc 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_REASSEMBLY_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h index d4172606bd..fece9ae570 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_reassembly.h * \brief This file defines the prototypes of the functions dealing with the reassembly of segments. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c index 09f5170779..4bdb3ca000 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_RECEIVER_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h index 8e01dac68f..fbc02474eb 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_receiver.h * \brief This file defines the prototypes of the functions dealing with the first stage of the receiving process. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c index f0e14b44ff..445014c62c 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_RETRANSMIT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h index 5af677b559..99570e5d7f 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_retransmit.h * \brief This file defines the prototypes of the functions dealing with the retransmission. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c index 7669b71f1f..3c983805c7 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_RX_LIST_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h index 026fca8603..c75255c4fa 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_rx_list.h * \brief This file defines the prototypes of the functions dealing with a RX list data structure supporting re-segmentation. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c index 701626f741..f2a12112c4 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_SEGMENT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h index 5bb5b41a83..6b67758b80 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_segment.h * \brief This file defines the prototypes of the functions dealing with the segmentation of PDCP SDUs. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c index f657064a4f..37e9b13508 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_SEGMENT_HOLES_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h index 569338f0e6..902bc59306 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_segments_holes.h * \brief This file defines the prototypes of the functions dealing with the re-segmentation of RLC PDUs stored in the retransmission buffer,. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c index bcfdc9b057..efbd29350c 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_STATUS_REPORT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h index bac6a7672c..31afd6ae4b 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_status_report.h * \brief This file defines the prototypes of the functions dealing with the reading/writting of informations from/in RLC AM control PDUs, and the processing of received control PDUs. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h index 40fe9a3885..02112fe736 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_structs.h * \brief This file defines structures used inside the RLC AM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c index e648c64fc3..100802e28c 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_TEST_C 1 #define RLC_C 1 diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h index a1509ff676..6064f777cb 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_test.h * \brief This file defines the prototypes of RLC AM test functions. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c index 311db2c038..aa3fdb909a 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_POLL_RETRANSMIT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h index 058c7841cd..1df0be62d9 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_timer_poll_retransmit.h * \brief This file defines the prototypes of the functions manipulating the t-PollRetransmit timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c index 958cb5d2b5..3bbc2e87ac 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_POLL_REORDERING_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h index d0fca45354..dcf27a1977 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_timer_reordering.h * \brief This file defines the prototypes of the functions manipulating the t-Reordering timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c index 0c92e6ca78..b41fa1c17f 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_STATUS_PROHIBIT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h index 4d469e9e0b..e6445b6d15 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_timer_status_prohibit.h * \brief This file defines the prototypes of the functions manipulating the t-StatusProhibit timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c index 00d02440d8..2c181b5d6c 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_AM_MODULE 1 #define RLC_AM_WINDOWS_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h index 3c3f3dddef..8274de2428 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_am_windows.h * \brief This file defines the prototypes of the functions testing window, based on SN modulo and rx and tx protocol state variables. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c index 08013e592c..d854e435e1 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_TM_MODULE 1 #define RLC_TM_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h index 06444a0f9b..3c74470eba 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_tm.h * \brief This file, and only this file must be included by code that interact with RLC TM layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h index 09a3925bda..9c4e06efbc 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_tm_entity.h * \brief This file defines the RLC TM variables stored in a struct called rlc_tm_entity_t. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c index 20a444cf28..90fc084e84 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_TM_MODULE 1 #define RLC_TM_INIT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h index 484937ee6f..f577db47d7 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_tm_init.h * \brief This file defines the prototypes of the functions dealing with the control primitives and initialization. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h index 32bc7f5943..597fe0f04a 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_tm_structs.h * \brief This file defines structures used inside the RLC TM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c index 4da33f0da0..3232399d10 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE 1 #define RLC_UM_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h index 97345fb417..d87f1e29d0 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um.h * \brief This file, and only this file must be included by code that interact with RLC UM layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h index f0da01072e..2d0a875edb 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_constants.h * \brief This file defines constant values used inside RLC UM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c index 08a4da571b..688c8f646d 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE 1 #define RLC_UM_CONTROL_PRIMITIVES_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h index ce4333e4f9..97af1cfafa 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_control_primitives.h * \brief This file defines the prototypes of the functions dealing with the control primitives and initialization. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c index 67d7875c14..fb83446e63 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE 1 #define RLC_UM_DAR_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h index cb8f4bad0a..10816a372a 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_dar.h * \brief This file defines the prototypes of the functions dealing with the reassembly buffer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h index 32fca56346..f4bfef2b14 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_entity.h * \brief This file defines the RLC UM variables stored in a struct called rlc_um_entity_t. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c index 8fe95878f3..c66df33872 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE 1 #define RLC_UM_FSM_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h index e15b6be27b..28fec3567a 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_fsm.h * \brief This file defines the prototypes of the functions dealing with the finite state machine of the RLC UM protocol instance. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c index c4096736d1..f8c6fdeabe 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE 1 #define RLC_UM_REASSEMBLY_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h index 385f9475eb..d199409c57 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_reassembly.h * \brief This file defines the prototypes of the functions dealing with the reassembly of segments. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c index 14ca2101d6..585ceacb9b 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE 1 #define RLC_UM_RECEIVER_C 1 #include "platform_types.h" diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h index f7158b90b3..882a29de7e 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_receiver.h * \brief This file defines the prototypes of the functions dealing with the first stage of the receiving process. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c index fccac92a2e..5ce681723e 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE 1 #define RLC_UM_SEGMENT_C 1 //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h index 2f2abee9f1..7f3d8d7e92 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_segment.h * \brief This file defines the prototypes of the functions dealing with the segmentation of PDCP SDUs. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h index f459512e76..232450c5ac 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_structs.h * \brief This file defines structures used inside the RLC UM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c index 2ee9c2281e..c01e709b41 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE #define RLC_C #define RLC_UM_TEST_C diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h index e63113bc3c..71030b639d 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + # ifndef __RLC_UM_TEST_H__ # define __RLC_UM_TEST_H__ # ifdef RLC_UM_TEST_C diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c index ec47898056..ef6ca75be9 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define RLC_UM_MODULE #define RLC_UM_VERY_SIMPLE_TEST_C #include diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h index 623b2cfa7f..34cd0fea12 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_um_very_simple_test.h * \brief This file defines the prototypes of the functions dealing with the sending of self generated packet for very basic test or debug of RLC or lower layers. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/mac_primitives.h b/openair2/LAYER2/RLC/mac_primitives.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair2/LAYER2/RLC/mac_primitives.h +++ b/openair2/LAYER2/RLC/mac_primitives.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index c075317cb5..3fe5c6cb41 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* rlc.c ------------------- diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h index a3a9e3a8f5..ec5ee629b1 100644 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc.h * \brief This file, and only this file must be included by external code that interact with RLC layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_def.h b/openair2/LAYER2/RLC/rlc_def.h index a9cec1f72e..124ba509b5 100644 --- a/openair2/LAYER2/RLC/rlc_def.h +++ b/openair2/LAYER2/RLC/rlc_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_def.h * \brief This file contains constants for RLC internal use. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_def_lte.h b/openair2/LAYER2/RLC/rlc_def_lte.h index 935fcb3ead..20a60c5d93 100644 --- a/openair2/LAYER2/RLC/rlc_def_lte.h +++ b/openair2/LAYER2/RLC/rlc_def_lte.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_def_lte.h * \brief This file contains LTE constants for RLC internal use. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_mac.c b/openair2/LAYER2/RLC/rlc_mac.c index d0c3596dbb..cb7357b5e7 100644 --- a/openair2/LAYER2/RLC/rlc_mac.c +++ b/openair2/LAYER2/RLC/rlc_mac.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* rlc_mac.c ------------------- diff --git a/openair2/LAYER2/RLC/rlc_mpls.c b/openair2/LAYER2/RLC/rlc_mpls.c index 9f5c6b0e23..e508c3193f 100644 --- a/openair2/LAYER2/RLC/rlc_mpls.c +++ b/openair2/LAYER2/RLC/rlc_mpls.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* rlc_mpls.c ------------------- diff --git a/openair2/LAYER2/RLC/rlc_primitives.h b/openair2/LAYER2/RLC/rlc_primitives.h index ba111fc224..611c48ee4c 100644 --- a/openair2/LAYER2/RLC/rlc_primitives.h +++ b/openair2/LAYER2/RLC/rlc_primitives.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rlc_primitives.h * \brief This file contains constants definition for RLC primitives. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index 2c6183d04d..f2749d3b2d 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* rlc_rrc.c ------------------- diff --git a/openair2/LAYER2/layer2_top.c b/openair2/LAYER2/layer2_top.c index 38dbc16444..2837e25d7b 100644 --- a/openair2/LAYER2/layer2_top.c +++ b/openair2/LAYER2/layer2_top.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*________________________openair_w3g4free_top.c________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/LAYER2/openair2_proc.c b/openair2/LAYER2/openair2_proc.c index 3db3fcc7bf..702ddde45b 100644 --- a/openair2/LAYER2/openair2_proc.c +++ b/openair2/LAYER2/openair2_proc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /****************************************************************************** \file openair2_proc # \brief print openair2 overall statistics diff --git a/openair2/LAYER2/register.c b/openair2/LAYER2/register.c index 3ae1cba520..400020b8a5 100644 --- a/openair2/LAYER2/register.c +++ b/openair2/LAYER2/register.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*________________________rrc_register.c________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/LAYER2/register.h b/openair2/LAYER2/register.h index 783e63a16e..e65aa92361 100644 --- a/openair2/LAYER2/register.h +++ b/openair2/LAYER2/register.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*________________________rrc_register.h________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c index 5b6578f739..a15b4bf6af 100644 --- a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c +++ b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "nascell_ioctl.h" #include "rrc_nas_primitives.h" //#include "rrc_qos.h" diff --git a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h index cf9f258eb8..ee4efd8c75 100644 --- a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h +++ b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _IOCTL_H #define _IOCTL_H diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c index a83798eeed..8f34e93565 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_ascontrol.c * \brief Access Stratum Control functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c index d073638f32..689b515843 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_classifier.c * \brief Flow classification functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c index f8161a858c..4782f13488 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_common.c * \brief Common functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h index 3d312e32d3..0e77b3e44c 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_constant.h * \brief Defines all constants for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c index 28820e1118..7a8bd0f867 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_device.c * \brief Networking Device Driver for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c index 719b6b1c2f..14d598abb7 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_iocontrol.c * \brief I/O control functions for upper layers of driver for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h index 212ee894ce..924f442341 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_iocontrol.h * \brief I/O control constnats and structures for upper layers of driver for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c index 39b5047f94..13c50570b4 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_netlink.c * \brief Netlink socket functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h index 7468f66d12..ec7f7ec2cc 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_proto.h * \brief Function prototypes for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h index b8fa1608f4..83874b375d 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_sap.h * \brief SAP constants for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c old mode 100755 new mode 100644 index 4fdc64cd59..c4e8ed284c --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** nasmt_tool.c - description *************************************************************************** diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h index f543fb54f8..130488bca6 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_variables.h * \brief Variable and structure definitions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c index 2889c5b2e1..1864406ce0 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_ascontrol.c * \brief Access Stratum Control functions for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c index a5df919fa6..1883b17eb0 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_classifier.c * \brief Flow classification functions for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c index ff105ca829..e2819d075e 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_common.c * \brief Common functions for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h index f6b6b143b4..b346816e8f 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_constant.h * \brief Defines all constants for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c index f5946c3e6b..aaaa95754d 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_device.c * \brief Networking Device Driver for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c index e21b9268ad..86576500b7 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_iocontrol.c * \brief I/O control functions for upper layers of driver for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h index a1b24124cc..2104c6cac1 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_iocontrol.h * \brief I/O control constnats and structures for upper layers of driver for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c index 3dbbab6cd3..9cccb7c226 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_netlink.c * \brief Netlink socket functions for OpenAirInterface CELLULAR version - MT * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h index 98f0379443..74eb226b05 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_proto.h * \brief Function prototypes for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h index 9ecaeb17f8..84f508cbc3 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasmt_sap.h * \brief SAP constants for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c index d62d5ed2e6..4891f5447f 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "nasrg_variables.h" #include "nasrg_proto.h" diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h index 573ed0b904..a8677452bc 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h +++ b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nasrg_variables.h * \brief Variable and structure definitions for OpenAirInterface CELLULAR version - RG * \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier diff --git a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c index 1a3bbef8d5..9f33bf6ce0 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c +++ b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //----------------------------------------------------------------------------- // For FIFOS / NETLINK interface #include diff --git a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/nettestPDCP.c b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/nettestPDCP.c index bccfa9552a..172110fa9b 100644 --- a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/nettestPDCP.c +++ b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/nettestPDCP.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h b/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h index 95eb588ef1..ef728f1b14 100644 --- a/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h +++ b/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __NAS_CONTROL_H__ #define __NAS_CONTROL_H__ diff --git a/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c b/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c index dbff4b58f0..37fbcb7756 100644 --- a/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c +++ b/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c b/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c index b323798b6b..08a1940388 100644 --- a/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c +++ b/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/NAS/nas_ue_task.h b/openair2/NAS/nas_ue_task.h index 65dcf6781b..bc58072681 100644 --- a/openair2/NAS/nas_ue_task.h +++ b/openair2/NAS/nas_ue_task.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef NAS_UE_TASK_H_ #define NAS_UE_TASK_H_ diff --git a/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c b/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c index 2938ebbb8e..edf29dbee0 100644 --- a/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c +++ b/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** rb_tool.c - User-space utility for driving NASMESH IOCTL interface ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/classifier.c b/openair2/NETWORK_DRIVER/LITE/classifier.c index fe2519f712..18dba87253 100644 --- a/openair2/NETWORK_DRIVER/LITE/classifier.c +++ b/openair2/NETWORK_DRIVER/LITE/classifier.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file classifier.c * \brief Classify IP packets * \author Navid Nikaein, Lionel GAUTHIER, Raymond knopp diff --git a/openair2/NETWORK_DRIVER/LITE/common.c b/openair2/NETWORK_DRIVER/LITE/common.c index 165a2b7279..9749429201 100644 --- a/openair2/NETWORK_DRIVER/LITE/common.c +++ b/openair2/NETWORK_DRIVER/LITE/common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file common.c * \brief implementation of emultor tx and rx * \author Navid Nikaein, Lionel GAUTHIER, and Raymomd Knopp diff --git a/openair2/NETWORK_DRIVER/LITE/constant.h b/openair2/NETWORK_DRIVER/LITE/constant.h index 5b4694d1e0..1d8821dfdd 100644 --- a/openair2/NETWORK_DRIVER/LITE/constant.h +++ b/openair2/NETWORK_DRIVER/LITE/constant.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _OAI_NW_DRV_CST #define _OAI_NW_DRV_CST diff --git a/openair2/NETWORK_DRIVER/LITE/device.c b/openair2/NETWORK_DRIVER/LITE/device.c index aad7b2fc08..9579ebf249 100644 --- a/openair2/NETWORK_DRIVER/LITE/device.c +++ b/openair2/NETWORK_DRIVER/LITE/device.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file device.c * \brief Networking Device Driver for OpenAirInterface Ethernet * \author navid.nikaein, Lionel Gauthier, raymond.knopp, diff --git a/openair2/NETWORK_DRIVER/LITE/ioctl.c b/openair2/NETWORK_DRIVER/LITE/ioctl.c index 01486b1d72..06309403d1 100644 --- a/openair2/NETWORK_DRIVER/LITE/ioctl.c +++ b/openair2/NETWORK_DRIVER/LITE/ioctl.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "local.h" #include "ioctl.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/LITE/ioctl.h b/openair2/NETWORK_DRIVER/LITE/ioctl.h index d21bc5ad64..dcd26543de 100644 --- a/openair2/NETWORK_DRIVER/LITE/ioctl.h +++ b/openair2/NETWORK_DRIVER/LITE/ioctl.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** ioctl.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/local.h b/openair2/NETWORK_DRIVER/LITE/local.h index b11fb61dac..f1d2a7bb3d 100644 --- a/openair2/NETWORK_DRIVER/LITE/local.h +++ b/openair2/NETWORK_DRIVER/LITE/local.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** local.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/netlink.c b/openair2/NETWORK_DRIVER/LITE/netlink.c index 8c28dda586..b54ec4a987 100644 --- a/openair2/NETWORK_DRIVER/LITE/netlink.c +++ b/openair2/NETWORK_DRIVER/LITE/netlink.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file netlink.c * \brief establish a netlink * \author Navid Nikaein, Lionel Gauthier, and Raymond knopp diff --git a/openair2/NETWORK_DRIVER/LITE/proto_extern.h b/openair2/NETWORK_DRIVER/LITE/proto_extern.h index e13264bbab..57aa601a61 100644 --- a/openair2/NETWORK_DRIVER/LITE/proto_extern.h +++ b/openair2/NETWORK_DRIVER/LITE/proto_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** proto_extern.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/sap.h b/openair2/NETWORK_DRIVER/LITE/sap.h index fe4abed3b7..1fff9744af 100644 --- a/openair2/NETWORK_DRIVER/LITE/sap.h +++ b/openair2/NETWORK_DRIVER/LITE/sap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef OAI_SAP_H #define OAI_SAP_H typedef unsigned short OaiNwDrvRadioBearerId_t; diff --git a/openair2/NETWORK_DRIVER/LITE/tool.c b/openair2/NETWORK_DRIVER/LITE/tool.c index d0957297b8..089259458d 100644 --- a/openair2/NETWORK_DRIVER/LITE/tool.c +++ b/openair2/NETWORK_DRIVER/LITE/tool.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "local.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c b/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c index b3a73ee8fc..5222a4a4b8 100644 --- a/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c +++ b/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** rb_tool.c - User-space utility for driving NASMESH IOCTL interface ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c b/openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c index bccfa9552a..172110fa9b 100644 --- a/openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c +++ b/openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/NETWORK_DRIVER/MESH/classifier.c b/openair2/NETWORK_DRIVER/MESH/classifier.c index 2c3abaed0d..a982faac46 100644 --- a/openair2/NETWORK_DRIVER/MESH/classifier.c +++ b/openair2/NETWORK_DRIVER/MESH/classifier.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file classifier.c * \brief Classify IP packets * \author Navid Nikaein, Lionel GAUTHIER, Raymond knopp diff --git a/openair2/NETWORK_DRIVER/MESH/common.c b/openair2/NETWORK_DRIVER/MESH/common.c index 5aca469753..0a4e3ddfed 100644 --- a/openair2/NETWORK_DRIVER/MESH/common.c +++ b/openair2/NETWORK_DRIVER/MESH/common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file common.c * \brief implementation of emultor tx and rx * \author Navid Nikaein, Lionel GAUTHIER, and Raymomd Knopp diff --git a/openair2/NETWORK_DRIVER/MESH/constant.h b/openair2/NETWORK_DRIVER/MESH/constant.h index aa4c6e4479..fed132c61e 100644 --- a/openair2/NETWORK_DRIVER/MESH/constant.h +++ b/openair2/NETWORK_DRIVER/MESH/constant.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _NAS_CST #define _NAS_CST diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c index c783e1a77d..f28b41fc68 100644 --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file device.c * \brief Networking Device Driver for OpenAirInterface MESH * \author navid.nikaein, yan.moret(no longer valid), michelle.wetterwald, raymond.knopp diff --git a/openair2/NETWORK_DRIVER/MESH/ioctl.c b/openair2/NETWORK_DRIVER/MESH/ioctl.c index 5b112c5000..7d4bb10b1f 100644 --- a/openair2/NETWORK_DRIVER/MESH/ioctl.c +++ b/openair2/NETWORK_DRIVER/MESH/ioctl.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "local.h" #include "ioctl.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/MESH/ioctl.h b/openair2/NETWORK_DRIVER/MESH/ioctl.h index b776fcf3cf..9273d18651 100644 --- a/openair2/NETWORK_DRIVER/MESH/ioctl.h +++ b/openair2/NETWORK_DRIVER/MESH/ioctl.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef NAS_CTL_H #define NAS_CTL_H diff --git a/openair2/NETWORK_DRIVER/MESH/local.h b/openair2/NETWORK_DRIVER/MESH/local.h index 13fd2603fc..8db2b550b0 100644 --- a/openair2/NETWORK_DRIVER/MESH/local.h +++ b/openair2/NETWORK_DRIVER/MESH/local.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** local.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/mesh.c b/openair2/NETWORK_DRIVER/MESH/mesh.c index 963699b2c6..e934a6eb95 100644 --- a/openair2/NETWORK_DRIVER/MESH/mesh.c +++ b/openair2/NETWORK_DRIVER/MESH/mesh.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** nas_mesh.c - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/netlink.c b/openair2/NETWORK_DRIVER/MESH/netlink.c index 93169fd0a9..3ce6cf6ebe 100644 --- a/openair2/NETWORK_DRIVER/MESH/netlink.c +++ b/openair2/NETWORK_DRIVER/MESH/netlink.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file netlink.c * \brief establish a netlink * \author Navid Nikaein, Lionel Gauthier, and Raymond knopp diff --git a/openair2/NETWORK_DRIVER/MESH/proto_extern.h b/openair2/NETWORK_DRIVER/MESH/proto_extern.h index 72b8d08f71..4c0b89f60f 100644 --- a/openair2/NETWORK_DRIVER/MESH/proto_extern.h +++ b/openair2/NETWORK_DRIVER/MESH/proto_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** nas_proto_extern.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h b/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h index ba288a32cd..cb4c00dcb9 100644 --- a/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h +++ b/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /********************************************************************* rrc_nas_primitives.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/sap.h b/openair2/NETWORK_DRIVER/MESH/sap.h index 528d8b1028..eb85437999 100644 --- a/openair2/NETWORK_DRIVER/MESH/sap.h +++ b/openair2/NETWORK_DRIVER/MESH/sap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** graal_sap.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/tool.c b/openair2/NETWORK_DRIVER/MESH/tool.c index 132da70b78..872a2583ce 100644 --- a/openair2/NETWORK_DRIVER/MESH/tool.c +++ b/openair2/NETWORK_DRIVER/MESH/tool.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "local.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/UE_IP/common.c b/openair2/NETWORK_DRIVER/UE_IP/common.c index 9f85cb7043..6bef269de8 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/common.c +++ b/openair2/NETWORK_DRIVER/UE_IP/common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file common.c * \brief * \author Navid Nikaein and Raymond Knopp, Lionel GAUTHIER diff --git a/openair2/NETWORK_DRIVER/UE_IP/constant.h b/openair2/NETWORK_DRIVER/UE_IP/constant.h index 9c817ecdc0..9b4017773b 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/constant.h +++ b/openair2/NETWORK_DRIVER/UE_IP/constant.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _UE_IP_CST #define _UE_IP_CST diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c index ce0fc2c2f3..cfd7342862 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file device.c * \brief Networking Device Driver for OpenAirInterface * \author navid nikaein, Lionel Gauthier, raymond knopp diff --git a/openair2/NETWORK_DRIVER/UE_IP/local.h b/openair2/NETWORK_DRIVER/UE_IP/local.h index 46725aecad..3c9c4c4295 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/local.h +++ b/openair2/NETWORK_DRIVER/UE_IP/local.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** local.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/UE_IP/netlink.c b/openair2/NETWORK_DRIVER/UE_IP/netlink.c index 08c2d98da5..8ecd989f4d 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/netlink.c +++ b/openair2/NETWORK_DRIVER/UE_IP/netlink.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file netlink.c * \brief establish a netlink * \author Navid Nikaein, Lionel Gauthier, Raymond knopp diff --git a/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h b/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h index e749362fc5..459fbc0837 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h +++ b/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** proto_extern.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/UE_IP/sap.h b/openair2/NETWORK_DRIVER/UE_IP/sap.h index d755f0bd1f..cfe4bf81b8 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/sap.h +++ b/openair2/NETWORK_DRIVER/UE_IP/sap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UE_IP_SAP_H #define UE_IP_SAP_H typedef unsigned short OaiNwDrvRadioBearerId_t; diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h index 441bb6ce82..0892b4d0b1 100644 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file PHY_INTERFACE/defs.h * \brief mac phy interface primitives * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/PHY_INTERFACE/extern.h b/openair2/PHY_INTERFACE/extern.h index e75a36bc8b..f75d716b63 100644 --- a/openair2/PHY_INTERFACE/extern.h +++ b/openair2/PHY_INTERFACE/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __PHY_INTERFACE_EXTERN_H__ #define __PHY_INTERFACE_EXTERN_H__ diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.c b/openair2/PHY_INTERFACE/mac_phy_primitives.c index ced666c501..d9693e3d5e 100644 --- a/openair2/PHY_INTERFACE/mac_phy_primitives.c +++ b/openair2/PHY_INTERFACE/mac_phy_primitives.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*________________________mac_phy_primitives.c________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.h b/openair2/PHY_INTERFACE/mac_phy_primitives.h index 9b79723d82..02ff1fceac 100644 --- a/openair2/PHY_INTERFACE/mac_phy_primitives.h +++ b/openair2/PHY_INTERFACE/mac_phy_primitives.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*________________________mac_phy_primitives.h________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/PHY_INTERFACE/vars.h b/openair2/PHY_INTERFACE/vars.h index 6c30acca8c..810d073a23 100644 --- a/openair2/PHY_INTERFACE/vars.h +++ b/openair2/PHY_INTERFACE/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __PHY_INTERFACE_VARS_H__ #define __PHY_INTERFACE_VARS_H__ diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c index 694cc9c480..222b9f7b41 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file l2_interface.c * \brief layer 2 interface * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h index a4030950fd..c2325f99bd 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file l2_interface.c * \brief layer 2 interface * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index f0f9683b50..fa5a4d6409 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file l2_interface.c * \brief layer 2 interface, used to support different RRC sublayer * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index fd2f602016..51136dee19 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file asn1_msg.c * \brief primitives to build the asn1 messages * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.h b/openair2/RRC/LITE/MESSAGES/asn1_msg.h index a38f044f65..661914ea6e 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.h +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file asn1_msg.h * \brief primitives to build the asn1 messages * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/LITE/MESSAGES/rtai_mem.c b/openair2/RRC/LITE/MESSAGES/rtai_mem.c index b54817eafa..0319baafc3 100644 --- a/openair2/RRC/LITE/MESSAGES/rtai_mem.c +++ b/openair2/RRC/LITE/MESSAGES/rtai_mem.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rtai_mem.c * \brief a wrapper for Unified RTAI real-time memory management. * \author Florian Kaltenberger diff --git a/openair2/RRC/LITE/MESSAGES/rtai_mem.h b/openair2/RRC/LITE/MESSAGES/rtai_mem.h index 97a5f1e10b..19ed4c1a69 100644 --- a/openair2/RRC/LITE/MESSAGES/rtai_mem.h +++ b/openair2/RRC/LITE/MESSAGES/rtai_mem.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rtai_mem.h * \brief a wrapper for Unified RTAI real-time memory management. * \author Florian Kaltenberger diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 5f4e548d04..f99b07e893 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file RRC/LITE/defs.h * \brief RRC struct definitions and function prototypes * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/extern.h b/openair2/RRC/LITE/extern.h index e7bdcdd1ad..d4c8192a95 100644 --- a/openair2/RRC/LITE/extern.h +++ b/openair2/RRC/LITE/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file vars.h * \brief rrc external vars * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/mesh_top.c b/openair2/RRC/LITE/mesh_top.c index 7fd0edaf12..448d15bfae 100644 --- a/openair2/RRC/LITE/mesh_top.c +++ b/openair2/RRC/LITE/mesh_top.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*________________________openair_rrc_top.c________________________ Authors : Hicham Anouar diff --git a/openair2/RRC/LITE/plmn_data.h b/openair2/RRC/LITE/plmn_data.h index 9158f69747..3994a851fb 100644 --- a/openair2/RRC/LITE/plmn_data.h +++ b/openair2/RRC/LITE/plmn_data.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + typedef struct { int mcc; int mnc; diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index c19408fa5f..cd277c9472 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file proto.h * \brief RRC functions prototypes for eNB and UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrc_2_rrm_msg.c b/openair2/RRC/LITE/rrc_2_rrm_msg.c index fae9b11ed3..9a5c14f91e 100644 --- a/openair2/RRC/LITE/rrc_2_rrm_msg.c +++ b/openair2/RRC/LITE/rrc_2_rrm_msg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index e8c3c5824c..da40abe4a0 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_UE.c * \brief rrc procedures for UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrc_UE_ral.c b/openair2/RRC/LITE/rrc_UE_ral.c index 7ef010aa68..be327551db 100644 --- a/openair2/RRC/LITE/rrc_UE_ral.c +++ b/openair2/RRC/LITE/rrc_UE_ral.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_UE_ral.c * \brief rrc procedures for handling RAL messages * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_UE_ral.h b/openair2/RRC/LITE/rrc_UE_ral.h index 8d40da2055..d403ba112b 100644 --- a/openair2/RRC/LITE/rrc_UE_ral.h +++ b/openair2/RRC/LITE/rrc_UE_ral.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_UE_ral.h * \brief rrc procedures for handling RAL messages * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index 90efdc1f86..67ee4053d0 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_common.c * \brief rrc common procedures for eNB and UE * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrc_config.c b/openair2/RRC/LITE/rrc_config.c index 1648354bab..518c011848 100644 --- a/openair2/RRC/LITE/rrc_config.c +++ b/openair2/RRC/LITE/rrc_config.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_config.c * \brief rrc cinfiguration * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 799389ed95..f14527adbb 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB.c * \brief rrc procedures for eNB * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c index 2cf8015df5..8b1110475f 100644 --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB_GTPV1U.c * \brief rrc GTPV1U procedures for eNB * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.h b/openair2/RRC/LITE/rrc_eNB_GTPV1U.h index 80bb42014b..b0c713d6ef 100644 --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.h +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB_GTPV1U.h * \brief rrc GTPV1U procedures for eNB * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 83da626936..7e7a4845b2 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB_S1AP.c * \brief rrc S1AP procedures for eNB * \author Navid Nikaein, Laurent Winckel, Sebastien ROUX, and Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.h b/openair2/RRC/LITE/rrc_eNB_S1AP.h index d39366f4d3..ee914b9b85 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.h +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB_S1AP.h * \brief rrc S1AP procedures for eNB * \author Laurent Winckel and Sebastien ROUX and Navid Nikaein and Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_UE_context.c b/openair2/RRC/LITE/rrc_eNB_UE_context.c index 37418feff1..c0243ca6bf 100644 --- a/openair2/RRC/LITE/rrc_eNB_UE_context.c +++ b/openair2/RRC/LITE/rrc_eNB_UE_context.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB_UE_context.h * \brief rrc procedures for UE context * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_UE_context.h b/openair2/RRC/LITE/rrc_eNB_UE_context.h index 972005d44a..808628f67c 100644 --- a/openair2/RRC/LITE/rrc_eNB_UE_context.h +++ b/openair2/RRC/LITE/rrc_eNB_UE_context.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB_UE_context.h * \brief rrc procedures for UE context * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_ral.c b/openair2/RRC/LITE/rrc_eNB_ral.c index 38b4afd18d..32160d8c42 100644 --- a/openair2/RRC/LITE/rrc_eNB_ral.c +++ b/openair2/RRC/LITE/rrc_eNB_ral.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB_ral.c * \brief rrc procedures for handling RAL messages * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_eNB_ral.h b/openair2/RRC/LITE/rrc_eNB_ral.h index 27d74aee9a..8501758ba3 100644 --- a/openair2/RRC/LITE/rrc_eNB_ral.h +++ b/openair2/RRC/LITE/rrc_eNB_ral.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_eNB_ral.h * \brief rrc procedures for handling RAL messages * \author Lionel GAUTHIER diff --git a/openair2/RRC/LITE/rrc_rrm_interface.c b/openair2/RRC/LITE/rrc_rrm_interface.c index 643f630c87..79d0c5eee8 100644 --- a/openair2/RRC/LITE/rrc_rrm_interface.c +++ b/openair2/RRC/LITE/rrc_rrm_interface.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/rrc_rrm_interface.h b/openair2/RRC/LITE/rrc_rrm_interface.h index cf4080c5a6..6a566f150d 100644 --- a/openair2/RRC/LITE/rrc_rrm_interface.h +++ b/openair2/RRC/LITE/rrc_rrm_interface.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/rrc_types.h b/openair2/RRC/LITE/rrc_types.h index 7aa6f9ba1b..64d143a278 100644 --- a/openair2/RRC/LITE/rrc_types.h +++ b/openair2/RRC/LITE/rrc_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrc_types.h * \brief rrc types and subtypes * \author Navid Nikaein and Raymond Knopp diff --git a/openair2/RRC/LITE/rrm_2_rrc_msg.c b/openair2/RRC/LITE/rrm_2_rrc_msg.c index 025e78ec0e..738f2a70f6 100644 --- a/openair2/RRC/LITE/rrm_2_rrc_msg.c +++ b/openair2/RRC/LITE/rrm_2_rrc_msg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/utils.c b/openair2/RRC/LITE/utils.c index 1a2ad0d712..832a61979a 100644 --- a/openair2/RRC/LITE/utils.c +++ b/openair2/RRC/LITE/utils.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*________________________openair_rrc_utils.c________________________ Authors : Hicham Anouar diff --git a/openair2/RRC/LITE/vars.h b/openair2/RRC/LITE/vars.h index 1dd532a4b2..5431504738 100644 --- a/openair2/RRC/LITE/vars.h +++ b/openair2/RRC/LITE/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file vars.hles * \brief rrc variables * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/NAS/nas_config.c b/openair2/RRC/NAS/nas_config.c index 516525fe01..07d65312e5 100644 --- a/openair2/RRC/NAS/nas_config.c +++ b/openair2/RRC/NAS/nas_config.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nas_config.c * \brief Configures the nasmesh interface * \author Daniel Camara and Navid Nikaein diff --git a/openair2/RRC/NAS/nas_config.h b/openair2/RRC/NAS/nas_config.h index fd783e0674..2276638581 100644 --- a/openair2/RRC/NAS/nas_config.h +++ b/openair2/RRC/NAS/nas_config.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file nas_config.h * \brief Configures the nasmesh interface * \author Daniel Camara and navid nikaein diff --git a/openair2/RRC/NAS/rb_config.c b/openair2/RRC/NAS/rb_config.c index ed04b47713..da80ea108d 100644 --- a/openair2/RRC/NAS/rb_config.c +++ b/openair2/RRC/NAS/rb_config.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rb_config.c * \brief User-space utility for configuring NASMESH IOCTL interface * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/NAS/rb_config.h b/openair2/RRC/NAS/rb_config.h index f701a5f96f..a4525b2d65 100644 --- a/openair2/RRC/NAS/rb_config.h +++ b/openair2/RRC/NAS/rb_config.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** \file rb_config.h * \brief Openair radio bearer configuration header file * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRM_4_RRC_LITE/src/com/Message.cpp b/openair2/RRM_4_RRC_LITE/src/com/Message.cpp old mode 100755 new mode 100644 index 922afea509..a41b321e00 --- a/openair2/RRM_4_RRC_LITE/src/com/Message.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/Message.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/Message.h b/openair2/RRM_4_RRC_LITE/src/com/Message.h old mode 100755 new mode 100644 index be9ef51f69..0c5b65cb0a --- a/openair2/RRM_4_RRC_LITE/src/com/Message.h +++ b/openair2/RRM_4_RRC_LITE/src/com/Message.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _MESSAGE_H_ # define _MESSAGE_H_ diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp old mode 100755 new mode 100644 index 131ff507a0..e9a2901ece --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "RRC2RRMMessageAddRadioAccessBearerConfirm.h" diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h old mode 100755 new mode 100644 index 9188f0a76e..4c7bd2befb --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRC2RRMMESSAGEADDRADIOACCESSBEARERCONFIRM_H # define _RRC2RRMMESSAGEADDRADIOACCESSBEARERCONFIRM_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp old mode 100755 new mode 100644 index 03b6add9fa..3463c745de --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "RRC2RRMMessageAddRadioAccessBearerRequest.h" diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h old mode 100755 new mode 100644 index ef2acf2fd0..cbad1b34d2 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRC2RRMMESSAGEADDRADIOACCESSBEARERREQUEST_H # define _RRC2RRMMESSAGEADDRADIOACCESSBEARERREQUEST_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp old mode 100755 new mode 100644 index bf54929de7..a76be030a1 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h old mode 100755 new mode 100644 index 0520f2e842..7ea78437d8 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRC2RRMMESSAGEADDUSERCONFIRM_H # define _RRC2RRMMESSAGEADDUSERCONFIRM_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp old mode 100755 new mode 100644 index 23f1519a97..8b0bae465f --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h old mode 100755 new mode 100644 index 484bfa14dd..24c0dc5c4f --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRC2RRMMESSAGEADDUSERREQUEST_H # define _RRC2RRMMESSAGEADDUSERREQUEST_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp old mode 100755 new mode 100644 index de659580cd..6bb3ffc403 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h old mode 100755 new mode 100644 index cafb77cbb6..986d2206cb --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRC2RRMMESSAGECONNECTIONREQUEST_H # define _RRC2RRMMESSAGECONNECTIONREQUEST_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp old mode 100755 new mode 100644 index 69a8104d75..f968bba5e3 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h old mode 100755 new mode 100644 index 9a163627ee..7ee183c7d0 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRC2RRMMESSAGEREMOVERADIOACCESSBEARERREQUEST_H # define _RRC2RRMMESSAGEREMOVERADIOACCESSBEARERREQUEST_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp old mode 100755 new mode 100644 index a63be6a307..0e3aaf9ef3 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h old mode 100755 new mode 100644 index 23a81a665a..ab81140ac5 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRC2RRMMESSAGEREMOVEUSERREQUEST_H # define _RRC2RRMMESSAGEREMOVEUSERREQUEST_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp old mode 100755 new mode 100644 index 13e31fbc55..88019a5615 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h old mode 100755 new mode 100644 index 6711dcb3a6..9592790c70 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRC2RRMMESSAGEUSERRECONFIGURATIONCOMPLETE_H # define _RRC2RRMMESSAGEUSERRECONFIGURATIONCOMPLETE_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp old mode 100755 new mode 100644 index 60cf352a9a..5915955308 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "RRCMessageHandler.h" diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h old mode 100755 new mode 100644 index 9e50de04a9..a652c0dd47 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + # ifndef _RRCMESSAGEHANDLER_H # define _RRCMESSAGEHANDLER_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp old mode 100755 new mode 100644 index 2f56c25025..150b07bd67 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "RRCUdpSocket.h" diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h old mode 100755 new mode 100644 index 0270b911b9..ea6d6a1148 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRCUDPSOCKET_H #define _RRCUDPSOCKET_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp old mode 100755 new mode 100644 index 5dfe3b52f1..e0ba3538ee --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h old mode 100755 new mode 100644 index ca8a2f576f..c7bca70de1 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRM2RRCMESSAGEADDRADIOACCESSBEARERRESPONSE_H # define _RRM2RRCMESSAGEADDRADIOACCESSBEARERRESPONSE_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp old mode 100755 new mode 100644 index 58d0c2542e..fdba64f60b --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h old mode 100755 new mode 100644 index f343ca7a02..3f5396099e --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRM2RRCMESSAGEADDUSERRESPONSE_H # define _RRM2RRCMESSAGEADDUSERRESPONSE_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp old mode 100755 new mode 100644 index b93670ffaa..e0cde8d9f8 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h old mode 100755 new mode 100644 index 28c781b920..b2928124ac --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRM2RRCMESSAGECONNECTIONRESPONSE_H # define _RRM2RRCMESSAGECONNECTIONRESPONSE_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp old mode 100755 new mode 100644 index 7c6c0dafae..683433125b --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h old mode 100755 new mode 100644 index 00da34423e..dd187f216e --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRM2RRCMESSAGEREMOVERADIOACCESSBEARERRESPONSE_H # define _RRM2RRCMESSAGEREMOVERADIOACCESSBEARERRESPONSE_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp old mode 100755 new mode 100644 index 83e703c1fa..e13bcb65c6 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h old mode 100755 new mode 100644 index 93e4bc625b..e7b1e293c2 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRM2RRCMESSAGEREMOVEUSERRESPONSE_H # define _RRM2RRCMESSAGEREMOVEUSERRESPONSE_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp old mode 100755 new mode 100644 index a6b292cadc..5fe9a3500e --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h old mode 100755 new mode 100644 index 830321a730..d0016cbc9a --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRM2RRCMESSAGEUSERRECONFIGURATION_H # define _RRM2RRCMESSAGEUSERRECONFIGURATION_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp old mode 100755 new mode 100644 index 48a3a77320..5a4e284841 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "RRMMessageHandler.h" diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h old mode 100755 new mode 100644 index 5adf2d77ba..c1a14d0642 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRMMESSAGEHANDLER_H # define _RRMMESSAGEHANDLER_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp old mode 100755 new mode 100644 index 8545c5c107..33802f1818 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp +++ b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include //---------------------------------------------------------------------------- #include "RRMUdpSocket.h" diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h old mode 100755 new mode 100644 index 019bef8eb2..2c079af94c --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h +++ b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRMUDPSOCKET_H # define _RRMUDPSOCKET_H diff --git a/openair2/RRM_4_RRC_LITE/src/platform.h b/openair2/RRM_4_RRC_LITE/src/platform.h index 25bc91a8e2..4b5b4ae465 100644 --- a/openair2/RRM_4_RRC_LITE/src/platform.h +++ b/openair2/RRM_4_RRC_LITE/src/platform.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* platform.h ------------------- diff --git a/openair2/RRM_4_RRC_LITE/src/platform_constants.h b/openair2/RRM_4_RRC_LITE/src/platform_constants.h index 12f1787c2b..d5c764e162 100644 --- a/openair2/RRM_4_RRC_LITE/src/platform_constants.h +++ b/openair2/RRM_4_RRC_LITE/src/platform_constants.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* platform_constants.h ------------------- diff --git a/openair2/RRM_4_RRC_LITE/src/platform_defines.h b/openair2/RRM_4_RRC_LITE/src/platform_defines.h index f4f24eb81a..161538edc3 100644 --- a/openair2/RRM_4_RRC_LITE/src/platform_defines.h +++ b/openair2/RRM_4_RRC_LITE/src/platform_defines.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* platform_defines.h ------------------- diff --git a/openair2/RRM_4_RRC_LITE/src/platform_dim.h b/openair2/RRM_4_RRC_LITE/src/platform_dim.h old mode 100755 new mode 100644 index 63edf9dd37..e9aa3d8584 --- a/openair2/RRM_4_RRC_LITE/src/platform_dim.h +++ b/openair2/RRM_4_RRC_LITE/src/platform_dim.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RRM_H # define _RRM_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp index bff7a1251d..ebe3e7b8c9 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h index 92674d9953..a8477c4fe1 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _ASN1UTILS_H # define _ASN1UTILS_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp index ce558718a0..684d95852a 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include //---------------------------------------------------------------------------- diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h index 43c1cee46d..4983279345 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + # ifndef _COMMAND_H # define _COMMAND_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp index e9905371a3..f09bc260fb 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp @@ -1 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "DataRadioBearer.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h index 586409f66b..6bbb789cb5 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _DATARADIOBEARER_H # define _DATARADIOBEARER_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp index 945c2bfadc..f06cfb7970 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h index 46c87e8d42..d0af2a35b1 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _ENODEB_H # define _ENODEB_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h index ace3b9ee32..e2fa3bf6d1 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _EXCEPTIONS_H # define _EXCEPTIONS_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp index 1e7bd4d568..52b341f094 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "LogicalChannel.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h index 82ef6cb6bf..0961f92cf9 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _LOGICALCHANNEL_H # define _LOGICALCHANNEL_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp index 23fc95c818..d04d53e4ba 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h index 309586508c..1bdcb8d7c2 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _MOBILE_H # define _MOBILE_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp index 67b5eeeeae..1a056c4ccc 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "RadioBearer.h" #include "Command.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h index 36d5fd78d2..88772b3bfc 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RADIOBEARER_H # define _RADIOBEARER_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp index a657b5a64d..4e6ec92bac 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "RadioResources.h" #include "Exceptions.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h index 64f937fc63..8545268182 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _RADIORESOURCES_H # define _RADIORESOURCES_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp index 459563e902..0d25e5f219 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp @@ -1 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "SignallingRadioBearer.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h index 6b232fe190..ca02cd2772 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _SIGNALLINGRADIOBEARER_H # define _SIGNALLINGRADIOBEARER_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp index 5b95f1ac31..639c5c408c 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h index 9423c86833..36e697c6e6 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _TRANSACTION_H # define _TRANSACTION_H diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp index a2812a17bf..79d6d0888c 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "Transactions.h" #include "Exceptions.h" diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h index a1220b3956..7acd110ade 100644 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h +++ b/openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + # ifndef _TRANSACTIONS_H # define _TRANSACTIONS_H diff --git a/openair2/RRM_4_RRC_LITE/src/rrm.cpp b/openair2/RRM_4_RRC_LITE/src/rrm.cpp index 5a1772f045..c1f61b577a 100644 --- a/openair2/RRM_4_RRC_LITE/src/rrm.cpp +++ b/openair2/RRM_4_RRC_LITE/src/rrm.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // =========================================================================== #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/test/TestScenario.cpp b/openair2/RRM_4_RRC_LITE/src/test/TestScenario.cpp old mode 100755 new mode 100644 index 3e4da40831..49435e1131 --- a/openair2/RRM_4_RRC_LITE/src/test/TestScenario.cpp +++ b/openair2/RRM_4_RRC_LITE/src/test/TestScenario.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/test/TestScenario.h b/openair2/RRM_4_RRC_LITE/src/test/TestScenario.h old mode 100755 new mode 100644 index c5a5dadd0c..21b080e613 --- a/openair2/RRM_4_RRC_LITE/src/test/TestScenario.h +++ b/openair2/RRM_4_RRC_LITE/src/test/TestScenario.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef _TESTSCENARIO_H # define _TESTSCENARIO_H # include "Message.h" diff --git a/openair2/RRM_4_RRC_LITE/src/test/test.cpp b/openair2/RRM_4_RRC_LITE/src/test/test.cpp old mode 100755 new mode 100644 index 38864ab11c..397df1e8d1 --- a/openair2/RRM_4_RRC_LITE/src/test/test.cpp +++ b/openair2/RRM_4_RRC_LITE/src/test/test.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // =========================================================================== #include #include diff --git a/openair2/RRM_4_RRC_LITE/src/version.h b/openair2/RRM_4_RRC_LITE/src/version.h old mode 100755 new mode 100644 index 620ee3c1aa..9e623adfd4 --- a/openair2/RRM_4_RRC_LITE/src/version.h +++ b/openair2/RRM_4_RRC_LITE/src/version.h @@ -1 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define VERSION_STRING "dev-SVN-r0" \ No newline at end of file diff --git a/openair2/UTIL/BIGPHYS/bigphys.c b/openair2/UTIL/BIGPHYS/bigphys.c index aac999749f..92a0a8bef8 100644 --- a/openair2/UTIL/BIGPHYS/bigphys.c +++ b/openair2/UTIL/BIGPHYS/bigphys.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "defs.h" #include "linux/module.h" diff --git a/openair2/UTIL/BIGPHYS/defs.h b/openair2/UTIL/BIGPHYS/defs.h index 716fd5c4aa..01387cb001 100644 --- a/openair2/UTIL/BIGPHYS/defs.h +++ b/openair2/UTIL/BIGPHYS/defs.h @@ -1 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + void* bigphys_malloc(int); diff --git a/openair2/UTIL/CLI/cli.c b/openair2/UTIL/CLI/cli.c index 82b84dddf7..bb193728c9 100644 --- a/openair2/UTIL/CLI/cli.c +++ b/openair2/UTIL/CLI/cli.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file cli.c * \brief oai main cli core * \author Navid Nikaein diff --git a/openair2/UTIL/CLI/cli.h b/openair2/UTIL/CLI/cli.h index d4e86a0005..70aab5c4da 100644 --- a/openair2/UTIL/CLI/cli.h +++ b/openair2/UTIL/CLI/cli.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file cli.h * \brief cli interface header file * \author Navid Nikaein diff --git a/openair2/UTIL/CLI/cli_cmd.c b/openair2/UTIL/CLI/cli_cmd.c index 96d4a6d7e6..366295bf1a 100644 --- a/openair2/UTIL/CLI/cli_cmd.c +++ b/openair2/UTIL/CLI/cli_cmd.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file cli_cmd.c * \brief oai cli commands * \author Navid Nikaein diff --git a/openair2/UTIL/CLI/cli_if.h b/openair2/UTIL/CLI/cli_if.h index 30c520087d..129176cd2c 100644 --- a/openair2/UTIL/CLI/cli_if.h +++ b/openair2/UTIL/CLI/cli_if.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file cli_if.h * \brief cli interface * \author Navid Nikaein diff --git a/openair2/UTIL/CLI/cli_server.c b/openair2/UTIL/CLI/cli_server.c index 66bdab7886..43ffac0a53 100644 --- a/openair2/UTIL/CLI/cli_server.c +++ b/openair2/UTIL/CLI/cli_server.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file cli_server.c * \brief oai cli server side implementation * \author Navid Nikaein diff --git a/openair2/UTIL/FIFO/pad_list.c b/openair2/UTIL/FIFO/pad_list.c index 0252c25683..f60505f8ce 100644 --- a/openair2/UTIL/FIFO/pad_list.c +++ b/openair2/UTIL/FIFO/pad_list.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pad_list.c * \brief list management primimtives * \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein diff --git a/openair2/UTIL/FIFO/pad_list.h b/openair2/UTIL/FIFO/pad_list.h index 189b0b8616..4f755f9940 100644 --- a/openair2/UTIL/FIFO/pad_list.h +++ b/openair2/UTIL/FIFO/pad_list.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pad_list.c * \brief list management primimtives * \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein diff --git a/openair2/UTIL/FIFO/types.h b/openair2/UTIL/FIFO/types.h index c6b78975b8..23d69ff3a6 100644 --- a/openair2/UTIL/FIFO/types.h +++ b/openair2/UTIL/FIFO/types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pad_list.c * \brief list management primimtives * \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein diff --git a/openair2/UTIL/LISTS/list.c b/openair2/UTIL/LISTS/list.c index 6cfd0e2b45..33b880d297 100644 --- a/openair2/UTIL/LISTS/list.c +++ b/openair2/UTIL/LISTS/list.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file list.c * \brief list management primimtives. It includes three implementations: (1) with mem_blocks, (2) standard list implementation (mem usage 314MB) (3) Linux Queue-based implementation (mem usage 394 MB) * \author Navid Nikaein, Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER diff --git a/openair2/UTIL/LISTS/list.h b/openair2/UTIL/LISTS/list.h old mode 100755 new mode 100644 index 935e03dee6..189de84aeb --- a/openair2/UTIL/LISTS/list.h +++ b/openair2/UTIL/LISTS/list.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pad_list.c * \brief list management primimtives diff --git a/openair2/UTIL/LISTS/list2.c b/openair2/UTIL/LISTS/list2.c index 09c53a0ecf..4a8de24b51 100644 --- a/openair2/UTIL/LISTS/list2.c +++ b/openair2/UTIL/LISTS/list2.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file pad_list.c * \brief list management primimtives diff --git a/openair2/UTIL/LOG/log.c b/openair2/UTIL/LOG/log.c index b407375a09..2626d18c19 100644 --- a/openair2/UTIL/LOG/log.c +++ b/openair2/UTIL/LOG/log.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file log.c * \brief log implementaion * \author Navid Nikaein diff --git a/openair2/UTIL/LOG/log.h b/openair2/UTIL/LOG/log.h index b50a750ebb..d5ab549aef 100644 --- a/openair2/UTIL/LOG/log.h +++ b/openair2/UTIL/LOG/log.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file log.h * \brief openair log generator (OLG) for * \author Navid Nikaein diff --git a/openair2/UTIL/LOG/log_extern.h b/openair2/UTIL/LOG/log_extern.h index e70027c78f..39324de4e2 100644 --- a/openair2/UTIL/LOG/log_extern.h +++ b/openair2/UTIL/LOG/log_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include"log.h" extern log_t *g_log; diff --git a/openair2/UTIL/LOG/log_if.h b/openair2/UTIL/LOG/log_if.h index cbcf6e4dac..1b447a7f60 100644 --- a/openair2/UTIL/LOG/log_if.h +++ b/openair2/UTIL/LOG/log_if.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file log_if.h * \brief log interface * \author Navid Nikaein diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 14e9f3cb05..226f8f0754 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file vcd_signal_dumper.c * \brief Dump functions calls and variables to VCD file. Use GTKWave to display this file. * \author S. Roux diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 106c3f0043..81a5fb083d 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file vcd_signal_dumper.h * \brief Output functions call to VCD file which is readable by gtkwave. * \author ROUX Sebastien diff --git a/openair2/UTIL/MATH/crc_byte.c b/openair2/UTIL/MATH/crc_byte.c index 06be0f6d9b..b7e537163c 100644 --- a/openair2/UTIL/MATH/crc_byte.c +++ b/openair2/UTIL/MATH/crc_byte.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* May 10, 2001 Modified in June, 2001, to include the length non multiple of 8 diff --git a/openair2/UTIL/MATH/oml.c b/openair2/UTIL/MATH/oml.c index 812723d5a2..5794b7876a 100644 --- a/openair2/UTIL/MATH/oml.c +++ b/openair2/UTIL/MATH/oml.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file oml.c * \brief Data structure for distribution libraries * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/MATH/oml.h b/openair2/UTIL/MATH/oml.h index a860dfe08d..2a057a93fc 100644 --- a/openair2/UTIL/MATH/oml.h +++ b/openair2/UTIL/MATH/oml.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file oml.h * \brief Data structure for OCG of OpenAir emulator * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/MATH/random.c b/openair2/UTIL/MATH/random.c index 72c2043f2e..c2db287679 100644 --- a/openair2/UTIL/MATH/random.c +++ b/openair2/UTIL/MATH/random.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* random.c ------------------- diff --git a/openair2/UTIL/MATH/random_proto_extern.h b/openair2/UTIL/MATH/random_proto_extern.h index 9a45c1db09..17ea22e461 100644 --- a/openair2/UTIL/MATH/random_proto_extern.h +++ b/openair2/UTIL/MATH/random_proto_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* random_proto_extern.h diff --git a/openair2/UTIL/MATH/taus.c b/openair2/UTIL/MATH/taus.c index 6a766892cc..1f3a64aa84 100644 --- a/openair2/UTIL/MATH/taus.c +++ b/openair2/UTIL/MATH/taus.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file taus.c * \brief random number generator per OAI component * \author Navid Nikaein diff --git a/openair2/UTIL/MEM/mem_block.c b/openair2/UTIL/MEM/mem_block.c index 21dfa58358..8a5f5fd223 100644 --- a/openair2/UTIL/MEM/mem_block.c +++ b/openair2/UTIL/MEM/mem_block.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** mem_block.c - description ------------------- diff --git a/openair2/UTIL/MEM/mem_block.h b/openair2/UTIL/MEM/mem_block.h index b79ceac2ea..8164dcf51c 100644 --- a/openair2/UTIL/MEM/mem_block.h +++ b/openair2/UTIL/MEM/mem_block.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** mem_block.h - description ------------------- diff --git a/openair2/UTIL/MEM/mem_mngt.c b/openair2/UTIL/MEM/mem_mngt.c index 22f2ddba0d..64503d8cb7 100644 --- a/openair2/UTIL/MEM/mem_mngt.c +++ b/openair2/UTIL/MEM/mem_mngt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** mem_mngt.c - description ------------------- diff --git a/openair2/UTIL/MEM/mem_mngt_proto_extern.h b/openair2/UTIL/MEM/mem_mngt_proto_extern.h index e69de29bb2..f4f8a2eaae 100644 --- a/openair2/UTIL/MEM/mem_mngt_proto_extern.h +++ b/openair2/UTIL/MEM/mem_mngt_proto_extern.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair2/UTIL/MEM/mem_pool.h b/openair2/UTIL/MEM/mem_pool.h index b9339489b8..0e943081b0 100644 --- a/openair2/UTIL/MEM/mem_pool.h +++ b/openair2/UTIL/MEM/mem_pool.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** mem_pool.h - description ------------------- diff --git a/openair2/UTIL/OCG/OCG.c b/openair2/UTIL/OCG/OCG.c index 2d6ebf2a7b..a78b49dd84 100644 --- a/openair2/UTIL/OCG/OCG.c +++ b/openair2/UTIL/OCG/OCG.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG.c * \brief Main function containing the FSM of OCG * \author Navid Nikaein and Lusheng Wang diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h index d301a848e6..bd53c179ff 100644 --- a/openair2/UTIL/OCG/OCG.h +++ b/openair2/UTIL/OCG/OCG.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG.h * \brief Data structure for OCG of OpenAir emulator * \author Navid Nikaein, Lusheng Wang and Andre Gomes(One source) diff --git a/openair2/UTIL/OCG/OCG_call_emu.c b/openair2/UTIL/OCG/OCG_call_emu.c index b4687bf9bd..2ce1818b12 100644 --- a/openair2/UTIL/OCG/OCG_call_emu.c +++ b/openair2/UTIL/OCG/OCG_call_emu.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + Lusheng Wang and /*! \file OCG_call_emu.c * \brief Call the emulator diff --git a/openair2/UTIL/OCG/OCG_call_emu.h b/openair2/UTIL/OCG/OCG_call_emu.h index 9396e781c8..c27f3c1b06 100644 --- a/openair2/UTIL/OCG/OCG_call_emu.h +++ b/openair2/UTIL/OCG/OCG_call_emu.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_call_emu.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_config_mobi.c b/openair2/UTIL/OCG/OCG_config_mobi.c index d01f58b8d0..ae53b61955 100644 --- a/openair2/UTIL/OCG/OCG_config_mobi.c +++ b/openair2/UTIL/OCG/OCG_config_mobi.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_config_mobi.c * \brief Generate an XML to configure the mobility * \author Lusheng Wang & Navid Nikaein diff --git a/openair2/UTIL/OCG/OCG_config_mobi.h b/openair2/UTIL/OCG/OCG_config_mobi.h index b9df48566f..ab7048b2b0 100644 --- a/openair2/UTIL/OCG/OCG_config_mobi.h +++ b/openair2/UTIL/OCG/OCG_config_mobi.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_config_mobi.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_create_dir.c b/openair2/UTIL/OCG/OCG_create_dir.c index f94fd24f1a..cfbf26a21d 100644 --- a/openair2/UTIL/OCG/OCG_create_dir.c +++ b/openair2/UTIL/OCG/OCG_create_dir.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_create_dir.c * \brief Create directory for current emulation * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_create_dir.h b/openair2/UTIL/OCG/OCG_create_dir.h index 3aefecf9e8..c8f3729c47 100644 --- a/openair2/UTIL/OCG/OCG_create_dir.h +++ b/openair2/UTIL/OCG/OCG_create_dir.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_create_dir.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_detect_file.c b/openair2/UTIL/OCG/OCG_detect_file.c index 45de2c294a..a7226a67db 100644 --- a/openair2/UTIL/OCG/OCG_detect_file.c +++ b/openair2/UTIL/OCG/OCG_detect_file.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_detect_file.c * \brief Detect if a new XML is generated from the web portal * \author Lusheng Wang & Navid Nikaein diff --git a/openair2/UTIL/OCG/OCG_detect_file.h b/openair2/UTIL/OCG/OCG_detect_file.h index e7a0d8d9f8..43aa22040e 100644 --- a/openair2/UTIL/OCG/OCG_detect_file.h +++ b/openair2/UTIL/OCG/OCG_detect_file.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_detect_file.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_extern.h b/openair2/UTIL/OCG/OCG_extern.h index 5a0a74e2a1..58eac66263 100644 --- a/openair2/UTIL/OCG/OCG_extern.h +++ b/openair2/UTIL/OCG/OCG_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __OCG_EXTERN_H__ #define __OCG_EXTERN_H__ diff --git a/openair2/UTIL/OCG/OCG_generate_report.c b/openair2/UTIL/OCG/OCG_generate_report.c index 1863168730..320fa0c5df 100644 --- a/openair2/UTIL/OCG/OCG_generate_report.c +++ b/openair2/UTIL/OCG/OCG_generate_report.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_generate_report.c * \brief Generate a brief report for debug of OCG * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_generate_report.h b/openair2/UTIL/OCG/OCG_generate_report.h index 96ba3789b5..c3fd5f9540 100644 --- a/openair2/UTIL/OCG/OCG_generate_report.h +++ b/openair2/UTIL/OCG/OCG_generate_report.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_generate_report.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_get_opt.c b/openair2/UTIL/OCG/OCG_get_opt.c index 2f1cacb299..79bce055c6 100644 --- a/openair2/UTIL/OCG/OCG_get_opt.c +++ b/openair2/UTIL/OCG/OCG_get_opt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_get_opt.c * \brief Get Options of the OCG command * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_get_opt.h b/openair2/UTIL/OCG/OCG_get_opt.h index 14fc479dcf..5ae9d51627 100644 --- a/openair2/UTIL/OCG/OCG_get_opt.h +++ b/openair2/UTIL/OCG/OCG_get_opt.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_get_opt.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_if.h b/openair2/UTIL/OCG/OCG_if.h index 34c07735fe..0635356a4d 100644 --- a/openair2/UTIL/OCG/OCG_if.h +++ b/openair2/UTIL/OCG/OCG_if.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_if.h * \brief Interfaces to the outside of OCG * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_parse_XML.c b/openair2/UTIL/OCG/OCG_parse_XML.c index ac593ea0d2..ea35db7c8d 100644 --- a/openair2/UTIL/OCG/OCG_parse_XML.c +++ b/openair2/UTIL/OCG/OCG_parse_XML.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_parse_XML.c * \brief Parse the content of the XML configuration file * \author Lusheng Wang & Navid Nikaein & Andre Gomes(One Source) diff --git a/openair2/UTIL/OCG/OCG_parse_XML.h b/openair2/UTIL/OCG/OCG_parse_XML.h index beedd784fa..3133f98a29 100644 --- a/openair2/UTIL/OCG/OCG_parse_XML.h +++ b/openair2/UTIL/OCG/OCG_parse_XML.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_parse_XML.h * \brief Variables indicating the element which is currently parsed * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_parse_filename.c b/openair2/UTIL/OCG/OCG_parse_filename.c index 8fd3121399..1ee3c18233 100644 --- a/openair2/UTIL/OCG/OCG_parse_filename.c +++ b/openair2/UTIL/OCG/OCG_parse_filename.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_parse_filename.c * \brief Parse the filename of the XML file * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_parse_filename.h b/openair2/UTIL/OCG/OCG_parse_filename.h index 9e10c7fd32..09ca9088b9 100644 --- a/openair2/UTIL/OCG/OCG_parse_filename.h +++ b/openair2/UTIL/OCG/OCG_parse_filename.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_parse_filename.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_save_XML.c b/openair2/UTIL/OCG/OCG_save_XML.c index 3be439f85f..a7f88d364a 100644 --- a/openair2/UTIL/OCG/OCG_save_XML.c +++ b/openair2/UTIL/OCG/OCG_save_XML.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_save_XML.c * \brief Save the XML configuration file in the created directory for current emulation * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_save_XML.h b/openair2/UTIL/OCG/OCG_save_XML.h index 6ea6538ca4..b90b2b30f7 100644 --- a/openair2/UTIL/OCG/OCG_save_XML.h +++ b/openair2/UTIL/OCG/OCG_save_XML.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OCG_save_XML.h * \brief * \author Lusheng Wang and navid nikaein diff --git a/openair2/UTIL/OCG/OCG_vars.h b/openair2/UTIL/OCG/OCG_vars.h index 597494e41e..383e4e2551 100644 --- a/openair2/UTIL/OCG/OCG_vars.h +++ b/openair2/UTIL/OCG/OCG_vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __OCG_VARS_H__ #define __OCG_VARS_H__ diff --git a/openair2/UTIL/OMG/client_traci_OMG.c b/openair2/UTIL/OMG/client_traci_OMG.c index de1975d69b..c0ccf31dc6 100644 --- a/openair2/UTIL/OMG/client_traci_OMG.c +++ b/openair2/UTIL/OMG/client_traci_OMG.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file client_traci_OMG.c * \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces. * \author S. Uppoor, J. Harri diff --git a/openair2/UTIL/OMG/client_traci_OMG.h b/openair2/UTIL/OMG/client_traci_OMG.h index 827ddfc263..9aec52110a 100644 --- a/openair2/UTIL/OMG/client_traci_OMG.h +++ b/openair2/UTIL/OMG/client_traci_OMG.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file client_traci_OMG.h * \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces. * \author S. Uppoor, J. Harri diff --git a/openair2/UTIL/OMG/common.c b/openair2/UTIL/OMG/common.c index 1062d69215..fc41e5dd3a 100644 --- a/openair2/UTIL/OMG/common.c +++ b/openair2/UTIL/OMG/common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OMG.c * \brief Main function containing the OMG interface * \author M. Mahersi, J. Harri, N. Nikaein, diff --git a/openair2/UTIL/OMG/defs.h b/openair2/UTIL/OMG/defs.h index 913a7e05f4..2a76d7dd6e 100644 --- a/openair2/UTIL/OMG/defs.h +++ b/openair2/UTIL/OMG/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** * \file defs.h * \brief Typedefs & Prototypes of OMG functions diff --git a/openair2/UTIL/OMG/grid.c b/openair2/UTIL/OMG/grid.c index 68dd35b5d7..4f2dbf24ef 100644 --- a/openair2/UTIL/OMG/grid.c +++ b/openair2/UTIL/OMG/grid.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file grid.c * \brief * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/grid.h b/openair2/UTIL/OMG/grid.h index 819fa8fe19..d7352491fe 100644 --- a/openair2/UTIL/OMG/grid.h +++ b/openair2/UTIL/OMG/grid.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** * \file grid.h **/ diff --git a/openair2/UTIL/OMG/id_manager.c b/openair2/UTIL/OMG/id_manager.c index ebd1d9d158..db56cbbaac 100644 --- a/openair2/UTIL/OMG/id_manager.c +++ b/openair2/UTIL/OMG/id_manager.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file id_manager.c * \brief Main function containing the OMG ID Manager * \author J. Harri diff --git a/openair2/UTIL/OMG/id_manager.h b/openair2/UTIL/OMG/id_manager.h index 82b0fe2b20..92df104133 100644 --- a/openair2/UTIL/OMG/id_manager.h +++ b/openair2/UTIL/OMG/id_manager.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file id_manager.h * \brief Prototypes of the OMG ID Manager to handle the mapping between OAI ID and SUMO ID * \author J. Harri diff --git a/openair2/UTIL/OMG/job.c b/openair2/UTIL/OMG/job.c index 8b9e4f87c9..82a3096c03 100644 --- a/openair2/UTIL/OMG/job.c +++ b/openair2/UTIL/OMG/job.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file job.c * \brief handle jobs for future nodes' update * \author S. Gashaw, M. Mahersi, J. Harri, N. Nikaein, diff --git a/openair2/UTIL/OMG/mobility_parser.c b/openair2/UTIL/OMG/mobility_parser.c index 7a56609cf4..1013d6302a 100644 --- a/openair2/UTIL/OMG/mobility_parser.c +++ b/openair2/UTIL/OMG/mobility_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file mobility_parser.c * \brief A parser for trace-based mobility information (parsed from a file) * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/mobility_parser.h b/openair2/UTIL/OMG/mobility_parser.h index fb1eaaa7ce..84d40264f4 100644 --- a/openair2/UTIL/OMG/mobility_parser.h +++ b/openair2/UTIL/OMG/mobility_parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file mobility_parser.h * \brief A parser for trace-based mobility information (parsed from a file) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/omg.c b/openair2/UTIL/OMG/omg.c index dffaf8477c..eae794187a 100644 --- a/openair2/UTIL/OMG/omg.c +++ b/openair2/UTIL/OMG/omg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OMG.c * \brief Main function containing the OMG API to oaisim or any other simulator/emulator * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/omg.h b/openair2/UTIL/OMG/omg.h index ea96582496..9ff69730f0 100644 --- a/openair2/UTIL/OMG/omg.h +++ b/openair2/UTIL/OMG/omg.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file OMG.h * \brief Prototypes of OMG APIs * \author M. Mahersi, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/omg_constants.h b/openair2/UTIL/OMG/omg_constants.h index 0476b3aedc..0bee58db7a 100644 --- a/openair2/UTIL/OMG/omg_constants.h +++ b/openair2/UTIL/OMG/omg_constants.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** * \file omg_constants.h * \brief Constants and Enumarations diff --git a/openair2/UTIL/OMG/omg_hashtable.c b/openair2/UTIL/OMG/omg_hashtable.c index 122eb35c0c..b237676e71 100644 --- a/openair2/UTIL/OMG/omg_hashtable.c +++ b/openair2/UTIL/OMG/omg_hashtable.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file omg_hashtable.c * \brief A 'C' implementation of a hashtable * \author S. Uppoor diff --git a/openair2/UTIL/OMG/omg_hashtable.h b/openair2/UTIL/OMG/omg_hashtable.h index 057388d646..894a245efd 100644 --- a/openair2/UTIL/OMG/omg_hashtable.h +++ b/openair2/UTIL/OMG/omg_hashtable.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file omg_hashtable.h * \brief A 'C' implementation of a hashtable * \author S. Uppoor diff --git a/openair2/UTIL/OMG/omg_vars.h b/openair2/UTIL/OMG/omg_vars.h index fecd57537a..861395771f 100644 --- a/openair2/UTIL/OMG/omg_vars.h +++ b/openair2/UTIL/OMG/omg_vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** * \file omg_vars.h * \brief Global variables diff --git a/openair2/UTIL/OMG/rwalk.c b/openair2/UTIL/OMG/rwalk.c index 26cd4762e8..6e758dbfa7 100644 --- a/openair2/UTIL/OMG/rwalk.c +++ b/openair2/UTIL/OMG/rwalk.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rwalk.c * \brief random walk mobility generator * \author S. Gashaw, N. Nikaein, J. Harri, M. Mahersi diff --git a/openair2/UTIL/OMG/rwalk.h b/openair2/UTIL/OMG/rwalk.h index 711243f190..482cecd0c9 100644 --- a/openair2/UTIL/OMG/rwalk.h +++ b/openair2/UTIL/OMG/rwalk.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** * \file rwalk.h * \brief Functions used for the RWALK Model diff --git a/openair2/UTIL/OMG/rwp.c b/openair2/UTIL/OMG/rwp.c index 89194c3b8c..4a03dabc78 100644 --- a/openair2/UTIL/OMG/rwp.c +++ b/openair2/UTIL/OMG/rwp.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rwp.c * \brief random waypoint mobility generator * \author M. Mahersi, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/rwp.h b/openair2/UTIL/OMG/rwp.h index d41e5868bd..4d5695cc80 100644 --- a/openair2/UTIL/OMG/rwp.h +++ b/openair2/UTIL/OMG/rwp.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * \file rwp.h * \brief Functions used for the Random WayPoint Model diff --git a/openair2/UTIL/OMG/socket_traci_OMG.c b/openair2/UTIL/OMG/socket_traci_OMG.c index c9bebae7ee..fa40d8fe1e 100644 --- a/openair2/UTIL/OMG/socket_traci_OMG.c +++ b/openair2/UTIL/OMG/socket_traci_OMG.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file socket_traci_OMG.c * \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/socket_traci_OMG.h b/openair2/UTIL/OMG/socket_traci_OMG.h index 55a244a712..90f8a0bff9 100644 --- a/openair2/UTIL/OMG/socket_traci_OMG.h +++ b/openair2/UTIL/OMG/socket_traci_OMG.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file socket_traci_OMG.h * \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/static.c b/openair2/UTIL/OMG/static.c index b188bc57b3..8a94a74294 100644 --- a/openair2/UTIL/OMG/static.c +++ b/openair2/UTIL/OMG/static.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rwalk.c * \brief static mobility generator * \author M. Mahersi, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/static.h b/openair2/UTIL/OMG/static.h index 0bd0303867..b2c8904e8a 100644 --- a/openair2/UTIL/OMG/static.h +++ b/openair2/UTIL/OMG/static.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** * \file static.h * \brief Prototypes of the functions used for the STATIC model diff --git a/openair2/UTIL/OMG/steadystaterwp.c b/openair2/UTIL/OMG/steadystaterwp.c index 9dcb99b32c..428ad7dce7 100644 --- a/openair2/UTIL/OMG/steadystaterwp.c +++ b/openair2/UTIL/OMG/steadystaterwp.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file steadystaterwp.c * \brief random waypoint mobility generator * \author S. Gashaw, J. Harri, N. Nikaein, diff --git a/openair2/UTIL/OMG/steadystaterwp.h b/openair2/UTIL/OMG/steadystaterwp.h index b81e966e3f..b73c7b1593 100644 --- a/openair2/UTIL/OMG/steadystaterwp.h +++ b/openair2/UTIL/OMG/steadystaterwp.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file steadystaterwp.h * \brief random waypoint mobility generator * \date 2014 diff --git a/openair2/UTIL/OMG/storage_traci_OMG.c b/openair2/UTIL/OMG/storage_traci_OMG.c index 18f93ed5df..7bd3ae4155 100644 --- a/openair2/UTIL/OMG/storage_traci_OMG.c +++ b/openair2/UTIL/OMG/storage_traci_OMG.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file storage_traci_OMG.c * \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/storage_traci_OMG.h b/openair2/UTIL/OMG/storage_traci_OMG.h index 4742f7199e..143d24a629 100644 --- a/openair2/UTIL/OMG/storage_traci_OMG.h +++ b/openair2/UTIL/OMG/storage_traci_OMG.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file storage_traci_OMG.h * \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/sumo.c b/openair2/UTIL/OMG/sumo.c index d9248797cb..cc1d1e8ccd 100644 --- a/openair2/UTIL/OMG/sumo.c +++ b/openair2/UTIL/OMG/sumo.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file sumo.c * \brief The OMG interface to SUMO (Simulation of Urban Mobility) * \author S. Uppoor, J. Harri diff --git a/openair2/UTIL/OMG/sumo.h b/openair2/UTIL/OMG/sumo.h index cf9a7ef5ba..defe67f528 100644 --- a/openair2/UTIL/OMG/sumo.h +++ b/openair2/UTIL/OMG/sumo.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file sumo.h * \brief The OMG interface to SUMO (Simulation of Urban Mobility) * \author S. Uppoor, J. Harri diff --git a/openair2/UTIL/OMG/trace.c b/openair2/UTIL/OMG/trace.c index 9e8ad3ca6d..4a71999fb9 100644 --- a/openair2/UTIL/OMG/trace.c +++ b/openair2/UTIL/OMG/trace.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file trace.c * \brief The trace-based mobility model for OMG/OAI (mobility is statically imported from a file) * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/trace.h b/openair2/UTIL/OMG/trace.h index 26f1e02646..c7d0528d94 100644 --- a/openair2/UTIL/OMG/trace.h +++ b/openair2/UTIL/OMG/trace.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file trace.h * \brief The trace-based mobility model for OMG/OAI (mobility is statically imported from a file) * \author S. Uppoor diff --git a/openair2/UTIL/OMG/trace_hashtable.c b/openair2/UTIL/OMG/trace_hashtable.c index 1a36b9dd86..0595a1d432 100644 --- a/openair2/UTIL/OMG/trace_hashtable.c +++ b/openair2/UTIL/OMG/trace_hashtable.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file hashtable.c * \brief A 'C' implementation of a hashtable * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/trace_hashtable.h b/openair2/UTIL/OMG/trace_hashtable.h index ba06f07cd1..d57e65956f 100644 --- a/openair2/UTIL/OMG/trace_hashtable.h +++ b/openair2/UTIL/OMG/trace_hashtable.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file trace_hashtable.h * \brief A 'C' implementation of a hashtable * \author S. Uppoor diff --git a/openair2/UTIL/OMV/communicationthread.cpp b/openair2/UTIL/OMV/communicationthread.cpp index f71674e2fb..4b30e32b71 100644 --- a/openair2/UTIL/OMV/communicationthread.cpp +++ b/openair2/UTIL/OMV/communicationthread.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file communicationthread.cpp * \brief this thread is to process the communication between the simulator and the visualisor * \author M. Mosli diff --git a/openair2/UTIL/OMV/communicationthread.h b/openair2/UTIL/OMV/communicationthread.h index 5cfcfb2aec..19c1a242e5 100644 --- a/openair2/UTIL/OMV/communicationthread.h +++ b/openair2/UTIL/OMV/communicationthread.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file communicationthread.h * \brief this thread is to process the communication between the simulator and the visualisor * \author M. Mosli diff --git a/openair2/UTIL/OMV/mywindow.cpp b/openair2/UTIL/OMV/mywindow.cpp index a5e5a682b9..4cbfbbacb1 100644 --- a/openair2/UTIL/OMV/mywindow.cpp +++ b/openair2/UTIL/OMV/mywindow.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file mywindow.cpp * \brief manages the window and its components * \author M. Mosli diff --git a/openair2/UTIL/OMV/mywindow.h b/openair2/UTIL/OMV/mywindow.h index 59d6b0f5ce..a36beaf8c2 100644 --- a/openair2/UTIL/OMV/mywindow.h +++ b/openair2/UTIL/OMV/mywindow.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file mywindow.h * \brief manages the window and its components * \author M. Mosli diff --git a/openair2/UTIL/OMV/omv.cpp b/openair2/UTIL/OMV/omv.cpp index 5e3d7ade90..c4fc586783 100644 --- a/openair2/UTIL/OMV/omv.cpp +++ b/openair2/UTIL/OMV/omv.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file omv.cpp * \brief openair mobility visualisor * \author M. Mosli diff --git a/openair2/UTIL/OMV/openglwidget.cpp b/openair2/UTIL/OMV/openglwidget.cpp index b8093f38b0..d86767486d 100644 --- a/openair2/UTIL/OMV/openglwidget.cpp +++ b/openair2/UTIL/OMV/openglwidget.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file openglwidget.cpp * \brief area devoted to draw the nodes and their connections * \author M. Mosli diff --git a/openair2/UTIL/OMV/openglwidget.h b/openair2/UTIL/OMV/openglwidget.h index bf87092a38..b7069c63ea 100644 --- a/openair2/UTIL/OMV/openglwidget.h +++ b/openair2/UTIL/OMV/openglwidget.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file openglwidget.cpp * \brief area devoted to draw the nodes and their connections * \author M. Mosli diff --git a/openair2/UTIL/OMV/structures.h b/openair2/UTIL/OMV/structures.h index c722c379ec..c50e7b2297 100644 --- a/openair2/UTIL/OMV/structures.h +++ b/openair2/UTIL/OMV/structures.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file structures.h * \brief structures used for the * \author M. Mosli diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h index 780b00642e..652873e569 100644 --- a/openair2/UTIL/OPT/opt.h +++ b/openair2/UTIL/OPT/opt.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*____________________________OPT/opt.h___________________________ Authors: Navid NIKAIEN Company: EURECOM diff --git a/openair2/UTIL/OPT/socket_sender.c b/openair2/UTIL/OPT/socket_sender.c index e69de29bb2..f4f8a2eaae 100644 --- a/openair2/UTIL/OPT/socket_sender.c +++ b/openair2/UTIL/OPT/socket_sender.c @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair2/UTIL/OPT/vars.h b/openair2/UTIL/OPT/vars.h index 2fee168ed3..e8ca8c5fc6 100644 --- a/openair2/UTIL/OPT/vars.h +++ b/openair2/UTIL/OPT/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*____________________________OPT/var.h___________________________ Authors: Navid NIKAIEN Company: EURECOM diff --git a/openair2/UTIL/OSA/osa_defs.h b/openair2/UTIL/OSA/osa_defs.h index 804a608e0a..ef714cdc0f 100644 --- a/openair2/UTIL/OSA/osa_defs.h +++ b/openair2/UTIL/OSA/osa_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! * \file secu_defs.h * \brief Openair security algorithms functions implementing 3GPP TS 33.401 diff --git a/openair2/UTIL/OSA/osa_internal.h b/openair2/UTIL/OSA/osa_internal.h index 3f0116017d..867b537826 100644 --- a/openair2/UTIL/OSA/osa_internal.h +++ b/openair2/UTIL/OSA/osa_internal.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef OSA_INTERNAL_H_ #define OSA_INTERNAL_H_ diff --git a/openair2/UTIL/OSA/osa_key_deriver.c b/openair2/UTIL/OSA/osa_key_deriver.c index cbe62029ea..5bbaf5f17d 100644 --- a/openair2/UTIL/OSA/osa_key_deriver.c +++ b/openair2/UTIL/OSA/osa_key_deriver.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/openair2/UTIL/OSA/osa_rijndael.c b/openair2/UTIL/OSA/osa_rijndael.c index ac9f3fd18b..a460ac3568 100644 --- a/openair2/UTIL/OSA/osa_rijndael.c +++ b/openair2/UTIL/OSA/osa_rijndael.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include /* Rijndael S-box OSA_SR */ diff --git a/openair2/UTIL/OSA/osa_rijndael.h b/openair2/UTIL/OSA/osa_rijndael.h index bcb6512635..f8fcb13427 100644 --- a/openair2/UTIL/OSA/osa_rijndael.h +++ b/openair2/UTIL/OSA/osa_rijndael.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef OSA_RIJNDAEL_H_ #define OSA_RIJNDAEL_H_ /* Rijndael S-box SR */ diff --git a/openair2/UTIL/OSA/osa_snow3g.c b/openair2/UTIL/OSA/osa_snow3g.c index e7ff804699..7d25c069fc 100644 --- a/openair2/UTIL/OSA/osa_snow3g.c +++ b/openair2/UTIL/OSA/osa_snow3g.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/UTIL/OSA/osa_snow3g.h b/openair2/UTIL/OSA/osa_snow3g.h index 8f776094b9..7107317084 100644 --- a/openair2/UTIL/OSA/osa_snow3g.h +++ b/openair2/UTIL/OSA/osa_snow3g.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file snow3g.h * \brief * \author Open source Adapted from Specification of the 3GPP Confidentiality and diff --git a/openair2/UTIL/OSA/osa_stream_eea.c b/openair2/UTIL/OSA/osa_stream_eea.c index dc60530c92..6abaa1f975 100644 --- a/openair2/UTIL/OSA/osa_stream_eea.c +++ b/openair2/UTIL/OSA/osa_stream_eea.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/UTIL/OSA/osa_stream_eia.c b/openair2/UTIL/OSA/osa_stream_eia.c index 5be42fac51..9830541006 100644 --- a/openair2/UTIL/OSA/osa_stream_eia.c +++ b/openair2/UTIL/OSA/osa_stream_eia.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/UTIL/OTG/main.c b/openair2/UTIL/OTG/main.c index e019463538..529755300a 100644 --- a/openair2/UTIL/OTG/main.c +++ b/openair2/UTIL/OTG/main.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file main.c * \brief main program for OTG CX + RX * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg.c b/openair2/UTIL/OTG/otg.c index f64bb2d82a..2043eb1048 100644 --- a/openair2/UTIL/OTG/otg.c +++ b/openair2/UTIL/OTG/otg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg.c * \brief common function for otc tx and rx * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg.h b/openair2/UTIL/OTG/otg.h index 67800351bd..0cd64aeef2 100644 --- a/openair2/UTIL/OTG/otg.h +++ b/openair2/UTIL/OTG/otg.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg.h * \brief Data structure and functions for OTG * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_config.h b/openair2/UTIL/OTG/otg_config.h index 92755cdca3..880f69bf16 100644 --- a/openair2/UTIL/OTG/otg_config.h +++ b/openair2/UTIL/OTG/otg_config.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_config.h main used structures * \brief otg structure * \author Navid Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_defs.h b/openair2/UTIL/OTG/otg_defs.h index 14f1f57115..0cef777b8f 100644 --- a/openair2/UTIL/OTG/otg_defs.h +++ b/openair2/UTIL/OTG/otg_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_defs.h main used structures * \brief otg structure * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_externs.h b/openair2/UTIL/OTG/otg_externs.h index 643b6ce9a5..053b8f55a1 100644 --- a/openair2/UTIL/OTG/otg_externs.h +++ b/openair2/UTIL/OTG/otg_externs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_externs.h * \brief extern parameters * \author n. nikaein A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_form.c b/openair2/UTIL/OTG/otg_form.c index bcad6da091..7eb83b8ce4 100644 --- a/openair2/UTIL/OTG/otg_form.c +++ b/openair2/UTIL/OTG/otg_form.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_config.h main used structures * \brief otg structure * \author A. Hafsaoui and Navid Nikaein diff --git a/openair2/UTIL/OTG/otg_form.h b/openair2/UTIL/OTG/otg_form.h index 475eefe320..e073f41457 100644 --- a/openair2/UTIL/OTG/otg_form.h +++ b/openair2/UTIL/OTG/otg_form.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __OTG_FORM_H__ # define __OTG_FORM_H__ diff --git a/openair2/UTIL/OTG/otg_kpi.c b/openair2/UTIL/OTG/otg_kpi.c index 8b67cb3e64..a056fe2456 100644 --- a/openair2/UTIL/OTG/otg_kpi.c +++ b/openair2/UTIL/OTG/otg_kpi.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_kpi.c main used funstions to compute KPIs * \brief define KPIs to compute for performance analysis * \author Navid Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_kpi.h b/openair2/UTIL/OTG/otg_kpi.h index 4f71e9017c..d3e830fe12 100644 --- a/openair2/UTIL/OTG/otg_kpi.h +++ b/openair2/UTIL/OTG/otg_kpi.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_kpi.h functions to compute OTG KPIs * \brief desribe function for KPIs computation * \author navid nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_models.c b/openair2/UTIL/OTG/otg_models.c index b99f273518..f60cf926fe 100644 --- a/openair2/UTIL/OTG/otg_models.c +++ b/openair2/UTIL/OTG/otg_models.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_models.c * \brief function containing the OTG TX traffic generation functions * \author M. Laner and navid nikaein diff --git a/openair2/UTIL/OTG/otg_models.h b/openair2/UTIL/OTG/otg_models.h index 9b3a2592b5..2e7351f400 100644 --- a/openair2/UTIL/OTG/otg_models.h +++ b/openair2/UTIL/OTG/otg_models.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_models.h * \brief Data structure and functions for OTG * \author M. Laner and navid nikaein diff --git a/openair2/UTIL/OTG/otg_rx.c b/openair2/UTIL/OTG/otg_rx.c index dbbeb6b0f6..95cf19c1bd 100644 --- a/openair2/UTIL/OTG/otg_rx.c +++ b/openair2/UTIL/OTG/otg_rx.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_rx.c * \brief function containing the OTG traffic generation functions * \author Navid Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_rx.h b/openair2/UTIL/OTG/otg_rx.h index 4f279198a0..2f92ab82ce 100644 --- a/openair2/UTIL/OTG/otg_rx.h +++ b/openair2/UTIL/OTG/otg_rx.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_rx.h * \brief Data structure and functions for OTG receiver * \author navid nikaein A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_rx_socket.c b/openair2/UTIL/OTG/otg_rx_socket.c index 77bc7aa8fa..2caeee4f52 100644 --- a/openair2/UTIL/OTG/otg_rx_socket.c +++ b/openair2/UTIL/OTG/otg_rx_socket.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_rx_socket.c * \brief function containing the OTG RX traffic generation functions with sockets * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_rx_socket.h b/openair2/UTIL/OTG/otg_rx_socket.h index d78b18abae..5c64a79008 100644 --- a/openair2/UTIL/OTG/otg_rx_socket.h +++ b/openair2/UTIL/OTG/otg_rx_socket.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_rx_socket.h * \brief brief explain how this block is organized, and how it works: OTG RX traffic generation functions with sockets * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_tx.c b/openair2/UTIL/OTG/otg_tx.c index 6cd4452255..5a2718c02b 100644 --- a/openair2/UTIL/OTG/otg_tx.c +++ b/openair2/UTIL/OTG/otg_tx.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_tx.c * \brief function containing the OTG TX traffic generation functions * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_tx.h b/openair2/UTIL/OTG/otg_tx.h index 5d2fa42efe..51bcfdd41a 100644 --- a/openair2/UTIL/OTG/otg_tx.h +++ b/openair2/UTIL/OTG/otg_tx.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_tx.h * \brief Data structure and functions for OTG * \author N. Nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_tx_socket.c b/openair2/UTIL/OTG/otg_tx_socket.c index 0052bf9127..ae83339509 100644 --- a/openair2/UTIL/OTG/otg_tx_socket.c +++ b/openair2/UTIL/OTG/otg_tx_socket.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_tx_socket.c * \brief function containing the OTG TX traffic generation functions with sockets * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_tx_socket.h b/openair2/UTIL/OTG/otg_tx_socket.h index ef7639eecc..4d9981b802 100644 --- a/openair2/UTIL/OTG/otg_tx_socket.h +++ b/openair2/UTIL/OTG/otg_tx_socket.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_tx_socket.h * \brief brief explain how this block is organized, and how it works: OTG TX traffic generation functions with sockets * \author A. Hafsaoui diff --git a/openair2/UTIL/OTG/otg_vars.h b/openair2/UTIL/OTG/otg_vars.h index 4a91309ef3..1d50084c85 100644 --- a/openair2/UTIL/OTG/otg_vars.h +++ b/openair2/UTIL/OTG/otg_vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file otg_vars.h * \brief Global structure * \author navid nikaein and A. Hafsaoui diff --git a/openair2/UTIL/OTG/traffic_config.h b/openair2/UTIL/OTG/traffic_config.h index 7640f64057..6f7df69e55 100644 --- a/openair2/UTIL/OTG/traffic_config.h +++ b/openair2/UTIL/OTG/traffic_config.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //IDT DISTRIBUTION PARAMETERS #define IDT_DIST GAUSSIAN #define IDT_MIN 2 diff --git a/openair2/UTIL/TIMER/umts_timer.c b/openair2/UTIL/TIMER/umts_timer.c index 97e009e65b..ff21ce8e84 100644 --- a/openair2/UTIL/TIMER/umts_timer.c +++ b/openair2/UTIL/TIMER/umts_timer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** umts_timer.c - description ------------------- diff --git a/openair2/UTIL/TIMER/umts_timer.h b/openair2/UTIL/TIMER/umts_timer.h index ea32e5d7be..d179a471e5 100644 --- a/openair2/UTIL/TIMER/umts_timer.h +++ b/openair2/UTIL/TIMER/umts_timer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** umts_timer.h - description ------------------- diff --git a/openair2/UTIL/TIMER/umts_timer_proto_extern.h b/openair2/UTIL/TIMER/umts_timer_proto_extern.h index a60ad0da6d..807bba8a55 100644 --- a/openair2/UTIL/TIMER/umts_timer_proto_extern.h +++ b/openair2/UTIL/TIMER/umts_timer_proto_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** umts_timer_proto_extern.h - description ------------------- diff --git a/openair2/UTIL/TIMER/umts_timer_struct.h b/openair2/UTIL/TIMER/umts_timer_struct.h index 5aac7a5a88..490a80c4e0 100644 --- a/openair2/UTIL/TIMER/umts_timer_struct.h +++ b/openair2/UTIL/TIMER/umts_timer_struct.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** umts_timer_struct.h - description ------------------- diff --git a/openair2/UTIL/TRACE/fifo_printf.c b/openair2/UTIL/TRACE/fifo_printf.c index 58d12f713f..4548eedd90 100644 --- a/openair2/UTIL/TRACE/fifo_printf.c +++ b/openair2/UTIL/TRACE/fifo_printf.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * fifo_printf.c * ------------------- diff --git a/openair2/UTIL/TRACE/fifo_printf.h b/openair2/UTIL/TRACE/fifo_printf.h index 5925fb5098..92b5ab42ce 100644 --- a/openair2/UTIL/TRACE/fifo_printf.h +++ b/openair2/UTIL/TRACE/fifo_printf.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** fifo_printf.h - description ------------------- diff --git a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h index 2c417d5bda..641af7f224 100644 --- a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h +++ b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** fifo_printf_proto_extern.h - description ------------------- diff --git a/openair2/UTIL/TRACE/print.h b/openair2/UTIL/TRACE/print.h index a7a2f144d2..cd177111fb 100644 --- a/openair2/UTIL/TRACE/print.h +++ b/openair2/UTIL/TRACE/print.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*************************************************************************** print.h - description ------------------- diff --git a/openair2/X2AP/x2ap.c b/openair2/X2AP/x2ap.c index b9a36061aa..699ad5ddbf 100644 --- a/openair2/X2AP/x2ap.c +++ b/openair2/X2AP/x2ap.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/X2AP/x2ap.h b/openair2/X2AP/x2ap.h index 2f82d35a50..6ef98b9909 100644 --- a/openair2/X2AP/x2ap.h +++ b/openair2/X2AP/x2ap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/openair2/X2AP/x2ap_common.c b/openair2/X2AP/x2ap_common.c index 2d6b60c349..2a59414ed9 100644 --- a/openair2/X2AP/x2ap_common.c +++ b/openair2/X2AP/x2ap_common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file x2ap_common.c * \brief x2ap procedures for both eNB and MME * \author Sebastien ROUX , Lionel GAUTHIER diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h index 2e28edba35..0cf2990581 100644 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if HAVE_CONFIG_H_ # include "config.h" #endif diff --git a/openair3/COMMON/common_types.h b/openair3/COMMON/common_types.h index f53e1ca6c7..9036ee8c13 100644 --- a/openair3/COMMON/common_types.h +++ b/openair3/COMMON/common_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "commonDef.h" diff --git a/openair3/COMMON/gtpv1_u_messages_def.h b/openair3/COMMON/gtpv1_u_messages_def.h index 1774923056..eddf95c62b 100644 --- a/openair3/COMMON/gtpv1_u_messages_def.h +++ b/openair3/COMMON/gtpv1_u_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + MESSAGE_DEF(GTPV1U_CREATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, Gtpv1uCreateTunnelReq, gtpv1uCreateTunnelReq) MESSAGE_DEF(GTPV1U_CREATE_TUNNEL_RESP, MESSAGE_PRIORITY_MED, Gtpv1uCreateTunnelResp, gtpv1uCreateTunnelResp) MESSAGE_DEF(GTPV1U_UPDATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, Gtpv1uUpdateTunnelReq, gtpv1uUpdateTunnelReq) diff --git a/openair3/COMMON/gtpv1_u_messages_types.h b/openair3/COMMON/gtpv1_u_messages_types.h index 34182a76fc..f5358941e4 100644 --- a/openair3/COMMON/gtpv1_u_messages_types.h +++ b/openair3/COMMON/gtpv1_u_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef GTPV1_U_MESSAGES_TYPES_H_ #define GTPV1_U_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/intertask_interface_conf.h b/openair3/COMMON/intertask_interface_conf.h index 78dc2dba13..eca0c5d501 100644 --- a/openair3/COMMON/intertask_interface_conf.h +++ b/openair3/COMMON/intertask_interface_conf.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * intertask_interface_conf.h * diff --git a/openair3/COMMON/messages_def.h b/openair3/COMMON/messages_def.h index 66df39e9ad..9e87b26322 100644 --- a/openair3/COMMON/messages_def.h +++ b/openair3/COMMON/messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" #include "timer_messages_def.h" diff --git a/openair3/COMMON/messages_types.h b/openair3/COMMON/messages_types.h index dbf49c7478..8717f2ad4e 100644 --- a/openair3/COMMON/messages_types.h +++ b/openair3/COMMON/messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef MESSAGES_TYPES_H_ #define MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/nas_messages_def.h b/openair3/COMMON/nas_messages_def.h index b19530bdf8..679b997d60 100644 --- a/openair3/COMMON/nas_messages_def.h +++ b/openair3/COMMON/nas_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //WARNING: Do not include this header directly. Use intertask_interface.h instead. // Messages for NAS logging diff --git a/openair3/COMMON/nas_messages_types.h b/openair3/COMMON/nas_messages_types.h index ec843e91f5..7b93e9c617 100644 --- a/openair3/COMMON/nas_messages_types.h +++ b/openair3/COMMON/nas_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "as_message.h" #include "nas_message.h" diff --git a/openair3/COMMON/s1ap_messages_def.h b/openair3/COMMON/s1ap_messages_def.h index b4dc15dcca..e129ecf950 100644 --- a/openair3/COMMON/s1ap_messages_def.h +++ b/openair3/COMMON/s1ap_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //WARNING: Do not include this header directly. Use intertask_interface.h instead. /* Messages for S1AP logging */ diff --git a/openair3/COMMON/s1ap_messages_types.h b/openair3/COMMON/s1ap_messages_types.h index a43b2d8ddf..0558c1711d 100644 --- a/openair3/COMMON/s1ap_messages_types.h +++ b/openair3/COMMON/s1ap_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_MESSAGES_TYPES_H_ #define S1AP_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/sctp_messages_def.h b/openair3/COMMON/sctp_messages_def.h index 54b7a5584c..937bf09dd3 100644 --- a/openair3/COMMON/sctp_messages_def.h +++ b/openair3/COMMON/sctp_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //WARNING: Do not include this header directly. Use intertask_interface.h instead. MESSAGE_DEF(SCTP_INIT_MSG, MESSAGE_PRIORITY_MED, SctpInit, sctpInit) diff --git a/openair3/COMMON/sctp_messages_types.h b/openair3/COMMON/sctp_messages_types.h index 70d7014c39..459cff5d40 100644 --- a/openair3/COMMON/sctp_messages_types.h +++ b/openair3/COMMON/sctp_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef SCTP_MESSAGES_TYPES_H_ #define SCTP_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/security_types.h b/openair3/COMMON/security_types.h index 7feb7540c0..bc64e32ded 100644 --- a/openair3/COMMON/security_types.h +++ b/openair3/COMMON/security_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair3/COMMON/tasks_def.h b/openair3/COMMON/tasks_def.h index 8db2390325..9124e0193c 100644 --- a/openair3/COMMON/tasks_def.h +++ b/openair3/COMMON/tasks_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10) diff --git a/openair3/COMMON/udp_messages_def.h b/openair3/COMMON/udp_messages_def.h index 08e98b801e..41b5e8aa52 100644 --- a/openair3/COMMON/udp_messages_def.h +++ b/openair3/COMMON/udp_messages_def.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + MESSAGE_DEF(UDP_INIT, MESSAGE_PRIORITY_MED, udp_init_t, udp_init) MESSAGE_DEF(UDP_DATA_REQ, MESSAGE_PRIORITY_MED, udp_data_req_t, udp_data_req) MESSAGE_DEF(UDP_DATA_IND, MESSAGE_PRIORITY_MED, udp_data_ind_t, udp_data_ind) diff --git a/openair3/COMMON/udp_messages_types.h b/openair3/COMMON/udp_messages_types.h index d609cb8d14..1ec878782a 100644 --- a/openair3/COMMON/udp_messages_types.h +++ b/openair3/COMMON/udp_messages_types.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef UDP_MESSAGES_TYPES_H_ #define UDP_MESSAGES_TYPES_H_ diff --git a/openair3/GTPV1-U/gtpv1u.h b/openair3/GTPV1-U/gtpv1u.h index 4b4158cde7..9f2f65db9a 100644 --- a/openair3/GTPV1-U/gtpv1u.h +++ b/openair3/GTPV1-U/gtpv1u.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file gtpv1u.h * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c index 8d1f0cf245..e273ac0712 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB.c +++ b/openair3/GTPV1-U/gtpv1u_eNB.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file gtpv1u_eNB.c * \brief * \author Sebastien ROUX, Lionel GAUTHIER, Navid Nikaein diff --git a/openair3/GTPV1-U/gtpv1u_eNB_defs.h b/openair3/GTPV1-U/gtpv1u_eNB_defs.h index e5931c677a..91f045ace2 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB_defs.h +++ b/openair3/GTPV1-U/gtpv1u_eNB_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file gtpv1u_eNB_defs.h * \brief * \author Sebastien ROUX, Lionel GAUTHIER diff --git a/openair3/GTPV1-U/gtpv1u_eNB_task.h b/openair3/GTPV1-U/gtpv1u_eNB_task.h index ae726221eb..d69917aea3 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB_task.h +++ b/openair3/GTPV1-U/gtpv1u_eNB_task.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file gtpv1u_eNB_task.h * \brief * \author Lionel Gauthier diff --git a/openair3/GTPV1-U/gtpv1u_sgw_defs.h b/openair3/GTPV1-U/gtpv1u_sgw_defs.h index 59c50d4eda..218d0df96f 100644 --- a/openair3/GTPV1-U/gtpv1u_sgw_defs.h +++ b/openair3/GTPV1-U/gtpv1u_sgw_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef GTPV1U_SGW_DEFS_H_ #define GTPV1U_SGW_DEFS_H_ diff --git a/openair3/GTPV1-U/gtpv1u_task.c b/openair3/GTPV1-U/gtpv1u_task.c index 3aa01c837c..f9397f21ca 100644 --- a/openair3/GTPV1-U/gtpv1u_task.c +++ b/openair3/GTPV1-U/gtpv1u_task.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file gtpv1u_task.c * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/GTPV1-U/gtpv1u_teid_pool.c b/openair3/GTPV1-U/gtpv1u_teid_pool.c index fc012b3ad2..6596a2b9a9 100644 --- a/openair3/GTPV1-U/gtpv1u_teid_pool.c +++ b/openair3/GTPV1-U/gtpv1u_teid_pool.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file gtpv1u_task.c * \brief * \author Lionel Gauthier diff --git a/openair3/NAS/COMMON/API/NETWORK/as_message.c b/openair3/NAS/COMMON/API/NETWORK/as_message.c index 12ca5d4506..201ed441f3 100644 --- a/openair3/NAS/COMMON/API/NETWORK/as_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/as_message.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source as_message.c diff --git a/openair3/NAS/COMMON/API/NETWORK/l2_message.h b/openair3/NAS/COMMON/API/NETWORK/l2_message.h index 5ff4125db9..b6ad3727cc 100644 --- a/openair3/NAS/COMMON/API/NETWORK/l2_message.h +++ b/openair3/NAS/COMMON/API/NETWORK/l2_message.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source as_message.h diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index fb4f4988ba..b571c17d38 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_message.h diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.h b/openair3/NAS/COMMON/API/NETWORK/nas_message.h index 532fb55556..8094d31298 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.h +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_message.h diff --git a/openair3/NAS/COMMON/API/NETWORK/network_api.c b/openair3/NAS/COMMON/API/NETWORK/network_api.c index 2189e3941c..a9d5c48547 100644 --- a/openair3/NAS/COMMON/API/NETWORK/network_api.c +++ b/openair3/NAS/COMMON/API/NETWORK/network_api.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source network_api.c diff --git a/openair3/NAS/COMMON/API/NETWORK/network_api.h b/openair3/NAS/COMMON/API/NETWORK/network_api.h index ca519f597a..22bf0f426e 100644 --- a/openair3/NAS/COMMON/API/NETWORK/network_api.h +++ b/openair3/NAS/COMMON/API/NETWORK/network_api.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source network_api.h diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c index 9dc5678d2f..cec2d16977 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h index 1c3c341eb2..ced696afdb 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c index 98b7518806..80479b58c3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h index 3d90d7946e..309726b925 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachReject.c b/openair3/NAS/COMMON/EMM/MSG/AttachReject.c index 832364777a..a15c6b624c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachReject.h b/openair3/NAS/COMMON/EMM/MSG/AttachReject.h index 5c2217ed79..d5803baec2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c index 25a5b9f041..7c50d2fcdd 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h index 33077e62d7..caa19922ae 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c index f940b041df..7b01d0f5ab 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h index b14f157da3..384f51471c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c index fe74ed39a5..dd848aef2e 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h index 075fc04930..5b468dcf25 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c index 47163a3ac4..fac93c5df3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h index 7ff59c3fd2..e7cdc04017 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c index ee1d818921..4b870c6200 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h index 286eef92ed..710a43f043 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c index dc7e4aa502..0d5a336eef 100644 --- a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c +++ b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h index 80d61f669e..48e6aaec75 100644 --- a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h +++ b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c index 9d3c0751ea..c31550fdca 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h index 2825fe6d28..48e8e674e9 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c index e57468b252..6c84e7d4d3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h index d6cf76ceac..557d5117eb 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c index ebe2655b12..b020f77af3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c +++ b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h index c0a2ffaea8..a9d926bb05 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h +++ b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c index 371e83044e..e9d4400d5f 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c +++ b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h index cc22207e44..cdbc22f201 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h +++ b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c index 5302393710..a46467e099 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c +++ b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h index f971eebf74..0fcd912218 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h +++ b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c index ed89e04a87..33e05d2b3b 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h index f004fa32aa..291d757996 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c index 77ec3104d3..624829b8aa 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h index b9d491cae2..3ab7bd9cea 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c index 4abe6b8aa8..6c7db3a437 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h index 3233a14083..7c8393e2f5 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c index 3614afb681..1397dcaee7 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h index 60396cdba5..81c01b24c9 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c index f029f8f0eb..25b5933927 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h index c08b2d03a5..aeee34fe72 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h index 4a06fef765..b1b7fd81de 100644 --- a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h +++ b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h index 9318881663..a014e4d3bc 100644 --- a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c index 2a74db4a6e..aeec3d4024 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c index a918c2d79a..f10401d09a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c index 03917a7fbc..76fad512d0 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h index ebb4eacfce..cef69ef61a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c index 97e956c6a8..0008a23720 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h index a338d72ea3..42929ac868 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c index 477886097c..944cffdb4c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h index a22084177e..5ad605fa83 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c index 9f546766d1..36894d1006 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h index 20efc8b886..5a3dae34b3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c index 5efe49c831..5f504a503d 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h index d418ea5d19..c26f0508b6 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c index 9fbd7f0de8..354262452b 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h index f7bf2d0bc3..9b23b6fc1c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c index 3493ce9c8a..bc5bb351d8 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h index 894a1b39f4..2a5a36fc0a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c index ee1b989431..fe6244b942 100644 --- a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c +++ b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h index db1be7de4c..3c2522f623 100644 --- a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h +++ b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_cause.h b/openair3/NAS/COMMON/EMM/MSG/emm_cause.h index e022cb26de..2f65e2b11b 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_cause.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_cause.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_cause.h diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msg.c b/openair3/NAS/COMMON/EMM/MSG/emm_msg.c index 8167472754..b067b9c0d1 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msg.c +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_msg.c diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msg.h b/openair3/NAS/COMMON/EMM/MSG/emm_msg.h index 0a8fce11dc..29f9975716 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msg.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msg.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_msg.h diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h b/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h index f0038057d7..a5f114184b 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Version 0.1 diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c index 2adaf96088..af2da7d1ba 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h index 57380f70f2..b248f2b9bd 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c index cfedffc028..63552adcae 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h index f0700bc2a2..7ff7b761cc 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c index 3b7197fc47..0797001e8a 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h index d41eb9031f..574a72a7c9 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c index 15bc20e50f..8b58c38b5f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h index 613552ae26..574b258feb 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c index f149bc8478..e9a902ca94 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h index 9c9fe4d62c..9c74a869ed 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c index 52f077e3f4..02f293e9f0 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h index a1043afd10..56e305fb74 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c index 1cbe9be70d..a81a6325ce 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h index 720e1eabbe..d7cec7bfbe 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c index 98b7a7add9..3696012d7f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h index 0d5e141007..5428b03d51 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c index 932edd62c4..b0b143857b 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h index 261a026701..26daab2c11 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c index 5bab619e85..2357006ef5 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h index d76cebd06a..fda843206f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c index d0447b242f..6f958d1498 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h index 670202506a..c2aac073eb 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c index dc62843bb5..4854d2bd98 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h index 90b683962b..4f86c50a6c 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c index 0489a96f55..862046dc0e 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h index 3acb855c80..20c668449b 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c index 0dbc04897f..287e3efcb2 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h index 7784cb3963..fbb4954290 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c index 6756d64472..0538722291 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h index af95bb6497..125a50305f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c index 21c7cd009a..2fe1444d51 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h index 73bcc1a41b..8891de5954 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c index 7a52a5b3c1..6c76f6c52d 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h index 6084cbff0d..959fd2185d 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c index 1c7bf72e09..b9cbdefbb2 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h index 01a442a9ff..456d70d90f 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c index b1c4a60708..8658a85038 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h index 5551d7dd6a..b595e14f21 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c index b3be546076..f5b8443064 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h index 5e273821dc..ca28ea78b5 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c index a4ab4f3db4..668c34d872 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h index e4c7dea2d2..c183e8ebe8 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c index 05294bbd94..ee53ed7baa 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h index f3835ab466..c8913e1db0 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_cause.h b/openair3/NAS/COMMON/ESM/MSG/esm_cause.h index 278e271881..04ff141d2c 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_cause.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_cause.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_cause.h diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msg.c b/openair3/NAS/COMMON/ESM/MSG/esm_msg.c index 55c449b7bf..e5bf603591 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msg.c +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_msg.c diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msg.h b/openair3/NAS/COMMON/ESM/MSG/esm_msg.h index cab4750c34..410460ca1c 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msg.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msg.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_msg.h diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h b/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h index 24f358a2bb..2dddfbfadd 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Version 0.1 diff --git a/openair3/NAS/COMMON/IES/AccessPointName.c b/openair3/NAS/COMMON/IES/AccessPointName.c index e9b6a0fa34..43446270c9 100644 --- a/openair3/NAS/COMMON/IES/AccessPointName.c +++ b/openair3/NAS/COMMON/IES/AccessPointName.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AccessPointName.h b/openair3/NAS/COMMON/IES/AccessPointName.h index 1bc4d4769c..f0d20d199b 100644 --- a/openair3/NAS/COMMON/IES/AccessPointName.h +++ b/openair3/NAS/COMMON/IES/AccessPointName.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c index 03a03db34f..f5208d3ff6 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h index d4857e34a0..448e7c3fe2 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateType.c b/openair3/NAS/COMMON/IES/AdditionalUpdateType.c index efad938f1d..48e7fb5676 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateType.c +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateType.h b/openair3/NAS/COMMON/IES/AdditionalUpdateType.h index 7720f9dea4..b5729f0c9d 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateType.h +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c index 20c1b65f72..cedc75b82c 100644 --- a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c +++ b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h index 39e09f73ad..24823b4006 100644 --- a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h +++ b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c index 43e5bac364..e0f016ba6a 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c +++ b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h index f466563a26..24624d3c8c 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h +++ b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c index ad55d5e279..1cb31c9406 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h index 01b0adbf86..2e5e51461b 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c index 1e96da4b9f..c355eb5469 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h index 1178835d11..45aea0affc 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c index 39b643dc78..46cda8adbc 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c +++ b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h index 59b786c845..0ed254119b 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h +++ b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c index 51ddc36e3c..dd59717b06 100644 --- a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c +++ b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h index 8be169f528..cbcde08fb5 100644 --- a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h +++ b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/Cli.c b/openair3/NAS/COMMON/IES/Cli.c index 1e3674ca17..92ed87c020 100644 --- a/openair3/NAS/COMMON/IES/Cli.c +++ b/openair3/NAS/COMMON/IES/Cli.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/Cli.h b/openair3/NAS/COMMON/IES/Cli.h index cd7e89a859..f1c8809c3c 100644 --- a/openair3/NAS/COMMON/IES/Cli.h +++ b/openair3/NAS/COMMON/IES/Cli.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/CsfbResponse.c b/openair3/NAS/COMMON/IES/CsfbResponse.c index a7ccf8d457..3cb05e0e8a 100644 --- a/openair3/NAS/COMMON/IES/CsfbResponse.c +++ b/openair3/NAS/COMMON/IES/CsfbResponse.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/CsfbResponse.h b/openair3/NAS/COMMON/IES/CsfbResponse.h index d39deb17aa..78d984bf5a 100644 --- a/openair3/NAS/COMMON/IES/CsfbResponse.h +++ b/openair3/NAS/COMMON/IES/CsfbResponse.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DaylightSavingTime.c b/openair3/NAS/COMMON/IES/DaylightSavingTime.c index c4e8d88ded..70fc1d199d 100644 --- a/openair3/NAS/COMMON/IES/DaylightSavingTime.c +++ b/openair3/NAS/COMMON/IES/DaylightSavingTime.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DaylightSavingTime.h b/openair3/NAS/COMMON/IES/DaylightSavingTime.h index df65d9d66c..3830fdce3a 100644 --- a/openair3/NAS/COMMON/IES/DaylightSavingTime.h +++ b/openair3/NAS/COMMON/IES/DaylightSavingTime.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DetachType.c b/openair3/NAS/COMMON/IES/DetachType.c index f827517763..7ff9320008 100644 --- a/openair3/NAS/COMMON/IES/DetachType.c +++ b/openair3/NAS/COMMON/IES/DetachType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DetachType.h b/openair3/NAS/COMMON/IES/DetachType.h index 5daa624843..e84a57d19d 100644 --- a/openair3/NAS/COMMON/IES/DetachType.h +++ b/openair3/NAS/COMMON/IES/DetachType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DrxParameter.c b/openair3/NAS/COMMON/IES/DrxParameter.c index bb16f40d1e..9b607f0e79 100644 --- a/openair3/NAS/COMMON/IES/DrxParameter.c +++ b/openair3/NAS/COMMON/IES/DrxParameter.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DrxParameter.h b/openair3/NAS/COMMON/IES/DrxParameter.h index 0197901b5e..e6d4aa284d 100644 --- a/openair3/NAS/COMMON/IES/DrxParameter.h +++ b/openair3/NAS/COMMON/IES/DrxParameter.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmergencyNumberList.c b/openair3/NAS/COMMON/IES/EmergencyNumberList.c index f44bdfa139..39b59ef0ca 100644 --- a/openair3/NAS/COMMON/IES/EmergencyNumberList.c +++ b/openair3/NAS/COMMON/IES/EmergencyNumberList.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmergencyNumberList.h b/openair3/NAS/COMMON/IES/EmergencyNumberList.h index 96576b6135..d2fd149dc0 100644 --- a/openair3/NAS/COMMON/IES/EmergencyNumberList.h +++ b/openair3/NAS/COMMON/IES/EmergencyNumberList.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmmCause.c b/openair3/NAS/COMMON/IES/EmmCause.c index 9b2f4415dc..21e52fe2cf 100644 --- a/openair3/NAS/COMMON/IES/EmmCause.c +++ b/openair3/NAS/COMMON/IES/EmmCause.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmmCause.h b/openair3/NAS/COMMON/IES/EmmCause.h index ed0367ea88..584c23d930 100644 --- a/openair3/NAS/COMMON/IES/EmmCause.h +++ b/openair3/NAS/COMMON/IES/EmmCause.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachResult.c b/openair3/NAS/COMMON/IES/EpsAttachResult.c index bc860886d1..b4d51663c9 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachResult.c +++ b/openair3/NAS/COMMON/IES/EpsAttachResult.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachResult.h b/openair3/NAS/COMMON/IES/EpsAttachResult.h index 966228ff94..78e04ccf65 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachResult.h +++ b/openair3/NAS/COMMON/IES/EpsAttachResult.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachType.c b/openair3/NAS/COMMON/IES/EpsAttachType.c index fb069f6d8e..8c9635ea6b 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachType.c +++ b/openair3/NAS/COMMON/IES/EpsAttachType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachType.h b/openair3/NAS/COMMON/IES/EpsAttachType.h index 318fe40978..c6c9ffc236 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachType.h +++ b/openair3/NAS/COMMON/IES/EpsAttachType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c index b2adf40d06..ff21a2dc4b 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c +++ b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h index 7116eeff5d..8c0b475559 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h +++ b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerIdentity.c b/openair3/NAS/COMMON/IES/EpsBearerIdentity.c index 27d1fe6467..84d83ea09b 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerIdentity.c +++ b/openair3/NAS/COMMON/IES/EpsBearerIdentity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerIdentity.h b/openair3/NAS/COMMON/IES/EpsBearerIdentity.h index 417437dc4f..24f0c10608 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerIdentity.h +++ b/openair3/NAS/COMMON/IES/EpsBearerIdentity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsMobileIdentity.c b/openair3/NAS/COMMON/IES/EpsMobileIdentity.c index cdac294f60..3d40801fec 100644 --- a/openair3/NAS/COMMON/IES/EpsMobileIdentity.c +++ b/openair3/NAS/COMMON/IES/EpsMobileIdentity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsMobileIdentity.h b/openair3/NAS/COMMON/IES/EpsMobileIdentity.h index d4b792d625..7a1ff393c5 100644 --- a/openair3/NAS/COMMON/IES/EpsMobileIdentity.h +++ b/openair3/NAS/COMMON/IES/EpsMobileIdentity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c index 8368546320..5f018143b5 100644 --- a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c +++ b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h index 108de972ae..59e84a323b 100644 --- a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h +++ b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsQualityOfService.c b/openair3/NAS/COMMON/IES/EpsQualityOfService.c index b35e37ac80..b24e43e99c 100644 --- a/openair3/NAS/COMMON/IES/EpsQualityOfService.c +++ b/openair3/NAS/COMMON/IES/EpsQualityOfService.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsQualityOfService.h b/openair3/NAS/COMMON/IES/EpsQualityOfService.h index 2229066b04..f4c5c5986e 100644 --- a/openair3/NAS/COMMON/IES/EpsQualityOfService.h +++ b/openair3/NAS/COMMON/IES/EpsQualityOfService.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateResult.c b/openair3/NAS/COMMON/IES/EpsUpdateResult.c index 3e1f6eba5e..feecb5e37d 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateResult.c +++ b/openair3/NAS/COMMON/IES/EpsUpdateResult.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateResult.h b/openair3/NAS/COMMON/IES/EpsUpdateResult.h index 48f4471e91..019ac7a069 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateResult.h +++ b/openair3/NAS/COMMON/IES/EpsUpdateResult.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateType.c b/openair3/NAS/COMMON/IES/EpsUpdateType.c index 6c86eb6b0f..7319cb5fe6 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateType.c +++ b/openair3/NAS/COMMON/IES/EpsUpdateType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateType.h b/openair3/NAS/COMMON/IES/EpsUpdateType.h index 40202ae90c..6bad9e064b 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateType.h +++ b/openair3/NAS/COMMON/IES/EpsUpdateType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmCause.c b/openair3/NAS/COMMON/IES/EsmCause.c index 4e23353edb..ba75d7b564 100644 --- a/openair3/NAS/COMMON/IES/EsmCause.c +++ b/openair3/NAS/COMMON/IES/EsmCause.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmCause.h b/openair3/NAS/COMMON/IES/EsmCause.h index df44cc7770..b405f6cd62 100644 --- a/openair3/NAS/COMMON/IES/EsmCause.h +++ b/openair3/NAS/COMMON/IES/EsmCause.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c index 9ff38d0be2..4ec00315fe 100644 --- a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c +++ b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h index f9961bdd5a..c8ec26041f 100644 --- a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h +++ b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmMessageContainer.c b/openair3/NAS/COMMON/IES/EsmMessageContainer.c index 734025b694..1a7f88d299 100644 --- a/openair3/NAS/COMMON/IES/EsmMessageContainer.c +++ b/openair3/NAS/COMMON/IES/EsmMessageContainer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmMessageContainer.h b/openair3/NAS/COMMON/IES/EsmMessageContainer.h index 87bd26cc5d..c57f60a92b 100644 --- a/openair3/NAS/COMMON/IES/EsmMessageContainer.h +++ b/openair3/NAS/COMMON/IES/EsmMessageContainer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/GprsTimer.c b/openair3/NAS/COMMON/IES/GprsTimer.c index 3d856c6ea9..e2bc6ca369 100644 --- a/openair3/NAS/COMMON/IES/GprsTimer.c +++ b/openair3/NAS/COMMON/IES/GprsTimer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/GprsTimer.h b/openair3/NAS/COMMON/IES/GprsTimer.h index 0f7fc89066..104af63a16 100644 --- a/openair3/NAS/COMMON/IES/GprsTimer.h +++ b/openair3/NAS/COMMON/IES/GprsTimer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/GutiType.c b/openair3/NAS/COMMON/IES/GutiType.c index 095d8948b1..e5ecbdabcc 100644 --- a/openair3/NAS/COMMON/IES/GutiType.c +++ b/openair3/NAS/COMMON/IES/GutiType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/GutiType.h b/openair3/NAS/COMMON/IES/GutiType.h index 17d8ce9e2d..b4230ead52 100644 --- a/openair3/NAS/COMMON/IES/GutiType.h +++ b/openair3/NAS/COMMON/IES/GutiType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/IdentityType2.c b/openair3/NAS/COMMON/IES/IdentityType2.c index d22ac329bf..96d1e5a8a0 100644 --- a/openair3/NAS/COMMON/IES/IdentityType2.c +++ b/openair3/NAS/COMMON/IES/IdentityType2.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/IdentityType2.h b/openair3/NAS/COMMON/IES/IdentityType2.h index 9472c7a7b7..e7b8c80cc7 100644 --- a/openair3/NAS/COMMON/IES/IdentityType2.h +++ b/openair3/NAS/COMMON/IES/IdentityType2.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ImeisvRequest.c b/openair3/NAS/COMMON/IES/ImeisvRequest.c index d5723d9fa2..208d417e8f 100644 --- a/openair3/NAS/COMMON/IES/ImeisvRequest.c +++ b/openair3/NAS/COMMON/IES/ImeisvRequest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ImeisvRequest.h b/openair3/NAS/COMMON/IES/ImeisvRequest.h index 5187a6126c..2819844ea8 100644 --- a/openair3/NAS/COMMON/IES/ImeisvRequest.h +++ b/openair3/NAS/COMMON/IES/ImeisvRequest.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c index afb1bfead5..640c24fc1d 100644 --- a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c +++ b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h index 42a0aecf0a..7890e3f8f3 100644 --- a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h +++ b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsClientIdentity.c b/openair3/NAS/COMMON/IES/LcsClientIdentity.c index 9369f06f86..62a7a82feb 100644 --- a/openair3/NAS/COMMON/IES/LcsClientIdentity.c +++ b/openair3/NAS/COMMON/IES/LcsClientIdentity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsClientIdentity.h b/openair3/NAS/COMMON/IES/LcsClientIdentity.h index 798a4fb232..72089b6b91 100644 --- a/openair3/NAS/COMMON/IES/LcsClientIdentity.h +++ b/openair3/NAS/COMMON/IES/LcsClientIdentity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsIndicator.c b/openair3/NAS/COMMON/IES/LcsIndicator.c index d839cbaed4..4d17629bff 100644 --- a/openair3/NAS/COMMON/IES/LcsIndicator.c +++ b/openair3/NAS/COMMON/IES/LcsIndicator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsIndicator.h b/openair3/NAS/COMMON/IES/LcsIndicator.h index 3b866d8c8e..b8c018127f 100644 --- a/openair3/NAS/COMMON/IES/LcsIndicator.h +++ b/openair3/NAS/COMMON/IES/LcsIndicator.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c index 59c2e2a198..d2acc5dffe 100644 --- a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c +++ b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h index a231525112..4d8cb883e2 100644 --- a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h +++ b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c index 5d42d206a6..53b0e91cc3 100644 --- a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c +++ b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h index ef8f0b3c0a..46cd6a4e24 100644 --- a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h +++ b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LocationAreaIdentification.c b/openair3/NAS/COMMON/IES/LocationAreaIdentification.c index 29dada8b6c..17c1053559 100644 --- a/openair3/NAS/COMMON/IES/LocationAreaIdentification.c +++ b/openair3/NAS/COMMON/IES/LocationAreaIdentification.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LocationAreaIdentification.h b/openair3/NAS/COMMON/IES/LocationAreaIdentification.h index 848e129ecd..b3027d0d92 100644 --- a/openair3/NAS/COMMON/IES/LocationAreaIdentification.h +++ b/openair3/NAS/COMMON/IES/LocationAreaIdentification.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MessageType.c b/openair3/NAS/COMMON/IES/MessageType.c index 146f61a295..7874187dc3 100644 --- a/openair3/NAS/COMMON/IES/MessageType.c +++ b/openair3/NAS/COMMON/IES/MessageType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MessageType.h b/openair3/NAS/COMMON/IES/MessageType.h index cb96e8e489..2af029093c 100644 --- a/openair3/NAS/COMMON/IES/MessageType.h +++ b/openair3/NAS/COMMON/IES/MessageType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileIdentity.c b/openair3/NAS/COMMON/IES/MobileIdentity.c index f716d525ac..7ab30011ce 100644 --- a/openair3/NAS/COMMON/IES/MobileIdentity.c +++ b/openair3/NAS/COMMON/IES/MobileIdentity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileIdentity.h b/openair3/NAS/COMMON/IES/MobileIdentity.h index 6ed4539e88..8d1c5cdbe5 100644 --- a/openair3/NAS/COMMON/IES/MobileIdentity.h +++ b/openair3/NAS/COMMON/IES/MobileIdentity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark2.c b/openair3/NAS/COMMON/IES/MobileStationClassmark2.c index b0c3d02977..3707bbd636 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark2.c +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark2.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark2.h b/openair3/NAS/COMMON/IES/MobileStationClassmark2.h index 85db61dc34..55c40474d1 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark2.h +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark2.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark3.c b/openair3/NAS/COMMON/IES/MobileStationClassmark3.c index 8c8f425742..c9d6e37d84 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark3.c +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark3.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark3.h b/openair3/NAS/COMMON/IES/MobileStationClassmark3.h index 77e2658f9c..c3f199b291 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark3.h +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark3.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkCapability.c b/openair3/NAS/COMMON/IES/MsNetworkCapability.c index bbd8da70e6..770270934f 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkCapability.c +++ b/openair3/NAS/COMMON/IES/MsNetworkCapability.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkCapability.h b/openair3/NAS/COMMON/IES/MsNetworkCapability.h index adbb4e6646..8572cc6d47 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkCapability.h +++ b/openair3/NAS/COMMON/IES/MsNetworkCapability.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c index 36a170cec7..e96537ab16 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c +++ b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h index 69e6bc24ba..84f20ed65d 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h +++ b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c index dcb2b87ed4..276953e343 100644 --- a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c +++ b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h index d5c890f436..3206ef1e9b 100644 --- a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h +++ b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasMessageContainer.c b/openair3/NAS/COMMON/IES/NasMessageContainer.c index d4ad6a0dbf..8847023c42 100644 --- a/openair3/NAS/COMMON/IES/NasMessageContainer.c +++ b/openair3/NAS/COMMON/IES/NasMessageContainer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasMessageContainer.h b/openair3/NAS/COMMON/IES/NasMessageContainer.h index 15ef69a131..8f53a0a7e5 100644 --- a/openair3/NAS/COMMON/IES/NasMessageContainer.h +++ b/openair3/NAS/COMMON/IES/NasMessageContainer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasRequestType.c b/openair3/NAS/COMMON/IES/NasRequestType.c index 116a25c3e1..0bbe9ff3a8 100644 --- a/openair3/NAS/COMMON/IES/NasRequestType.c +++ b/openair3/NAS/COMMON/IES/NasRequestType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasRequestType.h b/openair3/NAS/COMMON/IES/NasRequestType.h index 58daa10d59..3f98a8ffd3 100644 --- a/openair3/NAS/COMMON/IES/NasRequestType.h +++ b/openair3/NAS/COMMON/IES/NasRequestType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c index 22d8012e91..24e0d21f68 100644 --- a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c +++ b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h index fd1f7d5845..9008c023b1 100644 --- a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h +++ b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NetworkName.c b/openair3/NAS/COMMON/IES/NetworkName.c index 271171ed98..3516e5b739 100644 --- a/openair3/NAS/COMMON/IES/NetworkName.c +++ b/openair3/NAS/COMMON/IES/NetworkName.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NetworkName.h b/openair3/NAS/COMMON/IES/NetworkName.h index 836b4eebfb..b403edc337 100644 --- a/openair3/NAS/COMMON/IES/NetworkName.h +++ b/openair3/NAS/COMMON/IES/NetworkName.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/Nonce.c b/openair3/NAS/COMMON/IES/Nonce.c index b32d75699e..97b5c40010 100644 --- a/openair3/NAS/COMMON/IES/Nonce.c +++ b/openair3/NAS/COMMON/IES/Nonce.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/Nonce.h b/openair3/NAS/COMMON/IES/Nonce.h index 0e8f9441a4..d4df86b98b 100644 --- a/openair3/NAS/COMMON/IES/Nonce.h +++ b/openair3/NAS/COMMON/IES/Nonce.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PTmsiSignature.c b/openair3/NAS/COMMON/IES/PTmsiSignature.c index bedc5a531b..be37f869d7 100644 --- a/openair3/NAS/COMMON/IES/PTmsiSignature.c +++ b/openair3/NAS/COMMON/IES/PTmsiSignature.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PTmsiSignature.h b/openair3/NAS/COMMON/IES/PTmsiSignature.h index f3fa46db1e..70023fa92d 100644 --- a/openair3/NAS/COMMON/IES/PTmsiSignature.h +++ b/openair3/NAS/COMMON/IES/PTmsiSignature.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c index f9e26f7663..f19ba0547b 100644 --- a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c +++ b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h index 2174b5e2f3..ffdb70b321 100644 --- a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h +++ b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PagingIdentity.c b/openair3/NAS/COMMON/IES/PagingIdentity.c index 656a8b6d0f..e970f51d20 100644 --- a/openair3/NAS/COMMON/IES/PagingIdentity.c +++ b/openair3/NAS/COMMON/IES/PagingIdentity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PagingIdentity.h b/openair3/NAS/COMMON/IES/PagingIdentity.h index 8b05345461..4f104400d3 100644 --- a/openair3/NAS/COMMON/IES/PagingIdentity.h +++ b/openair3/NAS/COMMON/IES/PagingIdentity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnAddress.c b/openair3/NAS/COMMON/IES/PdnAddress.c index 18090bcb1f..797b9472d8 100644 --- a/openair3/NAS/COMMON/IES/PdnAddress.c +++ b/openair3/NAS/COMMON/IES/PdnAddress.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnAddress.h b/openair3/NAS/COMMON/IES/PdnAddress.h index 3aa9b62a27..ee4fcd7e98 100644 --- a/openair3/NAS/COMMON/IES/PdnAddress.h +++ b/openair3/NAS/COMMON/IES/PdnAddress.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnType.c b/openair3/NAS/COMMON/IES/PdnType.c index 09c6a6edc1..c01baa1dd3 100644 --- a/openair3/NAS/COMMON/IES/PdnType.c +++ b/openair3/NAS/COMMON/IES/PdnType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnType.h b/openair3/NAS/COMMON/IES/PdnType.h index b56de6ce90..30d82f4a6a 100644 --- a/openair3/NAS/COMMON/IES/PdnType.h +++ b/openair3/NAS/COMMON/IES/PdnType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PlmnList.c b/openair3/NAS/COMMON/IES/PlmnList.c index d4528f1cad..ebaf5465ac 100644 --- a/openair3/NAS/COMMON/IES/PlmnList.c +++ b/openair3/NAS/COMMON/IES/PlmnList.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PlmnList.h b/openair3/NAS/COMMON/IES/PlmnList.h index 4cc8abce4d..aa95673f67 100644 --- a/openair3/NAS/COMMON/IES/PlmnList.h +++ b/openair3/NAS/COMMON/IES/PlmnList.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c index 940dc5e57d..09d4cbe310 100644 --- a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c +++ b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h index b2cf5aa442..7aea7adae1 100644 --- a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h +++ b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c index 2c252b2d87..006aa61e8e 100644 --- a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c +++ b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h index 8ee53e1253..71f989992c 100644 --- a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h +++ b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c index c006e43ab6..6e1d6bd875 100644 --- a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c +++ b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h index 38d0a6324c..32cf11a28a 100644 --- a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h +++ b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/QualityOfService.c b/openair3/NAS/COMMON/IES/QualityOfService.c index ebebfe3658..fff8130082 100644 --- a/openair3/NAS/COMMON/IES/QualityOfService.c +++ b/openair3/NAS/COMMON/IES/QualityOfService.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/QualityOfService.h b/openair3/NAS/COMMON/IES/QualityOfService.h index 0e55e5db2a..53f0e9e763 100644 --- a/openair3/NAS/COMMON/IES/QualityOfService.h +++ b/openair3/NAS/COMMON/IES/QualityOfService.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/RadioPriority.c b/openair3/NAS/COMMON/IES/RadioPriority.c index e2075395d4..c41b05cec9 100644 --- a/openair3/NAS/COMMON/IES/RadioPriority.c +++ b/openair3/NAS/COMMON/IES/RadioPriority.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/RadioPriority.h b/openair3/NAS/COMMON/IES/RadioPriority.h index fb9f0880ac..bbf3ac4450 100644 --- a/openair3/NAS/COMMON/IES/RadioPriority.h +++ b/openair3/NAS/COMMON/IES/RadioPriority.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SecurityHeaderType.c b/openair3/NAS/COMMON/IES/SecurityHeaderType.c index ecff67f2c8..75ae311db2 100644 --- a/openair3/NAS/COMMON/IES/SecurityHeaderType.c +++ b/openair3/NAS/COMMON/IES/SecurityHeaderType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SecurityHeaderType.h b/openair3/NAS/COMMON/IES/SecurityHeaderType.h index 227ffa68b4..ee7635b391 100644 --- a/openair3/NAS/COMMON/IES/SecurityHeaderType.h +++ b/openair3/NAS/COMMON/IES/SecurityHeaderType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ServiceType.c b/openair3/NAS/COMMON/IES/ServiceType.c index cc29088178..6ced7364c8 100644 --- a/openair3/NAS/COMMON/IES/ServiceType.c +++ b/openair3/NAS/COMMON/IES/ServiceType.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ServiceType.h b/openair3/NAS/COMMON/IES/ServiceType.h index 60e41d80f0..40778f82a6 100644 --- a/openair3/NAS/COMMON/IES/ServiceType.h +++ b/openair3/NAS/COMMON/IES/ServiceType.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ShortMac.c b/openair3/NAS/COMMON/IES/ShortMac.c index 57a1c77b16..4b7aff1a76 100644 --- a/openair3/NAS/COMMON/IES/ShortMac.c +++ b/openair3/NAS/COMMON/IES/ShortMac.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ShortMac.h b/openair3/NAS/COMMON/IES/ShortMac.h index 134a3fcb23..67ff8adf60 100644 --- a/openair3/NAS/COMMON/IES/ShortMac.h +++ b/openair3/NAS/COMMON/IES/ShortMac.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SsCode.c b/openair3/NAS/COMMON/IES/SsCode.c index ba68ceb7e0..ab6d34a159 100644 --- a/openair3/NAS/COMMON/IES/SsCode.c +++ b/openair3/NAS/COMMON/IES/SsCode.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SsCode.h b/openair3/NAS/COMMON/IES/SsCode.h index 8b70a1b5fc..6ba6fe377c 100644 --- a/openair3/NAS/COMMON/IES/SsCode.h +++ b/openair3/NAS/COMMON/IES/SsCode.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SupportedCodecList.c b/openair3/NAS/COMMON/IES/SupportedCodecList.c index c9a018f141..17a9284f5e 100644 --- a/openair3/NAS/COMMON/IES/SupportedCodecList.c +++ b/openair3/NAS/COMMON/IES/SupportedCodecList.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SupportedCodecList.h b/openair3/NAS/COMMON/IES/SupportedCodecList.h index 835e7e2992..04445fdd10 100644 --- a/openair3/NAS/COMMON/IES/SupportedCodecList.h +++ b/openair3/NAS/COMMON/IES/SupportedCodecList.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZone.c b/openair3/NAS/COMMON/IES/TimeZone.c index fc0e981efd..7b0bb54e21 100644 --- a/openair3/NAS/COMMON/IES/TimeZone.c +++ b/openair3/NAS/COMMON/IES/TimeZone.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZone.h b/openair3/NAS/COMMON/IES/TimeZone.h index 6ae377090f..585e05bb1c 100644 --- a/openair3/NAS/COMMON/IES/TimeZone.h +++ b/openair3/NAS/COMMON/IES/TimeZone.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZoneAndTime.c b/openair3/NAS/COMMON/IES/TimeZoneAndTime.c index 016cd6c628..c986ecfc7c 100644 --- a/openair3/NAS/COMMON/IES/TimeZoneAndTime.c +++ b/openair3/NAS/COMMON/IES/TimeZoneAndTime.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZoneAndTime.h b/openair3/NAS/COMMON/IES/TimeZoneAndTime.h index 3f32cf2a8f..6ddbf94ab8 100644 --- a/openair3/NAS/COMMON/IES/TimeZoneAndTime.h +++ b/openair3/NAS/COMMON/IES/TimeZoneAndTime.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TmsiStatus.c b/openair3/NAS/COMMON/IES/TmsiStatus.c index 4d54ba3f2f..c4c328316f 100644 --- a/openair3/NAS/COMMON/IES/TmsiStatus.c +++ b/openair3/NAS/COMMON/IES/TmsiStatus.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TmsiStatus.h b/openair3/NAS/COMMON/IES/TmsiStatus.h index c11f9b9747..dc7c3eaafd 100644 --- a/openair3/NAS/COMMON/IES/TmsiStatus.h +++ b/openair3/NAS/COMMON/IES/TmsiStatus.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c index 149fde64fd..20ade47268 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h index 27438fbb47..72d5d44f0d 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c index 10753854be..47269add10 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h index 36c8469da9..1c58afbcb5 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c index 7a6355d1b6..296ecbe6f1 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c +++ b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h index d84fd7fcb0..09e9450d8d 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h +++ b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c index 9956191e31..57f8d3ba00 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c +++ b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h index 286e96cd57..920caea056 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h +++ b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TransactionIdentifier.c b/openair3/NAS/COMMON/IES/TransactionIdentifier.c index a9a75933d0..dbc2c68cab 100644 --- a/openair3/NAS/COMMON/IES/TransactionIdentifier.c +++ b/openair3/NAS/COMMON/IES/TransactionIdentifier.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TransactionIdentifier.h b/openair3/NAS/COMMON/IES/TransactionIdentifier.h index 6ddc31f6ab..aaa0836f38 100644 --- a/openair3/NAS/COMMON/IES/TransactionIdentifier.h +++ b/openair3/NAS/COMMON/IES/TransactionIdentifier.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeNetworkCapability.c b/openair3/NAS/COMMON/IES/UeNetworkCapability.c index 8ae92a979b..46d07a0fdf 100644 --- a/openair3/NAS/COMMON/IES/UeNetworkCapability.c +++ b/openair3/NAS/COMMON/IES/UeNetworkCapability.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeNetworkCapability.h b/openair3/NAS/COMMON/IES/UeNetworkCapability.h index f9883a21b3..5bf6035323 100644 --- a/openair3/NAS/COMMON/IES/UeNetworkCapability.h +++ b/openair3/NAS/COMMON/IES/UeNetworkCapability.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c index 9f3d47d9a9..7d506881ee 100644 --- a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c +++ b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h index 41f1c9f27f..fb25c0808a 100644 --- a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h +++ b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeSecurityCapability.c b/openair3/NAS/COMMON/IES/UeSecurityCapability.c index 0f233c2e05..ee462594fd 100644 --- a/openair3/NAS/COMMON/IES/UeSecurityCapability.c +++ b/openair3/NAS/COMMON/IES/UeSecurityCapability.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeSecurityCapability.h b/openair3/NAS/COMMON/IES/UeSecurityCapability.h index 817df92374..a15f74570d 100644 --- a/openair3/NAS/COMMON/IES/UeSecurityCapability.h +++ b/openair3/NAS/COMMON/IES/UeSecurityCapability.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c index 52c2141b34..6c644dedf3 100644 --- a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c +++ b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h index 14e2af6f7b..fd1353833d 100644 --- a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h +++ b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/OctetString.c b/openair3/NAS/COMMON/UTIL/OctetString.c index 569e9d6ea8..2763006126 100644 --- a/openair3/NAS/COMMON/UTIL/OctetString.c +++ b/openair3/NAS/COMMON/UTIL/OctetString.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/OctetString.h b/openair3/NAS/COMMON/UTIL/OctetString.h index c618359452..c0c54fcb09 100644 --- a/openair3/NAS/COMMON/UTIL/OctetString.h +++ b/openair3/NAS/COMMON/UTIL/OctetString.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVDecoder.c b/openair3/NAS/COMMON/UTIL/TLVDecoder.c index 51b9e5bdf8..9c27452bec 100644 --- a/openair3/NAS/COMMON/UTIL/TLVDecoder.c +++ b/openair3/NAS/COMMON/UTIL/TLVDecoder.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVDecoder.h b/openair3/NAS/COMMON/UTIL/TLVDecoder.h index 5f23f40308..801ab77c8d 100644 --- a/openair3/NAS/COMMON/UTIL/TLVDecoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVDecoder.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef TLV_DECODER_H_ #define TLV_DECODER_H_ diff --git a/openair3/NAS/COMMON/UTIL/TLVEncoder.c b/openair3/NAS/COMMON/UTIL/TLVEncoder.c index 3b65a8588e..0facb0d5f7 100644 --- a/openair3/NAS/COMMON/UTIL/TLVEncoder.c +++ b/openair3/NAS/COMMON/UTIL/TLVEncoder.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVEncoder.h b/openair3/NAS/COMMON/UTIL/TLVEncoder.h index dc8333882c..976289f25b 100644 --- a/openair3/NAS/COMMON/UTIL/TLVEncoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVEncoder.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef TLV_ENCODER_H_ #define TLV_ENCODER_H_ diff --git a/openair3/NAS/COMMON/UTIL/device.c b/openair3/NAS/COMMON/UTIL/device.c index 267e2a55db..6643c6dfd9 100644 --- a/openair3/NAS/COMMON/UTIL/device.c +++ b/openair3/NAS/COMMON/UTIL/device.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source device.c diff --git a/openair3/NAS/COMMON/UTIL/device.h b/openair3/NAS/COMMON/UTIL/device.h index 00114da3eb..fb0a9add13 100644 --- a/openair3/NAS/COMMON/UTIL/device.h +++ b/openair3/NAS/COMMON/UTIL/device.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source device.h diff --git a/openair3/NAS/COMMON/UTIL/memory.c b/openair3/NAS/COMMON/UTIL/memory.c index 9ebedebe53..df94d40cfc 100644 --- a/openair3/NAS/COMMON/UTIL/memory.c +++ b/openair3/NAS/COMMON/UTIL/memory.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source memory.c diff --git a/openair3/NAS/COMMON/UTIL/memory.h b/openair3/NAS/COMMON/UTIL/memory.h index 6ac88defd4..f41f4d586b 100644 --- a/openair3/NAS/COMMON/UTIL/memory.h +++ b/openair3/NAS/COMMON/UTIL/memory.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source memory.h diff --git a/openair3/NAS/COMMON/UTIL/nas_log.c b/openair3/NAS/COMMON/UTIL/nas_log.c index 1f45085ee9..a1568c49d8 100644 --- a/openair3/NAS/COMMON/UTIL/nas_log.c +++ b/openair3/NAS/COMMON/UTIL/nas_log.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_log.c diff --git a/openair3/NAS/COMMON/UTIL/nas_log.h b/openair3/NAS/COMMON/UTIL/nas_log.h index 58e7966f29..1889bd801d 100644 --- a/openair3/NAS/COMMON/UTIL/nas_log.h +++ b/openair3/NAS/COMMON/UTIL/nas_log.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_log.h diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.c b/openair3/NAS/COMMON/UTIL/nas_timer.c index 23f7ae8e21..aa67c72b42 100644 --- a/openair3/NAS/COMMON/UTIL/nas_timer.c +++ b/openair3/NAS/COMMON/UTIL/nas_timer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_timer.c diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.h b/openair3/NAS/COMMON/UTIL/nas_timer.h index 9c6b48c4b2..007ea236b7 100644 --- a/openair3/NAS/COMMON/UTIL/nas_timer.h +++ b/openair3/NAS/COMMON/UTIL/nas_timer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_timer.h diff --git a/openair3/NAS/COMMON/UTIL/parser.c b/openair3/NAS/COMMON/UTIL/parser.c index 323b523733..e60e7eca88 100644 --- a/openair3/NAS/COMMON/UTIL/parser.c +++ b/openair3/NAS/COMMON/UTIL/parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source parser.c diff --git a/openair3/NAS/COMMON/UTIL/parser.h b/openair3/NAS/COMMON/UTIL/parser.h index 28acbed026..2061c7201d 100644 --- a/openair3/NAS/COMMON/UTIL/parser.h +++ b/openair3/NAS/COMMON/UTIL/parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source parser.h diff --git a/openair3/NAS/COMMON/UTIL/socket.c b/openair3/NAS/COMMON/UTIL/socket.c index b21dabbc33..6d27228415 100644 --- a/openair3/NAS/COMMON/UTIL/socket.c +++ b/openair3/NAS/COMMON/UTIL/socket.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source socket.c diff --git a/openair3/NAS/COMMON/UTIL/socket.h b/openair3/NAS/COMMON/UTIL/socket.h index b1988a4aa7..ae198a489c 100644 --- a/openair3/NAS/COMMON/UTIL/socket.h +++ b/openair3/NAS/COMMON/UTIL/socket.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source socket.h diff --git a/openair3/NAS/COMMON/UTIL/stty.c b/openair3/NAS/COMMON/UTIL/stty.c index 6fda2f5e61..88b66eb09b 100644 --- a/openair3/NAS/COMMON/UTIL/stty.c +++ b/openair3/NAS/COMMON/UTIL/stty.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source stty.c diff --git a/openair3/NAS/COMMON/UTIL/tst/timer.c b/openair3/NAS/COMMON/UTIL/tst/timer.c index d04cbdb1c9..449c4d749b 100644 --- a/openair3/NAS/COMMON/UTIL/tst/timer.c +++ b/openair3/NAS/COMMON/UTIL/tst/timer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source timer.c diff --git a/openair3/NAS/COMMON/securityDef.h b/openair3/NAS/COMMON/securityDef.h index f73f3fe7b0..ef39d5533c 100644 --- a/openair3/NAS/COMMON/securityDef.h +++ b/openair3/NAS/COMMON/securityDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source securityDef.h diff --git a/openair3/NAS/COMMON/userDef.h b/openair3/NAS/COMMON/userDef.h index 692712cf35..c5989c8e45 100644 --- a/openair3/NAS/COMMON/userDef.h +++ b/openair3/NAS/COMMON/userDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source userDef.h diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_data.c b/openair3/NAS/TEST/AS_SIMULATOR/as_data.c index 2ed7cdc7a3..9316546bd4 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_data.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_data.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_data.h b/openair3/NAS/TEST/AS_SIMULATOR/as_data.h index 2f94f40bb9..c52ed83465 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_data.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_data.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_process.c b/openair3/NAS/TEST/AS_SIMULATOR/as_process.c index e3c71fe839..e0f031c45a 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_process.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_process.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_process.h b/openair3/NAS/TEST/AS_SIMULATOR/as_process.h index 4791118cd8..94053bdf9e 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_process.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_process.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c index 20c49981bd..370213bccd 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c index 0c306ad6c5..5f8743598b 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h index 75028a8bd8..c08021723f 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/nas_data.c b/openair3/NAS/TEST/AS_SIMULATOR/nas_data.c index 7c938b786d..0aa6a57126 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/nas_data.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/nas_data.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/nas_data.h b/openair3/NAS/TEST/AS_SIMULATOR/nas_data.h index 86856b5de5..471cd19957 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/nas_data.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/nas_data.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/nas_process.c b/openair3/NAS/TEST/AS_SIMULATOR/nas_process.c index 4791764361..55c6c2494e 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/nas_process.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/nas_process.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/nas_process.h b/openair3/NAS/TEST/AS_SIMULATOR/nas_process.h index ed50809ce0..901e6ce45b 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/nas_process.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/nas_process.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/NETWORK/network_parser.c b/openair3/NAS/TEST/NETWORK/network_parser.c index f804e495b7..0e001e0aee 100644 --- a/openair3/NAS/TEST/NETWORK/network_parser.c +++ b/openair3/NAS/TEST/NETWORK/network_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/NETWORK/network_parser.h b/openair3/NAS/TEST/NETWORK/network_parser.h index ab158a444d..daaec64ffd 100644 --- a/openair3/NAS/TEST/NETWORK/network_parser.h +++ b/openair3/NAS/TEST/NETWORK/network_parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/NETWORK/network_simulator.c b/openair3/NAS/TEST/NETWORK/network_simulator.c index 9a49f12547..ef335af2ec 100644 --- a/openair3/NAS/TEST/NETWORK/network_simulator.c +++ b/openair3/NAS/TEST/NETWORK/network_simulator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/USER/user_parser.c b/openair3/NAS/TEST/USER/user_parser.c index f43639ed73..ffa47a919c 100644 --- a/openair3/NAS/TEST/USER/user_parser.c +++ b/openair3/NAS/TEST/USER/user_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/USER/user_parser.h b/openair3/NAS/TEST/USER/user_parser.h index 7c8da2b1a5..40fa618270 100644 --- a/openair3/NAS/TEST/USER/user_parser.h +++ b/openair3/NAS/TEST/USER/user_parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/USER/user_simulator.c b/openair3/NAS/TEST/USER/user_simulator.c index 8a341bc7a9..2f0819f597 100644 --- a/openair3/NAS/TEST/USER/user_simulator.c +++ b/openair3/NAS/TEST/USER/user_simulator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TOOLS/network.h b/openair3/NAS/TOOLS/network.h index f6f1c05699..0d60359c57 100644 --- a/openair3/NAS/TOOLS/network.h +++ b/openair3/NAS/TOOLS/network.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source network.h diff --git a/openair3/NAS/TOOLS/ue_data.c b/openair3/NAS/TOOLS/ue_data.c index 971f532c96..3636ad6ee3 100644 --- a/openair3/NAS/TOOLS/ue_data.c +++ b/openair3/NAS/TOOLS/ue_data.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source ue_data.c diff --git a/openair3/NAS/TOOLS/usim_data.c b/openair3/NAS/TOOLS/usim_data.c index a3f6a3efbd..d1a63fcae5 100644 --- a/openair3/NAS/TOOLS/usim_data.c +++ b/openair3/NAS/TOOLS/usim_data.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source usim_data.c diff --git a/openair3/NAS/UE/API/USER/at_command.c b/openair3/NAS/UE/API/USER/at_command.c index 37de25df48..89793a55ae 100644 --- a/openair3/NAS/UE/API/USER/at_command.c +++ b/openair3/NAS/UE/API/USER/at_command.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source at_command.c diff --git a/openair3/NAS/UE/API/USER/at_command.h b/openair3/NAS/UE/API/USER/at_command.h index d057d0c0e9..97cdeeb3a1 100644 --- a/openair3/NAS/UE/API/USER/at_command.h +++ b/openair3/NAS/UE/API/USER/at_command.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source at_command.h diff --git a/openair3/NAS/UE/API/USER/at_error.c b/openair3/NAS/UE/API/USER/at_error.c index 7e467518a5..443c6a3300 100644 --- a/openair3/NAS/UE/API/USER/at_error.c +++ b/openair3/NAS/UE/API/USER/at_error.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source at_error.c diff --git a/openair3/NAS/UE/API/USER/at_error.h b/openair3/NAS/UE/API/USER/at_error.h index 49393e2679..de9284e94c 100644 --- a/openair3/NAS/UE/API/USER/at_error.h +++ b/openair3/NAS/UE/API/USER/at_error.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source at_error.h diff --git a/openair3/NAS/UE/API/USER/at_response.c b/openair3/NAS/UE/API/USER/at_response.c index e0995ccb24..5c1dcc1a96 100644 --- a/openair3/NAS/UE/API/USER/at_response.c +++ b/openair3/NAS/UE/API/USER/at_response.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source at_response.c diff --git a/openair3/NAS/UE/API/USER/at_response.h b/openair3/NAS/UE/API/USER/at_response.h index d616bc8bd5..794af05090 100644 --- a/openair3/NAS/UE/API/USER/at_response.h +++ b/openair3/NAS/UE/API/USER/at_response.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source at_response.h diff --git a/openair3/NAS/UE/API/USER/tst/at_parser.c b/openair3/NAS/UE/API/USER/tst/at_parser.c index 2012859810..e580c99ec5 100644 --- a/openair3/NAS/UE/API/USER/tst/at_parser.c +++ b/openair3/NAS/UE/API/USER/tst/at_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source main.c Version 0.1 diff --git a/openair3/NAS/UE/API/USER/user_api.c b/openair3/NAS/UE/API/USER/user_api.c index 3c1bf9a129..9c23646292 100644 --- a/openair3/NAS/UE/API/USER/user_api.c +++ b/openair3/NAS/UE/API/USER/user_api.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source user_api.c diff --git a/openair3/NAS/UE/API/USER/user_api.h b/openair3/NAS/UE/API/USER/user_api.h index 320a8ba917..9597c0f1d1 100644 --- a/openair3/NAS/UE/API/USER/user_api.h +++ b/openair3/NAS/UE/API/USER/user_api.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source user_api.h diff --git a/openair3/NAS/UE/API/USER/user_indication.c b/openair3/NAS/UE/API/USER/user_indication.c index 74b68b94e5..d7495f46e7 100644 --- a/openair3/NAS/UE/API/USER/user_indication.c +++ b/openair3/NAS/UE/API/USER/user_indication.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source user_indication.c diff --git a/openair3/NAS/UE/API/USER/user_indication.h b/openair3/NAS/UE/API/USER/user_indication.h index ff4d446b6c..d31a8754e4 100644 --- a/openair3/NAS/UE/API/USER/user_indication.h +++ b/openair3/NAS/UE/API/USER/user_indication.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source user_indication.h diff --git a/openair3/NAS/UE/API/USIM/aka_functions.c b/openair3/NAS/UE/API/USIM/aka_functions.c index 1c2dbb6d91..415ba695f2 100644 --- a/openair3/NAS/UE/API/USIM/aka_functions.c +++ b/openair3/NAS/UE/API/USIM/aka_functions.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*------------------------------------------------------------------- * Example algorithms f1, f1*, f2, f3, f4, f5, f5* *------------------------------------------------------------------- diff --git a/openair3/NAS/UE/API/USIM/aka_functions.h b/openair3/NAS/UE/API/USIM/aka_functions.h index 7738acdc3a..66b5a90fbc 100644 --- a/openair3/NAS/UE/API/USIM/aka_functions.h +++ b/openair3/NAS/UE/API/USIM/aka_functions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + typedef unsigned char u8; /*--------------------------- prototypes --------------------------*/ diff --git a/openair3/NAS/UE/API/USIM/usim_api.c b/openair3/NAS/UE/API/USIM/usim_api.c index 5dd19152eb..e0812bf2fe 100644 --- a/openair3/NAS/UE/API/USIM/usim_api.c +++ b/openair3/NAS/UE/API/USIM/usim_api.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source usim_api.h diff --git a/openair3/NAS/UE/API/USIM/usim_api.h b/openair3/NAS/UE/API/USIM/usim_api.h index 799487a6e5..3667abd4ee 100644 --- a/openair3/NAS/UE/API/USIM/usim_api.h +++ b/openair3/NAS/UE/API/USIM/usim_api.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source usim_api.h diff --git a/openair3/NAS/UE/EMM/Attach.c b/openair3/NAS/UE/EMM/Attach.c index afc283e0f4..939c5b4afd 100644 --- a/openair3/NAS/UE/EMM/Attach.c +++ b/openair3/NAS/UE/EMM/Attach.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source Attach.c diff --git a/openair3/NAS/UE/EMM/Authentication.c b/openair3/NAS/UE/EMM/Authentication.c index 9065b92482..7ffab89f89 100644 --- a/openair3/NAS/UE/EMM/Authentication.c +++ b/openair3/NAS/UE/EMM/Authentication.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source Authentication.c diff --git a/openair3/NAS/UE/EMM/Detach.c b/openair3/NAS/UE/EMM/Detach.c index da087f07a0..7fd7330524 100644 --- a/openair3/NAS/UE/EMM/Detach.c +++ b/openair3/NAS/UE/EMM/Detach.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source Detach.c diff --git a/openair3/NAS/UE/EMM/EmmStatusHdl.c b/openair3/NAS/UE/EMM/EmmStatusHdl.c index 394704ab32..c95441d370 100644 --- a/openair3/NAS/UE/EMM/EmmStatusHdl.c +++ b/openair3/NAS/UE/EMM/EmmStatusHdl.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source Emmstatus.c diff --git a/openair3/NAS/UE/EMM/Identification.c b/openair3/NAS/UE/EMM/Identification.c index c5ebd2c6e6..a9ceb7a43b 100644 --- a/openair3/NAS/UE/EMM/Identification.c +++ b/openair3/NAS/UE/EMM/Identification.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source Identification.c diff --git a/openair3/NAS/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c index 32945b0749..74c09a8a3d 100644 --- a/openair3/NAS/UE/EMM/IdleMode.c +++ b/openair3/NAS/UE/EMM/IdleMode.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source IdleMode.c diff --git a/openair3/NAS/UE/EMM/IdleMode.h b/openair3/NAS/UE/EMM/IdleMode.h index c91f9753d6..f75d149e91 100644 --- a/openair3/NAS/UE/EMM/IdleMode.h +++ b/openair3/NAS/UE/EMM/IdleMode.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source IdleMode.h diff --git a/openair3/NAS/UE/EMM/LowerLayer.c b/openair3/NAS/UE/EMM/LowerLayer.c index 602dddac76..f0f7a3c5b6 100644 --- a/openair3/NAS/UE/EMM/LowerLayer.c +++ b/openair3/NAS/UE/EMM/LowerLayer.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source LowerLayer.c diff --git a/openair3/NAS/UE/EMM/LowerLayer.h b/openair3/NAS/UE/EMM/LowerLayer.h index b4547449e6..396de203d3 100644 --- a/openair3/NAS/UE/EMM/LowerLayer.h +++ b/openair3/NAS/UE/EMM/LowerLayer.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source lowerlayer.h diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c b/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c index 6c60e7bebb..801de96145 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregistered.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c index 7c55d890a4..4f8cbc862b 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregisteredAttachNeeded.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c index 36fd9e1df1..ed1d079930 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregisteredAttemptingToAttach.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c index 256970c971..220e666aa7 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregisteredInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c index ce1a9e98d6..78d418c69c 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregisteredLimitedService.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c index 1d1c36930c..9f1f526e83 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregisteredNoCellAvailable.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c index 374f9047f5..059c1f551b 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregisteredNoImsi.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c index 2f290a0128..707996b5a7 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregisteredNormalService.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c index ef2a4d1fad..d9865c9b72 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmDeregisteredPlmnSearch.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmNull.c b/openair3/NAS/UE/EMM/SAP/EmmNull.c index f3c259816c..e482281a71 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmNull.c +++ b/openair3/NAS/UE/EMM/SAP/EmmNull.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmNull.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c index 47d970730a..dcbeee167e 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmRegistered.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c index fcc6a47010..59d8f45df9 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmRegisteredAttemptingToUpdate.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c index c03d06fdab..c522d5ec5c 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmRegisteredImsiDetachInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c index eda7f12a22..688b168b53 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmRegisteredInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c index eac4a8b830..280252b8ed 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmRegisteredLimitedService.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c index e43848a3c1..a22f3d76c6 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmRegisteredNoCellAvailable.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c index d0ceb7a80c..bc25a1e4be 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmRegisteredNormalService.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c index 7a20a191c1..453e39558e 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmRegisteredPlmnSearch.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c index ac5876413e..36f35fe351 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** ource EmmRegisteredUpdateNeeded.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c index 6e87161638..a72b2d6003 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmServiceRequestInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c index db35f08450..69699cc117 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EmmTrackingAreaUpdatingInitiated.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_as.c b/openair3/NAS/UE/EMM/SAP/emm_as.c index 4b63580cdb..7650f97ee8 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_as.c +++ b/openair3/NAS/UE/EMM/SAP/emm_as.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_as.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_as.h b/openair3/NAS/UE/EMM/SAP/emm_as.h index 1b504a9388..04a14cf3cb 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_as.h +++ b/openair3/NAS/UE/EMM/SAP/emm_as.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_as.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_asDef.h b/openair3/NAS/UE/EMM/SAP/emm_asDef.h index 24b5c2486a..bf0e6f6c37 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_asDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_asDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_asDef.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_esm.c b/openair3/NAS/UE/EMM/SAP/emm_esm.c index d1b2cffb08..a12d71d79b 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_esm.c +++ b/openair3/NAS/UE/EMM/SAP/emm_esm.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_esm.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_esm.h b/openair3/NAS/UE/EMM/SAP/emm_esm.h index a81f536535..7a763d4759 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_esm.h +++ b/openair3/NAS/UE/EMM/SAP/emm_esm.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_esm.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h index 3eb2207989..811580ab2a 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_esmDef.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_fsm.c b/openair3/NAS/UE/EMM/SAP/emm_fsm.c index 86d2b818dc..a76b101119 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_fsm.c +++ b/openair3/NAS/UE/EMM/SAP/emm_fsm.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_fsm.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_fsm.h b/openair3/NAS/UE/EMM/SAP/emm_fsm.h index 9980412679..ea7d4ed622 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_fsm.h +++ b/openair3/NAS/UE/EMM/SAP/emm_fsm.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_fsm.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_recv.c b/openair3/NAS/UE/EMM/SAP/emm_recv.c index 4e2c0f76ae..32e8e1ec30 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_recv.c +++ b/openair3/NAS/UE/EMM/SAP/emm_recv.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_recv.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_recv.h b/openair3/NAS/UE/EMM/SAP/emm_recv.h index d31ccc9175..cec52a8c1f 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_recv.h +++ b/openair3/NAS/UE/EMM/SAP/emm_recv.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_recv.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_reg.c b/openair3/NAS/UE/EMM/SAP/emm_reg.c index dbb8f292f8..065b91bd3b 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_reg.c +++ b/openair3/NAS/UE/EMM/SAP/emm_reg.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_reg.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_reg.h b/openair3/NAS/UE/EMM/SAP/emm_reg.h index 3e88332eb6..08d28b67db 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_reg.h +++ b/openair3/NAS/UE/EMM/SAP/emm_reg.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_reg.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_regDef.h b/openair3/NAS/UE/EMM/SAP/emm_regDef.h index 1399ddaa4b..de1b05b6a6 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_regDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_regDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_regDef.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_sap.c b/openair3/NAS/UE/EMM/SAP/emm_sap.c index c7d43f9ca2..d8312ee74c 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_sap.c +++ b/openair3/NAS/UE/EMM/SAP/emm_sap.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_sap.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_sap.h b/openair3/NAS/UE/EMM/SAP/emm_sap.h index 866971be1f..f27e8d4e58 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_sap.h +++ b/openair3/NAS/UE/EMM/SAP/emm_sap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_sap.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_send.c b/openair3/NAS/UE/EMM/SAP/emm_send.c index 0388e53ee1..7e13d03c7b 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_send.c +++ b/openair3/NAS/UE/EMM/SAP/emm_send.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_send.c diff --git a/openair3/NAS/UE/EMM/SAP/emm_send.h b/openair3/NAS/UE/EMM/SAP/emm_send.h index 82b644ba80..1c04cd8dad 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_send.h +++ b/openair3/NAS/UE/EMM/SAP/emm_send.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_send.h diff --git a/openair3/NAS/UE/EMM/SecurityModeControl.c b/openair3/NAS/UE/EMM/SecurityModeControl.c index fd27c6fa5e..c48c2cbaaf 100644 --- a/openair3/NAS/UE/EMM/SecurityModeControl.c +++ b/openair3/NAS/UE/EMM/SecurityModeControl.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source SecurityModeControl.c diff --git a/openair3/NAS/UE/EMM/ServiceRequestHdl.c b/openair3/NAS/UE/EMM/ServiceRequestHdl.c index ba13ffa711..349fce7cad 100644 --- a/openair3/NAS/UE/EMM/ServiceRequestHdl.c +++ b/openair3/NAS/UE/EMM/ServiceRequestHdl.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source ServiceRequest.c diff --git a/openair3/NAS/UE/EMM/TrackingAreaUpdate.c b/openair3/NAS/UE/EMM/TrackingAreaUpdate.c index 770783f1ef..50a440951b 100644 --- a/openair3/NAS/UE/EMM/TrackingAreaUpdate.c +++ b/openair3/NAS/UE/EMM/TrackingAreaUpdate.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source TrackingAreaUpdate.c diff --git a/openair3/NAS/UE/EMM/emmData.h b/openair3/NAS/UE/EMM/emmData.h index cf38b38e3a..df89fb0c8e 100644 --- a/openair3/NAS/UE/EMM/emmData.h +++ b/openair3/NAS/UE/EMM/emmData.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emmData.h diff --git a/openair3/NAS/UE/EMM/emm_main.c b/openair3/NAS/UE/EMM/emm_main.c index 5acab31aae..eb92f849de 100644 --- a/openair3/NAS/UE/EMM/emm_main.c +++ b/openair3/NAS/UE/EMM/emm_main.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_main.c diff --git a/openair3/NAS/UE/EMM/emm_main.h b/openair3/NAS/UE/EMM/emm_main.h index 5d28906452..1ce584210e 100644 --- a/openair3/NAS/UE/EMM/emm_main.h +++ b/openair3/NAS/UE/EMM/emm_main.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_main.h diff --git a/openair3/NAS/UE/EMM/emm_proc.h b/openair3/NAS/UE/EMM/emm_proc.h index 873aba4758..e6a3ae0cdd 100644 --- a/openair3/NAS/UE/EMM/emm_proc.h +++ b/openair3/NAS/UE/EMM/emm_proc.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source emm_proc.h diff --git a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c index 353c4cb4a2..21e54fd2d0 100644 --- a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c +++ b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source DedicatedEpsBearerContextActivation.c diff --git a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c index 195f1ff4ad..82c4e51be8 100644 --- a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c +++ b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source DefaultEpsBearerContextActivation.c diff --git a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c index 017d1392ca..774c80e97f 100644 --- a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c +++ b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EpsBearerContextDeactivation.c diff --git a/openair3/NAS/UE/ESM/EsmStatusHdl.c b/openair3/NAS/UE/ESM/EsmStatusHdl.c index d85f3e632d..48e86f4a60 100644 --- a/openair3/NAS/UE/ESM/EsmStatusHdl.c +++ b/openair3/NAS/UE/ESM/EsmStatusHdl.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source EsmStatus.c diff --git a/openair3/NAS/UE/ESM/PdnConnectivity.c b/openair3/NAS/UE/ESM/PdnConnectivity.c index 7ae6afea81..2d8718b0a3 100644 --- a/openair3/NAS/UE/ESM/PdnConnectivity.c +++ b/openair3/NAS/UE/ESM/PdnConnectivity.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source PdnConnectivity.c diff --git a/openair3/NAS/UE/ESM/PdnDisconnect.c b/openair3/NAS/UE/ESM/PdnDisconnect.c index f988097507..3cb2f56385 100644 --- a/openair3/NAS/UE/ESM/PdnDisconnect.c +++ b/openair3/NAS/UE/ESM/PdnDisconnect.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source PdnDisconnect.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_recv.c b/openair3/NAS/UE/ESM/SAP/esm_recv.c index 3ba14b3868..243d619896 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_recv.c +++ b/openair3/NAS/UE/ESM/SAP/esm_recv.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_recv.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_recv.h b/openair3/NAS/UE/ESM/SAP/esm_recv.h index ab8fc33996..db65230e1e 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_recv.h +++ b/openair3/NAS/UE/ESM/SAP/esm_recv.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_recv.h diff --git a/openair3/NAS/UE/ESM/SAP/esm_sap.c b/openair3/NAS/UE/ESM/SAP/esm_sap.c index 5fd394028b..5ead95d5b4 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_sap.c +++ b/openair3/NAS/UE/ESM/SAP/esm_sap.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_sap.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_sap.h b/openair3/NAS/UE/ESM/SAP/esm_sap.h index d4a7e8e3d3..7364a4b661 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_sap.h +++ b/openair3/NAS/UE/ESM/SAP/esm_sap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_sap.h diff --git a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h index b51c124b96..4e1bed8bb5 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h +++ b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_sapDef.h diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.c b/openair3/NAS/UE/ESM/SAP/esm_send.c index fdf209c0be..eff200dc4e 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_send.c +++ b/openair3/NAS/UE/ESM/SAP/esm_send.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_send.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.h b/openair3/NAS/UE/ESM/SAP/esm_send.h index 5a7fd31ec8..1a5abc8695 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_send.h +++ b/openair3/NAS/UE/ESM/SAP/esm_send.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_send.h diff --git a/openair3/NAS/UE/ESM/esmData.h b/openair3/NAS/UE/ESM/esmData.h index 40e536a956..4a498b5d2e 100644 --- a/openair3/NAS/UE/ESM/esmData.h +++ b/openair3/NAS/UE/ESM/esmData.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esmData.h diff --git a/openair3/NAS/UE/ESM/esm_ebr.c b/openair3/NAS/UE/ESM/esm_ebr.c index 037b4905d3..878f06c184 100644 --- a/openair3/NAS/UE/ESM/esm_ebr.c +++ b/openair3/NAS/UE/ESM/esm_ebr.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_ebr.c diff --git a/openair3/NAS/UE/ESM/esm_ebr.h b/openair3/NAS/UE/ESM/esm_ebr.h index 24e19deabf..dd58631956 100644 --- a/openair3/NAS/UE/ESM/esm_ebr.h +++ b/openair3/NAS/UE/ESM/esm_ebr.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_ebr.h diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.c b/openair3/NAS/UE/ESM/esm_ebr_context.c index 9cdbfd9cf6..cca1e06913 100644 --- a/openair3/NAS/UE/ESM/esm_ebr_context.c +++ b/openair3/NAS/UE/ESM/esm_ebr_context.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_ebr_context.h diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.h b/openair3/NAS/UE/ESM/esm_ebr_context.h index f2f8a510d1..95d7b081d8 100644 --- a/openair3/NAS/UE/ESM/esm_ebr_context.h +++ b/openair3/NAS/UE/ESM/esm_ebr_context.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_ebr_context.h diff --git a/openair3/NAS/UE/ESM/esm_ip.c b/openair3/NAS/UE/ESM/esm_ip.c index 76e62a7d36..f21305a1a0 100644 --- a/openair3/NAS/UE/ESM/esm_ip.c +++ b/openair3/NAS/UE/ESM/esm_ip.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "emmData.h" #include "esmData.h" diff --git a/openair3/NAS/UE/ESM/esm_main.c b/openair3/NAS/UE/ESM/esm_main.c index 8f925728f8..74af9935aa 100644 --- a/openair3/NAS/UE/ESM/esm_main.c +++ b/openair3/NAS/UE/ESM/esm_main.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_main.c diff --git a/openair3/NAS/UE/ESM/esm_main.h b/openair3/NAS/UE/ESM/esm_main.h index 6a989f1c30..d7346fdb08 100644 --- a/openair3/NAS/UE/ESM/esm_main.h +++ b/openair3/NAS/UE/ESM/esm_main.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_main.h diff --git a/openair3/NAS/UE/ESM/esm_proc.h b/openair3/NAS/UE/ESM/esm_proc.h index fcc1328179..edbd926309 100644 --- a/openair3/NAS/UE/ESM/esm_proc.h +++ b/openair3/NAS/UE/ESM/esm_proc.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_proc.h diff --git a/openair3/NAS/UE/ESM/esm_pt.c b/openair3/NAS/UE/ESM/esm_pt.c index 1edab0f675..8e819fbd0b 100644 --- a/openair3/NAS/UE/ESM/esm_pt.c +++ b/openair3/NAS/UE/ESM/esm_pt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_pt.c diff --git a/openair3/NAS/UE/ESM/esm_pt.h b/openair3/NAS/UE/ESM/esm_pt.h index b521c0f7d7..7cc0c54780 100644 --- a/openair3/NAS/UE/ESM/esm_pt.h +++ b/openair3/NAS/UE/ESM/esm_pt.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source esm_pt.h diff --git a/openair3/NAS/UE/UEprocess.c b/openair3/NAS/UE/UEprocess.c index b6827b28f5..248633c3a1 100644 --- a/openair3/NAS/UE/UEprocess.c +++ b/openair3/NAS/UE/UEprocess.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source UEprocess.c diff --git a/openair3/NAS/UE/nas_itti_messaging.c b/openair3/NAS/UE/nas_itti_messaging.c index de6c384bf8..10bfdf9d6e 100644 --- a/openair3/NAS/UE/nas_itti_messaging.c +++ b/openair3/NAS/UE/nas_itti_messaging.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "intertask_interface.h" diff --git a/openair3/NAS/UE/nas_itti_messaging.h b/openair3/NAS/UE/nas_itti_messaging.h index 5aec6f8e32..dae4f5fb28 100644 --- a/openair3/NAS/UE/nas_itti_messaging.h +++ b/openair3/NAS/UE/nas_itti_messaging.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/NAS/UE/nas_network.c b/openair3/NAS/UE/nas_network.c index 16041005b8..f3ee3d2955 100644 --- a/openair3/NAS/UE/nas_network.c +++ b/openair3/NAS/UE/nas_network.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_network.h diff --git a/openair3/NAS/UE/nas_network.h b/openair3/NAS/UE/nas_network.h index 44f7a0d69a..363f63c5ab 100644 --- a/openair3/NAS/UE/nas_network.h +++ b/openair3/NAS/UE/nas_network.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_network.h diff --git a/openair3/NAS/UE/nas_parser.c b/openair3/NAS/UE/nas_parser.c index 9bf621a871..148315eaa2 100644 --- a/openair3/NAS/UE/nas_parser.c +++ b/openair3/NAS/UE/nas_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_parser.c diff --git a/openair3/NAS/UE/nas_parser.h b/openair3/NAS/UE/nas_parser.h index 8af982174b..b799f3a3f4 100644 --- a/openair3/NAS/UE/nas_parser.h +++ b/openair3/NAS/UE/nas_parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_parser.h diff --git a/openair3/NAS/UE/nas_proc.c b/openair3/NAS/UE/nas_proc.c index 0d4597fb1b..79b6626995 100644 --- a/openair3/NAS/UE/nas_proc.c +++ b/openair3/NAS/UE/nas_proc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_proc.c diff --git a/openair3/NAS/UE/nas_proc.h b/openair3/NAS/UE/nas_proc.h index e307b7117b..4514983df8 100644 --- a/openair3/NAS/UE/nas_proc.h +++ b/openair3/NAS/UE/nas_proc.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_proc.h diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c index b141d73d63..9d097fc389 100644 --- a/openair3/NAS/UE/nas_ue_task.c +++ b/openair3/NAS/UE/nas_ue_task.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if defined(ENABLE_ITTI) # include "assertions.h" # include "intertask_interface.h" diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c index 27e40cdc92..7616a48c05 100644 --- a/openair3/NAS/UE/nas_user.c +++ b/openair3/NAS/UE/nas_user.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_user.c diff --git a/openair3/NAS/UE/nas_user.h b/openair3/NAS/UE/nas_user.h index f107935cfb..93b1cc8961 100644 --- a/openair3/NAS/UE/nas_user.h +++ b/openair3/NAS/UE/nas_user.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source nas_user.h diff --git a/openair3/S1AP/s1ap_common.c b/openair3/S1AP/s1ap_common.c index d711ba4768..2e4c31533d 100644 --- a/openair3/S1AP/s1ap_common.c +++ b/openair3/S1AP/s1ap_common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_common.c * \brief s1ap procedures for both eNB and MME * \author Sebastien ROUX and Navid Nikaein diff --git a/openair3/S1AP/s1ap_common.h b/openair3/S1AP/s1ap_common.h index a8d1e693bb..8e5e5c0333 100644 --- a/openair3/S1AP/s1ap_common.h +++ b/openair3/S1AP/s1ap_common.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** @defgroup _s1ap_impl_ S1AP Layer Reference Implementation * @ingroup _ref_implementation_ * @{ diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index c2b36e0a19..65b82055a3 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB.c * \brief S1AP eNB task * \author S. Roux and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB.h b/openair3/S1AP/s1ap_eNB.h index 0b2a717cf2..eca28a4101 100644 --- a/openair3/S1AP/s1ap_eNB.h +++ b/openair3/S1AP/s1ap_eNB.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/openair3/S1AP/s1ap_eNB_context_management_procedures.c b/openair3/S1AP/s1ap_eNB_context_management_procedures.c index 8fdcbbabb5..19aa8516b7 100644 --- a/openair3/S1AP/s1ap_eNB_context_management_procedures.c +++ b/openair3/S1AP/s1ap_eNB_context_management_procedures.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_context_management_procedures.c * \brief S1AP context management procedures * \author S. Roux and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_context_management_procedures.h b/openair3/S1AP/s1ap_eNB_context_management_procedures.h index 4caca82b70..3e045a71ed 100644 --- a/openair3/S1AP/s1ap_eNB_context_management_procedures.h +++ b/openair3/S1AP/s1ap_eNB_context_management_procedures.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_CONTEXT_MANAGEMENT_PROCEDURES_H_ #define S1AP_ENB_CONTEXT_MANAGEMENT_PROCEDURES_H_ diff --git a/openair3/S1AP/s1ap_eNB_decoder.c b/openair3/S1AP/s1ap_eNB_decoder.c index 44f1892c91..c2cc3655d4 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.c +++ b/openair3/S1AP/s1ap_eNB_decoder.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_decoder.c * \brief s1ap pdu decode procedures for eNB * \author Sebastien ROUX and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_decoder.h b/openair3/S1AP/s1ap_eNB_decoder.h index 1d9cd3c8de..1585dc2630 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.h +++ b/openair3/S1AP/s1ap_eNB_decoder.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "s1ap_ies_defs.h" diff --git a/openair3/S1AP/s1ap_eNB_default_values.h b/openair3/S1AP/s1ap_eNB_default_values.h index cd12994427..827f3a8083 100644 --- a/openair3/S1AP/s1ap_eNB_default_values.h +++ b/openair3/S1AP/s1ap_eNB_default_values.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_DEFAULT_VALUES_H_ #define S1AP_ENB_DEFAULT_VALUES_H_ diff --git a/openair3/S1AP/s1ap_eNB_defs.h b/openair3/S1AP/s1ap_eNB_defs.h index 7829ea3b94..27a0209cc5 100644 --- a/openair3/S1AP/s1ap_eNB_defs.h +++ b/openair3/S1AP/s1ap_eNB_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "queue.h" diff --git a/openair3/S1AP/s1ap_eNB_encoder.c b/openair3/S1AP/s1ap_eNB_encoder.c index 474626dea5..17a5be7dc6 100644 --- a/openair3/S1AP/s1ap_eNB_encoder.c +++ b/openair3/S1AP/s1ap_eNB_encoder.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_encoder.c * \brief s1ap pdu encode procedures for eNB * \author Sebastien ROUX and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_encoder.h b/openair3/S1AP/s1ap_eNB_encoder.h index a03c03df04..6231958101 100644 --- a/openair3/S1AP/s1ap_eNB_encoder.h +++ b/openair3/S1AP/s1ap_eNB_encoder.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_ENCODER_H_ #define S1AP_ENB_ENCODER_H_ diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index 8fd414d00b..c6deccebcd 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.c +++ b/openair3/S1AP/s1ap_eNB_handlers.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_handlers.c * \brief s1ap messages handlers for eNB part * \author Sebastien ROUX and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_handlers.h b/openair3/S1AP/s1ap_eNB_handlers.h index da54b3b2b2..ef36b908cc 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.h +++ b/openair3/S1AP/s1ap_eNB_handlers.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_HANDLERS_H_ #define S1AP_ENB_HANDLERS_H_ diff --git a/openair3/S1AP/s1ap_eNB_itti_messaging.c b/openair3/S1AP/s1ap_eNB_itti_messaging.c index 849bd09ab2..352cb48d61 100644 --- a/openair3/S1AP/s1ap_eNB_itti_messaging.c +++ b/openair3/S1AP/s1ap_eNB_itti_messaging.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "intertask_interface.h" #include "s1ap_eNB_itti_messaging.h" diff --git a/openair3/S1AP/s1ap_eNB_itti_messaging.h b/openair3/S1AP/s1ap_eNB_itti_messaging.h index 835c2ee803..d8572eef89 100644 --- a/openair3/S1AP/s1ap_eNB_itti_messaging.h +++ b/openair3/S1AP/s1ap_eNB_itti_messaging.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_ITTI_MESSAGING_H_ #define S1AP_ENB_ITTI_MESSAGING_H_ diff --git a/openair3/S1AP/s1ap_eNB_management_procedures.c b/openair3/S1AP/s1ap_eNB_management_procedures.c index 1092d04401..d5f321770d 100644 --- a/openair3/S1AP/s1ap_eNB_management_procedures.c +++ b/openair3/S1AP/s1ap_eNB_management_procedures.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_management_procedures.c * \brief S1AP eNB task * \author S. Roux and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_management_procedures.h b/openair3/S1AP/s1ap_eNB_management_procedures.h index af81eb8c7f..73d8698c16 100644 --- a/openair3/S1AP/s1ap_eNB_management_procedures.h +++ b/openair3/S1AP/s1ap_eNB_management_procedures.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_MANAGEMENT_PROCEDURES_H_ #define S1AP_ENB_MANAGEMENT_PROCEDURES_H_ diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c index 8da0f74ca6..def09a6cb3 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_nas_procedures.c * \brief S1AP eNb NAS procedure handler * \author S. Roux and Navid Nikaein diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.h b/openair3/S1AP/s1ap_eNB_nas_procedures.h index cec47a8587..aae18fe4d9 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.h +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_NAS_PROCEDURES_H_ #define S1AP_ENB_NAS_PROCEDURES_H_ diff --git a/openair3/S1AP/s1ap_eNB_nnsf.c b/openair3/S1AP/s1ap_eNB_nnsf.c index 67ade0e7ab..3d4c96648d 100644 --- a/openair3/S1AP/s1ap_eNB_nnsf.c +++ b/openair3/S1AP/s1ap_eNB_nnsf.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_nnsf.c * \brief s1ap NAS node selection functions * \author Sebastien ROUX diff --git a/openair3/S1AP/s1ap_eNB_nnsf.h b/openair3/S1AP/s1ap_eNB_nnsf.h index 60e5155755..38d93febd8 100644 --- a/openair3/S1AP/s1ap_eNB_nnsf.h +++ b/openair3/S1AP/s1ap_eNB_nnsf.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_NNSF_H_ #define S1AP_ENB_NNSF_H_ diff --git a/openair3/S1AP/s1ap_eNB_overload.c b/openair3/S1AP/s1ap_eNB_overload.c index 308682d964..a56242d363 100644 --- a/openair3/S1AP/s1ap_eNB_overload.c +++ b/openair3/S1AP/s1ap_eNB_overload.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_overload.c * \brief s1ap procedures for overload messages within eNB * \author Sebastien ROUX diff --git a/openair3/S1AP/s1ap_eNB_overload.h b/openair3/S1AP/s1ap_eNB_overload.h index 75a61926e7..e15b241b9d 100644 --- a/openair3/S1AP/s1ap_eNB_overload.h +++ b/openair3/S1AP/s1ap_eNB_overload.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_OVERLOAD_H_ #define S1AP_ENB_OVERLOAD_H_ diff --git a/openair3/S1AP/s1ap_eNB_trace.c b/openair3/S1AP/s1ap_eNB_trace.c index 8bb98ba711..55ec5750f1 100644 --- a/openair3/S1AP/s1ap_eNB_trace.c +++ b/openair3/S1AP/s1ap_eNB_trace.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "assertions.h" diff --git a/openair3/S1AP/s1ap_eNB_trace.h b/openair3/S1AP/s1ap_eNB_trace.h index 0b8c39b1cd..fc321ce594 100644 --- a/openair3/S1AP/s1ap_eNB_trace.h +++ b/openair3/S1AP/s1ap_eNB_trace.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef S1AP_ENB_TRACE_H_ #define S1AP_ENB_TRACE_H_ diff --git a/openair3/S1AP/s1ap_eNB_ue_context.c b/openair3/S1AP/s1ap_eNB_ue_context.c index 4bec4d3cc5..8dc050ec8b 100644 --- a/openair3/S1AP/s1ap_eNB_ue_context.c +++ b/openair3/S1AP/s1ap_eNB_ue_context.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file s1ap_eNB_ue_context.c * \brief s1ap UE context management within eNB * \author Sebastien ROUX diff --git a/openair3/S1AP/s1ap_eNB_ue_context.h b/openair3/S1AP/s1ap_eNB_ue_context.h index 5b79cf1c62..8c9ce6dea6 100644 --- a/openair3/S1AP/s1ap_eNB_ue_context.h +++ b/openair3/S1AP/s1ap_eNB_ue_context.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "tree.h" #include "queue.h" diff --git a/openair3/SCTP/sctp_common.c b/openair3/SCTP/sctp_common.c index 4aa4ac78db..f384d832ff 100644 --- a/openair3/SCTP/sctp_common.c +++ b/openair3/SCTP/sctp_common.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file sctp_common.c * \brief eNB/MME SCTP related common procedures * \author Sebastien ROUX diff --git a/openair3/SCTP/sctp_common.h b/openair3/SCTP/sctp_common.h index d3d440b8b6..dc0757d30f 100644 --- a/openair3/SCTP/sctp_common.h +++ b/openair3/SCTP/sctp_common.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file sctp_common.h * \brief eNB/MME SCTP related common procedures * \author Sebastien ROUX diff --git a/openair3/SCTP/sctp_default_values.h b/openair3/SCTP/sctp_default_values.h index 6bdb5e2d2d..d22d50605a 100644 --- a/openair3/SCTP/sctp_default_values.h +++ b/openair3/SCTP/sctp_default_values.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef SCTP_DEFAULT_VALUES_H_ #define SCTP_DEFAULT_VALUES_H_ diff --git a/openair3/SCTP/sctp_eNB_defs.h b/openair3/SCTP/sctp_eNB_defs.h index b3f8593562..8e2347f80d 100644 --- a/openair3/SCTP/sctp_eNB_defs.h +++ b/openair3/SCTP/sctp_eNB_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "queue.h" #ifndef SCTP_ENB_DEFS_H_ diff --git a/openair3/SCTP/sctp_eNB_itti_messaging.c b/openair3/SCTP/sctp_eNB_itti_messaging.c index a85a185a25..1725bb5fa7 100644 --- a/openair3/SCTP/sctp_eNB_itti_messaging.c +++ b/openair3/SCTP/sctp_eNB_itti_messaging.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "intertask_interface.h" #include "sctp_common.h" diff --git a/openair3/SCTP/sctp_eNB_itti_messaging.h b/openair3/SCTP/sctp_eNB_itti_messaging.h index 13688b7e21..01c3b209e2 100644 --- a/openair3/SCTP/sctp_eNB_itti_messaging.h +++ b/openair3/SCTP/sctp_eNB_itti_messaging.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef SCTP_ITTI_MESSAGING_H_ #define SCTP_ITTI_MESSAGING_H_ diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c index d359472b9d..1f166af74c 100644 --- a/openair3/SCTP/sctp_eNB_task.c +++ b/openair3/SCTP/sctp_eNB_task.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SCTP/sctp_eNB_task.h b/openair3/SCTP/sctp_eNB_task.h index c196ea4d05..333aa20f58 100644 --- a/openair3/SCTP/sctp_eNB_task.h +++ b/openair3/SCTP/sctp_eNB_task.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef SCTP_ENB_TASK_H_ #define SCTP_ENB_TASK_H_ diff --git a/openair3/SCTP/sctp_primitives_client.c b/openair3/SCTP/sctp_primitives_client.c index c5745889f2..43ca200c5a 100644 --- a/openair3/SCTP/sctp_primitives_client.c +++ b/openair3/SCTP/sctp_primitives_client.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SCTP/sctp_primitives_client.h b/openair3/SCTP/sctp_primitives_client.h index 35c26080e3..a50a8f1de6 100644 --- a/openair3/SCTP/sctp_primitives_client.h +++ b/openair3/SCTP/sctp_primitives_client.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "sctp_eNB_defs.h" diff --git a/openair3/SECU/kdf.c b/openair3/SECU/kdf.c index 16a8476bb4..98dfc55ae8 100644 --- a/openair3/SECU/kdf.c +++ b/openair3/SECU/kdf.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SECU/key_nas_deriver.c b/openair3/SECU/key_nas_deriver.c index 9c0377eb67..6268c41d4b 100644 --- a/openair3/SECU/key_nas_deriver.c +++ b/openair3/SECU/key_nas_deriver.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SECU/key_nas_encryption.c b/openair3/SECU/key_nas_encryption.c index d3e98cd971..799aa020c1 100644 --- a/openair3/SECU/key_nas_encryption.c +++ b/openair3/SECU/key_nas_encryption.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "secu_defs.h" diff --git a/openair3/SECU/nas_stream_eea1.c b/openair3/SECU/nas_stream_eea1.c index bd4e4e8e7d..095838da37 100644 --- a/openair3/SECU/nas_stream_eea1.c +++ b/openair3/SECU/nas_stream_eea1.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SECU/nas_stream_eea2.c b/openair3/SECU/nas_stream_eea2.c index 0406dec880..368cfaf48e 100644 --- a/openair3/SECU/nas_stream_eea2.c +++ b/openair3/SECU/nas_stream_eea2.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SECU/nas_stream_eia1.c b/openair3/SECU/nas_stream_eia1.c index 40da604f21..6f4991d63d 100644 --- a/openair3/SECU/nas_stream_eia1.c +++ b/openair3/SECU/nas_stream_eia1.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SECU/nas_stream_eia2.c b/openair3/SECU/nas_stream_eia2.c index db9fc8444d..0c31767022 100644 --- a/openair3/SECU/nas_stream_eia2.c +++ b/openair3/SECU/nas_stream_eia2.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SECU/rijndael.c b/openair3/SECU/rijndael.c index 747ea0df51..facdced45a 100644 --- a/openair3/SECU/rijndael.c +++ b/openair3/SECU/rijndael.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include /* Rijndael S-box SR */ diff --git a/openair3/SECU/rijndael.h b/openair3/SECU/rijndael.h index 4dd704dd94..c2146c85ff 100644 --- a/openair3/SECU/rijndael.h +++ b/openair3/SECU/rijndael.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef RIJNDAEL_H_ #define RIJNDAEL_H_ /* Rijndael S-box SR */ diff --git a/openair3/SECU/secu_defs.h b/openair3/SECU/secu_defs.h index 40954b8ed7..7f8aa20e17 100644 --- a/openair3/SECU/secu_defs.h +++ b/openair3/SECU/secu_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef SECU_DEFS_H_ #define SECU_DEFS_H_ diff --git a/openair3/SECU/snow3g.c b/openair3/SECU/snow3g.c index dc3bcbf292..89304b4aab 100644 --- a/openair3/SECU/snow3g.c +++ b/openair3/SECU/snow3g.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/SECU/snow3g.h b/openair3/SECU/snow3g.h index 4316400455..26b70e2385 100644 --- a/openair3/SECU/snow3g.h +++ b/openair3/SECU/snow3g.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file snow3g.h * \brief * \author Open source Adapted from Specification of the 3GPP Confidentiality and diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index ea2789a688..097cf37563 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* generate_scenario.c ------------------- diff --git a/openair3/TEST/EPC_TEST/generate_scenario.h b/openair3/TEST/EPC_TEST/generate_scenario.h index 2dbcc8ddc7..96b2adc7a3 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.h +++ b/openair3/TEST/EPC_TEST/generate_scenario.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* generate_scenario.h ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index 081d0e5eaf..05c99d96ee 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 1e46dff3d6..a3a900cf7e 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario.h ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_decode.c b/openair3/TEST/EPC_TEST/play_scenario_decode.c index c80e728029..ec5408e769 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_decode.c +++ b/openair3/TEST/EPC_TEST/play_scenario_decode.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario_decode.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_display.c b/openair3/TEST/EPC_TEST/play_scenario_display.c index a4fca02ec5..294f277e7d 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_display.c +++ b/openair3/TEST/EPC_TEST/play_scenario_display.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario_display.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index 0dace298ec..ba8edc185f 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario_fsm.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index 51078f4576..8fb05cc912 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario_parse.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 78b95e17c0..f1bbe393be 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario_s1ap.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 866b128704..f99f0b0776 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario_s1ap_compare_ie.c ------------------- diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h index a8e6ff519a..d7c1899c51 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "queue.h" diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index e542652853..5bc4f918be 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* play_scenario_sctp.c ------------------- diff --git a/openair3/TEST/oaisim_mme_client_test.c b/openair3/TEST/oaisim_mme_client_test.c index b81c2c6e49..75d163de21 100644 --- a/openair3/TEST/oaisim_mme_client_test.c +++ b/openair3/TEST/oaisim_mme_client_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/oaisim_mme_itti_test.c b/openair3/TEST/oaisim_mme_itti_test.c index 9f233f5bf1..e8de70f8e6 100644 --- a/openair3/TEST/oaisim_mme_itti_test.c +++ b/openair3/TEST/oaisim_mme_itti_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/oaisim_mme_list_benchmark.c b/openair3/TEST/oaisim_mme_list_benchmark.c index b91817d128..0d5b8305b4 100644 --- a/openair3/TEST/oaisim_mme_list_benchmark.c +++ b/openair3/TEST/oaisim_mme_list_benchmark.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/oaisim_mme_s1ap_test.c b/openair3/TEST/oaisim_mme_s1ap_test.c index 1397a30ac5..9680291918 100644 --- a/openair3/TEST/oaisim_mme_s1ap_test.c +++ b/openair3/TEST/oaisim_mme_s1ap_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/oaisim_mme_sctp_test.c b/openair3/TEST/oaisim_mme_sctp_test.c index b64e4f8dad..7fb56940c4 100644 --- a/openair3/TEST/oaisim_mme_sctp_test.c +++ b/openair3/TEST/oaisim_mme_sctp_test.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c.c b/openair3/TEST/oaisim_mme_test_s1c.c index 94708d73ae..93275ea9fe 100644 --- a/openair3/TEST/oaisim_mme_test_s1c.c +++ b/openair3/TEST/oaisim_mme_test_s1c.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c.h b/openair3/TEST/oaisim_mme_test_s1c.h index b12b43842e..7075f75515 100644 --- a/openair3/TEST/oaisim_mme_test_s1c.h +++ b/openair3/TEST/oaisim_mme_test_s1c.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + typedef struct s1c_test_s { int scenario_index; int tx_next_message_index; diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c b/openair3/TEST/oaisim_mme_test_s1c_s1ap.c index 1ebfb3bfd0..16a22d3cb1 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c +++ b/openair3/TEST/oaisim_mme_test_s1c_s1ap.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h index 5fea0903b6..72d808be9c 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h +++ b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.c b/openair3/TEST/oaisim_mme_test_s1c_scenario.c index 478f0a2519..25698edd1f 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario.c +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.h b/openair3/TEST/oaisim_mme_test_s1c_scenario.h index a08c83b969..82950a9355 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario.h +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario1.c b/openair3/TEST/oaisim_mme_test_s1c_scenario1.c index 203259cd74..4589b26191 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario1.c +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario1.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "oaisim_mme_test_s1c_scenario.h" diff --git a/openair3/TEST/test_aes128_cmac_encrypt.c b/openair3/TEST/test_aes128_cmac_encrypt.c index 1230df9d7b..085e000647 100644 --- a/openair3/TEST/test_aes128_cmac_encrypt.c +++ b/openair3/TEST/test_aes128_cmac_encrypt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_aes128_ctr_decrypt.c b/openair3/TEST/test_aes128_ctr_decrypt.c index d642728802..4a089c617e 100644 --- a/openair3/TEST/test_aes128_ctr_decrypt.c +++ b/openair3/TEST/test_aes128_ctr_decrypt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_aes128_ctr_encrypt.c b/openair3/TEST/test_aes128_ctr_encrypt.c index a49ea99764..50d33a1741 100644 --- a/openair3/TEST/test_aes128_ctr_encrypt.c +++ b/openair3/TEST/test_aes128_ctr_encrypt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_kdf.c b/openair3/TEST/test_kdf.c index e96f3fdb30..42d91f48a5 100644 --- a/openair3/TEST/test_kdf.c +++ b/openair3/TEST/test_kdf.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_s1ap.c b/openair3/TEST/test_s1ap.c index 9d618d9487..dec21ee1b6 100644 --- a/openair3/TEST/test_s1ap.c +++ b/openair3/TEST/test_s1ap.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/openair3/TEST/test_secu.c b/openair3/TEST/test_secu.c index ed1a9f721a..2b1b101ae0 100644 --- a/openair3/TEST/test_secu.c +++ b/openair3/TEST/test_secu.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_secu_kenb.c b/openair3/TEST/test_secu_kenb.c index 843c04d850..edab024549 100644 --- a/openair3/TEST/test_secu_kenb.c +++ b/openair3/TEST/test_secu_kenb.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_secu_knas.c b/openair3/TEST/test_secu_knas.c index 54dd4cc5f1..bcfac758ec 100644 --- a/openair3/TEST/test_secu_knas.c +++ b/openair3/TEST/test_secu_knas.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eea1.c b/openair3/TEST/test_secu_knas_encrypt_eea1.c index dc83308b57..3335decb6e 100644 --- a/openair3/TEST/test_secu_knas_encrypt_eea1.c +++ b/openair3/TEST/test_secu_knas_encrypt_eea1.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eea2.c b/openair3/TEST/test_secu_knas_encrypt_eea2.c index 3dd5fcd1ee..e300b3b0ea 100644 --- a/openair3/TEST/test_secu_knas_encrypt_eea2.c +++ b/openair3/TEST/test_secu_knas_encrypt_eea2.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eia1.c b/openair3/TEST/test_secu_knas_encrypt_eia1.c index b42c324c3c..fbfbc35b71 100644 --- a/openair3/TEST/test_secu_knas_encrypt_eia1.c +++ b/openair3/TEST/test_secu_knas_encrypt_eia1.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eia2.c b/openair3/TEST/test_secu_knas_encrypt_eia2.c index 89cae0e02c..7e7517be77 100644 --- a/openair3/TEST/test_secu_knas_encrypt_eia2.c +++ b/openair3/TEST/test_secu_knas_encrypt_eia2.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/TEST/test_secu_knas_stream_int.c b/openair3/TEST/test_secu_knas_stream_int.c index 0c7d023e02..6773397085 100644 --- a/openair3/TEST/test_secu_knas_stream_int.c +++ b/openair3/TEST/test_secu_knas_stream_int.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/UDP/udp_eNB_task.c b/openair3/UDP/udp_eNB_task.c index ef573622bc..b11f51e5fd 100644 --- a/openair3/UDP/udp_eNB_task.c +++ b/openair3/UDP/udp_eNB_task.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file udp_eNB_task.c * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/UDP/udp_eNB_task.h b/openair3/UDP/udp_eNB_task.h index 94a092c536..d8a22417c0 100644 --- a/openair3/UDP/udp_eNB_task.h +++ b/openair3/UDP/udp_eNB_task.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file udp_eNB_task.h * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/UTILS/conversions.c b/openair3/UTILS/conversions.c index 628d8de72b..3b926de259 100644 --- a/openair3/UTILS/conversions.c +++ b/openair3/UTILS/conversions.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h index 547bb97ac2..da8461b390 100644 --- a/openair3/UTILS/conversions.h +++ b/openair3/UTILS/conversions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "assertions.h" #ifndef CONVERSIONS_H_ diff --git a/openair3/UTILS/enum_string.c b/openair3/UTILS/enum_string.c index ce735bd8a4..c4af7f9e0d 100644 --- a/openair3/UTILS/enum_string.c +++ b/openair3/UTILS/enum_string.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/UTILS/enum_string.h b/openair3/UTILS/enum_string.h index 017edbd928..a16c33b71b 100644 --- a/openair3/UTILS/enum_string.h +++ b/openair3/UTILS/enum_string.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef ENUM_STRING_H_ #define ENUM_STRING_H_ diff --git a/openair3/UTILS/log.c b/openair3/UTILS/log.c index c3bedbfa95..9c7fe79ef8 100644 --- a/openair3/UTILS/log.c +++ b/openair3/UTILS/log.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair3/UTILS/log.h b/openair3/UTILS/log.h index 516d7ab78b..729c12687a 100644 --- a/openair3/UTILS/log.h +++ b/openair3/UTILS/log.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "mme_config.h" #ifndef LOG_H_ diff --git a/openair3/UTILS/mcc_mnc_itu.c b/openair3/UTILS/mcc_mnc_itu.c index ef1ad151a5..69ac1d9024 100644 --- a/openair3/UTILS/mcc_mnc_itu.c +++ b/openair3/UTILS/mcc_mnc_itu.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair3/UTILS/mcc_mnc_itu.h b/openair3/UTILS/mcc_mnc_itu.h index 3d446abad9..22531aef48 100644 --- a/openair3/UTILS/mcc_mnc_itu.h +++ b/openair3/UTILS/mcc_mnc_itu.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Source mcc_mnc.h diff --git a/openair3/UTILS/mme_config.c b/openair3/UTILS/mme_config.c index f82a9f16ff..6b97cc674e 100644 --- a/openair3/UTILS/mme_config.c +++ b/openair3/UTILS/mme_config.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair3/UTILS/mme_config.h b/openair3/UTILS/mme_config.h index b4dae36a8a..448de95920 100644 --- a/openair3/UTILS/mme_config.h +++ b/openair3/UTILS/mme_config.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include diff --git a/openair3/UTILS/mme_default_values.h b/openair3/UTILS/mme_default_values.h index a5b9abaa6d..5c9ad7d3ec 100644 --- a/openair3/UTILS/mme_default_values.h +++ b/openair3/UTILS/mme_default_values.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef MME_DEFAULT_VALUES_H_ #define MME_DEFAULT_VALUES_H_ diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index b8596aa380..0c15865b37 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** bladerf_lib.c * * Author: navid nikaein diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h index 4510dd3900..11a4a98e57 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** bladerf_lib.h * * Author: navid nikaein diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index 022c626aa5..7433b5d618 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file common_lib.c * \brief common APIs for different RF frontend device * \author HongliangXU, Navid Nikaein diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index a9d6bdc2c8..f43bad3409 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file common_lib.h * \brief common APIs for different RF frontend device * \author HongliangXU, Navid Nikaein diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index 7545ae5b6e..d7201152fc 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index 101632299b..6ee1b879d1 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index fd37553524..d840819fe7 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 22d28ce749..c235281968 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file ethernet_lib.h * \brief API to stream I/Q samples over standard ethernet * \author Katerina Trilyraki, Navid Nikaein diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index d02bff8212..aca8cb7f1f 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h * \brief * \author S. Sandeep Kumar, Raymond Knopp diff --git a/targets/ARCH/EXMIMO/DEFS/openair_device.h b/targets/ARCH/EXMIMO/DEFS/openair_device.h index 5c5b5585c0..4dbd5ec171 100644 --- a/targets/ARCH/EXMIMO/DEFS/openair_device.h +++ b/targets/ARCH/EXMIMO/DEFS/openair_device.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef OPENAIR_DEVICE_H #define OPENAIR_DEVICE_H diff --git a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h index 665cfaf638..0485c154f9 100644 --- a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h +++ b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** pcie_interface.h Interface definitions to handle communication between PC (kernel driver & SDR application) and Leon3 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h index 9e3eb64df4..1665a76b08 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __DEFS_H__ #define __DEFS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c index 7520004e91..993b2db2ee 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** exmimo_fw.c * * Initialization routines for diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h index 248545fd67..07e094b966 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __EXTERN_H__ #define __EXTERN_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c index 8a25adafca..7efdbd5ae8 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** fileops.c * * Device IOCTL File Operations on character device /dev/openair0 diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c index 4606154290..513adfaf96 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** irq.c - IRQ Handler: IRQ from Leon to PCIe/Kernel: exmimo_irq_handler - sends received packets to userspace diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c index bc890008cc..706246b96e 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** module_main.c (was: device.c) * * Main Kernel module functions for load/init and cleanup of the kernel driver diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h index 5a284fbe9e..3cbaacfdca 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __VARS_H__ #define __VARS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h index 9e3eb64df4..1665a76b08 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __DEFS_H__ #define __DEFS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c index c3d2589821..6ce753cba6 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** exmimo_fw.c * * Initialization routines for diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h index 248545fd67..07e094b966 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __EXTERN_H__ #define __EXTERN_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c index c5ce9fb81e..7e36b138e9 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** fileops.c * * Device IOCTL File Operations on character device /dev/openair0 diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c index 4606154290..513adfaf96 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** irq.c - IRQ Handler: IRQ from Leon to PCIe/Kernel: exmimo_irq_handler - sends received packets to userspace diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c index e4f11d6fc6..afea3f707c 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** module_main.c (was: device.c) * * Main Kernel module functions for load/init and cleanup of the kernel driver diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h index 5a284fbe9e..3cbaacfdca 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __VARS_H__ #define __VARS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c index e97be04c34..93fe053ed1 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "em1_drv.h" static irqreturn_t irq_handler(int irq, void *dev_id) diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c index c6bf1ed3d4..0187959fab 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "em1_drv.h" MODULE_AUTHOR("Alexandre Becoulet, Cerdan Sebastien"); diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h index 007e36dbc8..6cf700400a 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef USER_APP #include diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c index 03a1c8ba41..69103db99b 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "em1_drv.h" int em1_fifo_write(struct em1_private_s *pv, const uint32_t *buf, size_t count) diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c index c6605f537f..3f50766fcc 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "em1_drv.h" static int em1_ioctl_fifo_write(struct em1_private_s *pv, size_t size, uint32_t *words) diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c index 7ad3a83cf1..065d8c9595 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "em1_drv.h" diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c index 26be0eb815..d46ff92a70 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "em1_drv.h" void em1_unlock_user_page(struct em1_page_s *ep) diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c index 62318bbba4..1e081ae2bb 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "openair0_lib.h" diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c index 2fd394887c..0b2c6afaa5 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "openair0_lib.h" #include "gain_control.h" //#define DEBUG_PHY diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h index 426113de98..9524c912d7 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define TARGET_RX_POWER 50 // Target digital power for the AGC #define TARGET_RX_POWER_MAX 53 // Maximum digital power for AGC #define TARGET_RX_POWER_MIN 48 // Minimum digital power for AGC diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 7035bf9671..1fd8796f56 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** openair0_lib : API to interface with ExpressMIMO-1&2 kernel driver * * Authors: Matthias Ihmig , 2013 diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h index dfcfc0a75a..7c0e63290b 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** openair0_lib : API to interface with ExpressMIMO kernel driver * * Authors: Matthias Ihmig , 2013 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c index 860887599b..04c0ffebbc 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* C Header file for updatefw tool. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h index 06d2ddea4d..1bcd2f99be 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* C Header file for updatefw tool. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h index ba6f2b142f..204fca6afd 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h @@ -1 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + volatile int oai_exit=0; diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 2165425c70..104b64dd35 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp index 32938bbd24..f8401dc391 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** sodera_lib.c * * Author: Raymond Knopp diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 8c2a2e741f..39e45f31f4 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** usrp_lib.cpp * * \author: HongliangXU : hong-liang-xu@agilent.com diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c index 47d869bc2b..9a1a14baeb 100644 --- a/targets/COMMON/create_tasks.c +++ b/targets/COMMON/create_tasks.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #if defined(ENABLE_ITTI) # include "intertask_interface.h" # include "create_tasks.h" diff --git a/targets/COMMON/create_tasks.h b/targets/COMMON/create_tasks.h index 6263d7f8d6..6545f4b9d9 100644 --- a/targets/COMMON/create_tasks.h +++ b/targets/COMMON/create_tasks.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef CREATE_TASKS_H_ #define CREATE_TASKS_H_ diff --git a/targets/RT/USER/TOOLS/thread_ipc.c b/targets/RT/USER/TOOLS/thread_ipc.c index bc4d0ed2fb..5e9adb0bcc 100644 --- a/targets/RT/USER/TOOLS/thread_ipc.c +++ b/targets/RT/USER/TOOLS/thread_ipc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/RT/USER/TOOLS/thread_ipc.h b/targets/RT/USER/TOOLS/thread_ipc.h index c0221d6a77..a39f8d22fb 100644 --- a/targets/RT/USER/TOOLS/thread_ipc.h +++ b/targets/RT/USER/TOOLS/thread_ipc.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __THREAD_IPC_H__ #define __THREAD_IPC_H__ diff --git a/targets/RT/USER/UE_transport_IQ.c b/targets/RT/USER/UE_transport_IQ.c index b2b4ff42c2..8bbb78b4a3 100644 --- a/targets/RT/USER/UE_transport_IQ.c +++ b/targets/RT/USER/UE_transport_IQ.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file UE_transport_IQ.c * \brief UE transport IQ sampels * \author Katerina Trilyraki, Navid Nikaein, Raymond Knopp diff --git a/targets/RT/USER/condtest.c b/targets/RT/USER/condtest.c index ffd755e59a..23b5d23a5b 100644 --- a/targets/RT/USER/condtest.c +++ b/targets/RT/USER/condtest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/RT/USER/eNB_transport_IQ.c b/targets/RT/USER/eNB_transport_IQ.c index 94164d3a45..fb351af6d6 100644 --- a/targets/RT/USER/eNB_transport_IQ.c +++ b/targets/RT/USER/eNB_transport_IQ.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file eNB_transport_IQ.c * \brief eNB transport IQ samples * \author Katerina Trilyraki, Navid Nikaein, Raymond Knopp diff --git a/targets/RT/USER/emos-raw.c b/targets/RT/USER/emos-raw.c index f6bb712976..16709da7cf 100644 --- a/targets/RT/USER/emos-raw.c +++ b/targets/RT/USER/emos-raw.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file lte-softmodem.c * \brief main program to control HW and scheduling * \author R. Knopp, F. Kaltenberger diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 60f930f6b7..711dee2733 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file lte-enb.c * \brief Top-level threads for eNodeB * \author R. Knopp, F. Kaltenberger, Navid Nikaein diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 4d72e4ff25..fa1d1b33e6 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file lte-enb.c * \brief Top-level threads for eNodeB * \author R. Knopp, F. Kaltenberger, Navid Nikaein diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 249d30efdd..8d0a899818 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file lte-ue.c * \brief threads and support functions for real-time LTE UE target * \author R. Knopp, F. Kaltenberger, Navid Nikaein diff --git a/targets/RT/USER/msg_helper.c b/targets/RT/USER/msg_helper.c index fcba4ce6a1..32a0da6cd4 100644 --- a/targets/RT/USER/msg_helper.c +++ b/targets/RT/USER/msg_helper.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "msg_many.h" diff --git a/targets/RT/USER/msg_many.c b/targets/RT/USER/msg_many.c index cf62d5d21c..ec582558a4 100644 --- a/targets/RT/USER/msg_many.c +++ b/targets/RT/USER/msg_many.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/RT/USER/msg_many.h b/targets/RT/USER/msg_many.h index 0668a53f04..ca5fd85b51 100644 --- a/targets/RT/USER/msg_many.h +++ b/targets/RT/USER/msg_many.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __MSG_MANY_H__ #define __MSG_MANY_H__ #include diff --git a/targets/RT/USER/rrh.c b/targets/RT/USER/rrh.c index bcd83498b4..f658e6b401 100644 --- a/targets/RT/USER/rrh.c +++ b/targets/RT/USER/rrh.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** ethernet_lib : API to stream I/Q samples over standard ethernet (RRH component) * * Authors: Raymond Knopp , Riadh Ghaddab diff --git a/targets/RT/USER/rrh_gw.c b/targets/RT/USER/rrh_gw.c index e52eeda79b..4abdaa243d 100644 --- a/targets/RT/USER/rrh_gw.c +++ b/targets/RT/USER/rrh_gw.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrh_gw.h * \brief top-level for the remote radio head gateway (RRH_gw) module reusing the ethernet library diff --git a/targets/RT/USER/rrh_gw.h b/targets/RT/USER/rrh_gw.h index 8a2d050231..075cbf3c2b 100644 --- a/targets/RT/USER/rrh_gw.h +++ b/targets/RT/USER/rrh_gw.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrh_gw.h * \brief header file for remote radio head gateway (RRH_gw) module * \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp diff --git a/targets/RT/USER/rrh_gw_externs.h b/targets/RT/USER/rrh_gw_externs.h index ec42da2ad5..b85f0ae7a2 100644 --- a/targets/RT/USER/rrh_gw_externs.h +++ b/targets/RT/USER/rrh_gw_externs.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rrh_gw_extern.h * \brief rrh gatewy external vars * \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp diff --git a/targets/RT/USER/rt_wrapper.c b/targets/RT/USER/rt_wrapper.c index 2ef10db729..06a625d1ea 100644 --- a/targets/RT/USER/rt_wrapper.c +++ b/targets/RT/USER/rt_wrapper.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rt_wrapper.h * \brief provides a wrapper for the timing function, runtime calculations for real-time opeartions depending on weather RTAI or DEADLINE_SCHEDULER kernels are used or not * \author F. Kaltenberger and Navid Nikaein diff --git a/targets/RT/USER/rt_wrapper.h b/targets/RT/USER/rt_wrapper.h index 706e9b22f1..ca0507e003 100644 --- a/targets/RT/USER/rt_wrapper.h +++ b/targets/RT/USER/rt_wrapper.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file rt_wrapper.h * \brief provides a wrapper for the timing function for real-time opeartions. It also implements an API for the SCHED_DEADLINE kernel scheduler. * \author F. Kaltenberger and Navid Nikaein diff --git a/targets/RT/USER/sleeptest.c b/targets/RT/USER/sleeptest.c index ba7cfd5554..593e62dfac 100644 --- a/targets/RT/USER/sleeptest.c +++ b/targets/RT/USER/sleeptest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file lte-softmodem.c * \brief main program to control HW and scheduling * \author R. Knopp, F. Kaltenberger diff --git a/targets/RT/USER/stats.c b/targets/RT/USER/stats.c index 0dd7a80052..4d9343f4bc 100644 --- a/targets/RT/USER/stats.c +++ b/targets/RT/USER/stats.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Form definition file generated by fdesign */ #include diff --git a/targets/RT/USER/stats.h b/targets/RT/USER/stats.h index 6e945cebdf..7be9380852 100644 --- a/targets/RT/USER/stats.h +++ b/targets/RT/USER/stats.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Header file generated by fdesign on Thu Aug 28 12:13:51 2014 */ #ifndef FD_stats_form_h_ diff --git a/targets/RT/USER/synctest.c b/targets/RT/USER/synctest.c index b9a3bf25e5..6122f67cd0 100644 --- a/targets/RT/USER/synctest.c +++ b/targets/RT/USER/synctest.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file lte-softmodem.c * \brief main program to control HW and scheduling * \author R. Knopp, F. Kaltenberger diff --git a/targets/SIMU/PROC/Process.c b/targets/SIMU/PROC/Process.c index 48adea99ad..ee3d6d5c53 100644 --- a/targets/SIMU/PROC/Process.c +++ b/targets/SIMU/PROC/Process.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/SIMU/PROC/Process.h b/targets/SIMU/PROC/Process.h index 6931bd54a5..1ab2f3be15 100644 --- a/targets/SIMU/PROC/Process.h +++ b/targets/SIMU/PROC/Process.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __PROCESS_H__ # define __PROCESS_H__ diff --git a/targets/SIMU/PROC/Tsync.h b/targets/SIMU/PROC/Tsync.h index 84dfede802..a60501c13e 100644 --- a/targets/SIMU/PROC/Tsync.h +++ b/targets/SIMU/PROC/Tsync.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * Tsync.h * diff --git a/targets/SIMU/PROC/channel_sim_proc.c b/targets/SIMU/PROC/channel_sim_proc.c index d9c0786b51..0ffdd97ce0 100644 --- a/targets/SIMU/PROC/channel_sim_proc.c +++ b/targets/SIMU/PROC/channel_sim_proc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/SIMU/PROC/channel_sim_proc.h b/targets/SIMU/PROC/channel_sim_proc.h index c2543ad284..d95f3e7aab 100644 --- a/targets/SIMU/PROC/channel_sim_proc.h +++ b/targets/SIMU/PROC/channel_sim_proc.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * channel_sim_proc.h * diff --git a/targets/SIMU/PROC/interface.h b/targets/SIMU/PROC/interface.h index 4c78ad2436..52b100f594 100644 --- a/targets/SIMU/PROC/interface.h +++ b/targets/SIMU/PROC/interface.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef __INTERFACE_H__ # define __INTERFACE_H__ diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index 2740ad024a..a884fd5624 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/SIMU/USER/cor_SF_sim.c b/targets/SIMU/USER/cor_SF_sim.c index 6db7323801..ea464a60dc 100644 --- a/targets/SIMU/USER/cor_SF_sim.c +++ b/targets/SIMU/USER/cor_SF_sim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "cor_SF_sim.h" double ** createMat (int nbRow, int nbCol) diff --git a/targets/SIMU/USER/cor_SF_sim.h b/targets/SIMU/USER/cor_SF_sim.h index 1e2e7c0f11..3e2933cc98 100644 --- a/targets/SIMU/USER/cor_SF_sim.h +++ b/targets/SIMU/USER/cor_SF_sim.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/SIMU/USER/event_handler.c b/targets/SIMU/USER/event_handler.c index 27d5af13e3..f2199ca910 100644 --- a/targets/SIMU/USER/event_handler.c +++ b/targets/SIMU/USER/event_handler.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file event_handler.c * \brief event handler primitives * \author Navid Nikaein and Mohamed Said MOSLI BOUKSIAA, diff --git a/targets/SIMU/USER/event_handler.h b/targets/SIMU/USER/event_handler.h index 00c4ff3ab5..c315af4b89 100644 --- a/targets/SIMU/USER/event_handler.h +++ b/targets/SIMU/USER/event_handler.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file event_handler.h * \brief primitives to handle event acting on oai * \author Navid Nikaein and Mohamed Said MOSLI BOUKSIAA, diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index ee6d624b45..5a742e9e61 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/SIMU/USER/init_lte.h b/targets/SIMU/USER/init_lte.h index 96806a3639..bcb2570565 100644 --- a/targets/SIMU/USER/init_lte.h +++ b/targets/SIMU/USER/init_lte.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "PHY/types.h" #include "PHY/defs.h" diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 38fe783f04..030da2612d 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file oaisim.c * \brief oaisim top level * \author Navid Nikaein diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h index fcef3ff225..d68e34462e 100644 --- a/targets/SIMU/USER/oaisim.h +++ b/targets/SIMU/USER/oaisim.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/SIMU/USER/oaisim_config.c b/targets/SIMU/USER/oaisim_config.c index 4b5fe1a2e3..e3aac4f481 100644 --- a/targets/SIMU/USER/oaisim_config.c +++ b/targets/SIMU/USER/oaisim_config.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file oaisim_config.c * \brief Configuration of oaisim * \author Navid Nikaein diff --git a/targets/SIMU/USER/oaisim_config.h b/targets/SIMU/USER/oaisim_config.h index 6e53f23dea..3d504a93eb 100644 --- a/targets/SIMU/USER/oaisim_config.h +++ b/targets/SIMU/USER/oaisim_config.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file oaisim_config.h * \brief configure an emulation * \author navid nikaein & Lusheng Wang diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 2e9381216a..01436d0c3e 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*! \file oaisim_functions.c * \brief function primitives of oaisim * \author Navid Nikaein diff --git a/targets/SIMU/USER/oaisim_functions.h b/targets/SIMU/USER/oaisim_functions.h index 944797bc12..14e449921d 100644 --- a/targets/SIMU/USER/oaisim_functions.h +++ b/targets/SIMU/USER/oaisim_functions.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include "oaisim.h" #include #include diff --git a/targets/SIMU/USER/oaisim_pad.c b/targets/SIMU/USER/oaisim_pad.c index 8ac11c11c3..153a522cd4 100644 --- a/targets/SIMU/USER/oaisim_pad.c +++ b/targets/SIMU/USER/oaisim_pad.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/SIMU/USER/phy_procedures_sim_form.c b/targets/SIMU/USER/phy_procedures_sim_form.c index 5dd422599b..f6a4451a1c 100644 --- a/targets/SIMU/USER/phy_procedures_sim_form.c +++ b/targets/SIMU/USER/phy_procedures_sim_form.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Form definition file generated with fdesign. */ #include diff --git a/targets/SIMU/USER/phy_procedures_sim_form.h b/targets/SIMU/USER/phy_procedures_sim_form.h index 4d66a9121b..80e78ce2b1 100644 --- a/targets/SIMU/USER/phy_procedures_sim_form.h +++ b/targets/SIMU/USER/phy_procedures_sim_form.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** Header file generated with fdesign on Tue Jul 27 16:31:42 2010.**/ #ifndef FD_phy_procedures_sim_h_ diff --git a/targets/SIMU/USER/sinr_sim.c b/targets/SIMU/USER/sinr_sim.c index f0137e5b41..fbd15abaae 100644 --- a/targets/SIMU/USER/sinr_sim.c +++ b/targets/SIMU/USER/sinr_sim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/AT_COMMANDS/oaisim.c b/targets/TEST/AT_COMMANDS/oaisim.c old mode 100755 new mode 100644 index 88f31a5481..2f478929cc --- a/targets/TEST/AT_COMMANDS/oaisim.c +++ b/targets/TEST/AT_COMMANDS/oaisim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/PACKET_TRACER/pt.c b/targets/TEST/PACKET_TRACER/pt.c index c94c326e22..928c69f588 100644 --- a/targets/TEST/PACKET_TRACER/pt.c +++ b/targets/TEST/PACKET_TRACER/pt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/PDCP/test_pdcp.c b/targets/TEST/PDCP/test_pdcp.c old mode 100755 new mode 100644 index bce5cd31a9..952415f1ae --- a/targets/TEST/PDCP/test_pdcp.c +++ b/targets/TEST/PDCP/test_pdcp.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * PDCP test code * diff --git a/targets/TEST/PDCP/test_pdcp.h b/targets/TEST/PDCP/test_pdcp.h index ce3004a8a3..5bbb73bdbf 100644 --- a/targets/TEST/PDCP/test_pdcp.h +++ b/targets/TEST/PDCP/test_pdcp.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * PDCP test code * diff --git a/targets/TEST/PDCP/test_util.h b/targets/TEST/PDCP/test_util.h index 470aa94038..3fa71b586a 100644 --- a/targets/TEST/PDCP/test_util.h +++ b/targets/TEST/PDCP/test_util.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * Helper methods for PDCP test code diff --git a/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c b/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c old mode 100755 new mode 100644 index b894d7f11c..0c1500fd5e --- a/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c +++ b/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define PDCP_C #include #include diff --git a/targets/TEST/RLC_AM_V9.3.0/oaisim.c b/targets/TEST/RLC_AM_V9.3.0/oaisim.c old mode 100755 new mode 100644 index 0ca46b291a..5b7a911d83 --- a/targets/TEST/RLC_AM_V9.3.0/oaisim.c +++ b/targets/TEST/RLC_AM_V9.3.0/oaisim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/RLC_UM_V9.3.0/oaisim.c b/targets/TEST/RLC_UM_V9.3.0/oaisim.c old mode 100755 new mode 100644 index af0aad8aa9..1fb8f595d4 --- a/targets/TEST/RLC_UM_V9.3.0/oaisim.c +++ b/targets/TEST/RLC_UM_V9.3.0/oaisim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp b/targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp index b211ab0bce..b5f5e2a961 100644 --- a/targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp +++ b/targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "TcpClient.h" diff --git a/targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp b/targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp index 812b310221..67804c1e3e 100644 --- a/targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp +++ b/targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/ROHDE_SCHWARZ/TcpClient.h b/targets/TEST/ROHDE_SCHWARZ/TcpClient.h index 3d064e86ba..b1cda37275 100644 --- a/targets/TEST/ROHDE_SCHWARZ/TcpClient.h +++ b/targets/TEST/ROHDE_SCHWARZ/TcpClient.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include //defines structs for socket handling From 5ab5c3ebbdd097e1c9387721920cda44e0f37244 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 27 Sep 2016 17:01:54 +0200 Subject: [PATCH 259/340] delete bsearch.c and bsearch.h from source tree they are not referenced in CMakeLists.txt (so says grep) --- openair2/RRC/LITE/MESSAGES/bsearch.c | 57 ---------------------------- openair2/RRC/LITE/MESSAGES/bsearch.h | 9 ----- 2 files changed, 66 deletions(-) delete mode 100644 openair2/RRC/LITE/MESSAGES/bsearch.c delete mode 100644 openair2/RRC/LITE/MESSAGES/bsearch.h diff --git a/openair2/RRC/LITE/MESSAGES/bsearch.c b/openair2/RRC/LITE/MESSAGES/bsearch.c deleted file mode 100644 index 9f54633d6e..0000000000 --- a/openair2/RRC/LITE/MESSAGES/bsearch.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * A generic implementation of binary search for the Linux kernel - * - * Copyright (C) 2008-2009 Ksplice, Inc. - * Author: Tim Abbott - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; version 2. - */ - -#include -#include "bsearch.h" - -/* - * bsearch - binary search an array of elements - * @key: pointer to item being searched for - * @base: pointer to data to sort - * @num: number of elements - * @size: size of each element - * @cmp: pointer to comparison function - * - * This function does a binary search on the given array. The - * contents of the array should already be in ascending sorted order - * under the provided comparison function. - * - * Note that the key need not have the same type as the elements in - * the array, e.g. key could be a string and the comparison function - * could compare the string with the struct's name field. However, if - * the key and elements in the array are of the same type, you can use - * the same comparison function for both sort() and bsearch(). - */ -void *bsearch(const void *key, const void *base, size_t num, size_t size, - int (*cmp)(const void *key, const void *elt)) -{ - int start = 0, end = num - 1, mid, result; - - if (num == 0) { - return NULL; - } - - while (start <= end) { - mid = (start + end) / 2; - result = cmp(key, base + mid * size); - - if (result < 0) { - end = mid - 1; - } else if (result > 0) { - start = mid + 1; - } else { - return (void *)base + mid * size; - } - } - - return NULL; -} -//EXPORT_SYMBOL(bsearch); diff --git a/openair2/RRC/LITE/MESSAGES/bsearch.h b/openair2/RRC/LITE/MESSAGES/bsearch.h deleted file mode 100644 index fb769a2bf4..0000000000 --- a/openair2/RRC/LITE/MESSAGES/bsearch.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _LINUX_BSEARCH_H -#define _LINUX_BSEARCH_H - -#include - -void *bsearch(const void *key, const void *base, size_t num, size_t size, - int (*cmp)(const void *key, const void *elt)); - -#endif /* _LINUX_BSEARCH_H */ From 1f771421589180bb30d2d3b43ac694fb5dcde063 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 27 Sep 2016 10:47:56 -0700 Subject: [PATCH 260/340] addition of dfts of size 18432 for PRACH TX/RX with 23.04 Ms/s sampling (15/20 MHz BW). --- openair1/PHY/LTE_TRANSPORT/prach.c | 53 ++++++++++----------- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 2 + openair1/PHY/TOOLS/lte_dfts.c | 51 ++++++++++++++++++-- openair1/PHY/TOOLS/twiddle18432.h | 43 +++++++++++++++++ openair1/PHY/TOOLS/twiddle24576.h | 2 +- 5 files changed, 119 insertions(+), 32 deletions(-) create mode 100644 openair1/PHY/TOOLS/twiddle18432.h diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index aed5ab14c8..dacf078785 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -46,7 +46,7 @@ #include "SCHED/extern.h" #include "UTIL/LOG/vcd_signal_dumper.h" -#define PRACH_DEBUG 1 +//#define PRACH_DEBUG 1 uint16_t NCS_unrestricted[16] = {0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419}; uint16_t NCS_restricted[15] = {15,18,22,26,32,38,46,55,68,82,100,128,158,202,237}; // high-speed case @@ -1009,22 +1009,21 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 } } else { - if (prach_fmt == 4) { - idft3072(prachF,prach2); - //TODO: account for repeated format in dft output - memmove( prach, prach+6144, Ncp<<2 ); - prach_len = 3072+Ncp; - } else { - idft18432(prachF,prach2); - memmove( prach, prach+36864, Ncp<<2 ); - prach_len = 18432+Ncp; - - if (prach_fmt>1) { - memmove( prach2+36834, prach2, 73728 ); - prach_len = 2*18432+Ncp; - } - } - + if (prach_fmt == 4) { + idft3072(prachF,prach2); + //TODO: account for repeated format in dft output + memmove( prach, prach+6144, Ncp<<2 ); + prach_len = 3072+Ncp; + } else { + idft18432(prachF,prach2); + memmove( prach, prach+36864, Ncp<<2 ); + prach_len = 18432+Ncp; + printf("Generated prach for 100 PRB, 3/4 sampling\n"); + if (prach_fmt>1) { + memmove( prach2+36834, prach2, 73728 ); + prach_len = 2*18432+Ncp; + } + } } break; @@ -1052,18 +1051,18 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 ((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; } #if defined(EXMIMO) - // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on - for (k=prach_start - (ue->frame_parms.samples_per_tti>>1) ; kcommon_vars.txdata[0][k+ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else if (k>(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) - ue->common_vars.txdata[0][k-ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else - ue->common_vars.txdata[0][k] &= 0xFFFEFFFE; - } + // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on + for (k=prach_start - (ue->frame_parms.samples_per_tti>>1) ; kcommon_vars.txdata[0][k+ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else if (k>(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) + ue->common_vars.txdata[0][k-ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else + ue->common_vars.txdata[0][k] &= 0xFFFEFFFE; + } #endif #else - + for (i=0; icommon_vars.txdata[0][prach_start]))[2*i] = prach[2*i]; ((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1]; diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 8bdccd9adf..afcce70b7f 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -1200,6 +1200,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, y[i2] = c*ulsch_llr[i++]; i2=(i2+(Cmux<<2)-3); */ + // slightly more optimized version (equivalent to above) for 16QAM to improve computational performance *(__m64 *)&y[i2] = _mm_sign_pi16(*(__m64*)&ulsch_llr[i],*(__m64*)&cseq[i]);i+=4;i2+=(Cmux<<2); @@ -1531,6 +1532,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, // RI + // rank 1 if ((ulsch_harq->O_RI == 1) && (Qprime_RI > 0)) { ulsch_harq->o_RI[0] = ((ulsch_harq->q_RI[0] + ulsch_harq->q_RI[Q_m/2]) > 0) ? 0 : 1; } diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 6bc562811b..26cb0b47a4 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -5680,15 +5680,58 @@ void idft12288(int16_t *input, int16_t *output) // write_output("out.m","out",output,6144,1,1); } +#include "twiddle18432.h" // 6144 x 3 -void dft18432(int16_t *input, int16_t *output) -{ +void dft18432(int16_t *input, int16_t *output) { + int i,i2,j; + uint32_t tmp[3][6144] __attribute__((aligned(32))); + uint32_t tmpo[3][6144] __attribute__((aligned(32))); + + for (i=0,j=0; i<6144; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + dft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0])); + dft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1])); + dft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2])); + + for (i=0,i2=0; i<12288; i+=8,i2+=4) { + bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+12288+i),(simd_q15_t*)(output+24576+i), + (simd_q15_t*)(twa18432+i),(simd_q15_t*)(twb18432+i)); + } + + _mm_empty(); + _m_empty(); } -void idft18432(int16_t *input, int16_t *output) -{ +void idft18432(int16_t *input, int16_t *output) { + int i,i2,j; + uint32_t tmp[3][6144] __attribute__((aligned(32))); + uint32_t tmpo[3][6144] __attribute__((aligned(32))); + + for (i=0,j=0; i<6144; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + idft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0])); + idft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1])); + idft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2])); + + for (i=0,i2=0; i<12288; i+=8,i2+=4) { + ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+12288+i),(simd_q15_t*)(output+24576+i), + (simd_q15_t*)(twa18432+i),(simd_q15_t*)(twb18432+i)); + } + + _mm_empty(); + _m_empty(); } #include "twiddle24576.h" diff --git a/openair1/PHY/TOOLS/twiddle18432.h b/openair1/PHY/TOOLS/twiddle18432.h new file mode 100644 index 0000000000..f21987c4cb --- /dev/null +++ b/openair1/PHY/TOOLS/twiddle18432.h @@ -0,0 +1,43 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:6143)/18432)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:12286)/18432)); +twa2 = zeros(1,12288); +twb2 = zeros(1,12288); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +*/ + +int16_t twa18432[12288] = {32767,0,32766,-12,32766,-23,32766,-34,32766,-45,32766,-56,32766,-68,32766,-79,32766,-90,32766,-101,32766,-112,32766,-123,32766,-135,32766,-146,32766,-157,32766,-168,32766,-179,32766,-190,32766,-202,32766,-213,32766,-224,32766,-235,32766,-246,32765,-257,32765,-269,32765,-280,32765,-291,32765,-302,32765,-313,32765,-324,32765,-336,32765,-347,32765,-358,32764,-369,32764,-380,32764,-391,32764,-403,32764,-414,32764,-425,32764,-436,32763,-447,32763,-458,32763,-470,32763,-481,32763,-492,32763,-503,32762,-514,32762,-525,32762,-537,32762,-548,32762,-559,32762,-570,32761,-581,32761,-592,32761,-604,32761,-615,32761,-626,32760,-637,32760,-648,32760,-659,32760,-671,32759,-682,32759,-693,32759,-704,32759,-715,32758,-726,32758,-738,32758,-749,32758,-760,32757,-771,32757,-782,32757,-793,32757,-805,32756,-816,32756,-827,32756,-838,32756,-849,32755,-860,32755,-872,32755,-883,32754,-894,32754,-905,32754,-916,32753,-927,32753,-939,32753,-950,32752,-961,32752,-972,32752,-983,32751,-994,32751,-1006,32751,-1017,32750,-1028,32750,-1039,32750,-1050,32749,-1061,32749,-1073,32749,-1084,32748,-1095,32748,-1106,32747,-1117,32747,-1128,32747,-1140,32746,-1151,32746,-1162,32746,-1173,32745,-1184,32745,-1195,32744,-1207,32744,-1218,32743,-1229,32743,-1240,32743,-1251,32742,-1262,32742,-1274,32741,-1285,32741,-1296,32740,-1307,32740,-1318,32740,-1329,32739,-1340,32739,-1352,32738,-1363,32738,-1374,32737,-1385,32737,-1396,32736,-1407,32736,-1419,32735,-1430,32735,-1441,32734,-1452,32734,-1463,32733,-1474,32733,-1486,32732,-1497,32732,-1508,32731,-1519,32731,-1530,32730,-1541,32730,-1553,32729,-1564,32729,-1575,32728,-1586,32728,-1597,32727,-1608,32726,-1619,32726,-1631,32725,-1642,32725,-1653,32724,-1664,32724,-1675,32723,-1686,32723,-1698,32722,-1709,32721,-1720,32721,-1731,32720,-1742,32720,-1753,32719,-1764,32718,-1776,32718,-1787,32717,-1798,32717,-1809,32716,-1820,32715,-1831,32715,-1843,32714,-1854,32713,-1865,32713,-1876,32712,-1887,32711,-1898,32711,-1909,32710,-1921,32710,-1932,32709,-1943,32708,-1954,32708,-1965,32707,-1976,32706,-1987,32706,-1999,32705,-2010,32704,-2021,32703,-2032,32703,-2043,32702,-2054,32701,-2066,32701,-2077,32700,-2088,32699,-2099,32699,-2110,32698,-2121,32697,-2132,32696,-2144,32696,-2155,32695,-2166,32694,-2177,32693,-2188,32693,-2199,32692,-2210,32691,-2222,32690,-2233,32690,-2244,32689,-2255,32688,-2266,32687,-2277,32687,-2288,32686,-2300,32685,-2311,32684,-2322,32683,-2333,32683,-2344,32682,-2355,32681,-2366,32680,-2378,32679,-2389,32679,-2400,32678,-2411,32677,-2422,32676,-2433,32675,-2444,32674,-2456,32674,-2467,32673,-2478,32672,-2489,32671,-2500,32670,-2511,32669,-2522,32668,-2534,32668,-2545,32667,-2556,32666,-2567,32665,-2578,32664,-2589,32663,-2600,32662,-2611,32661,-2623,32661,-2634,32660,-2645,32659,-2656,32658,-2667,32657,-2678,32656,-2689,32655,-2701,32654,-2712,32653,-2723,32652,-2734,32651,-2745,32650,-2756,32649,-2767,32649,-2778,32648,-2790,32647,-2801,32646,-2812,32645,-2823,32644,-2834,32643,-2845,32642,-2856,32641,-2867,32640,-2879,32639,-2890,32638,-2901,32637,-2912,32636,-2923,32635,-2934,32634,-2945,32633,-2956,32632,-2968,32631,-2979,32630,-2990,32629,-3001,32628,-3012,32627,-3023,32626,-3034,32625,-3045,32624,-3057,32623,-3068,32622,-3079,32621,-3090,32619,-3101,32618,-3112,32617,-3123,32616,-3134,32615,-3146,32614,-3157,32613,-3168,32612,-3179,32611,-3190,32610,-3201,32609,-3212,32608,-3223,32607,-3234,32605,-3246,32604,-3257,32603,-3268,32602,-3279,32601,-3290,32600,-3301,32599,-3312,32598,-3323,32596,-3334,32595,-3346,32594,-3357,32593,-3368,32592,-3379,32591,-3390,32590,-3401,32588,-3412,32587,-3423,32586,-3434,32585,-3446,32584,-3457,32583,-3468,32581,-3479,32580,-3490,32579,-3501,32578,-3512,32577,-3523,32575,-3534,32574,-3546,32573,-3557,32572,-3568,32571,-3579,32569,-3590,32568,-3601,32567,-3612,32566,-3623,32564,-3634,32563,-3645,32562,-3657,32561,-3668,32559,-3679,32558,-3690,32557,-3701,32556,-3712,32554,-3723,32553,-3734,32552,-3745,32551,-3756,32549,-3768,32548,-3779,32547,-3790,32545,-3801,32544,-3812,32543,-3823,32541,-3834,32540,-3845,32539,-3856,32538,-3867,32536,-3878,32535,-3890,32534,-3901,32532,-3912,32531,-3923,32530,-3934,32528,-3945,32527,-3956,32526,-3967,32524,-3978,32523,-3989,32521,-4000,32520,-4012,32519,-4023,32517,-4034,32516,-4045,32515,-4056,32513,-4067,32512,-4078,32510,-4089,32509,-4100,32508,-4111,32506,-4122,32505,-4133,32503,-4145,32502,-4156,32501,-4167,32499,-4178,32498,-4189,32496,-4200,32495,-4211,32493,-4222,32492,-4233,32491,-4244,32489,-4255,32488,-4266,32486,-4277,32485,-4289,32483,-4300,32482,-4311,32480,-4322,32479,-4333,32477,-4344,32476,-4355,32474,-4366,32473,-4377,32471,-4388,32470,-4399,32468,-4410,32467,-4421,32465,-4432,32464,-4444,32462,-4455,32461,-4466,32459,-4477,32458,-4488,32456,-4499,32455,-4510,32453,-4521,32452,-4532,32450,-4543,32449,-4554,32447,-4565,32445,-4576,32444,-4587,32442,-4598,32441,-4609,32439,-4621,32438,-4632,32436,-4643,32434,-4654,32433,-4665,32431,-4676,32430,-4687,32428,-4698,32426,-4709,32425,-4720,32423,-4731,32422,-4742,32420,-4753,32418,-4764,32417,-4775,32415,-4786,32413,-4797,32412,-4808,32410,-4819,32409,-4831,32407,-4842,32405,-4853,32404,-4864,32402,-4875,32400,-4886,32399,-4897,32397,-4908,32395,-4919,32394,-4930,32392,-4941,32390,-4952,32389,-4963,32387,-4974,32385,-4985,32383,-4996,32382,-5007,32380,-5018,32378,-5029,32377,-5040,32375,-5051,32373,-5062,32371,-5073,32370,-5084,32368,-5095,32366,-5107,32364,-5118,32363,-5129,32361,-5140,32359,-5151,32357,-5162,32356,-5173,32354,-5184,32352,-5195,32350,-5206,32349,-5217,32347,-5228,32345,-5239,32343,-5250,32341,-5261,32340,-5272,32338,-5283,32336,-5294,32334,-5305,32332,-5316,32331,-5327,32329,-5338,32327,-5349,32325,-5360,32323,-5371,32322,-5382,32320,-5393,32318,-5404,32316,-5415,32314,-5426,32312,-5437,32310,-5448,32309,-5459,32307,-5470,32305,-5481,32303,-5492,32301,-5503,32299,-5514,32297,-5525,32295,-5536,32294,-5547,32292,-5558,32290,-5569,32288,-5580,32286,-5591,32284,-5602,32282,-5613,32280,-5624,32278,-5635,32276,-5646,32274,-5657,32273,-5668,32271,-5679,32269,-5690,32267,-5701,32265,-5712,32263,-5723,32261,-5734,32259,-5745,32257,-5756,32255,-5767,32253,-5778,32251,-5789,32249,-5800,32247,-5811,32245,-5822,32243,-5833,32241,-5844,32239,-5855,32237,-5866,32235,-5877,32233,-5888,32231,-5899,32229,-5910,32227,-5921,32225,-5932,32223,-5943,32221,-5954,32219,-5965,32217,-5976,32215,-5987,32213,-5998,32211,-6009,32209,-6020,32207,-6031,32205,-6042,32203,-6053,32201,-6064,32199,-6075,32196,-6086,32194,-6097,32192,-6108,32190,-6119,32188,-6130,32186,-6141,32184,-6152,32182,-6163,32180,-6174,32178,-6185,32176,-6196,32173,-6207,32171,-6218,32169,-6229,32167,-6240,32165,-6251,32163,-6262,32161,-6272,32158,-6283,32156,-6294,32154,-6305,32152,-6316,32150,-6327,32148,-6338,32146,-6349,32143,-6360,32141,-6371,32139,-6382,32137,-6393,32135,-6404,32133,-6415,32130,-6426,32128,-6437,32126,-6448,32124,-6459,32122,-6470,32119,-6481,32117,-6492,32115,-6503,32113,-6513,32110,-6524,32108,-6535,32106,-6546,32104,-6557,32102,-6568,32099,-6579,32097,-6590,32095,-6601,32093,-6612,32090,-6623,32088,-6634,32086,-6645,32084,-6656,32081,-6667,32079,-6678,32077,-6689,32074,-6699,32072,-6710,32070,-6721,32068,-6732,32065,-6743,32063,-6754,32061,-6765,32058,-6776,32056,-6787,32054,-6798,32051,-6809,32049,-6820,32047,-6831,32044,-6842,32042,-6852,32040,-6863,32037,-6874,32035,-6885,32033,-6896,32030,-6907,32028,-6918,32026,-6929,32023,-6940,32021,-6951,32019,-6962,32016,-6973,32014,-6983,32011,-6994,32009,-7005,32007,-7016,32004,-7027,32002,-7038,31999,-7049,31997,-7060,31995,-7071,31992,-7082,31990,-7093,31987,-7103,31985,-7114,31983,-7125,31980,-7136,31978,-7147,31975,-7158,31973,-7169,31970,-7180,31968,-7191,31965,-7202,31963,-7212,31961,-7223,31958,-7234,31956,-7245,31953,-7256,31951,-7267,31948,-7278,31946,-7289,31943,-7300,31941,-7311,31938,-7321,31936,-7332,31933,-7343,31931,-7354,31928,-7365,31926,-7376,31923,-7387,31921,-7398,31918,-7408,31916,-7419,31913,-7430,31911,-7441,31908,-7452,31905,-7463,31903,-7474,31900,-7485,31898,-7495,31895,-7506,31893,-7517,31890,-7528,31888,-7539,31885,-7550,31882,-7561,31880,-7572,31877,-7582,31875,-7593,31872,-7604,31869,-7615,31867,-7626,31864,-7637,31862,-7648,31859,-7658,31856,-7669,31854,-7680,31851,-7691,31849,-7702,31846,-7713,31843,-7724,31841,-7734,31838,-7745,31835,-7756,31833,-7767,31830,-7778,31827,-7789,31825,-7800,31822,-7810,31819,-7821,31817,-7832,31814,-7843,31811,-7854,31809,-7865,31806,-7876,31803,-7886,31801,-7897,31798,-7908,31795,-7919,31793,-7930,31790,-7941,31787,-7951,31785,-7962,31782,-7973,31779,-7984,31776,-7995,31774,-8006,31771,-8016,31768,-8027,31765,-8038,31763,-8049,31760,-8060,31757,-8071,31754,-8081,31752,-8092,31749,-8103,31746,-8114,31743,-8125,31741,-8135,31738,-8146,31735,-8157,31732,-8168,31729,-8179,31727,-8190,31724,-8200,31721,-8211,31718,-8222,31716,-8233,31713,-8244,31710,-8254,31707,-8265,31704,-8276,31701,-8287,31699,-8298,31696,-8308,31693,-8319,31690,-8330,31687,-8341,31684,-8352,31682,-8362,31679,-8373,31676,-8384,31673,-8395,31670,-8406,31667,-8416,31664,-8427,31662,-8438,31659,-8449,31656,-8460,31653,-8470,31650,-8481,31647,-8492,31644,-8503,31641,-8514,31638,-8524,31635,-8535,31633,-8546,31630,-8557,31627,-8568,31624,-8578,31621,-8589,31618,-8600,31615,-8611,31612,-8621,31609,-8632,31606,-8643,31603,-8654,31600,-8664,31597,-8675,31594,-8686,31591,-8697,31588,-8708,31586,-8718,31583,-8729,31580,-8740,31577,-8751,31574,-8761,31571,-8772,31568,-8783,31565,-8794,31562,-8804,31559,-8815,31556,-8826,31553,-8837,31550,-8847,31547,-8858,31544,-8869,31541,-8880,31537,-8890,31534,-8901,31531,-8912,31528,-8923,31525,-8933,31522,-8944,31519,-8955,31516,-8966,31513,-8976,31510,-8987,31507,-8998,31504,-9009,31501,-9019,31498,-9030,31495,-9041,31492,-9052,31489,-9062,31485,-9073,31482,-9084,31479,-9095,31476,-9105,31473,-9116,31470,-9127,31467,-9137,31464,-9148,31461,-9159,31457,-9170,31454,-9180,31451,-9191,31448,-9202,31445,-9213,31442,-9223,31439,-9234,31435,-9245,31432,-9255,31429,-9266,31426,-9277,31423,-9288,31420,-9298,31417,-9309,31413,-9320,31410,-9330,31407,-9341,31404,-9352,31401,-9363,31397,-9373,31394,-9384,31391,-9395,31388,-9405,31385,-9416,31381,-9427,31378,-9437,31375,-9448,31372,-9459,31369,-9469,31365,-9480,31362,-9491,31359,-9502,31356,-9512,31352,-9523,31349,-9534,31346,-9544,31343,-9555,31339,-9566,31336,-9576,31333,-9587,31330,-9598,31326,-9608,31323,-9619,31320,-9630,31316,-9640,31313,-9651,31310,-9662,31307,-9672,31303,-9683,31300,-9694,31297,-9704,31293,-9715,31290,-9726,31287,-9736,31283,-9747,31280,-9758,31277,-9768,31273,-9779,31270,-9790,31267,-9800,31263,-9811,31260,-9822,31257,-9832,31253,-9843,31250,-9854,31247,-9864,31243,-9875,31240,-9886,31236,-9896,31233,-9907,31230,-9918,31226,-9928,31223,-9939,31220,-9950,31216,-9960,31213,-9971,31209,-9981,31206,-9992,31203,-10003,31199,-10013,31196,-10024,31192,-10035,31189,-10045,31185,-10056,31182,-10067,31179,-10077,31175,-10088,31172,-10098,31168,-10109,31165,-10120,31161,-10130,31158,-10141,31154,-10152,31151,-10162,31148,-10173,31144,-10183,31141,-10194,31137,-10205,31134,-10215,31130,-10226,31127,-10236,31123,-10247,31120,-10258,31116,-10268,31113,-10279,31109,-10290,31106,-10300,31102,-10311,31099,-10321,31095,-10332,31092,-10343,31088,-10353,31085,-10364,31081,-10374,31077,-10385,31074,-10396,31070,-10406,31067,-10417,31063,-10427,31060,-10438,31056,-10448,31053,-10459,31049,-10470,31045,-10480,31042,-10491,31038,-10501,31035,-10512,31031,-10523,31028,-10533,31024,-10544,31020,-10554,31017,-10565,31013,-10575,31010,-10586,31006,-10597,31002,-10607,30999,-10618,30995,-10628,30991,-10639,30988,-10649,30984,-10660,30981,-10671,30977,-10681,30973,-10692,30970,-10702,30966,-10713,30962,-10723,30959,-10734,30955,-10744,30951,-10755,30948,-10766,30944,-10776,30940,-10787,30937,-10797,30933,-10808,30929,-10818,30926,-10829,30922,-10839,30918,-10850,30915,-10860,30911,-10871,30907,-10881,30903,-10892,30900,-10903,30896,-10913,30892,-10924,30889,-10934,30885,-10945,30881,-10955,30877,-10966,30874,-10976,30870,-10987,30866,-10997,30862,-11008,30859,-11018,30855,-11029,30851,-11039,30847,-11050,30844,-11060,30840,-11071,30836,-11081,30832,-11092,30828,-11102,30825,-11113,30821,-11123,30817,-11134,30813,-11144,30809,-11155,30806,-11165,30802,-11176,30798,-11186,30794,-11197,30790,-11207,30787,-11218,30783,-11228,30779,-11239,30775,-11249,30771,-11260,30767,-11270,30764,-11281,30760,-11291,30756,-11302,30752,-11312,30748,-11323,30744,-11333,30740,-11344,30737,-11354,30733,-11365,30729,-11375,30725,-11386,30721,-11396,30717,-11407,30713,-11417,30709,-11428,30705,-11438,30702,-11449,30698,-11459,30694,-11469,30690,-11480,30686,-11490,30682,-11501,30678,-11511,30674,-11522,30670,-11532,30666,-11543,30662,-11553,30658,-11564,30655,-11574,30651,-11584,30647,-11595,30643,-11605,30639,-11616,30635,-11626,30631,-11637,30627,-11647,30623,-11658,30619,-11668,30615,-11678,30611,-11689,30607,-11699,30603,-11710,30599,-11720,30595,-11731,30591,-11741,30587,-11751,30583,-11762,30579,-11772,30575,-11783,30571,-11793,30567,-11804,30563,-11814,30559,-11824,30555,-11835,30551,-11845,30547,-11856,30543,-11866,30539,-11877,30535,-11887,30530,-11897,30526,-11908,30522,-11918,30518,-11929,30514,-11939,30510,-11949,30506,-11960,30502,-11970,30498,-11981,30494,-11991,30490,-12001,30486,-12012,30482,-12022,30477,-12033,30473,-12043,30469,-12053,30465,-12064,30461,-12074,30457,-12084,30453,-12095,30449,-12105,30445,-12116,30440,-12126,30436,-12136,30432,-12147,30428,-12157,30424,-12167,30420,-12178,30416,-12188,30411,-12199,30407,-12209,30403,-12219,30399,-12230,30395,-12240,30391,-12250,30386,-12261,30382,-12271,30378,-12281,30374,-12292,30370,-12302,30365,-12313,30361,-12323,30357,-12333,30353,-12344,30349,-12354,30344,-12364,30340,-12375,30336,-12385,30332,-12395,30328,-12406,30323,-12416,30319,-12426,30315,-12437,30311,-12447,30306,-12457,30302,-12468,30298,-12478,30294,-12488,30289,-12499,30285,-12509,30281,-12519,30277,-12530,30272,-12540,30268,-12550,30264,-12561,30259,-12571,30255,-12581,30251,-12591,30247,-12602,30242,-12612,30238,-12622,30234,-12633,30229,-12643,30225,-12653,30221,-12664,30216,-12674,30212,-12684,30208,-12695,30203,-12705,30199,-12715,30195,-12725,30190,-12736,30186,-12746,30182,-12756,30177,-12767,30173,-12777,30169,-12787,30164,-12797,30160,-12808,30156,-12818,30151,-12828,30147,-12839,30142,-12849,30138,-12859,30134,-12869,30129,-12880,30125,-12890,30121,-12900,30116,-12910,30112,-12921,30107,-12931,30103,-12941,30098,-12951,30094,-12962,30090,-12972,30085,-12982,30081,-12993,30076,-13003,30072,-13013,30067,-13023,30063,-13034,30059,-13044,30054,-13054,30050,-13064,30045,-13075,30041,-13085,30036,-13095,30032,-13105,30027,-13115,30023,-13126,30018,-13136,30014,-13146,30009,-13156,30005,-13167,30001,-13177,29996,-13187,29992,-13197,29987,-13208,29983,-13218,29978,-13228,29973,-13238,29969,-13248,29964,-13259,29960,-13269,29955,-13279,29951,-13289,29946,-13299,29942,-13310,29937,-13320,29933,-13330,29928,-13340,29924,-13350,29919,-13361,29915,-13371,29910,-13381,29905,-13391,29901,-13401,29896,-13412,29892,-13422,29887,-13432,29883,-13442,29878,-13452,29873,-13463,29869,-13473,29864,-13483,29860,-13493,29855,-13503,29850,-13513,29846,-13524,29841,-13534,29837,-13544,29832,-13554,29827,-13564,29823,-13575,29818,-13585,29813,-13595,29809,-13605,29804,-13615,29800,-13625,29795,-13635,29790,-13646,29786,-13656,29781,-13666,29776,-13676,29772,-13686,29767,-13696,29762,-13707,29758,-13717,29753,-13727,29748,-13737,29744,-13747,29739,-13757,29734,-13767,29729,-13778,29725,-13788,29720,-13798,29715,-13808,29711,-13818,29706,-13828,29701,-13838,29696,-13848,29692,-13859,29687,-13869,29682,-13879,29678,-13889,29673,-13899,29668,-13909,29663,-13919,29659,-13929,29654,-13939,29649,-13950,29644,-13960,29640,-13970,29635,-13980,29630,-13990,29625,-14000,29621,-14010,29616,-14020,29611,-14030,29606,-14040,29601,-14051,29597,-14061,29592,-14071,29587,-14081,29582,-14091,29577,-14101,29573,-14111,29568,-14121,29563,-14131,29558,-14141,29553,-14151,29548,-14161,29544,-14172,29539,-14182,29534,-14192,29529,-14202,29524,-14212,29519,-14222,29515,-14232,29510,-14242,29505,-14252,29500,-14262,29495,-14272,29490,-14282,29485,-14292,29481,-14302,29476,-14312,29471,-14322,29466,-14332,29461,-14343,29456,-14353,29451,-14363,29446,-14373,29441,-14383,29437,-14393,29432,-14403,29427,-14413,29422,-14423,29417,-14433,29412,-14443,29407,-14453,29402,-14463,29397,-14473,29392,-14483,29387,-14493,29382,-14503,29377,-14513,29372,-14523,29368,-14533,29363,-14543,29358,-14553,29353,-14563,29348,-14573,29343,-14583,29338,-14593,29333,-14603,29328,-14613,29323,-14623,29318,-14633,29313,-14643,29308,-14653,29303,-14663,29298,-14673,29293,-14683,29288,-14693,29283,-14703,29278,-14713,29273,-14723,29268,-14733,29263,-14743,29258,-14753,29253,-14763,29248,-14773,29243,-14783,29238,-14793,29233,-14803,29227,-14813,29222,-14823,29217,-14833,29212,-14843,29207,-14853,29202,-14862,29197,-14872,29192,-14882,29187,-14892,29182,-14902,29177,-14912,29172,-14922,29167,-14932,29162,-14942,29156,-14952,29151,-14962,29146,-14972,29141,-14982,29136,-14992,29131,-15002,29126,-15012,29121,-15022,29116,-15031,29110,-15041,29105,-15051,29100,-15061,29095,-15071,29090,-15081,29085,-15091,29080,-15101,29074,-15111,29069,-15121,29064,-15131,29059,-15141,29054,-15150,29049,-15160,29044,-15170,29038,-15180,29033,-15190,29028,-15200,29023,-15210,29018,-15220,29012,-15230,29007,-15239,29002,-15249,28997,-15259,28992,-15269,28986,-15279,28981,-15289,28976,-15299,28971,-15309,28966,-15319,28960,-15328,28955,-15338,28950,-15348,28945,-15358,28939,-15368,28934,-15378,28929,-15388,28924,-15397,28918,-15407,28913,-15417,28908,-15427,28903,-15437,28897,-15447,28892,-15457,28887,-15466,28882,-15476,28876,-15486,28871,-15496,28866,-15506,28860,-15516,28855,-15526,28850,-15535,28845,-15545,28839,-15555,28834,-15565,28829,-15575,28823,-15584,28818,-15594,28813,-15604,28807,-15614,28802,-15624,28797,-15634,28791,-15643,28786,-15653,28781,-15663,28775,-15673,28770,-15683,28765,-15692,28759,-15702,28754,-15712,28749,-15722,28743,-15732,28738,-15741,28733,-15751,28727,-15761,28722,-15771,28716,-15781,28711,-15790,28706,-15800,28700,-15810,28695,-15820,28690,-15830,28684,-15839,28679,-15849,28673,-15859,28668,-15869,28662,-15878,28657,-15888,28652,-15898,28646,-15908,28641,-15918,28635,-15927,28630,-15937,28625,-15947,28619,-15957,28614,-15966,28608,-15976,28603,-15986,28597,-15996,28592,-16005,28586,-16015,28581,-16025,28575,-16035,28570,-16044,28565,-16054,28559,-16064,28554,-16073,28548,-16083,28543,-16093,28537,-16103,28532,-16112,28526,-16122,28521,-16132,28515,-16142,28510,-16151,28504,-16161,28499,-16171,28493,-16180,28488,-16190,28482,-16200,28477,-16210,28471,-16219,28465,-16229,28460,-16239,28454,-16248,28449,-16258,28443,-16268,28438,-16277,28432,-16287,28427,-16297,28421,-16307,28416,-16316,28410,-16326,28404,-16336,28399,-16345,28393,-16355,28388,-16365,28382,-16374,28377,-16384,28371,-16394,28365,-16403,28360,-16413,28354,-16423,28349,-16432,28343,-16442,28337,-16452,28332,-16461,28326,-16471,28321,-16481,28315,-16490,28309,-16500,28304,-16510,28298,-16519,28292,-16529,28287,-16539,28281,-16548,28275,-16558,28270,-16567,28264,-16577,28259,-16587,28253,-16596,28247,-16606,28242,-16616,28236,-16625,28230,-16635,28225,-16644,28219,-16654,28213,-16664,28208,-16673,28202,-16683,28196,-16693,28190,-16702,28185,-16712,28179,-16721,28173,-16731,28168,-16741,28162,-16750,28156,-16760,28151,-16769,28145,-16779,28139,-16789,28133,-16798,28128,-16808,28122,-16817,28116,-16827,28110,-16837,28105,-16846,28099,-16856,28093,-16865,28087,-16875,28082,-16884,28076,-16894,28070,-16904,28064,-16913,28059,-16923,28053,-16932,28047,-16942,28041,-16951,28036,-16961,28030,-16970,28024,-16980,28018,-16990,28012,-16999,28007,-17009,28001,-17018,27995,-17028,27989,-17037,27983,-17047,27978,-17056,27972,-17066,27966,-17075,27960,-17085,27954,-17095,27948,-17104,27943,-17114,27937,-17123,27931,-17133,27925,-17142,27919,-17152,27913,-17161,27908,-17171,27902,-17180,27896,-17190,27890,-17199,27884,-17209,27878,-17218,27872,-17228,27867,-17237,27861,-17247,27855,-17256,27849,-17266,27843,-17275,27837,-17285,27831,-17294,27825,-17304,27819,-17313,27814,-17323,27808,-17332,27802,-17342,27796,-17351,27790,-17361,27784,-17370,27778,-17380,27772,-17389,27766,-17398,27760,-17408,27754,-17417,27748,-17427,27742,-17436,27736,-17446,27731,-17455,27725,-17465,27719,-17474,27713,-17484,27707,-17493,27701,-17502,27695,-17512,27689,-17521,27683,-17531,27677,-17540,27671,-17550,27665,-17559,27659,-17568,27653,-17578,27647,-17587,27641,-17597,27635,-17606,27629,-17616,27623,-17625,27617,-17634,27611,-17644,27605,-17653,27599,-17663,27593,-17672,27587,-17681,27581,-17691,27575,-17700,27569,-17710,27563,-17719,27557,-17728,27551,-17738,27545,-17747,27538,-17757,27532,-17766,27526,-17775,27520,-17785,27514,-17794,27508,-17804,27502,-17813,27496,-17822,27490,-17832,27484,-17841,27478,-17850,27472,-17860,27466,-17869,27460,-17879,27453,-17888,27447,-17897,27441,-17907,27435,-17916,27429,-17925,27423,-17935,27417,-17944,27411,-17953,27405,-17963,27398,-17972,27392,-17981,27386,-17991,27380,-18000,27374,-18009,27368,-18019,27362,-18028,27355,-18037,27349,-18047,27343,-18056,27337,-18065,27331,-18075,27325,-18084,27319,-18093,27312,-18103,27306,-18112,27300,-18121,27294,-18131,27288,-18140,27281,-18149,27275,-18158,27269,-18168,27263,-18177,27257,-18186,27250,-18196,27244,-18205,27238,-18214,27232,-18223,27226,-18233,27219,-18242,27213,-18251,27207,-18261,27201,-18270,27195,-18279,27188,-18288,27182,-18298,27176,-18307,27170,-18316,27163,-18325,27157,-18335,27151,-18344,27145,-18353,27138,-18362,27132,-18372,27126,-18381,27120,-18390,27113,-18399,27107,-18409,27101,-18418,27094,-18427,27088,-18436,27082,-18446,27076,-18455,27069,-18464,27063,-18473,27057,-18483,27050,-18492,27044,-18501,27038,-18510,27031,-18519,27025,-18529,27019,-18538,27012,-18547,27006,-18556,27000,-18565,26994,-18575,26987,-18584,26981,-18593,26975,-18602,26968,-18611,26962,-18621,26955,-18630,26949,-18639,26943,-18648,26936,-18657,26930,-18667,26924,-18676,26917,-18685,26911,-18694,26905,-18703,26898,-18712,26892,-18722,26885,-18731,26879,-18740,26873,-18749,26866,-18758,26860,-18767,26853,-18777,26847,-18786,26841,-18795,26834,-18804,26828,-18813,26821,-18822,26815,-18831,26809,-18841,26802,-18850,26796,-18859,26789,-18868,26783,-18877,26776,-18886,26770,-18895,26764,-18905,26757,-18914,26751,-18923,26744,-18932,26738,-18941,26731,-18950,26725,-18959,26718,-18968,26712,-18977,26705,-18987,26699,-18996,26692,-19005,26686,-19014,26680,-19023,26673,-19032,26667,-19041,26660,-19050,26654,-19059,26647,-19068,26641,-19077,26634,-19087,26628,-19096,26621,-19105,26615,-19114,26608,-19123,26601,-19132,26595,-19141,26588,-19150,26582,-19159,26575,-19168,26569,-19177,26562,-19186,26556,-19195,26549,-19204,26543,-19213,26536,-19222,26530,-19232,26523,-19241,26516,-19250,26510,-19259,26503,-19268,26497,-19277,26490,-19286,26484,-19295,26477,-19304,26470,-19313,26464,-19322,26457,-19331,26451,-19340,26444,-19349,26437,-19358,26431,-19367,26424,-19376,26418,-19385,26411,-19394,26404,-19403,26398,-19412,26391,-19421,26385,-19430,26378,-19439,26371,-19448,26365,-19457,26358,-19466,26351,-19475,26345,-19484,26338,-19493,26332,-19502,26325,-19511,26318,-19520,26312,-19529,26305,-19538,26298,-19547,26292,-19556,26285,-19565,26278,-19574,26272,-19583,26265,-19591,26258,-19600,26252,-19609,26245,-19618,26238,-19627,26231,-19636,26225,-19645,26218,-19654,26211,-19663,26205,-19672,26198,-19681,26191,-19690,26185,-19699,26178,-19708,26171,-19717,26164,-19726,26158,-19734,26151,-19743,26144,-19752,26137,-19761,26131,-19770,26124,-19779,26117,-19788,26110,-19797,26104,-19806,26097,-19815,26090,-19823,26083,-19832,26077,-19841,26070,-19850,26063,-19859,26056,-19868,26050,-19877,26043,-19886,26036,-19895,26029,-19903,26022,-19912,26016,-19921,26009,-19930,26002,-19939,25995,-19948,25989,-19957,25982,-19966,25975,-19974,25968,-19983,25961,-19992,25954,-20001,25948,-20010,25941,-20019,25934,-20027,25927,-20036,25920,-20045,25913,-20054,25907,-20063,25900,-20072,25893,-20080,25886,-20089,25879,-20098,25872,-20107,25866,-20116,25859,-20125,25852,-20133,25845,-20142,25838,-20151,25831,-20160,25824,-20169,25817,-20177,25811,-20186,25804,-20195,25797,-20204,25790,-20213,25783,-20221,25776,-20230,25769,-20239,25762,-20248,25755,-20257,25749,-20265,25742,-20274,25735,-20283,25728,-20292,25721,-20300,25714,-20309,25707,-20318,25700,-20327,25693,-20335,25686,-20344,25679,-20353,25672,-20362,25665,-20370,25659,-20379,25652,-20388,25645,-20397,25638,-20405,25631,-20414,25624,-20423,25617,-20432,25610,-20440,25603,-20449,25596,-20458,25589,-20467,25582,-20475,25575,-20484,25568,-20493,25561,-20501,25554,-20510,25547,-20519,25540,-20528,25533,-20536,25526,-20545,25519,-20554,25512,-20562,25505,-20571,25498,-20580,25491,-20588,25484,-20597,25477,-20606,25470,-20614,25463,-20623,25456,-20632,25449,-20641,25442,-20649,25435,-20658,25428,-20667,25421,-20675,25414,-20684,25407,-20693,25399,-20701,25392,-20710,25385,-20719,25378,-20727,25371,-20736,25364,-20744,25357,-20753,25350,-20762,25343,-20770,25336,-20779,25329,-20788,25322,-20796,25315,-20805,25307,-20814,25300,-20822,25293,-20831,25286,-20839,25279,-20848,25272,-20857,25265,-20865,25258,-20874,25251,-20882,25243,-20891,25236,-20900,25229,-20908,25222,-20917,25215,-20926,25208,-20934,25201,-20943,25194,-20951,25186,-20960,25179,-20968,25172,-20977,25165,-20986,25158,-20994,25151,-21003,25144,-21011,25136,-21020,25129,-21028,25122,-21037,25115,-21046,25108,-21054,25100,-21063,25093,-21071,25086,-21080,25079,-21088,25072,-21097,25065,-21105,25057,-21114,25050,-21123,25043,-21131,25036,-21140,25029,-21148,25021,-21157,25014,-21165,25007,-21174,25000,-21182,24992,-21191,24985,-21199,24978,-21208,24971,-21216,24964,-21225,24956,-21233,24949,-21242,24942,-21250,24935,-21259,24927,-21267,24920,-21276,24913,-21284,24906,-21293,24898,-21301,24891,-21310,24884,-21318,24877,-21327,24869,-21335,24862,-21344,24855,-21352,24847,-21361,24840,-21369,24833,-21378,24826,-21386,24818,-21395,24811,-21403,24804,-21411,24796,-21420,24789,-21428,24782,-21437,24774,-21445,24767,-21454,24760,-21462,24753,-21471,24745,-21479,24738,-21487,24731,-21496,24723,-21504,24716,-21513,24709,-21521,24701,-21530,24694,-21538,24687,-21546,24679,-21555,24672,-21563,24664,-21572,24657,-21580,24650,-21588,24642,-21597,24635,-21605,24628,-21614,24620,-21622,24613,-21630,24606,-21639,24598,-21647,24591,-21656,24583,-21664,24576,-21672,24569,-21681,24561,-21689,24554,-21698,24546,-21706,24539,-21714,24532,-21723,24524,-21731,24517,-21739,24509,-21748,24502,-21756,24495,-21764,24487,-21773,24480,-21781,24472,-21789,24465,-21798,24457,-21806,24450,-21814,24443,-21823,24435,-21831,24428,-21839,24420,-21848,24413,-21856,24405,-21864,24398,-21873,24390,-21881,24383,-21889,24376,-21898,24368,-21906,24361,-21914,24353,-21923,24346,-21931,24338,-21939,24331,-21947,24323,-21956,24316,-21964,24308,-21972,24301,-21981,24293,-21989,24286,-21997,24278,-22005,24271,-22014,24263,-22022,24256,-22030,24248,-22039,24241,-22047,24233,-22055,24226,-22063,24218,-22072,24211,-22080,24203,-22088,24196,-22096,24188,-22105,24180,-22113,24173,-22121,24165,-22129,24158,-22138,24150,-22146,24143,-22154,24135,-22162,24128,-22170,24120,-22179,24113,-22187,24105,-22195,24097,-22203,24090,-22212,24082,-22220,24075,-22228,24067,-22236,24060,-22244,24052,-22253,24044,-22261,24037,-22269,24029,-22277,24022,-22285,24014,-22294,24006,-22302,23999,-22310,23991,-22318,23984,-22326,23976,-22334,23968,-22343,23961,-22351,23953,-22359,23945,-22367,23938,-22375,23930,-22383,23923,-22392,23915,-22400,23907,-22408,23900,-22416,23892,-22424,23884,-22432,23877,-22440,23869,-22449,23861,-22457,23854,-22465,23846,-22473,23838,-22481,23831,-22489,23823,-22497,23815,-22506,23808,-22514,23800,-22522,23792,-22530,23785,-22538,23777,-22546,23769,-22554,23762,-22562,23754,-22570,23746,-22578,23739,-22587,23731,-22595,23723,-22603,23715,-22611,23708,-22619,23700,-22627,23692,-22635,23685,-22643,23677,-22651,23669,-22659,23661,-22667,23654,-22675,23646,-22684,23638,-22692,23631,-22700,23623,-22708,23615,-22716,23607,-22724,23600,-22732,23592,-22740,23584,-22748,23576,-22756,23569,-22764,23561,-22772,23553,-22780,23545,-22788,23537,-22796,23530,-22804,23522,-22812,23514,-22820,23506,-22828,23499,-22836,23491,-22844,23483,-22852,23475,-22860,23467,-22868,23460,-22876,23452,-22884,23444,-22892,23436,-22900,23428,-22908,23421,-22916,23413,-22924,23405,-22932,23397,-22940,23389,-22948,23382,-22956,23374,-22964,23366,-22972,23358,-22980,23350,-22988,23342,-22996,23335,-23004,23327,-23012,23319,-23020,23311,-23028,23303,-23036,23295,-23044,23287,-23051,23280,-23059,23272,-23067,23264,-23075,23256,-23083,23248,-23091,23240,-23099,23232,-23107,23224,-23115,23217,-23123,23209,-23131,23201,-23139,23193,-23147,23185,-23154,23177,-23162,23169,-23170,23161,-23178,23153,-23186,23146,-23194,23138,-23202,23130,-23210,23122,-23218,23114,-23225,23106,-23233,23098,-23241,23090,-23249,23082,-23257,23074,-23265,23066,-23273,23058,-23281,23050,-23288,23043,-23296,23035,-23304,23027,-23312,23019,-23320,23011,-23328,23003,-23336,22995,-23343,22987,-23351,22979,-23359,22971,-23367,22963,-23375,22955,-23383,22947,-23390,22939,-23398,22931,-23406,22923,-23414,22915,-23422,22907,-23429,22899,-23437,22891,-23445,22883,-23453,22875,-23461,22867,-23468,22859,-23476,22851,-23484,22843,-23492,22835,-23500,22827,-23507,22819,-23515,22811,-23523,22803,-23531,22795,-23538,22787,-23546,22779,-23554,22771,-23562,22763,-23570,22755,-23577,22747,-23585,22739,-23593,22731,-23601,22723,-23608,22715,-23616,22707,-23624,22699,-23632,22691,-23639,22683,-23647,22674,-23655,22666,-23662,22658,-23670,22650,-23678,22642,-23686,22634,-23693,22626,-23701,22618,-23709,22610,-23716,22602,-23724,22594,-23732,22586,-23740,22577,-23747,22569,-23755,22561,-23763,22553,-23770,22545,-23778,22537,-23786,22529,-23793,22521,-23801,22513,-23809,22505,-23816,22496,-23824,22488,-23832,22480,-23839,22472,-23847,22464,-23855,22456,-23862,22448,-23870,22439,-23878,22431,-23885,22423,-23893,22415,-23901,22407,-23908,22399,-23916,22391,-23924,22382,-23931,22374,-23939,22366,-23946,22358,-23954,22350,-23962,22342,-23969,22333,-23977,22325,-23985,22317,-23992,22309,-24000,22301,-24007,22293,-24015,22284,-24023,22276,-24030,22268,-24038,22260,-24045,22252,-24053,22243,-24061,22235,-24068,22227,-24076,22219,-24083,22211,-24091,22202,-24098,22194,-24106,22186,-24114,22178,-24121,22169,-24129,22161,-24136,22153,-24144,22145,-24151,22137,-24159,22128,-24166,22120,-24174,22112,-24181,22104,-24189,22095,-24197,22087,-24204,22079,-24212,22071,-24219,22062,-24227,22054,-24234,22046,-24242,22038,-24249,22029,-24257,22021,-24264,22013,-24272,22004,-24279,21996,-24287,21988,-24294,21980,-24302,21971,-24309,21963,-24317,21955,-24324,21946,-24332,21938,-24339,21930,-24347,21922,-24354,21913,-24362,21905,-24369,21897,-24377,21888,-24384,21880,-24391,21872,-24399,21863,-24406,21855,-24414,21847,-24421,21838,-24429,21830,-24436,21822,-24444,21813,-24451,21805,-24458,21797,-24466,21788,-24473,21780,-24481,21772,-24488,21763,-24496,21755,-24503,21747,-24510,21738,-24518,21730,-24525,21722,-24533,21713,-24540,21705,-24547,21697,-24555,21688,-24562,21680,-24570,21671,-24577,21663,-24584,21655,-24592,21646,-24599,21638,-24607,21629,-24614,21621,-24621,21613,-24629,21604,-24636,21596,-24643,21587,-24651,21579,-24658,21571,-24665,21562,-24673,21554,-24680,21545,-24688,21537,-24695,21529,-24702,21520,-24710,21512,-24717,21503,-24724,21495,-24732,21486,-24739,21478,-24746,21470,-24754,21461,-24761,21453,-24768,21444,-24775,21436,-24783,21427,-24790,21419,-24797,21410,-24805,21402,-24812,21394,-24819,21385,-24827,21377,-24834,21368,-24841,21360,-24848,21351,-24856,21343,-24863,21334,-24870,21326,-24878,21317,-24885,21309,-24892,21300,-24899,21292,-24907,21283,-24914,21275,-24921,21266,-24928,21258,-24936,21249,-24943,21241,-24950,21232,-24957,21224,-24965,21215,-24972,21207,-24979,21198,-24986,21190,-24993,21181,-25001,21173,-25008,21164,-25015,21156,-25022,21147,-25030,21139,-25037,21130,-25044,21122,-25051,21113,-25058,21104,-25066,21096,-25073,21087,-25080,21079,-25087,21070,-25094,21062,-25101,21053,-25109,21045,-25116,21036,-25123,21027,-25130,21019,-25137,21010,-25145,21002,-25152,20993,-25159,20985,-25166,20976,-25173,20967,-25180,20959,-25187,20950,-25195,20942,-25202,20933,-25209,20925,-25216,20916,-25223,20907,-25230,20899,-25237,20890,-25244,20881,-25252,20873,-25259,20864,-25266,20856,-25273,20847,-25280,20838,-25287,20830,-25294,20821,-25301,20813,-25308,20804,-25316,20795,-25323,20787,-25330,20778,-25337,20769,-25344,20761,-25351,20752,-25358,20743,-25365,20735,-25372,20726,-25379,20718,-25386,20709,-25393,20700,-25400,20692,-25408,20683,-25415,20674,-25422,20666,-25429,20657,-25436,20648,-25443,20640,-25450,20631,-25457,20622,-25464,20613,-25471,20605,-25478,20596,-25485,20587,-25492,20579,-25499,20570,-25506,20561,-25513,20553,-25520,20544,-25527,20535,-25534,20527,-25541,20518,-25548,20509,-25555,20500,-25562,20492,-25569,20483,-25576,20474,-25583,20466,-25590,20457,-25597,20448,-25604,20439,-25611,20431,-25618,20422,-25625,20413,-25632,20404,-25639,20396,-25646,20387,-25653,20378,-25660,20369,-25666,20361,-25673,20352,-25680,20343,-25687,20334,-25694,20326,-25701,20317,-25708,20308,-25715,20299,-25722,20291,-25729,20282,-25736,20273,-25743,20264,-25750,20256,-25756,20247,-25763,20238,-25770,20229,-25777,20220,-25784,20212,-25791,20203,-25798,20194,-25805,20185,-25812,20176,-25818,20168,-25825,20159,-25832,20150,-25839,20141,-25846,20132,-25853,20124,-25860,20115,-25867,20106,-25873,20097,-25880,20088,-25887,20079,-25894,20071,-25901,20062,-25908,20053,-25914,20044,-25921,20035,-25928,20026,-25935,20018,-25942,20009,-25949,20000,-25955,19991,-25962,19982,-25969,19973,-25976,19965,-25983,19956,-25990,19947,-25996,19938,-26003,19929,-26010,19920,-26017,19911,-26023,19902,-26030,19894,-26037,19885,-26044,19876,-26051,19867,-26057,19858,-26064,19849,-26071,19840,-26078,19831,-26084,19822,-26091,19814,-26098,19805,-26105,19796,-26111,19787,-26118,19778,-26125,19769,-26132,19760,-26138,19751,-26145,19742,-26152,19733,-26159,19725,-26165,19716,-26172,19707,-26179,19698,-26186,19689,-26192,19680,-26199,19671,-26206,19662,-26212,19653,-26219,19644,-26226,19635,-26232,19626,-26239,19617,-26246,19608,-26253,19599,-26259,19590,-26266,19582,-26273,19573,-26279,19564,-26286,19555,-26293,19546,-26299,19537,-26306,19528,-26313,19519,-26319,19510,-26326,19501,-26333,19492,-26339,19483,-26346,19474,-26352,19465,-26359,19456,-26366,19447,-26372,19438,-26379,19429,-26386,19420,-26392,19411,-26399,19402,-26405,19393,-26412,19384,-26419,19375,-26425,19366,-26432,19357,-26438,19348,-26445,19339,-26452,19330,-26458,19321,-26465,19312,-26471,19303,-26478,19294,-26485,19285,-26491,19276,-26498,19267,-26504,19258,-26511,19249,-26517,19240,-26524,19231,-26531,19221,-26537,19212,-26544,19203,-26550,19194,-26557,19185,-26563,19176,-26570,19167,-26576,19158,-26583,19149,-26589,19140,-26596,19131,-26602,19122,-26609,19113,-26616,19104,-26622,19095,-26629,19086,-26635,19076,-26642,19067,-26648,19058,-26655,19049,-26661,19040,-26668,19031,-26674,19022,-26681,19013,-26687,19004,-26693,18995,-26700,18986,-26706,18976,-26713,18967,-26719,18958,-26726,18949,-26732,18940,-26739,18931,-26745,18922,-26752,18913,-26758,18904,-26765,18894,-26771,18885,-26777,18876,-26784,18867,-26790,18858,-26797,18849,-26803,18840,-26810,18830,-26816,18821,-26822,18812,-26829,18803,-26835,18794,-26842,18785,-26848,18776,-26854,18766,-26861,18757,-26867,18748,-26874,18739,-26880,18730,-26886,18721,-26893,18711,-26899,18702,-26906,18693,-26912,18684,-26918,18675,-26925,18666,-26931,18656,-26937,18647,-26944,18638,-26950,18629,-26956,18620,-26963,18610,-26969,18601,-26976,18592,-26982,18583,-26988,18574,-26995,18564,-27001,18555,-27007,18546,-27013,18537,-27020,18528,-27026,18518,-27032,18509,-27039,18500,-27045,18491,-27051,18482,-27058,18472,-27064,18463,-27070,18454,-27077,18445,-27083,18435,-27089,18426,-27095,18417,-27102,18408,-27108,18398,-27114,18389,-27121,18380,-27127,18371,-27133,18361,-27139,18352,-27146,18343,-27152,18334,-27158,18324,-27164,18315,-27171,18306,-27177,18297,-27183,18287,-27189,18278,-27196,18269,-27202,18260,-27208,18250,-27214,18241,-27220,18232,-27227,18222,-27233,18213,-27239,18204,-27245,18195,-27251,18185,-27258,18176,-27264,18167,-27270,18157,-27276,18148,-27282,18139,-27289,18130,-27295,18120,-27301,18111,-27307,18102,-27313,18092,-27320,18083,-27326,18074,-27332,18064,-27338,18055,-27344,18046,-27350,18036,-27356,18027,-27363,18018,-27369,18008,-27375,17999,-27381,17990,-27387,17980,-27393,17971,-27399,17962,-27406,17952,-27412,17943,-27418,17934,-27424,17924,-27430,17915,-27436,17906,-27442,17896,-27448,17887,-27454,17878,-27461,17868,-27467,17859,-27473,17849,-27479,17840,-27485,17831,-27491,17821,-27497,17812,-27503,17803,-27509,17793,-27515,17784,-27521,17774,-27527,17765,-27533,17756,-27539,17746,-27546,17737,-27552,17727,-27558,17718,-27564,17709,-27570,17699,-27576,17690,-27582,17680,-27588,17671,-27594,17662,-27600,17652,-27606,17643,-27612,17633,-27618,17624,-27624,17615,-27630,17605,-27636,17596,-27642,17586,-27648,17577,-27654,17567,-27660,17558,-27666,17549,-27672,17539,-27678,17530,-27684,17520,-27690,17511,-27696,17501,-27702,17492,-27708,17483,-27714,17473,-27720,17464,-27726,17454,-27732,17445,-27737,17435,-27743,17426,-27749,17416,-27755,17407,-27761,17397,-27767,17388,-27773,17379,-27779,17369,-27785,17360,-27791,17350,-27797,17341,-27803,17331,-27809,17322,-27815,17312,-27820,17303,-27826,17293,-27832,17284,-27838,17274,-27844,17265,-27850,17255,-27856,17246,-27862,17236,-27868,17227,-27873,17217,-27879,17208,-27885,17198,-27891,17189,-27897,17179,-27903,17170,-27909,17160,-27914,17151,-27920,17141,-27926,17132,-27932,17122,-27938,17113,-27944,17103,-27949,17094,-27955,17084,-27961,17074,-27967,17065,-27973,17055,-27979,17046,-27984,17036,-27990,17027,-27996,17017,-28002,17008,-28008,16998,-28013,16989,-28019,16979,-28025,16969,-28031,16960,-28037,16950,-28042,16941,-28048,16931,-28054,16922,-28060,16912,-28065,16903,-28071,16893,-28077,16883,-28083,16874,-28088,16864,-28094,16855,-28100,16845,-28106,16836,-28111,16826,-28117,16816,-28123,16807,-28129,16797,-28134,16788,-28140,16778,-28146,16768,-28152,16759,-28157,16749,-28163,16740,-28169,16730,-28174,16720,-28180,16711,-28186,16701,-28191,16692,-28197,16682,-28203,16672,-28209,16663,-28214,16653,-28220,16643,-28226,16634,-28231,16624,-28237,16615,-28243,16605,-28248,16595,-28254,16586,-28260,16576,-28265,16566,-28271,16557,-28276,16547,-28282,16538,-28288,16528,-28293,16518,-28299,16509,-28305,16499,-28310,16489,-28316,16480,-28322,16470,-28327,16460,-28333,16451,-28338,16441,-28344,16431,-28350,16422,-28355,16412,-28361,16402,-28366,16393,-28372,16383,-28378,16373,-28383,16364,-28389,16354,-28394,16344,-28400,16335,-28405,16325,-28411,16315,-28417,16306,-28422,16296,-28428,16286,-28433,16276,-28439,16267,-28444,16257,-28450,16247,-28455,16238,-28461,16228,-28466,16218,-28472,16209,-28478,16199,-28483,16189,-28489,16179,-28494,16170,-28500,16160,-28505,16150,-28511,16141,-28516,16131,-28522,16121,-28527,16111,-28533,16102,-28538,16092,-28544,16082,-28549,16072,-28555,16063,-28560,16053,-28566,16043,-28571,16034,-28576,16024,-28582,16014,-28587,16004,-28593,15995,-28598,15985,-28604,15975,-28609,15965,-28615,15956,-28620,15946,-28626,15936,-28631,15926,-28636,15917,-28642,15907,-28647,15897,-28653,15887,-28658,15877,-28663,15868,-28669,15858,-28674,15848,-28680,15838,-28685,15829,-28691,15819,-28696,15809,-28701,15799,-28707,15789,-28712,15780,-28717,15770,-28723,15760,-28728,15750,-28734,15740,-28739,15731,-28744,15721,-28750,15711,-28755,15701,-28760,15691,-28766,15682,-28771,15672,-28776,15662,-28782,15652,-28787,15642,-28792,15633,-28798,15623,-28803,15613,-28808,15603,-28814,15593,-28819,15583,-28824,15574,-28830,15564,-28835,15554,-28840,15544,-28846,15534,-28851,15525,-28856,15515,-28861,15505,-28867,15495,-28872,15485,-28877,15475,-28883,15465,-28888,15456,-28893,15446,-28898,15436,-28904,15426,-28909,15416,-28914,15406,-28919,15396,-28925,15387,-28930,15377,-28935,15367,-28940,15357,-28946,15347,-28951,15337,-28956,15327,-28961,15318,-28967,15308,-28972,15298,-28977,15288,-28982,15278,-28987,15268,-28993,15258,-28998,15248,-29003,15238,-29008,15229,-29013,15219,-29019,15209,-29024,15199,-29029,15189,-29034,15179,-29039,15169,-29045,15159,-29050,15149,-29055,15140,-29060,15130,-29065,15120,-29070,15110,-29075,15100,-29081,15090,-29086,15080,-29091,15070,-29096,15060,-29101,15050,-29106,15040,-29111,15030,-29117,15021,-29122,15011,-29127,15001,-29132,14991,-29137,14981,-29142,14971,-29147,14961,-29152,14951,-29157,14941,-29163,14931,-29168,14921,-29173,14911,-29178,14901,-29183,14891,-29188,14881,-29193,14871,-29198,14861,-29203,14852,-29208,14842,-29213,14832,-29218,14822,-29223,14812,-29228,14802,-29234,14792,-29239,14782,-29244,14772,-29249,14762,-29254,14752,-29259,14742,-29264,14732,-29269,14722,-29274,14712,-29279,14702,-29284,14692,-29289,14682,-29294,14672,-29299,14662,-29304,14652,-29309,14642,-29314,14632,-29319,14622,-29324,14612,-29329,14602,-29334,14592,-29339,14582,-29344,14572,-29349,14562,-29354,14552,-29359,14542,-29364,14532,-29369,14522,-29373,14512,-29378,14502,-29383,14492,-29388,14482,-29393,14472,-29398,14462,-29403,14452,-29408,14442,-29413,14432,-29418,14422,-29423,14412,-29428,14402,-29433,14392,-29438,14382,-29442,14372,-29447,14362,-29452,14352,-29457,14342,-29462,14331,-29467,14321,-29472,14311,-29477,14301,-29482,14291,-29486,14281,-29491,14271,-29496,14261,-29501,14251,-29506,14241,-29511,14231,-29516,14221,-29520,14211,-29525,14201,-29530,14191,-29535,14181,-29540,14171,-29545,14160,-29549,14150,-29554,14140,-29559,14130,-29564,14120,-29569,14110,-29574,14100,-29578,14090,-29583,14080,-29588,14070,-29593,14060,-29598,14050,-29602,14039,-29607,14029,-29612,14019,-29617,14009,-29622,13999,-29626,13989,-29631,13979,-29636,13969,-29641,13959,-29645,13949,-29650,13938,-29655,13928,-29660,13918,-29664,13908,-29669,13898,-29674,13888,-29679,13878,-29683,13868,-29688,13858,-29693,13847,-29697,13837,-29702,13827,-29707,13817,-29712,13807,-29716,13797,-29721,13787,-29726,13777,-29730,13766,-29735,13756,-29740,13746,-29745,13736,-29749,13726,-29754,13716,-29759,13706,-29763,13695,-29768,13685,-29773,13675,-29777,13665,-29782,13655,-29787,13645,-29791,13634,-29796,13624,-29801,13614,-29805,13604,-29810,13594,-29814,13584,-29819,13574,-29824,13563,-29828,13553,-29833,13543,-29838,13533,-29842,13523,-29847,13512,-29851,13502,-29856,13492,-29861,13482,-29865,13472,-29870,13462,-29874,13451,-29879,13441,-29884,13431,-29888,13421,-29893,13411,-29897,13400,-29902,13390,-29906,13380,-29911,13370,-29916,13360,-29920,13349,-29925,13339,-29929,13329,-29934,13319,-29938,13309,-29943,13298,-29947,13288,-29952,13278,-29956,13268,-29961,13258,-29965,13247,-29970,13237,-29974,13227,-29979,13217,-29984,13207,-29988,13196,-29993,13186,-29997,13176,-30002,13166,-30006,13155,-30010,13145,-30015,13135,-30019,13125,-30024,13114,-30028,13104,-30033,13094,-30037,13084,-30042,13074,-30046,13063,-30051,13053,-30055,13043,-30060,13033,-30064,13022,-30068,13012,-30073,13002,-30077,12992,-30082,12981,-30086,12971,-30091,12961,-30095,12950,-30099,12940,-30104,12930,-30108,12920,-30113,12909,-30117,12899,-30122,12889,-30126,12879,-30130,12868,-30135,12858,-30139,12848,-30143,12838,-30148,12827,-30152,12817,-30157,12807,-30161,12796,-30165,12786,-30170,12776,-30174,12766,-30178,12755,-30183,12745,-30187,12735,-30191,12724,-30196,12714,-30200,12704,-30204,12694,-30209,12683,-30213,12673,-30217,12663,-30222,12652,-30226,12642,-30230,12632,-30235,12621,-30239,12611,-30243,12601,-30248,12590,-30252,12580,-30256,12570,-30260,12560,-30265,12549,-30269,12539,-30273,12529,-30278,12518,-30282,12508,-30286,12498,-30290,12487,-30295,12477,-30299,12467,-30303,12456,-30307,12446,-30312,12436,-30316,12425,-30320,12415,-30324,12405,-30329,12394,-30333,12384,-30337,12374,-30341,12363,-30345,12353,-30350,12343,-30354,12332,-30358,12322,-30362,12312,-30366,12301,-30371,12291,-30375,12280,-30379,12270,-30383,12260,-30387,12249,-30392,12239,-30396,12229,-30400,12218,-30404,12208,-30408,12198,-30412,12187,-30417,12177,-30421,12166,-30425,12156,-30429,12146,-30433,12135,-30437,12125,-30441,12115,-30446,12104,-30450,12094,-30454,12083,-30458,12073,-30462,12063,-30466,12052,-30470,12042,-30474,12032,-30478,12021,-30483,12011,-30487,12000,-30491,11990,-30495,11980,-30499,11969,-30503,11959,-30507,11948,-30511,11938,-30515,11928,-30519,11917,-30523,11907,-30527,11896,-30531,11886,-30536,11876,-30540,11865,-30544,11855,-30548,11844,-30552,11834,-30556,11823,-30560,11813,-30564,11803,-30568,11792,-30572,11782,-30576,11771,-30580,11761,-30584,11750,-30588,11740,-30592,11730,-30596,11719,-30600,11709,-30604,11698,-30608,11688,-30612,11677,-30616,11667,-30620,11657,-30624,11646,-30628,11636,-30632,11625,-30636,11615,-30640,11604,-30644,11594,-30648,11583,-30652,11573,-30656,11563,-30659,11552,-30663,11542,-30667,11531,-30671,11521,-30675,11510,-30679,11500,-30683,11489,-30687,11479,-30691,11468,-30695,11458,-30699,11448,-30703,11437,-30706,11427,-30710,11416,-30714,11406,-30718,11395,-30722,11385,-30726,11374,-30730,11364,-30734,11353,-30738,11343,-30741,11332,-30745,11322,-30749,11311,-30753,11301,-30757,11290,-30761,11280,-30765,11269,-30768,11259,-30772,11248,-30776,11238,-30780,11227,-30784,11217,-30788,11206,-30791,11196,-30795,11185,-30799,11175,-30803,11164,-30807,11154,-30810,11143,-30814,11133,-30818,11122,-30822,11112,-30826,11101,-30829,11091,-30833,11080,-30837,11070,-30841,11059,-30845,11049,-30848,11038,-30852,11028,-30856,11017,-30860,11007,-30863,10996,-30867,10986,-30871,10975,-30875,10965,-30878,10954,-30882,10944,-30886,10933,-30890,10923,-30893,10912,-30897,10902,-30901,10891,-30904,10880,-30908,10870,-30912,10859,-30916,10849,-30919,10838,-30923,10828,-30927,10817,-30930,10807,-30934,10796,-30938,10786,-30941,10775,-30945,10765,-30949,10754,-30952,10743,-30956,10733,-30960,10722,-30963,10712,-30967,10701,-30971,10691,-30974,10680,-30978,10670,-30982,10659,-30985,10648,-30989,10638,-30992,10627,-30996,10617,-31000,10606,-31003,10596,-31007,10585,-31011,10574,-31014,10564,-31018,10553,-31021,10543,-31025,10532,-31029,10522,-31032,10511,-31036,10500,-31039,10490,-31043,10479,-31046,10469,-31050,10458,-31054,10447,-31057,10437,-31061,10426,-31064,10416,-31068,10405,-31071,10395,-31075,10384,-31078,10373,-31082,10363,-31086,10352,-31089,10342,-31093,10331,-31096,10320,-31100,10310,-31103,10299,-31107,10289,-31110,10278,-31114,10267,-31117,10257,-31121,10246,-31124,10235,-31128,10225,-31131,10214,-31135,10204,-31138,10193,-31142,10182,-31145,10172,-31149,10161,-31152,10151,-31155,10140,-31159,10129,-31162,10119,-31166,10108,-31169,10097,-31173,10087,-31176,10076,-31180,10066,-31183,10055,-31186,10044,-31190,10034,-31193,10023,-31197,10012,-31200,10002,-31204,9991,-31207,9980,-31210,9970,-31214,9959,-31217,9949,-31221,9938,-31224,9927,-31227,9917,-31231,9906,-31234,9895,-31237,9885,-31241,9874,-31244,9863,-31248,9853,-31251,9842,-31254,9831,-31258,9821,-31261,9810,-31264,9799,-31268,9789,-31271,9778,-31274,9767,-31278,9757,-31281,9746,-31284,9735,-31288,9725,-31291,9714,-31294,9703,-31298,9693,-31301,9682,-31304,9671,-31308,9661,-31311,9650,-31314,9639,-31317,9629,-31321,9618,-31324,9607,-31327,9597,-31331,9586,-31334,9575,-31337,9565,-31340,9554,-31344,9543,-31347,9533,-31350,9522,-31353,9511,-31357,9501,-31360,9490,-31363,9479,-31366,9468,-31370,9458,-31373,9447,-31376,9436,-31379,9426,-31382,9415,-31386,9404,-31389,9394,-31392,9383,-31395,9372,-31398,9362,-31402,9351,-31405,9340,-31408,9329,-31411,9319,-31414,9308,-31418,9297,-31421,9287,-31424,9276,-31427,9265,-31430,9254,-31433,9244,-31436,9233,-31440,9222,-31443,9212,-31446,9201,-31449,9190,-31452,9179,-31455,9169,-31458,9158,-31462,9147,-31465,9136,-31468,9126,-31471,9115,-31474,9104,-31477,9094,-31480,9083,-31483,9072,-31486,9061,-31490,9051,-31493,9040,-31496,9029,-31499,9018,-31502,9008,-31505,8997,-31508,8986,-31511,8975,-31514,8965,-31517,8954,-31520,8943,-31523,8932,-31526,8922,-31529,8911,-31532,8900,-31535,8889,-31538,8879,-31542,8868,-31545,8857,-31548,8846,-31551,8836,-31554,8825,-31557,8814,-31560,8803,-31563,8793,-31566,8782,-31569,8771,-31572,8760,-31575,8750,-31578,8739,-31581,8728,-31584,8717,-31587,8707,-31589,8696,-31592,8685,-31595,8674,-31598,8663,-31601,8653,-31604,8642,-31607,8631,-31610,8620,-31613,8610,-31616,8599,-31619,8588,-31622,8577,-31625,8567,-31628,8556,-31631,8545,-31634,8534,-31636,8523,-31639,8513,-31642,8502,-31645,8491,-31648,8480,-31651,8469,-31654,8459,-31657,8448,-31660,8437,-31663,8426,-31665,8415,-31668,8405,-31671,8394,-31674,8383,-31677,8372,-31680,8361,-31683,8351,-31685,8340,-31688,8329,-31691,8318,-31694,8307,-31697,8297,-31700,8286,-31702,8275,-31705,8264,-31708,8253,-31711,8243,-31714,8232,-31717,8221,-31719,8210,-31722,8199,-31725,8189,-31728,8178,-31730,8167,-31733,8156,-31736,8145,-31739,8134,-31742,8124,-31744,8113,-31747,8102,-31750,8091,-31753,8080,-31755,8070,-31758,8059,-31761,8048,-31764,8037,-31766,8026,-31769,8015,-31772,8005,-31775,7994,-31777,7983,-31780,7972,-31783,7961,-31786,7950,-31788,7940,-31791,7929,-31794,7918,-31796,7907,-31799,7896,-31802,7885,-31804,7875,-31807,7864,-31810,7853,-31812,7842,-31815,7831,-31818,7820,-31820,7809,-31823,7799,-31826,7788,-31828,7777,-31831,7766,-31834,7755,-31836,7744,-31839,7733,-31842,7723,-31844,7712,-31847,7701,-31850,7690,-31852,7679,-31855,7668,-31857,7657,-31860,7647,-31863,7636,-31865,7625,-31868,7614,-31870,7603,-31873,7592,-31876,7581,-31878,7571,-31881,7560,-31883,7549,-31886,7538,-31889,7527,-31891,7516,-31894,7505,-31896,7494,-31899,7484,-31901,7473,-31904,7462,-31906,7451,-31909,7440,-31912,7429,-31914,7418,-31917,7407,-31919,7397,-31922,7386,-31924,7375,-31927,7364,-31929,7353,-31932,7342,-31934,7331,-31937,7320,-31939,7310,-31942,7299,-31944,7288,-31947,7277,-31949,7266,-31952,7255,-31954,7244,-31957,7233,-31959,7222,-31962,7211,-31964,7201,-31966,7190,-31969,7179,-31971,7168,-31974,7157,-31976,7146,-31979,7135,-31981,7124,-31984,7113,-31986,7102,-31988,7092,-31991,7081,-31993,7070,-31996,7059,-31998,7048,-32000,7037,-32003,7026,-32005,7015,-32008,7004,-32010,6993,-32012,6982,-32015,6972,-32017,6961,-32020,6950,-32022,6939,-32024,6928,-32027,6917,-32029,6906,-32031,6895,-32034,6884,-32036,6873,-32038,6862,-32041,6851,-32043,6841,-32045,6830,-32048,6819,-32050,6808,-32052,6797,-32055,6786,-32057,6775,-32059,6764,-32062,6753,-32064,6742,-32066,6731,-32069,6720,-32071,6709,-32073,6698,-32075,6688,-32078,6677,-32080,6666,-32082,6655,-32085,6644,-32087,6633,-32089,6622,-32091,6611,-32094,6600,-32096,6589,-32098,6578,-32100,6567,-32103,6556,-32105,6545,-32107,6534,-32109,6523,-32111,6512,-32114,6502,-32116,6491,-32118,6480,-32120,6469,-32123,6458,-32125,6447,-32127,6436,-32129,6425,-32131,6414,-32134,6403,-32136,6392,-32138,6381,-32140,6370,-32142,6359,-32144,6348,-32147,6337,-32149,6326,-32151,6315,-32153,6304,-32155,6293,-32157,6282,-32159,6271,-32162,6261,-32164,6250,-32166,6239,-32168,6228,-32170,6217,-32172,6206,-32174,6195,-32177,6184,-32179,6173,-32181,6162,-32183,6151,-32185,6140,-32187,6129,-32189,6118,-32191,6107,-32193,6096,-32195,6085,-32197,6074,-32200,6063,-32202,6052,-32204,6041,-32206,6030,-32208,6019,-32210,6008,-32212,5997,-32214,5986,-32216,5975,-32218,5964,-32220,5953,-32222,5942,-32224,5931,-32226,5920,-32228,5909,-32230,5898,-32232,5887,-32234,5876,-32236,5865,-32238,5854,-32240,5843,-32242,5832,-32244,5821,-32246,5810,-32248,5799,-32250,5788,-32252,5777,-32254,5766,-32256,5755,-32258,5744,-32260,5733,-32262,5722,-32264,5711,-32266,5700,-32268,5689,-32270,5678,-32272,5667,-32274,5656,-32275,5645,-32277,5634,-32279,5623,-32281,5612,-32283,5601,-32285,5590,-32287,5579,-32289,5568,-32291,5557,-32293,5546,-32295,5535,-32296,5524,-32298,5513,-32300,5502,-32302,5491,-32304,5480,-32306,5469,-32308,5458,-32310,5447,-32311,5436,-32313,5425,-32315,5414,-32317,5403,-32319,5392,-32321,5381,-32323,5370,-32324,5359,-32326,5348,-32328,5337,-32330,5326,-32332,5315,-32333,5304,-32335,5293,-32337,5282,-32339,5271,-32341,5260,-32342,5249,-32344,5238,-32346,5227,-32348,5216,-32350,5205,-32351,5194,-32353,5183,-32355,5172,-32357,5161,-32358,5150,-32360,5139,-32362,5128,-32364,5117,-32365,5106,-32367,5094,-32369,5083,-32371,5072,-32372,5061,-32374,5050,-32376,5039,-32378,5028,-32379,5017,-32381,5006,-32383,4995,-32384,4984,-32386,4973,-32388,4962,-32390,4951,-32391,4940,-32393,4929,-32395,4918,-32396,4907,-32398,4896,-32400,4885,-32401,4874,-32403,4863,-32405,4852,-32406,4841,-32408,4830,-32410,4818,-32411,4807,-32413,4796,-32414,4785,-32416,4774,-32418,4763,-32419,4752,-32421,4741,-32423,4730,-32424,4719,-32426,4708,-32427,4697,-32429,4686,-32431,4675,-32432,4664,-32434,4653,-32435,4642,-32437,4631,-32439,4620,-32440,4608,-32442,4597,-32443,4586,-32445,4575,-32446,4564,-32448,4553,-32450,4542,-32451,4531,-32453,4520,-32454,4509,-32456,4498,-32457,4487,-32459,4476,-32460,4465,-32462,4454,-32463,4443,-32465,4431,-32466,4420,-32468,4409,-32469,4398,-32471,4387,-32472,4376,-32474,4365,-32475,4354,-32477,4343,-32478,4332,-32480,4321,-32481,4310,-32483,4299,-32484,4288,-32486,4276,-32487,4265,-32489,4254,-32490,4243,-32492,4232,-32493,4221,-32494,4210,-32496,4199,-32497,4188,-32499,4177,-32500,4166,-32502,4155,-32503,4144,-32504,4132,-32506,4121,-32507,4110,-32509,4099,-32510,4088,-32511,4077,-32513,4066,-32514,4055,-32516,4044,-32517,4033,-32518,4022,-32520,4011,-32521,3999,-32522,3988,-32524,3977,-32525,3966,-32527,3955,-32528,3944,-32529,3933,-32531,3922,-32532,3911,-32533,3900,-32535,3889,-32536,3877,-32537,3866,-32539,3855,-32540,3844,-32541,3833,-32542,3822,-32544,3811,-32545,3800,-32546,3789,-32548,3778,-32549,3767,-32550,3755,-32552,3744,-32553,3733,-32554,3722,-32555,3711,-32557,3700,-32558,3689,-32559,3678,-32560,3667,-32562,3656,-32563,3644,-32564,3633,-32565,3622,-32567,3611,-32568,3600,-32569,3589,-32570,3578,-32572,3567,-32573,3556,-32574,3545,-32575,3533,-32576,3522,-32578,3511,-32579,3500,-32580,3489,-32581,3478,-32582,3467,-32584,3456,-32585,3445,-32586,3433,-32587,3422,-32588,3411,-32589,3400,-32591,3389,-32592,3378,-32593,3367,-32594,3356,-32595,3345,-32596,3333,-32597,3322,-32599,3311,-32600,3300,-32601,3289,-32602,3278,-32603,3267,-32604,3256,-32605,3245,-32606,3233,-32608,3222,-32609,3211,-32610,3200,-32611,3189,-32612,3178,-32613,3167,-32614,3156,-32615,3145,-32616,3133,-32617,3122,-32618,3111,-32619,3100,-32620,3089,-32622,3078,-32623,3067,-32624,3056,-32625,3044,-32626,3033,-32627,3022,-32628,3011,-32629,3000,-32630,2989,-32631,2978,-32632,2967,-32633,2955,-32634,2944,-32635,2933,-32636,2922,-32637,2911,-32638,2900,-32639,2889,-32640,2878,-32641,2866,-32642,2855,-32643,2844,-32644,2833,-32645,2822,-32646,2811,-32647,2800,-32648,2789,-32649,2777,-32650,2766,-32650,2755,-32651,2744,-32652,2733,-32653,2722,-32654,2711,-32655,2700,-32656,2688,-32657,2677,-32658,2666,-32659,2655,-32660,2644,-32661,2633,-32662,2622,-32662,2610,-32663,2599,-32664,2588,-32665,2577,-32666,2566,-32667,2555,-32668,2544,-32669,2533,-32669,2521,-32670,2510,-32671,2499,-32672,2488,-32673,2477,-32674,2466,-32675,2455,-32675,2443,-32676,2432,-32677,2421,-32678,2410,-32679,2399,-32680,2388,-32680,2377,-32681,2365,-32682,2354,-32683,2343,-32684,2332,-32684,2321,-32685,2310,-32686,2299,-32687,2287,-32688,2276,-32688,2265,-32689,2254,-32690,2243,-32691,2232,-32691,2221,-32692,2209,-32693,2198,-32694,2187,-32694,2176,-32695,2165,-32696,2154,-32697,2143,-32697,2131,-32698,2120,-32699,2109,-32700,2098,-32700,2087,-32701,2076,-32702,2065,-32702,2053,-32703,2042,-32704,2031,-32704,2020,-32705,2009,-32706,1998,-32707,1986,-32707,1975,-32708,1964,-32709,1953,-32709,1942,-32710,1931,-32711,1920,-32711,1908,-32712,1897,-32712,1886,-32713,1875,-32714,1864,-32714,1853,-32715,1842,-32716,1830,-32716,1819,-32717,1808,-32718,1797,-32718,1786,-32719,1775,-32719,1763,-32720,1752,-32721,1741,-32721,1730,-32722,1719,-32722,1708,-32723,1697,-32724,1685,-32724,1674,-32725,1663,-32725,1652,-32726,1641,-32726,1630,-32727,1618,-32727,1607,-32728,1596,-32729,1585,-32729,1574,-32730,1563,-32730,1552,-32731,1540,-32731,1529,-32732,1518,-32732,1507,-32733,1496,-32733,1485,-32734,1473,-32734,1462,-32735,1451,-32735,1440,-32736,1429,-32736,1418,-32737,1406,-32737,1395,-32738,1384,-32738,1373,-32739,1362,-32739,1351,-32740,1339,-32740,1328,-32741,1317,-32741,1306,-32741,1295,-32742,1284,-32742,1273,-32743,1261,-32743,1250,-32744,1239,-32744,1228,-32744,1217,-32745,1206,-32745,1194,-32746,1183,-32746,1172,-32747,1161,-32747,1150,-32747,1139,-32748,1127,-32748,1116,-32748,1105,-32749,1094,-32749,1083,-32750,1072,-32750,1060,-32750,1049,-32751,1038,-32751,1027,-32751,1016,-32752,1005,-32752,993,-32752,982,-32753,971,-32753,960,-32753,949,-32754,938,-32754,926,-32754,915,-32755,904,-32755,893,-32755,882,-32756,871,-32756,859,-32756,848,-32757,837,-32757,826,-32757,815,-32757,804,-32758,792,-32758,781,-32758,770,-32758,759,-32759,748,-32759,737,-32759,725,-32759,714,-32760,703,-32760,692,-32760,681,-32760,670,-32761,658,-32761,647,-32761,636,-32761,625,-32762,614,-32762,603,-32762,591,-32762,580,-32762,569,-32763,558,-32763,547,-32763,536,-32763,524,-32763,513,-32763,502,-32764,491,-32764,480,-32764,469,-32764,457,-32764,446,-32764,435,-32765,424,-32765,413,-32765,402,-32765,390,-32765,379,-32765,368,-32765,357,-32766,346,-32766,335,-32766,323,-32766,312,-32766,301,-32766,290,-32766,279,-32766,268,-32766,256,-32766,245,-32767,234,-32767,223,-32767,212,-32767,201,-32767,189,-32767,178,-32767,167,-32767,156,-32767,145,-32767,134,-32767,122,-32767,111,-32767,100,-32767,89,-32767,78,-32767,67,-32767,55,-32767,44,-32767,33,-32767,22,-32767,11,-32767,0,-32767,-12,-32767,-23,-32767,-34,-32767,-45,-32767,-56,-32767,-68,-32767,-79,-32767,-90,-32767,-101,-32767,-112,-32767,-123,-32767,-135,-32767,-146,-32767,-157,-32767,-168,-32767,-179,-32767,-190,-32767,-202,-32767,-213,-32767,-224,-32767,-235,-32767,-246,-32767,-257,-32766,-269,-32766,-280,-32766,-291,-32766,-302,-32766,-313,-32766,-324,-32766,-336,-32766,-347,-32766,-358,-32766,-369,-32765,-380,-32765,-391,-32765,-403,-32765,-414,-32765,-425,-32765,-436,-32765,-447,-32764,-458,-32764,-470,-32764,-481,-32764,-492,-32764,-503,-32764,-514,-32763,-525,-32763,-537,-32763,-548,-32763,-559,-32763,-570,-32763,-581,-32762,-592,-32762,-604,-32762,-615,-32762,-626,-32762,-637,-32761,-648,-32761,-659,-32761,-671,-32761,-682,-32760,-693,-32760,-704,-32760,-715,-32760,-726,-32759,-738,-32759,-749,-32759,-760,-32759,-771,-32758,-782,-32758,-793,-32758,-805,-32758,-816,-32757,-827,-32757,-838,-32757,-849,-32757,-860,-32756,-872,-32756,-883,-32756,-894,-32755,-905,-32755,-916,-32755,-927,-32754,-939,-32754,-950,-32754,-961,-32753,-972,-32753,-983,-32753,-994,-32752,-1006,-32752,-1017,-32752,-1028,-32751,-1039,-32751,-1050,-32751,-1061,-32750,-1073,-32750,-1084,-32750,-1095,-32749,-1106,-32749,-1117,-32748,-1128,-32748,-1140,-32748,-1151,-32747,-1162,-32747,-1173,-32747,-1184,-32746,-1195,-32746,-1207,-32745,-1218,-32745,-1229,-32744,-1240,-32744,-1251,-32744,-1262,-32743,-1274,-32743,-1285,-32742,-1296,-32742,-1307,-32741,-1318,-32741,-1329,-32741,-1340,-32740,-1352,-32740,-1363,-32739,-1374,-32739,-1385,-32738,-1396,-32738,-1407,-32737,-1419,-32737,-1430,-32736,-1441,-32736,-1452,-32735,-1463,-32735,-1474,-32734,-1486,-32734,-1497,-32733,-1508,-32733,-1519,-32732,-1530,-32732,-1541,-32731,-1553,-32731,-1564,-32730,-1575,-32730,-1586,-32729,-1597,-32729,-1608,-32728,-1619,-32727,-1631,-32727,-1642,-32726,-1653,-32726,-1664,-32725,-1675,-32725,-1686,-32724,-1698,-32724,-1709,-32723,-1720,-32722,-1731,-32722,-1742,-32721,-1753,-32721,-1764,-32720,-1776,-32719,-1787,-32719,-1798,-32718,-1809,-32718,-1820,-32717,-1831,-32716,-1843,-32716,-1854,-32715,-1865,-32714,-1876,-32714,-1887,-32713,-1898,-32712,-1909,-32712,-1921,-32711,-1932,-32711,-1943,-32710,-1954,-32709,-1965,-32709,-1976,-32708,-1987,-32707,-1999,-32707,-2010,-32706,-2021,-32705,-2032,-32704,-2043,-32704,-2054,-32703,-2066,-32702,-2077,-32702,-2088,-32701,-2099,-32700,-2110,-32700,-2121,-32699,-2132,-32698,-2144,-32697,-2155,-32697,-2166,-32696,-2177,-32695,-2188,-32694,-2199,-32694,-2210,-32693,-2222,-32692,-2233,-32691,-2244,-32691,-2255,-32690,-2266,-32689,-2277,-32688,-2288,-32688,-2300,-32687,-2311,-32686,-2322,-32685,-2333,-32684,-2344,-32684,-2355,-32683,-2366,-32682,-2378,-32681,-2389,-32680,-2400,-32680,-2411,-32679,-2422,-32678,-2433,-32677,-2444,-32676,-2456,-32675,-2467,-32675,-2478,-32674,-2489,-32673,-2500,-32672,-2511,-32671,-2522,-32670,-2534,-32669,-2545,-32669,-2556,-32668,-2567,-32667,-2578,-32666,-2589,-32665,-2600,-32664,-2611,-32663,-2623,-32662,-2634,-32662,-2645,-32661,-2656,-32660,-2667,-32659,-2678,-32658,-2689,-32657,-2701,-32656,-2712,-32655,-2723,-32654,-2734,-32653,-2745,-32652,-2756,-32651,-2767,-32650,-2778,-32650,-2790,-32649,-2801,-32648,-2812,-32647,-2823,-32646,-2834,-32645,-2845,-32644,-2856,-32643,-2867,-32642,-2879,-32641,-2890,-32640,-2901,-32639,-2912,-32638,-2923,-32637,-2934,-32636,-2945,-32635,-2956,-32634,-2968,-32633,-2979,-32632,-2990,-32631,-3001,-32630,-3012,-32629,-3023,-32628,-3034,-32627,-3045,-32626,-3057,-32625,-3068,-32624,-3079,-32623,-3090,-32622,-3101,-32620,-3112,-32619,-3123,-32618,-3134,-32617,-3146,-32616,-3157,-32615,-3168,-32614,-3179,-32613,-3190,-32612,-3201,-32611,-3212,-32610,-3223,-32609,-3234,-32608,-3246,-32606,-3257,-32605,-3268,-32604,-3279,-32603,-3290,-32602,-3301,-32601,-3312,-32600,-3323,-32599,-3334,-32597,-3346,-32596,-3357,-32595,-3368,-32594,-3379,-32593,-3390,-32592,-3401,-32591,-3412,-32589,-3423,-32588,-3434,-32587,-3446,-32586,-3457,-32585,-3468,-32584,-3479,-32582,-3490,-32581,-3501,-32580,-3512,-32579,-3523,-32578,-3534,-32576,-3546,-32575,-3557,-32574,-3568,-32573,-3579,-32572,-3590,-32570,-3601,-32569,-3612,-32568,-3623,-32567,-3634,-32565,-3645,-32564,-3657,-32563,-3668,-32562,-3679,-32560,-3690,-32559,-3701,-32558,-3712,-32557,-3723,-32555,-3734,-32554,-3745,-32553,-3756,-32552,-3768,-32550,-3779,-32549,-3790,-32548,-3801,-32546,-3812,-32545,-3823,-32544,-3834,-32542,-3845,-32541,-3856,-32540,-3867,-32539,-3878,-32537,-3890,-32536,-3901,-32535,-3912,-32533,-3923,-32532,-3934,-32531,-3945,-32529,-3956,-32528,-3967,-32527,-3978,-32525,-3989,-32524,-4000,-32522,-4012,-32521,-4023,-32520,-4034,-32518,-4045,-32517,-4056,-32516,-4067,-32514,-4078,-32513,-4089,-32511,-4100,-32510,-4111,-32509,-4122,-32507,-4133,-32506,-4145,-32504,-4156,-32503,-4167,-32502,-4178,-32500,-4189,-32499,-4200,-32497,-4211,-32496,-4222,-32494,-4233,-32493,-4244,-32492,-4255,-32490,-4266,-32489,-4277,-32487,-4289,-32486,-4300,-32484,-4311,-32483,-4322,-32481,-4333,-32480,-4344,-32478,-4355,-32477,-4366,-32475,-4377,-32474,-4388,-32472,-4399,-32471,-4410,-32469,-4421,-32468,-4432,-32466,-4444,-32465,-4455,-32463,-4466,-32462,-4477,-32460,-4488,-32459,-4499,-32457,-4510,-32456,-4521,-32454,-4532,-32453,-4543,-32451,-4554,-32450,-4565,-32448,-4576,-32446,-4587,-32445,-4598,-32443,-4609,-32442,-4621,-32440,-4632,-32439,-4643,-32437,-4654,-32435,-4665,-32434,-4676,-32432,-4687,-32431,-4698,-32429,-4709,-32427,-4720,-32426,-4731,-32424,-4742,-32423,-4753,-32421,-4764,-32419,-4775,-32418,-4786,-32416,-4797,-32414,-4808,-32413,-4819,-32411,-4831,-32410,-4842,-32408,-4853,-32406,-4864,-32405,-4875,-32403,-4886,-32401,-4897,-32400,-4908,-32398,-4919,-32396,-4930,-32395,-4941,-32393,-4952,-32391,-4963,-32390,-4974,-32388,-4985,-32386,-4996,-32384,-5007,-32383,-5018,-32381,-5029,-32379,-5040,-32378,-5051,-32376,-5062,-32374,-5073,-32372,-5084,-32371,-5095,-32369,-5107,-32367,-5118,-32365,-5129,-32364,-5140,-32362,-5151,-32360,-5162,-32358,-5173,-32357,-5184,-32355,-5195,-32353,-5206,-32351,-5217,-32350,-5228,-32348,-5239,-32346,-5250,-32344,-5261,-32342,-5272,-32341,-5283,-32339,-5294,-32337,-5305,-32335,-5316,-32333,-5327,-32332,-5338,-32330,-5349,-32328,-5360,-32326,-5371,-32324,-5382,-32323,-5393,-32321,-5404,-32319,-5415,-32317,-5426,-32315,-5437,-32313,-5448,-32311,-5459,-32310,-5470,-32308,-5481,-32306,-5492,-32304,-5503,-32302,-5514,-32300,-5525,-32298,-5536,-32296,-5547,-32295,-5558,-32293,-5569,-32291,-5580,-32289,-5591,-32287,-5602,-32285,-5613,-32283,-5624,-32281,-5635,-32279,-5646,-32277,-5657,-32275,-5668,-32274,-5679,-32272,-5690,-32270,-5701,-32268,-5712,-32266,-5723,-32264,-5734,-32262,-5745,-32260,-5756,-32258,-5767,-32256,-5778,-32254,-5789,-32252,-5800,-32250,-5811,-32248,-5822,-32246,-5833,-32244,-5844,-32242,-5855,-32240,-5866,-32238,-5877,-32236,-5888,-32234,-5899,-32232,-5910,-32230,-5921,-32228,-5932,-32226,-5943,-32224,-5954,-32222,-5965,-32220,-5976,-32218,-5987,-32216,-5998,-32214,-6009,-32212,-6020,-32210,-6031,-32208,-6042,-32206,-6053,-32204,-6064,-32202,-6075,-32200,-6086,-32197,-6097,-32195,-6108,-32193,-6119,-32191,-6130,-32189,-6141,-32187,-6152,-32185,-6163,-32183,-6174,-32181,-6185,-32179,-6196,-32177,-6207,-32174,-6218,-32172,-6229,-32170,-6240,-32168,-6251,-32166,-6262,-32164,-6272,-32162,-6283,-32159,-6294,-32157,-6305,-32155,-6316,-32153,-6327,-32151,-6338,-32149,-6349,-32147,-6360,-32144,-6371,-32142,-6382,-32140,-6393,-32138,-6404,-32136,-6415,-32134,-6426,-32131,-6437,-32129,-6448,-32127,-6459,-32125,-6470,-32123,-6481,-32120,-6492,-32118,-6503,-32116,-6513,-32114,-6524,-32111,-6535,-32109,-6546,-32107,-6557,-32105,-6568,-32103,-6579,-32100,-6590,-32098,-6601,-32096,-6612,-32094,-6623,-32091,-6634,-32089,-6645,-32087,-6656,-32085,-6667,-32082,-6678,-32080,-6689,-32078,-6699,-32075,-6710,-32073,-6721,-32071,-6732,-32069,-6743,-32066,-6754,-32064,-6765,-32062,-6776,-32059,-6787,-32057,-6798,-32055,-6809,-32052,-6820,-32050,-6831,-32048,-6842,-32045,-6852,-32043,-6863,-32041,-6874,-32038,-6885,-32036,-6896,-32034,-6907,-32031,-6918,-32029,-6929,-32027,-6940,-32024,-6951,-32022,-6962,-32020,-6973,-32017,-6983,-32015,-6994,-32012,-7005,-32010,-7016,-32008,-7027,-32005,-7038,-32003,-7049,-32000,-7060,-31998,-7071,-31996,-7082,-31993,-7093,-31991,-7103,-31988,-7114,-31986,-7125,-31984,-7136,-31981,-7147,-31979,-7158,-31976,-7169,-31974,-7180,-31971,-7191,-31969,-7202,-31966,-7212,-31964,-7223,-31962,-7234,-31959,-7245,-31957,-7256,-31954,-7267,-31952,-7278,-31949,-7289,-31947,-7300,-31944,-7311,-31942,-7321,-31939,-7332,-31937,-7343,-31934,-7354,-31932,-7365,-31929,-7376,-31927,-7387,-31924,-7398,-31922,-7408,-31919,-7419,-31917,-7430,-31914,-7441,-31912,-7452,-31909,-7463,-31906,-7474,-31904,-7485,-31901,-7495,-31899,-7506,-31896,-7517,-31894,-7528,-31891,-7539,-31889,-7550,-31886,-7561,-31883,-7572,-31881,-7582,-31878,-7593,-31876,-7604,-31873,-7615,-31870,-7626,-31868,-7637,-31865,-7648,-31863,-7658,-31860,-7669,-31857,-7680,-31855,-7691,-31852,-7702,-31850,-7713,-31847,-7724,-31844,-7734,-31842,-7745,-31839,-7756,-31836,-7767,-31834,-7778,-31831,-7789,-31828,-7800,-31826,-7810,-31823,-7821,-31820,-7832,-31818,-7843,-31815,-7854,-31812,-7865,-31810,-7876,-31807,-7886,-31804,-7897,-31802,-7908,-31799,-7919,-31796,-7930,-31794,-7941,-31791,-7951,-31788,-7962,-31786,-7973,-31783,-7984,-31780,-7995,-31777,-8006,-31775,-8016,-31772,-8027,-31769,-8038,-31766,-8049,-31764,-8060,-31761,-8071,-31758,-8081,-31755,-8092,-31753,-8103,-31750,-8114,-31747,-8125,-31744,-8135,-31742,-8146,-31739,-8157,-31736,-8168,-31733,-8179,-31730,-8190,-31728,-8200,-31725,-8211,-31722,-8222,-31719,-8233,-31717,-8244,-31714,-8254,-31711,-8265,-31708,-8276,-31705,-8287,-31702,-8298,-31700,-8308,-31697,-8319,-31694,-8330,-31691,-8341,-31688,-8352,-31685,-8362,-31683,-8373,-31680,-8384,-31677,-8395,-31674,-8406,-31671,-8416,-31668,-8427,-31665,-8438,-31663,-8449,-31660,-8460,-31657,-8470,-31654,-8481,-31651,-8492,-31648,-8503,-31645,-8514,-31642,-8524,-31639,-8535,-31636,-8546,-31634,-8557,-31631,-8568,-31628,-8578,-31625,-8589,-31622,-8600,-31619,-8611,-31616,-8621,-31613,-8632,-31610,-8643,-31607,-8654,-31604,-8664,-31601,-8675,-31598,-8686,-31595,-8697,-31592,-8708,-31589,-8718,-31587,-8729,-31584,-8740,-31581,-8751,-31578,-8761,-31575,-8772,-31572,-8783,-31569,-8794,-31566,-8804,-31563,-8815,-31560,-8826,-31557,-8837,-31554,-8847,-31551,-8858,-31548,-8869,-31545,-8880,-31542,-8890,-31538,-8901,-31535,-8912,-31532,-8923,-31529,-8933,-31526,-8944,-31523,-8955,-31520,-8966,-31517,-8976,-31514,-8987,-31511,-8998,-31508,-9009,-31505,-9019,-31502,-9030,-31499,-9041,-31496,-9052,-31493,-9062,-31490,-9073,-31486,-9084,-31483,-9095,-31480,-9105,-31477,-9116,-31474,-9127,-31471,-9137,-31468,-9148,-31465,-9159,-31462,-9170,-31458,-9180,-31455,-9191,-31452,-9202,-31449,-9213,-31446,-9223,-31443,-9234,-31440,-9245,-31436,-9255,-31433,-9266,-31430,-9277,-31427,-9288,-31424,-9298,-31421,-9309,-31418,-9320,-31414,-9330,-31411,-9341,-31408,-9352,-31405,-9363,-31402,-9373,-31398,-9384,-31395,-9395,-31392,-9405,-31389,-9416,-31386,-9427,-31382,-9437,-31379,-9448,-31376,-9459,-31373,-9469,-31370,-9480,-31366,-9491,-31363,-9502,-31360,-9512,-31357,-9523,-31353,-9534,-31350,-9544,-31347,-9555,-31344,-9566,-31340,-9576,-31337,-9587,-31334,-9598,-31331,-9608,-31327,-9619,-31324,-9630,-31321,-9640,-31317,-9651,-31314,-9662,-31311,-9672,-31308,-9683,-31304,-9694,-31301,-9704,-31298,-9715,-31294,-9726,-31291,-9736,-31288,-9747,-31284,-9758,-31281,-9768,-31278,-9779,-31274,-9790,-31271,-9800,-31268,-9811,-31264,-9822,-31261,-9832,-31258,-9843,-31254,-9854,-31251,-9864,-31248,-9875,-31244,-9886,-31241,-9896,-31237,-9907,-31234,-9918,-31231,-9928,-31227,-9939,-31224,-9950,-31221,-9960,-31217,-9971,-31214,-9981,-31210,-9992,-31207,-10003,-31204,-10013,-31200,-10024,-31197,-10035,-31193,-10045,-31190,-10056,-31186,-10067,-31183,-10077,-31180,-10088,-31176,-10098,-31173,-10109,-31169,-10120,-31166,-10130,-31162,-10141,-31159,-10152,-31155,-10162,-31152,-10173,-31149,-10183,-31145,-10194,-31142,-10205,-31138,-10215,-31135,-10226,-31131,-10236,-31128,-10247,-31124,-10258,-31121,-10268,-31117,-10279,-31114,-10290,-31110,-10300,-31107,-10311,-31103,-10321,-31100,-10332,-31096,-10343,-31093,-10353,-31089,-10364,-31086,-10374,-31082,-10385,-31078,-10396,-31075,-10406,-31071,-10417,-31068,-10427,-31064,-10438,-31061,-10448,-31057,-10459,-31054,-10470,-31050,-10480,-31046,-10491,-31043,-10501,-31039,-10512,-31036,-10523,-31032,-10533,-31029,-10544,-31025,-10554,-31021,-10565,-31018,-10575,-31014,-10586,-31011,-10597,-31007,-10607,-31003,-10618,-31000,-10628,-30996,-10639,-30992,-10649,-30989,-10660,-30985,-10671,-30982,-10681,-30978,-10692,-30974,-10702,-30971,-10713,-30967,-10723,-30963,-10734,-30960,-10744,-30956,-10755,-30952,-10766,-30949,-10776,-30945,-10787,-30941,-10797,-30938,-10808,-30934,-10818,-30930,-10829,-30927,-10839,-30923,-10850,-30919,-10860,-30916,-10871,-30912,-10881,-30908,-10892,-30904,-10903,-30901,-10913,-30897,-10924,-30893,-10934,-30890,-10945,-30886,-10955,-30882,-10966,-30878,-10976,-30875,-10987,-30871,-10997,-30867,-11008,-30863,-11018,-30860,-11029,-30856,-11039,-30852,-11050,-30848,-11060,-30845,-11071,-30841,-11081,-30837,-11092,-30833,-11102,-30829,-11113,-30826,-11123,-30822,-11134,-30818,-11144,-30814,-11155,-30810,-11165,-30807,-11176,-30803,-11186,-30799,-11197,-30795,-11207,-30791,-11218,-30788,-11228,-30784,-11239,-30780,-11249,-30776,-11260,-30772,-11270,-30768,-11281,-30765,-11291,-30761,-11302,-30757,-11312,-30753,-11323,-30749,-11333,-30745,-11344,-30741,-11354,-30738,-11365,-30734,-11375,-30730,-11386,-30726,-11396,-30722,-11407,-30718,-11417,-30714,-11428,-30710,-11438,-30706,-11449,-30703,-11459,-30699,-11469,-30695,-11480,-30691,-11490,-30687,-11501,-30683,-11511,-30679,-11522,-30675,-11532,-30671,-11543,-30667,-11553,-30663,-11564,-30659,-11574,-30656,-11584,-30652,-11595,-30648,-11605,-30644,-11616,-30640,-11626,-30636,-11637,-30632,-11647,-30628,-11658,-30624,-11668,-30620,-11678,-30616,-11689,-30612,-11699,-30608,-11710,-30604,-11720,-30600,-11731,-30596,-11741,-30592,-11751,-30588,-11762,-30584,-11772,-30580,-11783,-30576,-11793,-30572,-11804,-30568,-11814,-30564,-11824,-30560,-11835,-30556,-11845,-30552,-11856,-30548,-11866,-30544,-11877,-30540,-11887,-30536,-11897,-30531,-11908,-30527,-11918,-30523,-11929,-30519,-11939,-30515,-11949,-30511,-11960,-30507,-11970,-30503,-11981,-30499,-11991,-30495,-12001,-30491,-12012,-30487,-12022,-30483,-12033,-30478,-12043,-30474,-12053,-30470,-12064,-30466,-12074,-30462,-12084,-30458,-12095,-30454,-12105,-30450,-12116,-30446,-12126,-30441,-12136,-30437,-12147,-30433,-12157,-30429,-12167,-30425,-12178,-30421,-12188,-30417,-12199,-30412,-12209,-30408,-12219,-30404,-12230,-30400,-12240,-30396,-12250,-30392,-12261,-30387,-12271,-30383,-12281,-30379,-12292,-30375,-12302,-30371,-12313,-30366,-12323,-30362,-12333,-30358,-12344,-30354,-12354,-30350,-12364,-30345,-12375,-30341,-12385,-30337,-12395,-30333,-12406,-30329,-12416,-30324,-12426,-30320,-12437,-30316,-12447,-30312,-12457,-30307,-12468,-30303,-12478,-30299,-12488,-30295,-12499,-30290,-12509,-30286,-12519,-30282,-12530,-30278,-12540,-30273,-12550,-30269,-12561,-30265,-12571,-30260,-12581,-30256,-12591,-30252,-12602,-30248,-12612,-30243,-12622,-30239,-12633,-30235,-12643,-30230,-12653,-30226,-12664,-30222,-12674,-30217,-12684,-30213,-12695,-30209,-12705,-30204,-12715,-30200,-12725,-30196,-12736,-30191,-12746,-30187,-12756,-30183,-12767,-30178,-12777,-30174,-12787,-30170,-12797,-30165,-12808,-30161,-12818,-30157,-12828,-30152,-12839,-30148,-12849,-30143,-12859,-30139,-12869,-30135,-12880,-30130,-12890,-30126,-12900,-30122,-12910,-30117,-12921,-30113,-12931,-30108,-12941,-30104,-12951,-30099,-12962,-30095,-12972,-30091,-12982,-30086,-12993,-30082,-13003,-30077,-13013,-30073,-13023,-30068,-13034,-30064,-13044,-30060,-13054,-30055,-13064,-30051,-13075,-30046,-13085,-30042,-13095,-30037,-13105,-30033,-13115,-30028,-13126,-30024,-13136,-30019,-13146,-30015,-13156,-30010,-13167,-30006,-13177,-30002,-13187,-29997,-13197,-29993,-13208,-29988,-13218,-29984,-13228,-29979,-13238,-29974,-13248,-29970,-13259,-29965,-13269,-29961,-13279,-29956,-13289,-29952,-13299,-29947,-13310,-29943,-13320,-29938,-13330,-29934,-13340,-29929,-13350,-29925,-13361,-29920,-13371,-29916,-13381,-29911,-13391,-29906,-13401,-29902,-13412,-29897,-13422,-29893,-13432,-29888,-13442,-29884,-13452,-29879,-13463,-29874,-13473,-29870,-13483,-29865,-13493,-29861,-13503,-29856,-13513,-29851,-13524,-29847,-13534,-29842,-13544,-29838,-13554,-29833,-13564,-29828,-13575,-29824,-13585,-29819,-13595,-29814,-13605,-29810,-13615,-29805,-13625,-29801,-13635,-29796,-13646,-29791,-13656,-29787,-13666,-29782,-13676,-29777,-13686,-29773,-13696,-29768,-13707,-29763,-13717,-29759,-13727,-29754,-13737,-29749,-13747,-29745,-13757,-29740,-13767,-29735,-13778,-29730,-13788,-29726,-13798,-29721,-13808,-29716,-13818,-29712,-13828,-29707,-13838,-29702,-13848,-29697,-13859,-29693,-13869,-29688,-13879,-29683,-13889,-29679,-13899,-29674,-13909,-29669,-13919,-29664,-13929,-29660,-13939,-29655,-13950,-29650,-13960,-29645,-13970,-29641,-13980,-29636,-13990,-29631,-14000,-29626,-14010,-29622,-14020,-29617,-14030,-29612,-14040,-29607,-14051,-29602,-14061,-29598,-14071,-29593,-14081,-29588,-14091,-29583,-14101,-29578,-14111,-29574,-14121,-29569,-14131,-29564,-14141,-29559,-14151,-29554,-14161,-29549,-14172,-29545,-14182,-29540,-14192,-29535,-14202,-29530,-14212,-29525,-14222,-29520,-14232,-29516,-14242,-29511,-14252,-29506,-14262,-29501,-14272,-29496,-14282,-29491,-14292,-29486,-14302,-29482,-14312,-29477,-14322,-29472,-14332,-29467,-14343,-29462,-14353,-29457,-14363,-29452,-14373,-29447,-14383,-29442,-14393,-29438,-14403,-29433,-14413,-29428,-14423,-29423,-14433,-29418,-14443,-29413,-14453,-29408,-14463,-29403,-14473,-29398,-14483,-29393,-14493,-29388,-14503,-29383,-14513,-29378,-14523,-29373,-14533,-29369,-14543,-29364,-14553,-29359,-14563,-29354,-14573,-29349,-14583,-29344,-14593,-29339,-14603,-29334,-14613,-29329,-14623,-29324,-14633,-29319,-14643,-29314,-14653,-29309,-14663,-29304,-14673,-29299,-14683,-29294,-14693,-29289,-14703,-29284,-14713,-29279,-14723,-29274,-14733,-29269,-14743,-29264,-14753,-29259,-14763,-29254,-14773,-29249,-14783,-29244,-14793,-29239,-14803,-29234,-14813,-29228,-14823,-29223,-14833,-29218,-14843,-29213,-14853,-29208,-14862,-29203,-14872,-29198,-14882,-29193,-14892,-29188,-14902,-29183,-14912,-29178,-14922,-29173,-14932,-29168,-14942,-29163,-14952,-29157,-14962,-29152,-14972,-29147,-14982,-29142,-14992,-29137,-15002,-29132,-15012,-29127,-15022,-29122,-15031,-29117,-15041,-29111,-15051,-29106,-15061,-29101,-15071,-29096,-15081,-29091,-15091,-29086,-15101,-29081,-15111,-29075,-15121,-29070,-15131,-29065,-15141,-29060,-15150,-29055,-15160,-29050,-15170,-29045,-15180,-29039,-15190,-29034,-15200,-29029,-15210,-29024,-15220,-29019,-15230,-29013,-15239,-29008,-15249,-29003,-15259,-28998,-15269,-28993,-15279,-28987,-15289,-28982,-15299,-28977,-15309,-28972,-15319,-28967,-15328,-28961,-15338,-28956,-15348,-28951,-15358,-28946,-15368,-28940,-15378,-28935,-15388,-28930,-15397,-28925,-15407,-28919,-15417,-28914,-15427,-28909,-15437,-28904,-15447,-28898,-15457,-28893,-15466,-28888,-15476,-28883,-15486,-28877,-15496,-28872,-15506,-28867,-15516,-28861,-15526,-28856,-15535,-28851,-15545,-28846,-15555,-28840,-15565,-28835,-15575,-28830,-15584,-28824,-15594,-28819,-15604,-28814,-15614,-28808,-15624,-28803,-15634,-28798,-15643,-28792,-15653,-28787,-15663,-28782,-15673,-28776,-15683,-28771,-15692,-28766,-15702,-28760,-15712,-28755,-15722,-28750,-15732,-28744,-15741,-28739,-15751,-28734,-15761,-28728,-15771,-28723,-15781,-28717,-15790,-28712,-15800,-28707,-15810,-28701,-15820,-28696,-15830,-28691,-15839,-28685,-15849,-28680,-15859,-28674,-15869,-28669,-15878,-28663,-15888,-28658,-15898,-28653,-15908,-28647,-15918,-28642,-15927,-28636,-15937,-28631,-15947,-28626,-15957,-28620,-15966,-28615,-15976,-28609,-15986,-28604,-15996,-28598,-16005,-28593,-16015,-28587,-16025,-28582,-16035,-28576,-16044,-28571,-16054,-28566,-16064,-28560,-16073,-28555,-16083,-28549,-16093,-28544,-16103,-28538,-16112,-28533,-16122,-28527,-16132,-28522,-16142,-28516,-16151,-28511,-16161,-28505,-16171,-28500,-16180,-28494,-16190,-28489,-16200,-28483,-16210,-28478,-16219,-28472,-16229,-28466,-16239,-28461,-16248,-28455,-16258,-28450,-16268,-28444,-16277,-28439,-16287,-28433,-16297,-28428,-16307,-28422,-16316,-28417,-16326,-28411,-16336,-28405,-16345,-28400,-16355,-28394,-16365,-28389,-16374,-28383}; + +int16_t twb18432[12288] = { 32767,0,32766,-23,32766,-45,32766,-68,32766,-90,32766,-112,32766,-135,32766,-157,32766,-179,32766,-202,32766,-224,32766,-246,32765,-269,32765,-291,32765,-313,32765,-336,32765,-358,32764,-380,32764,-403,32764,-425,32763,-447,32763,-470,32763,-492,32762,-514,32762,-537,32762,-559,32761,-581,32761,-604,32761,-626,32760,-648,32760,-671,32759,-693,32759,-715,32758,-738,32758,-760,32757,-782,32757,-805,32756,-827,32756,-849,32755,-872,32754,-894,32754,-916,32753,-939,32752,-961,32752,-983,32751,-1006,32750,-1028,32750,-1050,32749,-1073,32748,-1095,32747,-1117,32747,-1140,32746,-1162,32745,-1184,32744,-1207,32743,-1229,32743,-1251,32742,-1274,32741,-1296,32740,-1318,32739,-1340,32738,-1363,32737,-1385,32736,-1407,32735,-1430,32734,-1452,32733,-1474,32732,-1497,32731,-1519,32730,-1541,32729,-1564,32728,-1586,32727,-1608,32726,-1631,32725,-1653,32724,-1675,32723,-1698,32721,-1720,32720,-1742,32719,-1764,32718,-1787,32717,-1809,32715,-1831,32714,-1854,32713,-1876,32711,-1898,32710,-1921,32709,-1943,32708,-1965,32706,-1987,32705,-2010,32703,-2032,32702,-2054,32701,-2077,32699,-2099,32698,-2121,32696,-2144,32695,-2166,32693,-2188,32692,-2210,32690,-2233,32689,-2255,32687,-2277,32686,-2300,32684,-2322,32683,-2344,32681,-2366,32679,-2389,32678,-2411,32676,-2433,32674,-2456,32673,-2478,32671,-2500,32669,-2522,32668,-2545,32666,-2567,32664,-2589,32662,-2611,32661,-2634,32659,-2656,32657,-2678,32655,-2701,32653,-2723,32651,-2745,32649,-2767,32648,-2790,32646,-2812,32644,-2834,32642,-2856,32640,-2879,32638,-2901,32636,-2923,32634,-2945,32632,-2968,32630,-2990,32628,-3012,32626,-3034,32624,-3057,32622,-3079,32619,-3101,32617,-3123,32615,-3146,32613,-3168,32611,-3190,32609,-3212,32607,-3234,32604,-3257,32602,-3279,32600,-3301,32598,-3323,32595,-3346,32593,-3368,32591,-3390,32588,-3412,32586,-3434,32584,-3457,32581,-3479,32579,-3501,32577,-3523,32574,-3546,32572,-3568,32569,-3590,32567,-3612,32564,-3634,32562,-3657,32559,-3679,32557,-3701,32554,-3723,32552,-3745,32549,-3768,32547,-3790,32544,-3812,32541,-3834,32539,-3856,32536,-3878,32534,-3901,32531,-3923,32528,-3945,32526,-3967,32523,-3989,32520,-4012,32517,-4034,32515,-4056,32512,-4078,32509,-4100,32506,-4122,32503,-4145,32501,-4167,32498,-4189,32495,-4211,32492,-4233,32489,-4255,32486,-4277,32483,-4300,32480,-4322,32477,-4344,32474,-4366,32471,-4388,32468,-4410,32465,-4432,32462,-4455,32459,-4477,32456,-4499,32453,-4521,32450,-4543,32447,-4565,32444,-4587,32441,-4609,32438,-4632,32434,-4654,32431,-4676,32428,-4698,32425,-4720,32422,-4742,32418,-4764,32415,-4786,32412,-4808,32409,-4831,32405,-4853,32402,-4875,32399,-4897,32395,-4919,32392,-4941,32389,-4963,32385,-4985,32382,-5007,32378,-5029,32375,-5051,32371,-5073,32368,-5095,32364,-5118,32361,-5140,32357,-5162,32354,-5184,32350,-5206,32347,-5228,32343,-5250,32340,-5272,32336,-5294,32332,-5316,32329,-5338,32325,-5360,32322,-5382,32318,-5404,32314,-5426,32310,-5448,32307,-5470,32303,-5492,32299,-5514,32295,-5536,32292,-5558,32288,-5580,32284,-5602,32280,-5624,32276,-5646,32273,-5668,32269,-5690,32265,-5712,32261,-5734,32257,-5756,32253,-5778,32249,-5800,32245,-5822,32241,-5844,32237,-5866,32233,-5888,32229,-5910,32225,-5932,32221,-5954,32217,-5976,32213,-5998,32209,-6020,32205,-6042,32201,-6064,32196,-6086,32192,-6108,32188,-6130,32184,-6152,32180,-6174,32176,-6196,32171,-6218,32167,-6240,32163,-6262,32158,-6283,32154,-6305,32150,-6327,32146,-6349,32141,-6371,32137,-6393,32133,-6415,32128,-6437,32124,-6459,32119,-6481,32115,-6503,32110,-6524,32106,-6546,32102,-6568,32097,-6590,32093,-6612,32088,-6634,32084,-6656,32079,-6678,32074,-6699,32070,-6721,32065,-6743,32061,-6765,32056,-6787,32051,-6809,32047,-6831,32042,-6852,32037,-6874,32033,-6896,32028,-6918,32023,-6940,32019,-6962,32014,-6983,32009,-7005,32004,-7027,31999,-7049,31995,-7071,31990,-7093,31985,-7114,31980,-7136,31975,-7158,31970,-7180,31965,-7202,31961,-7223,31956,-7245,31951,-7267,31946,-7289,31941,-7311,31936,-7332,31931,-7354,31926,-7376,31921,-7398,31916,-7419,31911,-7441,31905,-7463,31900,-7485,31895,-7506,31890,-7528,31885,-7550,31880,-7572,31875,-7593,31869,-7615,31864,-7637,31859,-7658,31854,-7680,31849,-7702,31843,-7724,31838,-7745,31833,-7767,31827,-7789,31822,-7810,31817,-7832,31811,-7854,31806,-7876,31801,-7897,31795,-7919,31790,-7941,31785,-7962,31779,-7984,31774,-8006,31768,-8027,31763,-8049,31757,-8071,31752,-8092,31746,-8114,31741,-8135,31735,-8157,31729,-8179,31724,-8200,31718,-8222,31713,-8244,31707,-8265,31701,-8287,31696,-8308,31690,-8330,31684,-8352,31679,-8373,31673,-8395,31667,-8416,31662,-8438,31656,-8460,31650,-8481,31644,-8503,31638,-8524,31633,-8546,31627,-8568,31621,-8589,31615,-8611,31609,-8632,31603,-8654,31597,-8675,31591,-8697,31586,-8718,31580,-8740,31574,-8761,31568,-8783,31562,-8804,31556,-8826,31550,-8847,31544,-8869,31537,-8890,31531,-8912,31525,-8933,31519,-8955,31513,-8976,31507,-8998,31501,-9019,31495,-9041,31489,-9062,31482,-9084,31476,-9105,31470,-9127,31464,-9148,31457,-9170,31451,-9191,31445,-9213,31439,-9234,31432,-9255,31426,-9277,31420,-9298,31413,-9320,31407,-9341,31401,-9363,31394,-9384,31388,-9405,31381,-9427,31375,-9448,31369,-9469,31362,-9491,31356,-9512,31349,-9534,31343,-9555,31336,-9576,31330,-9598,31323,-9619,31316,-9640,31310,-9662,31303,-9683,31297,-9704,31290,-9726,31283,-9747,31277,-9768,31270,-9790,31263,-9811,31257,-9832,31250,-9854,31243,-9875,31236,-9896,31230,-9918,31223,-9939,31216,-9960,31209,-9981,31203,-10003,31196,-10024,31189,-10045,31182,-10067,31175,-10088,31168,-10109,31161,-10130,31154,-10152,31148,-10173,31141,-10194,31134,-10215,31127,-10236,31120,-10258,31113,-10279,31106,-10300,31099,-10321,31092,-10343,31085,-10364,31077,-10385,31070,-10406,31063,-10427,31056,-10448,31049,-10470,31042,-10491,31035,-10512,31028,-10533,31020,-10554,31013,-10575,31006,-10597,30999,-10618,30991,-10639,30984,-10660,30977,-10681,30970,-10702,30962,-10723,30955,-10744,30948,-10766,30940,-10787,30933,-10808,30926,-10829,30918,-10850,30911,-10871,30903,-10892,30896,-10913,30889,-10934,30881,-10955,30874,-10976,30866,-10997,30859,-11018,30851,-11039,30844,-11060,30836,-11081,30828,-11102,30821,-11123,30813,-11144,30806,-11165,30798,-11186,30790,-11207,30783,-11228,30775,-11249,30767,-11270,30760,-11291,30752,-11312,30744,-11333,30737,-11354,30729,-11375,30721,-11396,30713,-11417,30705,-11438,30698,-11459,30690,-11480,30682,-11501,30674,-11522,30666,-11543,30658,-11564,30651,-11584,30643,-11605,30635,-11626,30627,-11647,30619,-11668,30611,-11689,30603,-11710,30595,-11731,30587,-11751,30579,-11772,30571,-11793,30563,-11814,30555,-11835,30547,-11856,30539,-11877,30530,-11897,30522,-11918,30514,-11939,30506,-11960,30498,-11981,30490,-12001,30482,-12022,30473,-12043,30465,-12064,30457,-12084,30449,-12105,30440,-12126,30432,-12147,30424,-12167,30416,-12188,30407,-12209,30399,-12230,30391,-12250,30382,-12271,30374,-12292,30365,-12313,30357,-12333,30349,-12354,30340,-12375,30332,-12395,30323,-12416,30315,-12437,30306,-12457,30298,-12478,30289,-12499,30281,-12519,30272,-12540,30264,-12561,30255,-12581,30247,-12602,30238,-12622,30229,-12643,30221,-12664,30212,-12684,30203,-12705,30195,-12725,30186,-12746,30177,-12767,30169,-12787,30160,-12808,30151,-12828,30142,-12849,30134,-12869,30125,-12890,30116,-12910,30107,-12931,30098,-12951,30090,-12972,30081,-12993,30072,-13013,30063,-13034,30054,-13054,30045,-13075,30036,-13095,30027,-13115,30018,-13136,30009,-13156,30001,-13177,29992,-13197,29983,-13218,29973,-13238,29964,-13259,29955,-13279,29946,-13299,29937,-13320,29928,-13340,29919,-13361,29910,-13381,29901,-13401,29892,-13422,29883,-13442,29873,-13463,29864,-13483,29855,-13503,29846,-13524,29837,-13544,29827,-13564,29818,-13585,29809,-13605,29800,-13625,29790,-13646,29781,-13666,29772,-13686,29762,-13707,29753,-13727,29744,-13747,29734,-13767,29725,-13788,29715,-13808,29706,-13828,29696,-13848,29687,-13869,29678,-13889,29668,-13909,29659,-13929,29649,-13950,29640,-13970,29630,-13990,29621,-14010,29611,-14030,29601,-14051,29592,-14071,29582,-14091,29573,-14111,29563,-14131,29553,-14151,29544,-14172,29534,-14192,29524,-14212,29515,-14232,29505,-14252,29495,-14272,29485,-14292,29476,-14312,29466,-14332,29456,-14353,29446,-14373,29437,-14393,29427,-14413,29417,-14433,29407,-14453,29397,-14473,29387,-14493,29377,-14513,29368,-14533,29358,-14553,29348,-14573,29338,-14593,29328,-14613,29318,-14633,29308,-14653,29298,-14673,29288,-14693,29278,-14713,29268,-14733,29258,-14753,29248,-14773,29238,-14793,29227,-14813,29217,-14833,29207,-14853,29197,-14872,29187,-14892,29177,-14912,29167,-14932,29156,-14952,29146,-14972,29136,-14992,29126,-15012,29116,-15031,29105,-15051,29095,-15071,29085,-15091,29074,-15111,29064,-15131,29054,-15150,29044,-15170,29033,-15190,29023,-15210,29012,-15230,29002,-15249,28992,-15269,28981,-15289,28971,-15309,28960,-15328,28950,-15348,28939,-15368,28929,-15388,28918,-15407,28908,-15427,28897,-15447,28887,-15466,28876,-15486,28866,-15506,28855,-15526,28845,-15545,28834,-15565,28823,-15584,28813,-15604,28802,-15624,28791,-15643,28781,-15663,28770,-15683,28759,-15702,28749,-15722,28738,-15741,28727,-15761,28716,-15781,28706,-15800,28695,-15820,28684,-15839,28673,-15859,28662,-15878,28652,-15898,28641,-15918,28630,-15937,28619,-15957,28608,-15976,28597,-15996,28586,-16015,28575,-16035,28565,-16054,28554,-16073,28543,-16093,28532,-16112,28521,-16132,28510,-16151,28499,-16171,28488,-16190,28477,-16210,28465,-16229,28454,-16248,28443,-16268,28432,-16287,28421,-16307,28410,-16326,28399,-16345,28388,-16365,28377,-16384,28365,-16403,28354,-16423,28343,-16442,28332,-16461,28321,-16481,28309,-16500,28298,-16519,28287,-16539,28275,-16558,28264,-16577,28253,-16596,28242,-16616,28230,-16635,28219,-16654,28208,-16673,28196,-16693,28185,-16712,28173,-16731,28162,-16750,28151,-16769,28139,-16789,28128,-16808,28116,-16827,28105,-16846,28093,-16865,28082,-16884,28070,-16904,28059,-16923,28047,-16942,28036,-16961,28024,-16980,28012,-16999,28001,-17018,27989,-17037,27978,-17056,27966,-17075,27954,-17095,27943,-17114,27931,-17133,27919,-17152,27908,-17171,27896,-17190,27884,-17209,27872,-17228,27861,-17247,27849,-17266,27837,-17285,27825,-17304,27814,-17323,27802,-17342,27790,-17361,27778,-17380,27766,-17398,27754,-17417,27742,-17436,27731,-17455,27719,-17474,27707,-17493,27695,-17512,27683,-17531,27671,-17550,27659,-17568,27647,-17587,27635,-17606,27623,-17625,27611,-17644,27599,-17663,27587,-17681,27575,-17700,27563,-17719,27551,-17738,27538,-17757,27526,-17775,27514,-17794,27502,-17813,27490,-17832,27478,-17850,27466,-17869,27453,-17888,27441,-17907,27429,-17925,27417,-17944,27405,-17963,27392,-17981,27380,-18000,27368,-18019,27355,-18037,27343,-18056,27331,-18075,27319,-18093,27306,-18112,27294,-18131,27281,-18149,27269,-18168,27257,-18186,27244,-18205,27232,-18223,27219,-18242,27207,-18261,27195,-18279,27182,-18298,27170,-18316,27157,-18335,27145,-18353,27132,-18372,27120,-18390,27107,-18409,27094,-18427,27082,-18446,27069,-18464,27057,-18483,27044,-18501,27031,-18519,27019,-18538,27006,-18556,26994,-18575,26981,-18593,26968,-18611,26955,-18630,26943,-18648,26930,-18667,26917,-18685,26905,-18703,26892,-18722,26879,-18740,26866,-18758,26853,-18777,26841,-18795,26828,-18813,26815,-18831,26802,-18850,26789,-18868,26776,-18886,26764,-18905,26751,-18923,26738,-18941,26725,-18959,26712,-18977,26699,-18996,26686,-19014,26673,-19032,26660,-19050,26647,-19068,26634,-19087,26621,-19105,26608,-19123,26595,-19141,26582,-19159,26569,-19177,26556,-19195,26543,-19213,26530,-19232,26516,-19250,26503,-19268,26490,-19286,26477,-19304,26464,-19322,26451,-19340,26437,-19358,26424,-19376,26411,-19394,26398,-19412,26385,-19430,26371,-19448,26358,-19466,26345,-19484,26332,-19502,26318,-19520,26305,-19538,26292,-19556,26278,-19574,26265,-19591,26252,-19609,26238,-19627,26225,-19645,26211,-19663,26198,-19681,26185,-19699,26171,-19717,26158,-19734,26144,-19752,26131,-19770,26117,-19788,26104,-19806,26090,-19823,26077,-19841,26063,-19859,26050,-19877,26036,-19895,26022,-19912,26009,-19930,25995,-19948,25982,-19966,25968,-19983,25954,-20001,25941,-20019,25927,-20036,25913,-20054,25900,-20072,25886,-20089,25872,-20107,25859,-20125,25845,-20142,25831,-20160,25817,-20177,25804,-20195,25790,-20213,25776,-20230,25762,-20248,25749,-20265,25735,-20283,25721,-20300,25707,-20318,25693,-20335,25679,-20353,25665,-20370,25652,-20388,25638,-20405,25624,-20423,25610,-20440,25596,-20458,25582,-20475,25568,-20493,25554,-20510,25540,-20528,25526,-20545,25512,-20562,25498,-20580,25484,-20597,25470,-20614,25456,-20632,25442,-20649,25428,-20667,25414,-20684,25399,-20701,25385,-20719,25371,-20736,25357,-20753,25343,-20770,25329,-20788,25315,-20805,25300,-20822,25286,-20839,25272,-20857,25258,-20874,25243,-20891,25229,-20908,25215,-20926,25201,-20943,25186,-20960,25172,-20977,25158,-20994,25144,-21011,25129,-21028,25115,-21046,25100,-21063,25086,-21080,25072,-21097,25057,-21114,25043,-21131,25029,-21148,25014,-21165,25000,-21182,24985,-21199,24971,-21216,24956,-21233,24942,-21250,24927,-21267,24913,-21284,24898,-21301,24884,-21318,24869,-21335,24855,-21352,24840,-21369,24826,-21386,24811,-21403,24796,-21420,24782,-21437,24767,-21454,24753,-21471,24738,-21487,24723,-21504,24709,-21521,24694,-21538,24679,-21555,24664,-21572,24650,-21588,24635,-21605,24620,-21622,24606,-21639,24591,-21656,24576,-21672,24561,-21689,24546,-21706,24532,-21723,24517,-21739,24502,-21756,24487,-21773,24472,-21789,24457,-21806,24443,-21823,24428,-21839,24413,-21856,24398,-21873,24383,-21889,24368,-21906,24353,-21923,24338,-21939,24323,-21956,24308,-21972,24293,-21989,24278,-22005,24263,-22022,24248,-22039,24233,-22055,24218,-22072,24203,-22088,24188,-22105,24173,-22121,24158,-22138,24143,-22154,24128,-22170,24113,-22187,24097,-22203,24082,-22220,24067,-22236,24052,-22253,24037,-22269,24022,-22285,24006,-22302,23991,-22318,23976,-22334,23961,-22351,23945,-22367,23930,-22383,23915,-22400,23900,-22416,23884,-22432,23869,-22449,23854,-22465,23838,-22481,23823,-22497,23808,-22514,23792,-22530,23777,-22546,23762,-22562,23746,-22578,23731,-22595,23715,-22611,23700,-22627,23685,-22643,23669,-22659,23654,-22675,23638,-22692,23623,-22708,23607,-22724,23592,-22740,23576,-22756,23561,-22772,23545,-22788,23530,-22804,23514,-22820,23499,-22836,23483,-22852,23467,-22868,23452,-22884,23436,-22900,23421,-22916,23405,-22932,23389,-22948,23374,-22964,23358,-22980,23342,-22996,23327,-23012,23311,-23028,23295,-23044,23280,-23059,23264,-23075,23248,-23091,23232,-23107,23217,-23123,23201,-23139,23185,-23154,23169,-23170,23153,-23186,23138,-23202,23122,-23218,23106,-23233,23090,-23249,23074,-23265,23058,-23281,23043,-23296,23027,-23312,23011,-23328,22995,-23343,22979,-23359,22963,-23375,22947,-23390,22931,-23406,22915,-23422,22899,-23437,22883,-23453,22867,-23468,22851,-23484,22835,-23500,22819,-23515,22803,-23531,22787,-23546,22771,-23562,22755,-23577,22739,-23593,22723,-23608,22707,-23624,22691,-23639,22674,-23655,22658,-23670,22642,-23686,22626,-23701,22610,-23716,22594,-23732,22577,-23747,22561,-23763,22545,-23778,22529,-23793,22513,-23809,22496,-23824,22480,-23839,22464,-23855,22448,-23870,22431,-23885,22415,-23901,22399,-23916,22382,-23931,22366,-23946,22350,-23962,22333,-23977,22317,-23992,22301,-24007,22284,-24023,22268,-24038,22252,-24053,22235,-24068,22219,-24083,22202,-24098,22186,-24114,22169,-24129,22153,-24144,22137,-24159,22120,-24174,22104,-24189,22087,-24204,22071,-24219,22054,-24234,22038,-24249,22021,-24264,22004,-24279,21988,-24294,21971,-24309,21955,-24324,21938,-24339,21922,-24354,21905,-24369,21888,-24384,21872,-24399,21855,-24414,21838,-24429,21822,-24444,21805,-24458,21788,-24473,21772,-24488,21755,-24503,21738,-24518,21722,-24533,21705,-24547,21688,-24562,21671,-24577,21655,-24592,21638,-24607,21621,-24621,21604,-24636,21587,-24651,21571,-24665,21554,-24680,21537,-24695,21520,-24710,21503,-24724,21486,-24739,21470,-24754,21453,-24768,21436,-24783,21419,-24797,21402,-24812,21385,-24827,21368,-24841,21351,-24856,21334,-24870,21317,-24885,21300,-24899,21283,-24914,21266,-24928,21249,-24943,21232,-24957,21215,-24972,21198,-24986,21181,-25001,21164,-25015,21147,-25030,21130,-25044,21113,-25058,21096,-25073,21079,-25087,21062,-25101,21045,-25116,21027,-25130,21010,-25145,20993,-25159,20976,-25173,20959,-25187,20942,-25202,20925,-25216,20907,-25230,20890,-25244,20873,-25259,20856,-25273,20838,-25287,20821,-25301,20804,-25316,20787,-25330,20769,-25344,20752,-25358,20735,-25372,20718,-25386,20700,-25400,20683,-25415,20666,-25429,20648,-25443,20631,-25457,20613,-25471,20596,-25485,20579,-25499,20561,-25513,20544,-25527,20527,-25541,20509,-25555,20492,-25569,20474,-25583,20457,-25597,20439,-25611,20422,-25625,20404,-25639,20387,-25653,20369,-25666,20352,-25680,20334,-25694,20317,-25708,20299,-25722,20282,-25736,20264,-25750,20247,-25763,20229,-25777,20212,-25791,20194,-25805,20176,-25818,20159,-25832,20141,-25846,20124,-25860,20106,-25873,20088,-25887,20071,-25901,20053,-25914,20035,-25928,20018,-25942,20000,-25955,19982,-25969,19965,-25983,19947,-25996,19929,-26010,19911,-26023,19894,-26037,19876,-26051,19858,-26064,19840,-26078,19822,-26091,19805,-26105,19787,-26118,19769,-26132,19751,-26145,19733,-26159,19716,-26172,19698,-26186,19680,-26199,19662,-26212,19644,-26226,19626,-26239,19608,-26253,19590,-26266,19573,-26279,19555,-26293,19537,-26306,19519,-26319,19501,-26333,19483,-26346,19465,-26359,19447,-26372,19429,-26386,19411,-26399,19393,-26412,19375,-26425,19357,-26438,19339,-26452,19321,-26465,19303,-26478,19285,-26491,19267,-26504,19249,-26517,19231,-26531,19212,-26544,19194,-26557,19176,-26570,19158,-26583,19140,-26596,19122,-26609,19104,-26622,19086,-26635,19067,-26648,19049,-26661,19031,-26674,19013,-26687,18995,-26700,18976,-26713,18958,-26726,18940,-26739,18922,-26752,18904,-26765,18885,-26777,18867,-26790,18849,-26803,18830,-26816,18812,-26829,18794,-26842,18776,-26854,18757,-26867,18739,-26880,18721,-26893,18702,-26906,18684,-26918,18666,-26931,18647,-26944,18629,-26956,18610,-26969,18592,-26982,18574,-26995,18555,-27007,18537,-27020,18518,-27032,18500,-27045,18482,-27058,18463,-27070,18445,-27083,18426,-27095,18408,-27108,18389,-27121,18371,-27133,18352,-27146,18334,-27158,18315,-27171,18297,-27183,18278,-27196,18260,-27208,18241,-27220,18222,-27233,18204,-27245,18185,-27258,18167,-27270,18148,-27282,18130,-27295,18111,-27307,18092,-27320,18074,-27332,18055,-27344,18036,-27356,18018,-27369,17999,-27381,17980,-27393,17962,-27406,17943,-27418,17924,-27430,17906,-27442,17887,-27454,17868,-27467,17849,-27479,17831,-27491,17812,-27503,17793,-27515,17774,-27527,17756,-27539,17737,-27552,17718,-27564,17699,-27576,17680,-27588,17662,-27600,17643,-27612,17624,-27624,17605,-27636,17586,-27648,17567,-27660,17549,-27672,17530,-27684,17511,-27696,17492,-27708,17473,-27720,17454,-27732,17435,-27743,17416,-27755,17397,-27767,17379,-27779,17360,-27791,17341,-27803,17322,-27815,17303,-27826,17284,-27838,17265,-27850,17246,-27862,17227,-27873,17208,-27885,17189,-27897,17170,-27909,17151,-27920,17132,-27932,17113,-27944,17094,-27955,17074,-27967,17055,-27979,17036,-27990,17017,-28002,16998,-28013,16979,-28025,16960,-28037,16941,-28048,16922,-28060,16903,-28071,16883,-28083,16864,-28094,16845,-28106,16826,-28117,16807,-28129,16788,-28140,16768,-28152,16749,-28163,16730,-28174,16711,-28186,16692,-28197,16672,-28209,16653,-28220,16634,-28231,16615,-28243,16595,-28254,16576,-28265,16557,-28276,16538,-28288,16518,-28299,16499,-28310,16480,-28322,16460,-28333,16441,-28344,16422,-28355,16402,-28366,16383,-28378,16364,-28389,16344,-28400,16325,-28411,16306,-28422,16286,-28433,16267,-28444,16247,-28455,16228,-28466,16209,-28478,16189,-28489,16170,-28500,16150,-28511,16131,-28522,16111,-28533,16092,-28544,16072,-28555,16053,-28566,16034,-28576,16014,-28587,15995,-28598,15975,-28609,15956,-28620,15936,-28631,15917,-28642,15897,-28653,15877,-28663,15858,-28674,15838,-28685,15819,-28696,15799,-28707,15780,-28717,15760,-28728,15740,-28739,15721,-28750,15701,-28760,15682,-28771,15662,-28782,15642,-28792,15623,-28803,15603,-28814,15583,-28824,15564,-28835,15544,-28846,15525,-28856,15505,-28867,15485,-28877,15465,-28888,15446,-28898,15426,-28909,15406,-28919,15387,-28930,15367,-28940,15347,-28951,15327,-28961,15308,-28972,15288,-28982,15268,-28993,15248,-29003,15229,-29013,15209,-29024,15189,-29034,15169,-29045,15149,-29055,15130,-29065,15110,-29075,15090,-29086,15070,-29096,15050,-29106,15030,-29117,15011,-29127,14991,-29137,14971,-29147,14951,-29157,14931,-29168,14911,-29178,14891,-29188,14871,-29198,14852,-29208,14832,-29218,14812,-29228,14792,-29239,14772,-29249,14752,-29259,14732,-29269,14712,-29279,14692,-29289,14672,-29299,14652,-29309,14632,-29319,14612,-29329,14592,-29339,14572,-29349,14552,-29359,14532,-29369,14512,-29378,14492,-29388,14472,-29398,14452,-29408,14432,-29418,14412,-29428,14392,-29438,14372,-29447,14352,-29457,14331,-29467,14311,-29477,14291,-29486,14271,-29496,14251,-29506,14231,-29516,14211,-29525,14191,-29535,14171,-29545,14150,-29554,14130,-29564,14110,-29574,14090,-29583,14070,-29593,14050,-29602,14029,-29612,14009,-29622,13989,-29631,13969,-29641,13949,-29650,13928,-29660,13908,-29669,13888,-29679,13868,-29688,13847,-29697,13827,-29707,13807,-29716,13787,-29726,13766,-29735,13746,-29745,13726,-29754,13706,-29763,13685,-29773,13665,-29782,13645,-29791,13624,-29801,13604,-29810,13584,-29819,13563,-29828,13543,-29838,13523,-29847,13502,-29856,13482,-29865,13462,-29874,13441,-29884,13421,-29893,13400,-29902,13380,-29911,13360,-29920,13339,-29929,13319,-29938,13298,-29947,13278,-29956,13258,-29965,13237,-29974,13217,-29984,13196,-29993,13176,-30002,13155,-30010,13135,-30019,13114,-30028,13094,-30037,13074,-30046,13053,-30055,13033,-30064,13012,-30073,12992,-30082,12971,-30091,12950,-30099,12930,-30108,12909,-30117,12889,-30126,12868,-30135,12848,-30143,12827,-30152,12807,-30161,12786,-30170,12766,-30178,12745,-30187,12724,-30196,12704,-30204,12683,-30213,12663,-30222,12642,-30230,12621,-30239,12601,-30248,12580,-30256,12560,-30265,12539,-30273,12518,-30282,12498,-30290,12477,-30299,12456,-30307,12436,-30316,12415,-30324,12394,-30333,12374,-30341,12353,-30350,12332,-30358,12312,-30366,12291,-30375,12270,-30383,12249,-30392,12229,-30400,12208,-30408,12187,-30417,12166,-30425,12146,-30433,12125,-30441,12104,-30450,12083,-30458,12063,-30466,12042,-30474,12021,-30483,12000,-30491,11980,-30499,11959,-30507,11938,-30515,11917,-30523,11896,-30531,11876,-30540,11855,-30548,11834,-30556,11813,-30564,11792,-30572,11771,-30580,11750,-30588,11730,-30596,11709,-30604,11688,-30612,11667,-30620,11646,-30628,11625,-30636,11604,-30644,11583,-30652,11563,-30659,11542,-30667,11521,-30675,11500,-30683,11479,-30691,11458,-30699,11437,-30706,11416,-30714,11395,-30722,11374,-30730,11353,-30738,11332,-30745,11311,-30753,11290,-30761,11269,-30768,11248,-30776,11227,-30784,11206,-30791,11185,-30799,11164,-30807,11143,-30814,11122,-30822,11101,-30829,11080,-30837,11059,-30845,11038,-30852,11017,-30860,10996,-30867,10975,-30875,10954,-30882,10933,-30890,10912,-30897,10891,-30904,10870,-30912,10849,-30919,10828,-30927,10807,-30934,10786,-30941,10765,-30949,10743,-30956,10722,-30963,10701,-30971,10680,-30978,10659,-30985,10638,-30992,10617,-31000,10596,-31007,10574,-31014,10553,-31021,10532,-31029,10511,-31036,10490,-31043,10469,-31050,10447,-31057,10426,-31064,10405,-31071,10384,-31078,10363,-31086,10342,-31093,10320,-31100,10299,-31107,10278,-31114,10257,-31121,10235,-31128,10214,-31135,10193,-31142,10172,-31149,10151,-31155,10129,-31162,10108,-31169,10087,-31176,10066,-31183,10044,-31190,10023,-31197,10002,-31204,9980,-31210,9959,-31217,9938,-31224,9917,-31231,9895,-31237,9874,-31244,9853,-31251,9831,-31258,9810,-31264,9789,-31271,9767,-31278,9746,-31284,9725,-31291,9703,-31298,9682,-31304,9661,-31311,9639,-31317,9618,-31324,9597,-31331,9575,-31337,9554,-31344,9533,-31350,9511,-31357,9490,-31363,9468,-31370,9447,-31376,9426,-31382,9404,-31389,9383,-31395,9362,-31402,9340,-31408,9319,-31414,9297,-31421,9276,-31427,9254,-31433,9233,-31440,9212,-31446,9190,-31452,9169,-31458,9147,-31465,9126,-31471,9104,-31477,9083,-31483,9061,-31490,9040,-31496,9018,-31502,8997,-31508,8975,-31514,8954,-31520,8932,-31526,8911,-31532,8889,-31538,8868,-31545,8846,-31551,8825,-31557,8803,-31563,8782,-31569,8760,-31575,8739,-31581,8717,-31587,8696,-31592,8674,-31598,8653,-31604,8631,-31610,8610,-31616,8588,-31622,8567,-31628,8545,-31634,8523,-31639,8502,-31645,8480,-31651,8459,-31657,8437,-31663,8415,-31668,8394,-31674,8372,-31680,8351,-31685,8329,-31691,8307,-31697,8286,-31702,8264,-31708,8243,-31714,8221,-31719,8199,-31725,8178,-31730,8156,-31736,8134,-31742,8113,-31747,8091,-31753,8070,-31758,8048,-31764,8026,-31769,8005,-31775,7983,-31780,7961,-31786,7940,-31791,7918,-31796,7896,-31802,7875,-31807,7853,-31812,7831,-31818,7809,-31823,7788,-31828,7766,-31834,7744,-31839,7723,-31844,7701,-31850,7679,-31855,7657,-31860,7636,-31865,7614,-31870,7592,-31876,7571,-31881,7549,-31886,7527,-31891,7505,-31896,7484,-31901,7462,-31906,7440,-31912,7418,-31917,7397,-31922,7375,-31927,7353,-31932,7331,-31937,7310,-31942,7288,-31947,7266,-31952,7244,-31957,7222,-31962,7201,-31966,7179,-31971,7157,-31976,7135,-31981,7113,-31986,7092,-31991,7070,-31996,7048,-32000,7026,-32005,7004,-32010,6982,-32015,6961,-32020,6939,-32024,6917,-32029,6895,-32034,6873,-32038,6851,-32043,6830,-32048,6808,-32052,6786,-32057,6764,-32062,6742,-32066,6720,-32071,6698,-32075,6677,-32080,6655,-32085,6633,-32089,6611,-32094,6589,-32098,6567,-32103,6545,-32107,6523,-32111,6502,-32116,6480,-32120,6458,-32125,6436,-32129,6414,-32134,6392,-32138,6370,-32142,6348,-32147,6326,-32151,6304,-32155,6282,-32159,6261,-32164,6239,-32168,6217,-32172,6195,-32177,6173,-32181,6151,-32185,6129,-32189,6107,-32193,6085,-32197,6063,-32202,6041,-32206,6019,-32210,5997,-32214,5975,-32218,5953,-32222,5931,-32226,5909,-32230,5887,-32234,5865,-32238,5843,-32242,5821,-32246,5799,-32250,5777,-32254,5755,-32258,5733,-32262,5711,-32266,5689,-32270,5667,-32274,5645,-32277,5623,-32281,5601,-32285,5579,-32289,5557,-32293,5535,-32296,5513,-32300,5491,-32304,5469,-32308,5447,-32311,5425,-32315,5403,-32319,5381,-32323,5359,-32326,5337,-32330,5315,-32333,5293,-32337,5271,-32341,5249,-32344,5227,-32348,5205,-32351,5183,-32355,5161,-32358,5139,-32362,5117,-32365,5094,-32369,5072,-32372,5050,-32376,5028,-32379,5006,-32383,4984,-32386,4962,-32390,4940,-32393,4918,-32396,4896,-32400,4874,-32403,4852,-32406,4830,-32410,4807,-32413,4785,-32416,4763,-32419,4741,-32423,4719,-32426,4697,-32429,4675,-32432,4653,-32435,4631,-32439,4608,-32442,4586,-32445,4564,-32448,4542,-32451,4520,-32454,4498,-32457,4476,-32460,4454,-32463,4431,-32466,4409,-32469,4387,-32472,4365,-32475,4343,-32478,4321,-32481,4299,-32484,4276,-32487,4254,-32490,4232,-32493,4210,-32496,4188,-32499,4166,-32502,4144,-32504,4121,-32507,4099,-32510,4077,-32513,4055,-32516,4033,-32518,4011,-32521,3988,-32524,3966,-32527,3944,-32529,3922,-32532,3900,-32535,3877,-32537,3855,-32540,3833,-32542,3811,-32545,3789,-32548,3767,-32550,3744,-32553,3722,-32555,3700,-32558,3678,-32560,3656,-32563,3633,-32565,3611,-32568,3589,-32570,3567,-32573,3545,-32575,3522,-32578,3500,-32580,3478,-32582,3456,-32585,3433,-32587,3411,-32589,3389,-32592,3367,-32594,3345,-32596,3322,-32599,3300,-32601,3278,-32603,3256,-32605,3233,-32608,3211,-32610,3189,-32612,3167,-32614,3145,-32616,3122,-32618,3100,-32620,3078,-32623,3056,-32625,3033,-32627,3011,-32629,2989,-32631,2967,-32633,2944,-32635,2922,-32637,2900,-32639,2878,-32641,2855,-32643,2833,-32645,2811,-32647,2789,-32649,2766,-32650,2744,-32652,2722,-32654,2700,-32656,2677,-32658,2655,-32660,2633,-32662,2610,-32663,2588,-32665,2566,-32667,2544,-32669,2521,-32670,2499,-32672,2477,-32674,2455,-32675,2432,-32677,2410,-32679,2388,-32680,2365,-32682,2343,-32684,2321,-32685,2299,-32687,2276,-32688,2254,-32690,2232,-32691,2209,-32693,2187,-32694,2165,-32696,2143,-32697,2120,-32699,2098,-32700,2076,-32702,2053,-32703,2031,-32704,2009,-32706,1986,-32707,1964,-32709,1942,-32710,1920,-32711,1897,-32712,1875,-32714,1853,-32715,1830,-32716,1808,-32718,1786,-32719,1763,-32720,1741,-32721,1719,-32722,1697,-32724,1674,-32725,1652,-32726,1630,-32727,1607,-32728,1585,-32729,1563,-32730,1540,-32731,1518,-32732,1496,-32733,1473,-32734,1451,-32735,1429,-32736,1406,-32737,1384,-32738,1362,-32739,1339,-32740,1317,-32741,1295,-32742,1273,-32743,1250,-32744,1228,-32744,1206,-32745,1183,-32746,1161,-32747,1139,-32748,1116,-32748,1094,-32749,1072,-32750,1049,-32751,1027,-32751,1005,-32752,982,-32753,960,-32753,938,-32754,915,-32755,893,-32755,871,-32756,848,-32757,826,-32757,804,-32758,781,-32758,759,-32759,737,-32759,714,-32760,692,-32760,670,-32761,647,-32761,625,-32762,603,-32762,580,-32762,558,-32763,536,-32763,513,-32763,491,-32764,469,-32764,446,-32764,424,-32765,402,-32765,379,-32765,357,-32766,335,-32766,312,-32766,290,-32766,268,-32766,245,-32767,223,-32767,201,-32767,178,-32767,156,-32767,134,-32767,111,-32767,89,-32767,67,-32767,44,-32767,22,-32767,0,-32767,-23,-32767,-45,-32767,-68,-32767,-90,-32767,-112,-32767,-135,-32767,-157,-32767,-179,-32767,-202,-32767,-224,-32767,-246,-32767,-269,-32766,-291,-32766,-313,-32766,-336,-32766,-358,-32766,-380,-32765,-403,-32765,-425,-32765,-447,-32764,-470,-32764,-492,-32764,-514,-32763,-537,-32763,-559,-32763,-581,-32762,-604,-32762,-626,-32762,-648,-32761,-671,-32761,-693,-32760,-715,-32760,-738,-32759,-760,-32759,-782,-32758,-805,-32758,-827,-32757,-849,-32757,-872,-32756,-894,-32755,-916,-32755,-939,-32754,-961,-32753,-983,-32753,-1006,-32752,-1028,-32751,-1050,-32751,-1073,-32750,-1095,-32749,-1117,-32748,-1140,-32748,-1162,-32747,-1184,-32746,-1207,-32745,-1229,-32744,-1251,-32744,-1274,-32743,-1296,-32742,-1318,-32741,-1340,-32740,-1363,-32739,-1385,-32738,-1407,-32737,-1430,-32736,-1452,-32735,-1474,-32734,-1497,-32733,-1519,-32732,-1541,-32731,-1564,-32730,-1586,-32729,-1608,-32728,-1631,-32727,-1653,-32726,-1675,-32725,-1698,-32724,-1720,-32722,-1742,-32721,-1764,-32720,-1787,-32719,-1809,-32718,-1831,-32716,-1854,-32715,-1876,-32714,-1898,-32712,-1921,-32711,-1943,-32710,-1965,-32709,-1987,-32707,-2010,-32706,-2032,-32704,-2054,-32703,-2077,-32702,-2099,-32700,-2121,-32699,-2144,-32697,-2166,-32696,-2188,-32694,-2210,-32693,-2233,-32691,-2255,-32690,-2277,-32688,-2300,-32687,-2322,-32685,-2344,-32684,-2366,-32682,-2389,-32680,-2411,-32679,-2433,-32677,-2456,-32675,-2478,-32674,-2500,-32672,-2522,-32670,-2545,-32669,-2567,-32667,-2589,-32665,-2611,-32663,-2634,-32662,-2656,-32660,-2678,-32658,-2701,-32656,-2723,-32654,-2745,-32652,-2767,-32650,-2790,-32649,-2812,-32647,-2834,-32645,-2856,-32643,-2879,-32641,-2901,-32639,-2923,-32637,-2945,-32635,-2968,-32633,-2990,-32631,-3012,-32629,-3034,-32627,-3057,-32625,-3079,-32623,-3101,-32620,-3123,-32618,-3146,-32616,-3168,-32614,-3190,-32612,-3212,-32610,-3234,-32608,-3257,-32605,-3279,-32603,-3301,-32601,-3323,-32599,-3346,-32596,-3368,-32594,-3390,-32592,-3412,-32589,-3434,-32587,-3457,-32585,-3479,-32582,-3501,-32580,-3523,-32578,-3546,-32575,-3568,-32573,-3590,-32570,-3612,-32568,-3634,-32565,-3657,-32563,-3679,-32560,-3701,-32558,-3723,-32555,-3745,-32553,-3768,-32550,-3790,-32548,-3812,-32545,-3834,-32542,-3856,-32540,-3878,-32537,-3901,-32535,-3923,-32532,-3945,-32529,-3967,-32527,-3989,-32524,-4012,-32521,-4034,-32518,-4056,-32516,-4078,-32513,-4100,-32510,-4122,-32507,-4145,-32504,-4167,-32502,-4189,-32499,-4211,-32496,-4233,-32493,-4255,-32490,-4277,-32487,-4300,-32484,-4322,-32481,-4344,-32478,-4366,-32475,-4388,-32472,-4410,-32469,-4432,-32466,-4455,-32463,-4477,-32460,-4499,-32457,-4521,-32454,-4543,-32451,-4565,-32448,-4587,-32445,-4609,-32442,-4632,-32439,-4654,-32435,-4676,-32432,-4698,-32429,-4720,-32426,-4742,-32423,-4764,-32419,-4786,-32416,-4808,-32413,-4831,-32410,-4853,-32406,-4875,-32403,-4897,-32400,-4919,-32396,-4941,-32393,-4963,-32390,-4985,-32386,-5007,-32383,-5029,-32379,-5051,-32376,-5073,-32372,-5095,-32369,-5118,-32365,-5140,-32362,-5162,-32358,-5184,-32355,-5206,-32351,-5228,-32348,-5250,-32344,-5272,-32341,-5294,-32337,-5316,-32333,-5338,-32330,-5360,-32326,-5382,-32323,-5404,-32319,-5426,-32315,-5448,-32311,-5470,-32308,-5492,-32304,-5514,-32300,-5536,-32296,-5558,-32293,-5580,-32289,-5602,-32285,-5624,-32281,-5646,-32277,-5668,-32274,-5690,-32270,-5712,-32266,-5734,-32262,-5756,-32258,-5778,-32254,-5800,-32250,-5822,-32246,-5844,-32242,-5866,-32238,-5888,-32234,-5910,-32230,-5932,-32226,-5954,-32222,-5976,-32218,-5998,-32214,-6020,-32210,-6042,-32206,-6064,-32202,-6086,-32197,-6108,-32193,-6130,-32189,-6152,-32185,-6174,-32181,-6196,-32177,-6218,-32172,-6240,-32168,-6262,-32164,-6283,-32159,-6305,-32155,-6327,-32151,-6349,-32147,-6371,-32142,-6393,-32138,-6415,-32134,-6437,-32129,-6459,-32125,-6481,-32120,-6503,-32116,-6524,-32111,-6546,-32107,-6568,-32103,-6590,-32098,-6612,-32094,-6634,-32089,-6656,-32085,-6678,-32080,-6699,-32075,-6721,-32071,-6743,-32066,-6765,-32062,-6787,-32057,-6809,-32052,-6831,-32048,-6852,-32043,-6874,-32038,-6896,-32034,-6918,-32029,-6940,-32024,-6962,-32020,-6983,-32015,-7005,-32010,-7027,-32005,-7049,-32000,-7071,-31996,-7093,-31991,-7114,-31986,-7136,-31981,-7158,-31976,-7180,-31971,-7202,-31966,-7223,-31962,-7245,-31957,-7267,-31952,-7289,-31947,-7311,-31942,-7332,-31937,-7354,-31932,-7376,-31927,-7398,-31922,-7419,-31917,-7441,-31912,-7463,-31906,-7485,-31901,-7506,-31896,-7528,-31891,-7550,-31886,-7572,-31881,-7593,-31876,-7615,-31870,-7637,-31865,-7658,-31860,-7680,-31855,-7702,-31850,-7724,-31844,-7745,-31839,-7767,-31834,-7789,-31828,-7810,-31823,-7832,-31818,-7854,-31812,-7876,-31807,-7897,-31802,-7919,-31796,-7941,-31791,-7962,-31786,-7984,-31780,-8006,-31775,-8027,-31769,-8049,-31764,-8071,-31758,-8092,-31753,-8114,-31747,-8135,-31742,-8157,-31736,-8179,-31730,-8200,-31725,-8222,-31719,-8244,-31714,-8265,-31708,-8287,-31702,-8308,-31697,-8330,-31691,-8352,-31685,-8373,-31680,-8395,-31674,-8416,-31668,-8438,-31663,-8460,-31657,-8481,-31651,-8503,-31645,-8524,-31639,-8546,-31634,-8568,-31628,-8589,-31622,-8611,-31616,-8632,-31610,-8654,-31604,-8675,-31598,-8697,-31592,-8718,-31587,-8740,-31581,-8761,-31575,-8783,-31569,-8804,-31563,-8826,-31557,-8847,-31551,-8869,-31545,-8890,-31538,-8912,-31532,-8933,-31526,-8955,-31520,-8976,-31514,-8998,-31508,-9019,-31502,-9041,-31496,-9062,-31490,-9084,-31483,-9105,-31477,-9127,-31471,-9148,-31465,-9170,-31458,-9191,-31452,-9213,-31446,-9234,-31440,-9255,-31433,-9277,-31427,-9298,-31421,-9320,-31414,-9341,-31408,-9363,-31402,-9384,-31395,-9405,-31389,-9427,-31382,-9448,-31376,-9469,-31370,-9491,-31363,-9512,-31357,-9534,-31350,-9555,-31344,-9576,-31337,-9598,-31331,-9619,-31324,-9640,-31317,-9662,-31311,-9683,-31304,-9704,-31298,-9726,-31291,-9747,-31284,-9768,-31278,-9790,-31271,-9811,-31264,-9832,-31258,-9854,-31251,-9875,-31244,-9896,-31237,-9918,-31231,-9939,-31224,-9960,-31217,-9981,-31210,-10003,-31204,-10024,-31197,-10045,-31190,-10067,-31183,-10088,-31176,-10109,-31169,-10130,-31162,-10152,-31155,-10173,-31149,-10194,-31142,-10215,-31135,-10236,-31128,-10258,-31121,-10279,-31114,-10300,-31107,-10321,-31100,-10343,-31093,-10364,-31086,-10385,-31078,-10406,-31071,-10427,-31064,-10448,-31057,-10470,-31050,-10491,-31043,-10512,-31036,-10533,-31029,-10554,-31021,-10575,-31014,-10597,-31007,-10618,-31000,-10639,-30992,-10660,-30985,-10681,-30978,-10702,-30971,-10723,-30963,-10744,-30956,-10766,-30949,-10787,-30941,-10808,-30934,-10829,-30927,-10850,-30919,-10871,-30912,-10892,-30904,-10913,-30897,-10934,-30890,-10955,-30882,-10976,-30875,-10997,-30867,-11018,-30860,-11039,-30852,-11060,-30845,-11081,-30837,-11102,-30829,-11123,-30822,-11144,-30814,-11165,-30807,-11186,-30799,-11207,-30791,-11228,-30784,-11249,-30776,-11270,-30768,-11291,-30761,-11312,-30753,-11333,-30745,-11354,-30738,-11375,-30730,-11396,-30722,-11417,-30714,-11438,-30706,-11459,-30699,-11480,-30691,-11501,-30683,-11522,-30675,-11543,-30667,-11564,-30659,-11584,-30652,-11605,-30644,-11626,-30636,-11647,-30628,-11668,-30620,-11689,-30612,-11710,-30604,-11731,-30596,-11751,-30588,-11772,-30580,-11793,-30572,-11814,-30564,-11835,-30556,-11856,-30548,-11877,-30540,-11897,-30531,-11918,-30523,-11939,-30515,-11960,-30507,-11981,-30499,-12001,-30491,-12022,-30483,-12043,-30474,-12064,-30466,-12084,-30458,-12105,-30450,-12126,-30441,-12147,-30433,-12167,-30425,-12188,-30417,-12209,-30408,-12230,-30400,-12250,-30392,-12271,-30383,-12292,-30375,-12313,-30366,-12333,-30358,-12354,-30350,-12375,-30341,-12395,-30333,-12416,-30324,-12437,-30316,-12457,-30307,-12478,-30299,-12499,-30290,-12519,-30282,-12540,-30273,-12561,-30265,-12581,-30256,-12602,-30248,-12622,-30239,-12643,-30230,-12664,-30222,-12684,-30213,-12705,-30204,-12725,-30196,-12746,-30187,-12767,-30178,-12787,-30170,-12808,-30161,-12828,-30152,-12849,-30143,-12869,-30135,-12890,-30126,-12910,-30117,-12931,-30108,-12951,-30099,-12972,-30091,-12993,-30082,-13013,-30073,-13034,-30064,-13054,-30055,-13075,-30046,-13095,-30037,-13115,-30028,-13136,-30019,-13156,-30010,-13177,-30002,-13197,-29993,-13218,-29984,-13238,-29974,-13259,-29965,-13279,-29956,-13299,-29947,-13320,-29938,-13340,-29929,-13361,-29920,-13381,-29911,-13401,-29902,-13422,-29893,-13442,-29884,-13463,-29874,-13483,-29865,-13503,-29856,-13524,-29847,-13544,-29838,-13564,-29828,-13585,-29819,-13605,-29810,-13625,-29801,-13646,-29791,-13666,-29782,-13686,-29773,-13707,-29763,-13727,-29754,-13747,-29745,-13767,-29735,-13788,-29726,-13808,-29716,-13828,-29707,-13848,-29697,-13869,-29688,-13889,-29679,-13909,-29669,-13929,-29660,-13950,-29650,-13970,-29641,-13990,-29631,-14010,-29622,-14030,-29612,-14051,-29602,-14071,-29593,-14091,-29583,-14111,-29574,-14131,-29564,-14151,-29554,-14172,-29545,-14192,-29535,-14212,-29525,-14232,-29516,-14252,-29506,-14272,-29496,-14292,-29486,-14312,-29477,-14332,-29467,-14353,-29457,-14373,-29447,-14393,-29438,-14413,-29428,-14433,-29418,-14453,-29408,-14473,-29398,-14493,-29388,-14513,-29378,-14533,-29369,-14553,-29359,-14573,-29349,-14593,-29339,-14613,-29329,-14633,-29319,-14653,-29309,-14673,-29299,-14693,-29289,-14713,-29279,-14733,-29269,-14753,-29259,-14773,-29249,-14793,-29239,-14813,-29228,-14833,-29218,-14853,-29208,-14872,-29198,-14892,-29188,-14912,-29178,-14932,-29168,-14952,-29157,-14972,-29147,-14992,-29137,-15012,-29127,-15031,-29117,-15051,-29106,-15071,-29096,-15091,-29086,-15111,-29075,-15131,-29065,-15150,-29055,-15170,-29045,-15190,-29034,-15210,-29024,-15230,-29013,-15249,-29003,-15269,-28993,-15289,-28982,-15309,-28972,-15328,-28961,-15348,-28951,-15368,-28940,-15388,-28930,-15407,-28919,-15427,-28909,-15447,-28898,-15466,-28888,-15486,-28877,-15506,-28867,-15526,-28856,-15545,-28846,-15565,-28835,-15584,-28824,-15604,-28814,-15624,-28803,-15643,-28792,-15663,-28782,-15683,-28771,-15702,-28760,-15722,-28750,-15741,-28739,-15761,-28728,-15781,-28717,-15800,-28707,-15820,-28696,-15839,-28685,-15859,-28674,-15878,-28663,-15898,-28653,-15918,-28642,-15937,-28631,-15957,-28620,-15976,-28609,-15996,-28598,-16015,-28587,-16035,-28576,-16054,-28566,-16073,-28555,-16093,-28544,-16112,-28533,-16132,-28522,-16151,-28511,-16171,-28500,-16190,-28489,-16210,-28478,-16229,-28466,-16248,-28455,-16268,-28444,-16287,-28433,-16307,-28422,-16326,-28411,-16345,-28400,-16365,-28389,-16384,-28378,-16403,-28366,-16423,-28355,-16442,-28344,-16461,-28333,-16481,-28322,-16500,-28310,-16519,-28299,-16539,-28288,-16558,-28276,-16577,-28265,-16596,-28254,-16616,-28243,-16635,-28231,-16654,-28220,-16673,-28209,-16693,-28197,-16712,-28186,-16731,-28174,-16750,-28163,-16769,-28152,-16789,-28140,-16808,-28129,-16827,-28117,-16846,-28106,-16865,-28094,-16884,-28083,-16904,-28071,-16923,-28060,-16942,-28048,-16961,-28037,-16980,-28025,-16999,-28013,-17018,-28002,-17037,-27990,-17056,-27979,-17075,-27967,-17095,-27955,-17114,-27944,-17133,-27932,-17152,-27920,-17171,-27909,-17190,-27897,-17209,-27885,-17228,-27873,-17247,-27862,-17266,-27850,-17285,-27838,-17304,-27826,-17323,-27815,-17342,-27803,-17361,-27791,-17380,-27779,-17398,-27767,-17417,-27755,-17436,-27743,-17455,-27732,-17474,-27720,-17493,-27708,-17512,-27696,-17531,-27684,-17550,-27672,-17568,-27660,-17587,-27648,-17606,-27636,-17625,-27624,-17644,-27612,-17663,-27600,-17681,-27588,-17700,-27576,-17719,-27564,-17738,-27552,-17757,-27539,-17775,-27527,-17794,-27515,-17813,-27503,-17832,-27491,-17850,-27479,-17869,-27467,-17888,-27454,-17907,-27442,-17925,-27430,-17944,-27418,-17963,-27406,-17981,-27393,-18000,-27381,-18019,-27369,-18037,-27356,-18056,-27344,-18075,-27332,-18093,-27320,-18112,-27307,-18131,-27295,-18149,-27282,-18168,-27270,-18186,-27258,-18205,-27245,-18223,-27233,-18242,-27220,-18261,-27208,-18279,-27196,-18298,-27183,-18316,-27171,-18335,-27158,-18353,-27146,-18372,-27133,-18390,-27121,-18409,-27108,-18427,-27095,-18446,-27083,-18464,-27070,-18483,-27058,-18501,-27045,-18519,-27032,-18538,-27020,-18556,-27007,-18575,-26995,-18593,-26982,-18611,-26969,-18630,-26956,-18648,-26944,-18667,-26931,-18685,-26918,-18703,-26906,-18722,-26893,-18740,-26880,-18758,-26867,-18777,-26854,-18795,-26842,-18813,-26829,-18831,-26816,-18850,-26803,-18868,-26790,-18886,-26777,-18905,-26765,-18923,-26752,-18941,-26739,-18959,-26726,-18977,-26713,-18996,-26700,-19014,-26687,-19032,-26674,-19050,-26661,-19068,-26648,-19087,-26635,-19105,-26622,-19123,-26609,-19141,-26596,-19159,-26583,-19177,-26570,-19195,-26557,-19213,-26544,-19232,-26531,-19250,-26517,-19268,-26504,-19286,-26491,-19304,-26478,-19322,-26465,-19340,-26452,-19358,-26438,-19376,-26425,-19394,-26412,-19412,-26399,-19430,-26386,-19448,-26372,-19466,-26359,-19484,-26346,-19502,-26333,-19520,-26319,-19538,-26306,-19556,-26293,-19574,-26279,-19591,-26266,-19609,-26253,-19627,-26239,-19645,-26226,-19663,-26212,-19681,-26199,-19699,-26186,-19717,-26172,-19734,-26159,-19752,-26145,-19770,-26132,-19788,-26118,-19806,-26105,-19823,-26091,-19841,-26078,-19859,-26064,-19877,-26051,-19895,-26037,-19912,-26023,-19930,-26010,-19948,-25996,-19966,-25983,-19983,-25969,-20001,-25955,-20019,-25942,-20036,-25928,-20054,-25914,-20072,-25901,-20089,-25887,-20107,-25873,-20125,-25860,-20142,-25846,-20160,-25832,-20177,-25818,-20195,-25805,-20213,-25791,-20230,-25777,-20248,-25763,-20265,-25750,-20283,-25736,-20300,-25722,-20318,-25708,-20335,-25694,-20353,-25680,-20370,-25666,-20388,-25653,-20405,-25639,-20423,-25625,-20440,-25611,-20458,-25597,-20475,-25583,-20493,-25569,-20510,-25555,-20528,-25541,-20545,-25527,-20562,-25513,-20580,-25499,-20597,-25485,-20614,-25471,-20632,-25457,-20649,-25443,-20667,-25429,-20684,-25415,-20701,-25400,-20719,-25386,-20736,-25372,-20753,-25358,-20770,-25344,-20788,-25330,-20805,-25316,-20822,-25301,-20839,-25287,-20857,-25273,-20874,-25259,-20891,-25244,-20908,-25230,-20926,-25216,-20943,-25202,-20960,-25187,-20977,-25173,-20994,-25159,-21011,-25145,-21028,-25130,-21046,-25116,-21063,-25101,-21080,-25087,-21097,-25073,-21114,-25058,-21131,-25044,-21148,-25030,-21165,-25015,-21182,-25001,-21199,-24986,-21216,-24972,-21233,-24957,-21250,-24943,-21267,-24928,-21284,-24914,-21301,-24899,-21318,-24885,-21335,-24870,-21352,-24856,-21369,-24841,-21386,-24827,-21403,-24812,-21420,-24797,-21437,-24783,-21454,-24768,-21471,-24754,-21487,-24739,-21504,-24724,-21521,-24710,-21538,-24695,-21555,-24680,-21572,-24665,-21588,-24651,-21605,-24636,-21622,-24621,-21639,-24607,-21656,-24592,-21672,-24577,-21689,-24562,-21706,-24547,-21723,-24533,-21739,-24518,-21756,-24503,-21773,-24488,-21789,-24473,-21806,-24458,-21823,-24444,-21839,-24429,-21856,-24414,-21873,-24399,-21889,-24384,-21906,-24369,-21923,-24354,-21939,-24339,-21956,-24324,-21972,-24309,-21989,-24294,-22005,-24279,-22022,-24264,-22039,-24249,-22055,-24234,-22072,-24219,-22088,-24204,-22105,-24189,-22121,-24174,-22138,-24159,-22154,-24144,-22170,-24129,-22187,-24114,-22203,-24098,-22220,-24083,-22236,-24068,-22253,-24053,-22269,-24038,-22285,-24023,-22302,-24007,-22318,-23992,-22334,-23977,-22351,-23962,-22367,-23946,-22383,-23931,-22400,-23916,-22416,-23901,-22432,-23885,-22449,-23870,-22465,-23855,-22481,-23839,-22497,-23824,-22514,-23809,-22530,-23793,-22546,-23778,-22562,-23763,-22578,-23747,-22595,-23732,-22611,-23716,-22627,-23701,-22643,-23686,-22659,-23670,-22675,-23655,-22692,-23639,-22708,-23624,-22724,-23608,-22740,-23593,-22756,-23577,-22772,-23562,-22788,-23546,-22804,-23531,-22820,-23515,-22836,-23500,-22852,-23484,-22868,-23468,-22884,-23453,-22900,-23437,-22916,-23422,-22932,-23406,-22948,-23390,-22964,-23375,-22980,-23359,-22996,-23343,-23012,-23328,-23028,-23312,-23044,-23296,-23059,-23281,-23075,-23265,-23091,-23249,-23107,-23233,-23123,-23218,-23139,-23202,-23154,-23186,-23170,-23170,-23186,-23154,-23202,-23139,-23218,-23123,-23233,-23107,-23249,-23091,-23265,-23075,-23281,-23059,-23296,-23044,-23312,-23028,-23328,-23012,-23343,-22996,-23359,-22980,-23375,-22964,-23390,-22948,-23406,-22932,-23422,-22916,-23437,-22900,-23453,-22884,-23468,-22868,-23484,-22852,-23500,-22836,-23515,-22820,-23531,-22804,-23546,-22788,-23562,-22772,-23577,-22756,-23593,-22740,-23608,-22724,-23624,-22708,-23639,-22692,-23655,-22675,-23670,-22659,-23686,-22643,-23701,-22627,-23716,-22611,-23732,-22595,-23747,-22578,-23763,-22562,-23778,-22546,-23793,-22530,-23809,-22514,-23824,-22497,-23839,-22481,-23855,-22465,-23870,-22449,-23885,-22432,-23901,-22416,-23916,-22400,-23931,-22383,-23946,-22367,-23962,-22351,-23977,-22334,-23992,-22318,-24007,-22302,-24023,-22285,-24038,-22269,-24053,-22253,-24068,-22236,-24083,-22220,-24098,-22203,-24114,-22187,-24129,-22170,-24144,-22154,-24159,-22138,-24174,-22121,-24189,-22105,-24204,-22088,-24219,-22072,-24234,-22055,-24249,-22039,-24264,-22022,-24279,-22005,-24294,-21989,-24309,-21972,-24324,-21956,-24339,-21939,-24354,-21923,-24369,-21906,-24384,-21889,-24399,-21873,-24414,-21856,-24429,-21839,-24444,-21823,-24458,-21806,-24473,-21789,-24488,-21773,-24503,-21756,-24518,-21739,-24533,-21723,-24547,-21706,-24562,-21689,-24577,-21672,-24592,-21656,-24607,-21639,-24621,-21622,-24636,-21605,-24651,-21588,-24665,-21572,-24680,-21555,-24695,-21538,-24710,-21521,-24724,-21504,-24739,-21487,-24754,-21471,-24768,-21454,-24783,-21437,-24797,-21420,-24812,-21403,-24827,-21386,-24841,-21369,-24856,-21352,-24870,-21335,-24885,-21318,-24899,-21301,-24914,-21284,-24928,-21267,-24943,-21250,-24957,-21233,-24972,-21216,-24986,-21199,-25001,-21182,-25015,-21165,-25030,-21148,-25044,-21131,-25058,-21114,-25073,-21097,-25087,-21080,-25101,-21063,-25116,-21046,-25130,-21028,-25145,-21011,-25159,-20994,-25173,-20977,-25187,-20960,-25202,-20943,-25216,-20926,-25230,-20908,-25244,-20891,-25259,-20874,-25273,-20857,-25287,-20839,-25301,-20822,-25316,-20805,-25330,-20788,-25344,-20770,-25358,-20753,-25372,-20736,-25386,-20719,-25400,-20701,-25415,-20684,-25429,-20667,-25443,-20649,-25457,-20632,-25471,-20614,-25485,-20597,-25499,-20580,-25513,-20562,-25527,-20545,-25541,-20528,-25555,-20510,-25569,-20493,-25583,-20475,-25597,-20458,-25611,-20440,-25625,-20423,-25639,-20405,-25653,-20388,-25666,-20370,-25680,-20353,-25694,-20335,-25708,-20318,-25722,-20300,-25736,-20283,-25750,-20265,-25763,-20248,-25777,-20230,-25791,-20213,-25805,-20195,-25818,-20177,-25832,-20160,-25846,-20142,-25860,-20125,-25873,-20107,-25887,-20089,-25901,-20072,-25914,-20054,-25928,-20036,-25942,-20019,-25955,-20001,-25969,-19983,-25983,-19966,-25996,-19948,-26010,-19930,-26023,-19912,-26037,-19895,-26051,-19877,-26064,-19859,-26078,-19841,-26091,-19823,-26105,-19806,-26118,-19788,-26132,-19770,-26145,-19752,-26159,-19734,-26172,-19717,-26186,-19699,-26199,-19681,-26212,-19663,-26226,-19645,-26239,-19627,-26253,-19609,-26266,-19591,-26279,-19574,-26293,-19556,-26306,-19538,-26319,-19520,-26333,-19502,-26346,-19484,-26359,-19466,-26372,-19448,-26386,-19430,-26399,-19412,-26412,-19394,-26425,-19376,-26438,-19358,-26452,-19340,-26465,-19322,-26478,-19304,-26491,-19286,-26504,-19268,-26517,-19250,-26531,-19232,-26544,-19213,-26557,-19195,-26570,-19177,-26583,-19159,-26596,-19141,-26609,-19123,-26622,-19105,-26635,-19087,-26648,-19068,-26661,-19050,-26674,-19032,-26687,-19014,-26700,-18996,-26713,-18977,-26726,-18959,-26739,-18941,-26752,-18923,-26765,-18905,-26777,-18886,-26790,-18868,-26803,-18850,-26816,-18831,-26829,-18813,-26842,-18795,-26854,-18777,-26867,-18758,-26880,-18740,-26893,-18722,-26906,-18703,-26918,-18685,-26931,-18667,-26944,-18648,-26956,-18630,-26969,-18611,-26982,-18593,-26995,-18575,-27007,-18556,-27020,-18538,-27032,-18519,-27045,-18501,-27058,-18483,-27070,-18464,-27083,-18446,-27095,-18427,-27108,-18409,-27121,-18390,-27133,-18372,-27146,-18353,-27158,-18335,-27171,-18316,-27183,-18298,-27196,-18279,-27208,-18261,-27220,-18242,-27233,-18223,-27245,-18205,-27258,-18186,-27270,-18168,-27282,-18149,-27295,-18131,-27307,-18112,-27320,-18093,-27332,-18075,-27344,-18056,-27356,-18037,-27369,-18019,-27381,-18000,-27393,-17981,-27406,-17963,-27418,-17944,-27430,-17925,-27442,-17907,-27454,-17888,-27467,-17869,-27479,-17850,-27491,-17832,-27503,-17813,-27515,-17794,-27527,-17775,-27539,-17757,-27552,-17738,-27564,-17719,-27576,-17700,-27588,-17681,-27600,-17663,-27612,-17644,-27624,-17625,-27636,-17606,-27648,-17587,-27660,-17568,-27672,-17550,-27684,-17531,-27696,-17512,-27708,-17493,-27720,-17474,-27732,-17455,-27743,-17436,-27755,-17417,-27767,-17398,-27779,-17380,-27791,-17361,-27803,-17342,-27815,-17323,-27826,-17304,-27838,-17285,-27850,-17266,-27862,-17247,-27873,-17228,-27885,-17209,-27897,-17190,-27909,-17171,-27920,-17152,-27932,-17133,-27944,-17114,-27955,-17095,-27967,-17075,-27979,-17056,-27990,-17037,-28002,-17018,-28013,-16999,-28025,-16980,-28037,-16961,-28048,-16942,-28060,-16923,-28071,-16904,-28083,-16884,-28094,-16865,-28106,-16846,-28117,-16827,-28129,-16808,-28140,-16789,-28152,-16769,-28163,-16750,-28174,-16731,-28186,-16712,-28197,-16693,-28209,-16673,-28220,-16654,-28231,-16635,-28243,-16616,-28254,-16596,-28265,-16577,-28276,-16558,-28288,-16539,-28299,-16519,-28310,-16500,-28322,-16481,-28333,-16461,-28344,-16442,-28355,-16423,-28366,-16403,-28378,-16384,-28389,-16365,-28400,-16345,-28411,-16326,-28422,-16307,-28433,-16287,-28444,-16268,-28455,-16248,-28466,-16229,-28478,-16210,-28489,-16190,-28500,-16171,-28511,-16151,-28522,-16132,-28533,-16112,-28544,-16093,-28555,-16073,-28566,-16054,-28576,-16035,-28587,-16015,-28598,-15996,-28609,-15976,-28620,-15957,-28631,-15937,-28642,-15918,-28653,-15898,-28663,-15878,-28674,-15859,-28685,-15839,-28696,-15820,-28707,-15800,-28717,-15781,-28728,-15761,-28739,-15741,-28750,-15722,-28760,-15702,-28771,-15683,-28782,-15663,-28792,-15643,-28803,-15624,-28814,-15604,-28824,-15584,-28835,-15565,-28846,-15545,-28856,-15526,-28867,-15506,-28877,-15486,-28888,-15466,-28898,-15447,-28909,-15427,-28919,-15407,-28930,-15388,-28940,-15368,-28951,-15348,-28961,-15328,-28972,-15309,-28982,-15289,-28993,-15269,-29003,-15249,-29013,-15230,-29024,-15210,-29034,-15190,-29045,-15170,-29055,-15150,-29065,-15131,-29075,-15111,-29086,-15091,-29096,-15071,-29106,-15051,-29117,-15031,-29127,-15012,-29137,-14992,-29147,-14972,-29157,-14952,-29168,-14932,-29178,-14912,-29188,-14892,-29198,-14872,-29208,-14853,-29218,-14833,-29228,-14813,-29239,-14793,-29249,-14773,-29259,-14753,-29269,-14733,-29279,-14713,-29289,-14693,-29299,-14673,-29309,-14653,-29319,-14633,-29329,-14613,-29339,-14593,-29349,-14573,-29359,-14553,-29369,-14533,-29378,-14513,-29388,-14493,-29398,-14473,-29408,-14453,-29418,-14433,-29428,-14413,-29438,-14393,-29447,-14373,-29457,-14353,-29467,-14332,-29477,-14312,-29486,-14292,-29496,-14272,-29506,-14252,-29516,-14232,-29525,-14212,-29535,-14192,-29545,-14172,-29554,-14151,-29564,-14131,-29574,-14111,-29583,-14091,-29593,-14071,-29602,-14051,-29612,-14030,-29622,-14010,-29631,-13990,-29641,-13970,-29650,-13950,-29660,-13929,-29669,-13909,-29679,-13889,-29688,-13869,-29697,-13848,-29707,-13828,-29716,-13808,-29726,-13788,-29735,-13767,-29745,-13747,-29754,-13727,-29763,-13707,-29773,-13686,-29782,-13666,-29791,-13646,-29801,-13625,-29810,-13605,-29819,-13585,-29828,-13564,-29838,-13544,-29847,-13524,-29856,-13503,-29865,-13483,-29874,-13463,-29884,-13442,-29893,-13422,-29902,-13401,-29911,-13381,-29920,-13361,-29929,-13340,-29938,-13320,-29947,-13299,-29956,-13279,-29965,-13259,-29974,-13238,-29984,-13218,-29993,-13197,-30002,-13177,-30010,-13156,-30019,-13136,-30028,-13115,-30037,-13095,-30046,-13075,-30055,-13054,-30064,-13034,-30073,-13013,-30082,-12993,-30091,-12972,-30099,-12951,-30108,-12931,-30117,-12910,-30126,-12890,-30135,-12869,-30143,-12849,-30152,-12828,-30161,-12808,-30170,-12787,-30178,-12767,-30187,-12746,-30196,-12725,-30204,-12705,-30213,-12684,-30222,-12664,-30230,-12643,-30239,-12622,-30248,-12602,-30256,-12581,-30265,-12561,-30273,-12540,-30282,-12519,-30290,-12499,-30299,-12478,-30307,-12457,-30316,-12437,-30324,-12416,-30333,-12395,-30341,-12375,-30350,-12354,-30358,-12333,-30366,-12313,-30375,-12292,-30383,-12271,-30392,-12250,-30400,-12230,-30408,-12209,-30417,-12188,-30425,-12167,-30433,-12147,-30441,-12126,-30450,-12105,-30458,-12084,-30466,-12064,-30474,-12043,-30483,-12022,-30491,-12001,-30499,-11981,-30507,-11960,-30515,-11939,-30523,-11918,-30531,-11897,-30540,-11877,-30548,-11856,-30556,-11835,-30564,-11814,-30572,-11793,-30580,-11772,-30588,-11751,-30596,-11731,-30604,-11710,-30612,-11689,-30620,-11668,-30628,-11647,-30636,-11626,-30644,-11605,-30652,-11584,-30659,-11564,-30667,-11543,-30675,-11522,-30683,-11501,-30691,-11480,-30699,-11459,-30706,-11438,-30714,-11417,-30722,-11396,-30730,-11375,-30738,-11354,-30745,-11333,-30753,-11312,-30761,-11291,-30768,-11270,-30776,-11249,-30784,-11228,-30791,-11207,-30799,-11186,-30807,-11165,-30814,-11144,-30822,-11123,-30829,-11102,-30837,-11081,-30845,-11060,-30852,-11039,-30860,-11018,-30867,-10997,-30875,-10976,-30882,-10955,-30890,-10934,-30897,-10913,-30904,-10892,-30912,-10871,-30919,-10850,-30927,-10829,-30934,-10808,-30941,-10787,-30949,-10766,-30956,-10744,-30963,-10723,-30971,-10702,-30978,-10681,-30985,-10660,-30992,-10639,-31000,-10618,-31007,-10597,-31014,-10575,-31021,-10554,-31029,-10533,-31036,-10512,-31043,-10491,-31050,-10470,-31057,-10448,-31064,-10427,-31071,-10406,-31078,-10385,-31086,-10364,-31093,-10343,-31100,-10321,-31107,-10300,-31114,-10279,-31121,-10258,-31128,-10236,-31135,-10215,-31142,-10194,-31149,-10173,-31155,-10152,-31162,-10130,-31169,-10109,-31176,-10088,-31183,-10067,-31190,-10045,-31197,-10024,-31204,-10003,-31210,-9981,-31217,-9960,-31224,-9939,-31231,-9918,-31237,-9896,-31244,-9875,-31251,-9854,-31258,-9832,-31264,-9811,-31271,-9790,-31278,-9768,-31284,-9747,-31291,-9726,-31298,-9704,-31304,-9683,-31311,-9662,-31317,-9640,-31324,-9619,-31331,-9598,-31337,-9576,-31344,-9555,-31350,-9534,-31357,-9512,-31363,-9491,-31370,-9469,-31376,-9448,-31382,-9427,-31389,-9405,-31395,-9384,-31402,-9363,-31408,-9341,-31414,-9320,-31421,-9298,-31427,-9277,-31433,-9255,-31440,-9234,-31446,-9213,-31452,-9191,-31458,-9170,-31465,-9148,-31471,-9127,-31477,-9105,-31483,-9084,-31490,-9062,-31496,-9041,-31502,-9019,-31508,-8998,-31514,-8976,-31520,-8955,-31526,-8933,-31532,-8912,-31538,-8890,-31545,-8869,-31551,-8847,-31557,-8826,-31563,-8804,-31569,-8783,-31575,-8761,-31581,-8740,-31587,-8718,-31592,-8697,-31598,-8675,-31604,-8654,-31610,-8632,-31616,-8611,-31622,-8589,-31628,-8568,-31634,-8546,-31639,-8524,-31645,-8503,-31651,-8481,-31657,-8460,-31663,-8438,-31668,-8416,-31674,-8395,-31680,-8373,-31685,-8352,-31691,-8330,-31697,-8308,-31702,-8287,-31708,-8265,-31714,-8244,-31719,-8222,-31725,-8200,-31730,-8179,-31736,-8157,-31742,-8135,-31747,-8114,-31753,-8092,-31758,-8071,-31764,-8049,-31769,-8027,-31775,-8006,-31780,-7984,-31786,-7962,-31791,-7941,-31796,-7919,-31802,-7897,-31807,-7876,-31812,-7854,-31818,-7832,-31823,-7810,-31828,-7789,-31834,-7767,-31839,-7745,-31844,-7724,-31850,-7702,-31855,-7680,-31860,-7658,-31865,-7637,-31870,-7615,-31876,-7593,-31881,-7572,-31886,-7550,-31891,-7528,-31896,-7506,-31901,-7485,-31906,-7463,-31912,-7441,-31917,-7419,-31922,-7398,-31927,-7376,-31932,-7354,-31937,-7332,-31942,-7311,-31947,-7289,-31952,-7267,-31957,-7245,-31962,-7223,-31966,-7202,-31971,-7180,-31976,-7158,-31981,-7136,-31986,-7114,-31991,-7093,-31996,-7071,-32000,-7049,-32005,-7027,-32010,-7005,-32015,-6983,-32020,-6962,-32024,-6940,-32029,-6918,-32034,-6896,-32038,-6874,-32043,-6852,-32048,-6831,-32052,-6809,-32057,-6787,-32062,-6765,-32066,-6743,-32071,-6721,-32075,-6699,-32080,-6678,-32085,-6656,-32089,-6634,-32094,-6612,-32098,-6590,-32103,-6568,-32107,-6546,-32111,-6524,-32116,-6503,-32120,-6481,-32125,-6459,-32129,-6437,-32134,-6415,-32138,-6393,-32142,-6371,-32147,-6349,-32151,-6327,-32155,-6305,-32159,-6283,-32164,-6262,-32168,-6240,-32172,-6218,-32177,-6196,-32181,-6174,-32185,-6152,-32189,-6130,-32193,-6108,-32197,-6086,-32202,-6064,-32206,-6042,-32210,-6020,-32214,-5998,-32218,-5976,-32222,-5954,-32226,-5932,-32230,-5910,-32234,-5888,-32238,-5866,-32242,-5844,-32246,-5822,-32250,-5800,-32254,-5778,-32258,-5756,-32262,-5734,-32266,-5712,-32270,-5690,-32274,-5668,-32277,-5646,-32281,-5624,-32285,-5602,-32289,-5580,-32293,-5558,-32296,-5536,-32300,-5514,-32304,-5492,-32308,-5470,-32311,-5448,-32315,-5426,-32319,-5404,-32323,-5382,-32326,-5360,-32330,-5338,-32333,-5316,-32337,-5294,-32341,-5272,-32344,-5250,-32348,-5228,-32351,-5206,-32355,-5184,-32358,-5162,-32362,-5140,-32365,-5118,-32369,-5095,-32372,-5073,-32376,-5051,-32379,-5029,-32383,-5007,-32386,-4985,-32390,-4963,-32393,-4941,-32396,-4919,-32400,-4897,-32403,-4875,-32406,-4853,-32410,-4831,-32413,-4808,-32416,-4786,-32419,-4764,-32423,-4742,-32426,-4720,-32429,-4698,-32432,-4676,-32435,-4654,-32439,-4632,-32442,-4609,-32445,-4587,-32448,-4565,-32451,-4543,-32454,-4521,-32457,-4499,-32460,-4477,-32463,-4455,-32466,-4432,-32469,-4410,-32472,-4388,-32475,-4366,-32478,-4344,-32481,-4322,-32484,-4300,-32487,-4277,-32490,-4255,-32493,-4233,-32496,-4211,-32499,-4189,-32502,-4167,-32504,-4145,-32507,-4122,-32510,-4100,-32513,-4078,-32516,-4056,-32518,-4034,-32521,-4012,-32524,-3989,-32527,-3967,-32529,-3945,-32532,-3923,-32535,-3901,-32537,-3878,-32540,-3856,-32542,-3834,-32545,-3812,-32548,-3790,-32550,-3768,-32553,-3745,-32555,-3723,-32558,-3701,-32560,-3679,-32563,-3657,-32565,-3634,-32568,-3612,-32570,-3590,-32573,-3568,-32575,-3546,-32578,-3523,-32580,-3501,-32582,-3479,-32585,-3457,-32587,-3434,-32589,-3412,-32592,-3390,-32594,-3368,-32596,-3346,-32599,-3323,-32601,-3301,-32603,-3279,-32605,-3257,-32608,-3234,-32610,-3212,-32612,-3190,-32614,-3168,-32616,-3146,-32618,-3123,-32620,-3101,-32623,-3079,-32625,-3057,-32627,-3034,-32629,-3012,-32631,-2990,-32633,-2968,-32635,-2945,-32637,-2923,-32639,-2901,-32641,-2879,-32643,-2856,-32645,-2834,-32647,-2812,-32649,-2790,-32650,-2767,-32652,-2745,-32654,-2723,-32656,-2701,-32658,-2678,-32660,-2656,-32662,-2634,-32663,-2611,-32665,-2589,-32667,-2567,-32669,-2545,-32670,-2522,-32672,-2500,-32674,-2478,-32675,-2456,-32677,-2433,-32679,-2411,-32680,-2389,-32682,-2366,-32684,-2344,-32685,-2322,-32687,-2300,-32688,-2277,-32690,-2255,-32691,-2233,-32693,-2210,-32694,-2188,-32696,-2166,-32697,-2144,-32699,-2121,-32700,-2099,-32702,-2077,-32703,-2054,-32704,-2032,-32706,-2010,-32707,-1987,-32709,-1965,-32710,-1943,-32711,-1921,-32712,-1898,-32714,-1876,-32715,-1854,-32716,-1831,-32718,-1809,-32719,-1787,-32720,-1764,-32721,-1742,-32722,-1720,-32724,-1698,-32725,-1675,-32726,-1653,-32727,-1631,-32728,-1608,-32729,-1586,-32730,-1564,-32731,-1541,-32732,-1519,-32733,-1497,-32734,-1474,-32735,-1452,-32736,-1430,-32737,-1407,-32738,-1385,-32739,-1363,-32740,-1340,-32741,-1318,-32742,-1296,-32743,-1274,-32744,-1251,-32744,-1229,-32745,-1207,-32746,-1184,-32747,-1162,-32748,-1140,-32748,-1117,-32749,-1095,-32750,-1073,-32751,-1050,-32751,-1028,-32752,-1006,-32753,-983,-32753,-961,-32754,-939,-32755,-916,-32755,-894,-32756,-872,-32757,-849,-32757,-827,-32758,-805,-32758,-782,-32759,-760,-32759,-738,-32760,-715,-32760,-693,-32761,-671,-32761,-648,-32762,-626,-32762,-604,-32762,-581,-32763,-559,-32763,-537,-32763,-514,-32764,-492,-32764,-470,-32764,-447,-32765,-425,-32765,-403,-32765,-380,-32766,-358,-32766,-336,-32766,-313,-32766,-291,-32766,-269,-32767,-246,-32767,-224,-32767,-202,-32767,-179,-32767,-157,-32767,-135,-32767,-112,-32767,-90,-32767,-68,-32767,-45,-32767,-23,-32767,-1,-32767,22,-32767,44,-32767,67,-32767,89,-32767,111,-32767,134,-32767,156,-32767,178,-32767,201,-32767,223,-32767,245,-32766,268,-32766,290,-32766,312,-32766,335,-32766,357,-32765,379,-32765,402,-32765,424,-32764,446,-32764,469,-32764,491,-32763,513,-32763,536,-32763,558,-32762,580,-32762,603,-32762,625,-32761,647,-32761,670,-32760,692,-32760,714,-32759,737,-32759,759,-32758,781,-32758,804,-32757,826,-32757,848,-32756,871,-32755,893,-32755,915,-32754,938,-32753,960,-32753,982,-32752,1005,-32751,1027,-32751,1049,-32750,1072,-32749,1094,-32748,1116,-32748,1139,-32747,1161,-32746,1183,-32745,1206,-32744,1228,-32744,1250,-32743,1273,-32742,1295,-32741,1317,-32740,1339,-32739,1362,-32738,1384,-32737,1406,-32736,1429,-32735,1451,-32734,1473,-32733,1496,-32732,1518,-32731,1540,-32730,1563,-32729,1585,-32728,1607,-32727,1630,-32726,1652,-32725,1674,-32724,1697,-32722,1719,-32721,1741,-32720,1763,-32719,1786,-32718,1808,-32716,1830,-32715,1853,-32714,1875,-32712,1897,-32711,1920,-32710,1942,-32709,1964,-32707,1986,-32706,2009,-32704,2031,-32703,2053,-32702,2076,-32700,2098,-32699,2120,-32697,2143,-32696,2165,-32694,2187,-32693,2209,-32691,2232,-32690,2254,-32688,2276,-32687,2299,-32685,2321,-32684,2343,-32682,2365,-32680,2388,-32679,2410,-32677,2432,-32675,2455,-32674,2477,-32672,2499,-32670,2521,-32669,2544,-32667,2566,-32665,2588,-32663,2610,-32662,2633,-32660,2655,-32658,2677,-32656,2700,-32654,2722,-32652,2744,-32650,2766,-32649,2789,-32647,2811,-32645,2833,-32643,2855,-32641,2878,-32639,2900,-32637,2922,-32635,2944,-32633,2967,-32631,2989,-32629,3011,-32627,3033,-32625,3056,-32623,3078,-32620,3100,-32618,3122,-32616,3145,-32614,3167,-32612,3189,-32610,3211,-32608,3233,-32605,3256,-32603,3278,-32601,3300,-32599,3322,-32596,3345,-32594,3367,-32592,3389,-32589,3411,-32587,3433,-32585,3456,-32582,3478,-32580,3500,-32578,3522,-32575,3545,-32573,3567,-32570,3589,-32568,3611,-32565,3633,-32563,3656,-32560,3678,-32558,3700,-32555,3722,-32553,3744,-32550,3767,-32548,3789,-32545,3811,-32542,3833,-32540,3855,-32537,3877,-32535,3900,-32532,3922,-32529,3944,-32527,3966,-32524,3988,-32521,4011,-32518,4033,-32516,4055,-32513,4077,-32510,4099,-32507,4121,-32504,4144,-32502,4166,-32499,4188,-32496,4210,-32493,4232,-32490,4254,-32487,4276,-32484,4299,-32481,4321,-32478,4343,-32475,4365,-32472,4387,-32469,4409,-32466,4431,-32463,4454,-32460,4476,-32457,4498,-32454,4520,-32451,4542,-32448,4564,-32445,4586,-32442,4608,-32439,4631,-32435,4653,-32432,4675,-32429,4697,-32426,4719,-32423,4741,-32419,4763,-32416,4785,-32413,4807,-32410,4830,-32406,4852,-32403,4874,-32400,4896,-32396,4918,-32393,4940,-32390,4962,-32386,4984,-32383,5006,-32379,5028,-32376,5050,-32372,5072,-32369,5094,-32365,5117,-32362,5139,-32358,5161,-32355,5183,-32351,5205,-32348,5227,-32344,5249,-32341,5271,-32337,5293,-32333,5315,-32330,5337,-32326,5359,-32323,5381,-32319,5403,-32315,5425,-32311,5447,-32308,5469,-32304,5491,-32300,5513,-32296,5535,-32293,5557,-32289,5579,-32285,5601,-32281,5623,-32277,5645,-32274,5667,-32270,5689,-32266,5711,-32262,5733,-32258,5755,-32254,5777,-32250,5799,-32246,5821,-32242,5843,-32238,5865,-32234,5887,-32230,5909,-32226,5931,-32222,5953,-32218,5975,-32214,5997,-32210,6019,-32206,6041,-32202,6063,-32197,6085,-32193,6107,-32189,6129,-32185,6151,-32181,6173,-32177,6195,-32172,6217,-32168,6239,-32164,6261,-32159,6282,-32155,6304,-32151,6326,-32147,6348,-32142,6370,-32138,6392,-32134,6414,-32129,6436,-32125,6458,-32120,6480,-32116,6502,-32111,6523,-32107,6545,-32103,6567,-32098,6589,-32094,6611,-32089,6633,-32085,6655,-32080,6677,-32075,6698,-32071,6720,-32066,6742,-32062,6764,-32057,6786,-32052,6808,-32048,6830,-32043,6851,-32038,6873,-32034,6895,-32029,6917,-32024,6939,-32020,6961,-32015,6982,-32010,7004,-32005,7026,-32000,7048,-31996,7070,-31991,7092,-31986,7113,-31981,7135,-31976,7157,-31971,7179,-31966,7201,-31962,7222,-31957,7244,-31952,7266,-31947,7288,-31942,7310,-31937,7331,-31932,7353,-31927,7375,-31922,7397,-31917,7418,-31912,7440,-31906,7462,-31901,7484,-31896,7505,-31891,7527,-31886,7549,-31881,7571,-31876,7592,-31870,7614,-31865,7636,-31860,7657,-31855,7679,-31850,7701,-31844,7723,-31839,7744,-31834,7766,-31828,7788,-31823,7809,-31818,7831,-31812,7853,-31807,7875,-31802,7896,-31796,7918,-31791,7940,-31786,7961,-31780,7983,-31775,8005,-31769,8026,-31764,8048,-31758,8070,-31753,8091,-31747,8113,-31742,8134,-31736,8156,-31730,8178,-31725,8199,-31719,8221,-31714,8243,-31708,8264,-31702,8286,-31697,8307,-31691,8329,-31685,8351,-31680,8372,-31674,8394,-31668,8415,-31663,8437,-31657,8459,-31651,8480,-31645,8502,-31639,8523,-31634,8545,-31628,8567,-31622,8588,-31616,8610,-31610,8631,-31604,8653,-31598,8674,-31592,8696,-31587,8717,-31581,8739,-31575,8760,-31569,8782,-31563,8803,-31557,8825,-31551,8846,-31545,8868,-31538,8889,-31532,8911,-31526,8932,-31520,8954,-31514,8975,-31508,8997,-31502,9018,-31496,9040,-31490,9061,-31483,9083,-31477,9104,-31471,9126,-31465,9147,-31458,9169,-31452,9190,-31446,9212,-31440,9233,-31433,9254,-31427,9276,-31421,9297,-31414,9319,-31408,9340,-31402,9362,-31395,9383,-31389,9404,-31382,9426,-31376,9447,-31370,9468,-31363,9490,-31357,9511,-31350,9533,-31344,9554,-31337,9575,-31331,9597,-31324,9618,-31317,9639,-31311,9661,-31304,9682,-31298,9703,-31291,9725,-31284,9746,-31278,9767,-31271,9789,-31264,9810,-31258,9831,-31251,9853,-31244,9874,-31237,9895,-31231,9917,-31224,9938,-31217,9959,-31210,9980,-31204,10002,-31197,10023,-31190,10044,-31183,10066,-31176,10087,-31169,10108,-31162,10129,-31155,10151,-31149,10172,-31142,10193,-31135,10214,-31128,10235,-31121,10257,-31114,10278,-31107,10299,-31100,10320,-31093,10342,-31086,10363,-31078,10384,-31071,10405,-31064,10426,-31057,10447,-31050,10469,-31043,10490,-31036,10511,-31029,10532,-31021,10553,-31014,10574,-31007,10596,-31000,10617,-30992,10638,-30985,10659,-30978,10680,-30971,10701,-30963,10722,-30956,10743,-30949,10765,-30941,10786,-30934,10807,-30927,10828,-30919,10849,-30912,10870,-30904,10891,-30897,10912,-30890,10933,-30882,10954,-30875,10975,-30867,10996,-30860,11017,-30852,11038,-30845,11059,-30837,11080,-30829,11101,-30822,11122,-30814,11143,-30807,11164,-30799,11185,-30791,11206,-30784,11227,-30776,11248,-30768,11269,-30761,11290,-30753,11311,-30745,11332,-30738,11353,-30730,11374,-30722,11395,-30714,11416,-30706,11437,-30699,11458,-30691,11479,-30683,11500,-30675,11521,-30667,11542,-30659,11563,-30652,11583,-30644,11604,-30636,11625,-30628,11646,-30620,11667,-30612,11688,-30604,11709,-30596,11730,-30588,11750,-30580,11771,-30572,11792,-30564,11813,-30556,11834,-30548,11855,-30540,11876,-30531,11896,-30523,11917,-30515,11938,-30507,11959,-30499,11980,-30491,12000,-30483,12021,-30474,12042,-30466,12063,-30458,12083,-30450,12104,-30441,12125,-30433,12146,-30425,12166,-30417,12187,-30408,12208,-30400,12229,-30392,12249,-30383,12270,-30375,12291,-30366,12312,-30358,12332,-30350,12353,-30341,12374,-30333,12394,-30324,12415,-30316,12436,-30307,12456,-30299,12477,-30290,12498,-30282,12518,-30273,12539,-30265,12560,-30256,12580,-30248,12601,-30239,12621,-30230,12642,-30222,12663,-30213,12683,-30204,12704,-30196,12724,-30187,12745,-30178,12766,-30170,12786,-30161,12807,-30152,12827,-30143,12848,-30135,12868,-30126,12889,-30117,12909,-30108,12930,-30099,12950,-30091,12971,-30082,12992,-30073,13012,-30064,13033,-30055,13053,-30046,13074,-30037,13094,-30028,13114,-30019,13135,-30010,13155,-30002,13176,-29993,13196,-29984,13217,-29974,13237,-29965,13258,-29956,13278,-29947,13298,-29938,13319,-29929,13339,-29920,13360,-29911,13380,-29902,13400,-29893,13421,-29884,13441,-29874,13462,-29865,13482,-29856,13502,-29847,13523,-29838,13543,-29828,13563,-29819,13584,-29810,13604,-29801,13624,-29791,13645,-29782,13665,-29773,13685,-29763,13706,-29754,13726,-29745,13746,-29735,13766,-29726,13787,-29716,13807,-29707,13827,-29697,13847,-29688,13868,-29679,13888,-29669,13908,-29660,13928,-29650,13949,-29641,13969,-29631,13989,-29622,14009,-29612,14029,-29602,14050,-29593,14070,-29583,14090,-29574,14110,-29564,14130,-29554,14150,-29545,14171,-29535,14191,-29525,14211,-29516,14231,-29506,14251,-29496,14271,-29486,14291,-29477,14311,-29467,14331,-29457,14352,-29447,14372,-29438,14392,-29428,14412,-29418,14432,-29408,14452,-29398,14472,-29388,14492,-29378,14512,-29369,14532,-29359,14552,-29349,14572,-29339,14592,-29329,14612,-29319,14632,-29309,14652,-29299,14672,-29289,14692,-29279,14712,-29269,14732,-29259,14752,-29249,14772,-29239,14792,-29228,14812,-29218,14832,-29208,14852,-29198,14871,-29188,14891,-29178,14911,-29168,14931,-29157,14951,-29147,14971,-29137,14991,-29127,15011,-29117,15030,-29106,15050,-29096,15070,-29086,15090,-29075,15110,-29065,15130,-29055,15149,-29045,15169,-29034,15189,-29024,15209,-29013,15229,-29003,15248,-28993,15268,-28982,15288,-28972,15308,-28961,15327,-28951,15347,-28940,15367,-28930,15387,-28919,15406,-28909,15426,-28898,15446,-28888,15465,-28877,15485,-28867,15505,-28856,15525,-28846,15544,-28835,15564,-28824,15583,-28814,15603,-28803,15623,-28792,15642,-28782,15662,-28771,15682,-28760,15701,-28750,15721,-28739,15740,-28728,15760,-28717,15780,-28707,15799,-28696,15819,-28685,15838,-28674,15858,-28663,15877,-28653,15897,-28642,15917,-28631,15936,-28620,15956,-28609,15975,-28598,15995,-28587,16014,-28576,16034,-28566,16053,-28555,16072,-28544,16092,-28533,16111,-28522,16131,-28511,16150,-28500,16170,-28489,16189,-28478,16209,-28466,16228,-28455,16247,-28444,16267,-28433,16286,-28422,16306,-28411,16325,-28400,16344,-28389,16364,-28378,16383,-28366,16402,-28355,16422,-28344,16441,-28333,16460,-28322,16480,-28310,16499,-28299,16518,-28288,16538,-28276,16557,-28265,16576,-28254,16595,-28243,16615,-28231,16634,-28220,16653,-28209,16672,-28197,16692,-28186,16711,-28174,16730,-28163,16749,-28152,16768,-28140,16788,-28129,16807,-28117,16826,-28106,16845,-28094,16864,-28083,16883,-28071,16903,-28060,16922,-28048,16941,-28037,16960,-28025,16979,-28013,16998,-28002,17017,-27990,17036,-27979,17055,-27967,17074,-27955,17094,-27944,17113,-27932,17132,-27920,17151,-27909,17170,-27897,17189,-27885,17208,-27873,17227,-27862,17246,-27850,17265,-27838,17284,-27826,17303,-27815,17322,-27803,17341,-27791,17360,-27779,17379,-27767,17397,-27755,17416,-27743,17435,-27732,17454,-27720,17473,-27708,17492,-27696,17511,-27684,17530,-27672,17549,-27660,17567,-27648,17586,-27636,17605,-27624,17624,-27612,17643,-27600,17662,-27588,17680,-27576,17699,-27564,17718,-27552,17737,-27539,17756,-27527,17774,-27515,17793,-27503,17812,-27491,17831,-27479,17849,-27467,17868,-27454,17887,-27442,17906,-27430,17924,-27418,17943,-27406,17962,-27393,17980,-27381,17999,-27369,18018,-27356,18036,-27344,18055,-27332,18074,-27320,18092,-27307,18111,-27295,18130,-27282,18148,-27270,18167,-27258,18185,-27245,18204,-27233,18222,-27220,18241,-27208,18260,-27196,18278,-27183,18297,-27171,18315,-27158,18334,-27146,18352,-27133,18371,-27121,18389,-27108,18408,-27095,18426,-27083,18445,-27070,18463,-27058,18482,-27045,18500,-27032,18518,-27020,18537,-27007,18555,-26995,18574,-26982,18592,-26969,18610,-26956,18629,-26944,18647,-26931,18666,-26918,18684,-26906,18702,-26893,18721,-26880,18739,-26867,18757,-26854,18776,-26842,18794,-26829,18812,-26816,18830,-26803,18849,-26790,18867,-26777,18885,-26765,18904,-26752,18922,-26739,18940,-26726,18958,-26713,18976,-26700,18995,-26687,19013,-26674,19031,-26661,19049,-26648,19067,-26635,19086,-26622,19104,-26609,19122,-26596,19140,-26583,19158,-26570,19176,-26557,19194,-26544,19212,-26531,19231,-26517,19249,-26504,19267,-26491,19285,-26478,19303,-26465,19321,-26452,19339,-26438,19357,-26425,19375,-26412,19393,-26399,19411,-26386,19429,-26372,19447,-26359,19465,-26346,19483,-26333,19501,-26319,19519,-26306,19537,-26293,19555,-26279,19573,-26266,19590,-26253,19608,-26239,19626,-26226,19644,-26212,19662,-26199,19680,-26186,19698,-26172,19716,-26159,19733,-26145,19751,-26132,19769,-26118,19787,-26105,19805,-26091,19822,-26078,19840,-26064,19858,-26051,19876,-26037,19894,-26023,19911,-26010,19929,-25996,19947,-25983,19965,-25969,19982,-25955,20000,-25942,20018,-25928,20035,-25914,20053,-25901,20071,-25887,20088,-25873,20106,-25860,20124,-25846,20141,-25832,20159,-25818,20176,-25805,20194,-25791,20212,-25777,20229,-25763,20247,-25750,20264,-25736,20282,-25722,20299,-25708,20317,-25694,20334,-25680,20352,-25666,20369,-25653,20387,-25639,20404,-25625,20422,-25611,20439,-25597,20457,-25583,20474,-25569,20492,-25555,20509,-25541,20527,-25527,20544,-25513,20561,-25499,20579,-25485,20596,-25471,20613,-25457,20631,-25443,20648,-25429,20666,-25415,20683,-25400,20700,-25386,20718,-25372,20735,-25358,20752,-25344,20769,-25330,20787,-25316,20804,-25301,20821,-25287,20838,-25273,20856,-25259,20873,-25244,20890,-25230,20907,-25216,20925,-25202,20942,-25187,20959,-25173,20976,-25159,20993,-25145,21010,-25130,21027,-25116,21045,-25101,21062,-25087,21079,-25073,21096,-25058,21113,-25044,21130,-25030,21147,-25015,21164,-25001,21181,-24986,21198,-24972,21215,-24957,21232,-24943,21249,-24928,21266,-24914,21283,-24899,21300,-24885,21317,-24870,21334,-24856,21351,-24841,21368,-24827,21385,-24812,21402,-24797,21419,-24783,21436,-24768,21453,-24754,21470,-24739,21486,-24724,21503,-24710,21520,-24695,21537,-24680,21554,-24665,21571,-24651,21587,-24636,21604,-24621,21621,-24607,21638,-24592,21655,-24577,21671,-24562,21688,-24547,21705,-24533,21722,-24518,21738,-24503,21755,-24488,21772,-24473,21788,-24458,21805,-24444,21822,-24429,21838,-24414,21855,-24399,21872,-24384,21888,-24369,21905,-24354,21922,-24339,21938,-24324,21955,-24309,21971,-24294,21988,-24279,22004,-24264,22021,-24249,22038,-24234,22054,-24219,22071,-24204,22087,-24189,22104,-24174,22120,-24159,22137,-24144,22153,-24129,22169,-24114,22186,-24098,22202,-24083,22219,-24068,22235,-24053,22252,-24038,22268,-24023,22284,-24007,22301,-23992,22317,-23977,22333,-23962,22350,-23946,22366,-23931,22382,-23916,22399,-23901,22415,-23885,22431,-23870,22448,-23855,22464,-23839,22480,-23824,22496,-23809,22513,-23793,22529,-23778,22545,-23763,22561,-23747,22577,-23732,22594,-23716,22610,-23701,22626,-23686,22642,-23670,22658,-23655,22674,-23639,22691,-23624,22707,-23608,22723,-23593,22739,-23577,22755,-23562,22771,-23546,22787,-23531,22803,-23515,22819,-23500,22835,-23484,22851,-23468,22867,-23453,22883,-23437,22899,-23422,22915,-23406,22931,-23390,22947,-23375,22963,-23359,22979,-23343,22995,-23328,23011,-23312,23027,-23296,23043,-23281,23058,-23265,23074,-23249,23090,-23233,23106,-23218,23122,-23202,23138,-23186,23153,-23170,23169,-23154,23185,-23139,23201,-23123,23217,-23107,23232,-23091,23248,-23075,23264,-23059,23280,-23044,23295,-23028,23311,-23012,23327,-22996,23342,-22980,23358,-22964,23374,-22948,23389,-22932,23405,-22916,23421,-22900,23436,-22884,23452,-22868,23467,-22852,23483,-22836,23499,-22820,23514,-22804,23530,-22788,23545,-22772,23561,-22756,23576,-22740,23592,-22724,23607,-22708,23623,-22692,23638,-22675,23654,-22659,23669,-22643,23685,-22627,23700,-22611,23715,-22595,23731,-22578,23746,-22562,23762,-22546,23777,-22530,23792,-22514,23808,-22497,23823,-22481,23838,-22465,23854,-22449,23869,-22432,23884,-22416,23900,-22400,23915,-22383,23930,-22367,23945,-22351,23961,-22334,23976,-22318,23991,-22302,24006,-22285,24022,-22269,24037,-22253,24052,-22236,24067,-22220,24082,-22203,24097,-22187,24113,-22170,24128,-22154,24143,-22138,24158,-22121,24173,-22105,24188,-22088,24203,-22072,24218,-22055,24233,-22039,24248,-22022,24263,-22005,24278,-21989,24293,-21972,24308,-21956,24323,-21939,24338,-21923,24353,-21906,24368,-21889,24383,-21873,24398,-21856,24413,-21839,24428,-21823,24443,-21806,24457,-21789,24472,-21773,24487,-21756,24502,-21739,24517,-21723,24532,-21706,24546,-21689,24561,-21672,24576,-21656,24591,-21639,24606,-21622,24620,-21605,24635,-21588,24650,-21572,24664,-21555,24679,-21538,24694,-21521,24709,-21504,24723,-21487,24738,-21471,24753,-21454,24767,-21437,24782,-21420,24796,-21403,24811,-21386,24826,-21369,24840,-21352,24855,-21335,24869,-21318,24884,-21301,24898,-21284,24913,-21267,24927,-21250,24942,-21233,24956,-21216,24971,-21199,24985,-21182,25000,-21165,25014,-21148,25029,-21131,25043,-21114,25057,-21097,25072,-21080,25086,-21063,25100,-21046,25115,-21028,25129,-21011,25144,-20994,25158,-20977,25172,-20960,25186,-20943,25201,-20926,25215,-20908,25229,-20891,25243,-20874,25258,-20857,25272,-20839,25286,-20822,25300,-20805,25315,-20788,25329,-20770,25343,-20753,25357,-20736,25371,-20719,25385,-20701,25399,-20684,25414,-20667,25428,-20649,25442,-20632,25456,-20614,25470,-20597,25484,-20580,25498,-20562,25512,-20545,25526,-20528,25540,-20510,25554,-20493,25568,-20475,25582,-20458,25596,-20440,25610,-20423,25624,-20405,25638,-20388,25652,-20370,25665,-20353,25679,-20335,25693,-20318,25707,-20300,25721,-20283,25735,-20265,25749,-20248,25762,-20230,25776,-20213,25790,-20195,25804,-20177,25817,-20160,25831,-20142,25845,-20125,25859,-20107,25872,-20089,25886,-20072,25900,-20054,25913,-20036,25927,-20019,25941,-20001,25954,-19983,25968,-19966,25982,-19948,25995,-19930,26009,-19912,26022,-19895,26036,-19877,26050,-19859,26063,-19841,26077,-19823,26090,-19806,26104,-19788,26117,-19770,26131,-19752,26144,-19734,26158,-19717,26171,-19699,26185,-19681,26198,-19663,26211,-19645,26225,-19627,26238,-19609,26252,-19591,26265,-19574,26278,-19556,26292,-19538,26305,-19520,26318,-19502,26332,-19484,26345,-19466,26358,-19448,26371,-19430,26385,-19412,26398,-19394,26411,-19376,26424,-19358,26437,-19340,26451,-19322,26464,-19304,26477,-19286,26490,-19268,26503,-19250,26516,-19232,26530,-19213,26543,-19195,26556,-19177,26569,-19159,26582,-19141,26595,-19123,26608,-19105,26621,-19087,26634,-19068,26647,-19050,26660,-19032,26673,-19014,26686,-18996,26699,-18977,26712,-18959,26725,-18941,26738,-18923,26751,-18905,26764,-18886,26776,-18868,26789,-18850,26802,-18831,26815,-18813,26828,-18795,26841,-18777,26853,-18758,26866,-18740,26879,-18722,26892,-18703,26905,-18685,26917,-18667,26930,-18648,26943,-18630,26955,-18611,26968,-18593,26981,-18575,26994,-18556,27006,-18538,27019,-18519,27031,-18501,27044,-18483,27057,-18464,27069,-18446,27082,-18427,27094,-18409,27107,-18390,27120,-18372,27132,-18353,27145,-18335,27157,-18316,27170,-18298,27182,-18279,27195,-18261,27207,-18242,27219,-18223,27232,-18205,27244,-18186,27257,-18168,27269,-18149,27281,-18131,27294,-18112,27306,-18093,27319,-18075,27331,-18056,27343,-18037,27355,-18019,27368,-18000,27380,-17981,27392,-17963,27405,-17944,27417,-17925,27429,-17907,27441,-17888,27453,-17869,27466,-17850,27478,-17832,27490,-17813,27502,-17794,27514,-17775,27526,-17757,27538,-17738,27551,-17719,27563,-17700,27575,-17681,27587,-17663,27599,-17644,27611,-17625,27623,-17606,27635,-17587,27647,-17568,27659,-17550,27671,-17531,27683,-17512,27695,-17493,27707,-17474,27719,-17455,27731,-17436,27742,-17417,27754,-17398,27766,-17380,27778,-17361,27790,-17342,27802,-17323,27814,-17304,27825,-17285,27837,-17266,27849,-17247,27861,-17228,27872,-17209,27884,-17190,27896,-17171,27908,-17152,27919,-17133,27931,-17114,27943,-17095,27954,-17075,27966,-17056,27978,-17037,27989,-17018,28001,-16999,28012,-16980,28024,-16961,28036,-16942,28047,-16923,28059,-16904,28070,-16884,28082,-16865,28093,-16846,28105,-16827,28116,-16808,28128,-16789,28139,-16769,28151,-16750,28162,-16731,28173,-16712,28185,-16693,28196,-16673,28208,-16654,28219,-16635,28230,-16616,28242,-16596,28253,-16577,28264,-16558,28275,-16539,28287,-16519,28298,-16500,28309,-16481,28321,-16461,28332,-16442,28343,-16423,28354,-16403,28365}; diff --git a/openair1/PHY/TOOLS/twiddle24576.h b/openair1/PHY/TOOLS/twiddle24576.h index b233990bea..7f5cdf0721 100644 --- a/openair1/PHY/TOOLS/twiddle24576.h +++ b/openair1/PHY/TOOLS/twiddle24576.h @@ -37,7 +37,7 @@ twb2(1:2:end) = real(twb); twb2(2:2:end) = imag(twb); - */ +*/ int16_t twa24576[16384] __attribute__((aligned(32))) = {32767,0,32766,-9,32766,-17,32766,-26,32766,-34,32766,-42,32766,-51,32766,-59,32766,-68,32766,-76,32766,-84,32766,-93,32766,-101,32766,-109,32766,-118,32766,-126,32766,-135,32766,-143,32766,-151,32766,-160,32766,-168,32766,-176,32766,-185,32766,-193,32766,-202,32766,-210,32766,-218,32766,-227,32766,-235,32766,-243,32766,-252,32765,-260,32765,-269,32765,-277,32765,-285,32765,-294,32765,-302,32765,-310,32765,-319,32765,-327,32765,-336,32765,-344,32765,-352,32765,-361,32764,-369,32764,-377,32764,-386,32764,-394,32764,-403,32764,-411,32764,-419,32764,-428,32764,-436,32763,-444,32763,-453,32763,-461,32763,-470,32763,-478,32763,-486,32763,-495,32763,-503,32763,-511,32762,-520,32762,-528,32762,-537,32762,-545,32762,-553,32762,-562,32762,-570,32761,-579,32761,-587,32761,-595,32761,-604,32761,-612,32761,-620,32760,-629,32760,-637,32760,-646,32760,-654,32760,-662,32760,-671,32759,-679,32759,-687,32759,-696,32759,-704,32759,-713,32759,-721,32758,-729,32758,-738,32758,-746,32758,-754,32758,-763,32757,-771,32757,-780,32757,-788,32757,-796,32757,-805,32756,-813,32756,-821,32756,-830,32756,-838,32756,-847,32755,-855,32755,-863,32755,-872,32755,-880,32754,-888,32754,-897,32754,-905,32754,-914,32754,-922,32753,-930,32753,-939,32753,-947,32753,-955,32752,-964,32752,-972,32752,-981,32752,-989,32751,-997,32751,-1006,32751,-1014,32751,-1022,32750,-1031,32750,-1039,32750,-1047,32750,-1056,32749,-1064,32749,-1073,32749,-1081,32748,-1089,32748,-1098,32748,-1106,32748,-1114,32747,-1123,32747,-1131,32747,-1140,32746,-1148,32746,-1156,32746,-1165,32746,-1173,32745,-1181,32745,-1190,32745,-1198,32744,-1207,32744,-1215,32744,-1223,32743,-1232,32743,-1240,32743,-1248,32742,-1257,32742,-1265,32742,-1274,32741,-1282,32741,-1290,32741,-1299,32740,-1307,32740,-1315,32740,-1324,32739,-1332,32739,-1340,32739,-1349,32738,-1357,32738,-1366,32738,-1374,32737,-1382,32737,-1391,32737,-1399,32736,-1407,32736,-1416,32736,-1424,32735,-1433,32735,-1441,32734,-1449,32734,-1458,32734,-1466,32733,-1474,32733,-1483,32733,-1491,32732,-1500,32732,-1508,32731,-1516,32731,-1525,32731,-1533,32730,-1541,32730,-1550,32729,-1558,32729,-1566,32729,-1575,32728,-1583,32728,-1592,32727,-1600,32727,-1608,32727,-1617,32726,-1625,32726,-1633,32725,-1642,32725,-1650,32725,-1659,32724,-1667,32724,-1675,32723,-1684,32723,-1692,32722,-1700,32722,-1709,32722,-1717,32721,-1725,32721,-1734,32720,-1742,32720,-1751,32719,-1759,32719,-1767,32718,-1776,32718,-1784,32717,-1792,32717,-1801,32717,-1809,32716,-1817,32716,-1826,32715,-1834,32715,-1843,32714,-1851,32714,-1859,32713,-1868,32713,-1876,32712,-1884,32712,-1893,32711,-1901,32711,-1909,32710,-1918,32710,-1926,32709,-1935,32709,-1943,32708,-1951,32708,-1960,32707,-1968,32707,-1976,32706,-1985,32706,-1993,32705,-2001,32705,-2010,32704,-2018,32704,-2027,32703,-2035,32703,-2043,32702,-2052,32702,-2060,32701,-2068,32701,-2077,32700,-2085,32700,-2093,32699,-2102,32699,-2110,32698,-2118,32697,-2127,32697,-2135,32696,-2144,32696,-2152,32695,-2160,32695,-2169,32694,-2177,32694,-2185,32693,-2194,32692,-2202,32692,-2210,32691,-2219,32691,-2227,32690,-2236,32690,-2244,32689,-2252,32688,-2261,32688,-2269,32687,-2277,32687,-2286,32686,-2294,32686,-2302,32685,-2311,32684,-2319,32684,-2327,32683,-2336,32683,-2344,32682,-2353,32681,-2361,32681,-2369,32680,-2378,32680,-2386,32679,-2394,32678,-2403,32678,-2411,32677,-2419,32676,-2428,32676,-2436,32675,-2444,32675,-2453,32674,-2461,32673,-2469,32673,-2478,32672,-2486,32671,-2495,32671,-2503,32670,-2511,32670,-2520,32669,-2528,32668,-2536,32668,-2545,32667,-2553,32666,-2561,32666,-2570,32665,-2578,32664,-2586,32664,-2595,32663,-2603,32662,-2611,32662,-2620,32661,-2628,32660,-2637,32660,-2645,32659,-2653,32658,-2662,32658,-2670,32657,-2678,32656,-2687,32656,-2695,32655,-2703,32654,-2712,32653,-2720,32653,-2728,32652,-2737,32651,-2745,32651,-2753,32650,-2762,32649,-2770,32649,-2778,32648,-2787,32647,-2795,32646,-2803,32646,-2812,32645,-2820,32644,-2829,32644,-2837,32643,-2845,32642,-2854,32641,-2862,32641,-2870,32640,-2879,32639,-2887,32638,-2895,32638,-2904,32637,-2912,32636,-2920,32635,-2929,32635,-2937,32634,-2945,32633,-2954,32632,-2962,32632,-2970,32631,-2979,32630,-2987,32629,-2995,32629,-3004,32628,-3012,32627,-3020,32626,-3029,32625,-3037,32625,-3045,32624,-3054,32623,-3062,32622,-3070,32622,-3079,32621,-3087,32620,-3095,32619,-3104,32618,-3112,32618,-3121,32617,-3129,32616,-3137,32615,-3146,32614,-3154,32614,-3162,32613,-3171,32612,-3179,32611,-3187,32610,-3196,32610,-3204,32609,-3212,32608,-3221,32607,-3229,32606,-3237,32605,-3246,32605,-3254,32604,-3262,32603,-3271,32602,-3279,32601,-3287,32600,-3296,32600,-3304,32599,-3312,32598,-3321,32597,-3329,32596,-3337,32595,-3346,32594,-3354,32594,-3362,32593,-3371,32592,-3379,32591,-3387,32590,-3396,32589,-3404,32588,-3412,32588,-3421,32587,-3429,32586,-3437,32585,-3446,32584,-3454,32583,-3462,32582,-3471,32581,-3479,32580,-3487,32580,-3496,32579,-3504,32578,-3512,32577,-3521,32576,-3529,32575,-3537,32574,-3546,32573,-3554,32572,-3562,32571,-3571,32571,-3579,32570,-3587,32569,-3595,32568,-3604,32567,-3612,32566,-3620,32565,-3629,32564,-3637,32563,-3645,32562,-3654,32561,-3662,32560,-3670,32559,-3679,32558,-3687,32558,-3695,32557,-3704,32556,-3712,32555,-3720,32554,-3729,32553,-3737,32552,-3745,32551,-3754,32550,-3762,32549,-3770,32548,-3779,32547,-3787,32546,-3795,32545,-3804,32544,-3812,32543,-3820,32542,-3829,32541,-3837,32540,-3845,32539,-3854,32538,-3862,32537,-3870,32536,-3878,32535,-3887,32534,-3895,32533,-3903,32532,-3912,32531,-3920,32530,-3928,32529,-3937,32528,-3945,32527,-3953,32526,-3962,32525,-3970,32524,-3978,32523,-3987,32522,-3995,32521,-4003,32520,-4012,32519,-4020,32518,-4028,32517,-4036,32516,-4045,32515,-4053,32514,-4061,32513,-4070,32512,-4078,32511,-4086,32510,-4095,32509,-4103,32508,-4111,32507,-4120,32506,-4128,32504,-4136,32503,-4145,32502,-4153,32501,-4161,32500,-4169,32499,-4178,32498,-4186,32497,-4194,32496,-4203,32495,-4211,32494,-4219,32493,-4228,32492,-4236,32491,-4244,32489,-4253,32488,-4261,32487,-4269,32486,-4277,32485,-4286,32484,-4294,32483,-4302,32482,-4311,32481,-4319,32480,-4327,32478,-4336,32477,-4344,32476,-4352,32475,-4360,32474,-4369,32473,-4377,32472,-4385,32471,-4394,32470,-4402,32468,-4410,32467,-4419,32466,-4427,32465,-4435,32464,-4444,32463,-4452,32462,-4460,32460,-4468,32459,-4477,32458,-4485,32457,-4493,32456,-4502,32455,-4510,32454,-4518,32452,-4526,32451,-4535,32450,-4543,32449,-4551,32448,-4560,32447,-4568,32445,-4576,32444,-4585,32443,-4593,32442,-4601,32441,-4609,32440,-4618,32438,-4626,32437,-4634,32436,-4643,32435,-4651,32434,-4659,32432,-4667,32431,-4676,32430,-4684,32429,-4692,32428,-4701,32426,-4709,32425,-4717,32424,-4726,32423,-4734,32422,-4742,32420,-4750,32419,-4759,32418,-4767,32417,-4775,32416,-4784,32414,-4792,32413,-4800,32412,-4808,32411,-4817,32409,-4825,32408,-4833,32407,-4842,32406,-4850,32404,-4858,32403,-4866,32402,-4875,32401,-4883,32399,-4891,32398,-4900,32397,-4908,32396,-4916,32394,-4924,32393,-4933,32392,-4941,32391,-4949,32389,-4958,32388,-4966,32387,-4974,32386,-4982,32384,-4991,32383,-4999,32382,-5007,32380,-5015,32379,-5024,32378,-5032,32377,-5040,32375,-5049,32374,-5057,32373,-5065,32371,-5073,32370,-5082,32369,-5090,32368,-5098,32366,-5107,32365,-5115,32364,-5123,32362,-5131,32361,-5140,32360,-5148,32358,-5156,32357,-5164,32356,-5173,32354,-5181,32353,-5189,32352,-5198,32350,-5206,32349,-5214,32348,-5222,32346,-5231,32345,-5239,32344,-5247,32342,-5255,32341,-5264,32340,-5272,32338,-5280,32337,-5288,32336,-5297,32334,-5305,32333,-5313,32332,-5322,32330,-5330,32329,-5338,32327,-5346,32326,-5355,32325,-5363,32323,-5371,32322,-5379,32321,-5388,32319,-5396,32318,-5404,32316,-5412,32315,-5421,32314,-5429,32312,-5437,32311,-5446,32310,-5454,32308,-5462,32307,-5470,32305,-5479,32304,-5487,32303,-5495,32301,-5503,32300,-5512,32298,-5520,32297,-5528,32295,-5536,32294,-5545,32293,-5553,32291,-5561,32290,-5569,32288,-5578,32287,-5586,32286,-5594,32284,-5602,32283,-5611,32281,-5619,32280,-5627,32278,-5635,32277,-5644,32275,-5652,32274,-5660,32273,-5668,32271,-5677,32270,-5685,32268,-5693,32267,-5701,32265,-5710,32264,-5718,32262,-5726,32261,-5734,32259,-5743,32258,-5751,32256,-5759,32255,-5767,32254,-5776,32252,-5784,32251,-5792,32249,-5800,32248,-5809,32246,-5817,32245,-5825,32243,-5833,32242,-5842,32240,-5850,32239,-5858,32237,-5866,32236,-5875,32234,-5883,32233,-5891,32231,-5899,32230,-5908,32228,-5916,32227,-5924,32225,-5932,32224,-5941,32222,-5949,32221,-5957,32219,-5965,32218,-5973,32216,-5982,32214,-5990,32213,-5998,32211,-6006,32210,-6015,32208,-6023,32207,-6031,32205,-6039,32204,-6048,32202,-6056,32201,-6064,32199,-6072,32197,-6081,32196,-6089,32194,-6097,32193,-6105,32191,-6113,32190,-6122,32188,-6130,32187,-6138,32185,-6146,32183,-6155,32182,-6163,32180,-6171,32179,-6179,32177,-6187,32176,-6196,32174,-6204,32172,-6212,32171,-6220,32169,-6229,32168,-6237,32166,-6245,32164,-6253,32163,-6262,32161,-6270,32160,-6278,32158,-6286,32156,-6294,32155,-6303,32153,-6311,32152,-6319,32150,-6327,32148,-6335,32147,-6344,32145,-6352,32143,-6360,32142,-6368,32140,-6377,32139,-6385,32137,-6393,32135,-6401,32134,-6409,32132,-6418,32130,-6426,32129,-6434,32127,-6442,32125,-6451,32124,-6459,32122,-6467,32120,-6475,32119,-6483,32117,-6492,32115,-6500,32114,-6508,32112,-6516,32110,-6524,32109,-6533,32107,-6541,32105,-6549,32104,-6557,32102,-6565,32100,-6574,32099,-6582,32097,-6590,32095,-6598,32094,-6607,32092,-6615,32090,-6623,32089,-6631,32087,-6639,32085,-6648,32084,-6656,32082,-6664,32080,-6672,32078,-6680,32077,-6689,32075,-6697,32073,-6705,32072,-6713,32070,-6721,32068,-6730,32066,-6738,32065,-6746,32063,-6754,32061,-6762,32059,-6771,32058,-6779,32056,-6787,32054,-6795,32053,-6803,32051,-6812,32049,-6820,32047,-6828,32046,-6836,32044,-6844,32042,-6852,32040,-6861,32039,-6869,32037,-6877,32035,-6885,32033,-6893,32032,-6902,32030,-6910,32028,-6918,32026,-6926,32024,-6934,32023,-6943,32021,-6951,32019,-6959,32017,-6967,32016,-6975,32014,-6983,32012,-6992,32010,-7000,32008,-7008,32007,-7016,32005,-7024,32003,-7033,32001,-7041,31999,-7049,31998,-7057,31996,-7065,31994,-7073,31992,-7082,31990,-7090,31989,-7098,31987,-7106,31985,-7114,31983,-7123,31981,-7131,31979,-7139,31978,-7147,31976,-7155,31974,-7163,31972,-7172,31970,-7180,31968,-7188,31967,-7196,31965,-7204,31963,-7212,31961,-7221,31959,-7229,31957,-7237,31956,-7245,31954,-7253,31952,-7262,31950,-7270,31948,-7278,31946,-7286,31944,-7294,31943,-7302,31941,-7311,31939,-7319,31937,-7327,31935,-7335,31933,-7343,31931,-7351,31929,-7359,31928,-7368,31926,-7376,31924,-7384,31922,-7392,31920,-7400,31918,-7408,31916,-7417,31914,-7425,31912,-7433,31911,-7441,31909,-7449,31907,-7457,31905,-7466,31903,-7474,31901,-7482,31899,-7490,31897,-7498,31895,-7506,31893,-7515,31891,-7523,31889,-7531,31888,-7539,31886,-7547,31884,-7555,31882,-7563,31880,-7572,31878,-7580,31876,-7588,31874,-7596,31872,-7604,31870,-7612,31868,-7620,31866,-7629,31864,-7637,31862,-7645,31860,-7653,31858,-7661,31856,-7669,31854,-7677,31853,-7686,31851,-7694,31849,-7702,31847,-7710,31845,-7718,31843,-7726,31841,-7734,31839,-7743,31837,-7751,31835,-7759,31833,-7767,31831,-7775,31829,-7783,31827,-7791,31825,-7800,31823,-7808,31821,-7816,31819,-7824,31817,-7832,31815,-7840,31813,-7848,31811,-7857,31809,-7865,31807,-7873,31805,-7881,31803,-7889,31801,-7897,31799,-7905,31797,-7913,31795,-7922,31793,-7930,31791,-7938,31789,-7946,31787,-7954,31785,-7962,31782,-7970,31780,-7978,31778,-7987,31776,-7995,31774,-8003,31772,-8011,31770,-8019,31768,-8027,31766,-8035,31764,-8043,31762,-8052,31760,-8060,31758,-8068,31756,-8076,31754,-8084,31752,-8092,31750,-8100,31748,-8108,31745,-8117,31743,-8125,31741,-8133,31739,-8141,31737,-8149,31735,-8157,31733,-8165,31731,-8173,31729,-8181,31727,-8190,31725,-8198,31723,-8206,31720,-8214,31718,-8222,31716,-8230,31714,-8238,31712,-8246,31710,-8254,31708,-8263,31706,-8271,31704,-8279,31701,-8287,31699,-8295,31697,-8303,31695,-8311,31693,-8319,31691,-8327,31689,-8335,31687,-8344,31684,-8352,31682,-8360,31680,-8368,31678,-8376,31676,-8384,31674,-8392,31672,-8400,31669,-8408,31667,-8416,31665,-8425,31663,-8433,31661,-8441,31659,-8449,31656,-8457,31654,-8465,31652,-8473,31650,-8481,31648,-8489,31646,-8497,31643,-8505,31641,-8514,31639,-8522,31637,-8530,31635,-8538,31633,-8546,31630,-8554,31628,-8562,31626,-8570,31624,-8578,31622,-8586,31619,-8594,31617,-8603,31615,-8611,31613,-8619,31611,-8627,31608,-8635,31606,-8643,31604,-8651,31602,-8659,31600,-8667,31597,-8675,31595,-8683,31593,-8691,31591,-8700,31588,-8708,31586,-8716,31584,-8724,31582,-8732,31580,-8740,31577,-8748,31575,-8756,31573,-8764,31571,-8772,31568,-8780,31566,-8788,31564,-8796,31562,-8804,31559,-8813,31557,-8821,31555,-8829,31553,-8837,31550,-8845,31548,-8853,31546,-8861,31544,-8869,31541,-8877,31539,-8885,31537,-8893,31534,-8901,31532,-8909,31530,-8917,31528,-8925,31525,-8933,31523,-8942,31521,-8950,31518,-8958,31516,-8966,31514,-8974,31512,-8982,31509,-8990,31507,-8998,31505,-9006,31502,-9014,31500,-9022,31498,-9030,31495,-9038,31493,-9046,31491,-9054,31489,-9062,31486,-9070,31484,-9078,31482,-9087,31479,-9095,31477,-9103,31475,-9111,31472,-9119,31470,-9127,31468,-9135,31465,-9143,31463,-9151,31461,-9159,31458,-9167,31456,-9175,31454,-9183,31451,-9191,31449,-9199,31446,-9207,31444,-9215,31442,-9223,31439,-9231,31437,-9239,31435,-9247,31432,-9255,31430,-9263,31428,-9271,31425,-9280,31423,-9288,31420,-9296,31418,-9304,31416,-9312,31413,-9320,31411,-9328,31409,-9336,31406,-9344,31404,-9352,31401,-9360,31399,-9368,31397,-9376,31394,-9384,31392,-9392,31389,-9400,31387,-9408,31385,-9416,31382,-9424,31380,-9432,31377,-9440,31375,-9448,31373,-9456,31370,-9464,31368,-9472,31365,-9480,31363,-9488,31360,-9496,31358,-9504,31356,-9512,31353,-9520,31351,-9528,31348,-9536,31346,-9544,31343,-9552,31341,-9560,31338,-9568,31336,-9576,31334,-9584,31331,-9592,31329,-9600,31326,-9608,31324,-9616,31321,-9624,31319,-9632,31316,-9640,31314,-9648,31311,-9656,31309,-9664,31307,-9672,31304,-9680,31302,-9688,31299,-9696,31297,-9704,31294,-9712,31292,-9720,31289,-9728,31287,-9736,31284,-9744,31282,-9752,31279,-9760,31277,-9768,31274,-9776,31272,-9784,31269,-9792,31267,-9800,31264,-9808,31262,-9816,31259,-9824,31257,-9832,31254,-9840,31252,-9848,31249,-9856,31247,-9864,31244,-9872,31242,-9880,31239,-9888,31236,-9896,31234,-9904,31231,-9912,31229,-9920,31226,-9928,31224,-9936,31221,-9944,31219,-9952,31216,-9960,31214,-9968,31211,-9976,31209,-9984,31206,-9992,31203,-10000,31201,-10008,31198,-10016,31196,-10024,31193,-10032,31191,-10040,31188,-10048,31185,-10056,31183,-10064,31180,-10072,31178,-10080,31175,-10088,31173,-10096,31170,-10104,31167,-10112,31165,-10120,31162,-10128,31160,-10136,31157,-10144,31154,-10152,31152,-10160,31149,-10167,31147,-10175,31144,-10183,31141,-10191,31139,-10199,31136,-10207,31134,-10215,31131,-10223,31128,-10231,31126,-10239,31123,-10247,31121,-10255,31118,-10263,31115,-10271,31113,-10279,31110,-10287,31107,-10295,31105,-10303,31102,-10311,31100,-10319,31097,-10327,31094,-10335,31092,-10343,31089,-10350,31086,-10358,31084,-10366,31081,-10374,31078,-10382,31076,-10390,31073,-10398,31070,-10406,31068,-10414,31065,-10422,31062,-10430,31060,-10438,31057,-10446,31054,-10454,31052,-10462,31049,-10470,31046,-10478,31044,-10485,31041,-10493,31038,-10501,31036,-10509,31033,-10517,31030,-10525,31028,-10533,31025,-10541,31022,-10549,31019,-10557,31017,-10565,31014,-10573,31011,-10581,31009,-10589,31006,-10597,31003,-10604,31001,-10612,30998,-10620,30995,-10628,30992,-10636,30990,-10644,30987,-10652,30984,-10660,30981,-10668,30979,-10676,30976,-10684,30973,-10692,30971,-10700,30968,-10707,30965,-10715,30962,-10723,30960,-10731,30957,-10739,30954,-10747,30951,-10755,30949,-10763,30946,-10771,30943,-10779,30940,-10787,30938,-10795,30935,-10802,30932,-10810,30929,-10818,30927,-10826,30924,-10834,30921,-10842,30918,-10850,30915,-10858,30913,-10866,30910,-10874,30907,-10881,30904,-10889,30902,-10897,30899,-10905,30896,-10913,30893,-10921,30890,-10929,30888,-10937,30885,-10945,30882,-10953,30879,-10960,30876,-10968,30874,-10976,30871,-10984,30868,-10992,30865,-11000,30862,-11008,30860,-11016,30857,-11024,30854,-11031,30851,-11039,30848,-11047,30845,-11055,30843,-11063,30840,-11071,30837,-11079,30834,-11087,30831,-11095,30828,-11102,30826,-11110,30823,-11118,30820,-11126,30817,-11134,30814,-11142,30811,-11150,30809,-11158,30806,-11165,30803,-11173,30800,-11181,30797,-11189,30794,-11197,30791,-11205,30788,-11213,30786,-11221,30783,-11228,30780,-11236,30777,-11244,30774,-11252,30771,-11260,30768,-11268,30766,-11276,30763,-11284,30760,-11291,30757,-11299,30754,-11307,30751,-11315,30748,-11323,30745,-11331,30742,-11339,30739,-11346,30737,-11354,30734,-11362,30731,-11370,30728,-11378,30725,-11386,30722,-11394,30719,-11401,30716,-11409,30713,-11417,30710,-11425,30707,-11433,30705,-11441,30702,-11449,30699,-11456,30696,-11464,30693,-11472,30690,-11480,30687,-11488,30684,-11496,30681,-11503,30678,-11511,30675,-11519,30672,-11527,30669,-11535,30666,-11543,30663,-11551,30660,-11558,30657,-11566,30655,-11574,30652,-11582,30649,-11590,30646,-11598,30643,-11605,30640,-11613,30637,-11621,30634,-11629,30631,-11637,30628,-11645,30625,-11652,30622,-11660,30619,-11668,30616,-11676,30613,-11684,30610,-11692,30607,-11699,30604,-11707,30601,-11715,30598,-11723,30595,-11731,30592,-11738,30589,-11746,30586,-11754,30583,-11762,30580,-11770,30577,-11778,30574,-11785,30571,-11793,30568,-11801,30565,-11809,30562,-11817,30559,-11824,30556,-11832,30553,-11840,30550,-11848,30547,-11856,30544,-11863,30541,-11871,30538,-11879,30535,-11887,30532,-11895,30528,-11903,30525,-11910,30522,-11918,30519,-11926,30516,-11934,30513,-11942,30510,-11949,30507,-11957,30504,-11965,30501,-11973,30498,-11981,30495,-11988,30492,-11996,30489,-12004,30486,-12012,30483,-12020,30480,-12027,30476,-12035,30473,-12043,30470,-12051,30467,-12058,30464,-12066,30461,-12074,30458,-12082,30455,-12090,30452,-12097,30449,-12105,30446,-12113,30442,-12121,30439,-12129,30436,-12136,30433,-12144,30430,-12152,30427,-12160,30424,-12167,30421,-12175,30418,-12183,30415,-12191,30411,-12199,30408,-12206,30405,-12214,30402,-12222,30399,-12230,30396,-12237,30393,-12245,30390,-12253,30386,-12261,30383,-12269,30380,-12276,30377,-12284,30374,-12292,30371,-12300,30368,-12307,30364,-12315,30361,-12323,30358,-12331,30355,-12338,30352,-12346,30349,-12354,30345,-12362,30342,-12369,30339,-12377,30336,-12385,30333,-12393,30330,-12400,30326,-12408,30323,-12416,30320,-12424,30317,-12431,30314,-12439,30311,-12447,30307,-12455,30304,-12462,30301,-12470,30298,-12478,30295,-12486,30291,-12493,30288,-12501,30285,-12509,30282,-12517,30279,-12524,30275,-12532,30272,-12540,30269,-12548,30266,-12555,30263,-12563,30259,-12571,30256,-12579,30253,-12586,30250,-12594,30247,-12602,30243,-12610,30240,-12617,30237,-12625,30234,-12633,30230,-12640,30227,-12648,30224,-12656,30221,-12664,30217,-12671,30214,-12679,30211,-12687,30208,-12695,30205,-12702,30201,-12710,30198,-12718,30195,-12725,30191,-12733,30188,-12741,30185,-12749,30182,-12756,30178,-12764,30175,-12772,30172,-12779,30169,-12787,30165,-12795,30162,-12803,30159,-12810,30156,-12818,30152,-12826,30149,-12833,30146,-12841,30142,-12849,30139,-12857,30136,-12864,30133,-12872,30129,-12880,30126,-12887,30123,-12895,30119,-12903,30116,-12910,30113,-12918,30109,-12926,30106,-12934,30103,-12941,30100,-12949,30096,-12957,30093,-12964,30090,-12972,30086,-12980,30083,-12987,30080,-12995,30076,-13003,30073,-13010,30070,-13018,30066,-13026,30063,-13034,30060,-13041,30056,-13049,30053,-13057,30050,-13064,30046,-13072,30043,-13080,30040,-13087,30036,-13095,30033,-13103,30030,-13110,30026,-13118,30023,-13126,30020,-13133,30016,-13141,30013,-13149,30009,-13156,30006,-13164,30003,-13172,29999,-13179,29996,-13187,29993,-13195,29989,-13202,29986,-13210,29983,-13218,29979,-13225,29976,-13233,29972,-13241,29969,-13248,29966,-13256,29962,-13264,29959,-13271,29955,-13279,29952,-13287,29949,-13294,29945,-13302,29942,-13310,29938,-13317,29935,-13325,29932,-13333,29928,-13340,29925,-13348,29921,-13356,29918,-13363,29915,-13371,29911,-13379,29908,-13386,29904,-13394,29901,-13401,29897,-13409,29894,-13417,29891,-13424,29887,-13432,29884,-13440,29880,-13447,29877,-13455,29873,-13463,29870,-13470,29866,-13478,29863,-13486,29860,-13493,29856,-13501,29853,-13508,29849,-13516,29846,-13524,29842,-13531,29839,-13539,29835,-13547,29832,-13554,29828,-13562,29825,-13569,29822,-13577,29818,-13585,29815,-13592,29811,-13600,29808,-13608,29804,-13615,29801,-13623,29797,-13630,29794,-13638,29790,-13646,29787,-13653,29783,-13661,29780,-13668,29776,-13676,29773,-13684,29769,-13691,29766,-13699,29762,-13707,29759,-13714,29755,-13722,29752,-13729,29748,-13737,29745,-13745,29741,-13752,29738,-13760,29734,-13767,29731,-13775,29727,-13783,29724,-13790,29720,-13798,29717,-13805,29713,-13813,29709,-13821,29706,-13828,29702,-13836,29699,-13843,29695,-13851,29692,-13859,29688,-13866,29685,-13874,29681,-13881,29678,-13889,29674,-13896,29670,-13904,29667,-13912,29663,-13919,29660,-13927,29656,-13934,29653,-13942,29649,-13950,29646,-13957,29642,-13965,29638,-13972,29635,-13980,29631,-13987,29628,-13995,29624,-14003,29621,-14010,29617,-14018,29613,-14025,29610,-14033,29606,-14040,29603,-14048,29599,-14056,29595,-14063,29592,-14071,29588,-14078,29585,-14086,29581,-14093,29577,-14101,29574,-14109,29570,-14116,29567,-14124,29563,-14131,29559,-14139,29556,-14146,29552,-14154,29548,-14161,29545,-14169,29541,-14177,29538,-14184,29534,-14192,29530,-14199,29527,-14207,29523,-14214,29519,-14222,29516,-14229,29512,-14237,29509,-14245,29505,-14252,29501,-14260,29498,-14267,29494,-14275,29490,-14282,29487,-14290,29483,-14297,29479,-14305,29476,-14312,29472,-14320,29468,-14327,29465,-14335,29461,-14343,29457,-14350,29454,-14358,29450,-14365,29446,-14373,29443,-14380,29439,-14388,29435,-14395,29432,-14403,29428,-14410,29424,-14418,29421,-14425,29417,-14433,29413,-14440,29410,-14448,29406,-14455,29402,-14463,29398,-14470,29395,-14478,29391,-14485,29387,-14493,29384,-14500,29380,-14508,29376,-14516,29372,-14523,29369,-14531,29365,-14538,29361,-14546,29358,-14553,29354,-14561,29350,-14568,29346,-14576,29343,-14583,29339,-14591,29335,-14598,29332,-14606,29328,-14613,29324,-14621,29320,-14628,29317,-14636,29313,-14643,29309,-14651,29305,-14658,29302,-14666,29298,-14673,29294,-14681,29290,-14688,29287,-14695,29283,-14703,29279,-14710,29275,-14718,29272,-14725,29268,-14733,29264,-14740,29260,-14748,29256,-14755,29253,-14763,29249,-14770,29245,-14778,29241,-14785,29238,-14793,29234,-14800,29230,-14808,29226,-14815,29222,-14823,29219,-14830,29215,-14838,29211,-14845,29207,-14853,29203,-14860,29200,-14867,29196,-14875,29192,-14882,29188,-14890,29184,-14897,29181,-14905,29177,-14912,29173,-14920,29169,-14927,29165,-14935,29162,-14942,29158,-14950,29154,-14957,29150,-14964,29146,-14972,29142,-14979,29139,-14987,29135,-14994,29131,-15002,29127,-15009,29123,-15017,29119,-15024,29116,-15031,29112,-15039,29108,-15046,29104,-15054,29100,-15061,29096,-15069,29092,-15076,29089,-15084,29085,-15091,29081,-15098,29077,-15106,29073,-15113,29069,-15121,29065,-15128,29062,-15136,29058,-15143,29054,-15150,29050,-15158,29046,-15165,29042,-15173,29038,-15180,29034,-15188,29031,-15195,29027,-15202,29023,-15210,29019,-15217,29015,-15225,29011,-15232,29007,-15239,29003,-15247,28999,-15254,28996,-15262,28992,-15269,28988,-15277,28984,-15284,28980,-15291,28976,-15299,28972,-15306,28968,-15314,28964,-15321,28960,-15328,28956,-15336,28953,-15343,28949,-15351,28945,-15358,28941,-15365,28937,-15373,28933,-15380,28929,-15388,28925,-15395,28921,-15402,28917,-15410,28913,-15417,28909,-15425,28905,-15432,28901,-15439,28897,-15447,28893,-15454,28890,-15462,28886,-15469,28882,-15476,28878,-15484,28874,-15491,28870,-15498,28866,-15506,28862,-15513,28858,-15521,28854,-15528,28850,-15535,28846,-15543,28842,-15550,28838,-15557,28834,-15565,28830,-15572,28826,-15580,28822,-15587,28818,-15594,28814,-15602,28810,-15609,28806,-15616,28802,-15624,28798,-15631,28794,-15639,28790,-15646,28786,-15653,28782,-15661,28778,-15668,28774,-15675,28770,-15683,28766,-15690,28762,-15697,28758,-15705,28754,-15712,28750,-15719,28746,-15727,28742,-15734,28738,-15741,28734,-15749,28730,-15756,28726,-15764,28722,-15771,28718,-15778,28714,-15786,28710,-15793,28706,-15800,28702,-15808,28698,-15815,28694,-15822,28690,-15830,28685,-15837,28681,-15844,28677,-15852,28673,-15859,28669,-15866,28665,-15874,28661,-15881,28657,-15888,28653,-15896,28649,-15903,28645,-15910,28641,-15918,28637,-15925,28633,-15932,28629,-15939,28625,-15947,28620,-15954,28616,-15961,28612,-15969,28608,-15976,28604,-15983,28600,-15991,28596,-15998,28592,-16005,28588,-16013,28584,-16020,28580,-16027,28575,-16035,28571,-16042,28567,-16049,28563,-16056,28559,-16064,28555,-16071,28551,-16078,28547,-16086,28543,-16093,28538,-16100,28534,-16108,28530,-16115,28526,-16122,28522,-16129,28518,-16137,28514,-16144,28510,-16151,28506,-16159,28501,-16166,28497,-16173,28493,-16180,28489,-16188,28485,-16195,28481,-16202,28477,-16210,28472,-16217,28468,-16224,28464,-16231,28460,-16239,28456,-16246,28452,-16253,28447,-16261,28443,-16268,28439,-16275,28435,-16282,28431,-16290,28427,-16297,28423,-16304,28418,-16311,28414,-16319,28410,-16326,28406,-16333,28402,-16340,28397,-16348,28393,-16355,28389,-16362,28385,-16369,28381,-16377,28377,-16384,28372,-16391,28368,-16399,28364,-16406,28360,-16413,28356,-16420,28351,-16428,28347,-16435,28343,-16442,28339,-16449,28335,-16456,28330,-16464,28326,-16471,28322,-16478,28318,-16485,28314,-16493,28309,-16500,28305,-16507,28301,-16514,28297,-16522,28292,-16529,28288,-16536,28284,-16543,28280,-16551,28275,-16558,28271,-16565,28267,-16572,28263,-16579,28259,-16587,28254,-16594,28250,-16601,28246,-16608,28242,-16616,28237,-16623,28233,-16630,28229,-16637,28225,-16644,28220,-16652,28216,-16659,28212,-16666,28208,-16673,28203,-16681,28199,-16688,28195,-16695,28190,-16702,28186,-16709,28182,-16717,28178,-16724,28173,-16731,28169,-16738,28165,-16745,28161,-16753,28156,-16760,28152,-16767,28148,-16774,28143,-16781,28139,-16789,28135,-16796,28131,-16803,28126,-16810,28122,-16817,28118,-16825,28113,-16832,28109,-16839,28105,-16846,28100,-16853,28096,-16860,28092,-16868,28087,-16875,28083,-16882,28079,-16889,28075,-16896,28070,-16904,28066,-16911,28062,-16918,28057,-16925,28053,-16932,28049,-16939,28044,-16947,28040,-16954,28036,-16961,28031,-16968,28027,-16975,28023,-16982,28018,-16990,28014,-16997,28009,-17004,28005,-17011,28001,-17018,27996,-17025,27992,-17033,27988,-17040,27983,-17047,27979,-17054,27975,-17061,27970,-17068,27966,-17075,27962,-17083,27957,-17090,27953,-17097,27948,-17104,27944,-17111,27940,-17118,27935,-17125,27931,-17133,27927,-17140,27922,-17147,27918,-17154,27913,-17161,27909,-17168,27905,-17175,27900,-17183,27896,-17190,27891,-17197,27887,-17204,27883,-17211,27878,-17218,27874,-17225,27869,-17233,27865,-17240,27861,-17247,27856,-17254,27852,-17261,27847,-17268,27843,-17275,27839,-17282,27834,-17289,27830,-17297,27825,-17304,27821,-17311,27816,-17318,27812,-17325,27808,-17332,27803,-17339,27799,-17346,27794,-17353,27790,-17361,27785,-17368,27781,-17375,27777,-17382,27772,-17389,27768,-17396,27763,-17403,27759,-17410,27754,-17417,27750,-17424,27745,-17432,27741,-17439,27736,-17446,27732,-17453,27728,-17460,27723,-17467,27719,-17474,27714,-17481,27710,-17488,27705,-17495,27701,-17502,27696,-17510,27692,-17517,27687,-17524,27683,-17531,27678,-17538,27674,-17545,27669,-17552,27665,-17559,27660,-17566,27656,-17573,27651,-17580,27647,-17587,27642,-17594,27638,-17601,27633,-17609,27629,-17616,27624,-17623,27620,-17630,27615,-17637,27611,-17644,27606,-17651,27602,-17658,27597,-17665,27593,-17672,27588,-17679,27584,-17686,27579,-17693,27575,-17700,27570,-17707,27566,-17714,27561,-17721,27557,-17728,27552,-17736,27548,-17743,27543,-17750,27538,-17757,27534,-17764,27529,-17771,27525,-17778,27520,-17785,27516,-17792,27511,-17799,27507,-17806,27502,-17813,27498,-17820,27493,-17827,27488,-17834,27484,-17841,27479,-17848,27475,-17855,27470,-17862,27466,-17869,27461,-17876,27456,-17883,27452,-17890,27447,-17897,27443,-17904,27438,-17911,27434,-17918,27429,-17925,27424,-17932,27420,-17939,27415,-17946,27411,-17953,27406,-17960,27401,-17967,27397,-17974,27392,-17981,27388,-17988,27383,-17995,27378,-18002,27374,-18009,27369,-18016,27365,-18023,27360,-18030,27355,-18037,27351,-18044,27346,-18051,27342,-18058,27337,-18065,27332,-18072,27328,-18079,27323,-18086,27319,-18093,27314,-18100,27309,-18107,27305,-18114,27300,-18121,27295,-18128,27291,-18135,27286,-18142,27281,-18149,27277,-18156,27272,-18163,27268,-18170,27263,-18177,27258,-18184,27254,-18191,27249,-18198,27244,-18205,27240,-18212,27235,-18219,27230,-18226,27226,-18233,27221,-18240,27216,-18247,27212,-18254,27207,-18261,27202,-18268,27198,-18274,27193,-18281,27188,-18288,27184,-18295,27179,-18302,27174,-18309,27170,-18316,27165,-18323,27160,-18330,27156,-18337,27151,-18344,27146,-18351,27141,-18358,27137,-18365,27132,-18372,27127,-18379,27123,-18386,27118,-18393,27113,-18399,27109,-18406,27104,-18413,27099,-18420,27094,-18427,27090,-18434,27085,-18441,27080,-18448,27076,-18455,27071,-18462,27066,-18469,27061,-18476,27057,-18483,27052,-18489,27047,-18496,27042,-18503,27038,-18510,27033,-18517,27028,-18524,27024,-18531,27019,-18538,27014,-18545,27009,-18552,27005,-18559,27000,-18565,26995,-18572,26990,-18579,26986,-18586,26981,-18593,26976,-18600,26971,-18607,26967,-18614,26962,-18621,26957,-18628,26952,-18634,26948,-18641,26943,-18648,26938,-18655,26933,-18662,26928,-18669,26924,-18676,26919,-18683,26914,-18690,26909,-18696,26905,-18703,26900,-18710,26895,-18717,26890,-18724,26885,-18731,26881,-18738,26876,-18745,26871,-18751,26866,-18758,26861,-18765,26857,-18772,26852,-18779,26847,-18786,26842,-18793,26837,-18799,26833,-18806,26828,-18813,26823,-18820,26818,-18827,26813,-18834,26809,-18841,26804,-18847,26799,-18854,26794,-18861,26789,-18868,26784,-18875,26780,-18882,26775,-18889,26770,-18895,26765,-18902,26760,-18909,26755,-18916,26751,-18923,26746,-18930,26741,-18936,26736,-18943,26731,-18950,26726,-18957,26722,-18964,26717,-18971,26712,-18977,26707,-18984,26702,-18991,26697,-18998,26692,-19005,26688,-19012,26683,-19018,26678,-19025,26673,-19032,26668,-19039,26663,-19046,26658,-19052,26654,-19059,26649,-19066,26644,-19073,26639,-19080,26634,-19087,26629,-19093,26624,-19100,26619,-19107,26615,-19114,26610,-19121,26605,-19127,26600,-19134,26595,-19141,26590,-19148,26585,-19155,26580,-19161,26575,-19168,26570,-19175,26566,-19182,26561,-19189,26556,-19195,26551,-19202,26546,-19209,26541,-19216,26536,-19222,26531,-19229,26526,-19236,26521,-19243,26516,-19250,26512,-19256,26507,-19263,26502,-19270,26497,-19277,26492,-19283,26487,-19290,26482,-19297,26477,-19304,26472,-19311,26467,-19317,26462,-19324,26457,-19331,26452,-19338,26447,-19344,26442,-19351,26437,-19358,26433,-19365,26428,-19371,26423,-19378,26418,-19385,26413,-19392,26408,-19398,26403,-19405,26398,-19412,26393,-19419,26388,-19425,26383,-19432,26378,-19439,26373,-19446,26368,-19452,26363,-19459,26358,-19466,26353,-19473,26348,-19479,26343,-19486,26338,-19493,26333,-19500,26328,-19506,26323,-19513,26318,-19520,26313,-19527,26308,-19533,26303,-19540,26298,-19547,26293,-19553,26288,-19560,26283,-19567,26278,-19574,26273,-19580,26268,-19587,26263,-19594,26258,-19600,26253,-19607,26248,-19614,26243,-19621,26238,-19627,26233,-19634,26228,-19641,26223,-19647,26218,-19654,26213,-19661,26208,-19668,26203,-19674,26198,-19681,26193,-19688,26188,-19694,26183,-19701,26178,-19708,26173,-19714,26168,-19721,26163,-19728,26158,-19734,26153,-19741,26148,-19748,26142,-19755,26137,-19761,26132,-19768,26127,-19775,26122,-19781,26117,-19788,26112,-19795,26107,-19801,26102,-19808,26097,-19815,26092,-19821,26087,-19828,26082,-19835,26077,-19841,26072,-19848,26067,-19855,26061,-19861,26056,-19868,26051,-19875,26046,-19881,26041,-19888,26036,-19895,26031,-19901,26026,-19908,26021,-19915,26016,-19921,26011,-19928,26006,-19934,26000,-19941,25995,-19948,25990,-19954,25985,-19961,25980,-19968,25975,-19974,25970,-19981,25965,-19988,25960,-19994,25954,-20001,25949,-20008,25944,-20014,25939,-20021,25934,-20027,25929,-20034,25924,-20041,25919,-20047,25913,-20054,25908,-20061,25903,-20067,25898,-20074,25893,-20080,25888,-20087,25883,-20094,25878,-20100,25872,-20107,25867,-20114,25862,-20120,25857,-20127,25852,-20133,25847,-20140,25842,-20147,25836,-20153,25831,-20160,25826,-20166,25821,-20173,25816,-20180,25811,-20186,25805,-20193,25800,-20199,25795,-20206,25790,-20213,25785,-20219,25780,-20226,25774,-20232,25769,-20239,25764,-20246,25759,-20252,25754,-20259,25749,-20265,25743,-20272,25738,-20278,25733,-20285,25728,-20292,25723,-20298,25717,-20305,25712,-20311,25707,-20318,25702,-20324,25697,-20331,25691,-20338,25686,-20344,25681,-20351,25676,-20357,25671,-20364,25665,-20370,25660,-20377,25655,-20384,25650,-20390,25645,-20397,25639,-20403,25634,-20410,25629,-20416,25624,-20423,25619,-20429,25613,-20436,25608,-20443,25603,-20449,25598,-20456,25592,-20462,25587,-20469,25582,-20475,25577,-20482,25571,-20488,25566,-20495,25561,-20501,25556,-20508,25550,-20514,25545,-20521,25540,-20528,25535,-20534,25529,-20541,25524,-20547,25519,-20554,25514,-20560,25508,-20567,25503,-20573,25498,-20580,25493,-20586,25487,-20593,25482,-20599,25477,-20606,25472,-20612,25466,-20619,25461,-20625,25456,-20632,25451,-20638,25445,-20645,25440,-20651,25435,-20658,25429,-20664,25424,-20671,25419,-20677,25414,-20684,25408,-20690,25403,-20697,25398,-20703,25392,-20710,25387,-20716,25382,-20723,25376,-20729,25371,-20736,25366,-20742,25361,-20749,25355,-20755,25350,-20762,25345,-20768,25339,-20775,25334,-20781,25329,-20788,25323,-20794,25318,-20801,25313,-20807,25307,-20814,25302,-20820,25297,-20826,25291,-20833,25286,-20839,25281,-20846,25276,-20852,25270,-20859,25265,-20865,25260,-20872,25254,-20878,25249,-20885,25243,-20891,25238,-20898,25233,-20904,25227,-20910,25222,-20917,25217,-20923,25211,-20930,25206,-20936,25201,-20943,25195,-20949,25190,-20956,25185,-20962,25179,-20968,25174,-20975,25169,-20981,25163,-20988,25158,-20994,25152,-21001,25147,-21007,25142,-21013,25136,-21020,25131,-21026,25126,-21033,25120,-21039,25115,-21046,25109,-21052,25104,-21058,25099,-21065,25093,-21071,25088,-21078,25083,-21084,25077,-21091,25072,-21097,25066,-21103,25061,-21110,25056,-21116,25050,-21123,25045,-21129,25039,-21135,25034,-21142,25029,-21148,25023,-21155,25018,-21161,25012,-21167,25007,-21174,25001,-21180,24996,-21187,24991,-21193,24985,-21199,24980,-21206,24974,-21212,24969,-21218,24964,-21225,24958,-21231,24953,-21238,24947,-21244,24942,-21250,24936,-21257,24931,-21263,24926,-21269,24920,-21276,24915,-21282,24909,-21289,24904,-21295,24898,-21301,24893,-21308,24887,-21314,24882,-21320,24877,-21327,24871,-21333,24866,-21340,24860,-21346,24855,-21352,24849,-21359,24844,-21365,24838,-21371,24833,-21378,24827,-21384,24822,-21390,24816,-21397,24811,-21403,24805,-21409,24800,-21416,24795,-21422,24789,-21428,24784,-21435,24778,-21441,24773,-21447,24767,-21454,24762,-21460,24756,-21466,24751,-21473,24745,-21479,24740,-21485,24734,-21492,24729,-21498,24723,-21504,24718,-21511,24712,-21517,24707,-21523,24701,-21530,24696,-21536,24690,-21542,24685,-21549,24679,-21555,24674,-21561,24668,-21567,24663,-21574,24657,-21580,24652,-21586,24646,-21593,24641,-21599,24635,-21605,24630,-21612,24624,-21618,24618,-21624,24613,-21630,24607,-21637,24602,-21643,24596,-21649,24591,-21656,24585,-21662,24580,-21668,24574,-21674,24569,-21681,24563,-21687,24558,-21693,24552,-21700,24546,-21706,24541,-21712,24535,-21718,24530,-21725,24524,-21731,24519,-21737,24513,-21744,24508,-21750,24502,-21756,24496,-21762,24491,-21769,24485,-21775,24480,-21781,24474,-21787,24469,-21794,24463,-21800,24457,-21806,24452,-21812,24446,-21819,24441,-21825,24435,-21831,24430,-21837,24424,-21844,24418,-21850,24413,-21856,24407,-21862,24402,-21869,24396,-21875,24390,-21881,24385,-21887,24379,-21894,24374,-21900,24368,-21906,24362,-21912,24357,-21918,24351,-21925,24346,-21931,24340,-21937,24334,-21943,24329,-21950,24323,-21956,24318,-21962,24312,-21968,24306,-21974,24301,-21981,24295,-21987,24289,-21993,24284,-21999,24278,-22005,24273,-22012,24267,-22018,24261,-22024,24256,-22030,24250,-22036,24244,-22043,24239,-22049,24233,-22055,24228,-22061,24222,-22067,24216,-22074,24211,-22080,24205,-22086,24199,-22092,24194,-22098,24188,-22105,24182,-22111,24177,-22117,24171,-22123,24165,-22129,24160,-22136,24154,-22142,24148,-22148,24143,-22154,24137,-22160,24131,-22166,24126,-22173,24120,-22179,24114,-22185,24109,-22191,24103,-22197,24097,-22203,24092,-22210,24086,-22216,24080,-22222,24075,-22228,24069,-22234,24063,-22240,24058,-22246,24052,-22253,24046,-22259,24041,-22265,24035,-22271,24029,-22277,24023,-22283,24018,-22289,24012,-22296,24006,-22302,24001,-22308,23995,-22314,23989,-22320,23984,-22326,23978,-22332,23972,-22339,23966,-22345,23961,-22351,23955,-22357,23949,-22363,23944,-22369,23938,-22375,23932,-22381,23926,-22388,23921,-22394,23915,-22400,23909,-22406,23903,-22412,23898,-22418,23892,-22424,23886,-22430,23881,-22436,23875,-22443,23869,-22449,23863,-22455,23858,-22461,23852,-22467,23846,-22473,23840,-22479,23835,-22485,23829,-22491,23823,-22497,23817,-22504,23812,-22510,23806,-22516,23800,-22522,23794,-22528,23789,-22534,23783,-22540,23777,-22546,23771,-22552,23766,-22558,23760,-22564,23754,-22570,23748,-22576,23742,-22583,23737,-22589,23731,-22595,23725,-22601,23719,-22607,23714,-22613,23708,-22619,23702,-22625,23696,-22631,23690,-22637,23685,-22643,23679,-22649,23673,-22655,23667,-22661,23661,-22667,23656,-22673,23650,-22679,23644,-22686,23638,-22692,23632,-22698,23627,-22704,23621,-22710,23615,-22716,23609,-22722,23603,-22728,23598,-22734,23592,-22740,23586,-22746,23580,-22752,23574,-22758,23569,-22764,23563,-22770,23557,-22776,23551,-22782,23545,-22788,23539,-22794,23534,-22800,23528,-22806,23522,-22812,23516,-22818,23510,-22824,23504,-22830,23499,-22836,23493,-22842,23487,-22848,23481,-22854,23475,-22860,23469,-22866,23464,-22872,23458,-22878,23452,-22884,23446,-22890,23440,-22896,23434,-22902,23428,-22908,23423,-22914,23417,-22920,23411,-22926,23405,-22932,23399,-22938,23393,-22944,23387,-22950,23382,-22956,23376,-22962,23370,-22968,23364,-22974,23358,-22980,23352,-22986,23346,-22992,23340,-22998,23335,-23004,23329,-23010,23323,-23016,23317,-23022,23311,-23028,23305,-23034,23299,-23040,23293,-23046,23287,-23051,23282,-23057,23276,-23063,23270,-23069,23264,-23075,23258,-23081,23252,-23087,23246,-23093,23240,-23099,23234,-23105,23228,-23111,23223,-23117,23217,-23123,23211,-23129,23205,-23135,23199,-23141,23193,-23147,23187,-23152,23181,-23158,23175,-23164,23169,-23170,23163,-23176,23157,-23182,23151,-23188,23146,-23194,23140,-23200,23134,-23206,23128,-23212,23122,-23218,23116,-23224,23110,-23229,23104,-23235,23098,-23241,23092,-23247,23086,-23253,23080,-23259,23074,-23265,23068,-23271,23062,-23277,23056,-23283,23050,-23288,23045,-23294,23039,-23300,23033,-23306,23027,-23312,23021,-23318,23015,-23324,23009,-23330,23003,-23336,22997,-23341,22991,-23347,22985,-23353,22979,-23359,22973,-23365,22967,-23371,22961,-23377,22955,-23383,22949,-23388,22943,-23394,22937,-23400,22931,-23406,22925,-23412,22919,-23418,22913,-23424,22907,-23429,22901,-23435,22895,-23441,22889,-23447,22883,-23453,22877,-23459,22871,-23465,22865,-23470,22859,-23476,22853,-23482,22847,-23488,22841,-23494,22835,-23500,22829,-23505,22823,-23511,22817,-23517,22811,-23523,22805,-23529,22799,-23535,22793,-23540,22787,-23546,22781,-23552,22775,-23558,22769,-23564,22763,-23570,22757,-23575,22751,-23581,22745,-23587,22739,-23593,22733,-23599,22727,-23604,22721,-23610,22715,-23616,22709,-23622,22703,-23628,22697,-23633,22691,-23639,22685,-23645,22678,-23651,22672,-23657,22666,-23662,22660,-23668,22654,-23674,22648,-23680,22642,-23686,22636,-23691,22630,-23697,22624,-23703,22618,-23709,22612,-23715,22606,-23720,22600,-23726,22594,-23732,22588,-23738,22582,-23743,22575,-23749,22569,-23755,22563,-23761,22557,-23767,22551,-23772,22545,-23778,22539,-23784,22533,-23790,22527,-23795,22521,-23801,22515,-23807,22509,-23813,22503,-23818,22496,-23824,22490,-23830,22484,-23836,22478,-23841,22472,-23847,22466,-23853,22460,-23859,22454,-23864,22448,-23870,22442,-23876,22435,-23882,22429,-23887,22423,-23893,22417,-23899,22411,-23904,22405,-23910,22399,-23916,22393,-23922,22387,-23927,22380,-23933,22374,-23939,22368,-23945,22362,-23950,22356,-23956,22350,-23962,22344,-23967,22338,-23973,22331,-23979,22325,-23985,22319,-23990,22313,-23996,22307,-24002,22301,-24007,22295,-24013,22288,-24019,22282,-24024,22276,-24030,22270,-24036,22264,-24042,22258,-24047,22252,-24053,22245,-24059,22239,-24064,22233,-24070,22227,-24076,22221,-24081,22215,-24087,22209,-24093,22202,-24098,22196,-24104,22190,-24110,22184,-24115,22178,-24121,22172,-24127,22165,-24132,22159,-24138,22153,-24144,22147,-24149,22141,-24155,22135,-24161,22128,-24166,22122,-24172,22116,-24178,22110,-24183,22104,-24189,22097,-24195,22091,-24200,22085,-24206,22079,-24212,22073,-24217,22066,-24223,22060,-24229,22054,-24234,22048,-24240,22042,-24245,22035,-24251,22029,-24257,22023,-24262,22017,-24268,22011,-24274,22004,-24279,21998,-24285,21992,-24290,21986,-24296,21980,-24302,21973,-24307,21967,-24313,21961,-24319,21955,-24324,21949,-24330,21942,-24335,21936,-24341,21930,-24347,21924,-24352,21917,-24358,21911,-24363,21905,-24369,21899,-24375,21893,-24380,21886,-24386,21880,-24391,21874,-24397,21868,-24403,21861,-24408,21855,-24414,21849,-24419,21843,-24425,21836,-24431,21830,-24436,21824,-24442,21818,-24447,21811,-24453,21805,-24458,21799,-24464,21793,-24470,21786,-24475,21780,-24481,21774,-24486,21768,-24492,21761,-24497,21755,-24503,21749,-24509,21743,-24514,21736,-24520,21730,-24525,21724,-24531,21717,-24536,21711,-24542,21705,-24547,21699,-24553,21692,-24559,21686,-24564,21680,-24570,21673,-24575,21667,-24581,21661,-24586,21655,-24592,21648,-24597,21642,-24603,21636,-24608,21629,-24614,21623,-24619,21617,-24625,21611,-24631,21604,-24636,21598,-24642,21592,-24647,21585,-24653,21579,-24658,21573,-24664,21566,-24669,21560,-24675,21554,-24680,21548,-24686,21541,-24691,21535,-24697,21529,-24702,21522,-24708,21516,-24713,21510,-24719,21503,-24724,21497,-24730,21491,-24735,21484,-24741,21478,-24746,21472,-24752,21465,-24757,21459,-24763,21453,-24768,21446,-24774,21440,-24779,21434,-24785,21427,-24790,21421,-24796,21415,-24801,21408,-24806,21402,-24812,21396,-24817,21389,-24823,21383,-24828,21377,-24834,21370,-24839,21364,-24845,21358,-24850,21351,-24856,21345,-24861,21339,-24867,21332,-24872,21326,-24878,21319,-24883,21313,-24888,21307,-24894,21300,-24899,21294,-24905,21288,-24910,21281,-24916,21275,-24921,21268,-24927,21262,-24932,21256,-24937,21249,-24943,21243,-24948,21237,-24954,21230,-24959,21224,-24965,21217,-24970,21211,-24975,21205,-24981,21198,-24986,21192,-24992,21186,-24997,21179,-25002,21173,-25008,21166,-25013,21160,-25019,21154,-25024,21147,-25030,21141,-25035,21134,-25040,21128,-25046,21122,-25051,21115,-25057,21109,-25062,21102,-25067,21096,-25073,21090,-25078,21083,-25084,21077,-25089,21070,-25094,21064,-25100,21057,-25105,21051,-25110,21045,-25116,21038,-25121,21032,-25127,21025,-25132,21019,-25137,21012,-25143,21006,-25148,21000,-25153,20993,-25159,20987,-25164,20980,-25170,20974,-25175,20967,-25180,20961,-25186,20955,-25191,20948,-25196,20942,-25202,20935,-25207,20929,-25212,20922,-25218,20916,-25223,20909,-25228,20903,-25234,20897,-25239,20890,-25244,20884,-25250,20877,-25255,20871,-25261,20864,-25266,20858,-25271,20851,-25277,20845,-25282,20838,-25287,20832,-25292,20825,-25298,20819,-25303,20813,-25308,20806,-25314,20800,-25319,20793,-25324,20787,-25330,20780,-25335,20774,-25340,20767,-25346,20761,-25351,20754,-25356,20748,-25362,20741,-25367,20735,-25372,20728,-25377,20722,-25383,20715,-25388,20709,-25393,20702,-25399,20696,-25404,20689,-25409,20683,-25415,20676,-25420,20670,-25425,20663,-25430,20657,-25436,20650,-25441,20644,-25446,20637,-25452,20631,-25457,20624,-25462,20618,-25467,20611,-25473,20605,-25478,20598,-25483,20592,-25488,20585,-25494,20579,-25499,20572,-25504,20566,-25509,20559,-25515,20553,-25520,20546,-25525,20540,-25530,20533,-25536,20527,-25541,20520,-25546,20513,-25551,20507,-25557,20500,-25562,20494,-25567,20487,-25572,20481,-25578,20474,-25583,20468,-25588,20461,-25593,20455,-25599,20448,-25604,20442,-25609,20435,-25614,20428,-25620,20422,-25625,20415,-25630,20409,-25635,20402,-25640,20396,-25646,20389,-25651,20383,-25656,20376,-25661,20369,-25666,20363,-25672,20356,-25677,20350,-25682,20343,-25687,20337,-25692,20330,-25698,20323,-25703,20317,-25708,20310,-25713,20304,-25718,20297,-25724,20291,-25729,20284,-25734,20277,-25739,20271,-25744,20264,-25750,20258,-25755,20251,-25760,20245,-25765,20238,-25770,20231,-25775,20225,-25781,20218,-25786,20212,-25791,20205,-25796,20198,-25801,20192,-25806,20185,-25812,20179,-25817,20172,-25822,20165,-25827,20159,-25832,20152,-25837,20146,-25843,20139,-25848,20132,-25853,20126,-25858,20119,-25863,20113,-25868,20106,-25873,20099,-25879,20093,-25884,20086,-25889,20079,-25894,20073,-25899,20066,-25904,20060,-25909,20053,-25914,20046,-25920,20040,-25925,20033,-25930,20026,-25935,20020,-25940,20013,-25945,20007,-25950,20000,-25955,19993,-25961,19987,-25966,19980,-25971,19973,-25976,19967,-25981,19960,-25986,19953,-25991,19947,-25996,19940,-26001,19933,-26007,19927,-26012,19920,-26017,19914,-26022,19907,-26027,19900,-26032,19894,-26037,19887,-26042,19880,-26047,19874,-26052,19867,-26057,19860,-26062,19854,-26068,19847,-26073,19840,-26078,19834,-26083,19827,-26088,19820,-26093,19814,-26098,19807,-26103,19800,-26108,19794,-26113,19787,-26118,19780,-26123,19774,-26128,19767,-26133,19760,-26138,19754,-26143,19747,-26149,19740,-26154,19733,-26159,19727,-26164,19720,-26169,19713,-26174,19707,-26179,19700,-26184,19693,-26189,19687,-26194,19680,-26199,19673,-26204,19667,-26209,19660,-26214,19653,-26219,19646,-26224,19640,-26229,19633,-26234,19626,-26239,19620,-26244,19613,-26249,19606,-26254,19599,-26259,19593,-26264,19586,-26269,19579,-26274,19573,-26279,19566,-26284,19559,-26289,19552,-26294,19546,-26299,19539,-26304,19532,-26309,19526,-26314,19519,-26319,19512,-26324,19505,-26329,19499,-26334,19492,-26339,19485,-26344,19478,-26349,19472,-26354,19465,-26359,19458,-26364,19451,-26369,19445,-26374,19438,-26379,19431,-26384,19424,-26389,19418,-26394,19411,-26399,19404,-26404,19397,-26409,19391,-26414,19384,-26419,19377,-26424,19370,-26429,19364,-26434,19357,-26438,19350,-26443,19343,-26448,19337,-26453,19330,-26458,19323,-26463,19316,-26468,19310,-26473,19303,-26478,19296,-26483,19289,-26488,19282,-26493,19276,-26498,19269,-26503,19262,-26508,19255,-26513,19249,-26517,19242,-26522,19235,-26527,19228,-26532,19221,-26537,19215,-26542,19208,-26547,19201,-26552,19194,-26557,19188,-26562,19181,-26567,19174,-26571,19167,-26576,19160,-26581,19154,-26586,19147,-26591,19140,-26596,19133,-26601,19126,-26606,19120,-26611,19113,-26616,19106,-26620,19099,-26625,19092,-26630,19086,-26635,19079,-26640,19072,-26645,19065,-26650,19058,-26655,19051,-26659,19045,-26664,19038,-26669,19031,-26674,19024,-26679,19017,-26684,19011,-26689,19004,-26693,18997,-26698,18990,-26703,18983,-26708,18976,-26713,18970,-26718,18963,-26723,18956,-26727,18949,-26732,18942,-26737,18935,-26742,18929,-26747,18922,-26752,18915,-26756,18908,-26761,18901,-26766,18894,-26771,18888,-26776,18881,-26781,18874,-26785,18867,-26790,18860,-26795,18853,-26800,18846,-26805,18840,-26810,18833,-26814,18826,-26819,18819,-26824,18812,-26829,18805,-26834,18798,-26838,18792,-26843,18785,-26848,18778,-26853,18771,-26858,18764,-26862,18757,-26867,18750,-26872,18744,-26877,18737,-26882,18730,-26886,18723,-26891,18716,-26896,18709,-26901,18702,-26906,18695,-26910,18689,-26915,18682,-26920,18675,-26925,18668,-26929,18661,-26934,18654,-26939,18647,-26944,18640,-26949,18633,-26953,18627,-26958,18620,-26963,18613,-26968,18606,-26972,18599,-26977,18592,-26982,18585,-26987,18578,-26991,18571,-26996,18564,-27001,18558,-27006,18551,-27010,18544,-27015,18537,-27020,18530,-27025,18523,-27029,18516,-27034,18509,-27039,18502,-27043,18495,-27048,18488,-27053,18482,-27058,18475,-27062,18468,-27067,18461,-27072,18454,-27077,18447,-27081,18440,-27086,18433,-27091,18426,-27095,18419,-27100,18412,-27105,18405,-27110,18398,-27114,18392,-27119,18385,-27124,18378,-27128,18371,-27133,18364,-27138,18357,-27142,18350,-27147,18343,-27152,18336,-27157,18329,-27161,18322,-27166,18315,-27171,18308,-27175,18301,-27180,18294,-27185,18287,-27189,18280,-27194,18273,-27199,18267,-27203,18260,-27208,18253,-27213,18246,-27217,18239,-27222,18232,-27227,18225,-27231,18218,-27236,18211,-27241,18204,-27245,18197,-27250,18190,-27255,18183,-27259,18176,-27264,18169,-27269,18162,-27273,18155,-27278,18148,-27282,18141,-27287,18134,-27292,18127,-27296,18120,-27301,18113,-27306,18106,-27310,18099,-27315,18092,-27320,18085,-27324,18078,-27329,18071,-27333,18064,-27338,18057,-27343,18050,-27347,18043,-27352,18036,-27356,18029,-27361,18022,-27366,18015,-27370,18008,-27375,18001,-27379,17994,-27384,17987,-27389,17980,-27393,17973,-27398,17966,-27402,17959,-27407,17952,-27412,17945,-27416,17938,-27421,17931,-27425,17924,-27430,17917,-27435,17910,-27439,17903,-27444,17896,-27448,17889,-27453,17882,-27457,17875,-27462,17868,-27467,17861,-27471,17854,-27476,17847,-27480,17840,-27485,17833,-27489,17826,-27494,17819,-27499,17812,-27503,17805,-27508,17798,-27512,17791,-27517,17784,-27521,17777,-27526,17770,-27530,17763,-27535,17756,-27539,17749,-27544,17742,-27549,17735,-27553,17727,-27558,17720,-27562,17713,-27567,17706,-27571,17699,-27576,17692,-27580,17685,-27585,17678,-27589,17671,-27594,17664,-27598,17657,-27603,17650,-27607,17643,-27612,17636,-27616,17629,-27621,17622,-27625,17615,-27630,17608,-27634,17600,-27639,17593,-27643,17586,-27648,17579,-27652,17572,-27657,17565,-27661,17558,-27666,17551,-27670,17544,-27675,17537,-27679,17530,-27684,17523,-27688,17516,-27693,17509,-27697,17501,-27702,17494,-27706,17487,-27711,17480,-27715,17473,-27720,17466,-27724,17459,-27729,17452,-27733,17445,-27737,17438,-27742,17431,-27746,17423,-27751,17416,-27755,17409,-27760,17402,-27764,17395,-27769,17388,-27773,17381,-27778,17374,-27782,17367,-27786,17360,-27791,17352,-27795,17345,-27800,17338,-27804,17331,-27809,17324,-27813,17317,-27817,17310,-27822,17303,-27826,17296,-27831,17288,-27835,17281,-27840,17274,-27844,17267,-27848,17260,-27853,17253,-27857,17246,-27862,17239,-27866,17232,-27870,17224,-27875,17217,-27879,17210,-27884,17203,-27888,17196,-27892,17189,-27897,17182,-27901,17174,-27906,17167,-27910,17160,-27914,17153,-27919,17146,-27923,17139,-27928,17132,-27932,17124,-27936,17117,-27941,17110,-27945,17103,-27949,17096,-27954,17089,-27958,17082,-27963,17074,-27967,17067,-27971,17060,-27976,17053,-27980,17046,-27984,17039,-27989,17032,-27993,17024,-27997,17017,-28002,17010,-28006,17003,-28010,16996,-28015,16989,-28019,16981,-28024,16974,-28028,16967,-28032,16960,-28037,16953,-28041,16946,-28045,16938,-28050,16931,-28054,16924,-28058,16917,-28063,16910,-28067,16903,-28071,16895,-28076,16888,-28080,16881,-28084,16874,-28088,16867,-28093,16859,-28097,16852,-28101,16845,-28106,16838,-28110,16831,-28114,16824,-28119,16816,-28123,16809,-28127,16802,-28132,16795,-28136,16788,-28140,16780,-28144,16773,-28149,16766,-28153,16759,-28157,16752,-28162,16744,-28166,16737,-28170,16730,-28174,16723,-28179,16716,-28183,16708,-28187,16701,-28191,16694,-28196,16687,-28200,16680,-28204,16672,-28209,16665,-28213,16658,-28217,16651,-28221,16643,-28226,16636,-28230,16629,-28234,16622,-28238,16615,-28243,16607,-28247,16600,-28251,16593,-28255,16586,-28260,16578,-28264,16571,-28268,16564,-28272,16557,-28276,16550,-28281,16542,-28285,16535,-28289,16528,-28293,16521,-28298,16513,-28302,16506,-28306,16499,-28310,16492,-28315,16484,-28319,16477,-28323,16470,-28327,16463,-28331,16455,-28336,16448,-28340,16441,-28344,16434,-28348,16427,-28352,16419,-28357,16412,-28361,16405,-28365,16398,-28369,16390,-28373,16383,-28378,16376,-28382,16368,-28386,16361,-28390,16354,-28394,16347,-28398,16339,-28403,16332,-28407,16325,-28411,16318,-28415,16310,-28419,16303,-28424,16296,-28428,16289,-28432,16281,-28436,16274,-28440,16267,-28444,16260,-28448,16252,-28453,16245,-28457,16238,-28461,16230,-28465,16223,-28469,16216,-28473,16209,-28478,16201,-28482,16194,-28486,16187,-28490,16179,-28494,16172,-28498,16165,-28502,16158,-28507,16150,-28511,16143,-28515,16136,-28519,16128,-28523,16121,-28527,16114,-28531,16107,-28535,16099,-28539,16092,-28544,16085,-28548,16077,-28552,16070,-28556,16063,-28560,16055,-28564,16048,-28568,16041,-28572,16034,-28576,16026,-28581,16019,-28585,16012,-28589,16004,-28593,15997,-28597,15990,-28601,15982,-28605,15975,-28609,15968,-28613,15960,-28617,15953,-28621,15946,-28626,15938,-28630,15931,-28634,15924,-28638,15917,-28642,15909,-28646,15902,-28650,15895,-28654,15887,-28658,15880,-28662,15873,-28666,15865,-28670,15858,-28674,15851,-28678,15843,-28682,15836,-28686,15829,-28691,15821,-28695,15814,-28699,15807,-28703,15799,-28707,15792,-28711,15785,-28715,15777,-28719,15770,-28723,15763,-28727,15755,-28731,15748,-28735,15740,-28739,15733,-28743,15726,-28747,15718,-28751,15711,-28755,15704,-28759,15696,-28763,15689,-28767,15682,-28771,15674,-28775,15667,-28779,15660,-28783,15652,-28787,15645,-28791,15638,-28795,15630,-28799,15623,-28803,15615,-28807,15608,-28811,15601,-28815,15593,-28819,15586,-28823,15579,-28827,15571,-28831,15564,-28835,15556,-28839,15549,-28843,15542,-28847,15534,-28851,15527,-28855,15520,-28859,15512,-28863,15505,-28867,15497,-28871,15490,-28875,15483,-28879,15475,-28883,15468,-28887,15461,-28891,15453,-28894,15446,-28898,15438,-28902,15431,-28906,15424,-28910,15416,-28914,15409,-28918,15401,-28922,15394,-28926,15387,-28930,15379,-28934,15372,-28938,15364,-28942,15357,-28946,15350,-28950,15342,-28954,15335,-28957,15327,-28961,15320,-28965,15313,-28969,15305,-28973,15298,-28977,15290,-28981,15283,-28985,15276,-28989,15268,-28993,15261,-28997,15253,-29000,15246,-29004,15238,-29008,15231,-29012,15224,-29016,15216,-29020,15209,-29024,15201,-29028,15194,-29032,15187,-29035,15179,-29039,15172,-29043,15164,-29047,15157,-29051,15149,-29055,15142,-29059,15135,-29063,15127,-29066,15120,-29070,15112,-29074,15105,-29078,15097,-29082,15090,-29086,15083,-29090,15075,-29093,15068,-29097,15060,-29101,15053,-29105,15045,-29109,15038,-29113,15030,-29117,15023,-29120,15016,-29124,15008,-29128,15001,-29132,14993,-29136,14986,-29140,14978,-29143,14971,-29147,14963,-29151,14956,-29155,14949,-29159,14941,-29163,14934,-29166,14926,-29170,14919,-29174,14911,-29178,14904,-29182,14896,-29185,14889,-29189,14881,-29193,14874,-29197,14866,-29201,14859,-29204,14852,-29208,14844,-29212,14837,-29216,14829,-29220,14822,-29223,14814,-29227,14807,-29231,14799,-29235,14792,-29239,14784,-29242,14777,-29246,14769,-29250,14762,-29254,14754,-29257,14747,-29261,14739,-29265,14732,-29269,14724,-29273,14717,-29276,14709,-29280,14702,-29284,14694,-29288,14687,-29291,14680,-29295,14672,-29299,14665,-29303,14657,-29306,14650,-29310,14642,-29314,14635,-29318,14627,-29321,14620,-29325,14612,-29329,14605,-29333,14597,-29336,14590,-29340,14582,-29344,14575,-29347,14567,-29351,14560,-29355,14552,-29359,14545,-29362,14537,-29366,14530,-29370,14522,-29373,14515,-29377,14507,-29381,14499,-29385,14492,-29388,14484,-29392,14477,-29396,14469,-29399,14462,-29403,14454,-29407,14447,-29411,14439,-29414,14432,-29418,14424,-29422,14417,-29425,14409,-29429,14402,-29433,14394,-29436,14387,-29440,14379,-29444,14372,-29447,14364,-29451,14357,-29455,14349,-29458,14342,-29462,14334,-29466,14326,-29469,14319,-29473,14311,-29477,14304,-29480,14296,-29484,14289,-29488,14281,-29491,14274,-29495,14266,-29499,14259,-29502,14251,-29506,14244,-29510,14236,-29513,14228,-29517,14221,-29520,14213,-29524,14206,-29528,14198,-29531,14191,-29535,14183,-29539,14176,-29542,14168,-29546,14160,-29549,14153,-29553,14145,-29557,14138,-29560,14130,-29564,14123,-29568,14115,-29571,14108,-29575,14100,-29578,14092,-29582,14085,-29586,14077,-29589,14070,-29593,14062,-29596,14055,-29600,14047,-29604,14039,-29607,14032,-29611,14024,-29614,14017,-29618,14009,-29622,14002,-29625,13994,-29629,13986,-29632,13979,-29636,13971,-29639,13964,-29643,13956,-29647,13949,-29650,13941,-29654,13933,-29657,13926,-29661,13918,-29664,13911,-29668,13903,-29671,13895,-29675,13888,-29679,13880,-29682,13873,-29686,13865,-29689,13858,-29693,13850,-29696,13842,-29700,13835,-29703,13827,-29707,13820,-29710,13812,-29714,13804,-29718,13797,-29721,13789,-29725,13782,-29728,13774,-29732,13766,-29735,13759,-29739,13751,-29742,13744,-29746,13736,-29749,13728,-29753,13721,-29756,13713,-29760,13706,-29763,13698,-29767,13690,-29770,13683,-29774,13675,-29777,13667,-29781,13660,-29784,13652,-29788,13645,-29791,13637,-29795,13629,-29798,13622,-29802,13614,-29805,13607,-29809,13599,-29812,13591,-29816,13584,-29819,13576,-29823,13568,-29826,13561,-29829,13553,-29833,13546,-29836,13538,-29840,13530,-29843,13523,-29847,13515,-29850,13507,-29854,13500,-29857,13492,-29861,13485,-29864,13477,-29867,13469,-29871,13462,-29874,13454,-29878,13446,-29881,13439,-29885,13431,-29888,13423,-29892,13416,-29895,13408,-29898,13400,-29902,13393,-29905,13385,-29909,13378,-29912,13370,-29916,13362,-29919,13355,-29922,13347,-29926,13339,-29929,13332,-29933,13324,-29936,13316,-29939,13309,-29943,13301,-29946,13293,-29950,13286,-29953,13278,-29956,13270,-29960,13263,-29963,13255,-29967,13247,-29970,13240,-29973,13232,-29977,13224,-29980,13217,-29984,13209,-29987,13201,-29990,13194,-29994,13186,-29997,13178,-30000,13171,-30004,13163,-30007,13155,-30010,13148,-30014,13140,-30017,13132,-30021,13125,-30024,13117,-30027,13109,-30031,13102,-30034,13094,-30037,13086,-30041,13079,-30044,13071,-30047,13063,-30051,13056,-30054,13048,-30057,13040,-30061,13033,-30064,13025,-30067,13017,-30071,13009,-30074,13002,-30077,12994,-30081,12986,-30084,12979,-30087,12971,-30091,12963,-30094,12956,-30097,12948,-30101,12940,-30104,12933,-30107,12925,-30110,12917,-30114,12909,-30117,12902,-30120,12894,-30124,12886,-30127,12879,-30130,12871,-30134,12863,-30137,12856,-30140,12848,-30143,12840,-30147,12832,-30150,12825,-30153,12817,-30157,12809,-30160,12802,-30163,12794,-30166,12786,-30170,12778,-30173,12771,-30176,12763,-30179,12755,-30183,12748,-30186,12740,-30189,12732,-30192,12724,-30196,12717,-30199,12709,-30202,12701,-30206,12694,-30209,12686,-30212,12678,-30215,12670,-30218,12663,-30222,12655,-30225,12647,-30228,12639,-30231,12632,-30235,12624,-30238,12616,-30241,12609,-30244,12601,-30248,12593,-30251,12585,-30254,12578,-30257,12570,-30260,12562,-30264,12554,-30267,12547,-30270,12539,-30273,12531,-30276,12523,-30280,12516,-30283,12508,-30286,12500,-30289,12492,-30292,12485,-30296,12477,-30299,12469,-30302,12461,-30305,12454,-30308,12446,-30312,12438,-30315,12430,-30318,12423,-30321,12415,-30324,12407,-30327,12399,-30331,12392,-30334,12384,-30337,12376,-30340,12368,-30343,12361,-30346,12353,-30350,12345,-30353,12337,-30356,12330,-30359,12322,-30362,12314,-30365,12306,-30369,12299,-30372,12291,-30375,12283,-30378,12275,-30381,12268,-30384,12260,-30387,12252,-30391,12244,-30394,12236,-30397,12229,-30400,12221,-30403,12213,-30406,12205,-30409,12198,-30412,12190,-30416,12182,-30419,12174,-30422,12166,-30425,12159,-30428,12151,-30431,12143,-30434,12135,-30437,12128,-30440,12120,-30443,12112,-30447,12104,-30450,12096,-30453,12089,-30456,12081,-30459,12073,-30462,12065,-30465,12057,-30468,12050,-30471,12042,-30474,12034,-30477,12026,-30481,12019,-30484,12011,-30487,12003,-30490,11995,-30493,11987,-30496,11980,-30499,11972,-30502,11964,-30505,11956,-30508,11948,-30511,11941,-30514,11933,-30517,11925,-30520,11917,-30523,11909,-30526,11902,-30529,11894,-30533,11886,-30536,11878,-30539,11870,-30542,11862,-30545,11855,-30548,11847,-30551,11839,-30554,11831,-30557,11823,-30560,11816,-30563,11808,-30566,11800,-30569,11792,-30572,11784,-30575,11777,-30578,11769,-30581,11761,-30584,11753,-30587,11745,-30590,11737,-30593,11730,-30596,11722,-30599,11714,-30602,11706,-30605,11698,-30608,11691,-30611,11683,-30614,11675,-30617,11667,-30620,11659,-30623,11651,-30626,11644,-30629,11636,-30632,11628,-30635,11620,-30638,11612,-30641,11604,-30644,11597,-30647,11589,-30650,11581,-30653,11573,-30656,11565,-30658,11557,-30661,11550,-30664,11542,-30667,11534,-30670,11526,-30673,11518,-30676,11510,-30679,11502,-30682,11495,-30685,11487,-30688,11479,-30691,11471,-30694,11463,-30697,11455,-30700,11448,-30703,11440,-30706,11432,-30708,11424,-30711,11416,-30714,11408,-30717,11400,-30720,11393,-30723,11385,-30726,11377,-30729,11369,-30732,11361,-30735,11353,-30738,11345,-30740,11338,-30743,11330,-30746,11322,-30749,11314,-30752,11306,-30755,11298,-30758,11290,-30761,11283,-30764,11275,-30767,11267,-30769,11259,-30772,11251,-30775,11243,-30778,11235,-30781,11227,-30784,11220,-30787,11212,-30789,11204,-30792,11196,-30795,11188,-30798,11180,-30801,11172,-30804,11164,-30807,11157,-30810,11149,-30812,11141,-30815,11133,-30818,11125,-30821,11117,-30824,11109,-30827,11101,-30829,11094,-30832,11086,-30835,11078,-30838,11070,-30841,11062,-30844,11054,-30846,11046,-30849,11038,-30852,11030,-30855,11023,-30858,11015,-30861,11007,-30863,10999,-30866,10991,-30869,10983,-30872,10975,-30875,10967,-30877,10959,-30880,10952,-30883,10944,-30886,10936,-30889,10928,-30891,10920,-30894,10912,-30897,10904,-30900,10896,-30903,10888,-30905,10880,-30908,10873,-30911,10865,-30914,10857,-30916,10849,-30919,10841,-30922,10833,-30925,10825,-30928,10817,-30930,10809,-30933,10801,-30936,10794,-30939,10786,-30941,10778,-30944,10770,-30947,10762,-30950,10754,-30952,10746,-30955,10738,-30958,10730,-30961,10722,-30963,10714,-30966,10706,-30969,10699,-30972,10691,-30974,10683,-30977,10675,-30980,10667,-30982,10659,-30985,10651,-30988,10643,-30991,10635,-30993,10627,-30996,10619,-30999,10611,-31002,10603,-31004,10596,-31007,10588,-31010,10580,-31012,10572,-31015,10564,-31018,10556,-31020,10548,-31023,10540,-31026,10532,-31029,10524,-31031,10516,-31034,10508,-31037,10500,-31039,10492,-31042,10484,-31045,10477,-31047,10469,-31050,10461,-31053,10453,-31055,10445,-31058,10437,-31061,10429,-31063,10421,-31066,10413,-31069,10405,-31071,10397,-31074,10389,-31077,10381,-31079,10373,-31082,10365,-31085,10357,-31087,10349,-31090,10342,-31093,10334,-31095,10326,-31098,10318,-31101,10310,-31103,10302,-31106,10294,-31108,10286,-31111,10278,-31114,10270,-31116,10262,-31119,10254,-31122,10246,-31124,10238,-31127,10230,-31129,10222,-31132,10214,-31135,10206,-31137,10198,-31140,10190,-31142,10182,-31145,10174,-31148,10166,-31150,10159,-31153,10151,-31155,10143,-31158,10135,-31161,10127,-31163,10119,-31166,10111,-31168,10103,-31171,10095,-31174,10087,-31176,10079,-31179,10071,-31181,10063,-31184,10055,-31186,10047,-31189,10039,-31192,10031,-31194,10023,-31197,10015,-31199,10007,-31202,9999,-31204,9991,-31207,9983,-31210,9975,-31212,9967,-31215,9959,-31217,9951,-31220,9943,-31222,9935,-31225,9927,-31227,9919,-31230,9911,-31232,9903,-31235,9895,-31237,9887,-31240,9879,-31243,9871,-31245,9863,-31248,9855,-31250,9847,-31253,9839,-31255,9831,-31258,9823,-31260,9815,-31263,9807,-31265,9799,-31268,9791,-31270,9783,-31273,9775,-31275,9767,-31278,9759,-31280,9751,-31283,9743,-31285,9735,-31288,9727,-31290,9719,-31293,9711,-31295,9703,-31298,9695,-31300,9687,-31303,9679,-31305,9671,-31308,9663,-31310,9655,-31312,9647,-31315,9639,-31317,9631,-31320,9623,-31322,9615,-31325,9607,-31327,9599,-31330,9591,-31332,9583,-31335,9575,-31337,9567,-31339,9559,-31342,9551,-31344,9543,-31347,9535,-31349,9527,-31352,9519,-31354,9511,-31357,9503,-31359,9495,-31361,9487,-31364,9479,-31366,9471,-31369,9463,-31371,9455,-31374,9447,-31376,9439,-31378,9431,-31381,9423,-31383,9415,-31386,9407,-31388,9399,-31390,9391,-31393,9383,-31395,9375,-31398,9367,-31400,9359,-31402,9351,-31405,9343,-31407,9335,-31410,9327,-31412,9319,-31414,9311,-31417,9303,-31419,9295,-31421,9287,-31424,9279,-31426,9270,-31429,9262,-31431,9254,-31433,9246,-31436,9238,-31438,9230,-31440,9222,-31443,9214,-31445,9206,-31447,9198,-31450,9190,-31452,9182,-31455,9174,-31457,9166,-31459,9158,-31462,9150,-31464,9142,-31466,9134,-31469,9126,-31471,9118,-31473,9110,-31476,9102,-31478,9094,-31480,9086,-31483,9077,-31485,9069,-31487,9061,-31490,9053,-31492,9045,-31494,9037,-31496,9029,-31499,9021,-31501,9013,-31503,9005,-31506,8997,-31508,8989,-31510,8981,-31513,8973,-31515,8965,-31517,8957,-31519,8949,-31522,8941,-31524,8932,-31526,8924,-31529,8916,-31531,8908,-31533,8900,-31535,8892,-31538,8884,-31540,8876,-31542,8868,-31545,8860,-31547,8852,-31549,8844,-31551,8836,-31554,8828,-31556,8820,-31558,8812,-31560,8803,-31563,8795,-31565,8787,-31567,8779,-31569,8771,-31572,8763,-31574,8755,-31576,8747,-31578,8739,-31581,8731,-31583,8723,-31585,8715,-31587,8707,-31589,8699,-31592,8690,-31594,8682,-31596,8674,-31598,8666,-31601,8658,-31603,8650,-31605,8642,-31607,8634,-31609,8626,-31612,8618,-31614,8610,-31616,8602,-31618,8593,-31620,8585,-31623,8577,-31625,8569,-31627,8561,-31629,8553,-31631,8545,-31634,8537,-31636,8529,-31638,8521,-31640,8513,-31642,8504,-31644,8496,-31647,8488,-31649,8480,-31651,8472,-31653,8464,-31655,8456,-31657,8448,-31660,8440,-31662,8432,-31664,8424,-31666,8415,-31668,8407,-31670,8399,-31673,8391,-31675,8383,-31677,8375,-31679,8367,-31681,8359,-31683,8351,-31685,8343,-31688,8334,-31690,8326,-31692,8318,-31694,8310,-31696,8302,-31698,8294,-31700,8286,-31702,8278,-31705,8270,-31707,8262,-31709,8253,-31711,8245,-31713,8237,-31715,8229,-31717,8221,-31719,8213,-31721,8205,-31724,8197,-31726,8189,-31728,8180,-31730,8172,-31732,8164,-31734,8156,-31736,8148,-31738,8140,-31740,8132,-31742,8124,-31744,8116,-31746,8107,-31749,8099,-31751,8091,-31753,8083,-31755,8075,-31757,8067,-31759,8059,-31761,8051,-31763,8042,-31765,8034,-31767,8026,-31769,8018,-31771,8010,-31773,8002,-31775,7994,-31777,7986,-31779,7977,-31781,7969,-31783,7961,-31786,7953,-31788,7945,-31790,7937,-31792,7929,-31794,7921,-31796,7912,-31798,7904,-31800,7896,-31802,7888,-31804,7880,-31806,7872,-31808,7864,-31810,7856,-31812,7847,-31814,7839,-31816,7831,-31818,7823,-31820,7815,-31822,7807,-31824,7799,-31826,7790,-31828,7782,-31830,7774,-31832,7766,-31834,7758,-31836,7750,-31838,7742,-31840,7733,-31842,7725,-31844,7717,-31846,7709,-31848,7701,-31850,7693,-31852,7685,-31854,7676,-31855,7668,-31857,7660,-31859,7652,-31861,7644,-31863,7636,-31865,7628,-31867,7619,-31869,7611,-31871,7603,-31873,7595,-31875,7587,-31877,7579,-31879,7571,-31881,7562,-31883,7554,-31885,7546,-31887,7538,-31889,7530,-31890,7522,-31892,7514,-31894,7505,-31896,7497,-31898,7489,-31900,7481,-31902,7473,-31904,7465,-31906,7456,-31908,7448,-31910,7440,-31912,7432,-31913,7424,-31915,7416,-31917,7407,-31919,7399,-31921,7391,-31923,7383,-31925,7375,-31927,7367,-31929,7358,-31930,7350,-31932,7342,-31934,7334,-31936,7326,-31938,7318,-31940,7310,-31942,7301,-31944,7293,-31945,7285,-31947,7277,-31949,7269,-31951,7261,-31953,7252,-31955,7244,-31957,7236,-31958,7228,-31960,7220,-31962,7211,-31964,7203,-31966,7195,-31968,7187,-31969,7179,-31971,7171,-31973,7162,-31975,7154,-31977,7146,-31979,7138,-31980,7130,-31982,7122,-31984,7113,-31986,7105,-31988,7097,-31990,7089,-31991,7081,-31993,7072,-31995,7064,-31997,7056,-31999,7048,-32000,7040,-32002,7032,-32004,7023,-32006,7015,-32008,7007,-32009,6999,-32011,6991,-32013,6982,-32015,6974,-32017,6966,-32018,6958,-32020,6950,-32022,6942,-32024,6933,-32025,6925,-32027,6917,-32029,6909,-32031,6901,-32033,6892,-32034,6884,-32036,6876,-32038,6868,-32040,6860,-32041,6851,-32043,6843,-32045,6835,-32047,6827,-32048,6819,-32050,6811,-32052,6802,-32054,6794,-32055,6786,-32057,6778,-32059,6770,-32060,6761,-32062,6753,-32064,6745,-32066,6737,-32067,6729,-32069,6720,-32071,6712,-32073,6704,-32074,6696,-32076,6688,-32078,6679,-32079,6671,-32081,6663,-32083,6655,-32085,6647,-32086,6638,-32088,6630,-32090,6622,-32091,6614,-32093,6606,-32095,6597,-32096,6589,-32098,6581,-32100,6573,-32101,6564,-32103,6556,-32105,6548,-32106,6540,-32108,6532,-32110,6523,-32111,6515,-32113,6507,-32115,6499,-32116,6491,-32118,6482,-32120,6474,-32121,6466,-32123,6458,-32125,6450,-32126,6441,-32128,6433,-32130,6425,-32131,6417,-32133,6408,-32135,6400,-32136,6392,-32138,6384,-32140,6376,-32141,6367,-32143,6359,-32144,6351,-32146,6343,-32148,6334,-32149,6326,-32151,6318,-32153,6310,-32154,6302,-32156,6293,-32157,6285,-32159,6277,-32161,6269,-32162,6261,-32164,6252,-32165,6244,-32167,6236,-32169,6228,-32170,6219,-32172,6211,-32173,6203,-32175,6195,-32177,6186,-32178,6178,-32180,6170,-32181,6162,-32183,6154,-32184,6145,-32186,6137,-32188,6129,-32189,6121,-32191,6112,-32192,6104,-32194,6096,-32195,6088,-32197,6080,-32198,6071,-32200,6063,-32202,6055,-32203,6047,-32205,6038,-32206,6030,-32208,6022,-32209,6014,-32211,6005,-32212,5997,-32214,5989,-32215,5981,-32217,5972,-32219,5964,-32220,5956,-32222,5948,-32223,5940,-32225,5931,-32226,5923,-32228,5915,-32229,5907,-32231,5898,-32232,5890,-32234,5882,-32235,5874,-32237,5865,-32238,5857,-32240,5849,-32241,5841,-32243,5832,-32244,5824,-32246,5816,-32247,5808,-32249,5799,-32250,5791,-32252,5783,-32253,5775,-32255,5766,-32256,5758,-32257,5750,-32259,5742,-32260,5733,-32262,5725,-32263,5717,-32265,5709,-32266,5700,-32268,5692,-32269,5684,-32271,5676,-32272,5667,-32274,5659,-32275,5651,-32276,5643,-32278,5634,-32279,5626,-32281,5618,-32282,5610,-32284,5601,-32285,5593,-32287,5585,-32288,5577,-32289,5568,-32291,5560,-32292,5552,-32294,5544,-32295,5535,-32296,5527,-32298,5519,-32299,5511,-32301,5502,-32302,5494,-32304,5486,-32305,5478,-32306,5469,-32308,5461,-32309,5453,-32311,5445,-32312,5436,-32313,5428,-32315,5420,-32316,5411,-32317,5403,-32319,5395,-32320,5387,-32322,5378,-32323,5370,-32324,5362,-32326,5354,-32327,5345,-32328,5337,-32330,5329,-32331,5321,-32333,5312,-32334,5304,-32335,5296,-32337,5287,-32338,5279,-32339,5271,-32341,5263,-32342,5254,-32343,5246,-32345,5238,-32346,5230,-32347,5221,-32349,5213,-32350,5205,-32351,5197,-32353,5188,-32354,5180,-32355,5172,-32357,5163,-32358,5155,-32359,5147,-32361,5139,-32362,5130,-32363,5122,-32365,5114,-32366,5106,-32367,5097,-32369,5089,-32370,5081,-32371,5072,-32372,5064,-32374,5056,-32375,5048,-32376,5039,-32378,5031,-32379,5023,-32380,5014,-32381,5006,-32383,4998,-32384,4990,-32385,4981,-32387,4973,-32388,4965,-32389,4957,-32390,4948,-32392,4940,-32393,4932,-32394,4923,-32395,4915,-32397,4907,-32398,4899,-32399,4890,-32400,4882,-32402,4874,-32403,4865,-32404,4857,-32405,4849,-32407,4841,-32408,4832,-32409,4824,-32410,4816,-32412,4807,-32413,4799,-32414,4791,-32415,4783,-32417,4774,-32418,4766,-32419,4758,-32420,4749,-32421,4741,-32423,4733,-32424,4725,-32425,4716,-32426,4708,-32427,4700,-32429,4691,-32430,4683,-32431,4675,-32432,4666,-32433,4658,-32435,4650,-32436,4642,-32437,4633,-32438,4625,-32439,4617,-32441,4608,-32442,4600,-32443,4592,-32444,4584,-32445,4575,-32446,4567,-32448,4559,-32449,4550,-32450,4542,-32451,4534,-32452,4525,-32453,4517,-32455,4509,-32456,4501,-32457,4492,-32458,4484,-32459,4476,-32460,4467,-32461,4459,-32463,4451,-32464,4443,-32465,4434,-32466,4426,-32467,4418,-32468,4409,-32469,4401,-32471,4393,-32472,4384,-32473,4376,-32474,4368,-32475,4359,-32476,4351,-32477,4343,-32478,4335,-32479,4326,-32481,4318,-32482,4310,-32483,4301,-32484,4293,-32485,4285,-32486,4276,-32487,4268,-32488,4260,-32489,4252,-32490,4243,-32492,4235,-32493,4227,-32494,4218,-32495,4210,-32496,4202,-32497,4193,-32498,4185,-32499,4177,-32500,4168,-32501,4160,-32502,4152,-32503,4144,-32504,4135,-32505,4127,-32507,4119,-32508,4110,-32509,4102,-32510,4094,-32511,4085,-32512,4077,-32513,4069,-32514,4060,-32515,4052,-32516,4044,-32517,4035,-32518,4027,-32519,4019,-32520,4011,-32521,4002,-32522,3994,-32523,3986,-32524,3977,-32525,3969,-32526,3961,-32527,3952,-32528,3944,-32529,3936,-32530,3927,-32531,3919,-32532,3911,-32533,3902,-32534,3894,-32535,3886,-32536,3877,-32537,3869,-32538,3861,-32539,3853,-32540,3844,-32541,3836,-32542,3828,-32543,3819,-32544,3811,-32545,3803,-32546,3794,-32547,3786,-32548,3778,-32549,3769,-32550,3761,-32551,3753,-32552,3744,-32553,3736,-32554,3728,-32555,3719,-32556,3711,-32557,3703,-32558,3694,-32559,3686,-32559,3678,-32560,3669,-32561,3661,-32562,3653,-32563,3644,-32564,3636,-32565,3628,-32566,3619,-32567,3611,-32568,3603,-32569,3594,-32570,3586,-32571,3578,-32572,3570,-32572,3561,-32573,3553,-32574,3545,-32575,3536,-32576,3528,-32577,3520,-32578,3511,-32579,3503,-32580,3495,-32581,3486,-32581,3478,-32582,3470,-32583,3461,-32584,3453,-32585,3445,-32586,3436,-32587,3428,-32588,3420,-32589,3411,-32589,3403,-32590,3395,-32591,3386,-32592,3378,-32593,3370,-32594,3361,-32595,3353,-32595,3345,-32596,3336,-32597,3328,-32598,3320,-32599,3311,-32600,3303,-32601,3295,-32601,3286,-32602,3278,-32603,3270,-32604,3261,-32605,3253,-32606,3245,-32606,3236,-32607,3228,-32608,3220,-32609,3211,-32610,3203,-32611,3195,-32611,3186,-32612,3178,-32613,3170,-32614,3161,-32615,3153,-32615,3145,-32616,3136,-32617,3128,-32618,3120,-32619,3111,-32619,3103,-32620,3094,-32621,3086,-32622,3078,-32623,3069,-32623,3061,-32624,3053,-32625,3044,-32626,3036,-32626,3028,-32627,3019,-32628,3011,-32629,3003,-32630,2994,-32630,2986,-32631,2978,-32632,2969,-32633,2961,-32633,2953,-32634,2944,-32635,2936,-32636,2928,-32636,2919,-32637,2911,-32638,2903,-32639,2894,-32639,2886,-32640,2878,-32641,2869,-32642,2861,-32642,2853,-32643,2844,-32644,2836,-32645,2828,-32645,2819,-32646,2811,-32647,2802,-32647,2794,-32648,2786,-32649,2777,-32650,2769,-32650,2761,-32651,2752,-32652,2744,-32652,2736,-32653,2727,-32654,2719,-32654,2711,-32655,2702,-32656,2694,-32657,2686,-32657,2677,-32658,2669,-32659,2661,-32659,2652,-32660,2644,-32661,2636,-32661,2627,-32662,2619,-32663,2610,-32663,2602,-32664,2594,-32665,2585,-32665,2577,-32666,2569,-32667,2560,-32667,2552,-32668,2544,-32669,2535,-32669,2527,-32670,2519,-32671,2510,-32671,2502,-32672,2494,-32672,2485,-32673,2477,-32674,2468,-32674,2460,-32675,2452,-32676,2443,-32676,2435,-32677,2427,-32677,2418,-32678,2410,-32679,2402,-32679,2393,-32680,2385,-32681,2377,-32681,2368,-32682,2360,-32682,2352,-32683,2343,-32684,2335,-32684,2326,-32685,2318,-32685,2310,-32686,2301,-32687,2293,-32687,2285,-32688,2276,-32688,2268,-32689,2260,-32689,2251,-32690,2243,-32691,2235,-32691,2226,-32692,2218,-32692,2209,-32693,2201,-32693,2193,-32694,2184,-32695,2176,-32695,2168,-32696,2159,-32696,2151,-32697,2143,-32697,2134,-32698,2126,-32698,2117,-32699,2109,-32700,2101,-32700,2092,-32701,2084,-32701,2076,-32702,2067,-32702,2059,-32703,2051,-32703,2042,-32704,2034,-32704,2026,-32705,2017,-32705,2009,-32706,2000,-32706,1992,-32707,1984,-32707,1975,-32708,1967,-32708,1959,-32709,1950,-32709,1942,-32710,1934,-32710,1925,-32711,1917,-32711,1908,-32712,1900,-32712,1892,-32713,1883,-32713,1875,-32714,1867,-32714,1858,-32715,1850,-32715,1842,-32716,1833,-32716,1825,-32717,1816,-32717,1808,-32718,1800,-32718,1791,-32718,1783,-32719,1775,-32719,1766,-32720,1758,-32720,1750,-32721,1741,-32721,1733,-32722,1724,-32722,1716,-32723,1708,-32723,1699,-32723,1691,-32724,1683,-32724,1674,-32725,1666,-32725,1658,-32726,1649,-32726,1641,-32726,1632,-32727,1624,-32727,1616,-32728,1607,-32728,1599,-32728,1591,-32729,1582,-32729,1574,-32730,1565,-32730,1557,-32730,1549,-32731,1540,-32731,1532,-32732,1524,-32732,1515,-32732,1507,-32733,1499,-32733,1490,-32734,1482,-32734,1473,-32734,1465,-32735,1457,-32735,1448,-32735,1440,-32736,1432,-32736,1423,-32737,1415,-32737,1406,-32737,1398,-32738,1390,-32738,1381,-32738,1373,-32739,1365,-32739,1356,-32739,1348,-32740,1339,-32740,1331,-32740,1323,-32741,1314,-32741,1306,-32741,1298,-32742,1289,-32742,1281,-32742,1273,-32743,1264,-32743,1256,-32743,1247,-32744,1239,-32744,1231,-32744,1222,-32745,1214,-32745,1206,-32745,1197,-32746,1189,-32746,1180,-32746,1172,-32747,1164,-32747,1155,-32747,1147,-32747,1139,-32748,1130,-32748,1122,-32748,1113,-32749,1105,-32749,1097,-32749,1088,-32749,1080,-32750,1072,-32750,1063,-32750,1055,-32751,1046,-32751,1038,-32751,1030,-32751,1021,-32752,1013,-32752,1005,-32752,996,-32752,988,-32753,980,-32753,971,-32753,963,-32753,954,-32754,946,-32754,938,-32754,929,-32754,921,-32755,913,-32755,904,-32755,896,-32755,887,-32755,879,-32756,871,-32756,862,-32756,854,-32756,846,-32757,837,-32757,829,-32757,820,-32757,812,-32757,804,-32758,795,-32758,787,-32758,779,-32758,770,-32758,762,-32759,753,-32759,745,-32759,737,-32759,728,-32759,720,-32760,712,-32760,703,-32760,695,-32760,686,-32760,678,-32760,670,-32761,661,-32761,653,-32761,645,-32761,636,-32761,628,-32761,619,-32762,611,-32762,603,-32762,594,-32762,586,-32762,578,-32762,569,-32763,561,-32763,552,-32763,544,-32763,536,-32763,527,-32763,519,-32763,510,-32764,502,-32764,494,-32764,485,-32764,477,-32764,469,-32764,460,-32764,452,-32764,443,-32764,435,-32765,427,-32765,418,-32765,410,-32765,402,-32765,393,-32765,385,-32765,376,-32765,368,-32765,360,-32766,351,-32766,343,-32766,335,-32766,326,-32766,318,-32766,309,-32766,301,-32766,293,-32766,284,-32766,276,-32766,268,-32766,259,-32766,251,-32767,242,-32767,234,-32767,226,-32767,217,-32767,209,-32767,201,-32767,192,-32767,184,-32767,175,-32767,167,-32767,159,-32767,150,-32767,142,-32767,134,-32767,125,-32767,117,-32767,108,-32767,100,-32767,92,-32767,83,-32767,75,-32767,67,-32767,58,-32767,50,-32767,41,-32767,33,-32767,25,-32767,16,-32767,8,-32767,0,-32767,-9,-32767,-17,-32767,-26,-32767,-34,-32767,-42,-32767,-51,-32767,-59,-32767,-68,-32767,-76,-32767,-84,-32767,-93,-32767,-101,-32767,-109,-32767,-118,-32767,-126,-32767,-135,-32767,-143,-32767,-151,-32767,-160,-32767,-168,-32767,-176,-32767,-185,-32767,-193,-32767,-202,-32767,-210,-32767,-218,-32767,-227,-32767,-235,-32767,-243,-32767,-252,-32767,-260,-32766,-269,-32766,-277,-32766,-285,-32766,-294,-32766,-302,-32766,-310,-32766,-319,-32766,-327,-32766,-336,-32766,-344,-32766,-352,-32766,-361,-32766,-369,-32765,-377,-32765,-386,-32765,-394,-32765,-403,-32765,-411,-32765,-419,-32765,-428,-32765,-436,-32765,-444,-32764,-453,-32764,-461,-32764,-470,-32764,-478,-32764,-486,-32764,-495,-32764,-503,-32764,-511,-32764,-520,-32763,-528,-32763,-537,-32763,-545,-32763,-553,-32763,-562,-32763,-570,-32763,-579,-32762,-587,-32762,-595,-32762,-604,-32762,-612,-32762,-620,-32762,-629,-32761,-637,-32761,-646,-32761,-654,-32761,-662,-32761,-671,-32761,-679,-32760,-687,-32760,-696,-32760,-704,-32760,-713,-32760,-721,-32760,-729,-32759,-738,-32759,-746,-32759,-754,-32759,-763,-32759,-771,-32758,-780,-32758,-788,-32758,-796,-32758,-805,-32758,-813,-32757,-821,-32757,-830,-32757,-838,-32757,-847,-32757,-855,-32756,-863,-32756,-872,-32756,-880,-32756,-888,-32755,-897,-32755,-905,-32755,-914,-32755,-922,-32755,-930,-32754,-939,-32754,-947,-32754,-955,-32754,-964,-32753,-972,-32753,-981,-32753,-989,-32753,-997,-32752,-1006,-32752,-1014,-32752,-1022,-32752,-1031,-32751,-1039,-32751,-1047,-32751,-1056,-32751,-1064,-32750,-1073,-32750,-1081,-32750,-1089,-32749,-1098,-32749,-1106,-32749,-1114,-32749,-1123,-32748,-1131,-32748,-1140,-32748,-1148,-32747,-1156,-32747,-1165,-32747,-1173,-32747,-1181,-32746,-1190,-32746,-1198,-32746,-1207,-32745,-1215,-32745,-1223,-32745,-1232,-32744,-1240,-32744,-1248,-32744,-1257,-32743,-1265,-32743,-1274,-32743,-1282,-32742,-1290,-32742,-1299,-32742,-1307,-32741,-1315,-32741,-1324,-32741,-1332,-32740,-1340,-32740,-1349,-32740,-1357,-32739,-1366,-32739,-1374,-32739,-1382,-32738,-1391,-32738,-1399,-32738,-1407,-32737,-1416,-32737,-1424,-32737,-1433,-32736,-1441,-32736,-1449,-32735,-1458,-32735,-1466,-32735,-1474,-32734,-1483,-32734,-1491,-32734,-1500,-32733,-1508,-32733,-1516,-32732,-1525,-32732,-1533,-32732,-1541,-32731,-1550,-32731,-1558,-32730,-1566,-32730,-1575,-32730,-1583,-32729,-1592,-32729,-1600,-32728,-1608,-32728,-1617,-32728,-1625,-32727,-1633,-32727,-1642,-32726,-1650,-32726,-1659,-32726,-1667,-32725,-1675,-32725,-1684,-32724,-1692,-32724,-1700,-32723,-1709,-32723,-1717,-32723,-1725,-32722,-1734,-32722,-1742,-32721,-1751,-32721,-1759,-32720,-1767,-32720,-1776,-32719,-1784,-32719,-1792,-32718,-1801,-32718,-1809,-32718,-1817,-32717,-1826,-32717,-1834,-32716,-1843,-32716,-1851,-32715,-1859,-32715,-1868,-32714,-1876,-32714,-1884,-32713,-1893,-32713,-1901,-32712,-1909,-32712,-1918,-32711,-1926,-32711,-1935,-32710,-1943,-32710,-1951,-32709,-1960,-32709,-1968,-32708,-1976,-32708,-1985,-32707,-1993,-32707,-2001,-32706,-2010,-32706,-2018,-32705,-2027,-32705,-2035,-32704,-2043,-32704,-2052,-32703,-2060,-32703,-2068,-32702,-2077,-32702,-2085,-32701,-2093,-32701,-2102,-32700,-2110,-32700,-2118,-32699,-2127,-32698,-2135,-32698,-2144,-32697,-2152,-32697,-2160,-32696,-2169,-32696,-2177,-32695,-2185,-32695,-2194,-32694,-2202,-32693,-2210,-32693,-2219,-32692,-2227,-32692,-2236,-32691,-2244,-32691,-2252,-32690,-2261,-32689,-2269,-32689,-2277,-32688,-2286,-32688,-2294,-32687,-2302,-32687,-2311,-32686,-2319,-32685,-2327,-32685,-2336,-32684,-2344,-32684,-2353,-32683,-2361,-32682,-2369,-32682,-2378,-32681,-2386,-32681,-2394,-32680,-2403,-32679,-2411,-32679,-2419,-32678,-2428,-32677,-2436,-32677,-2444,-32676,-2453,-32676,-2461,-32675,-2469,-32674,-2478,-32674,-2486,-32673,-2495,-32672,-2503,-32672,-2511,-32671,-2520,-32671,-2528,-32670,-2536,-32669,-2545,-32669,-2553,-32668,-2561,-32667,-2570,-32667,-2578,-32666,-2586,-32665,-2595,-32665,-2603,-32664,-2611,-32663,-2620,-32663,-2628,-32662,-2637,-32661,-2645,-32661,-2653,-32660,-2662,-32659,-2670,-32659,-2678,-32658,-2687,-32657,-2695,-32657,-2703,-32656,-2712,-32655,-2720,-32654,-2728,-32654,-2737,-32653,-2745,-32652,-2753,-32652,-2762,-32651,-2770,-32650,-2778,-32650,-2787,-32649,-2795,-32648,-2803,-32647,-2812,-32647,-2820,-32646,-2829,-32645,-2837,-32645,-2845,-32644,-2854,-32643,-2862,-32642,-2870,-32642,-2879,-32641,-2887,-32640,-2895,-32639,-2904,-32639,-2912,-32638,-2920,-32637,-2929,-32636,-2937,-32636,-2945,-32635,-2954,-32634,-2962,-32633,-2970,-32633,-2979,-32632,-2987,-32631,-2995,-32630,-3004,-32630,-3012,-32629,-3020,-32628,-3029,-32627,-3037,-32626,-3045,-32626,-3054,-32625,-3062,-32624,-3070,-32623,-3079,-32623,-3087,-32622,-3095,-32621,-3104,-32620,-3112,-32619,-3121,-32619,-3129,-32618,-3137,-32617,-3146,-32616,-3154,-32615,-3162,-32615,-3171,-32614,-3179,-32613,-3187,-32612,-3196,-32611,-3204,-32611,-3212,-32610,-3221,-32609,-3229,-32608,-3237,-32607,-3246,-32606,-3254,-32606,-3262,-32605,-3271,-32604,-3279,-32603,-3287,-32602,-3296,-32601,-3304,-32601,-3312,-32600,-3321,-32599,-3329,-32598,-3337,-32597,-3346,-32596,-3354,-32595,-3362,-32595,-3371,-32594,-3379,-32593,-3387,-32592,-3396,-32591,-3404,-32590,-3412,-32589,-3421,-32589,-3429,-32588,-3437,-32587,-3446,-32586,-3454,-32585,-3462,-32584,-3471,-32583,-3479,-32582,-3487,-32581,-3496,-32581,-3504,-32580,-3512,-32579,-3521,-32578,-3529,-32577,-3537,-32576,-3546,-32575,-3554,-32574,-3562,-32573,-3571,-32572,-3579,-32572,-3587,-32571,-3595,-32570,-3604,-32569,-3612,-32568,-3620,-32567,-3629,-32566,-3637,-32565,-3645,-32564,-3654,-32563,-3662,-32562,-3670,-32561,-3679,-32560,-3687,-32559,-3695,-32559,-3704,-32558,-3712,-32557,-3720,-32556,-3729,-32555,-3737,-32554,-3745,-32553,-3754,-32552,-3762,-32551,-3770,-32550,-3779,-32549,-3787,-32548,-3795,-32547,-3804,-32546,-3812,-32545,-3820,-32544,-3829,-32543,-3837,-32542,-3845,-32541,-3854,-32540,-3862,-32539,-3870,-32538,-3878,-32537,-3887,-32536,-3895,-32535,-3903,-32534,-3912,-32533,-3920,-32532,-3928,-32531,-3937,-32530,-3945,-32529,-3953,-32528,-3962,-32527,-3970,-32526,-3978,-32525,-3987,-32524,-3995,-32523,-4003,-32522,-4012,-32521,-4020,-32520,-4028,-32519,-4036,-32518,-4045,-32517,-4053,-32516,-4061,-32515,-4070,-32514,-4078,-32513,-4086,-32512,-4095,-32511,-4103,-32510,-4111,-32509,-4120,-32508,-4128,-32507,-4136,-32505,-4145,-32504,-4153,-32503,-4161,-32502,-4169,-32501,-4178,-32500,-4186,-32499,-4194,-32498,-4203,-32497,-4211,-32496,-4219,-32495,-4228,-32494,-4236,-32493,-4244,-32492,-4253,-32490,-4261,-32489,-4269,-32488,-4277,-32487,-4286,-32486,-4294,-32485,-4302,-32484,-4311,-32483,-4319,-32482,-4327,-32481,-4336,-32479,-4344,-32478,-4352,-32477,-4360,-32476,-4369,-32475,-4377,-32474,-4385,-32473,-4394,-32472,-4402,-32471,-4410,-32469,-4419,-32468,-4427,-32467,-4435,-32466,-4444,-32465,-4452,-32464,-4460,-32463,-4468,-32461,-4477,-32460,-4485,-32459,-4493,-32458,-4502,-32457,-4510,-32456,-4518,-32455,-4526,-32453,-4535,-32452,-4543,-32451,-4551,-32450,-4560,-32449,-4568,-32448,-4576,-32446,-4585,-32445,-4593,-32444,-4601,-32443,-4609,-32442,-4618,-32441,-4626,-32439,-4634,-32438,-4643,-32437,-4651,-32436,-4659,-32435,-4667,-32433,-4676,-32432,-4684,-32431,-4692,-32430,-4701,-32429,-4709,-32427,-4717,-32426,-4726,-32425,-4734,-32424,-4742,-32423,-4750,-32421,-4759,-32420,-4767,-32419,-4775,-32418,-4784,-32417,-4792,-32415,-4800,-32414,-4808,-32413,-4817,-32412,-4825,-32410,-4833,-32409,-4842,-32408,-4850,-32407,-4858,-32405,-4866,-32404,-4875,-32403,-4883,-32402,-4891,-32400,-4900,-32399,-4908,-32398,-4916,-32397,-4924,-32395,-4933,-32394,-4941,-32393,-4949,-32392,-4958,-32390,-4966,-32389,-4974,-32388,-4982,-32387,-4991,-32385,-4999,-32384,-5007,-32383,-5015,-32381,-5024,-32380,-5032,-32379,-5040,-32378,-5049,-32376,-5057,-32375,-5065,-32374,-5073,-32372,-5082,-32371,-5090,-32370,-5098,-32369,-5107,-32367,-5115,-32366,-5123,-32365,-5131,-32363,-5140,-32362,-5148,-32361,-5156,-32359,-5164,-32358,-5173,-32357,-5181,-32355,-5189,-32354,-5198,-32353,-5206,-32351,-5214,-32350,-5222,-32349,-5231,-32347,-5239,-32346,-5247,-32345,-5255,-32343,-5264,-32342,-5272,-32341,-5280,-32339,-5288,-32338,-5297,-32337,-5305,-32335,-5313,-32334,-5322,-32333,-5330,-32331,-5338,-32330,-5346,-32328,-5355,-32327,-5363,-32326,-5371,-32324,-5379,-32323,-5388,-32322,-5396,-32320,-5404,-32319,-5412,-32317,-5421,-32316,-5429,-32315,-5437,-32313,-5446,-32312,-5454,-32311,-5462,-32309,-5470,-32308,-5479,-32306,-5487,-32305,-5495,-32304,-5503,-32302,-5512,-32301,-5520,-32299,-5528,-32298,-5536,-32296,-5545,-32295,-5553,-32294,-5561,-32292,-5569,-32291,-5578,-32289,-5586,-32288,-5594,-32287,-5602,-32285,-5611,-32284,-5619,-32282,-5627,-32281,-5635,-32279,-5644,-32278,-5652,-32276,-5660,-32275,-5668,-32274,-5677,-32272,-5685,-32271,-5693,-32269,-5701,-32268,-5710,-32266,-5718,-32265,-5726,-32263,-5734,-32262,-5743,-32260,-5751,-32259,-5759,-32257,-5767,-32256,-5776,-32255,-5784,-32253,-5792,-32252,-5800,-32250,-5809,-32249,-5817,-32247,-5825,-32246,-5833,-32244,-5842,-32243,-5850,-32241,-5858,-32240,-5866,-32238,-5875,-32237,-5883,-32235,-5891,-32234,-5899,-32232,-5908,-32231,-5916,-32229,-5924,-32228,-5932,-32226,-5941,-32225,-5949,-32223,-5957,-32222,-5965,-32220,-5973,-32219,-5982,-32217,-5990,-32215,-5998,-32214,-6006,-32212,-6015,-32211,-6023,-32209,-6031,-32208,-6039,-32206,-6048,-32205,-6056,-32203,-6064,-32202,-6072,-32200,-6081,-32198,-6089,-32197,-6097,-32195,-6105,-32194,-6113,-32192,-6122,-32191,-6130,-32189,-6138,-32188,-6146,-32186,-6155,-32184,-6163,-32183,-6171,-32181,-6179,-32180,-6187,-32178,-6196,-32177,-6204,-32175,-6212,-32173,-6220,-32172,-6229,-32170,-6237,-32169,-6245,-32167,-6253,-32165,-6262,-32164,-6270,-32162,-6278,-32161,-6286,-32159,-6294,-32157,-6303,-32156,-6311,-32154,-6319,-32153,-6327,-32151,-6335,-32149,-6344,-32148,-6352,-32146,-6360,-32144,-6368,-32143,-6377,-32141,-6385,-32140,-6393,-32138,-6401,-32136,-6409,-32135,-6418,-32133,-6426,-32131,-6434,-32130,-6442,-32128,-6451,-32126,-6459,-32125,-6467,-32123,-6475,-32121,-6483,-32120,-6492,-32118,-6500,-32116,-6508,-32115,-6516,-32113,-6524,-32111,-6533,-32110,-6541,-32108,-6549,-32106,-6557,-32105,-6565,-32103,-6574,-32101,-6582,-32100,-6590,-32098,-6598,-32096,-6607,-32095,-6615,-32093,-6623,-32091,-6631,-32090,-6639,-32088,-6648,-32086,-6656,-32085,-6664,-32083,-6672,-32081,-6680,-32079,-6689,-32078,-6697,-32076,-6705,-32074,-6713,-32073,-6721,-32071,-6730,-32069,-6738,-32067,-6746,-32066,-6754,-32064,-6762,-32062,-6771,-32060,-6779,-32059,-6787,-32057,-6795,-32055,-6803,-32054,-6812,-32052,-6820,-32050,-6828,-32048,-6836,-32047,-6844,-32045,-6852,-32043,-6861,-32041,-6869,-32040,-6877,-32038,-6885,-32036,-6893,-32034,-6902,-32033,-6910,-32031,-6918,-32029,-6926,-32027,-6934,-32025,-6943,-32024,-6951,-32022,-6959,-32020,-6967,-32018,-6975,-32017,-6983,-32015,-6992,-32013,-7000,-32011,-7008,-32009,-7016,-32008,-7024,-32006,-7033,-32004,-7041,-32002,-7049,-32000,-7057,-31999,-7065,-31997,-7073,-31995,-7082,-31993,-7090,-31991,-7098,-31990,-7106,-31988,-7114,-31986,-7123,-31984,-7131,-31982,-7139,-31980,-7147,-31979,-7155,-31977,-7163,-31975,-7172,-31973,-7180,-31971,-7188,-31969,-7196,-31968,-7204,-31966,-7212,-31964,-7221,-31962,-7229,-31960,-7237,-31958,-7245,-31957,-7253,-31955,-7262,-31953,-7270,-31951,-7278,-31949,-7286,-31947,-7294,-31945,-7302,-31944,-7311,-31942,-7319,-31940,-7327,-31938,-7335,-31936,-7343,-31934,-7351,-31932,-7359,-31930,-7368,-31929,-7376,-31927,-7384,-31925,-7392,-31923,-7400,-31921,-7408,-31919,-7417,-31917,-7425,-31915,-7433,-31913,-7441,-31912,-7449,-31910,-7457,-31908,-7466,-31906,-7474,-31904,-7482,-31902,-7490,-31900,-7498,-31898,-7506,-31896,-7515,-31894,-7523,-31892,-7531,-31890,-7539,-31889,-7547,-31887,-7555,-31885,-7563,-31883,-7572,-31881,-7580,-31879,-7588,-31877,-7596,-31875,-7604,-31873,-7612,-31871,-7620,-31869,-7629,-31867,-7637,-31865,-7645,-31863,-7653,-31861,-7661,-31859,-7669,-31857,-7677,-31855,-7686,-31854,-7694,-31852,-7702,-31850,-7710,-31848,-7718,-31846,-7726,-31844,-7734,-31842,-7743,-31840,-7751,-31838,-7759,-31836,-7767,-31834,-7775,-31832,-7783,-31830,-7791,-31828,-7800,-31826,-7808,-31824,-7816,-31822,-7824,-31820,-7832,-31818,-7840,-31816,-7848,-31814,-7857,-31812,-7865,-31810,-7873,-31808,-7881,-31806,-7889,-31804,-7897,-31802,-7905,-31800,-7913,-31798,-7922,-31796,-7930,-31794,-7938,-31792,-7946,-31790,-7954,-31788,-7962,-31786,-7970,-31783,-7978,-31781,-7987,-31779,-7995,-31777,-8003,-31775,-8011,-31773,-8019,-31771,-8027,-31769,-8035,-31767,-8043,-31765,-8052,-31763,-8060,-31761,-8068,-31759,-8076,-31757,-8084,-31755,-8092,-31753,-8100,-31751,-8108,-31749,-8117,-31746,-8125,-31744,-8133,-31742,-8141,-31740,-8149,-31738,-8157,-31736,-8165,-31734,-8173,-31732,-8181,-31730,-8190,-31728,-8198,-31726,-8206,-31724,-8214,-31721,-8222,-31719,-8230,-31717,-8238,-31715,-8246,-31713,-8254,-31711,-8263,-31709,-8271,-31707,-8279,-31705,-8287,-31702,-8295,-31700,-8303,-31698,-8311,-31696,-8319,-31694,-8327,-31692,-8335,-31690,-8344,-31688,-8352,-31685,-8360,-31683,-8368,-31681,-8376,-31679,-8384,-31677,-8392,-31675,-8400,-31673,-8408,-31670,-8416,-31668,-8425,-31666,-8433,-31664,-8441,-31662,-8449,-31660,-8457,-31657,-8465,-31655,-8473,-31653,-8481,-31651,-8489,-31649,-8497,-31647,-8505,-31644,-8514,-31642,-8522,-31640,-8530,-31638,-8538,-31636,-8546,-31634,-8554,-31631,-8562,-31629,-8570,-31627,-8578,-31625,-8586,-31623,-8594,-31620,-8603,-31618,-8611,-31616,-8619,-31614,-8627,-31612,-8635,-31609,-8643,-31607,-8651,-31605,-8659,-31603,-8667,-31601,-8675,-31598,-8683,-31596,-8691,-31594,-8700,-31592,-8708,-31589,-8716,-31587,-8724,-31585,-8732,-31583,-8740,-31581,-8748,-31578,-8756,-31576,-8764,-31574,-8772,-31572,-8780,-31569,-8788,-31567,-8796,-31565,-8804,-31563,-8813,-31560,-8821,-31558,-8829,-31556,-8837,-31554,-8845,-31551,-8853,-31549,-8861,-31547,-8869,-31545,-8877,-31542,-8885,-31540,-8893,-31538,-8901,-31535,-8909,-31533,-8917,-31531,-8925,-31529,-8933,-31526,-8942,-31524,-8950,-31522,-8958,-31519,-8966,-31517,-8974,-31515,-8982,-31513,-8990,-31510,-8998,-31508,-9006,-31506,-9014,-31503,-9022,-31501,-9030,-31499,-9038,-31496,-9046,-31494,-9054,-31492,-9062,-31490,-9070,-31487,-9078,-31485,-9087,-31483,-9095,-31480,-9103,-31478,-9111,-31476,-9119,-31473,-9127,-31471,-9135,-31469,-9143,-31466,-9151,-31464,-9159,-31462,-9167,-31459,-9175,-31457,-9183,-31455,-9191,-31452,-9199,-31450,-9207,-31447,-9215,-31445,-9223,-31443,-9231,-31440,-9239,-31438,-9247,-31436,-9255,-31433,-9263,-31431,-9271,-31429,-9280,-31426,-9288,-31424,-9296,-31421,-9304,-31419,-9312,-31417,-9320,-31414,-9328,-31412,-9336,-31410,-9344,-31407,-9352,-31405,-9360,-31402,-9368,-31400,-9376,-31398,-9384,-31395,-9392,-31393,-9400,-31390,-9408,-31388,-9416,-31386,-9424,-31383,-9432,-31381,-9440,-31378,-9448,-31376,-9456,-31374,-9464,-31371,-9472,-31369,-9480,-31366,-9488,-31364,-9496,-31361,-9504,-31359,-9512,-31357,-9520,-31354,-9528,-31352,-9536,-31349,-9544,-31347,-9552,-31344,-9560,-31342,-9568,-31339,-9576,-31337,-9584,-31335,-9592,-31332,-9600,-31330,-9608,-31327,-9616,-31325,-9624,-31322,-9632,-31320,-9640,-31317,-9648,-31315,-9656,-31312,-9664,-31310,-9672,-31308,-9680,-31305,-9688,-31303,-9696,-31300,-9704,-31298,-9712,-31295,-9720,-31293,-9728,-31290,-9736,-31288,-9744,-31285,-9752,-31283,-9760,-31280,-9768,-31278,-9776,-31275,-9784,-31273,-9792,-31270,-9800,-31268,-9808,-31265,-9816,-31263,-9824,-31260,-9832,-31258,-9840,-31255,-9848,-31253,-9856,-31250,-9864,-31248,-9872,-31245,-9880,-31243,-9888,-31240,-9896,-31237,-9904,-31235,-9912,-31232,-9920,-31230,-9928,-31227,-9936,-31225,-9944,-31222,-9952,-31220,-9960,-31217,-9968,-31215,-9976,-31212,-9984,-31210,-9992,-31207,-10000,-31204,-10008,-31202,-10016,-31199,-10024,-31197,-10032,-31194,-10040,-31192,-10048,-31189,-10056,-31186,-10064,-31184,-10072,-31181,-10080,-31179,-10088,-31176,-10096,-31174,-10104,-31171,-10112,-31168,-10120,-31166,-10128,-31163,-10136,-31161,-10144,-31158,-10152,-31155,-10160,-31153,-10167,-31150,-10175,-31148,-10183,-31145,-10191,-31142,-10199,-31140,-10207,-31137,-10215,-31135,-10223,-31132,-10231,-31129,-10239,-31127,-10247,-31124,-10255,-31122,-10263,-31119,-10271,-31116,-10279,-31114,-10287,-31111,-10295,-31108,-10303,-31106,-10311,-31103,-10319,-31101,-10327,-31098,-10335,-31095,-10343,-31093,-10350,-31090,-10358,-31087,-10366,-31085,-10374,-31082,-10382,-31079,-10390,-31077,-10398,-31074,-10406,-31071,-10414,-31069,-10422,-31066,-10430,-31063,-10438,-31061,-10446,-31058,-10454,-31055,-10462,-31053,-10470,-31050,-10478,-31047,-10485,-31045,-10493,-31042,-10501,-31039,-10509,-31037,-10517,-31034,-10525,-31031,-10533,-31029,-10541,-31026,-10549,-31023,-10557,-31020,-10565,-31018,-10573,-31015,-10581,-31012,-10589,-31010,-10597,-31007,-10604,-31004,-10612,-31002,-10620,-30999,-10628,-30996,-10636,-30993,-10644,-30991,-10652,-30988,-10660,-30985,-10668,-30982,-10676,-30980,-10684,-30977,-10692,-30974,-10700,-30972,-10707,-30969,-10715,-30966,-10723,-30963,-10731,-30961,-10739,-30958,-10747,-30955,-10755,-30952,-10763,-30950,-10771,-30947,-10779,-30944,-10787,-30941,-10795,-30939,-10802,-30936,-10810,-30933,-10818,-30930,-10826,-30928,-10834,-30925,-10842,-30922,-10850,-30919,-10858,-30916,-10866,-30914,-10874,-30911,-10881,-30908,-10889,-30905,-10897,-30903,-10905,-30900,-10913,-30897,-10921,-30894,-10929,-30891,-10937,-30889,-10945,-30886,-10953,-30883,-10960,-30880,-10968,-30877,-10976,-30875,-10984,-30872,-10992,-30869,-11000,-30866,-11008,-30863,-11016,-30861,-11024,-30858,-11031,-30855,-11039,-30852,-11047,-30849,-11055,-30846,-11063,-30844,-11071,-30841,-11079,-30838,-11087,-30835,-11095,-30832,-11102,-30829,-11110,-30827,-11118,-30824,-11126,-30821,-11134,-30818,-11142,-30815,-11150,-30812,-11158,-30810,-11165,-30807,-11173,-30804,-11181,-30801,-11189,-30798,-11197,-30795,-11205,-30792,-11213,-30789,-11221,-30787,-11228,-30784,-11236,-30781,-11244,-30778,-11252,-30775,-11260,-30772,-11268,-30769,-11276,-30767,-11284,-30764,-11291,-30761,-11299,-30758,-11307,-30755,-11315,-30752,-11323,-30749,-11331,-30746,-11339,-30743,-11346,-30740,-11354,-30738,-11362,-30735,-11370,-30732,-11378,-30729,-11386,-30726,-11394,-30723,-11401,-30720,-11409,-30717,-11417,-30714,-11425,-30711,-11433,-30708,-11441,-30706,-11449,-30703,-11456,-30700,-11464,-30697,-11472,-30694,-11480,-30691,-11488,-30688,-11496,-30685,-11503,-30682,-11511,-30679,-11519,-30676,-11527,-30673,-11535,-30670,-11543,-30667,-11551,-30664,-11558,-30661,-11566,-30658,-11574,-30656,-11582,-30653,-11590,-30650,-11598,-30647,-11605,-30644,-11613,-30641,-11621,-30638,-11629,-30635,-11637,-30632,-11645,-30629,-11652,-30626,-11660,-30623,-11668,-30620,-11676,-30617,-11684,-30614,-11692,-30611,-11699,-30608,-11707,-30605,-11715,-30602,-11723,-30599,-11731,-30596,-11738,-30593,-11746,-30590,-11754,-30587,-11762,-30584,-11770,-30581,-11778,-30578,-11785,-30575,-11793,-30572,-11801,-30569,-11809,-30566,-11817,-30563,-11824,-30560,-11832,-30557,-11840,-30554,-11848,-30551,-11856,-30548,-11863,-30545,-11871,-30542,-11879,-30539,-11887,-30536,-11895,-30533,-11903,-30529,-11910,-30526,-11918,-30523,-11926,-30520,-11934,-30517,-11942,-30514,-11949,-30511,-11957,-30508,-11965,-30505,-11973,-30502,-11981,-30499,-11988,-30496,-11996,-30493,-12004,-30490,-12012,-30487,-12020,-30484,-12027,-30481,-12035,-30477,-12043,-30474,-12051,-30471,-12058,-30468,-12066,-30465,-12074,-30462,-12082,-30459,-12090,-30456,-12097,-30453,-12105,-30450,-12113,-30447,-12121,-30443,-12129,-30440,-12136,-30437,-12144,-30434,-12152,-30431,-12160,-30428,-12167,-30425,-12175,-30422,-12183,-30419,-12191,-30416,-12199,-30412,-12206,-30409,-12214,-30406,-12222,-30403,-12230,-30400,-12237,-30397,-12245,-30394,-12253,-30391,-12261,-30387,-12269,-30384,-12276,-30381,-12284,-30378,-12292,-30375,-12300,-30372,-12307,-30369,-12315,-30365,-12323,-30362,-12331,-30359,-12338,-30356,-12346,-30353,-12354,-30350,-12362,-30346,-12369,-30343,-12377,-30340,-12385,-30337,-12393,-30334,-12400,-30331,-12408,-30327,-12416,-30324,-12424,-30321,-12431,-30318,-12439,-30315,-12447,-30312,-12455,-30308,-12462,-30305,-12470,-30302,-12478,-30299,-12486,-30296,-12493,-30292,-12501,-30289,-12509,-30286,-12517,-30283,-12524,-30280,-12532,-30276,-12540,-30273,-12548,-30270,-12555,-30267,-12563,-30264,-12571,-30260,-12579,-30257,-12586,-30254,-12594,-30251,-12602,-30248,-12610,-30244,-12617,-30241,-12625,-30238,-12633,-30235,-12640,-30231,-12648,-30228,-12656,-30225,-12664,-30222,-12671,-30218,-12679,-30215,-12687,-30212,-12695,-30209,-12702,-30206,-12710,-30202,-12718,-30199,-12725,-30196,-12733,-30192,-12741,-30189,-12749,-30186,-12756,-30183,-12764,-30179,-12772,-30176,-12779,-30173,-12787,-30170,-12795,-30166,-12803,-30163,-12810,-30160,-12818,-30157,-12826,-30153,-12833,-30150,-12841,-30147,-12849,-30143,-12857,-30140,-12864,-30137,-12872,-30134,-12880,-30130,-12887,-30127,-12895,-30124,-12903,-30120,-12910,-30117,-12918,-30114,-12926,-30110,-12934,-30107,-12941,-30104,-12949,-30101,-12957,-30097,-12964,-30094,-12972,-30091,-12980,-30087,-12987,-30084,-12995,-30081,-13003,-30077,-13010,-30074,-13018,-30071,-13026,-30067,-13034,-30064,-13041,-30061,-13049,-30057,-13057,-30054,-13064,-30051,-13072,-30047,-13080,-30044,-13087,-30041,-13095,-30037,-13103,-30034,-13110,-30031,-13118,-30027,-13126,-30024,-13133,-30021,-13141,-30017,-13149,-30014,-13156,-30010,-13164,-30007,-13172,-30004,-13179,-30000,-13187,-29997,-13195,-29994,-13202,-29990,-13210,-29987,-13218,-29984,-13225,-29980,-13233,-29977,-13241,-29973,-13248,-29970,-13256,-29967,-13264,-29963,-13271,-29960,-13279,-29956,-13287,-29953,-13294,-29950,-13302,-29946,-13310,-29943,-13317,-29939,-13325,-29936,-13333,-29933,-13340,-29929,-13348,-29926,-13356,-29922,-13363,-29919,-13371,-29916,-13379,-29912,-13386,-29909,-13394,-29905,-13401,-29902,-13409,-29898,-13417,-29895,-13424,-29892,-13432,-29888,-13440,-29885,-13447,-29881,-13455,-29878,-13463,-29874,-13470,-29871,-13478,-29867,-13486,-29864,-13493,-29861,-13501,-29857,-13508,-29854,-13516,-29850,-13524,-29847,-13531,-29843,-13539,-29840,-13547,-29836,-13554,-29833,-13562,-29829,-13569,-29826,-13577,-29823,-13585,-29819,-13592,-29816,-13600,-29812,-13608,-29809,-13615,-29805,-13623,-29802,-13630,-29798,-13638,-29795,-13646,-29791,-13653,-29788,-13661,-29784,-13668,-29781,-13676,-29777,-13684,-29774,-13691,-29770,-13699,-29767,-13707,-29763,-13714,-29760,-13722,-29756,-13729,-29753,-13737,-29749,-13745,-29746,-13752,-29742,-13760,-29739,-13767,-29735,-13775,-29732,-13783,-29728,-13790,-29725,-13798,-29721,-13805,-29718,-13813,-29714,-13821,-29710,-13828,-29707,-13836,-29703,-13843,-29700,-13851,-29696,-13859,-29693,-13866,-29689,-13874,-29686,-13881,-29682,-13889,-29679,-13896,-29675,-13904,-29671,-13912,-29668,-13919,-29664,-13927,-29661,-13934,-29657,-13942,-29654,-13950,-29650,-13957,-29647,-13965,-29643,-13972,-29639,-13980,-29636,-13987,-29632,-13995,-29629,-14003,-29625,-14010,-29622,-14018,-29618,-14025,-29614,-14033,-29611,-14040,-29607,-14048,-29604,-14056,-29600,-14063,-29596,-14071,-29593,-14078,-29589,-14086,-29586,-14093,-29582,-14101,-29578,-14109,-29575,-14116,-29571,-14124,-29568,-14131,-29564,-14139,-29560,-14146,-29557,-14154,-29553,-14161,-29549,-14169,-29546,-14177,-29542,-14184,-29539,-14192,-29535,-14199,-29531,-14207,-29528,-14214,-29524,-14222,-29520,-14229,-29517,-14237,-29513,-14245,-29510,-14252,-29506,-14260,-29502,-14267,-29499,-14275,-29495,-14282,-29491,-14290,-29488,-14297,-29484,-14305,-29480,-14312,-29477,-14320,-29473,-14327,-29469,-14335,-29466,-14343,-29462,-14350,-29458,-14358,-29455,-14365,-29451,-14373,-29447,-14380,-29444,-14388,-29440,-14395,-29436,-14403,-29433,-14410,-29429,-14418,-29425,-14425,-29422,-14433,-29418,-14440,-29414,-14448,-29411,-14455,-29407,-14463,-29403,-14470,-29399,-14478,-29396,-14485,-29392,-14493,-29388,-14500,-29385,-14508,-29381,-14516,-29377,-14523,-29373,-14531,-29370,-14538,-29366,-14546,-29362,-14553,-29359,-14561,-29355,-14568,-29351,-14576,-29347,-14583,-29344,-14591,-29340,-14598,-29336,-14606,-29333,-14613,-29329,-14621,-29325,-14628,-29321,-14636,-29318,-14643,-29314,-14651,-29310,-14658,-29306,-14666,-29303,-14673,-29299,-14681,-29295,-14688,-29291,-14695,-29288,-14703,-29284,-14710,-29280,-14718,-29276,-14725,-29273,-14733,-29269,-14740,-29265,-14748,-29261,-14755,-29257,-14763,-29254,-14770,-29250,-14778,-29246,-14785,-29242,-14793,-29239,-14800,-29235,-14808,-29231,-14815,-29227,-14823,-29223,-14830,-29220,-14838,-29216,-14845,-29212,-14853,-29208,-14860,-29204,-14867,-29201,-14875,-29197,-14882,-29193,-14890,-29189,-14897,-29185,-14905,-29182,-14912,-29178,-14920,-29174,-14927,-29170,-14935,-29166,-14942,-29163,-14950,-29159,-14957,-29155,-14964,-29151,-14972,-29147,-14979,-29143,-14987,-29140,-14994,-29136,-15002,-29132,-15009,-29128,-15017,-29124,-15024,-29120,-15031,-29117,-15039,-29113,-15046,-29109,-15054,-29105,-15061,-29101,-15069,-29097,-15076,-29093,-15084,-29090,-15091,-29086,-15098,-29082,-15106,-29078,-15113,-29074,-15121,-29070,-15128,-29066,-15136,-29063,-15143,-29059,-15150,-29055,-15158,-29051,-15165,-29047,-15173,-29043,-15180,-29039,-15188,-29035,-15195,-29032,-15202,-29028,-15210,-29024,-15217,-29020,-15225,-29016,-15232,-29012,-15239,-29008,-15247,-29004,-15254,-29000,-15262,-28997,-15269,-28993,-15277,-28989,-15284,-28985,-15291,-28981,-15299,-28977,-15306,-28973,-15314,-28969,-15321,-28965,-15328,-28961,-15336,-28957,-15343,-28954,-15351,-28950,-15358,-28946,-15365,-28942,-15373,-28938,-15380,-28934,-15388,-28930,-15395,-28926,-15402,-28922,-15410,-28918,-15417,-28914,-15425,-28910,-15432,-28906,-15439,-28902,-15447,-28898,-15454,-28894,-15462,-28891,-15469,-28887,-15476,-28883,-15484,-28879,-15491,-28875,-15498,-28871,-15506,-28867,-15513,-28863,-15521,-28859,-15528,-28855,-15535,-28851,-15543,-28847,-15550,-28843,-15557,-28839,-15565,-28835,-15572,-28831,-15580,-28827,-15587,-28823,-15594,-28819,-15602,-28815,-15609,-28811,-15616,-28807,-15624,-28803,-15631,-28799,-15639,-28795,-15646,-28791,-15653,-28787,-15661,-28783,-15668,-28779,-15675,-28775,-15683,-28771,-15690,-28767,-15697,-28763,-15705,-28759,-15712,-28755,-15719,-28751,-15727,-28747,-15734,-28743,-15741,-28739,-15749,-28735,-15756,-28731,-15764,-28727,-15771,-28723,-15778,-28719,-15786,-28715,-15793,-28711,-15800,-28707,-15808,-28703,-15815,-28699,-15822,-28695,-15830,-28691,-15837,-28686,-15844,-28682,-15852,-28678,-15859,-28674,-15866,-28670,-15874,-28666,-15881,-28662,-15888,-28658,-15896,-28654,-15903,-28650,-15910,-28646,-15918,-28642,-15925,-28638,-15932,-28634,-15939,-28630,-15947,-28626,-15954,-28621,-15961,-28617,-15969,-28613,-15976,-28609,-15983,-28605,-15991,-28601,-15998,-28597,-16005,-28593,-16013,-28589,-16020,-28585,-16027,-28581,-16035,-28576,-16042,-28572,-16049,-28568,-16056,-28564,-16064,-28560,-16071,-28556,-16078,-28552,-16086,-28548,-16093,-28544,-16100,-28539,-16108,-28535,-16115,-28531,-16122,-28527,-16129,-28523,-16137,-28519,-16144,-28515,-16151,-28511,-16159,-28507,-16166,-28502,-16173,-28498,-16180,-28494,-16188,-28490,-16195,-28486,-16202,-28482,-16210,-28478,-16217,-28473,-16224,-28469,-16231,-28465,-16239,-28461,-16246,-28457,-16253,-28453,-16261,-28448,-16268,-28444,-16275,-28440,-16282,-28436,-16290,-28432,-16297,-28428,-16304,-28424,-16311,-28419,-16319,-28415,-16326,-28411,-16333,-28407,-16340,-28403,-16348,-28398,-16355,-28394,-16362,-28390,-16369,-28386,-16377,-28382}; From 8a2faa1cb3a2d0909a3e3dbbc8240d7d281e01d1 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 28 Sep 2016 06:31:29 +0200 Subject: [PATCH 261/340] change the build script to oai/ssh package --- cmake_targets/tools/build_helper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index b855b28e10..a12af1c235 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -291,7 +291,7 @@ check_install_additional_tools (){ $SUDO pip install paramiko $SUDO pip install pyroute2 $SUDO rm -fr /opt/ssh - $SUDO GIT_SSL_NO_VERIFY=true git clone https://gist.github.com/2190472.git /opt/ssh + $SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/ssh.git /opt/ssh log_netiface=$OPENAIR_DIR/cmake_targets/log/netiface_install_log.txt echo_info "Installing Netinterfaces package. The logfile for installation is in $log_netiface" From 74316f6b693365b53ccbbd1b2e341ad2866fc8cb Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 28 Sep 2016 10:43:13 +0200 Subject: [PATCH 262/340] remove COPYING files Most of them were the GPL. It is useless to have a copy of the license in every sub-directory. From now on, there is only the LICENSE in the top directory of the distribution. deleted: common/utils/COPYING deleted: common/utils/hashtable/COPYING deleted: common/utils/itti/COPYING deleted: common/utils/itti_analyzer/COPYING deleted: common/utils/itti_analyzer/common/COPYING deleted: common/utils/itti_analyzer/libbuffers/COPYING deleted: common/utils/itti_analyzer/libparser/COPYING deleted: common/utils/itti_analyzer/libresolver/COPYING deleted: common/utils/itti_analyzer/libui/COPYING deleted: openair1/COPYING deleted: openair1/PHY/CODING/COPYING deleted: openair1/PHY/CODING/TESTBENCH/COPYING deleted: openair1/PHY/COPYING deleted: openair1/PHY/INIT/COPYING deleted: openair1/PHY/LTE_ESTIMATION/COPYING deleted: openair1/PHY/LTE_REFSIG/COPYING deleted: openair1/PHY/LTE_TRANSPORT/COPYING deleted: openair1/PHY/MODULATION/COPYING deleted: openair1/PHY/TOOLS/COPYING deleted: openair1/SCHED/COPYING deleted: openair1/SIMULATION/COPYING deleted: openair1/SIMULATION/ETH_TRANSPORT/COPYING deleted: openair1/SIMULATION/LTE_PHY/COPYING deleted: openair1/SIMULATION/RF/COPYING deleted: openair1/SIMULATION/TOOLS/COPYING deleted: openair2/COMMON/COPYING deleted: openair2/DOCS/TEMPLATES/CODE/COPYING deleted: openair2/LAYER2/COPYING deleted: openair2/LAYER2/MAC/COPYING deleted: openair2/LAYER2/PDCP_v10.1.0/COPYING deleted: openair2/LAYER2/RLC/AM_v9.3.0/COPYING deleted: openair2/LAYER2/RLC/COPYING deleted: openair2/LAYER2/RLC/TM_v9.3.0/COPYING deleted: openair2/LAYER2/RLC/UM_v9.3.0/COPYING deleted: openair2/NETWORK_DRIVER/LITE/COPYING deleted: openair2/NETWORK_DRIVER/MESH/COPYING deleted: openair2/NETWORK_DRIVER/UE_IP/COPYING deleted: openair2/PHY_INTERFACE/COPYING deleted: openair2/RRC/L2_INTERFACE/COPYING deleted: openair2/RRC/LITE/COPYING deleted: openair2/RRC/LITE/MESSAGES/COPYING deleted: openair2/RRC/NAS/COPYING deleted: openair2/RRM_4_RRC_LITE/COPYING deleted: openair2/RRM_4_RRC_LITE/src/COPYING deleted: openair2/RRM_4_RRC_LITE/src/radio_resources/COPYING deleted: openair2/UTIL/BIGPHYS/COPYING deleted: openair2/UTIL/CLI/COPYING deleted: openair2/UTIL/FIFO/COPYING deleted: openair2/UTIL/LISTS/COPYING deleted: openair2/UTIL/LOG/COPYING deleted: openair2/UTIL/MATH/COPYING deleted: openair2/UTIL/MEM/COPYING deleted: openair2/UTIL/OCG/COPYING deleted: openair2/UTIL/OMG/COPYING deleted: openair2/UTIL/OMV/COPYING deleted: openair2/UTIL/OPT/COPYING deleted: openair2/UTIL/OSA/COPYING deleted: openair2/UTIL/OSD/COPYING deleted: openair2/UTIL/OTG/COPYING deleted: openair2/UTIL/SCTP/COPYING deleted: openair2/UTIL/TIMER/COPYING deleted: openair2/UTIL/TRACE/COPYING deleted: openair2/X2AP/COPYING deleted: openair3/COPYING deleted: openair3/DOCS/COPYING deleted: openair3/DOCS/DOXYGEN/COPYING deleted: openair3/DOCS/Latex/COPYING deleted: openair3/DOCS/Latex/DefaultBearer/COPYING deleted: openair3/DOCS/Latex/EPC/COPYING deleted: openair3/NAS/COMMON/API/NETWORK/COPYING deleted: openair3/NAS/COMMON/COPYING deleted: openair3/NAS/COMMON/EMM/MSG/COPYING deleted: openair3/NAS/COMMON/ESM/MSG/COPYING deleted: openair3/NAS/COMMON/IES/COPYING deleted: openair3/NAS/COMMON/UTIL/COPYING deleted: openair3/NAS/COPYING deleted: openair3/NAS/TEST/AS_SIMULATOR/COPYING deleted: openair3/NAS/TEST/COPYING deleted: openair3/NAS/TEST/MSC/COPYING deleted: openair3/NAS/TEST/NETWORK/COPYING deleted: openair3/NAS/TEST/USER/COPYING deleted: openair3/NAS/TOOLS/COPYING deleted: openair3/NAS/UE/API/USER/COPYING deleted: openair3/NAS/UE/API/USIM/COPYING deleted: openair3/NAS/UE/EMM/SAP/COPYING deleted: openair3/NAS/UE/ESM/SAP/COPYING deleted: openair3/S1AP/COPYING deleted: openair3/S1AP/MESSAGES/ASN1/COPYING deleted: openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING deleted: openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING deleted: openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING deleted: openair3/S1AP/MESSAGES/COPYING deleted: openair3/SCTP/COPYING deleted: openair3/SECU/COPYING deleted: openair3/TEST/COPYING deleted: openair3/UTILS/COPYING deleted: targets/ARCH/COMMON/COPYING deleted: targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING deleted: targets/ARCH/EXMIMO/DEFS/COPYING deleted: targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING deleted: targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING deleted: targets/ARCH/EXMIMO/DRIVER/telecomparistech/COPYING deleted: targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING deleted: targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING deleted: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING deleted: targets/ARCH/USRP/USERSPACE/LIB/COPYING deleted: targets/COMMON/COPYING deleted: targets/COPYING deleted: targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/COPYING deleted: targets/PROJECTS/COPYING deleted: targets/PROJECTS/GENERIC-LTE-EPC/COPYING deleted: targets/RT/USER/COPYING deleted: targets/SIMU/PROC/COPYING deleted: targets/SIMU/USER/COPYING --- common/utils/COPYING | 28 - common/utils/hashtable/COPYING | 94 --- common/utils/itti/COPYING | 28 - common/utils/itti_analyzer/COPYING | 28 - common/utils/itti_analyzer/common/COPYING | 28 - common/utils/itti_analyzer/libbuffers/COPYING | 28 - common/utils/itti_analyzer/libparser/COPYING | 28 - .../utils/itti_analyzer/libresolver/COPYING | 28 - common/utils/itti_analyzer/libui/COPYING | 28 - openair1/COPYING | 674 ------------------ openair1/PHY/CODING/COPYING | 340 --------- openair1/PHY/CODING/TESTBENCH/COPYING | 674 ------------------ openair1/PHY/COPYING | 674 ------------------ openair1/PHY/INIT/COPYING | 674 ------------------ openair1/PHY/LTE_ESTIMATION/COPYING | 674 ------------------ openair1/PHY/LTE_REFSIG/COPYING | 674 ------------------ openair1/PHY/LTE_TRANSPORT/COPYING | 674 ------------------ openair1/PHY/MODULATION/COPYING | 674 ------------------ openair1/PHY/TOOLS/COPYING | 674 ------------------ openair1/SCHED/COPYING | 674 ------------------ openair1/SIMULATION/COPYING | 674 ------------------ openair1/SIMULATION/ETH_TRANSPORT/COPYING | 674 ------------------ openair1/SIMULATION/LTE_PHY/COPYING | 674 ------------------ openair1/SIMULATION/RF/COPYING | 674 ------------------ openair1/SIMULATION/TOOLS/COPYING | 674 ------------------ openair2/COMMON/COPYING | 674 ------------------ openair2/DOCS/TEMPLATES/CODE/COPYING | 340 --------- openair2/LAYER2/COPYING | 674 ------------------ openair2/LAYER2/MAC/COPYING | 674 ------------------ openair2/LAYER2/PDCP_v10.1.0/COPYING | 674 ------------------ openair2/LAYER2/RLC/AM_v9.3.0/COPYING | 674 ------------------ openair2/LAYER2/RLC/COPYING | 674 ------------------ openair2/LAYER2/RLC/TM_v9.3.0/COPYING | 674 ------------------ openair2/LAYER2/RLC/UM_v9.3.0/COPYING | 674 ------------------ openair2/NETWORK_DRIVER/LITE/COPYING | 674 ------------------ openair2/NETWORK_DRIVER/MESH/COPYING | 674 ------------------ openair2/NETWORK_DRIVER/UE_IP/COPYING | 674 ------------------ openair2/PHY_INTERFACE/COPYING | 674 ------------------ openair2/RRC/L2_INTERFACE/COPYING | 674 ------------------ openair2/RRC/LITE/COPYING | 674 ------------------ openair2/RRC/LITE/MESSAGES/COPYING | 674 ------------------ openair2/RRC/NAS/COPYING | 674 ------------------ openair2/RRM_4_RRC_LITE/COPYING | 674 ------------------ openair2/RRM_4_RRC_LITE/src/COPYING | 674 ------------------ .../src/radio_resources/COPYING | 674 ------------------ openair2/UTIL/BIGPHYS/COPYING | 674 ------------------ openair2/UTIL/CLI/COPYING | 674 ------------------ openair2/UTIL/FIFO/COPYING | 674 ------------------ openair2/UTIL/LISTS/COPYING | 674 ------------------ openair2/UTIL/LOG/COPYING | 674 ------------------ openair2/UTIL/MATH/COPYING | 674 ------------------ openair2/UTIL/MEM/COPYING | 674 ------------------ openair2/UTIL/OCG/COPYING | 674 ------------------ openair2/UTIL/OMG/COPYING | 674 ------------------ openair2/UTIL/OMV/COPYING | 340 --------- openair2/UTIL/OPT/COPYING | 674 ------------------ openair2/UTIL/OSA/COPYING | 674 ------------------ openair2/UTIL/OSD/COPYING | 674 ------------------ openair2/UTIL/OTG/COPYING | 674 ------------------ openair2/UTIL/SCTP/COPYING | 674 ------------------ openair2/UTIL/TIMER/COPYING | 674 ------------------ openair2/UTIL/TRACE/COPYING | 674 ------------------ openair2/X2AP/COPYING | 674 ------------------ openair3/COPYING | 674 ------------------ openair3/DOCS/COPYING | 674 ------------------ openair3/DOCS/DOXYGEN/COPYING | 674 ------------------ openair3/DOCS/Latex/COPYING | 674 ------------------ openair3/DOCS/Latex/DefaultBearer/COPYING | 674 ------------------ openair3/DOCS/Latex/EPC/COPYING | 674 ------------------ openair3/NAS/COMMON/API/NETWORK/COPYING | 28 - openair3/NAS/COMMON/COPYING | 28 - openair3/NAS/COMMON/EMM/MSG/COPYING | 28 - openair3/NAS/COMMON/ESM/MSG/COPYING | 28 - openair3/NAS/COMMON/IES/COPYING | 28 - openair3/NAS/COMMON/UTIL/COPYING | 28 - openair3/NAS/COPYING | 674 ------------------ openair3/NAS/TEST/AS_SIMULATOR/COPYING | 674 ------------------ openair3/NAS/TEST/COPYING | 674 ------------------ openair3/NAS/TEST/MSC/COPYING | 674 ------------------ openair3/NAS/TEST/NETWORK/COPYING | 674 ------------------ openair3/NAS/TEST/USER/COPYING | 674 ------------------ openair3/NAS/TOOLS/COPYING | 674 ------------------ openair3/NAS/UE/API/USER/COPYING | 674 ------------------ openair3/NAS/UE/API/USIM/COPYING | 674 ------------------ openair3/NAS/UE/EMM/SAP/COPYING | 674 ------------------ openair3/NAS/UE/ESM/SAP/COPYING | 674 ------------------ openair3/S1AP/COPYING | 674 ------------------ openair3/S1AP/MESSAGES/ASN1/COPYING | 674 ------------------ openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING | 674 ------------------ openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING | 674 ------------------ openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING | 674 ------------------ openair3/S1AP/MESSAGES/COPYING | 674 ------------------ openair3/SCTP/COPYING | 674 ------------------ openair3/SECU/COPYING | 674 ------------------ openair3/TEST/COPYING | 674 ------------------ openair3/UTILS/COPYING | 28 - targets/ARCH/COMMON/COPYING | 674 ------------------ targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING | 674 ------------------ targets/ARCH/EXMIMO/DEFS/COPYING | 674 ------------------ targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING | 674 ------------------ targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING | 674 ------------------ .../EXMIMO/DRIVER/telecomparistech/COPYING | 674 ------------------ targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING | 674 ------------------ .../ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING | 674 ------------------ targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING | 674 ------------------ targets/ARCH/USRP/USERSPACE/LIB/COPYING | 674 ------------------ targets/COMMON/COPYING | 674 ------------------ targets/COPYING | 674 ------------------ .../CENTOS-LTE-EPC-INTEGRATION/COPYING | 674 ------------------ targets/PROJECTS/COPYING | 674 ------------------ targets/PROJECTS/GENERIC-LTE-EPC/COPYING | 674 ------------------ targets/RT/USER/COPYING | 674 ------------------ targets/SIMU/PROC/COPYING | 674 ------------------ targets/SIMU/USER/COPYING | 674 ------------------ 114 files changed, 65564 deletions(-) delete mode 100644 common/utils/COPYING delete mode 100644 common/utils/hashtable/COPYING delete mode 100644 common/utils/itti/COPYING delete mode 100644 common/utils/itti_analyzer/COPYING delete mode 100644 common/utils/itti_analyzer/common/COPYING delete mode 100644 common/utils/itti_analyzer/libbuffers/COPYING delete mode 100644 common/utils/itti_analyzer/libparser/COPYING delete mode 100644 common/utils/itti_analyzer/libresolver/COPYING delete mode 100644 common/utils/itti_analyzer/libui/COPYING delete mode 100644 openair1/COPYING delete mode 100644 openair1/PHY/CODING/COPYING delete mode 100644 openair1/PHY/CODING/TESTBENCH/COPYING delete mode 100644 openair1/PHY/COPYING delete mode 100644 openair1/PHY/INIT/COPYING delete mode 100644 openair1/PHY/LTE_ESTIMATION/COPYING delete mode 100644 openair1/PHY/LTE_REFSIG/COPYING delete mode 100644 openair1/PHY/LTE_TRANSPORT/COPYING delete mode 100644 openair1/PHY/MODULATION/COPYING delete mode 100644 openair1/PHY/TOOLS/COPYING delete mode 100644 openair1/SCHED/COPYING delete mode 100644 openair1/SIMULATION/COPYING delete mode 100644 openair1/SIMULATION/ETH_TRANSPORT/COPYING delete mode 100644 openair1/SIMULATION/LTE_PHY/COPYING delete mode 100644 openair1/SIMULATION/RF/COPYING delete mode 100644 openair1/SIMULATION/TOOLS/COPYING delete mode 100644 openair2/COMMON/COPYING delete mode 100644 openair2/DOCS/TEMPLATES/CODE/COPYING delete mode 100644 openair2/LAYER2/COPYING delete mode 100644 openair2/LAYER2/MAC/COPYING delete mode 100644 openair2/LAYER2/PDCP_v10.1.0/COPYING delete mode 100644 openair2/LAYER2/RLC/AM_v9.3.0/COPYING delete mode 100644 openair2/LAYER2/RLC/COPYING delete mode 100644 openair2/LAYER2/RLC/TM_v9.3.0/COPYING delete mode 100644 openair2/LAYER2/RLC/UM_v9.3.0/COPYING delete mode 100755 openair2/NETWORK_DRIVER/LITE/COPYING delete mode 100644 openair2/NETWORK_DRIVER/MESH/COPYING delete mode 100755 openair2/NETWORK_DRIVER/UE_IP/COPYING delete mode 100644 openair2/PHY_INTERFACE/COPYING delete mode 100644 openair2/RRC/L2_INTERFACE/COPYING delete mode 100644 openair2/RRC/LITE/COPYING delete mode 100644 openair2/RRC/LITE/MESSAGES/COPYING delete mode 100644 openair2/RRC/NAS/COPYING delete mode 100644 openair2/RRM_4_RRC_LITE/COPYING delete mode 100644 openair2/RRM_4_RRC_LITE/src/COPYING delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/COPYING delete mode 100644 openair2/UTIL/BIGPHYS/COPYING delete mode 100644 openair2/UTIL/CLI/COPYING delete mode 100644 openair2/UTIL/FIFO/COPYING delete mode 100644 openair2/UTIL/LISTS/COPYING delete mode 100644 openair2/UTIL/LOG/COPYING delete mode 100644 openair2/UTIL/MATH/COPYING delete mode 100644 openair2/UTIL/MEM/COPYING delete mode 100644 openair2/UTIL/OCG/COPYING delete mode 100644 openair2/UTIL/OMG/COPYING delete mode 100644 openair2/UTIL/OMV/COPYING delete mode 100644 openair2/UTIL/OPT/COPYING delete mode 100644 openair2/UTIL/OSA/COPYING delete mode 100644 openair2/UTIL/OSD/COPYING delete mode 100644 openair2/UTIL/OTG/COPYING delete mode 100644 openair2/UTIL/SCTP/COPYING delete mode 100644 openair2/UTIL/TIMER/COPYING delete mode 100644 openair2/UTIL/TRACE/COPYING delete mode 100644 openair2/X2AP/COPYING delete mode 100644 openair3/COPYING delete mode 100644 openair3/DOCS/COPYING delete mode 100644 openair3/DOCS/DOXYGEN/COPYING delete mode 100644 openair3/DOCS/Latex/COPYING delete mode 100644 openair3/DOCS/Latex/DefaultBearer/COPYING delete mode 100644 openair3/DOCS/Latex/EPC/COPYING delete mode 100644 openair3/NAS/COMMON/API/NETWORK/COPYING delete mode 100644 openair3/NAS/COMMON/COPYING delete mode 100644 openair3/NAS/COMMON/EMM/MSG/COPYING delete mode 100644 openair3/NAS/COMMON/ESM/MSG/COPYING delete mode 100644 openair3/NAS/COMMON/IES/COPYING delete mode 100644 openair3/NAS/COMMON/UTIL/COPYING delete mode 100644 openair3/NAS/COPYING delete mode 100644 openair3/NAS/TEST/AS_SIMULATOR/COPYING delete mode 100644 openair3/NAS/TEST/COPYING delete mode 100644 openair3/NAS/TEST/MSC/COPYING delete mode 100644 openair3/NAS/TEST/NETWORK/COPYING delete mode 100644 openair3/NAS/TEST/USER/COPYING delete mode 100644 openair3/NAS/TOOLS/COPYING delete mode 100644 openair3/NAS/UE/API/USER/COPYING delete mode 100644 openair3/NAS/UE/API/USIM/COPYING delete mode 100755 openair3/NAS/UE/EMM/SAP/COPYING delete mode 100755 openair3/NAS/UE/ESM/SAP/COPYING delete mode 100644 openair3/S1AP/COPYING delete mode 100644 openair3/S1AP/MESSAGES/ASN1/COPYING delete mode 100644 openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING delete mode 100644 openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING delete mode 100644 openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING delete mode 100644 openair3/S1AP/MESSAGES/COPYING delete mode 100644 openair3/SCTP/COPYING delete mode 100644 openair3/SECU/COPYING delete mode 100644 openair3/TEST/COPYING delete mode 100644 openair3/UTILS/COPYING delete mode 100644 targets/ARCH/COMMON/COPYING delete mode 100644 targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING delete mode 100644 targets/ARCH/EXMIMO/DEFS/COPYING delete mode 100644 targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING delete mode 100644 targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING delete mode 100644 targets/ARCH/EXMIMO/DRIVER/telecomparistech/COPYING delete mode 100644 targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING delete mode 100644 targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING delete mode 100644 targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING delete mode 100644 targets/ARCH/USRP/USERSPACE/LIB/COPYING delete mode 100644 targets/COMMON/COPYING delete mode 100644 targets/COPYING delete mode 100644 targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/COPYING delete mode 100644 targets/PROJECTS/COPYING delete mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/COPYING delete mode 100644 targets/RT/USER/COPYING delete mode 100644 targets/SIMU/PROC/COPYING delete mode 100644 targets/SIMU/USER/COPYING diff --git a/common/utils/COPYING b/common/utils/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/common/utils/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/common/utils/hashtable/COPYING b/common/utils/hashtable/COPYING deleted file mode 100644 index 3293c58ad3..0000000000 --- a/common/utils/hashtable/COPYING +++ /dev/null @@ -1,94 +0,0 @@ - OAI PUBLIC LICENSE V1.0 - - Copyright (C) 2016 OpenAirInterface Software Alliance, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -Definitions. -“License” shall mean the terms and conditions for use, reproduction, and distribution set forth in this document. - -“Licensor” shall mean the OpenAirInterface Software Alliance. - -“Legal Entity” shall mean the union, at the time an acting entity joins the Alliance, of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License. - -“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -“OpenAirInterface Software Alliance” shall mean the endowment fund established at the initiative of Eurecom, an educational and research establishment located at Campus Sophia Tech, 450 Route des Chappes, 06410 Biot, France, which statutes were signed on 18 November 2014. - -“ “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -“Contribution” shall mean any work of authorship that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, , or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work “Contributor License Agreement” shall mean the agreement signed by any Contributor setting forth the terms and conditions applicable to its Contribution. “Contributor” shall mean any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -Grant of Copyright License. -Subject to the terms and conditions of this License, Licensor and each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form - -3. Grant of Patent License. - -3.1 Grant of Patent License for non-commercial purposes: - -Subject to the terms and conditions of this License, Licensor and each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, import, and otherwise transfer the Work, for non-commercial purposes, where such license applies only to those patent claims licensable by such Contributor or Licensor that are necessarily infringed by the Work and/or their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. - -3.2 Grant of Patent License for commercial purposes: - -For commercial purposes, and subject to the terms and conditions of this License, You commits to be prepared to negotiate a patent license with each Contributor and/or the Licensor on Fair, Reasonable and Non-Discriminatory (“FRAND”) terms and conditions for the Work or Contribution(s) incorporated within the Work. - -Licensor and/or each Contributor, by submitting a Contribution, will identify any patent it owns related to the Work and/or its Contribution. - -3.3 Patent Litigation - -If You institute patent litigation against any entity making non-commercial use of the Work (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistibution - -Subject to terms and conditions set forth in articles 2 and 3, You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - - - -1. You must give any other recipients of the Work or Derivative Works a copy of this License; and - -2. You must cause any modified files by You to carry prominent notices stating that You changed the files; and - -3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -4. If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement such as the Contributor License Agreement You may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall Licensor and any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor and/or the Licensor,and only if You agree to indemnify, defend, and hold each Contributor and/or the Licensor harmless for any liability incurred by, or claims asserted against, such Contributor and/or Licensor by reason of Your accepting any such warranty or additional liability. - -10. Applicable law. The present license shall be governed by the laws of France. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the PRESENT OPENAIR 5G License to your work -To apply the present License to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] -Licensed under the License terms and conditions for use, reproduction, and distribution of OPENAIR 5G software (the “License”); - -you may not use this file except in compliance with the License.You may obtain a copy of the License at -Unless required by applicable law or agreed to in writing, software - -distributed under the License is distributed on an “AS IS” BASIS, - -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -See the License for the specific language governing permissions and - -limitations under the License. \ No newline at end of file diff --git a/common/utils/itti/COPYING b/common/utils/itti/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/common/utils/itti/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/common/utils/itti_analyzer/COPYING b/common/utils/itti_analyzer/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/common/utils/itti_analyzer/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/common/utils/itti_analyzer/common/COPYING b/common/utils/itti_analyzer/common/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/common/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/libbuffers/COPYING b/common/utils/itti_analyzer/libbuffers/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/libbuffers/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/libparser/COPYING b/common/utils/itti_analyzer/libparser/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/libparser/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/libresolver/COPYING b/common/utils/itti_analyzer/libresolver/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/libresolver/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/libui/COPYING b/common/utils/itti_analyzer/libui/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/libui/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/openair1/COPYING b/openair1/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/CODING/COPYING b/openair1/PHY/CODING/COPYING deleted file mode 100644 index 623b6258a1..0000000000 --- a/openair1/PHY/CODING/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/openair1/PHY/CODING/TESTBENCH/COPYING b/openair1/PHY/CODING/TESTBENCH/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/CODING/TESTBENCH/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/COPYING b/openair1/PHY/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/INIT/COPYING b/openair1/PHY/INIT/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/INIT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/LTE_ESTIMATION/COPYING b/openair1/PHY/LTE_ESTIMATION/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/LTE_ESTIMATION/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/LTE_REFSIG/COPYING b/openair1/PHY/LTE_REFSIG/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/LTE_REFSIG/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/LTE_TRANSPORT/COPYING b/openair1/PHY/LTE_TRANSPORT/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/LTE_TRANSPORT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/MODULATION/COPYING b/openair1/PHY/MODULATION/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/MODULATION/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/TOOLS/COPYING b/openair1/PHY/TOOLS/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/TOOLS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SCHED/COPYING b/openair1/SCHED/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SCHED/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/COPYING b/openair1/SIMULATION/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/ETH_TRANSPORT/COPYING b/openair1/SIMULATION/ETH_TRANSPORT/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/ETH_TRANSPORT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/LTE_PHY/COPYING b/openair1/SIMULATION/LTE_PHY/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/LTE_PHY/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/RF/COPYING b/openair1/SIMULATION/RF/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/RF/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/TOOLS/COPYING b/openair1/SIMULATION/TOOLS/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/TOOLS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/COMMON/COPYING b/openair2/COMMON/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/COMMON/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/DOCS/TEMPLATES/CODE/COPYING b/openair2/DOCS/TEMPLATES/CODE/COPYING deleted file mode 100644 index 623b6258a1..0000000000 --- a/openair2/DOCS/TEMPLATES/CODE/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/openair2/LAYER2/COPYING b/openair2/LAYER2/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/MAC/COPYING b/openair2/LAYER2/MAC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/MAC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/PDCP_v10.1.0/COPYING b/openair2/LAYER2/PDCP_v10.1.0/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/PDCP_v10.1.0/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/COPYING b/openair2/LAYER2/RLC/AM_v9.3.0/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/RLC/AM_v9.3.0/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/RLC/COPYING b/openair2/LAYER2/RLC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/RLC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/COPYING b/openair2/LAYER2/RLC/TM_v9.3.0/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/RLC/TM_v9.3.0/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/COPYING b/openair2/LAYER2/RLC/UM_v9.3.0/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/RLC/UM_v9.3.0/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/NETWORK_DRIVER/LITE/COPYING b/openair2/NETWORK_DRIVER/LITE/COPYING deleted file mode 100755 index 94a9ed024d..0000000000 --- a/openair2/NETWORK_DRIVER/LITE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/NETWORK_DRIVER/MESH/COPYING b/openair2/NETWORK_DRIVER/MESH/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/NETWORK_DRIVER/MESH/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/NETWORK_DRIVER/UE_IP/COPYING b/openair2/NETWORK_DRIVER/UE_IP/COPYING deleted file mode 100755 index 94a9ed024d..0000000000 --- a/openair2/NETWORK_DRIVER/UE_IP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/PHY_INTERFACE/COPYING b/openair2/PHY_INTERFACE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/PHY_INTERFACE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRC/L2_INTERFACE/COPYING b/openair2/RRC/L2_INTERFACE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRC/L2_INTERFACE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRC/LITE/COPYING b/openair2/RRC/LITE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRC/LITE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRC/LITE/MESSAGES/COPYING b/openair2/RRC/LITE/MESSAGES/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRC/LITE/MESSAGES/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRC/NAS/COPYING b/openair2/RRC/NAS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRC/NAS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRM_4_RRC_LITE/COPYING b/openair2/RRM_4_RRC_LITE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRM_4_RRC_LITE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRM_4_RRC_LITE/src/COPYING b/openair2/RRM_4_RRC_LITE/src/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRM_4_RRC_LITE/src/radio_resources/COPYING b/openair2/RRM_4_RRC_LITE/src/radio_resources/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/radio_resources/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/BIGPHYS/COPYING b/openair2/UTIL/BIGPHYS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/BIGPHYS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/CLI/COPYING b/openair2/UTIL/CLI/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/CLI/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/FIFO/COPYING b/openair2/UTIL/FIFO/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/FIFO/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/LISTS/COPYING b/openair2/UTIL/LISTS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/LISTS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/LOG/COPYING b/openair2/UTIL/LOG/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/LOG/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/MATH/COPYING b/openair2/UTIL/MATH/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/MATH/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/MEM/COPYING b/openair2/UTIL/MEM/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/MEM/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OCG/COPYING b/openair2/UTIL/OCG/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OCG/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OMG/COPYING b/openair2/UTIL/OMG/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OMG/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OMV/COPYING b/openair2/UTIL/OMV/COPYING deleted file mode 100644 index 623b6258a1..0000000000 --- a/openair2/UTIL/OMV/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/openair2/UTIL/OPT/COPYING b/openair2/UTIL/OPT/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OPT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OSA/COPYING b/openair2/UTIL/OSA/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OSA/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OSD/COPYING b/openair2/UTIL/OSD/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OSD/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OTG/COPYING b/openair2/UTIL/OTG/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OTG/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/SCTP/COPYING b/openair2/UTIL/SCTP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/SCTP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/TIMER/COPYING b/openair2/UTIL/TIMER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/TIMER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/TRACE/COPYING b/openair2/UTIL/TRACE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/TRACE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/X2AP/COPYING b/openair2/X2AP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/X2AP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/COPYING b/openair3/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/COPYING b/openair3/DOCS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/DOXYGEN/COPYING b/openair3/DOCS/DOXYGEN/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/DOXYGEN/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/Latex/COPYING b/openair3/DOCS/Latex/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/Latex/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/Latex/DefaultBearer/COPYING b/openair3/DOCS/Latex/DefaultBearer/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/Latex/DefaultBearer/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/Latex/EPC/COPYING b/openair3/DOCS/Latex/EPC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/Latex/EPC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/COMMON/API/NETWORK/COPYING b/openair3/NAS/COMMON/API/NETWORK/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/API/NETWORK/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/COPYING b/openair3/NAS/COMMON/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/EMM/MSG/COPYING b/openair3/NAS/COMMON/EMM/MSG/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/EMM/MSG/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/ESM/MSG/COPYING b/openair3/NAS/COMMON/ESM/MSG/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/ESM/MSG/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/IES/COPYING b/openair3/NAS/COMMON/IES/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/IES/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/UTIL/COPYING b/openair3/NAS/COMMON/UTIL/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/UTIL/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COPYING b/openair3/NAS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/AS_SIMULATOR/COPYING b/openair3/NAS/TEST/AS_SIMULATOR/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/AS_SIMULATOR/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/COPYING b/openair3/NAS/TEST/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/MSC/COPYING b/openair3/NAS/TEST/MSC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/MSC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/NETWORK/COPYING b/openair3/NAS/TEST/NETWORK/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/NETWORK/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/USER/COPYING b/openair3/NAS/TEST/USER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/USER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TOOLS/COPYING b/openair3/NAS/TOOLS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TOOLS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/UE/API/USER/COPYING b/openair3/NAS/UE/API/USER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/UE/API/USER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/UE/API/USIM/COPYING b/openair3/NAS/UE/API/USIM/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/UE/API/USIM/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/UE/EMM/SAP/COPYING b/openair3/NAS/UE/EMM/SAP/COPYING deleted file mode 100755 index 94a9ed024d..0000000000 --- a/openair3/NAS/UE/EMM/SAP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/UE/ESM/SAP/COPYING b/openair3/NAS/UE/ESM/SAP/COPYING deleted file mode 100755 index 94a9ed024d..0000000000 --- a/openair3/NAS/UE/ESM/SAP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/COPYING b/openair3/S1AP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/COPYING b/openair3/S1AP/MESSAGES/ASN1/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING b/openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING b/openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING b/openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/COPYING b/openair3/S1AP/MESSAGES/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/SCTP/COPYING b/openair3/SCTP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/SCTP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/SECU/COPYING b/openair3/SECU/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/SECU/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/TEST/COPYING b/openair3/TEST/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/TEST/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/UTILS/COPYING b/openair3/UTILS/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/UTILS/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/targets/ARCH/COMMON/COPYING b/targets/ARCH/COMMON/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/COMMON/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING b/targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/DEFS/COPYING b/targets/ARCH/EXMIMO/DEFS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/DEFS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING b/targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING b/targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/COPYING b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING b/targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/USRP/USERSPACE/LIB/COPYING b/targets/ARCH/USRP/USERSPACE/LIB/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/USRP/USERSPACE/LIB/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/COMMON/COPYING b/targets/COMMON/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/COMMON/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/COPYING b/targets/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/COPYING b/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/PROJECTS/COPYING b/targets/PROJECTS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/PROJECTS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/COPYING b/targets/PROJECTS/GENERIC-LTE-EPC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/RT/USER/COPYING b/targets/RT/USER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/RT/USER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/SIMU/PROC/COPYING b/targets/SIMU/PROC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/SIMU/PROC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/SIMU/USER/COPYING b/targets/SIMU/USER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/SIMU/USER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. From 972d0e612e6cab8637a2c34a43eecba1295efc55 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 28 Sep 2016 10:46:16 +0200 Subject: [PATCH 263/340] add README in the T tracer to clarify its licensing information The T is released with the same license as the rest of OpenAirInterface, of which it is an integral part. --- common/utils/T/README | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 common/utils/T/README diff --git a/common/utils/T/README b/common/utils/T/README new file mode 100644 index 0000000000..3d601d9221 --- /dev/null +++ b/common/utils/T/README @@ -0,0 +1,4 @@ +All the files in this directory, unless stated otherwise, +are released under the terms of the main license of +OpenAirInterface. See the file LICENSE in the top +directory. From b0662e4bbe1847264fee4d5a532743df5771aaa4 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 28 Sep 2016 11:17:33 +0200 Subject: [PATCH 264/340] update licensing information in remaining files The text has been updated in all those files. modified: README.txt modified: cmake_targets/CMakeLists.txt modified: cmake_targets/at_commands/CMakeLists.txt modified: cmake_targets/autotests/core.py modified: cmake_targets/autotests/log.py modified: cmake_targets/autotests/openair.py modified: cmake_targets/autotests/run_exec_autotests.bash modified: cmake_targets/autotests/run_exec_lte-softmodem_tests.py modified: cmake_targets/autotests/tools/configure_cots_bandrich_ue.py modified: cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py modified: cmake_targets/autotests/tools/configure_usrpb210.py modified: cmake_targets/autotests/tools/find_usb_path.bash modified: cmake_targets/autotests/tools/free_mem.bash modified: cmake_targets/autotests/tools/iperf3_script modified: cmake_targets/autotests/tools/iperf3_script_phone modified: cmake_targets/autotests/tools/iperf_script modified: cmake_targets/autotests/tools/iperf_script_phone modified: cmake_targets/autotests/tools/lib_autotest.py modified: cmake_targets/autotests/tools/search_repl.py modified: cmake_targets/build_oai modified: cmake_targets/tools/asn1tostruct.py modified: cmake_targets/tools/build_helper modified: cmake_targets/tools/build_test_epc_tools modified: cmake_targets/tools/example_enb_exmimo_mme_hss.txt modified: cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt modified: cmake_targets/tools/indent_source_code modified: cmake_targets/tools/init_exmimo2 modified: cmake_targets/tools/init_nas_nos1 modified: cmake_targets/tools/perf_oai.bash modified: cmake_targets/tools/run_enb_s1_exmimo modified: cmake_targets/tools/run_enb_s1_usrp modified: cmake_targets/tools/run_enb_ue_virt_noS1 modified: cmake_targets/tools/run_enb_ue_virt_s1 modified: openair2/DOCS/TEMPLATES/README/Readme.doxy modified: openair2/DOCS/TEMPLATES/README/readme.txt modified: openair2/Makefile modified: openair2/UTIL/OCG/Readme.doxy modified: openair2/UTIL/OCG/readme.txt modified: openair2/UTIL/OSD/recep.php modified: openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py modified: openair3/DOCS/DOXYGEN/Makefile.am modified: openair3/DOCS/Latex/EPC/Makefile modified: openair3/DOCS/Makefile.am modified: openair3/GTPV1-U/Makefile.am modified: openair3/GTPV1-U/Makefile.eNB modified: openair3/NAS/TEST/AS_SIMULATOR/Makefile modified: openair3/NAS/TEST/NETWORK/Makefile modified: openair3/NAS/TEST/USER/Makefile modified: openair3/NAS/TOOLS/Makefile modified: openair3/NAS/UE/API/USER/Makefile modified: openair3/NAS/UE/API/USER/tst/Makefile modified: openair3/NAS/UE/API/USIM/Makefile modified: openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py modified: openair3/TEST/Makefile.am modified: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc modified: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc modified: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc modified: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc modified: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc modified: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc modified: targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc modified: targets/PROJECTS/E-MBMS/build_all.bash modified: targets/PROJECTS/E-MBMS/start_enb.bash modified: targets/PROJECTS/E-MBMS/start_ue.bash modified: targets/PROJECTS/E-MBMS/utils.bash modified: targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash modified: targets/PROJECTS/GENERIC-LTE-EPC/networks.bash modified: targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash modified: targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash modified: targets/PROJECTS/GENERIC-LTE-EPC/utils.bash modified: targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash modified: targets/SCRIPTS/install_asn1c_0.9.24.modified.bash modified: targets/TEST/OAI/case01.py modified: targets/TEST/OAI/case02.py modified: targets/TEST/OAI/case03.py modified: targets/TEST/OAI/case04.py modified: targets/TEST/OAI/case05.py modified: targets/TEST/OAI/case11.py modified: targets/TEST/OAI/case12.py modified: targets/TEST/OAI/case13.py modified: targets/TEST/OAI/core.py modified: targets/TEST/OAI/log.py modified: targets/TEST/OAI/openair.py modified: targets/TEST/OAI/test01.py modified: targets/TEST/OAI/test02.py modified: targets/TEST/PDCP/readme.txt modified: targets/build_helper.bash modified: targets/build_oai.bash modified: targets/perf_oai.bash --- README.txt | 2 +- cmake_targets/CMakeLists.txt | 47 ++++++++--------- cmake_targets/at_commands/CMakeLists.txt | 48 ++++++++--------- cmake_targets/autotests/core.py | 48 ++++++++--------- cmake_targets/autotests/log.py | 48 ++++++++--------- cmake_targets/autotests/openair.py | 48 ++++++++--------- .../autotests/run_exec_autotests.bash | 48 ++++++++--------- .../autotests/run_exec_lte-softmodem_tests.py | 49 ++++++++---------- .../tools/configure_cots_bandrich_ue.py | 48 ++++++++--------- .../tools/configure_cots_huaweiE398_ue.py | 48 ++++++++--------- .../autotests/tools/configure_usrpb210.py | 48 ++++++++--------- .../autotests/tools/find_usb_path.bash | 48 ++++++++--------- cmake_targets/autotests/tools/free_mem.bash | 48 ++++++++--------- cmake_targets/autotests/tools/iperf3_script | 48 ++++++++--------- .../autotests/tools/iperf3_script_phone | 48 ++++++++--------- cmake_targets/autotests/tools/iperf_script | 48 ++++++++--------- .../autotests/tools/iperf_script_phone | 48 ++++++++--------- cmake_targets/autotests/tools/lib_autotest.py | 48 ++++++++--------- cmake_targets/autotests/tools/search_repl.py | 48 ++++++++--------- cmake_targets/build_oai | 51 ++++++++----------- cmake_targets/tools/asn1tostruct.py | 49 ++++++++---------- cmake_targets/tools/build_helper | 51 ++++++++----------- cmake_targets/tools/build_test_epc_tools | 49 ++++++++---------- .../tools/example_enb_exmimo_mme_hss.txt | 49 ++++++++---------- .../example_oaisim_enb_ue_mme_virtual.txt | 49 ++++++++---------- cmake_targets/tools/indent_source_code | 49 ++++++++---------- cmake_targets/tools/init_exmimo2 | 49 ++++++++---------- cmake_targets/tools/init_nas_nos1 | 49 ++++++++---------- cmake_targets/tools/perf_oai.bash | 49 ++++++++---------- cmake_targets/tools/run_enb_s1_exmimo | 49 ++++++++---------- cmake_targets/tools/run_enb_s1_usrp | 49 ++++++++---------- cmake_targets/tools/run_enb_ue_virt_noS1 | 49 ++++++++---------- cmake_targets/tools/run_enb_ue_virt_s1 | 49 ++++++++---------- openair2/DOCS/TEMPLATES/README/Readme.doxy | 48 ++++++++--------- openair2/DOCS/TEMPLATES/README/readme.txt | 47 ++++++++--------- openair2/Makefile | 49 ++++++++---------- openair2/UTIL/OCG/Readme.doxy | 48 ++++++++--------- openair2/UTIL/OCG/readme.txt | 49 ++++++++---------- openair2/UTIL/OSD/recep.php | 48 ++++++++--------- openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py | 49 ++++++++---------- openair3/DOCS/DOXYGEN/Makefile.am | 49 ++++++++---------- openair3/DOCS/Latex/EPC/Makefile | 49 ++++++++---------- openair3/DOCS/Makefile.am | 51 ++++++++----------- openair3/GTPV1-U/Makefile.am | 51 ++++++++----------- openair3/GTPV1-U/Makefile.eNB | 51 ++++++++----------- openair3/NAS/TEST/AS_SIMULATOR/Makefile | 49 ++++++++---------- openair3/NAS/TEST/NETWORK/Makefile | 49 ++++++++---------- openair3/NAS/TEST/USER/Makefile | 49 ++++++++---------- openair3/NAS/TOOLS/Makefile | 49 ++++++++---------- openair3/NAS/UE/API/USER/Makefile | 49 ++++++++---------- openair3/NAS/UE/API/USER/tst/Makefile | 49 ++++++++---------- openair3/NAS/UE/API/USIM/Makefile | 49 ++++++++---------- openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py | 49 ++++++++---------- openair3/TEST/Makefile.am | 49 ++++++++---------- .../ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc | 48 ++++++++--------- .../USERSPACE/OCTAVE/oarf_config_exmimo.cc | 48 ++++++++--------- .../EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc | 48 ++++++++--------- .../OCTAVE/oarf_get_num_detected_cards.cc | 48 ++++++++--------- .../USERSPACE/OCTAVE/oarf_send_frame.cc | 48 ++++++++--------- .../ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc | 48 ++++++++--------- .../OCTAVE/oarf_stop_without_reset.cc | 48 ++++++++--------- targets/PROJECTS/E-MBMS/build_all.bash | 50 ++++++++---------- targets/PROJECTS/E-MBMS/start_enb.bash | 50 ++++++++---------- targets/PROJECTS/E-MBMS/start_ue.bash | 50 ++++++++---------- targets/PROJECTS/E-MBMS/utils.bash | 50 ++++++++---------- .../PROJECTS/GENERIC-LTE-EPC/interfaces.bash | 47 ++++++++--------- .../PROJECTS/GENERIC-LTE-EPC/networks.bash | 47 ++++++++--------- .../start_enb_and_ue_virt.bash | 47 ++++++++--------- .../PROJECTS/GENERIC-LTE-EPC/start_ue.bash | 47 ++++++++--------- targets/PROJECTS/GENERIC-LTE-EPC/utils.bash | 47 ++++++++--------- .../PROJECTS/GENERIC-LTE-EPC/virtual_box.bash | 47 ++++++++--------- .../install_asn1c_0.9.24.modified.bash | 49 ++++++++---------- targets/TEST/OAI/case01.py | 49 ++++++++---------- targets/TEST/OAI/case02.py | 49 ++++++++---------- targets/TEST/OAI/case03.py | 49 ++++++++---------- targets/TEST/OAI/case04.py | 49 ++++++++---------- targets/TEST/OAI/case05.py | 49 ++++++++---------- targets/TEST/OAI/case11.py | 48 ++++++++--------- targets/TEST/OAI/case12.py | 48 ++++++++--------- targets/TEST/OAI/case13.py | 48 ++++++++--------- targets/TEST/OAI/core.py | 48 ++++++++--------- targets/TEST/OAI/log.py | 48 ++++++++--------- targets/TEST/OAI/openair.py | 48 ++++++++--------- targets/TEST/OAI/test01.py | 49 ++++++++---------- targets/TEST/OAI/test02.py | 48 ++++++++--------- targets/TEST/PDCP/readme.txt | 47 ++++++++--------- targets/build_helper.bash | 47 ++++++++--------- targets/build_oai.bash | 47 ++++++++--------- targets/perf_oai.bash | 47 ++++++++--------- 89 files changed, 1796 insertions(+), 2475 deletions(-) diff --git a/README.txt b/README.txt index b549f8122f..b3d535283e 100644 --- a/README.txt +++ b/README.txt @@ -7,7 +7,7 @@ The OpenAirInterface (OAI) software is composed of the following parts: openairinterface5g ├── cmake_targets: build utilities to compile (simulation, emulation and real-time platforms), and generated build files ├── common : some common OAI utilities, other tools can be found at openair2/UTILS -├── COPYING +├── LICENSE ├── maketags : script to generate emacs tags ├── openair1 : 3GPP LTE Rel-10 PHY layer + PHY RF simulation and a subset of Rel 12 Features. ├── openair2 :3GPP LTE Rel-10 RLC/MAC/PDCP/RRC/X2AP implementation. diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 8523ed7045..0242f89601 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1,30 +1,25 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # Author: laurent THOMAS, Lionel GAUTHIER -############################################################################### cmake_minimum_required (VERSION 2.8) diff --git a/cmake_targets/at_commands/CMakeLists.txt b/cmake_targets/at_commands/CMakeLists.txt index 0b8bfed25b..258e5b1823 100755 --- a/cmake_targets/at_commands/CMakeLists.txt +++ b/cmake_targets/at_commands/CMakeLists.txt @@ -1,30 +1,26 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # Author: Lionel GAUTHIER -############################################################################### + cmake_minimum_required(VERSION 2.8) set(CMAKE_VERBOSE_MAKEFILE ON) diff --git a/cmake_targets/autotests/core.py b/cmake_targets/autotests/core.py index 5b1f39a85b..2665e57372 100644 --- a/cmake_targets/autotests/core.py +++ b/cmake_targets/autotests/core.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file core.py # \brief OAI core testing class that provides various primitives to send/recv cmd to openair class searching for patterns and process the responses and tag the test case as passed/failed/skipped diff --git a/cmake_targets/autotests/log.py b/cmake_targets/autotests/log.py index 0b4baff3e9..25eb2b5ffb 100644 --- a/cmake_targets/autotests/log.py +++ b/cmake_targets/autotests/log.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file log.py # \brief provides primitives and defines how the logs and statistics are generated diff --git a/cmake_targets/autotests/openair.py b/cmake_targets/autotests/openair.py index 1079c466a8..5cea3aa121 100644 --- a/cmake_targets/autotests/openair.py +++ b/cmake_targets/autotests/openair.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file openair.py # \brief class that define the oaisim class and its attributes diff --git a/cmake_targets/autotests/run_exec_autotests.bash b/cmake_targets/autotests/run_exec_autotests.bash index 2d3f193b30..5551ede44d 100755 --- a/cmake_targets/autotests/run_exec_autotests.bash +++ b/cmake_targets/autotests/run_exec_autotests.bash @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta if [ -s $OPENAIR_DIR/cmake_targets/tools/build_helper ] ; then diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index f2e5b3d333..1de342747a 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -1,33 +1,24 @@ #! /usr/bin/python -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \author Rohit Gupta # \version 0.1 diff --git a/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py b/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py index 8f1161390f..f03facc7da 100755 --- a/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py +++ b/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import time diff --git a/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py b/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py index 929cc1c0a5..52178a32a1 100755 --- a/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py +++ b/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import time diff --git a/cmake_targets/autotests/tools/configure_usrpb210.py b/cmake_targets/autotests/tools/configure_usrpb210.py index 12b091e4d8..860a717d72 100755 --- a/cmake_targets/autotests/tools/configure_usrpb210.py +++ b/cmake_targets/autotests/tools/configure_usrpb210.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import time diff --git a/cmake_targets/autotests/tools/find_usb_path.bash b/cmake_targets/autotests/tools/find_usb_path.bash index d2a80cd6c2..c115d7a9dc 100755 --- a/cmake_targets/autotests/tools/find_usb_path.bash +++ b/cmake_targets/autotests/tools/find_usb_path.bash @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta diff --git a/cmake_targets/autotests/tools/free_mem.bash b/cmake_targets/autotests/tools/free_mem.bash index f0a5b03d85..8196bf3428 100755 --- a/cmake_targets/autotests/tools/free_mem.bash +++ b/cmake_targets/autotests/tools/free_mem.bash @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta # To free unused memory else test setup runs out of memory diff --git a/cmake_targets/autotests/tools/iperf3_script b/cmake_targets/autotests/tools/iperf3_script index e82816f6e1..bf506bbc65 100755 --- a/cmake_targets/autotests/tools/iperf3_script +++ b/cmake_targets/autotests/tools/iperf3_script @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta #arg1 timeout to wait before running the script diff --git a/cmake_targets/autotests/tools/iperf3_script_phone b/cmake_targets/autotests/tools/iperf3_script_phone index c191f72ec3..e4ccc38237 100755 --- a/cmake_targets/autotests/tools/iperf3_script_phone +++ b/cmake_targets/autotests/tools/iperf3_script_phone @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta #arg1 timeout to wait before running the script diff --git a/cmake_targets/autotests/tools/iperf_script b/cmake_targets/autotests/tools/iperf_script index 731438d65d..28f239af09 100755 --- a/cmake_targets/autotests/tools/iperf_script +++ b/cmake_targets/autotests/tools/iperf_script @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta #arg1 timeout to wait before running the script diff --git a/cmake_targets/autotests/tools/iperf_script_phone b/cmake_targets/autotests/tools/iperf_script_phone index f9ec7973f4..0195ee9eb3 100755 --- a/cmake_targets/autotests/tools/iperf_script_phone +++ b/cmake_targets/autotests/tools/iperf_script_phone @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta #arg1 timeout to wait before running the script diff --git a/cmake_targets/autotests/tools/lib_autotest.py b/cmake_targets/autotests/tools/lib_autotest.py index 9ac2305250..2e9a7df11f 100644 --- a/cmake_targets/autotests/tools/lib_autotest.py +++ b/cmake_targets/autotests/tools/lib_autotest.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import os diff --git a/cmake_targets/autotests/tools/search_repl.py b/cmake_targets/autotests/tools/search_repl.py index fefc142f08..c3e73ccde4 100755 --- a/cmake_targets/autotests/tools/search_repl.py +++ b/cmake_targets/autotests/tools/search_repl.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import sys diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 9a9209db2c..7dfc85e994 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -1,34 +1,25 @@ #!/bin/bash -################################################################################ -# -# Copyright (c) 2015, EURECOM (www.eurecom.fr) -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# The views and conclusions contained in the software and documentation are those -# of the authors and should not be interpreted as representing official policies, -# either expressed or implied, of the FreeBSD Project. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file build_oai # brief OAI automated build tool that can be used to install, compile, run OAI. # author Navid Nikaein, Lionel GAUTHIER, Laurent Thomas diff --git a/cmake_targets/tools/asn1tostruct.py b/cmake_targets/tools/asn1tostruct.py index c298e8ae87..e8ebb03d6d 100644 --- a/cmake_targets/tools/asn1tostruct.py +++ b/cmake_targets/tools/asn1tostruct.py @@ -33,35 +33,26 @@ def printDebug(string): def outputHeaderToFile(f, filename): now = datetime.datetime.now() - f.write("""/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - -*******************************************************************************/ + f.write("""/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ """) f.write("/*******************************************************************************\n") diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index b855b28e10..45776dfb2d 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -1,33 +1,24 @@ - ################################################################################ -# -# Copyright (c) 2015, EURECOM (www.eurecom.fr) -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# The views and conclusions contained in the software and documentation are those -# of the authors and should not be interpreted as representing official policies, -# either expressed or implied, of the FreeBSD Project. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file build_helper # brief # authors Laurent Thomas, Lionel GAUTHIER diff --git a/cmake_targets/tools/build_test_epc_tools b/cmake_targets/tools/build_test_epc_tools index aa7103fd78..f9d8057c93 100755 --- a/cmake_targets/tools/build_test_epc_tools +++ b/cmake_targets/tools/build_test_epc_tools @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file build_test_epc_tools # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/example_enb_exmimo_mme_hss.txt b/cmake_targets/tools/example_enb_exmimo_mme_hss.txt index 2c693a5003..546ae1ba86 100644 --- a/cmake_targets/tools/example_enb_exmimo_mme_hss.txt +++ b/cmake_targets/tools/example_enb_exmimo_mme_hss.txt @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file example_enb_exmimo_mme_hss.txt # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt b/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt index b47c6137c5..baccdbc288 100644 --- a/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt +++ b/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file example_oaisim_enb_ue_mme_virtual.txt # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/indent_source_code b/cmake_targets/tools/indent_source_code index 64de1c4c50..17a29fb073 100755 --- a/cmake_targets/tools/indent_source_code +++ b/cmake_targets/tools/indent_source_code @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file indent_source_code # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/init_exmimo2 b/cmake_targets/tools/init_exmimo2 index 66eedf93dd..06c40616ac 100755 --- a/cmake_targets/tools/init_exmimo2 +++ b/cmake_targets/tools/init_exmimo2 @@ -1,33 +1,26 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2015 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file init_nas_nos1 # brief loads the nasmesh module and sets up the radio bearers (used to provide ip interface without S1 interface) # author Florian Kaltenberger diff --git a/cmake_targets/tools/init_nas_nos1 b/cmake_targets/tools/init_nas_nos1 index d2b7760867..3aaf547823 100755 --- a/cmake_targets/tools/init_nas_nos1 +++ b/cmake_targets/tools/init_nas_nos1 @@ -1,33 +1,26 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2015 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file init_nas_nos1 # brief loads the nasmesh module and sets up the radio bearers (used to provide ip interface without S1 interface) # author Florian Kaltenberger diff --git a/cmake_targets/tools/perf_oai.bash b/cmake_targets/tools/perf_oai.bash index 42d6be0716..44d9d1c74a 100755 --- a/cmake_targets/tools/perf_oai.bash +++ b/cmake_targets/tools/perf_oai.bash @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2015 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file build_oai.bash # brief apply a traffic generator, send traffic and measure the performance of OAI # OTG is mainly used for OASIM and D-ITG (or iperf) for LTE-SOFTMODEM diff --git a/cmake_targets/tools/run_enb_s1_exmimo b/cmake_targets/tools/run_enb_s1_exmimo index e2df8b5049..028b492341 100755 --- a/cmake_targets/tools/run_enb_s1_exmimo +++ b/cmake_targets/tools/run_enb_s1_exmimo @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file run_enb_s1_exmimo # brief run script for eNB EXMIMO. # author Lionel GAUTHIER diff --git a/cmake_targets/tools/run_enb_s1_usrp b/cmake_targets/tools/run_enb_s1_usrp index 2969f759a1..3d49fe40bd 100755 --- a/cmake_targets/tools/run_enb_s1_usrp +++ b/cmake_targets/tools/run_enb_s1_usrp @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file run_enb_s1_usrp # brief run script for eNB USRP. # author Lionel GAUTHIER and Navid Nikaein diff --git a/cmake_targets/tools/run_enb_ue_virt_noS1 b/cmake_targets/tools/run_enb_ue_virt_noS1 index f5ed770f80..a0f23ecb01 100755 --- a/cmake_targets/tools/run_enb_ue_virt_noS1 +++ b/cmake_targets/tools/run_enb_ue_virt_noS1 @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file start_enb_ue_virt_noS1 # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/run_enb_ue_virt_s1 b/cmake_targets/tools/run_enb_ue_virt_s1 index 93da7aeb3b..ecd5993ff4 100755 --- a/cmake_targets/tools/run_enb_ue_virt_s1 +++ b/cmake_targets/tools/run_enb_ue_virt_s1 @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file start_enb_ue_virt_s1 # brief # author Lionel Gauthier diff --git a/openair2/DOCS/TEMPLATES/README/Readme.doxy b/openair2/DOCS/TEMPLATES/README/Readme.doxy index 43e4e3b87a..d45893ecea 100644 --- a/openair2/DOCS/TEMPLATES/README/Readme.doxy +++ b/openair2/DOCS/TEMPLATES/README/Readme.doxy @@ -1,31 +1,23 @@ -/******************************************************************************* - - OPENAIRINTERFACE 0/1/2/3 - Copyright(c) 1999 - 2010 EURECOM - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information: - Openair Admin - Mailing List - Forums http://forums.eurecom.fr/openairinterface - Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file Readme.doxy * \brief explain how this block is organized, and how it works diff --git a/openair2/DOCS/TEMPLATES/README/readme.txt b/openair2/DOCS/TEMPLATES/README/readme.txt index 12d67a31dc..23ecdd5e91 100644 --- a/openair2/DOCS/TEMPLATES/README/readme.txt +++ b/openair2/DOCS/TEMPLATES/README/readme.txt @@ -1,31 +1,24 @@ -/******************************************************************************* +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OPENAIRINTERFACE 0/1/2/3 - Copyright(c) 1999 - 2010 EURECOM - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information: - Openair Admin - Mailing List - Forums http://forums.eurecom.fr/openairinterface - Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ /*________________________OEPNAIR/OPENAIR0/________________________ File : Readme.txt diff --git a/openair2/Makefile b/openair2/Makefile index 799fde93c0..87b3108f1b 100755 --- a/openair2/Makefile +++ b/openair2/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + #################################################### # USER SPACE CODE GENERATION #################################################### diff --git a/openair2/UTIL/OCG/Readme.doxy b/openair2/UTIL/OCG/Readme.doxy index ad9f30fa81..e14086e4a0 100644 --- a/openair2/UTIL/OCG/Readme.doxy +++ b/openair2/UTIL/OCG/Readme.doxy @@ -1,31 +1,23 @@ -/******************************************************************************* - - OPENAIRINTERFACE 0/1/2/3 - Copyright(c) 1999 - 2011 EURECOM - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information: - Openair Admin - Mailing List - Forums http://forums.eurecom.fr/openairinterface - Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file Readme.doxy * \brief explain how this block is organized, and how it works diff --git a/openair2/UTIL/OCG/readme.txt b/openair2/UTIL/OCG/readme.txt index 7e97e774e6..88743539f8 100644 --- a/openair2/UTIL/OCG/readme.txt +++ b/openair2/UTIL/OCG/readme.txt @@ -1,31 +1,24 @@ -/******************************************************************************* - - OPENAIRINTERFACE 0/1/2/3 - Copyright(c) 1999 - 2011 EURECOM - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information: - Openair Admin - Mailing List - Forums http://forums.eurecom.fr/openairinterface - Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*________________________OEPNAIR/OPENAIR0/________________________ File : Readme.txt diff --git a/openair2/UTIL/OSD/recep.php b/openair2/UTIL/OSD/recep.php index 2f0ef226b4..f824a327cf 100644 --- a/openair2/UTIL/OSD/recep.php +++ b/openair2/UTIL/OSD/recep.php @@ -1,32 +1,24 @@ . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + if HAVE_DOXYGEN directory = $(top_srcdir)/DOCS/Documentation diff --git a/openair3/DOCS/Latex/EPC/Makefile b/openair3/DOCS/Latex/EPC/Makefile index a29da4a53c..517bbe11f6 100644 --- a/openair3/DOCS/Latex/EPC/Makefile +++ b/openair3/DOCS/Latex/EPC/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + MYFILE=EPC all: diff --git a/openair3/DOCS/Makefile.am b/openair3/DOCS/Makefile.am index daf460186f..28a4220611 100644 --- a/openair3/DOCS/Makefile.am +++ b/openair3/DOCS/Makefile.am @@ -1,29 +1,22 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -SUBDIRS = DOXYGEN \ No newline at end of file +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +SUBDIRS = DOXYGEN diff --git a/openair3/GTPV1-U/Makefile.am b/openair3/GTPV1-U/Makefile.am index 34df3ff5c9..25d5658148 100644 --- a/openair3/GTPV1-U/Makefile.am +++ b/openair3/GTPV1-U/Makefile.am @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + AM_CFLAGS = @ADD_CFLAGS@ \ -I$(top_srcdir)/COMMON \ -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ @@ -62,4 +55,4 @@ libgtpv1u_la_SOURCES = \ nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c \ nw-gtpv1u/src/NwGtpv1uTrxn.c \ nw-gtpv1u/src/NwGtpv1uMsg.c \ - nw-gtpv1u/src/NwGtpv1u.c \ No newline at end of file + nw-gtpv1u/src/NwGtpv1u.c diff --git a/openair3/GTPV1-U/Makefile.eNB b/openair3/GTPV1-U/Makefile.eNB index 97920f114f..6941959e81 100644 --- a/openair3/GTPV1-U/Makefile.eNB +++ b/openair3/GTPV1-U/Makefile.eNB @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + OUTDIR = . libgtpv1u_OBJECTS = \ @@ -71,4 +64,4 @@ clean: @$(RM_F_V) $(OUTDIR)/*.d @$(RM_F_V) $(OUTDIR)/libgtpv1u.a -cleanall: clean \ No newline at end of file +cleanall: clean diff --git a/openair3/NAS/TEST/AS_SIMULATOR/Makefile b/openair3/NAS/TEST/AS_SIMULATOR/Makefile index 91146b1afa..17710368e9 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/Makefile +++ b/openair3/NAS/TEST/AS_SIMULATOR/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + export PROCESS = MME include ../../Makerules diff --git a/openair3/NAS/TEST/NETWORK/Makefile b/openair3/NAS/TEST/NETWORK/Makefile index e6e03f1362..00a74ec561 100644 --- a/openair3/NAS/TEST/NETWORK/Makefile +++ b/openair3/NAS/TEST/NETWORK/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + export PROCESS = MME include ../../Makerules diff --git a/openair3/NAS/TEST/USER/Makefile b/openair3/NAS/TEST/USER/Makefile index f65e6ff557..69a2a67387 100644 --- a/openair3/NAS/TEST/USER/Makefile +++ b/openair3/NAS/TEST/USER/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + include ../../Makerules include ../../Makefile.inc diff --git a/openair3/NAS/TOOLS/Makefile b/openair3/NAS/TOOLS/Makefile index d54edd3049..ca2e884c11 100644 --- a/openair3/NAS/TOOLS/Makefile +++ b/openair3/NAS/TOOLS/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + export PROCESS = UE ifndef PROJDIR diff --git a/openair3/NAS/UE/API/USER/Makefile b/openair3/NAS/UE/API/USER/Makefile index d4981975fc..d5f4d6fffb 100644 --- a/openair3/NAS/UE/API/USER/Makefile +++ b/openair3/NAS/UE/API/USER/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + ifndef PROJDIR PROJDIR = $(PWD)/../../.. INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(EMMMSGDIR) -I$(ESMMSGDIR) diff --git a/openair3/NAS/UE/API/USER/tst/Makefile b/openair3/NAS/UE/API/USER/tst/Makefile index 3ec0f767ca..48681f31a5 100644 --- a/openair3/NAS/UE/API/USER/tst/Makefile +++ b/openair3/NAS/UE/API/USER/tst/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + ifndef PROJDIR PROJDIR = $(PWD)/../../../.. endif diff --git a/openair3/NAS/UE/API/USIM/Makefile b/openair3/NAS/UE/API/USIM/Makefile index d4981975fc..d5f4d6fffb 100644 --- a/openair3/NAS/UE/API/USIM/Makefile +++ b/openair3/NAS/UE/API/USIM/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + ifndef PROJDIR PROJDIR = $(PWD)/../../.. INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(EMMMSGDIR) -I$(ESMMSGDIR) diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py index 446266d6a3..021e3f3cdb 100644 --- a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py +++ b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py @@ -33,35 +33,26 @@ def printDebug(string): def outputHeaderToFile(f, filename): now = datetime.datetime.now() - f.write("""/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2015 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - -*******************************************************************************/ + f.write("""/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ """) f.write("/*******************************************************************************\n") diff --git a/openair3/TEST/Makefile.am b/openair3/TEST/Makefile.am index 7bc55fe600..55f7607585 100644 --- a/openair3/TEST/Makefile.am +++ b/openair3/TEST/Makefile.am @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + AM_CFLAGS = @ADD_CFLAGS@ \ @CHECK_CFLAGS@ \ -I$(top_srcdir)/COMMON \ diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc index a007618e43..64e795acc1 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc @@ -1,32 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - // Maxime Guillaud - created Wed May 10 19:23:30 CEST 2006 // see http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions // and http://octave.sourceforge.net/coda/c58.html diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc index 367ac0b7f6..73a655075c 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc @@ -1,32 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - // Matthias Ihmig, based on code from Maxime Guillaud - created 28.01.2013 // see http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions // and http://wiki.octave.org/wiki.pl?CodaTutorial diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc index c7190671eb..6973fb2980 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Maxime Guillaud - created Fri May 12 16:20:04 CEST 2006 // Matthias Ihmig, 2013 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc index b7d20d9d69..1a92096249 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_num_detected_cards.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Matthias Ihmig, 2013 // see http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc index 659e6125be..5a425c9253 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Matthias Ihmig, 2013 // Maxime Guillaud - created Fri May 12 16:20:04 CEST 2006 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc index 8d5669e043..608b5d1b9b 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Matthias Ihmig, 2013 // Florian Kaltenberger - created 2010-01-22 diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc index d6684b5c43..02ee33c840 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Riadh Ghaddab - created 2013-10-24 // see http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions diff --git a/targets/PROJECTS/E-MBMS/build_all.bash b/targets/PROJECTS/E-MBMS/build_all.bash index 270c0c9d47..a4f00d49af 100755 --- a/targets/PROJECTS/E-MBMS/build_all.bash +++ b/targets/PROJECTS/E-MBMS/build_all.bash @@ -1,34 +1,24 @@ #! /bin/bash -################################################################################ -# Eurecom OpenAirInterface core network -# Copyright(c) 1999 - 2014 Eurecom -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : EURECOM, -# Campus SophiaTech, -# 450 Route des Chappes, -# CS 50193 -# 06904 Biot Sophia Antipolis cedex, -# FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file build_all.bash # brief diff --git a/targets/PROJECTS/E-MBMS/start_enb.bash b/targets/PROJECTS/E-MBMS/start_enb.bash index 597f38eb1f..5e8d8e4b45 100755 --- a/targets/PROJECTS/E-MBMS/start_enb.bash +++ b/targets/PROJECTS/E-MBMS/start_enb.bash @@ -1,34 +1,24 @@ #!/bin/bash -################################################################################ -# Eurecom OpenAirInterface core network -# Copyright(c) 1999 - 2014 Eurecom -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : EURECOM, -# Campus SophiaTech, -# 450 Route des Chappes, -# CS 50193 -# 06904 Biot Sophia Antipolis cedex, -# FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file start_enb.bash # brief diff --git a/targets/PROJECTS/E-MBMS/start_ue.bash b/targets/PROJECTS/E-MBMS/start_ue.bash index a1a862210a..25e2816fcc 100755 --- a/targets/PROJECTS/E-MBMS/start_ue.bash +++ b/targets/PROJECTS/E-MBMS/start_ue.bash @@ -1,34 +1,24 @@ #!/bin/bash -################################################################################ -# Eurecom OpenAirInterface core network -# Copyright(c) 1999 - 2014 Eurecom -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : EURECOM, -# Campus SophiaTech, -# 450 Route des Chappes, -# CS 50193 -# 06904 Biot Sophia Antipolis cedex, -# FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file start_ue.bash # brief diff --git a/targets/PROJECTS/E-MBMS/utils.bash b/targets/PROJECTS/E-MBMS/utils.bash index e95fd9e5b6..0da6363a19 100755 --- a/targets/PROJECTS/E-MBMS/utils.bash +++ b/targets/PROJECTS/E-MBMS/utils.bash @@ -1,34 +1,24 @@ #!/bin/bash -################################################################################ -# Eurecom OpenAirInterface core network -# Copyright(c) 1999 - 2014 Eurecom -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : EURECOM, -# Campus SophiaTech, -# 450 Route des Chappes, -# CS 50193 -# 06904 Biot Sophia Antipolis cedex, -# FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file utils.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash b/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash index b6151fc677..4c753dc372 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file interfaces.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash b/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash index 81c4b7b1a6..8e1538599f 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file networks.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash b/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash index 3c58834f0f..5339af13e4 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash @@ -1,31 +1,24 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file start_enb_and_ue.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash b/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash index 72a3a6fca1..e6d96602e2 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash @@ -1,31 +1,24 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file start_ue.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash b/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash index 0ba30cc504..23231f2fe6 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file utils.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash b/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash index 1fad3fe879..7813f4edea 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash @@ -1,31 +1,24 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ export HSS_VM_NAME='hss-vm-ubuntu-12.04.4-server-amd64' diff --git a/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash b/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash index 91281ec31a..bb45a82e13 100755 --- a/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash +++ b/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash @@ -1,31 +1,24 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # Tested on ubuntu 12.04 with updates 07 november 2013 @@ -35,4 +28,4 @@ cd /usr/local/src/asn1c-r1516 $1 patch -p0 < $OPENAIR3_DIR/S1AP/MESSAGES/ASN1/asn1cpatch.p0 > /tmp/install_log.txt $1 ./configure > /tmp/install_log.txt $1 make > /tmp/install_log.txt -$1 make install > /tmp/install_log.txt \ No newline at end of file +$1 make install > /tmp/install_log.txt diff --git a/targets/TEST/OAI/case01.py b/targets/TEST/OAI/case01.py index f2211bf6ac..2d704a7d1f 100644 --- a/targets/TEST/OAI/case01.py +++ b/targets/TEST/OAI/case01.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case01.py # \brief test case 01 for OAI: compilations diff --git a/targets/TEST/OAI/case02.py b/targets/TEST/OAI/case02.py index e3a4849901..dc7fcb7a4f 100644 --- a/targets/TEST/OAI/case02.py +++ b/targets/TEST/OAI/case02.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case02.py # \brief test case 02 for OAI: executions diff --git a/targets/TEST/OAI/case03.py b/targets/TEST/OAI/case03.py index ece67bcba0..bfd0eda45b 100644 --- a/targets/TEST/OAI/case03.py +++ b/targets/TEST/OAI/case03.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case03.py # \brief test case 03 for OAI: executions diff --git a/targets/TEST/OAI/case04.py b/targets/TEST/OAI/case04.py index 857190313d..09bc88d688 100644 --- a/targets/TEST/OAI/case04.py +++ b/targets/TEST/OAI/case04.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case04.py # \brief test case 04 for OAI: executions diff --git a/targets/TEST/OAI/case05.py b/targets/TEST/OAI/case05.py index c73ae969eb..c7186f466a 100644 --- a/targets/TEST/OAI/case05.py +++ b/targets/TEST/OAI/case05.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case05.py # \brief test case 05 for OAI: executions diff --git a/targets/TEST/OAI/case11.py b/targets/TEST/OAI/case11.py index 0748fd1703..5d24bc3c02 100644 --- a/targets/TEST/OAI/case11.py +++ b/targets/TEST/OAI/case11.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case01.py # \brief test case 01 for OAI: compilations diff --git a/targets/TEST/OAI/case12.py b/targets/TEST/OAI/case12.py index cc46dbc2a3..d9970eebc3 100644 --- a/targets/TEST/OAI/case12.py +++ b/targets/TEST/OAI/case12.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case02.py # \brief test case 02 for OAI: executions diff --git a/targets/TEST/OAI/case13.py b/targets/TEST/OAI/case13.py index 2148ddb52f..ea8f3ad15d 100644 --- a/targets/TEST/OAI/case13.py +++ b/targets/TEST/OAI/case13.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case02.py # \brief test case 02 for OAI: executions diff --git a/targets/TEST/OAI/core.py b/targets/TEST/OAI/core.py index 31c920ecc4..d5275d29ca 100644 --- a/targets/TEST/OAI/core.py +++ b/targets/TEST/OAI/core.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file core.py # \brief OAI core testing class that provides various primitives to send/recv cmd to openair class searching for patterns and process the responses and tag the test case as passed/failed/skipped diff --git a/targets/TEST/OAI/log.py b/targets/TEST/OAI/log.py index 0b4baff3e9..25eb2b5ffb 100644 --- a/targets/TEST/OAI/log.py +++ b/targets/TEST/OAI/log.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file log.py # \brief provides primitives and defines how the logs and statistics are generated diff --git a/targets/TEST/OAI/openair.py b/targets/TEST/OAI/openair.py index a40018d065..0e393ddbd7 100644 --- a/targets/TEST/OAI/openair.py +++ b/targets/TEST/OAI/openair.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file openair.py # \brief class that define the oaisim class and its attributes diff --git a/targets/TEST/OAI/test01.py b/targets/TEST/OAI/test01.py index c382dd5c71..b499c1381b 100644 --- a/targets/TEST/OAI/test01.py +++ b/targets/TEST/OAI/test01.py @@ -1,33 +1,24 @@ #! /usr/bin/python -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file test01.py # \brief test 01 for OAI diff --git a/targets/TEST/OAI/test02.py b/targets/TEST/OAI/test02.py index 037d48cf98..8175f3128c 100644 --- a/targets/TEST/OAI/test02.py +++ b/targets/TEST/OAI/test02.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# more details. - -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file test01.py # \brief test 02 for OAI: downlink and uplink performance and profiler diff --git a/targets/TEST/PDCP/readme.txt b/targets/TEST/PDCP/readme.txt index 7109ff9772..1693d92d81 100644 --- a/targets/TEST/PDCP/readme.txt +++ b/targets/TEST/PDCP/readme.txt @@ -1,31 +1,24 @@ -/******************************************************************************* +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OPENAIRINTERFACE 0/1/2/3 - Copyright(c) 1999 - 2011 EURECOM - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information: - Openair Admin - Mailing List - Forums http://forums.eurecom.fr/openairinterface - Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ /*________________________OEPNAIR/OPENAIR0/________________________ File : readme.txt diff --git a/targets/build_helper.bash b/targets/build_helper.bash index bc5cd3fbed..163be3ba53 100755 --- a/targets/build_helper.bash +++ b/targets/build_helper.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file build_helper.bash # brief diff --git a/targets/build_oai.bash b/targets/build_oai.bash index 5eb1845674..1303ef9e7e 100755 --- a/targets/build_oai.bash +++ b/targets/build_oai.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file build_oai.bash # brief OAI automated build tool that can be used to install, compile, run OAI. diff --git a/targets/perf_oai.bash b/targets/perf_oai.bash index 9379f7767c..4a9cb3951d 100755 --- a/targets/perf_oai.bash +++ b/targets/perf_oai.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2015 Eurecom -# -# OpenAirInterface is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file build_oai.bash # brief apply a traffic generator, send traffic and measure the performance of OAI From 9afa17454834de9a6215a0fcd4767a4a96501e0e Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 28 Sep 2016 15:13:00 +0200 Subject: [PATCH 265/340] minor fix to enable EXM --- targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c | 1 + 1 file changed, 1 insertion(+) diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index ada82b8510..eb02a99c6a 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -774,6 +774,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { openair0_cfg[card].rxbase[ant] = (int32_t*)openair0_exmimo_pci[card].adc_head[ant]; openair0_cfg[card].txbase[ant] = (int32_t*)openair0_exmimo_pci[card].dac_head[ant]; } + openair0_cfg[card].mmapped_dma = 1; } create_watchdog(device); From dc2ec6fdef9e9fbed975d8d99c59afaf64836007 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 28 Sep 2016 15:21:13 +0200 Subject: [PATCH 266/340] changed logging level of GTPU errors --- openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c index 2301cfe5dc..a64694c0de 100644 --- a/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c +++ b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c @@ -577,7 +577,7 @@ nwGtpv1uProcessGpdu( NwGtpv1uStackT *thiz, " G-PDU ltid %u size %u", tunnelEndPointKey.teid, gpduLen); - GTPU_ERROR("Received T-PDU over non-existent tunnel end-point '%x' from "NW_IPV4_ADDR"\n", + GTPU_DEBUG("Received T-PDU over non-existent tunnel end-point '%x' from "NW_IPV4_ADDR"\n", ntohl(msgHdr->teid), NW_IPV4_ADDR_FORMAT((peerIp))); } From 1410b3f343f48edddbf38b0025dc02fe34c5c3f8 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 28 Sep 2016 16:51:28 +0200 Subject: [PATCH 267/340] hotfix: fields DLSCH_DCI and ULSCH_DCI of UE_TEMPLATE had wrong size The old value was 6, it should be 8 because those fields are casted to 'struct DCI0_5MHz_FDD' and the like and those have a size multiple of 32 bits, that is 4 or 8 bytes as of today. (MAX_DCI_SIZE_BITS is 45, all the shifts, muls and adds lead to a value of 8 after this commit and 6 before.) The problem manifested itself with a 20MHz eNB. Push the traffic, after a while the DL harq process 0 is not used anymore. This is because DLSCH_DCI is directly followed by nb_rb in the structure UE_TEMPLATE and setting a value for harq process 7 did overwrite nb_rb[0], putting much too big values in there, leading to the scheduler to always refuse to reschedule because the required RBs are impossibly huge (I saw values of 32744, 16384, and others). --- openair2/LAYER2/MAC/defs.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 81c480d2c9..5f3c67637c 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -621,7 +621,9 @@ typedef struct { uint8_t DLSCH_dci_size_bits; /// DCI buffer for DLSCH - uint8_t DLSCH_DCI[8][(MAX_DCI_SIZE_BITS>>3)+1]; + /* rounded to 32 bits unit (actual value should be 8 due to the logic + * of the function generate_dci0) */ + uint8_t DLSCH_DCI[8][(((MAX_DCI_SIZE_BITS)+31)>>5)*4]; /// Number of Allocated RBs for DL after scheduling (prior to frequency allocation) uint16_t nb_rb[8]; // num_max_harq @@ -645,7 +647,9 @@ typedef struct { uint8_t assigned_mcs_ul; /// DCI buffer for ULSCH - uint8_t ULSCH_DCI[8][(MAX_DCI_SIZE_BITS>>3)+1]; + /* rounded to 32 bits unit (actual value should be 8 due to the logic + * of the function generate_dci0) */ + uint8_t ULSCH_DCI[8][(((MAX_DCI_SIZE_BITS)+31)>>5)*4]; /// DL DAI uint8_t DAI; From 2f00423218bde41ed07104f59c797d0448728fae Mon Sep 17 00:00:00 2001 From: hutch Date: Wed, 28 Sep 2016 17:27:10 +0200 Subject: [PATCH 268/340] update RCC config file for 5 MHz --- .../CONF/rcc.band7.tm1.usrpb210.conf | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf index bba251f2d9..9692f6bae0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf @@ -38,6 +38,7 @@ eNBs = Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; + nb_antenna_ports = 1; tx_gain = 90; rx_gain = 125; prach_root = 0; @@ -49,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -67,29 +68,29 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -103; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -104; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; pcch_default_PagingCycle = 128; pcch_nB = "oneT"; @@ -100,7 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; - + ue_TransmissionMode = 1; } ); From 6599d1c9c4294aa9b2d897adcbb1cf79feb87d2e Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Wed, 28 Sep 2016 20:51:44 +0200 Subject: [PATCH 269/340] bug fixes for UE --- openair1/SCHED/phy_procedures_lte_ue.c | 19 +++++---- targets/RT/USER/lte-softmodem.c | 2 + targets/RT/USER/lte-ue.c | 59 +++++++++++++++++--------- 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index a74d921fa4..bfd53fba86 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -736,14 +736,8 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin #endif if (abstraction_flag == 0) { - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", - ue->Mod_id, - frame_tx, - subframe_tx, - ue->prach_resources[eNB_id]->ra_PreambleIndex, - ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, - ue->prach_resources[eNB_id]->ra_TDD_map_index, - ue->prach_resources[eNB_id]->ra_RNTI); + + LOG_I(PHY,"mode %d\n",mode); if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) { ue->tx_power_dBm[subframe_tx] = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id); @@ -753,6 +747,15 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; } + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", + ue->Mod_id, + frame_tx, + subframe_tx, + ue->prach_resources[eNB_id]->ra_PreambleIndex, + ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, + ue->prach_resources[eNB_id]->ra_TDD_map_index, + ue->prach_resources[eNB_id]->ra_RNTI); + ue->tx_total_RE[subframe_tx] = 96; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index c9aa16441f..96645f886a 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -776,6 +776,7 @@ static void get_options (int argc, char **argv) case LONG_OPTION_CALIB_PRACH_TX: mode = calib_prach_tx; + printf("Setting mode to calib_prach_tx (%d)\n",mode); break; case LONG_OPTION_RXGAIN: @@ -1574,6 +1575,7 @@ int main( int argc, char **argv ) UE[CC_id]->UE_scan = UE_scan; UE[CC_id]->UE_scan_carrier = UE_scan_carrier; UE[CC_id]->mode = mode; + printf("UE[%d]->mode = %d\n",CC_id,mode); compute_prach_seq(&UE[CC_id]->frame_parms.prach_config_common, UE[CC_id]->frame_parms.frame_type, diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index e1438e3b27..649e1f009b 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -448,7 +448,7 @@ static void *UE_thread_synch(void *arg) case pbch: - LOG_I(PHY,"[UE thread Synch] Running Initial Synch\n"); + LOG_I(PHY,"[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode); if (initial_sync( UE, UE->mode ) == 0) { hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_tti; @@ -493,7 +493,7 @@ static void *UE_thread_synch(void *arg) break; } - //UE->rfdevice.trx_set_freq_func(&openair0,&openair0_cfg[0],0); + UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0); //UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]); UE->rfdevice.trx_stop_func(&UE->rfdevice); sleep(1); @@ -801,7 +801,7 @@ static void *UE_thread_rxn_txnp4(void *arg) (subframe_select( &UE->frame_parms, proc->subframe_tx ) == SF_S)) { if (UE->mode != loop_through_memory) { - phy_procedures_UE_TX(UE,proc,0,0,normal_txrx,no_relay); + phy_procedures_UE_TX(UE,proc,0,0,UE->mode,no_relay); } } @@ -995,7 +995,7 @@ void *UE_thread(void *arg) { if (UE->mode != loop_through_memory) { if (UE->no_timing_correction==0) { - LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); + LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d)\n",UE->rx_offset,UE->mode); rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, (void**)rxdata, @@ -1036,21 +1036,6 @@ void *UE_thread(void *arg) { UE->proc.proc_rxtx[1].frame_rx++; for (int sf=0;sf<10;sf++) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - - for (i=0; iframe_parms.nb_antennas_tx; i++) - txp[i] = (void*)&UE->common_vars.txdata[i][((sf+4)%10)*UE->frame_parms.samples_per_tti]; - - txs = UE->rfdevice.trx_write_func(&UE->rfdevice, - timestamp+(4*UE->frame_parms.samples_per_tti)-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0-openair0_cfg[0].tx_sample_advance, - txp, - UE->frame_parms.samples_per_tti, - UE->frame_parms.nb_antennas_tx, - 1); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - for (i=0; iframe_parms.nb_antennas_rx; i++) rxp[i] = (void*)&rxdata[i][UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti)]; // grab signal for subframe @@ -1062,6 +1047,24 @@ void *UE_thread(void *arg) { rxp, UE->frame_parms.samples_per_tti, UE->frame_parms.nb_antennas_rx); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + + for (i=0; iframe_parms.nb_antennas_tx; i++) + txp[i] = (void*)&UE->common_vars.txdata[i][((sf+2)%10)*UE->frame_parms.samples_per_tti]; + + txs = UE->rfdevice.trx_write_func(&UE->rfdevice, + timestamp+ + (2*UE->frame_parms.samples_per_tti) - + UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0 - + openair0_cfg[0].tx_sample_advance, + txp, + UE->frame_parms.samples_per_tti, + UE->frame_parms.nb_antennas_tx, + 1); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + } else { @@ -1070,6 +1073,24 @@ void *UE_thread(void *arg) { rxp, UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, UE->frame_parms.nb_antennas_rx); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + + for (i=0; iframe_parms.nb_antennas_tx; i++) + txp[i] = (void*)&UE->common_vars.txdata[i][((sf+2)%10)*UE->frame_parms.samples_per_tti]; + + txs = UE->rfdevice.trx_write_func(&UE->rfdevice, + timestamp+ + (2*UE->frame_parms.samples_per_tti) - + UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0 - + openair0_cfg[0].tx_sample_advance, + txp, + UE->frame_parms.samples_per_tti - rx_off_diff, + UE->frame_parms.nb_antennas_tx, + 1); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + // read in first symbol of next frame and adjust for timing drift rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp1, From 51bf2ba5353db05aebf394598b3d18282810cee2 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Thu, 29 Sep 2016 12:55:09 +0200 Subject: [PATCH 270/340] recalibrate USRP config files --- .../GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf | 2 +- .../GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf | 2 +- .../GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf | 2 +- .../GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf | 2 +- .../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf | 2 +- .../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf | 2 +- .../GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf index 325af1c830..00ea6edfde 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -33; + pdsch_referenceSignalPower = -30; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf index 06b27ba63c..6a06a3fe70 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.100PRB.usrpx310.conf @@ -49,7 +49,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; + pdsch_referenceSignalPower = -23; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf index 39ff0481cc..a56eebf5b2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -30; + pdsch_referenceSignalPower = -27; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf index 71e4472306..eac7271c46 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.50PRB.usrpx310.conf @@ -49,7 +49,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -21; + pdsch_referenceSignalPower = -19; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf index 688840015d..dbd2220cbc 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -50,7 +50,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -27; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf index f41df6bb76..23253adb5b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf @@ -49,7 +49,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -18; + pdsch_referenceSignalPower = -16; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf index b9030cf439..191071d18c 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if5.usrpb210.conf @@ -49,7 +49,7 @@ eNBs = pucch_nRB_CQI = 1; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; From c6cb8ed260b0cf852a053fa046a9db63ad4d44b5 Mon Sep 17 00:00:00 2001 From: hutch Date: Fri, 30 Sep 2016 11:10:13 +0200 Subject: [PATCH 271/340] hotfix for eRRC --- targets/RT/USER/lte-enb.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index d2be56a3a3..7d68f0c172 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1614,7 +1614,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case NGFI_RRU_IF4p5: eNB->do_prach = do_prach; - eNB->fep = (single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; + eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; eNB->td = NULL; eNB->te = NULL; eNB->proc_uespec_rx = NULL; @@ -1643,7 +1643,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP: eNB->do_prach = do_prach; - eNB->fep = (single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; + eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; @@ -1663,9 +1663,9 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst break; case eNodeB_3GPP_BBU: eNB->do_prach = do_prach; - eNB->fep = (single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; - eNB->td = (single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; - eNB->te = (single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; eNB->tx_fh = tx_fh_if5; @@ -1688,8 +1688,8 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst case NGFI_RCC_IF4p5: eNB->do_prach = do_prach; eNB->fep = NULL; - eNB->td = (single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; - eNB->te = (single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; @@ -1712,8 +1712,8 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->do_prach = do_prach; eNB->fep = NULL; - eNB->td = (single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; - eNB->te = (single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_high; eNB->tx_fh = tx_fh_if4p5; From 9f485ac5a92e770fe18b86bae943bdb68457f253 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 30 Sep 2016 11:14:09 +0200 Subject: [PATCH 272/340] minor fix to config files --- .../GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf | 3 ++- .../GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf index f99cdab2a2..77b6034920 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.usrpb210.conf @@ -38,6 +38,7 @@ eNBs = Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; + nb_antenna_ports = 1; tx_gain = 90; rx_gain = 125; prach_root = 0; @@ -100,7 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; - + ue_TransmissionMode = 1; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf index 5fbdad1fa6..dac1608948 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf @@ -38,6 +38,7 @@ eNBs = Nid_cell_mbsfn = 0; nb_antennas_tx = 1; nb_antennas_rx = 1; + nb_antenna_ports = 1; tx_gain = 90; rx_gain = 125; prach_root = 0; @@ -100,7 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; - + ue_TransmissionMode = 1; } ); @@ -161,7 +162,7 @@ eNBs = local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw_if4"; + tr_preference = "raw_if4p5"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; From 5ea7253ff7c104b50d49c018d4f2ed18068407ce Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 30 Sep 2016 12:32:33 +0200 Subject: [PATCH 273/340] small update --- cmake_targets/CMakeLists.txt | 2 +- openair1/PHY/defs.h | 13 ++++++++++++- openair1/PHY/extern.h | 8 +++++++- openair1/PHY/impl_defs_lte.h | 10 ++++++++-- openair2/X2AP/x2ap_common.h | 2 ++ targets/RT/USER/lte-enb.c | 8 ++++++-- 6 files changed, 36 insertions(+), 7 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index e1396b6398..94f17872b7 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -881,7 +881,7 @@ set(UTIL_SRC ${OPENAIR2_DIR}/UTIL/OMG/job.c ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c ${OPENAIR2_DIR}/UTIL/OMG/omg.c - ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c + #${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c ${OPENAIR2_DIR}/UTIL/OMG/rwp.c ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index abf6038543..aa398f2fdc 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -53,6 +53,11 @@ # define msg mexPrintf #else # ifdef OPENAIR2 +# if ENABLE_RAL +# include "collection/hashtable/hashtable.h" +# include "COMMON/ral_messages_types.h" +# include "UTIL/queue.h" +# endif # include "log.h" # define msg(aRGS...) LOG_D(PHY, ##aRGS) # else @@ -127,6 +132,8 @@ static inline void* malloc16_clear( size_t size ) #include "PHY/TOOLS/defs.h" #include "platform_types.h" +#ifdef OPENAIR_LTE + #include "PHY/LTE_TRANSPORT/defs.h" #include @@ -138,6 +145,9 @@ static inline void* malloc16_clear( size_t size ) #define NB_BANDS_MAX 8 +#ifdef OCP_FRAMEWORK +#include +#else typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6,rx_dump_frame=7,loop_through_memory=8} runmode_t; enum transmission_access_mode { @@ -161,6 +171,7 @@ typedef enum { synch_to_ext_device=0, // synch to RF or Ethernet device synch_to_other // synch to another source (timer, other CC_id) } eNB_timing_t; +#endif typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals @@ -837,5 +848,5 @@ typedef struct { #include "PHY/LTE_ESTIMATION/defs.h" #include "SIMULATION/ETH_TRANSPORT/defs.h" - +#endif #endif // __PHY_DEFS__H__ diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h index 8a5bf5e8f5..009057838b 100755 --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -47,11 +47,17 @@ extern int number_of_cards; //extern PHY_CONFIG *PHY_config; //extern PHY_VARS *PHY_vars; - +#ifndef OCP_FRAMEWORK extern PHY_VARS_UE ***PHY_vars_UE_g; extern PHY_VARS_eNB ***PHY_vars_eNB_g; extern PHY_VARS_RN **PHY_vars_RN_g; extern LTE_DL_FRAME_PARMS *lte_frame_parms_g; +#else +#define MAX_UE 10 +#define MAX_eNB 20 +extern PHY_VARS_UE * PHY_vars_UE_g[MAX_UE][MAX_NUM_CCs]; +extern PHY_VARS_eNB * PHY_vars_eNB_g[MAX_eNB][MAX_NUM_CCs]; +#endif extern MAC_xface *mac_xface; diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index bed2057800..eed53bce09 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -62,7 +62,9 @@ #define MAX_MBSFN_AREA 8 - +#ifdef OCP_FRAMEWORK +#include "enums.h" +#else typedef enum {TDD=1,FDD=0} lte_frame_type_t; typedef enum {EXTENDED=1,NORMAL=0} lte_prefix_type_t; @@ -82,7 +84,7 @@ typedef enum { one=6, two=12 } PHICH_RESOURCE_t; - +#endif /// PHICH-Config from 36.331 RRC spec typedef struct { /// Parameter: PHICH-Duration, see TS 36.211 (Table 6.9.3-1). @@ -169,10 +171,12 @@ typedef struct { } UL_REFERENCE_SIGNALS_PUSCH_t; /// Enumeration for parameter Hopping-mode \ref PUSCH_CONFIG_COMMON::hoppingMode. +#ifndef OCP_FRAMEWORK typedef enum { interSubFrame=0, intraAndInterSubFrame=1 } PUSCH_HOPPING_t; +#endif /// PUSCH-ConfigCommon from 36.331 RRC spec. typedef struct { @@ -337,6 +341,7 @@ typedef struct { uint8_t filterCoefficient; } UL_POWER_CONTROL_DEDICATED; +#ifndef OCP_FRAMEWORK /// Enumeration for parameter \f$\alpha\f$ \ref UL_POWER_CONTROL_CONFIG_COMMON::alpha. typedef enum { al0=0, @@ -348,6 +353,7 @@ typedef enum { al09=6, al1=7 } PUSCH_alpha_t; +#endif /// \note UNUSED typedef enum { diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h index 04ad77f8e3..b2f8617572 100755 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -290,8 +290,10 @@ # define X2AP_PORT 36422 #endif +#ifndef TRUE #define TRUE 1 #define FALSE 0 +#endif extern int asn_debug; extern int asn1_xer_print; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 1023ccc04f..cf4f6e9568 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -190,10 +190,10 @@ static inline void thread_top_init(char *thread_name, if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - exit_fun("Error setting deadline scheduler"); + exit(1); } - LOG_I( HW, "[SCHED] eNB %s deadline thread (TID %ld) started on CPU %d\n", gettid(), thread_name,sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB RXn-TXnp4 deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); #else //LOW_LATENCY int policy, s, j; @@ -1352,7 +1352,9 @@ void init_eNB_proc(int inst) { for (CC_id=0; CC_idnode_function],eNB_timing[eNB->node_timing]); +#endif proc = &eNB->proc; proc_rxtx = proc->proc_rxtx; @@ -1625,7 +1627,9 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->node_timing = node_timing[CC_id]; eNB->abstraction_flag = 0; eNB->single_thread_flag = single_thread_flag; +#ifndef OCP_FRAMEWORK LOG_I(PHY,"Initializing eNB %d CC_id %d : (%s,%s)\n",inst,CC_id,eNB_functions[node_function[CC_id]],eNB_timing[node_timing[CC_id]]); +#endif switch (node_function[CC_id]) { case NGFI_RRU_IF5: From 5822c850cb6adffd839a372730b009aa7e092371 Mon Sep 17 00:00:00 2001 From: laurent Date: Fri, 30 Sep 2016 12:34:57 +0200 Subject: [PATCH 274/340] small2 --- cmake_targets/tools/build_helper | 4 ++-- openair1/PHY/defs.h | 9 +++++++++ openair1/PHY/extern.h | 8 +++++++- openair1/PHY/impl_defs_lte.h | 10 ++++++++-- openair2/X2AP/x2ap_common.h | 2 ++ targets/RT/USER/lte-enb.c | 8 ++++++-- 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 94e80e2358..9c6f846f6c 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -332,7 +332,7 @@ check_install_oai_software() { wget $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so - $SUDO apt-get install libgnutls-dev nettle-dev nettle-bin + $SUDO apt-get install -y libgnutls-dev nettle-dev nettle-bin install_asn1c_from_source } @@ -342,7 +342,7 @@ install_asn1c_from_source(){ echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log " ( $SUDO rm -rf /tmp/asn1c - git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c + $SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c cd /tmp/asn1c ./configure make -j`nproc` diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index abf6038543..e8eae39ad6 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -53,6 +53,11 @@ # define msg mexPrintf #else # ifdef OPENAIR2 +# if ENABLE_RAL +# include "collection/hashtable/hashtable.h" +# include "COMMON/ral_messages_types.h" +# include "UTIL/queue.h" +# endif # include "log.h" # define msg(aRGS...) LOG_D(PHY, ##aRGS) # else @@ -138,6 +143,9 @@ static inline void* malloc16_clear( size_t size ) #define NB_BANDS_MAX 8 +#ifdef OCP_FRAMEWORK +#include +#else typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6,rx_dump_frame=7,loop_through_memory=8} runmode_t; enum transmission_access_mode { @@ -161,6 +169,7 @@ typedef enum { synch_to_ext_device=0, // synch to RF or Ethernet device synch_to_other // synch to another source (timer, other CC_id) } eNB_timing_t; +#endif typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h index 8a5bf5e8f5..009057838b 100755 --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -47,11 +47,17 @@ extern int number_of_cards; //extern PHY_CONFIG *PHY_config; //extern PHY_VARS *PHY_vars; - +#ifndef OCP_FRAMEWORK extern PHY_VARS_UE ***PHY_vars_UE_g; extern PHY_VARS_eNB ***PHY_vars_eNB_g; extern PHY_VARS_RN **PHY_vars_RN_g; extern LTE_DL_FRAME_PARMS *lte_frame_parms_g; +#else +#define MAX_UE 10 +#define MAX_eNB 20 +extern PHY_VARS_UE * PHY_vars_UE_g[MAX_UE][MAX_NUM_CCs]; +extern PHY_VARS_eNB * PHY_vars_eNB_g[MAX_eNB][MAX_NUM_CCs]; +#endif extern MAC_xface *mac_xface; diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index bed2057800..eed53bce09 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -62,7 +62,9 @@ #define MAX_MBSFN_AREA 8 - +#ifdef OCP_FRAMEWORK +#include "enums.h" +#else typedef enum {TDD=1,FDD=0} lte_frame_type_t; typedef enum {EXTENDED=1,NORMAL=0} lte_prefix_type_t; @@ -82,7 +84,7 @@ typedef enum { one=6, two=12 } PHICH_RESOURCE_t; - +#endif /// PHICH-Config from 36.331 RRC spec typedef struct { /// Parameter: PHICH-Duration, see TS 36.211 (Table 6.9.3-1). @@ -169,10 +171,12 @@ typedef struct { } UL_REFERENCE_SIGNALS_PUSCH_t; /// Enumeration for parameter Hopping-mode \ref PUSCH_CONFIG_COMMON::hoppingMode. +#ifndef OCP_FRAMEWORK typedef enum { interSubFrame=0, intraAndInterSubFrame=1 } PUSCH_HOPPING_t; +#endif /// PUSCH-ConfigCommon from 36.331 RRC spec. typedef struct { @@ -337,6 +341,7 @@ typedef struct { uint8_t filterCoefficient; } UL_POWER_CONTROL_DEDICATED; +#ifndef OCP_FRAMEWORK /// Enumeration for parameter \f$\alpha\f$ \ref UL_POWER_CONTROL_CONFIG_COMMON::alpha. typedef enum { al0=0, @@ -348,6 +353,7 @@ typedef enum { al09=6, al1=7 } PUSCH_alpha_t; +#endif /// \note UNUSED typedef enum { diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h index 04ad77f8e3..b2f8617572 100755 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -290,8 +290,10 @@ # define X2AP_PORT 36422 #endif +#ifndef TRUE #define TRUE 1 #define FALSE 0 +#endif extern int asn_debug; extern int asn1_xer_print; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 1023ccc04f..cf4f6e9568 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -190,10 +190,10 @@ static inline void thread_top_init(char *thread_name, if (sched_setattr(0, &attr, flags) < 0 ) { perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - exit_fun("Error setting deadline scheduler"); + exit(1); } - LOG_I( HW, "[SCHED] eNB %s deadline thread (TID %ld) started on CPU %d\n", gettid(), thread_name,sched_getcpu() ); + LOG_I( HW, "[SCHED] eNB RXn-TXnp4 deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() ); #else //LOW_LATENCY int policy, s, j; @@ -1352,7 +1352,9 @@ void init_eNB_proc(int inst) { for (CC_id=0; CC_idnode_function],eNB_timing[eNB->node_timing]); +#endif proc = &eNB->proc; proc_rxtx = proc->proc_rxtx; @@ -1625,7 +1627,9 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->node_timing = node_timing[CC_id]; eNB->abstraction_flag = 0; eNB->single_thread_flag = single_thread_flag; +#ifndef OCP_FRAMEWORK LOG_I(PHY,"Initializing eNB %d CC_id %d : (%s,%s)\n",inst,CC_id,eNB_functions[node_function[CC_id]],eNB_timing[node_timing[CC_id]]); +#endif switch (node_function[CC_id]) { case NGFI_RRU_IF5: From 7a1e8347c7e0109e175464a11d9478bb17111c05 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 30 Sep 2016 21:41:00 +0200 Subject: [PATCH 275/340] add help for debug option for build_oai --- cmake_targets/build_oai | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 9a9209db2c..f637254e18 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -83,7 +83,7 @@ Options --install-optional-packages Install useful but not mandatory packages such as valgrind -g | --run-with-gdb - Add debugging symbols to compilation directives. It also disables any compiler optimization. + Add debugging symbols to compilation directives. It also disables any compiler optimization. Only for debugging. Do not use in normal operation! -h | --help Print this help --eNB @@ -137,9 +137,9 @@ Options --disable-hardware-dependency Disable HW dependency during installation Usage (first build): - oaisim (eNB + UE): ./build_oai -I -g --oaisim -x --install-system-files - Eurecom EXMIMO + COTS UE : ./build_oai -I -g --eNB -x --install-system-files - NI/ETTUS B201 + COTS UE : ./build_oai -I -g --eNB -x --install-system-files -w USRP + oaisim (eNB + UE): ./build_oai -I --oaisim -x --install-system-files + Eurecom EXMIMO + COTS UE : ./build_oai -I --eNB -x --install-system-files + NI/ETTUS B201 + COTS UE : ./build_oai -I --eNB -x --install-system-files -w USRP Usage (Regular): oaisim : ./build_oai --oaisim -x Eurecom EXMIMO + OAI ENB : ./build_oai --eNB -x From 4b77dda67ba12385df80a346d46f7d155b9f5354 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 30 Sep 2016 23:01:31 -0700 Subject: [PATCH 276/340] some changes in pucchsim to remove warnings. sanity check in turbo_decoder. --- .../CODING/3gpplte_turbo_decoder_sse_8bit.c | 5 +++++ openair1/PHY/LTE_TRANSPORT/pucch.c | 7 +++++-- openair1/SIMULATION/LTE_PHY/pucchsim.c | 21 ++++++++++++------- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index 99ac8cbf38..9d9ba961c2 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -493,6 +493,11 @@ void compute_beta8(llr_t* alpha,llr_t* beta,llr_t *m_11,llr_t* m_10,unsigned sho #endif + if (frame_length > 6143) { + LOG_E(PHY,"compute_beta: frame_length %d\n",frame_length); + return; + } + // we are supposed to run compute_alpha just before compute_beta // so the initial states of backward computation can be set from last value of alpha states (forward computation) diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 7787ddfcf3..97a6ab7016 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -47,7 +47,7 @@ #include "T.h" //uint8_t ncs_cell[20][7]; -//#define DEBUG_PUCCH_TX +#define DEBUG_PUCCH_TX //#define DEBUG_PUCCH_RX int16_t cfo_pucch_np[24*7] = {20787,-25330,27244,-18205,31356,-9512,32767,0,31356,9511,27244,18204,20787,25329, @@ -190,6 +190,9 @@ void generate_pucch1x(int32_t **txdataF, else { d = (frame_parms->Ncp==0) ? 2 : 0; h= (nprime0+d)%(c*Nprime_div_deltaPUCCH_Shift); +#ifdef DEBUG_PUCCH_TX + printf("[PHY] PUCCH: h %d, d %d\n",h,d); +#endif nprime1 = (h/c) + (h%c)*Nprime_div_deltaPUCCH_Shift; } @@ -208,7 +211,7 @@ void generate_pucch1x(int32_t **txdataF, n_oc1<<=1; #ifdef DEBUG_PUCCH_TX - printf("[PHY] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1); + printf("[PHY] PUCCH: noc0 %d noc1 %d\n",n_oc0,n_oc1); #endif nprime=nprime0; diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index 4f9b8f9a88..e246b423ef 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -66,7 +66,11 @@ int main(int argc, char **argv) uint8_t snr1set=0; //mod_sym_t **txdataF; int **txdata; - double s_re[2][30720],s_im[2][30720],r_re[2][30720],r_im[2][30720]; + double s_re0[30720],s_re1[30720],s_im0[30720],s_im1[30720],r_re0[30720],r_im0[30720],r_re1[30720],r_im1[30720]; + double *s_re[2]={s_re0,s_re1}; + double *s_im[2]={s_im0,s_im1}; + double *r_re[2]={r_re0,r_re1}; + double *r_im[2]={r_im0,r_im1}; double ricean_factor=0.0000005,iqim=0.0; int trial, n_trials, ntrials=1, n_errors; @@ -352,12 +356,15 @@ int main(int argc, char **argv) init_ncs_cell(&UE->frame_parms,UE->ncs_cell); - eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; - eNB->frame_parms.pucch_config_common.nRB_CQI = 0; - eNB->frame_parms.pucch_config_common.nCS_AN = 0; - UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; - UE->frame_parms.pucch_config_common.nRB_CQI = 0; - UE->frame_parms.pucch_config_common.nCS_AN = 0; + init_ul_hopping(&eNB->frame_parms); + init_ul_hopping(&UE->frame_parms); + + eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 2; + eNB->frame_parms.pucch_config_common.nRB_CQI = 4; + eNB->frame_parms.pucch_config_common.nCS_AN = 6; + UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 2; + UE->frame_parms.pucch_config_common.nRB_CQI = 4; + UE->frame_parms.pucch_config_common.nCS_AN = 6; pucch_payload = 0; From 9f972b7f220b9674f561e9757c99cf2e6793773e Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 1 Oct 2016 01:42:20 -0700 Subject: [PATCH 277/340] updated high-level slideset. --- targets/DOCS/oai_L1_L2_procedures.pdf | Bin 269265 -> 1118156 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/targets/DOCS/oai_L1_L2_procedures.pdf b/targets/DOCS/oai_L1_L2_procedures.pdf index 89ec48595691438ecf418ab54e78041267f880e3..369efc3b479b960c74e89b7e73e427a15cea8de9 100755 GIT binary patch literal 1118156 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

pNXaJbVmkKJVxnwbgs&>%-fm{V=PYdh zp(I(GUI{^2K)1kYWaTd}37wQmky)mK_gAp2)7StR6aFlnt^!Djoy@>wm-mHO?D`q6 zcNWD%^}w=M#rC1Gw*A)OWV@kfCObWS@bvWHs`5vN&&N$3i}vX<59f zN&(({LDEe9?_j@MD&OB6-i*gN+MJ8;A>K7SXM%#sK2M_8zMa38M%*}ABHQ1Soi>6F zV<-^LHy~kP5IO1t>rzTiZeaIHAsaX{K7M<3bqu+Bou329$ndeTq3gd02uxxD$H|o6 zi7$_|rqUt(5;6n+vPV__E+oiMHOTrzG(_vaweEQ|)qmx;Mz&SFzAT=->?G)FGy6N| zHV6%1Ya695DQPdamO{|{$}f9fsSv0ki2NR2bjj>~a`umFBs(H_;N-{e?dGWqJnzt( z=i8t6k_|*Kb&)0!8hRAPhqOF2nMh}NUs}Djm{hr2byw;hKQZdL8nkEZv{F<#Q~vSu zbq4J)o3uf^0h!uA?RN1^a5K;FbW1{Il(|sZ@5WstN^39WxrRbYOj6c5ymFMi!<%aZ z^!0kGwixm@^Mv%osBGz#5HzaW>$$-nlTrWF?a&|AE2|>Z)wxz1JEmta1ljprF5;&4 zPpW@KY*$vAJ;WMOmie&>B0t`T_S-K$Axy70y_eZRQ{N)au35Eq?t zPX9v&OioV1!oqUdt)*sVot>V-k-|hnSwljRb`B2_(R*~B=APLp=k#q#_f5lZfnE*m zez9sSkeoJ8{vKGM>%qZcC36*UvfXv+1I03=z8N?-tpPT*aM+oIZJ8_Etl2w%RY!t~ znP499=A(XTlgOM3~fFQa8$rV^I3YMs$Z zE<07yoh^02?!s&1d$>?s14N4L;9g^mp!na~^ukeuM{i?WUvR5R#VP0{H7FFPyY};x zd>CH;3uN0l(x;N;)l0AK3vkiRMwt7+{3_jSmUH% zQ?q%=KvkkTgKFqE-nY$4M*i0gy3qFsvjKS_a==m0xAJ3o}vAGFgtS`|Mju<9Ed z12`f74HSNm$hLjHp5tZrKhRbHDyuK+rDBUN$MnaCy}=kcmJ`sazqeuB>D*>LA@ zOu19P04bXN7R|s_JoZ%&)rHR+%}zTKk-O;j_V)GFyGCPedAaQ8?~aa+IOR{v%Mgsp zPt@VEy9d_y*KWX=J|ghT{npLX9s1q=Xnb$oj|GSTAs#x(&8&{6nrOYk>&eBe;1Lr0 z&0XvA)zZHXd0d?wBd?JD3x3sNT9B%}$7`VO__5Bzkd+F#5$&JTV=GA|DCFU-vFl9g zMfgZxCxZ`rl}GIq&}NWKN_LdqC|2ALGY%1$V^BbUsK{{sh{;!~4wZ2N&6;}=p*3N1 z-;^)21I=sHDboMsgD-$7Tco3IC{$#;?#_+q_2#9D@(Ih|EA{~b8}TYPc9I-bnU$M9_W!0 zh+q}>dDD=i4xv`V;j$S4WYEwH1ww)gczk@^*w_dQL#i%rZ-4C#Muo`!enkJ*_d)@7 zJ132pz(g5*)ox9&o|kL}QsvMUCe+RH*kDBV>AzcE-UJo4_@br>vRGjF3%qQE4Uaup z2r%a#Fv;Mbc5}7zJPcC-Dr0;TNqBy%j`(5!3xv*t&Z5jB_F^?O6}pP(E5vk{=ps

@tr0 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%0ASU{V0vYcyBwu^$s3C57mL_ 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%0A6G*7Y(aa!MIG@`KA> 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�w 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 cKA7y|>)`GC-?xgnJ7R_^0|$eP5=M^ delta 166797 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%0D9^_vp}Y4>hjtc*Hv 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 From 5ed184ddf22315bad05d2874d860356c24f40070 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sat, 1 Oct 2016 02:43:26 -0700 Subject: [PATCH 278/340] removed debugging in pucch. --- openair1/PHY/LTE_TRANSPORT/pucch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 97a6ab7016..04d72ebf27 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -47,7 +47,7 @@ #include "T.h" //uint8_t ncs_cell[20][7]; -#define DEBUG_PUCCH_TX +//#define DEBUG_PUCCH_TX //#define DEBUG_PUCCH_RX int16_t cfo_pucch_np[24*7] = {20787,-25330,27244,-18205,31356,-9512,32767,0,31356,9511,27244,18204,20787,25329, From 4ac71a6e46e986981e93342d4cb14f0708d7fdc4 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 1 Oct 2016 15:03:56 +0200 Subject: [PATCH 279/340] fixes for automatic version detection of nettle for 14.04/16.04 --- cmake_targets/CMakeLists.txt | 18 +++++++++ cmake_targets/tools/build_helper | 59 +++++++++++++++++++++++++++++- openair2/UTIL/OSA/osa_stream_eea.c | 5 +++ openair3/SECU/nas_stream_eea2.c | 5 +++ 4 files changed, 85 insertions(+), 2 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index c763be3309..b3c7942fae 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -186,6 +186,24 @@ set(GIT_BRANCH "UNKNOWN") set(GIT_COMMIT_HASH "UNKNOWN") set(GIT_COMMIT_DATE "UNKNOWN") +#This is to detect nettle version changes between Ubuntu 14.04/16.04 +set ( nettle_cmd "nettle-hash" ) +set ( nettle_arg "-V" ) +execute_process(COMMAND ${nettle_cmd} ${nettle_arg} RESULT_VARIABLE rv OUTPUT_VARIABLE ov ERROR_VARIABLE ev) + +string(REGEX MATCH "[+-]?[0-9]+([.][0-9]+)?" nv ${ov}) + +message("NETTLE_VERSION = ${nv}") + +# we need to remove decimal as floating point arithematic does not work properly with C preprocessor +STRING(REGEX REPLACE "[.]" "" nv ${nv}) + +if ("${nv}" STREQUAL "") + message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" ) +endif() + +set (NETTLE_VERSION "${nv}") +add_definitions("-DNETTLE_VERSION=${NETTLE_VERSION}") find_package(Git) if(GIT_FOUND) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 8d6de5d61c..99504b3dc8 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -334,17 +334,72 @@ check_install_oai_software() { wget $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so - $SUDO apt-get install -y libgnutls-dev nettle-dev nettle-bin + + #Remove old gnutls/nettle installation that was done from sources + remove_nettle_from_source + + $SUDO apt-get install -y nettle-dev nettle-bin + remove_gnutls_from_source + + $SUDO apt-get install -y libgnutls-dev install_asn1c_from_source } +### Remove Nettle installation which was done from sources +remove_nettle_from_source() { + nettle_uninstall_log=$OPENAIR_DIR/cmake_targets/log/nettle_uninstall_log.txt + echo_info "\nUn-Installing Nettle from sources. The log file for nettle un-installation is here: $nettle_uninstall_log " + ( + $SUDO apt-get remove -y nettle-dev nettle-bin + cd /tmp + echo "Downloading nettle archive" + $SUDO rm -rf /tmp/nettle-2.5.tar.gz* /tmp/nettle-2.5 + wget https://ftp.gnu.org/gnu/nettle/nettle-2.5.tar.gz + if [ $? -ne 0 ]; then + wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz + fi + if [ ! -f nettle-2.5.tar.gz ]; then + echo_error "Could not download nettle source files" + cd - + return + fi + tar -xzf nettle-2.5.tar.gz + cd nettle-2.5/ + ./configure --disable-openssl --enable-shared --prefix=/usr + $SUDO make uninstall || true + ) >& $nettle_uninstall_log +} + +### Remove Gnutls from source +remove_gnutls_from_source(){ + gnutls_uninstall_log=$OPENAIR_DIR/cmake_targets/log/gnutls_uninstall_log.txt + echo_info "\nUn-Installing Gnutls. The log file for Gnutls un-installation is here: $gnutls_uninstall_log " + ( + $SUDO apt-get remove -y libgnutls-dev + cd /tmp + echo "Downloading gnutls archive" + $SUDO rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23 + wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz || \ + wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz + if [ ! -f gnutls-3.1.23.tar.xz ]; then + echo_error "Could not download gnutls source files" + cd - + return + fi + tar -xJf gnutls-3.1.23.tar.xz + cd gnutls-3.1.23/ + ./configure --prefix=/usr + $SUDO make uninstall || true + )>& $gnutls_uninstall_log +} + install_asn1c_from_source(){ asn1_install_log=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log " ( $SUDO rm -rf /tmp/asn1c - $SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c + GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c cd /tmp/asn1c ./configure make -j`nproc` diff --git a/openair2/UTIL/OSA/osa_stream_eea.c b/openair2/UTIL/OSA/osa_stream_eea.c index acd341232e..08e0d44441 100644 --- a/openair2/UTIL/OSA/osa_stream_eea.c +++ b/openair2/UTIL/OSA/osa_stream_eea.c @@ -199,8 +199,13 @@ int stream_encrypt_eea2(stream_cipher_t *stream_cipher, uint8_t **out) } #endif +#if NETTLE_VERSION <= 27 + nettle_aes128.set_encrypt_key(ctx, stream_cipher->key_length, + stream_cipher->key); +#else nettle_aes128.set_encrypt_key(ctx, stream_cipher->key); +#endif nettle_ctr_crypt(ctx, nettle_aes128.encrypt, nettle_aes128.block_size, m, diff --git a/openair3/SECU/nas_stream_eea2.c b/openair3/SECU/nas_stream_eea2.c index 799aaaf432..df3a1ed82c 100644 --- a/openair3/SECU/nas_stream_eea2.c +++ b/openair3/SECU/nas_stream_eea2.c @@ -85,8 +85,13 @@ int nas_stream_encrypt_eea2(nas_stream_cipher_t *stream_cipher, uint8_t *out) } #endif +#if NETTLE_VERSION <= 27 + nettle_aes128.set_encrypt_key(ctx, stream_cipher->key_length, + stream_cipher->key); +#else nettle_aes128.set_encrypt_key(ctx, stream_cipher->key); +#endif nettle_ctr_crypt(ctx, nettle_aes128.encrypt, nettle_aes128.block_size, m, From 42b00ead01775c3fafb26fc00e1ea6b45667da9a Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 1 Oct 2016 08:54:27 -0700 Subject: [PATCH 280/340] cmake list fix for detecting nettle version for at_commands --- cmake_targets/at_commands/CMakeLists.txt | 18 ++++++++++++++++++ cmake_targets/autotests/README.txt | 1 - 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/cmake_targets/at_commands/CMakeLists.txt b/cmake_targets/at_commands/CMakeLists.txt index 0b8bfed25b..951384bd02 100755 --- a/cmake_targets/at_commands/CMakeLists.txt +++ b/cmake_targets/at_commands/CMakeLists.txt @@ -92,6 +92,24 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototype set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb -DMALLOC_CHECK_=3 -O2") +#This is to detect nettle version changes between Ubuntu 14.04/16.04 +set ( nettle_cmd "nettle-hash" ) +set ( nettle_arg "-V" ) +execute_process(COMMAND ${nettle_cmd} ${nettle_arg} RESULT_VARIABLE rv OUTPUT_VARIABLE ov ERROR_VARIABLE ev) + +string(REGEX MATCH "[+-]?[0-9]+([.][0-9]+)?" nv ${ov}) + +message("NETTLE_VERSION = ${nv}") + +# we need to remove decimal as floating point arithematic does not work properly with C preprocessor +STRING(REGEX REPLACE "[.]" "" nv ${nv}) + +if ("${nv}" STREQUAL "") + message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" ) +endif() + +set (NETTLE_VERSION "${nv}") +add_definitions("-DNETTLE_VERSION=${NETTLE_VERSION}") include(FindPkgConfig) diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt index f4e50a7e51..2a1b57c0b2 100644 --- a/cmake_targets/autotests/README.txt +++ b/cmake_targets/autotests/README.txt @@ -1,5 +1,4 @@ OAI Test PLAN -#UNDER CONSTRUCTION. Not correct at the moment Obj.# Case# Test# Description From d9398cdb1e52a5975a25611cc3dc2056ea916c60 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 1 Oct 2016 18:03:07 +0200 Subject: [PATCH 281/340] minor fix for compilation of itti assertions --- common/utils/itti/assertions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/utils/itti/assertions.h b/common/utils/itti/assertions.h index f6a6b772cd..768b40cc72 100644 --- a/common/utils/itti/assertions.h +++ b/common/utils/itti/assertions.h @@ -34,7 +34,7 @@ #include #endif -#if defined(ENB_MODE2) +#if defined(ENB_MODE) # define display_backtrace() #else # include "backtrace.h" From 0c08aa61398f917047b24572de90a70b44f2df31 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 1 Oct 2016 21:52:17 +0200 Subject: [PATCH 282/340] Gitlab CI: remove gdb from some test cases --- cmake_targets/autotests/test_case_list.xml | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 8235963c52..0fdf9248cf 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -791,7 +791,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_cmac_encrypt + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_cmac_encrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -807,7 +807,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_decrypt + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_decrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -823,7 +823,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_encrypt + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_encrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -839,7 +839,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_kenb + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_kenb --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -855,7 +855,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -871,7 +871,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea1 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -887,7 +887,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea2 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea2 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -903,7 +903,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -919,7 +919,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -935,7 +935,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_kdf + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_kdf --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -962,7 +962,7 @@ --phy_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim + $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim -m5 -gF -s-1 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 -L -m4 -gF -s0 -w1.0 -f.2 -n500 -B6 -c4 -z2 -O70 -m15 -gF -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 -L @@ -993,7 +993,7 @@ --phy_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte-simulators/build/ulsim + $OPENAIR_DIR/cmake_targets/lte-simulators/build/ulsim -B25 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L -B25 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70 -L -B50 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L From e63475debb4247e286c911832d1f50e35f567d27 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 1 Oct 2016 22:03:37 +0200 Subject: [PATCH 283/340] minor fix for compilation of core simulators --- openair3/TEST/test_aes128_ctr_decrypt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair3/TEST/test_aes128_ctr_decrypt.c b/openair3/TEST/test_aes128_ctr_decrypt.c index 251f80fa70..209ce8977a 100644 --- a/openair3/TEST/test_aes128_ctr_decrypt.c +++ b/openair3/TEST/test_aes128_ctr_decrypt.c @@ -48,7 +48,7 @@ void test_uncipher_ctr(const struct nettle_cipher *cipher, const uint8_t *key, uint8_t *data = malloc(length); uint8_t *ctr = malloc(cipher->block_size); - cipher->set_encrypt_key(ctx, key); + cipher->set_encrypt_key(ctx, key_length, key); memcpy(ctr, ictr, cipher->block_size); ctr_crypt(ctx, cipher->encrypt, From 93559037f64a56ab76d5ed1560f2ed3b1a54ab5f Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 1 Oct 2016 13:10:17 -0700 Subject: [PATCH 284/340] compilation fix for nettle API change in 16.04 --- openair3/TEST/test_aes128_ctr_decrypt.c | 5 +++++ openair3/TEST/test_aes128_ctr_encrypt.c | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/openair3/TEST/test_aes128_ctr_decrypt.c b/openair3/TEST/test_aes128_ctr_decrypt.c index 209ce8977a..15416c5e4b 100644 --- a/openair3/TEST/test_aes128_ctr_decrypt.c +++ b/openair3/TEST/test_aes128_ctr_decrypt.c @@ -48,7 +48,12 @@ void test_uncipher_ctr(const struct nettle_cipher *cipher, const uint8_t *key, uint8_t *data = malloc(length); uint8_t *ctr = malloc(cipher->block_size); +#if NETTLE_VERSION <= 27 cipher->set_encrypt_key(ctx, key_length, key); +#else + cipher->set_encrypt_key(ctx, key); +#endif + memcpy(ctr, ictr, cipher->block_size); ctr_crypt(ctx, cipher->encrypt, diff --git a/openair3/TEST/test_aes128_ctr_encrypt.c b/openair3/TEST/test_aes128_ctr_encrypt.c index a089ac549d..dab80b3602 100644 --- a/openair3/TEST/test_aes128_ctr_encrypt.c +++ b/openair3/TEST/test_aes128_ctr_encrypt.c @@ -47,7 +47,12 @@ static void test_cipher_ctr(const struct nettle_cipher *cipher, const uint8_t *k uint8_t *data = malloc(length); uint8_t *ctr = malloc(cipher->block_size); +#if NETTLE_VERSION <= 27 cipher->set_encrypt_key(ctx, key_length, key); +#else + cipher->set_encrypt_key(ctx, key); +#endif + memcpy(ctr, ictr, cipher->block_size); ctr_crypt(ctx, cipher->encrypt, From 026318686006548f1d74f57d25733d0f266cb6fb Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sat, 1 Oct 2016 22:31:40 +0200 Subject: [PATCH 285/340] compilation fixes for mbmssim --- openair1/SIMULATION/LTE_PHY/mbmssim.c | 118 +++++++++++++------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 8e19bd86db..539a292874 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -59,7 +59,7 @@ PHY_VARS_UE *PHY_vars_UE; DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2]; #define UL_RB_ALLOC 0x1ff; -#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2) +#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->frame_parms.N_RB_UL,0,2) int main(int argc, char **argv) { @@ -125,7 +125,7 @@ int main(int argc, char **argv) logInit(); number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; + //openair_daq_vars.rx_rf_mode = 1; /* rxdataF = (int **)malloc16(2*sizeof(int*)); @@ -266,7 +266,7 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &PHY_vars_eNB->frame_parms; if (awgn_flag == 0) sprintf(fname,"embms_%d_%d.m",mcs,N_RB_DL); @@ -292,7 +292,7 @@ int main(int argc, char **argv) fflush(fd); - txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[0]; + txdata = PHY_vars_eNB->common_vars.txdata[0]; s_re = malloc(2*sizeof(double*)); s_im = malloc(2*sizeof(double*)); @@ -315,49 +315,49 @@ int main(int argc, char **argv) bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); } - eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE = new_channel_desc_scm(PHY_vars_eNB->frame_parms.nb_antennas_tx, + PHY_vars_UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(PHY_vars_eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(PHY_vars_eNB->frame_parms.N_RB_DL), 0, 0, 0); // Create transport channel structures for 2 transport blocks (MIMO) - PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0); + PHY_vars_eNB->dlsch_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0); - if (!PHY_vars_eNB->dlsch_eNB_MCH) { + if (!PHY_vars_eNB->dlsch_MCH) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); + PHY_vars_UE->dlsch_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); - PHY_vars_eNB->lte_frame_parms.num_MBSFN_config = 1; - PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; - PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; - PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].fourFrames_flag = 0; - PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes - PHY_vars_UE->lte_frame_parms.num_MBSFN_config = 1; - PHY_vars_UE->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; - PHY_vars_UE->lte_frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; - PHY_vars_UE->lte_frame_parms.MBSFN_config[0].fourFrames_flag = 0; - PHY_vars_UE->lte_frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes + PHY_vars_eNB->frame_parms.num_MBSFN_config = 1; + PHY_vars_eNB->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; + PHY_vars_eNB->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; + PHY_vars_eNB->frame_parms.MBSFN_config[0].fourFrames_flag = 0; + PHY_vars_eNB->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes + PHY_vars_UE->frame_parms.num_MBSFN_config = 1; + PHY_vars_UE->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; + PHY_vars_UE->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; + PHY_vars_UE->frame_parms.MBSFN_config[0].fourFrames_flag = 0; + PHY_vars_UE->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes fill_eNB_dlsch_MCH(PHY_vars_eNB,mcs,1,0,0); fill_UE_dlsch_MCH(PHY_vars_UE,mcs,1,0,0); - if (is_pmch_subframe(0,subframe,&PHY_vars_eNB->lte_frame_parms)==0) { + if (is_pmch_subframe(0,subframe,&PHY_vars_eNB->frame_parms)==0) { printf("eNB is not configured for MBSFN in subframe %d\n",subframe); exit(-1); - } else if (is_pmch_subframe(0,subframe,&PHY_vars_UE->lte_frame_parms)==0) { + } else if (is_pmch_subframe(0,subframe,&PHY_vars_UE->frame_parms)==0) { printf("UE is not configured for MBSFN in subframe %d\n",subframe); exit(-1); } - input_buffer_length = PHY_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS/8; + input_buffer_length = PHY_vars_eNB->dlsch_MCH->harq_processes[0]->TBS/8; input_buffer = (unsigned char *)malloc(input_buffer_length+4); memset(input_buffer,0,input_buffer_length+4); @@ -392,12 +392,12 @@ int main(int argc, char **argv) //if (trials%100==0) //eNB2UE[0]->first_run = 1; eNB2UE->first_run = 1; - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + memset(&PHY_vars_eNB->common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); generate_mch(PHY_vars_eNB,sched_subframe,input_buffer,0); - PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0], // input, + PHY_ofdm_mod(PHY_vars_eNB->common_vars.txdataF[0][0], // input, txdata[0], // output frame_parms->ofdm_symbol_size, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols @@ -405,33 +405,33 @@ int main(int argc, char **argv) CYCLIC_PREFIX); if (n_frames==1) { - write_output("txsigF0.m","txsF0", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); - //if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - //write_output("txsigF1.m","txsF1", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + write_output("txsigF0.m","txsF0", &PHY_vars_eNB->common_vars.txdataF[0][0][subframe*nsymb*PHY_vars_eNB->frame_parms.ofdm_symbol_size], + nsymb*PHY_vars_eNB->frame_parms.ofdm_symbol_size,1,1); + //if (PHY_vars_eNB->frame_parms.nb_antennas_tx>1) + //write_output("txsigF1.m","txsF1", &PHY_vars_eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->frame_parms.ofdm_symbol_size],nsymb*PHY_vars_eNB->frame_parms.ofdm_symbol_size,1,1); } tx_lev = 0; - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - tx_lev += signal_energy(&PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa] - [subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], - PHY_vars_eNB->lte_frame_parms.samples_per_tti); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + tx_lev += signal_energy(&PHY_vars_eNB->common_vars.txdata[eNB_id][aa] + [subframe*PHY_vars_eNB->frame_parms.samples_per_tti], + PHY_vars_eNB->frame_parms.samples_per_tti); } tx_lev_dB = (unsigned int) dB_fixed(tx_lev); if (n_frames==1) { printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); - // write_output("txsig0.m","txs0", &PHY_vars_eNB->lte_eNB_common_vars.txdata[0][0][subframe* PHY_vars_eNB->lte_frame_parms.samples_per_tti], + // write_output("txsig0.m","txs0", &PHY_vars_eNB->common_vars.txdata[0][0][subframe* PHY_vars_eNB->frame_parms.samples_per_tti], - // PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); + // PHY_vars_eNB->frame_parms.samples_per_tti,1,1); } for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - s_re[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[0][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - s_im[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[0][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + s_re[aa][i] = ((double)(((short *)PHY_vars_eNB->common_vars.txdata[0][aa]))[(2*subframe*PHY_vars_UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)PHY_vars_eNB->common_vars.txdata[0][aa]))[(2*subframe*PHY_vars_UE->frame_parms.samples_per_tti) +(i<<1)+1]); } } @@ -440,18 +440,18 @@ int main(int argc, char **argv) 2*frame_parms->samples_per_tti,hold_channel); //AWGN - sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(NB_RB*12)) - SNR; + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->frame_parms.ofdm_symbol_size/(NB_RB*12)) - SNR; sigma2 = pow(10,sigma2_dB/10); if (n_frames==1) printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB); for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i] = + ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->frame_parms.samples_per_tti)+2*i] = (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i+1] = + ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->frame_parms.samples_per_tti)+2*i+1] = (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); } } @@ -466,7 +466,7 @@ int main(int argc, char **argv) if (PHY_vars_UE->perfect_ce==1) { // fill in perfect channel estimates - freq_channel(eNB2UE,PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); + freq_channel(eNB2UE,PHY_vars_UE->frame_parms.N_RB_DL,12*PHY_vars_UE->frame_parms.N_RB_DL + 1); for(k=0; knb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { @@ -499,30 +499,30 @@ int main(int argc, char **argv) l2); } - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb, - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc_even, - get_Qm(PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->mcs), + PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->G = get_G(&PHY_vars_UE->frame_parms, + PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->nb_rb, + PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, + get_Qm(PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->mcs), 1,2, PHY_vars_UE->frame_tx,subframe); - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->Qm = get_Qm(PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->mcs); + PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->Qm = get_Qm(PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->mcs); - dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,1,PHY_vars_UE->dlsch_ue_MCH[0], - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G, + dlsch_unscrambling(&PHY_vars_UE->frame_parms,1,PHY_vars_UE->dlsch_MCH[0], + PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->G, PHY_vars_UE->lte_ue_pdsch_vars_MCH[0]->llr[0],0,subframe<<1); ret = dlsch_decoding(PHY_vars_UE, PHY_vars_UE->lte_ue_pdsch_vars_MCH[0]->llr[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->dlsch_ue_MCH[0], - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0], + &PHY_vars_UE->frame_parms, + PHY_vars_UE->dlsch_MCH[0], + PHY_vars_UE->dlsch_MCH[0]->harq_processes[0], subframe, 0,0,0); if (n_frames==1) printf("MCH decoding returns %d\n",ret); - if (ret == (1+PHY_vars_UE->dlsch_ue_MCH[0]->max_turbo_iterations)) + if (ret == (1+PHY_vars_UE->dlsch_MCH[0]->max_turbo_iterations)) errs[0]++; PHY_vars_UE->frame_tx++; @@ -550,15 +550,15 @@ int main(int argc, char **argv) if (n_frames==1) { - printf("Dumping PMCH files ( G %d)\n",PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G); + printf("Dumping PMCH files ( G %d)\n",PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->G); dump_mch(PHY_vars_UE,0, - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G, + PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->G, subframe); } printf("Freeing dlsch structures\n"); - free_eNB_dlsch(PHY_vars_eNB->dlsch_eNB_MCH); - free_ue_dlsch(PHY_vars_UE->dlsch_ue_MCH[0]); + free_eNB_dlsch(PHY_vars_eNB->dlsch_MCH); + free_ue_dlsch(PHY_vars_UE->dlsch_MCH[0]); fclose(fd); From ec7d0ff2c3518b9472fa781ab48595c8fd0a68a7 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sun, 2 Oct 2016 00:24:25 +0200 Subject: [PATCH 286/340] fix compilation warnings --- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 2 +- openair2/RRC/LITE/rrc_eNB_S1AP.c | 1 - openair2/RRC/LITE/rrc_eNB_S1AP.h | 8 ++++++++ openair3/NAS/TOOLS/usim_data.c | 3 +-- openair3/NAS/UE/API/USIM/usim_api.c | 2 +- targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c | 2 +- targets/RT/USER/lte-softmodem.c | 3 ++- targets/RT/USER/lte-ue.c | 15 +++++++++++++-- targets/SIMU/USER/oaisim.c | 10 ++-------- targets/SIMU/USER/oaisim_functions.c | 6 ------ 10 files changed, 29 insertions(+), 23 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 91af77ad59..cf64b7bb60 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -434,7 +434,7 @@ schedule_ue_spec( int N_RBG[MAX_NUM_CCs]; unsigned char aggregation; mac_rlc_status_resp_t rlc_status; - unsigned char header_len_dcch=0, header_len_dcch_tmp=0, header_len_dcch_last=0; + unsigned char header_len_dcch=0, header_len_dcch_tmp=0; unsigned char header_len_dtch=0, header_len_dtch_tmp=0, header_len_dtch_last=0; unsigned char ta_len=0; unsigned char sdu_lcids[NB_RB_MAX],lcid,offset,num_sdus=0; diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 33d076b9f6..50d15c31af 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -1259,7 +1259,6 @@ int rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name { uint16_t ue_initial_id; uint32_t eNB_ue_s1ap_id; - MessageDef *message_gtpv1u_p = NULL; gtpv1u_enb_create_tunnel_req_t create_tunnel_req; gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp; diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.h b/openair2/RRC/LITE/rrc_eNB_S1AP.h index 0beebc72c1..f199931bbb 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.h +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.h @@ -79,6 +79,14 @@ rrc_eNB_S1AP_remove_ue_ids( eNB_RRC_INST* const rrc_instance_pP, struct rrc_ue_s1ap_ids_s* const ue_ids_pP ); + +void +rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state + ); + + /*! \fn void rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(uint8_t mod_id, uint8_t ue_index) *\brief create a S1AP_INITIAL_CONTEXT_SETUP_RESP for S1AP. *\param ctxt_pP Running context. diff --git a/openair3/NAS/TOOLS/usim_data.c b/openair3/NAS/TOOLS/usim_data.c index ffde00c268..1835f0b8b1 100644 --- a/openair3/NAS/TOOLS/usim_data.c +++ b/openair3/NAS/TOOLS/usim_data.c @@ -185,12 +185,11 @@ int main (int argc, const char* argv[]) usim_data.imsi.u.num.digit15 = 0b1111; #endif #if (SELECTED_PLMN == OAI_LTEBOX) -#warning "IMSI 208.93.00001111" /* * International Mobile Subscriber Identity * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 */ - #warning "IMSI 208.93.0100001110" +#warning "IMSI 208.93.0100001111" usim_data.imsi.length = 8; usim_data.imsi.u.num.parity = ODD_PARITY; // Parity: even usim_data.imsi.u.num.digit1 = 2; // MCC digit 1 diff --git a/openair3/NAS/UE/API/USIM/usim_api.c b/openair3/NAS/UE/API/USIM/usim_api.c index 807ee46724..b0ccbf9504 100644 --- a/openair3/NAS/UE/API/USIM/usim_api.c +++ b/openair3/NAS/UE/API/USIM/usim_api.c @@ -49,7 +49,7 @@ Description Implements the API used by the NAS layer to read/write #include "usim_api.h" #include "nas_log.h" #include "memory.h" - +#include #include "aka_functions.h" #include // memcpy, memset #include // malloc, free diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index 48c24a0c04..cf1d2e576f 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -233,7 +233,7 @@ int trx_brf_reset_stats(openair0_device* device) { * \param card the hardware to use * \returns 0 in success */ -int trx_brf_stop(int card) { +int trx_brf_stop(openair0_device* device) { return(0); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 96645f886a..390c2ac13f 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -108,6 +108,7 @@ unsigned short config_frames[4] = {2,9,11,13}; # include "s1ap_eNB.h" #ifdef PDCP_USE_NETLINK # include "SIMULATION/ETH_TRANSPORT/proto.h" +extern int netlink_init(void); #endif # endif #endif @@ -1364,7 +1365,7 @@ void init_openair0() { int main( int argc, char **argv ) { - int i,aa,card=0; + int i,aa; #if defined (XFORMS) void *status; #endif diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 649e1f009b..1c338c3df0 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -187,6 +187,9 @@ void init_UE(int nb_inst) { UE = PHY_vars_UE_g[inst][0]; ret = openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]); + if (ret !=0){ + exit_fun("Error loading device library"); + } UE->rfdevice.host_type = BBU_HOST; // UE->rfdevice.type = NONE_DEV; error_code = pthread_create(&UE->proc.pthread_ue, &UE->proc.attr_ue, UE_thread, NULL); @@ -1062,7 +1065,11 @@ void *UE_thread(void *arg) { UE->frame_parms.samples_per_tti, UE->frame_parms.nb_antennas_tx, 1); - + if (txs != UE->frame_parms.samples_per_tti) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti); + exit_fun( "problem transmitting samples" ); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); } @@ -1088,7 +1095,10 @@ void *UE_thread(void *arg) { UE->frame_parms.samples_per_tti - rx_off_diff, UE->frame_parms.nb_antennas_tx, 1); - + if (txs != UE->frame_parms.samples_per_tti - rx_off_diff) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti-rx_off_diff); + exit_fun( "problem transmitting samples" ); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); // read in first symbol of next frame and adjust for timing drift @@ -1170,6 +1180,7 @@ void *UE_thread(void *arg) { } // UE->is_synchronized==1 } // while !oai_exit + return NULL; } // UE_thread /* diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 345af74d18..452518eae8 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -212,6 +212,8 @@ sigh (void *arg); void oai_shutdown (void); +void reset_opp_meas_oaisim (void); + void help (void) { @@ -444,9 +446,6 @@ static Data_Flow_Unit omv_data; #endif //ALU static module_id_t UE_inst = 0; static module_id_t eNB_inst = 0; -#ifdef Rel10 -static module_id_t RN_id = 0; -#endif Packet_OTG_List_t *otg_pdcp_buffer; @@ -470,13 +469,8 @@ l2l1_task (void *args_p) // Framing variables int32_t sf; -#ifdef Rel10 - relaying_type_t r_type = no_relay; // no relaying -#endif - char fname[64], vname[64]; - protocol_ctxt_t ctxt; //#ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // at eNB 0, an UL scope for every UE diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index 97820d2886..2b19e30a9b 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1011,8 +1011,6 @@ int eNB_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void * int CC_id = device->CC_id; int subframe; - int ready_for_new_subframe=0; - int subframe_eNB_mask_local; int sample_count=0; *ptimestamp = last_eNB_rx_timestamp[eNB_id][CC_id]; @@ -1064,8 +1062,6 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** int UE_id = device->Mod_id; int CC_id = device->CC_id; int subframe; - int ready_for_new_subframe=0; - int subframe_UE_mask_local; int sample_count=0; int read_size; @@ -1329,8 +1325,6 @@ void init_openair1(void) void init_openair2(void) { #ifdef OPENAIR2 - module_id_t enb_id; - module_id_t UE_id; int CC_id; //#warning "eNB index is hard coded to zero" From 7c6e48d9c449a90932693114a295155bd063165d Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sun, 2 Oct 2016 19:56:43 +0200 Subject: [PATCH 287/340] detect nettle version using cmake --- cmake_targets/CMakeLists.txt | 38 +++++++++++++++++------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index b3c7942fae..db03e98c23 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -186,25 +186,6 @@ set(GIT_BRANCH "UNKNOWN") set(GIT_COMMIT_HASH "UNKNOWN") set(GIT_COMMIT_DATE "UNKNOWN") -#This is to detect nettle version changes between Ubuntu 14.04/16.04 -set ( nettle_cmd "nettle-hash" ) -set ( nettle_arg "-V" ) -execute_process(COMMAND ${nettle_cmd} ${nettle_arg} RESULT_VARIABLE rv OUTPUT_VARIABLE ov ERROR_VARIABLE ev) - -string(REGEX MATCH "[+-]?[0-9]+([.][0-9]+)?" nv ${ov}) - -message("NETTLE_VERSION = ${nv}") - -# we need to remove decimal as floating point arithematic does not work properly with C preprocessor -STRING(REGEX REPLACE "[.]" "" nv ${nv}) - -if ("${nv}" STREQUAL "") - message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" ) -endif() - -set (NETTLE_VERSION "${nv}") -add_definitions("-DNETTLE_VERSION=${NETTLE_VERSION}") - find_package(Git) if(GIT_FOUND) message("git found: ${GIT_EXECUTABLE}") @@ -1550,11 +1531,28 @@ endif() pkg_search_module(NETTLE nettle) if(NOT ${NETTLE_FOUND}) - message("PACKAGE nettle not found: some targets will fail") + message( FATAL_ERROR "PACKAGE nettle not found: some targets will fail. Run build_oai -I again!") else() include_directories(${NETTLE_INCLUDE_DIRS}) endif() +message ("NETTLE VERSION_INSTALLED = ${NETTLE_VERSION}") + +string(REGEX MATCH "[+-]?[0-9]+([.][0-9]+)?" nv ${NETTLE_VERSION}) + +# WE only pass the major and first minor in the define and ignore the rest +#message("NETTLE_VERSION USED = ${nv}") + +# we need to remove decimal as floating point arithematic does not work properly with C preprocessor +STRING(REGEX REPLACE "[.]" "" nv ${nv}) + +if ("${nv}" STREQUAL "") + message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" ) +endif() + +set (NETTLE_VERSION "${nv}") +add_definitions("-DNETTLE_VERSION=${NETTLE_VERSION}") + pkg_search_module(XPM xpm) if(NOT ${XPM_FOUND}) message("PACKAGE xpm not found: some targets will fail") From 43996bbdba0557a76d5d74d045bb103fa1536e85 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sun, 2 Oct 2016 21:17:57 +0200 Subject: [PATCH 288/340] Gitlab CI: minor fixes to test case config file --- cmake_targets/autotests/test_case_list.xml | 63 ++++++++++------------ 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 0fdf9248cf..d22b6737ae 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1170,13 +1170,12 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -1394,11 +1393,10 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -1623,7 +1621,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -1639,7 +1637,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread -E @@ -1852,7 +1850,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -1868,7 +1866,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread -E @@ -2078,11 +2076,10 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -2300,11 +2297,10 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -2531,7 +2527,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -2547,7 +2543,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread -E @@ -2760,7 +2756,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -2776,7 +2772,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread -E @@ -4241,7 +4237,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 32Mbits/s -i 1 -f m -u + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 31Mbits/s -i 1 -f m -u False @@ -4580,7 +4576,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4651,7 +4647,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4723,7 +4719,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4743,7 +4739,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 75 lo -c 192.172.0.2 + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 False @@ -8628,7 +8624,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -8851,7 +8847,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -9075,7 +9071,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -9298,7 +9294,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -9524,7 +9520,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -9540,7 +9536,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread -E @@ -9753,7 +9749,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -9769,7 +9765,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread -E @@ -9907,7 +9903,6 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -9984,7 +9979,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -10000,7 +9995,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread -E @@ -10213,7 +10208,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 @@ -10229,7 +10224,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf --single-thread -E From df633612678f88dbf282dbe58bcce3e850d423e5 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Sun, 2 Oct 2016 23:53:45 +0200 Subject: [PATCH 289/340] Gitlab CI: compile only for first run --- .../autotests/run_exec_lte-softmodem_tests.py | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index f2e5b3d333..227d481cd9 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -894,27 +894,28 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , task_EPC = task_EPC + ' ) > ' + logfile_task_EPC_out + ' 2>&1 ' write_file(logfile_task_EPC, task_EPC, mode="w") - #first we compile all the programs - thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC_compile, False, timeout_thread) - thread_eNB = oaiThread(2, "eNB_thread", eNBMachine, user, password , task_eNB_compile, False, timeout_thread) - thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE_compile, False, timeout_thread) - if RRHMachine != '': - thread_RRH = oaiThread(4, "RRH_thread", RRHMachine, user, password , task_RRH_compile, False, timeout_thread) - threads=[] - threads.append(thread_eNB) - threads.append(thread_UE) - threads.append(thread_EPC) - if RRHMachine != '': - threads.append(thread_RRH) - # Start new Threads - thread_eNB.start() - thread_UE.start() - thread_EPC.start() - if RRHMachine != '': - thread_RRH.start() - #Wait for all the compile threads to complete - for t in threads: - t.join() + #first we compile all the programs but only for run_0 + if run == 0: + thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC_compile, False, timeout_thread) + thread_eNB = oaiThread(2, "eNB_thread", eNBMachine, user, password , task_eNB_compile, False, timeout_thread) + thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE_compile, False, timeout_thread) + if RRHMachine != '': + thread_RRH = oaiThread(4, "RRH_thread", RRHMachine, user, password , task_RRH_compile, False, timeout_thread) + threads=[] + threads.append(thread_eNB) + threads.append(thread_UE) + threads.append(thread_EPC) + if RRHMachine != '': + threads.append(thread_RRH) + # Start new Threads + thread_eNB.start() + thread_UE.start() + thread_EPC.start() + if RRHMachine != '': + thread_RRH.start() + #Wait for all the compile threads to complete + for t in threads: + t.join() #Now we execute all the threads thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC, False, timeout_thread) From 7203a5214a07f4e7677903e5fb0db2abb1f49dcf Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 3 Oct 2016 02:44:47 +0200 Subject: [PATCH 290/340] add hotfix to add usrp ud-host package --- cmake_targets/tools/build_helper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index a12af1c235..5b304f1cd3 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -233,7 +233,7 @@ check_install_usrp_uhd_driver(){ $SUDO add-apt-repository ppa:ettusresearch/uhd -y $SUDO apt-get update $SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev - $SUDO apt-get -y install libuhd-dev libuhd003 + $SUDO apt-get -y install libuhd-dev libuhd003 uhd-host } install_usrp_uhd_driver() { From 27bb59d3af887f9c8c9501203a85badba082ecc1 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 3 Oct 2016 10:38:46 +0200 Subject: [PATCH 291/340] better handling of NETTLE version in CMake --- cmake_targets/CMakeLists.txt | 17 +++++++---------- openair3/TEST/test_aes128_ctr_decrypt.c | 2 +- openair3/TEST/test_aes128_ctr_encrypt.c | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index db03e98c23..e1d5fcb12a 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1538,20 +1538,17 @@ endif() message ("NETTLE VERSION_INSTALLED = ${NETTLE_VERSION}") -string(REGEX MATCH "[+-]?[0-9]+([.][0-9]+)?" nv ${NETTLE_VERSION}) +string(REGEX REPLACE "([0-9]+).*" "\\1" NETTLE_VERSION_MAJOR ${NETTLE_VERSION}) +string(REGEX REPLACE "[0-9]+\\.([0-9]+).*" "\\1" NETTLE_VERSION_MINOR ${NETTLE_VERSION}) +message ("NETTLE_VERSION_MAJOR = ${NETTLE_VERSION_MAJOR}") +message ("NETTLE_VERSION_MINOR = ${NETTLE_VERSION_MINOR}") -# WE only pass the major and first minor in the define and ignore the rest -#message("NETTLE_VERSION USED = ${nv}") - -# we need to remove decimal as floating point arithematic does not work properly with C preprocessor -STRING(REGEX REPLACE "[.]" "" nv ${nv}) - -if ("${nv}" STREQUAL "") +if ("${NETTLE_VERSION_MAJOR}" STREQUAL "" OR "${NETTLE_VERSION_MINOR}" STREQUAL "") message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" ) endif() -set (NETTLE_VERSION "${nv}") -add_definitions("-DNETTLE_VERSION=${NETTLE_VERSION}") +add_definitions("-DNETTLE_VERSION_MAJOR=${NETTLE_VERSION_MAJOR}") +add_definitions("-DNETTLE_VERSION_MINOR=${NETTLE_VERSION_MINOR}") pkg_search_module(XPM xpm) if(NOT ${XPM_FOUND}) diff --git a/openair3/TEST/test_aes128_ctr_decrypt.c b/openair3/TEST/test_aes128_ctr_decrypt.c index 15416c5e4b..4106cb90bb 100644 --- a/openair3/TEST/test_aes128_ctr_decrypt.c +++ b/openair3/TEST/test_aes128_ctr_decrypt.c @@ -48,7 +48,7 @@ void test_uncipher_ctr(const struct nettle_cipher *cipher, const uint8_t *key, uint8_t *data = malloc(length); uint8_t *ctr = malloc(cipher->block_size); -#if NETTLE_VERSION <= 27 +#if NETTLE_VERSION_MAJOR < 3 cipher->set_encrypt_key(ctx, key_length, key); #else cipher->set_encrypt_key(ctx, key); diff --git a/openair3/TEST/test_aes128_ctr_encrypt.c b/openair3/TEST/test_aes128_ctr_encrypt.c index dab80b3602..399200aab4 100644 --- a/openair3/TEST/test_aes128_ctr_encrypt.c +++ b/openair3/TEST/test_aes128_ctr_encrypt.c @@ -47,7 +47,7 @@ static void test_cipher_ctr(const struct nettle_cipher *cipher, const uint8_t *k uint8_t *data = malloc(length); uint8_t *ctr = malloc(cipher->block_size); -#if NETTLE_VERSION <= 27 +#if NETTLE_VERSION_MAJOR < 3 cipher->set_encrypt_key(ctx, key_length, key); #else cipher->set_encrypt_key(ctx, key); From 494e0dc2769c038b338094ed0b1d6dbcd892202e Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 3 Oct 2016 10:41:29 +0200 Subject: [PATCH 292/340] bugfix: forgot to reprocess files in the previous commit --- openair2/UTIL/OSA/osa_stream_eea.c | 2 +- openair3/SECU/nas_stream_eea2.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openair2/UTIL/OSA/osa_stream_eea.c b/openair2/UTIL/OSA/osa_stream_eea.c index 08e0d44441..17020bf7de 100644 --- a/openair2/UTIL/OSA/osa_stream_eea.c +++ b/openair2/UTIL/OSA/osa_stream_eea.c @@ -199,7 +199,7 @@ int stream_encrypt_eea2(stream_cipher_t *stream_cipher, uint8_t **out) } #endif -#if NETTLE_VERSION <= 27 +#if NETTLE_VERSION_MAJOR < 3 nettle_aes128.set_encrypt_key(ctx, stream_cipher->key_length, stream_cipher->key); #else diff --git a/openair3/SECU/nas_stream_eea2.c b/openair3/SECU/nas_stream_eea2.c index df3a1ed82c..14ab5c3b73 100644 --- a/openair3/SECU/nas_stream_eea2.c +++ b/openair3/SECU/nas_stream_eea2.c @@ -85,7 +85,7 @@ int nas_stream_encrypt_eea2(nas_stream_cipher_t *stream_cipher, uint8_t *out) } #endif -#if NETTLE_VERSION <= 27 +#if NETTLE_VERSION_MAJOR < 3 nettle_aes128.set_encrypt_key(ctx, stream_cipher->key_length, stream_cipher->key); #else From 68090c8b36d9b6dc5299c5b80112810d40d95500 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 3 Oct 2016 11:14:40 +0200 Subject: [PATCH 293/340] bugfix: get_tx_amp called with wrong parameter --- openair1/SCHED/phy_procedures_lte_ue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index bfd53fba86..eea5f89b6f 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1049,7 +1049,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB ue->tx_total_RE[subframe_tx] = nb_rb*12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(ue->tx_power_dBm, + tx_amp = get_tx_amp(ue->tx_power_dBm[subframe_tx], ue->tx_power_max_dBm, ue->frame_parms.N_RB_UL, nb_rb); From 677fdb60b2fb1f221cdf28862544e2ad8f8e92f0 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 3 Oct 2016 11:15:22 +0200 Subject: [PATCH 294/340] remove warning: function s1ap_eNB_e_rab_setup_resp was not declared in header file --- openair3/S1AP/s1ap_eNB_nas_procedures.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.h b/openair3/S1AP/s1ap_eNB_nas_procedures.h index 552726e8ed..6e69d51bd8 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.h +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.h @@ -49,5 +49,7 @@ int s1ap_eNB_initial_ctxt_resp( int s1ap_eNB_ue_capabilities(instance_t instance, s1ap_ue_cap_info_ind_t *ue_cap_info_ind_p); +int s1ap_eNB_e_rab_setup_resp(instance_t instance, + s1ap_e_rab_setup_resp_t *e_rab_setup_resp_p); #endif /* S1AP_ENB_NAS_PROCEDURES_H_ */ From e196210a51b835fd43a8a05d6d8eee09ddd31aa5 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 3 Oct 2016 11:17:34 +0200 Subject: [PATCH 295/340] remove warning: rrc_ue_generate_MeasurementReport had const qualifier rrc_ue_generate_MeasurementReport calls pdcp_data_req which changes the content of ctxt_pP. I'm not sure of the logic at play here, so maybe removing 'const' is not the right solution and there is a real bug... --- openair2/RRC/LITE/proto.h | 2 +- openair2/RRC/LITE/rrc_UE.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 369105bb2b..a2f8667752 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -384,7 +384,7 @@ ue_meas_filtering( void ue_measurement_report_triggering( - const protocol_ctxt_t* const ctxt_pP, + protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index ); diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 8ea604f932..e77fc44af8 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -131,7 +131,7 @@ static void rrc_ue_generate_RRCConnectionSetupComplete( const protocol_ctxt_t* c */ static void rrc_ue_generate_RRCConnectionReconfigurationComplete( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t Transaction_id ); -static void rrc_ue_generate_MeasurementReport( const protocol_ctxt_t* const ctxt_pP, uint8_t eNB_index ); +static void rrc_ue_generate_MeasurementReport(protocol_ctxt_t* const ctxt_pP, uint8_t eNB_index ); static uint8_t check_trigger_meas_event( uint8_t module_idP, @@ -3562,7 +3562,7 @@ void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ //Below routine implements Measurement Reporting procedure from 36.331 Section 5.5.5 //----------------------------------------------------------------------------- -static void rrc_ue_generate_MeasurementReport( const protocol_ctxt_t* const ctxt_pP, uint8_t eNB_index ) +static void rrc_ue_generate_MeasurementReport(protocol_ctxt_t* const ctxt_pP, uint8_t eNB_index ) { uint8_t buffer[32], size; @@ -3643,7 +3643,7 @@ static void rrc_ue_generate_MeasurementReport( const protocol_ctxt_t* const ctxt // Measurement report triggering, described in 36.331 Section 5.5.4.1: called periodically //----------------------------------------------------------------------------- -void ue_measurement_report_triggering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index ) +void ue_measurement_report_triggering(protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index ) { uint8_t i,j; Hysteresis_t hys; From 13496a4c6b0151af17cb191d0cdc4b1734de12d6 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 3 Oct 2016 12:59:00 +0200 Subject: [PATCH 296/340] minor fix to add some log message in oarf compilation fir EXMIMO drivers --- cmake_targets/build_oai | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index f637254e18..65f1548058 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -561,6 +561,7 @@ function main() { compilations \ $lte_build_dir updatefw \ updatefw $dbin/updatefw + echo_info "Compiling oarf tools. The logfile for compilation is here: $dlog/oarf.txt" make -C $OPENAIR_DIR/cmake_targets/$lte_build_dir/build oarf > $dlog/oarf.txt 2>&1 cp $OPENAIR_DIR/cmake_targets/$lte_build_dir/build/*.oct $dbin if [ -s $dbin/oarf_config_exmimo.oct ] ; then From 8f5112b0cb73dc82b70e78e37fb3aa65da29419f Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Mon, 3 Oct 2016 20:10:17 +0200 Subject: [PATCH 297/340] Gitlab CI: minor fix to test case config file --- cmake_targets/autotests/test_case_list.xml | 56 +++++++++++----------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 8235963c52..aba5b67948 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1276,7 +1276,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -u + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1348,7 +1348,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -u + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -1424,7 +1424,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec @@ -1730,7 +1730,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -1806,7 +1806,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -1883,7 +1883,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -2182,7 +2182,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -2254,7 +2254,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -2330,7 +2330,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -2638,7 +2638,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -2714,7 +2714,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -2791,7 +2791,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -4150,7 +4150,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4221,7 +4221,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4293,7 +4293,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4313,7 +4313,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s False @@ -4580,7 +4580,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4651,7 +4651,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4723,7 +4723,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5018,7 +5018,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5091,7 +5091,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5165,7 +5165,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5460,7 +5460,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5533,7 +5533,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5607,7 +5607,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6387,7 +6387,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6458,7 +6458,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6529,7 +6529,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue From e395164a4c75b5ea8f870d3731fee85949963b0b Mon Sep 17 00:00:00 2001 From: Tien-Thinh Nguyen Date: Tue, 4 Oct 2016 17:02:50 +0200 Subject: [PATCH 298/340] fix issues to work with multiple carriers (conga-ercom) --- openair1/PHY/LTE_TRANSPORT/if5_tools.c | 10 +- openair1/PHY/defs.h | 2 + openair2/ENB_APP/enb_config.c | 6 +- openair2/ENB_APP/enb_config.h | 1 + .../CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf | 294 ++++++++++++++++++ targets/RT/USER/lte-enb.c | 83 +++-- targets/RT/USER/lte-softmodem.c | 10 +- 7 files changed, 373 insertions(+), 33 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c index 8f5b7b32fe..3d3651ab59 100644 --- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -105,8 +105,8 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe __m128i t0, t1; tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); - IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); - data_block_head = (__m128i *)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4); + IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block_head = (__m128i *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 4); header->flags = 0; header->fifo_status = 0; @@ -117,11 +117,11 @@ void send_IF5(PHY_VARS_eNB *eNB, openair0_timestamp proc_timestamp, int subframe txp[0] = (void*)&eNB->common_vars.txdata[0][0][subframe*eNB->frame_parms.samples_per_tti]; txp128 = (__m128i *) txp[0]; - for (packet_id=0; packet_id<(fp->samples_per_tti*2)/db_fulllength; packet_id++) { - header->time_stamp = proc_timestamp + packet_id*db_fulllength; + for (packet_id=0; packet_idsamples_per_tti/db_fulllength; packet_id++) { + header->time_stamp = (uint32_t)(proc_timestamp + packet_id*db_fulllength); data_block = data_block_head; - for (i=0; i>3; i+=2) { + for (i=0; i>2; i+=2) { t0 = _mm_srai_epi16(*txp128++, 4); t1 = _mm_srai_epi16(*txp128++, 4); diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 0808bdc5ba..3532fa3c6f 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -234,6 +234,8 @@ typedef struct eNB_proc_t_s { int thread_index; /// timestamp received from HW openair0_timestamp timestamp_rx; + /// timestamp to send to "slave rru" + openair0_timestamp timestamp_tx; /// subframe to act upon for reception int subframe_rx; /// subframe to act upon for PRACH diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index def056ee3f..d4c6a81c4f 100755 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -318,7 +318,7 @@ void enb_config_display(void) for (j=0; j< enb_properties.properties[i]->nb_rrh_gw; j++) { if (enb_properties.properties[i]->rrh_gw_config[j].active == 1 ){ printf( "\n\tRRH GW %d config for eNB %u:\n\n", j, i); - printf( "\tinterface name : \t%s:\n",enb_properties.properties[i]->rrh_gw_if_name); + printf( "\tinterface name : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].rrh_gw_if_name); printf( "\tlocal address : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].local_address); printf( "\tlocal port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].local_port); printf( "\tremote address : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_address); @@ -2344,7 +2344,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) enb_properties.properties[enb_properties_index]->nb_rrh_gw += 1; - enb_properties.properties[enb_properties_index]->rrh_gw_if_name = strdup(if_name); + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rrh_gw_if_name = strdup(if_name); enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_address = strdup(ipv4); enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_address = strdup(ipv4_remote); enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port = local_port; @@ -2393,7 +2393,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) } } else { enb_properties.properties[enb_properties_index]->nb_rrh_gw = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_if_name = "none"; + enb_properties.properties[enb_properties_index]->rrh_gw_config[j].rrh_gw_if_name = "none"; enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_address = "0.0.0.0"; enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_address = "0.0.0.0"; enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port= 0; diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 8d220c3d7b..397209d9ef 100755 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -83,6 +83,7 @@ typedef struct rrh_gw_config_s { unsigned udp:1; unsigned raw:1; unsigned active:1; + char *rrh_gw_if_name; char *local_address; char *remote_address; uint16_t local_port; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf new file mode 100644 index 0000000000..9ce8fac59f --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.if4p5-ercom.conf @@ -0,0 +1,294 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + //First carrier -> Master + { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + }, + // second carrier-> for ERCOM + { + node_function = "eNodeB_3GPP_BBU" # should be verified + //node_function = "NGFI_RCC_IF5" # should be verified + node_timing = "synch_to_other"; + node_synch_ref = 0; #should + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + + rrh_gw_config = ( + { + local_if_name = "eth2"; + remote_address = "00:13:95:1f:a0:af"; #Conga's MAC + local_address = "90:e2:ba:c5:fc:04"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + }, + //second config for Ercom + { + local_if_name = "eth1.300"; + remote_address = "00:21:5e:91:5c:7e"; # should be updated with ERCOM's MAC + local_address = "f0:1f:af:db:b9:c8"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if5_mobipass"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); + + diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 7d68f0c172..51937b7976 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -145,6 +145,8 @@ time_stats_t softmodem_stats_rx_sf; // total rx time int32_t **rxdata; int32_t **txdata; +uint8_t seqno; //sequence number + static int time_offset[4] = {0,0,0,0}; /* mutex, cond and variable to serialize phy proc TX calls @@ -288,6 +290,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { ((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7); int len,len2; int16_t *txdata; +// int CC_id = phy_vars_eNB->proc.CC_id; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); @@ -406,11 +409,15 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { } void tx_fh_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { - uint8_t seqno; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, proc->timestamp_tx&0xffffffff ); send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL); } +void tx_fh_if5_mobipass(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, proc->timestamp_tx&0xffffffff ); + send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_MOBIPASS); +} + void tx_fh_if4p5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { send_IF4p5(eNB,proc->frame_tx, proc->subframe_tx, IF4p5_PDLFFT, 0); } @@ -552,7 +559,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam // run PHY TX procedures the one after the other for all CCs to avoid race conditions // (may be relaxed in the future for performance reasons) // ***************************************** - if (wait_CCs(proc)<0) return(-1); + //if (wait_CCs(proc)<0) return(-1); if (oai_exit) return(-1); @@ -879,6 +886,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) { proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + proc->timestamp_tx = proc->timestamp_rx+(4*fp->samples_per_tti); // printf("trx_read <- USRP TS %llu (sf %d, first_rx %d)\n", proc->timestamp_rx,proc->subframe_rx,proc->first_rx); if (proc->first_rx == 0) { @@ -965,7 +973,12 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) { } } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); - + + //caculate timestamp_rx, timestamp_tx based on frame and subframe + proc->timestamp_rx = ((proc->frame_rx * 10) + proc->subframe_rx ) * fp->samples_per_tti ; + proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + + if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,*subframe); @@ -1073,7 +1086,8 @@ void wakeup_slaves(eNB_proc_t *proc) { slave_proc->frame_rx = proc->frame_rx; slave_proc->subframe_rx = proc->subframe_rx; slave_proc->timestamp_rx = proc->timestamp_rx; - + slave_proc->timestamp_tx = proc->timestamp_tx; + pthread_mutex_unlock( &slave_proc->mutex_FH ); if (cnt_slave == 0) { @@ -1270,15 +1284,16 @@ static void* eNB_thread_single( void* param ) { T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10; + proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1)&1023; + proc_rxtx->timestamp_tx = proc->timestamp_tx; // At this point, all information for subframe has been received on FH interface // If this proc is to provide synchronization, do so wakeup_slaves(proc); - proc_rxtx->subframe_rx = proc->subframe_rx; - proc_rxtx->frame_rx = proc->frame_rx; - proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10; - proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1)&1023; if (rxtx(eNB,proc_rxtx,"eNB_thread_single") < 0) break; } @@ -1384,6 +1399,26 @@ void init_eNB_proc(int inst) { } } + PHY_vars_eNB_g[inst][0]->proc.num_slaves=1;//hardcoded + PHY_vars_eNB_g[inst][0]->proc.slave_proc = (eNB_proc_t**)malloc(1*sizeof(eNB_proc_t*)); + PHY_vars_eNB_g[inst][0]->proc.slave_proc[0]=&(PHY_vars_eNB_g[inst][1]->proc); +/* for (CC_id=0; CC_idnode_timing == synch_to_ext_device) { //CC_id=0 + // eNB = PHY_vars_eNB_g[inst][CC_id]; + + eNB->proc.num_slaves = MAX_NUM_CCs-1; + eNB->proc.slave_proc = (eNB_proc_t**)malloc(eNB->proc.num_slaves*sizeof(eNB_proc_t*)); + + for (i=0; i< eNB->proc.num_slaves; i++) { + eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i+1]->proc); + } + } + } + +*/ + /* setup PHY proc TX sync mechanism */ pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL); @@ -1598,14 +1633,14 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->start_rf = start_rf; eNB->start_if = start_if; eNB->fh_asynch = fh_if5_asynch_DL; - ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); + ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[CC_id]); if (ret<0) { printf("Exiting, cannot initialize rf device\n"); exit(-1); } eNB->rfdevice.host_type = RRH_HOST; eNB->ifdevice.host_type = RRH_HOST; - ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[CC_id], (eth_params+CC_id)); printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); if (ret<0) { printf("Exiting, cannot initialize transport protocol\n"); @@ -1624,14 +1659,14 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->fh_asynch = fh_if4p5_asynch_DL; eNB->start_rf = start_rf; eNB->start_if = start_if; - ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); + ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[CC_id]); if (ret<0) { printf("Exiting, cannot initialize rf device\n"); exit(-1); } eNB->rfdevice.host_type = RRH_HOST; eNB->ifdevice.host_type = RRH_HOST; - ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[CC_id], (eth_params+CC_id)); printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); if (ret<0) { printf("Exiting, cannot initialize transport protocol\n"); @@ -1653,7 +1688,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->start_rf = start_rf; eNB->start_if = NULL; eNB->fh_asynch = NULL; - ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[0]); + ret = openair0_device_load(&eNB->rfdevice, &openair0_cfg[CC_id]); if (ret<0) { printf("Exiting, cannot initialize rf device\n"); exit(-1); @@ -1668,9 +1703,17 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; eNB->proc_tx = proc_tx_full; - eNB->tx_fh = tx_fh_if5; - eNB->rx_fh = rx_fh_if5; - eNB->fh_asynch = (eNB->node_timing == synch_to_other) ? fh_if5_asynch_UL : NULL; + if (eNB->node_timing == synch_to_other) { + eNB->tx_fh = tx_fh_if5_mobipass; + eNB->rx_fh = rx_fh_slave; + eNB->fh_asynch = fh_if5_asynch_UL; + + } + else { + eNB->tx_fh = tx_fh_if5; + eNB->rx_fh = rx_fh_if5; + eNB->fh_asynch = NULL; + } eNB->start_rf = NULL; eNB->start_if = start_if; @@ -1678,7 +1721,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->ifdevice.host_type = BBU_HOST; - ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[CC_id], (eth_params+CC_id)); printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); if (ret<0) { printf("Exiting, cannot initialize transport protocol\n"); @@ -1699,7 +1742,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->fh_asynch = (eNB->node_timing == synch_to_other) ? fh_if4p5_asynch_UL : NULL; eNB->rfdevice.host_type = BBU_HOST; eNB->ifdevice.host_type = BBU_HOST; - ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[CC_id], (eth_params+CC_id)); printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); if (ret<0) { printf("Exiting, cannot initialize transport protocol\n"); @@ -1724,7 +1767,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst eNB->rfdevice.host_type = BBU_HOST; eNB->ifdevice.host_type = BBU_HOST; - ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[0], (eth_params+CC_id)); + ret = openair0_transport_load(&eNB->ifdevice, &openair0_cfg[CC_id], (eth_params+CC_id)); printf("openair0_transport_init returns %d for CC_id %d\n",ret,CC_id); if (ret<0) { printf("Exiting, cannot initialize transport protocol\n"); @@ -1736,7 +1779,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst } } - if (setup_eNB_buffers(PHY_vars_eNB_g[inst],&openair0_cfg[inst])!=0) { + if (setup_eNB_buffers(PHY_vars_eNB_g[inst],&openair0_cfg[CC_id])!=0) { printf("Exiting, cannot initialize eNodeB Buffers\n"); exit(-1); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 390c2ac13f..d2ba49dcac 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1066,7 +1066,7 @@ static void get_options (int argc, char **argv) if (enb_properties->properties[i]->rrh_gw_config[j].active == 1 ) { local_remote_radio = BBU_REMOTE_RADIO_HEAD; - (eth_params+j)->local_if_name = enb_properties->properties[i]->rrh_gw_if_name; + (eth_params+j)->local_if_name = enb_properties->properties[i]->rrh_gw_config[j].rrh_gw_if_name; (eth_params+j)->my_addr = enb_properties->properties[i]->rrh_gw_config[j].local_address; (eth_params+j)->my_port = enb_properties->properties[i]->rrh_gw_config[j].local_port; (eth_params+j)->remote_addr = enb_properties->properties[i]->rrh_gw_config[j].remote_address; @@ -1306,10 +1306,10 @@ void init_openair0() { if (local_remote_radio == BBU_REMOTE_RADIO_HEAD) { - openair0_cfg[card].remote_addr = eth_params->remote_addr; - openair0_cfg[card].remote_port = eth_params->remote_port; - openair0_cfg[card].my_addr = eth_params->my_addr; - openair0_cfg[card].my_port = eth_params->my_port; + openair0_cfg[card].remote_addr = (eth_params+card)->remote_addr; + openair0_cfg[card].remote_port = (eth_params+card)->remote_port; + openair0_cfg[card].my_addr = (eth_params+card)->my_addr; + openair0_cfg[card].my_port = (eth_params+card)->my_port; } printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, From b8d2455320f019e2ceb46329942359ccb6969377 Mon Sep 17 00:00:00 2001 From: Tien-Thinh Nguyen Date: Tue, 4 Oct 2016 17:59:07 +0200 Subject: [PATCH 299/340] fix issues to work with multiple carriers (conga-ercom) --- targets/RT/USER/lte-enb.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 51937b7976..7551145710 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1398,10 +1398,12 @@ void init_eNB_proc(int inst) { pthread_setname_np( proc->pthread_single, name ); } } - - PHY_vars_eNB_g[inst][0]->proc.num_slaves=1;//hardcoded - PHY_vars_eNB_g[inst][0]->proc.slave_proc = (eNB_proc_t**)malloc(1*sizeof(eNB_proc_t*)); - PHY_vars_eNB_g[inst][0]->proc.slave_proc[0]=&(PHY_vars_eNB_g[inst][1]->proc); + + if (MAX_NUM_CCs >1){ + PHY_vars_eNB_g[inst][0]->proc.num_slaves=1;//hardcoded + PHY_vars_eNB_g[inst][0]->proc.slave_proc = (eNB_proc_t**)malloc(1*sizeof(eNB_proc_t*)); + PHY_vars_eNB_g[inst][0]->proc.slave_proc[0]=&(PHY_vars_eNB_g[inst][1]->proc); +} /* for (CC_id=0; CC_id Date: Tue, 4 Oct 2016 18:36:34 +0200 Subject: [PATCH 300/340] Gitlab CI: Enable 20 MHz test case --- cmake_targets/autotests/test_case_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index eb37763409..77e3e03bd5 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -11,7 +11,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010301 010303 010304 010305 0104+ 015518 015519 015520 015521 015522 015523 015602 015605 015702 015705 015818 015819 015820 015821 015822 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025518 025519 025520 025521 025522 025523 + 010141 0102+ 010301 010303 010304 010305 0104+ 015518 015519 015520 015521 015522 015523 015602 015605 015702 015705 015818 015819 015820 015821 015822 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025518 025519 025520 025521 025522 025523 3 mozart hutch starsky stevens amerique calisson From e86ec1179ad1b3447dc407eb386a9a85f20e33fe Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 4 Oct 2016 18:59:54 +0200 Subject: [PATCH 301/340] Gitlab CI: Remove 20 MHZ TM2 test cases for USRP B210 --- cmake_targets/autotests/test_case_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 77e3e03bd5..348d8c74ad 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -11,7 +11,7 @@ sudo -S -E /opt/ltebox/tools/stop_ltebox exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010301 010303 010304 010305 0104+ 015518 015519 015520 015521 015522 015523 015602 015605 015702 015705 015818 015819 015820 015821 015822 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025518 025519 025520 025521 025522 025523 + 010141 0102+ 010301 010303 010304 010305 0104+ 015508 015511 015520 015523 015518 015519 015520 015521 015522 015523 015602 015605 015702 015705 015818 015819 015820 015821 015822 015823 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025514 025517 025520 025523 025518 025519 025520 025521 025522 025523 3 mozart hutch starsky stevens amerique calisson From 461e2430d1e89d545b3c75e0792d47d2223d9cc7 Mon Sep 17 00:00:00 2001 From: Tien-Thinh Nguyen Date: Thu, 6 Oct 2016 14:40:30 +0200 Subject: [PATCH 302/340] fix the issues related to sending ULlULL... to RRU --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 2 +- ....band7.tm1.if4p5.50PRB.usrpb210-conga.conf | 192 ++++++++++++++++++ targets/RT/USER/lte-enb.c | 16 +- 3 files changed, 198 insertions(+), 12 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210-conga.conf diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 1a23015cbb..1cbabf5dcc 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -632,7 +632,7 @@ extern "C" { } else { printf("Found USRP B200"); - args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096" ; + args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=15360, recv_frame_size=15360" ; s->usrp = uhd::usrp::multi_usrp::make(args); // s->usrp->set_rx_subdev_spec(rx_subdev); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210-conga.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210-conga.conf new file mode 100644 index 0000000000..7f490f0ad3 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210-conga.conf @@ -0,0 +1,192 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports =1 ; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.155"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.155/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.155/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth0"; + remote_address = "90:e2:ba:c5:fc:04"; + local_address = "00:13:95:1f:a0:af"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "raw_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 7551145710..fd5d38f696 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -1399,27 +1399,21 @@ void init_eNB_proc(int inst) { } } - if (MAX_NUM_CCs >1){ - PHY_vars_eNB_g[inst][0]->proc.num_slaves=1;//hardcoded - PHY_vars_eNB_g[inst][0]->proc.slave_proc = (eNB_proc_t**)malloc(1*sizeof(eNB_proc_t*)); - PHY_vars_eNB_g[inst][0]->proc.slave_proc[0]=&(PHY_vars_eNB_g[inst][1]->proc); -} -/* for (CC_id=0; CC_idnode_timing == synch_to_ext_device) { //CC_id=0 - // eNB = PHY_vars_eNB_g[inst][CC_id]; - + if (eNB->node_timing == synch_to_ext_device) { //master eNB->proc.num_slaves = MAX_NUM_CCs-1; eNB->proc.slave_proc = (eNB_proc_t**)malloc(eNB->proc.num_slaves*sizeof(eNB_proc_t*)); for (i=0; i< eNB->proc.num_slaves; i++) { - eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i+1]->proc); + if (i < CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i]->proc); + if (i >= CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i+1]->proc); } } } -*/ /* setup PHY proc TX sync mechanism */ pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); From 4787c975ec6e138a75b9d4b2c071bfb3d3402134 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Fri, 7 Oct 2016 18:19:43 +0200 Subject: [PATCH 303/340] delete files with GPL License + modify build scripts --- cmake_targets/CMakeLists.txt | 3 +- common/utils/T/tracer/packet-mac-lte.h | 14 - openair2/DOCS/TEMPLATES/README/Readme.doxy | 1 - .../foreign/sockets-2.3.9.4/Ajp13Socket.cpp | 414 -- .../src/foreign/sockets-2.3.9.4/Ajp13Socket.h | 81 - .../foreign/sockets-2.3.9.4/AjpBaseSocket.cpp | 268 - .../foreign/sockets-2.3.9.4/AjpBaseSocket.h | 96 - .../src/foreign/sockets-2.3.9.4/Base64.cpp | 314 - .../src/foreign/sockets-2.3.9.4/Base64.h | 85 - .../src/foreign/sockets-2.3.9.4/Changelog | 855 --- .../src/foreign/sockets-2.3.9.4/Debug.cpp | 103 - .../src/foreign/sockets-2.3.9.4/Debug.h | 87 - .../src/foreign/sockets-2.3.9.4/Event.cpp | 93 - .../src/foreign/sockets-2.3.9.4/Event.h | 83 - .../foreign/sockets-2.3.9.4/EventHandler.cpp | 209 - .../foreign/sockets-2.3.9.4/EventHandler.h | 88 - .../src/foreign/sockets-2.3.9.4/EventTime.cpp | 107 - .../src/foreign/sockets-2.3.9.4/EventTime.h | 84 - .../src/foreign/sockets-2.3.9.4/Exception.cpp | 66 - .../src/foreign/sockets-2.3.9.4/Exception.h | 74 - .../src/foreign/sockets-2.3.9.4/File.cpp | 203 - .../src/foreign/sockets-2.3.9.4/File.h | 95 - .../foreign/sockets-2.3.9.4/FileStream.cpp | 60 - .../src/foreign/sockets-2.3.9.4/FileStream.h | 62 - .../foreign/sockets-2.3.9.4/HTTPSocket.cpp | 519 -- .../src/foreign/sockets-2.3.9.4/HTTPSocket.h | 175 - .../sockets-2.3.9.4/HttpBaseSocket.cpp | 215 - .../foreign/sockets-2.3.9.4/HttpBaseSocket.h | 90 - .../sockets-2.3.9.4/HttpClientSocket.cpp | 312 - .../sockets-2.3.9.4/HttpClientSocket.h | 139 - .../sockets-2.3.9.4/HttpDebugSocket.cpp | 144 - .../foreign/sockets-2.3.9.4/HttpDebugSocket.h | 76 - .../foreign/sockets-2.3.9.4/HttpGetSocket.cpp | 114 - .../foreign/sockets-2.3.9.4/HttpGetSocket.h | 71 - .../sockets-2.3.9.4/HttpPostSocket.cpp | 295 - .../foreign/sockets-2.3.9.4/HttpPostSocket.h | 101 - .../foreign/sockets-2.3.9.4/HttpPutSocket.cpp | 125 - .../foreign/sockets-2.3.9.4/HttpPutSocket.h | 88 - .../foreign/sockets-2.3.9.4/HttpRequest.cpp | 428 -- .../src/foreign/sockets-2.3.9.4/HttpRequest.h | 145 - .../foreign/sockets-2.3.9.4/HttpResponse.cpp | 251 - .../foreign/sockets-2.3.9.4/HttpResponse.h | 99 - .../sockets-2.3.9.4/HttpTransaction.cpp | 262 - .../foreign/sockets-2.3.9.4/HttpTransaction.h | 106 - .../foreign/sockets-2.3.9.4/HttpdCookies.cpp | 287 - .../foreign/sockets-2.3.9.4/HttpdCookies.h | 94 - .../src/foreign/sockets-2.3.9.4/HttpdForm.cpp | 717 -- .../src/foreign/sockets-2.3.9.4/HttpdForm.h | 147 - .../foreign/sockets-2.3.9.4/HttpdSocket.cpp | 326 - .../src/foreign/sockets-2.3.9.4/HttpdSocket.h | 117 - .../src/foreign/sockets-2.3.9.4/IBase.h | 45 - .../foreign/sockets-2.3.9.4/IEventHandler.h | 78 - .../foreign/sockets-2.3.9.4/IEventOwner.cpp | 81 - .../src/foreign/sockets-2.3.9.4/IEventOwner.h | 82 - .../src/foreign/sockets-2.3.9.4/IFile.h | 75 - .../src/foreign/sockets-2.3.9.4/IFileUpload.h | 61 - .../src/foreign/sockets-2.3.9.4/IHttpServer.h | 69 - .../src/foreign/sockets-2.3.9.4/IMutex.h | 58 - .../foreign/sockets-2.3.9.4/ISocketHandler.h | 262 - .../src/foreign/sockets-2.3.9.4/IStream.h | 61 - .../foreign/sockets-2.3.9.4/Ipv4Address.cpp | 223 - .../src/foreign/sockets-2.3.9.4/Ipv4Address.h | 111 - .../foreign/sockets-2.3.9.4/Ipv6Address.cpp | 286 - .../src/foreign/sockets-2.3.9.4/Ipv6Address.h | 120 - .../src/foreign/sockets-2.3.9.4/Json.cpp | 572 -- .../src/foreign/sockets-2.3.9.4/Json.h | 102 - .../foreign/sockets-2.3.9.4/ListenSocket.h | 511 -- .../src/foreign/sockets-2.3.9.4/Lock.cpp | 57 - .../src/foreign/sockets-2.3.9.4/Lock.h | 62 - .../src/foreign/sockets-2.3.9.4/Makefile.am | 44 - .../src/foreign/sockets-2.3.9.4/MemFile.cpp | 349 - .../src/foreign/sockets-2.3.9.4/MemFile.h | 118 - .../src/foreign/sockets-2.3.9.4/Mutex.cpp | 83 - .../src/foreign/sockets-2.3.9.4/Mutex.h | 73 - .../src/foreign/sockets-2.3.9.4/OSX.zip | Bin 16669 -> 0 bytes .../src/foreign/sockets-2.3.9.4/Parse.cpp | 323 - .../src/foreign/sockets-2.3.9.4/Parse.h | 108 - .../src/foreign/sockets-2.3.9.4/README | 90 - .../src/foreign/sockets-2.3.9.4/README.macosx | 9 - .../foreign/sockets-2.3.9.4/ResolvServer.cpp | 99 - .../foreign/sockets-2.3.9.4/ResolvServer.h | 78 - .../foreign/sockets-2.3.9.4/ResolvSocket.cpp | 442 -- .../foreign/sockets-2.3.9.4/ResolvSocket.h | 120 - .../sockets-2.3.9.4/SSLInitializer.cpp | 181 - .../foreign/sockets-2.3.9.4/SSLInitializer.h | 97 - .../foreign/sockets-2.3.9.4/SctpSocket.cpp | 506 -- .../src/foreign/sockets-2.3.9.4/SctpSocket.h | 122 - .../src/foreign/sockets-2.3.9.4/Semaphore.cpp | 123 - .../src/foreign/sockets-2.3.9.4/Semaphore.h | 100 - .../foreign/sockets-2.3.9.4/SmtpdSocket.cpp | 244 - .../src/foreign/sockets-2.3.9.4/SmtpdSocket.h | 171 - .../src/foreign/sockets-2.3.9.4/Socket.cpp | 1875 ----- .../src/foreign/sockets-2.3.9.4/Socket.h | 735 -- .../foreign/sockets-2.3.9.4/SocketAddress.h | 106 - .../foreign/sockets-2.3.9.4/SocketHandler.cpp | 1419 ---- .../foreign/sockets-2.3.9.4/SocketHandler.h | 302 - .../sockets-2.3.9.4/SocketHandlerEp.cpp | 216 - .../foreign/sockets-2.3.9.4/SocketHandlerEp.h | 96 - .../sockets-2.3.9.4/SocketHandlerThread.cpp | 81 - .../sockets-2.3.9.4/SocketHandlerThread.h | 68 - .../foreign/sockets-2.3.9.4/SocketStream.cpp | 69 - .../foreign/sockets-2.3.9.4/SocketStream.h | 67 - .../foreign/sockets-2.3.9.4/SocketThread.cpp | 51 - .../foreign/sockets-2.3.9.4/SocketThread.h | 43 - .../foreign/sockets-2.3.9.4/Sockets-config | Bin 10413 -> 0 bytes .../sockets-2.3.9.4/Sockets-config.cpp | 121 - .../src/foreign/sockets-2.3.9.4/StdLog.h | 76 - .../src/foreign/sockets-2.3.9.4/StdoutLog.cpp | 110 - .../src/foreign/sockets-2.3.9.4/StdoutLog.h | 64 - .../foreign/sockets-2.3.9.4/StreamSocket.cpp | 173 - .../foreign/sockets-2.3.9.4/StreamSocket.h | 142 - .../foreign/sockets-2.3.9.4/StreamWriter.cpp | 100 - .../foreign/sockets-2.3.9.4/StreamWriter.h | 70 - .../src/foreign/sockets-2.3.9.4/TcpSocket.cpp | 1851 ----- .../src/foreign/sockets-2.3.9.4/TcpSocket.h | 370 - .../src/foreign/sockets-2.3.9.4/Thread.cpp | 178 - .../src/foreign/sockets-2.3.9.4/Thread.h | 137 - .../src/foreign/sockets-2.3.9.4/UdpSocket.cpp | 922 --- .../src/foreign/sockets-2.3.9.4/UdpSocket.h | 227 - .../src/foreign/sockets-2.3.9.4/Utility.cpp | 1440 ---- .../src/foreign/sockets-2.3.9.4/Utility.h | 276 - .../foreign/sockets-2.3.9.4/XmlDocument.cpp | 102 - .../src/foreign/sockets-2.3.9.4/XmlDocument.h | 85 - .../foreign/sockets-2.3.9.4/XmlException.cpp | 52 - .../foreign/sockets-2.3.9.4/XmlException.h | 69 - .../src/foreign/sockets-2.3.9.4/XmlNode.cpp | 357 - .../src/foreign/sockets-2.3.9.4/XmlNode.h | 160 - .../src/foreign/sockets-2.3.9.4/ajp13.h | 102 - .../src/foreign/sockets-2.3.9.4/gpl.txt | 340 - .../src/foreign/sockets-2.3.9.4/mkdot.sh | 14 - .../sockets-2.3.9.4/pkgconfig/libSockets.pc | 12 - .../pkgconfig/libSockets.pc.IN | 12 - .../sockets-2.3.9.4/pkgconfig/libsockets2.pc | 12 - .../pkgconfig/libsockets2.pc.IN | 12 - .../sockets-2.3.9.4/socket_include.cpp | 93 - .../foreign/sockets-2.3.9.4/socket_include.h | 305 - .../foreign/sockets-2.3.9.4/sockets-config.h | 110 - .../foreign/sockets-2.3.9.4/tests/Makefile | 95 - .../foreign/sockets-2.3.9.4/tests/base64.cpp | 35 - .../foreign/sockets-2.3.9.4/tests/chunked.cpp | 65 - .../foreign/sockets-2.3.9.4/tests/copy.cpp | 264 - .../foreign/sockets-2.3.9.4/tests/crlf.cpp | 139 - .../sockets-2.3.9.4/tests/echoserver.cpp | 238 - .../foreign/sockets-2.3.9.4/tests/events.cpp | 217 - .../foreign/sockets-2.3.9.4/tests/http.cpp | 72 - .../sockets-2.3.9.4/tests/http_post.cpp | 107 - .../foreign/sockets-2.3.9.4/tests/httpd.cpp | 109 - .../sockets-2.3.9.4/tests/httpd_test.cpp | 214 - .../foreign/sockets-2.3.9.4/tests/https.cpp | 113 - .../foreign/sockets-2.3.9.4/tests/json.cpp | 52 - .../sockets-2.3.9.4/tests/listener.cpp | 152 - .../foreign/sockets-2.3.9.4/tests/resolve.cpp | 156 - .../foreign/sockets-2.3.9.4/tests/resume.cpp | 128 - .../foreign/sockets-2.3.9.4/tests/retry.cpp | 67 - .../foreign/sockets-2.3.9.4/tests/scanr.cpp | 52 - .../foreign/sockets-2.3.9.4/tests/semtest.cpp | 96 - .../sockets-2.3.9.4/tests/sloppy_http.cpp | 58 - .../sockets-2.3.9.4/tests/sockets_test.cpp | 356 - .../sockets-2.3.9.4/tests/stressclient.cpp | 631 -- .../sockets-2.3.9.4/tests/threadstress.cpp | 123 - .../src/foreign/sockets-2.3.9.4/tests/x.cpp | 298 - openair2/UTIL/AT_COMMANDS/COPYING | 674 -- openair2/UTIL/AT_COMMANDS/parser.c | 513 -- openair2/UTIL/AT_COMMANDS/parser.h | 220 - openair2/UTIL/OCG/Readme.doxy | 157 - openair2/UTIL/OMG/TraCIConstants.h | 717 +- openair2/UTIL/OPT/packet-mac-lte.c | 6195 ----------------- openair2/UTIL/OPT/packet-mac-lte.h | 14 - openair2/UTIL/OPT/packet-rlc-lte.h | 150 - openair2/UTIL/OPT/probe.c | 30 - openair2/UTIL/OPT/socket_sender.c | 21 - openair3/NAS/TEST/MSC/mscgen | Bin 197742 -> 0 bytes openair3/TEST/test_util.c | 287 - openair3/TEST/test_util.h | 62 - openair3/UDP/COPYING | 674 -- targets/SCRIPTS/PROFILING/gprof2dot.py | 2780 -------- targets/SCRIPTS/PROFILING/profoai.sh | 46 - 177 files changed, 28 insertions(+), 44955 deletions(-) delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Changelog delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IBase.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventHandler.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFile.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFileUpload.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IHttpServer.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IMutex.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ISocketHandler.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IStream.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ListenSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Makefile.am delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/OSX.zip delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Parse.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Parse.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README.macosx delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketAddress.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdLog.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ajp13.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/gpl.txt delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/mkdot.sh delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc.IN delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc.IN delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/sockets-config.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/Makefile delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/base64.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/chunked.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/copy.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/crlf.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/echoserver.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/events.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http_post.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd_test.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/https.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/json.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/listener.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resolve.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resume.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/retry.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/scanr.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/semtest.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sloppy_http.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sockets_test.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/stressclient.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/threadstress.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/x.cpp delete mode 100644 openair2/UTIL/AT_COMMANDS/COPYING delete mode 100644 openair2/UTIL/AT_COMMANDS/parser.c delete mode 100644 openair2/UTIL/AT_COMMANDS/parser.h delete mode 100644 openair2/UTIL/OCG/Readme.doxy delete mode 100644 openair2/UTIL/OPT/packet-mac-lte.c delete mode 100755 openair2/UTIL/OPT/packet-rlc-lte.h delete mode 100644 openair2/UTIL/OPT/socket_sender.c delete mode 100755 openair3/NAS/TEST/MSC/mscgen delete mode 100644 openair3/TEST/test_util.c delete mode 100644 openair3/TEST/test_util.h delete mode 100644 openair3/UDP/COPYING delete mode 100755 targets/SCRIPTS/PROFILING/gprof2dot.py delete mode 100755 targets/SCRIPTS/PROFILING/profoai.sh diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 0242f89601..9223a1786d 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -880,6 +880,7 @@ set(UTIL_SRC ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c ${OPENAIR2_DIR}/UTIL/OMG/rwp.c + ${OPENAIR2_DIR}/UTIL/OMG/sumo.c ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c ${OPENAIR2_DIR}/UTIL/OMG/static.c ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c @@ -1797,7 +1798,6 @@ add_executable(oaisim_nos1 ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR2_DIR}/UTIL/OMG/sumo.c ${OPENAIR_TARGETS}/COMMON/create_tasks.c ${HW_SOURCE} ${TRANSPORT_SOURCE} @@ -1882,7 +1882,6 @@ foreach(myExe s1ap aes128_cmac_encrypt secu_knas_encrypt_eia2) add_executable(test_${myExe} - ${OPENAIR3_DIR}/TEST/test_util.c ${OPENAIR3_DIR}/TEST/test_${myExe}.c ) target_link_libraries (test_${myExe} diff --git a/common/utils/T/tracer/packet-mac-lte.h b/common/utils/T/tracer/packet-mac-lte.h index 039b9dc3c4..e418f3417e 100644 --- a/common/utils/T/tracer/packet-mac-lte.h +++ b/common/utils/T/tracer/packet-mac-lte.h @@ -6,20 +6,6 @@ * By Gerald Combs * Copyright 1998 Gerald Combs * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * * This header file may also be distributed under * the terms of the BSD Licence as follows: * diff --git a/openair2/DOCS/TEMPLATES/README/Readme.doxy b/openair2/DOCS/TEMPLATES/README/Readme.doxy index d45893ecea..099c51cdf4 100644 --- a/openair2/DOCS/TEMPLATES/README/Readme.doxy +++ b/openair2/DOCS/TEMPLATES/README/Readme.doxy @@ -25,7 +25,6 @@ * \date 2009 * \version 0.1 * \company Eurecom -* \note This conde is under GNU GENERAL PUBLIC LICENSE, version 2, June 1991 * \email: navid.nikaein@eurecom.fr * \warning */ diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.cpp deleted file mode 100755 index 4b3bbc2537..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.cpp +++ /dev/null @@ -1,414 +0,0 @@ -/** - ** \file Ajp13Socket.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "Ajp13Socket.h" -#include "ajp13.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -// -------------------------------------------------------------------------------------- -Ajp13Socket::Ajp13Socket(ISocketHandler& h) : AjpBaseSocket(h) -, m_body_size_left(0) -{ -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::OnHeader( short id, short len ) -{ - if (id != 0x1234) - { -DEB( fprintf(stderr, "ABORT: bad packet id: %x\n", id);) - SetCloseAndDelete(); - } - else - { - DEB(fprintf(stderr, "Packet size: %d bytes\n", len);) - } -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceiveBody(const char *buf, size_t sz) -{ - if (sz - 2 > m_body_size_left) - { -DEB( fprintf(stderr, "More body data received than expected\n");) - SetCloseAndDelete(); - return; - } - - m_req.Write( buf + 2, sz - 2 ); - m_body_size_left -= sz - 2; - - // request more body data - if (m_body_size_left) - { - int ptr = 4; - char msg[100]; - msg[0] = 'A'; - msg[1] = 'B'; - -// reply codes -// 0x3 Send Body Chunk -// 0x4 Send Headers -// 0x5 End Response -// 0x6 Get Body Chunk <------ -// 0x9 CPong Reply - - put_byte(msg, ptr, 0x06); // GET_BODY_CHUNK; - put_integer(msg, ptr, 1000); // request 1000 bytes - - short len = htons( ptr - 4 ); - memcpy( msg + 2, &len, 2 ); - - SendBuf( msg, ptr ); - return; - } - - // Close - m_req.CloseBody(); - - // no more body data left to read - execute - Execute(); - -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceiveForwardRequest( const char *buf, size_t sz ) -{ - // - int ptr = 0; - - get_byte(buf, ptr); // skip first byte: prefix_code - unsigned char method = get_byte(buf, ptr); - std::string protocol = get_string(buf, ptr); - std::string req_uri = get_string(buf, ptr); - std::string remote_addr = get_string(buf, ptr); - std::string remote_host = get_string(buf, ptr); - std::string server_name = get_string(buf, ptr); - short server_port = get_integer(buf, ptr); - bool is_ssl = get_boolean(buf, ptr); - - std::string method_str = Utility::l2string( method ); - std::map::const_iterator it = Init.Method.find( method ); - if (it != Init.Method.end()) - { - method_str = it -> second; - } - m_req.SetHttpMethod( method_str ); - m_req.SetHttpVersion( protocol ); - m_req.SetUri( req_uri ); - m_req.SetRemoteAddr( remote_addr ); - m_req.SetRemoteHost( remote_host ); - m_req.SetServerName( server_name ); - m_req.SetServerPort( server_port ); - m_req.SetIsSsl( is_ssl ); - - // Get Headers - short num_headers = get_integer(buf, ptr); - for (int i = 0; i < num_headers; i++) - { - std::string key; - switch ( (unsigned char)buf[ptr]) // 0xa0 - { - case 0xa0: - { - unsigned short x = (unsigned short)get_integer(buf, ptr); - std::map::const_iterator it; - if ( (it = Init.Header.find(x)) != Init.Header.end()) - { - key = it -> second; - } - else - { -DEB( fprintf(stderr, "Unknown header key value: %x\n", x);) - SetCloseAndDelete(); - } - } - break; - - default: // string - key = get_string(buf, ptr); - } - if (Utility::ToLower(key) == "cookie" || Utility::ToLower(key) == "cookie2") - m_req.AddCookie(get_string(buf, ptr)); - else - m_req.SetHeader(key, get_string(buf, ptr)); - } // for - - // size left to read from web server - m_body_size_left = m_req.ContentLength(); - - // Get Attributes - while ( (unsigned char)buf[ptr] != 0xff) - { - std::string key; - unsigned char code = buf[ptr++]; - switch ( code) - { - case 10: // req_attribute, attribute name follow - key = get_string(buf, ptr); - break; - default: - { - std::map::const_iterator it = Init.Attribute.find( code ); - if (it != Init.Attribute.end()) - { - key = it -> second; - } - else - { -DEB( fprintf(stderr, "Unknown attribute key: 0x%02x\n", buf[ptr]);) - SetCloseAndDelete(); - } - } - } - m_req.SetAttribute(key, get_string(buf, ptr)); - } // while - - // execute at once if no body data - if (!m_body_size_left) - { - Execute(); - } - else - { - // open temporary file for body data - m_req.InitBody( m_body_size_left ); - } -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceiveShutdown( const char *buf, size_t sz ) -{ -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceivePing( const char *buf, size_t sz ) -{ -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceiveCPing( const char *buf, size_t sz ) -{ -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::Execute() -{ - // parse form data / query_string and cookie header if available - m_req.ParseBody(); - - // prepare page - OnExec( m_req ); - -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::Respond(const HttpResponse& res) -{ - char msg[8192]; - msg[0] = 'A'; - msg[1] = 'B'; - - m_res = res; - -// reply codes -// 0x3 Send Body Chunk -// 0x4 Send Headers -// 0x5 End Response -// 0x6 Get Body Chunk -// 0x9 CPong Reply - - // check content length - if (!m_res.ContentLength() && m_res.GetFile().size()) - { -// m_res.SetContentLength( m_res.GetFile().size() ); - } - - // Send Headers - { - int ptr = 4; - put_byte(msg, ptr, 0x04); // send headers - put_integer(msg, ptr, m_res.HttpStatusCode() ); - put_string(msg, ptr, m_res.HttpStatusMsg() ); - put_integer(msg, ptr, (short)m_res.Headers().size() ); - for (Utility::ncmap::const_iterator it = m_res.Headers().begin(); it != m_res.Headers().end(); ++it) - { - Utility::ncmap::const_iterator it2 = Init.ResponseHeader.find( it -> first ); - if (it2 != Init.ResponseHeader.end()) - { - put_integer(msg, ptr, it2 -> second); - } - else - { - put_string(msg, ptr, it -> first); - } - put_string(msg, ptr, it -> second); - } - std::list vec = m_res.CookieNames(); - { - for (std::list::iterator it = vec.begin(); it != vec.end(); ++it) - { - Utility::ncmap::const_iterator it2 = Init.ResponseHeader.find( "set-cookie" ); - if (it2 != Init.ResponseHeader.end()) - { - put_integer(msg, ptr, it2 -> second); - } - else - { - put_string(msg, ptr, "set-cookie"); - } - put_string(msg, ptr, m_res.Cookie(*it) ); - } - } - - short len = htons( ptr - 4 ); - memcpy( msg + 2, &len, 2 ); - - SendBuf( msg, ptr ); - } - // Send Body Chunk - OnTransferLimit(); -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::OnTransferLimit() -{ - char msg[8192]; - msg[0] = 'A'; - msg[1] = 'B'; - - // Send Body Chunk - size_t n = m_res.GetFile().fread(msg + 7, 1, 8100); - while (n > 0) - { - int ptr = 4; - put_byte(msg, ptr, 0x03); // send body chunk - put_integer(msg, ptr, (short)n); - ptr += (int)n; - - short len = htons( ptr - 4 ); - memcpy( msg + 2, &len, 2 ); - - SendBuf( msg, ptr ); - if (GetOutputLength() > 1) - { - SetTransferLimit( 1 ); - break; - } - - // - n = m_res.GetFile().fread(msg + 7, 1, 8100); - } - if (!GetOutputLength()) // all body data sent and no data in output buffer - send end response - { - // End Response - int ptr = 4; - put_byte(msg, ptr, 0x05); // end response - put_boolean(msg, ptr, false); // reuse - /* - don't reuse - - but with m_req.Reset() and m_res.Reset() it should be possible - - also reset any AjpBaseSocket/Ajp13Socket specific states - */ - - short len = htons( ptr - 4 ); - memcpy( msg + 2, &len, 2 ); - - SendBuf( msg, ptr ); - - SetTransferLimit(0); - m_res.GetFile().fclose(); - OnResponseComplete(); - } -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::OnPacket( const char *buf, size_t sz ) -{ - DEB(fprintf(stderr, "OnPacket: %d bytes, code 0x%02x %02x %02x %02x\n", sz, *buf, buf[1], buf[2], buf[3]);) - - // check body size left to read, if non-zero packet is body data - if (m_body_size_left) // must be a body packet - { - ReceiveBody(buf, sz); - return; - } - switch (*buf) - { - case 0x2: // Forward Request - ReceiveForwardRequest(buf, sz); - break; - case 0x7: // Shutdown - ReceiveShutdown(buf, sz); - break; - case 0x8: // Ping - ReceivePing(buf, sz); - break; - case 0xa: // CPing - ReceiveCPing(buf, sz); - break; - default: -DEB( fprintf(stderr, "Unknown packet type: 0x%02x\n", *buf);) - SetCloseAndDelete(); - } - -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.h deleted file mode 100755 index 14033b48d9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - ** \file Ajp13Socket.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Ajp13Socket_H -#define _SOCKETS_Ajp13Socket_H - -#include "AjpBaseSocket.h" -#include "HttpRequest.h" -#include "IHttpServer.h" -#include "HttpResponse.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpResponse; - -class Ajp13Socket : public AjpBaseSocket, public IHttpServer -{ -public: - Ajp13Socket(ISocketHandler& h); - - void OnHeader( short id, short len ); - void OnPacket( const char *buf, size_t sz ); - - // implements IHttpServer::Respond - void Respond(const HttpResponse& res); - - void OnTransferLimit(); - -private: - void ReceiveBody( const char *buf, size_t sz ); - void ReceiveForwardRequest( const char *buf, size_t sz ); - void ReceiveShutdown( const char *buf, size_t sz ); - void ReceivePing( const char *buf, size_t sz ); - void ReceiveCPing( const char *buf, size_t sz ); - void Execute(); - // - size_t m_body_size_left; - HttpRequest m_req; - HttpResponse m_res; -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_Ajp13Socket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.cpp deleted file mode 100755 index 784f5d78fa..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/** - ** \file AjpBaseSocket.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "AjpBaseSocket.h" -#include "ajp13.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -// --------------------------------------------------------------------------- -AjpBaseSocket::Initializer AjpBaseSocket::Init; - - -// --------------------------------------------------------------------------- -AjpBaseSocket::Initializer::Initializer() -{ - - Header[HTTP_REQUEST_ACCEPT] = "accept"; - Header[HTTP_REQUEST_ACCEPT_CHARSET] = "accept-charset"; - Header[HTTP_REQUEST_ACCEPT_ENCODING] = "accept-encoding"; - Header[HTTP_REQUEST_ACCEPT_LANGUAGE] = "accept-language"; - Header[HTTP_REQUEST_AUTHORIZATION] = "authorization"; - Header[HTTP_REQUEST_CONNECTION] = "connection"; - Header[HTTP_REQUEST_CONTENT_TYPE] = "content-type"; - Header[HTTP_REQUEST_CONTENT_LENGTH] = "content-length"; - Header[HTTP_REQUEST_COOKIE] = "cookie"; - Header[HTTP_REQUEST_COOKIE2] = "cookie2"; - Header[HTTP_REQUEST_HOST] = "host"; - Header[HTTP_REQUEST_PRAGMA] = "pragma"; - Header[HTTP_REQUEST_REFERER] = "referer"; - Header[HTTP_REQUEST_USER_AGENT] = "user-agent"; - - Method[HTTP_METHOD_OPTIONS] = "OPTIONS"; - Method[HTTP_METHOD_GET] = "GET"; - Method[HTTP_METHOD_HEAD] = "HEAD"; - Method[HTTP_METHOD_POST] = "POST"; - Method[HTTP_METHOD_PUT] = "PUT"; - Method[HTTP_METHOD_DELETE] = "DELETE"; - Method[HTTP_METHOD_TRACE] = "TRACE"; - Method[HTTP_METHOD_PROPFIND] = "PROPFIND"; - Method[HTTP_METHOD_PROPPATCH] = "PROPPATCH"; - Method[HTTP_METHOD_MKCOL] = "MKCOL"; - Method[HTTP_METHOD_COPY] = "COPY"; - Method[HTTP_METHOD_MOVE] = "MOVE"; - Method[HTTP_METHOD_LOCK] = "LOCK"; - Method[HTTP_METHOD_UNLOCK] = "UNLOCK"; - Method[HTTP_METHOD_ACL] = "ACL"; - Method[HTTP_METHOD_REPORT] = "REPORT"; - Method[HTTP_METHOD_VERSION_CONTROL] = "VERSION_CONTROL"; // with a dash "VERSION-CONTROL" - Method[HTTP_METHOD_CHECKIN] = "CHECKIN"; - Method[HTTP_METHOD_CHECKOUT] = "CHECKOUT"; - Method[HTTP_METHOD_UNCHECKOUT] = "UNCHECKOUT"; - Method[HTTP_METHOD_SEARCH] = "SEARCH"; - Method[HTTP_METHOD_MKWORKSPACE] = "MKWORKSPACE"; - Method[HTTP_METHOD_UPDATE] = "UPDATE"; - Method[HTTP_METHOD_LABEL] = "LABEL"; - Method[HTTP_METHOD_MERGE] = "MERGE"; - Method[HTTP_METHOD_BASELINE_CONTROL] = "BASELINE_CONTROL"; - Method[HTTP_METHOD_MKACTIVITY] = "MKACTIVITY"; - - Attribute[ATTR_CONTEXT] = "context"; - Attribute[ATTR_SERVLET_PATH] = "servlet_path"; - Attribute[ATTR_REMOTE_USER] = "remote_user"; - Attribute[ATTR_AUTH_TYPE] = "auth_type"; - Attribute[ATTR_QUERY_STRING] = "query_string"; - Attribute[ATTR_ROUTE] = "route"; - Attribute[ATTR_SSL_CERT] = "ssl_cert"; - Attribute[ATTR_SSL_CIPHER] = "ssl_cipher"; - Attribute[ATTR_SSL_SESSION] = "ssl_session"; - Attribute[ATTR_SSL_KEY_SIZE] = "ssl_key_size"; - Attribute[ATTR_SECRET] = "secret"; - Attribute[ATTR_STORED_METHOD] = "stored_method"; - - ResponseHeader["content-type"] = 0xa001; - ResponseHeader["content-language"] = 0xa002; - ResponseHeader["content-length"] = 0xa003; - ResponseHeader["date"] = 0xa004; - ResponseHeader["last-modified"] = 0xa005; - ResponseHeader["location"] = 0xa006; - ResponseHeader["set-cookie"] = 0xa007; - ResponseHeader["set-cookie2"] = 0xa008; - ResponseHeader["servlet-engine"] = 0xa009; - ResponseHeader["status"] = 0xa00a; - ResponseHeader["www-authenticate"] = 0xa00b; -} - - -// --------------------------------------------------------------------------- -AjpBaseSocket::AjpBaseSocket(ISocketHandler& h) : TcpSocket(h) -, m_state(0) -, m_length(4) -, m_ptr(0) -{ -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::OnRawData(const char *buf, size_t sz) -{ -DEB(fprintf(stderr, "OnRawData: %d bytes\n", sz);) - size_t ptr = 0; - while (true) - { - size_t left = sz - ptr; -DEB(fprintf(stderr, " left: %d bytes\n", left); -fprintf(stderr, " state: %d\n", m_state);) - switch (m_state) - { - case 0: - { - size_t missing = m_length - m_ptr; - short len = (short)(missing < left ? missing : left); - memcpy(m_message + m_ptr, buf + ptr, len); - m_ptr += len; - ptr += len; - if (m_ptr < m_length) - { - return; // read more - } - int p = 0; - short id = get_integer(m_message, p); - short length = get_integer(m_message, p); - OnHeader(id, length); - m_state = 1; - m_length = length; - m_ptr = 0; // bytes in m_message - } - break; - case 1: - { - size_t missing = m_length - m_ptr; - short len = (short)(missing < left ? missing : left); - memcpy(m_message + m_ptr, buf + ptr, len); - m_ptr += len; - ptr += len; - if (m_ptr < m_length) - { - return; // read more - } - OnPacket(m_message, m_ptr); - m_state = 0; - m_length = 4; - m_ptr = 0; - } - break; - } - } -} - - -// --------------------------------------------------------------------------- -unsigned char AjpBaseSocket::get_byte(const char *buf, int& ptr) -{ - return (unsigned char)buf[ptr++]; -} - - -// --------------------------------------------------------------------------- -bool AjpBaseSocket::get_boolean(const char *buf, int& ptr) -{ - return ( (unsigned char)buf[ptr++] & 1) == 1 ? true : false; -} - - -// --------------------------------------------------------------------------- -short AjpBaseSocket::get_integer(const char *buf, int& ptr) -{ - short n; - memcpy(&n, buf + ptr, 2); - ptr += 2; - return ntohs(n); -} - - -// --------------------------------------------------------------------------- -std::string AjpBaseSocket::get_string(const char *buf, int& ptr) -{ - short len = get_integer(buf, ptr); - if (len != -1) - { - std::string tmp = buf + ptr; - ptr += len; - ptr++; // skip trailing 0x0 - tmp.resize(len); - return tmp; - } - return ""; -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::put_byte(char *buf, int& ptr, unsigned char zz) -{ - buf[ptr++] = zz; -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::put_boolean(char *buf, int& ptr, bool zz) -{ - buf[ptr++] = zz ? 1 : 0; -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::put_integer(char *buf, int& ptr, short zz) -{ - short tmp = htons(zz); - memcpy(buf + ptr, &tmp, 2); - ptr += 2; -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::put_string(char *buf, int& ptr, const std::string& zz) -{ - put_integer(buf, ptr, (short)zz.size() ); - memcpy(buf + ptr, zz.c_str(), zz.size()); - ptr += (int)zz.size(); - put_byte(buf, ptr, 0); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.h deleted file mode 100755 index 74d3939ed2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - ** \file AjpBaseSocket.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_AjpBaseSocket_H -#define _SOCKETS_AjpBaseSocket_H - -#include "TcpSocket.h" -#include -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class AjpBaseSocket : public TcpSocket -{ - class Initializer - { - public: - Initializer(); - virtual ~Initializer() {} - - std::map Method; - std::map Header; - std::map Attribute; - - Utility::ncmap ResponseHeader; - - }; - -public: - AjpBaseSocket(ISocketHandler& h); - - void OnRawData(const char *buf, size_t sz); - - virtual void OnHeader( short id, short len ) = 0; - virtual void OnPacket( const char *buf, size_t sz ) = 0; - -protected: - unsigned char get_byte(const char *buf, int& ptr); - bool get_boolean(const char *buf, int& ptr); - short get_integer(const char *buf, int& ptr); - std::string get_string(const char *buf, int& ptr); - - void put_byte(char *buf, int& ptr, unsigned char zz); - void put_boolean(char *buf, int& ptr, bool zz); - void put_integer(char *buf, int& ptr, short zz); - void put_string(char *buf, int& ptr, const std::string& zz); - - static Initializer Init; - -private: - int m_state; - int m_length; - int m_ptr; - char m_message[8192]; -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_AjpBaseSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.cpp deleted file mode 100755 index 1a2286ce2c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/** \file Base64.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "Base64.h" -#include "IFile.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -const char *Base64::bstr = - "ABCDEFGHIJKLMNOPQ" - "RSTUVWXYZabcdefgh" - "ijklmnopqrstuvwxy" - "z0123456789+/"; - -const char Base64::rstr[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, - 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0}; - - -Base64::Base64() -{ -} - - -void Base64::encode(IFile *fil, std::string& output, bool add_crlf) -{ - size_t remain; - size_t i = 0; - size_t o = 0; - char input[4]; - - output = ""; - remain = fil -> fread(input,1,3); - while (remain > 0) - { - if (add_crlf && o && o % 76 == 0) - output += "\n"; - switch (remain) - { - case 1: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) ]; - output += "=="; - break; - case 2: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) ]; - output += "="; - break; - default: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ]; - output += bstr[ (input[i + 2] & 0x3f) ]; - } - o += 4; - // - remain = fil -> fread(input,1,3); - } -} - - -void Base64::encode(FILE *fil, std::string& output, bool add_crlf) -{ - size_t remain; - size_t i = 0; - size_t o = 0; - char input[4]; - - output = ""; - remain = fread(input,1,3,fil); - while (remain > 0) - { - if (add_crlf && o && o % 76 == 0) - output += "\n"; - switch (remain) - { - case 1: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) ]; - output += "=="; - break; - case 2: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) ]; - output += "="; - break; - default: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ]; - output += bstr[ (input[i + 2] & 0x3f) ]; - } - o += 4; - // - remain = fread(input,1,3,fil); - } -} - - -void Base64::encode(const std::string& str_in, std::string& str_out, bool add_crlf) -{ - encode(str_in.c_str(), str_in.size(), str_out, add_crlf); -} - - -void Base64::encode(const char* input,size_t l,std::string& output, bool add_crlf) -{ - size_t i = 0; - size_t o = 0; - - output = ""; - while (i < l) - { - size_t remain = l - i; - if (add_crlf && o && o % 76 == 0) - output += "\n"; - switch (remain) - { - case 1: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) ]; - output += "=="; - break; - case 2: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) ]; - output += "="; - break; - default: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ]; - output += bstr[ (input[i + 2] & 0x3f) ]; - } - o += 4; - i += 3; - } -} - - -void Base64::encode(const unsigned char* input,size_t l,std::string& output,bool add_crlf) -{ - size_t i = 0; - size_t o = 0; - - output = ""; - while (i < l) - { - size_t remain = l - i; - if (add_crlf && o && o % 76 == 0) - output += "\n"; - switch (remain) - { - case 1: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) ]; - output += "=="; - break; - case 2: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) ]; - output += "="; - break; - default: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ]; - output += bstr[ (input[i + 2] & 0x3f) ]; - } - o += 4; - i += 3; - } -} - - -void Base64::decode(const std::string& input,std::string& output) -{ - size_t i = 0; - size_t l = input.size(); - - output = ""; - while (i < l) - { - while (i < l && (input[i] == 13 || input[i] == 10)) - i++; - if (i < l) - { - char b1 = (char)((rstr[(int)input[i]] << 2 & 0xfc) + - (rstr[(int)input[i + 1]] >> 4 & 0x03)); - output += b1; - if (input[i + 2] != '=') - { - char b2 = (char)((rstr[(int)input[i + 1]] << 4 & 0xf0) + - (rstr[(int)input[i + 2]] >> 2 & 0x0f)); - output += b2; - } - if (input[i + 3] != '=') - { - char b3 = (char)((rstr[(int)input[i + 2]] << 6 & 0xc0) + - rstr[(int)input[i + 3]]); - output += b3; - } - i += 4; - } - } -} - - -void Base64::decode(const std::string& input, unsigned char *output, size_t& sz) -{ - size_t i = 0; - size_t l = input.size(); - size_t j = 0; - - while (i < l) - { - while (i < l && (input[i] == 13 || input[i] == 10)) - i++; - if (i < l) - { - unsigned char b1 = (unsigned char)((rstr[(int)input[i]] << 2 & 0xfc) + - (rstr[(int)input[i + 1]] >> 4 & 0x03)); - if (output) - { - output[j] = b1; - } - j++; - if (input[i + 2] != '=') - { - unsigned char b2 = (unsigned char)((rstr[(int)input[i + 1]] << 4 & 0xf0) + - (rstr[(int)input[i + 2]] >> 2 & 0x0f)); - if (output) - { - output[j] = b2; - } - j++; - } - if (input[i + 3] != '=') - { - unsigned char b3 = (unsigned char)((rstr[(int)input[i + 2]] << 6 & 0xc0) + - rstr[(int)input[i + 3]]); - if (output) - { - output[j] = b3; - } - j++; - } - i += 4; - } - } - sz = j; -} - - -size_t Base64::decode_length(const std::string& str64) -{ - if (!str64.size() || str64.size() % 4) - return 0; - size_t l = 3 * (str64.size() / 4 - 1) + 1; - if (str64[str64.size() - 2] != '=') - l++; - if (str64[str64.size() - 1] != '=') - l++; - return l; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.h deleted file mode 100755 index b1711f252e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.h +++ /dev/null @@ -1,85 +0,0 @@ -/** \file Base64.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Base64_H -#define _SOCKETS_Base64_H - -#include "sockets-config.h" -#ifdef _MSC_VER -#pragma warning(disable:4514) -#endif - -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IFile; - -/** \defgroup util Utilities */ - -/** Base64 encode/decode. - \ingroup util */ -class Base64 -{ -public: - Base64(); - - void encode(FILE *, std::string& , bool add_crlf = true); - void encode(IFile *, std::string& , bool add_crlf = true); - void encode(const std::string&, std::string& , bool add_crlf = true); - void encode(const char *, size_t, std::string& , bool add_crlf = true); - void encode(const unsigned char *, size_t, std::string& , bool add_crlf = true); - - void decode(const std::string&, std::string& ); - void decode(const std::string&, unsigned char *, size_t&); - - size_t decode_length(const std::string& ); - -private: - Base64(const Base64& ) {} - Base64& operator=(const Base64& ) { - return *this; - } - static const char *bstr; - static const char rstr[128]; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Base64_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Changelog b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Changelog deleted file mode 100755 index 044be458ec..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Changelog +++ /dev/null @@ -1,855 +0,0 @@ -diff for next release always available @ http://www.alhem.net/Sockets/latest_diff.html - -next --------- - - -2.3.9.4 --------- -File can be created using an existing FILE *. Fix bug in File using wrong -file ptr when writing. -Added HttpdForm constructor (FILE *) that detects cgi input using -environment variables. -Added HttpRequest constructor (FILE *) that can parse a cgi request. -Added missing sockets namespace in SocketThread class files. -Added new operator <<(int64_t) in StreamWriter. Might be ambigouos on some -architectures. -Fix expression evaluation in TcpSocket, causing access to null pointer. -Fix disable of both reconnect and detach functions. -Added Utility::bigint2string(int64_t). -Added Json support. - -2.3.9.3 --------- -Added multithread support in sockethandler. New method SetNumberOfThreads() -enables this. -New method in sockethandler: Release(). Make select() release before -specified timeout. Enable function with method EnableRelease(). -EventHandler using new release functionality. -Thread startup controlled with semaphore instead of flag/sleep combo. -Default thread startup behaviour is run at once, optional is wait until -released by posting to semaphore (via method SetRelease(true)). -Adding a socket with closeanddelete flag set now works as expected. -Added platform independent method Utility::Sleep( milliseconds ). -Added missing win32 implementation in new sockethandler. -Added win32 implementation of Semaphore. -Repaired build for cygwin/mingw/devcpp. - -2.3.9.2 --------- -More internal restructuring of SocketHandler. -The Get() method has been removed. Set() has been split into three: -ISocketHandler_Add(), ISocketHandler_Mod(), and ISocketHandler_Del(). -New methods defined in ISocketHandler interface to support different -models of socket io: ISocketHandler_Select(), MaxCount(). -Removed Set() method from Socket class. -Implemented SocketHandlerEp using epoll for linux only. -reinterpret_cast<> added in ListenSocket for ipv6 address struct. -HttpPostSocket member variable holding http headers (m_fields) is now -protected (changed from private). -Repaired Reconnect function in sockethandler. - -2.3.9.1 --------- -Using thread- and memory safe clib/c runtime function when possible. -Restructured sockethandler internals. -Quicker tcp shutdown sequence when sockets lib initiates close. -Renamed Utility::GetCurrentDirectory to Utility::CurrentDirectory, and -added Utility::GetEnv(). -Removed unused triggers code. - -2.3.9 ------- -TcpSocket using std::vector to receive incoming line (OnLine -callback). Configurable max limit for library available in sockets-config.h, -default 8192 bytes (TCP_LINE_SIZE). Override ISocketHandler::MaxTcpLineSize -to change this value without recompiling the library. -Added more operators in Debug class. Removed some leftover debug printouts. -HttpResponse returns non-const output file. -HTTPSocket aborts after receiving more than 200 (MAX_HTTP_HEADER_COUNT) http -headers. Use method HTTPSocket::SetMaxHeaderCount() to modify this value. -Reordered log level enum, added minlevel to StdoutLog. - -2.3.8 ------- -SSL sockets now operate in nonblocking mode. A much better solution to the -"hang" problem mentioned in 2.3.7. -Added Path() method to IFile interface. Returns File path name or MemFile -virtual path name. -Added constructor in MemFile that takes a File as input. Will read the -entire File to memory. Added constructor in MemFile that copies another -memfile. Will use the source memfile when reading. -Added reference count when a MemFile object is source for another memfile. - -Set OnTransferLimit back to 0 after a successful transfer of requested file -(in Ajp13Socket and HttpBaseSocket). Reset IFile auto_ptr to -decrease the reference count asap (by using fclose). - -2.3.7 ------- -Moved some #include's outside the sockets namespace definition. -Fix code to avoid an increment on an stl iterator that has reached end. -Helping compilers deal with it++ when result is not used, changed all it++ -to ++it where appropriate. -Doing an extra select on write readiness on file descriptor before calling -SSL_write. Prevents a hang situation when the remote end drops the -connection. - -2.3.6 ------- -Added improved Valid() method using unique socket instance identifier. Using -this identifier internally for events and resolver. Added optional data -parameter in Event class, used by library to store socket instance -identifier. -No longer using SSL_MODE_AUTO_RETRY for ssl connections. If remote end -disconnects this would cause hangups. -Using SSL_MODE_ENABLE_PARTIAL_WRITE because the library supports this. -Renamed EventHandler() method in IEventOwner to GetEventHandler(). -Added file system path abstraction methods to Utility. -Reset file descriptor after successful close of a ListenSocket. - -2.3.5 ------- -Added method(s) in UdpSocket to set default interface to be used for multicast. -Added flag for position independent code for linux-x86-32 architecture (see -Makefile.Defines.linux-x86-32). -Added missing includes (on some distributions/gcc versions). -SetUri in HttpRequest no longer URLDecodes the entire url. -Fix for static variables in SSLInitializer. -Fix for new version of openssl (const SSLxx_method()). -Fix for getnameinfo. -Modified Utility::Uri parser class so it also splits the url in path / -querystring parts. - -2.3.4 ------- -Some .cpp were missing namespace declarations - fixed. Some includes for -ipv6 was missing - fixed. Operators in StreamWriter class modified to work -on 64-bit as well as 32-bit systems. - -2.3.3 ------- -Fix deadlock in SSLInitializer introduced in 2.3.2. -Added check when select() returns -1 indicating one of the file descriptors -have gone bad. The check rebuilds the fd_set used by select(). -Bugfix in HttpGetSocket, one of the constructors had no support in -HttpClientSocket - added. -Corrected bad #include's in Utility. -Added IStream interface to read/write from socket and IFile (memfile, normal -file). New classes SocketStream, FileStream, StreamWriter. -Added ReadInput method in TcpSocket - read from input buffer. -Added GetLine method in TcpSocket - chars input on current line when using -SetLineProtocol mode. - -2.3.2 ------- -Threadsafe list of ssl initializer, ssl contexts and openssl error text -retrieval. -Added interface for Mutex class, adding the possibility for others to -implement the mutex functionality using other approaches. -Moved FromUtf8 method from XmlNode to Utility. - -2.3.1 ------- -Request: Remove() method in SocketHandler changed from private to protected. -Added Utility::Stack that returns a stack walk (currently linux only). -Request: Added $(DESTDIR) variable in Makefile for more flexible installation. -The timeout value is now reset before OnTimeout() is called, making it -possible to set a new timeout value in the OnTimeout() method. - -2.3 ------- -Small change in ListenSocket<> to improve accepting of incoming -connections. -Added xml parsing classes: XmlDocument, XmlNode, and XmlException. -Added new OnDisconnect(flags, code) callback that provides reason -for the disconnect. -Fix crash bug if an event object gets deleted in its own OnEvent -method. -gcc 4.3 compability fixes. - -2.2.9a ------- -Added assignment operator on HttpRequest class. -HttpdForm sometimes got stuck in an infinite loop - fixed. -Lock using const Mutex, and Mutex modified to work when const. -Added Utility::Uri that can be used for parsing of an url. - -2.2.9 ------ -Fixed memory leak in TcpSocket. -Fixed potentially unsafe code in http form data parser (HttpdForm). -Fix memory and resource leak in HttpRequest. -Ajp13Socket/HttpBaseSocket now creates a copy of the HttpResponse -instance when sending a response, to avoid synchronization problems. -Added "lost" flag which is set when a tcpsocket has lost connection -unexpectedly (on read/write error). Earlier this function was only -present when the connection pool was enabled (ENABLE_POOL). -Removed unnecessary call to shutdown() when destroying a closed -tcp socket. -Added brief 'INSTALL' document. - -2.2.8 ------ -Added http client ability to receive a chunked response. -HTTP headers are now treated in a case insensitive manner. -MacOS leopard fixes. -Added callback "OnDataComplete" to HTTPSocket, which is called -when the full body of the request/response has been received. -New random generator (mersienne twister). - -2.2.7 ------ -Http header names no longer converted to lowercase. -"setsockopt()" wrapper methods returning int values has been fixed. -No longer sets query_string attribute of HttpRequest when there is no -query string present. - -2.2.6 ------ -Modified HttpRequest class to easier add support for pipelining. -Made the following classes work with the copy constructor: HttpRequest, -HttpTransaction, HttpdCookies. -Always adding http header names as lowercase in internal storage -(HTTPSocket). Added method to check if http header is set. -Changed IHttpServer interface to better separate request and response. -Added -mno-cygwin flag in Makefile defines for cygwin. -Added calls to OnDisconnect when socket operation caused socket to close. - -2.2.5 ------ -A basic_string exception thrown while trying to access the first -(non-existing) element in a zero-sized string was fixed in HTTPSocket. -Added separate http_version for HttpResponse. Improved reset of state -information in HTTPSocket and derivates (for keep-alive connections). -MemFile support reads and writes larger than internal blocksize. - -2.2.4 ------ -IFile (File/MemFile) added reset_read and reset_write. -Bugfix MemFile read. -UdpSocket timestamp small fix for win32. -Cookies reworked in Http framework (Transaction/Request/Response -and HttpBaseSocket/Ajp13Socket). -Compile issue when compiling without openssl solved. - -2.2.3 ------ -SSL Handshake was never initiated when using both client and server from the -library - fixed. -UdpSocket read timestamp added (SetTimestamp) as new OnRawData method. Use -when timestamps enabled with call to SetSoTimestamp. Not win32. -MacOSX project added. Big Thanks to Bruce for both of these. - -2.2.2 ------ -Close file descriptor in File destructor. -HttpClientSocket new access method Filename. -Added a few access methods to HttpdSocket. -Check if gethostbyname_r failed. -Async resolver fix. -Fix win32 build problem (uint64_t). - -2.2.1 ------ -Adding (optional) exceptions when Bind() or CreateSocket() fails. -Enable with ENABLE_EXCEPTIONS. -Added GetSock* methods in Socket, to retreive information about local -port and address in a connection. -Added InitializeContext in TcpSocket with separate certificate / key files. -Moved some #include's from .h to .cpp files. -Removed multiple calls to recvfrom() in UdpSocket OnRead. -HTTPSocket corrected. - -2.2 ------ -TcpSocket output buffer error fixed. -HTTPSocket HTTP/1.0 request (or HTTP/1.1 with connection: close) fixed. -IEventHandler now won't crash if the IEventOwner is deleted in OnEvent. -Added Ajp13Socket that understands the ajp/1.3 protocol. Each request received -by the class results in an "OnExec(HttpRequest, HttpResponse)" call. -Added "HttpBaseSocket" that also use the "OnExec" method to process a -http/https request. - -2.1.9 ------ -Added exception class. -Changed platform selection in Unix Makefile. -Cleaner compile on mingw. -HTTPSocket supports keepalive. -OnDisconnect moved out of ENABLE_RECONNECT scope. - -2.1.8 ------ -Added missing (optional) namespace in SmtpdSocket. -TcpSocket: Calling OnDisconnect when reading 0 bytes. -TcpSocket: Added OnTransferLimit() callback, called when output buffer -size drops below limit set by SetTransferLimit(). -Boundary bug (writes over two blocks failed) in MemFile fixed. -Member variables in SSLInitializer no longer static since SSLInitializer -in itself is static in TcpSocket (avoid potential problem with -initialization order of static's). - -2.1.7 ------ -Fatal bug in LineProtocol/Online found, when a crlf happens over a read -buffer boundary. FIXED. -New output buffer logic. OnWriteComplete callback added, which fires after -the output buffer has been transferred. - -2.1.6 ------ -No more random number generator in Socket. Random number generator used in -Utility changed to static. -ISocketHandler is now a pure virtual definition of the SocketHandler. -Added general purpose timeout to Socket class (SetTimeout, OnTimeout), and -used it to implement the connection timeout logic in TcpSocket/SctpSocket. -Also added OnConnectTimeout which is called instead of OnTimeout, if the -socket is in Connecting mode. -New StreamSocket class defines variables used for sock_stream stuff (such -as connecting, the line protocol). - -2.1.5 ------ -Changed socket and ip option calls to directly manipulate the socket. They -should be used in the OnOptions callback, to set up the connection before -it is used. OnOptions is only called on client sockets. It is not called on -incoming connections accepted with accept()). -Removed Set methods from ResolvSocket and replaced them with one -constructor for each of the different resolves it can do. -Added DNS cache in ResolvSocket. -Made CircularBuffer an internal class of TcpSocket. -Moved these classes to a separate download: - ICrypt NullCrypt CTcpSocket MinionSocket MinderSocket MinderHandler Uid -ListenSocket now sets SO_REUSEADDR in its OnOptions method. -Small fixes to SmtpSocket to support the new configuration stuff. -Added socket to socket trigger framework (sockets-config.h: ENABLE_TRIGGERS). -Small bugfix in TcpSocket::Open when trying to connect to an ipv6 host -with numeric ip address. - -2.1.4 ------ -Added traffic monitor function. -EventHandler/IEventOwner bugfix (pure virtual method called on takedown). -Added outstanding events counter to IEventOwner, to avoid calling -ClearEvents in destructor of an IEventOwner with no events to clear. -Modified GetTimeUntilNextEvent to not return a negative time. -Added SmtpdSocket serverside implementation. -Crash bug fix if trying to add a socket that already exists in -sockethandler queue. -Made a few classes internal (PoolSocket, EventSocket, SocketThread). - -2.1.3 ------ -Added optional Ipv6 and Detach functionality to sockets-config.h. - (ENABLE_IPV6, ENABLE_DETACH) -Crash bug fix: if socket that asked a resolve question is destroyed -before answer arrives. -HTTPS (openssl) session support on server side. -Safer ssl read/write - tnx Peters! -All debug output now to stderr. -GetClientRemoteAddress and XXX now returns a copy of the address in -question, to avoid NULLing the source address when using std::auto_ptr. -SSL initialization code separated from TcpSocket and put in a new -SSLInitializer class. - -2.1.2 ------ -Fix for broken http framework. -Http and httpd tests added. -Configurable options moved to new 'sockets-config.h' file. -Restored code for dns resolve when getaddrinfo/getnameinfo isn't available. -(See sockets-config.h symbol NO_GETADDRINFO) - -2.1.1 ------ -Semaphore added. -Utility::GetTime() fixed on win32. - -2.1 ---- - * Added Utility::GetTime. - * Created socket handler base class ISocketHandler. It will now be possible - to write really customized sockethandlers. One effect of this is that - the first parameter of the Socket class constructor changes from - SocketHandler& to ISocketHandler& - this will affect all current - software using the library. - * StdLog constructor first parameter changed from SocketHandler* - to ISocketHandler* - * Modified list handling in Socket/SocketHandler. - * Added possibility to clear tcp socket byte counters by passing - 'true' as input parameter to GetBytesReceived() and GetBytesSent(). - * Improved CircularBuffer performance when used as output buffer by - TcpSocket. - * Removed unused and confusing method ISocketHandler::GetSocket. - * SocketAddress will replace direct use of ipv4/ipv6 addresses in the code. - * Removed virtual supporting method Socket::ReadLine. If anyone was using - that method, it used to be called directly after the OnRead callback, - if SetLineProtocol was enabled. Repairing the functionality means - adding a call of your own in the OnRead callback. - * Optimized code for OnLine and HTTP header parsing. - * Found and fixed a timing bug in thread code that could cause - a segmentation fault. - * 'echoserver.cpp' and 'stressclient.cpp' added, for test. Supports - normal echo operation, http "echo" server and ssl server/client. - -2.0.9 ------ -Added a way to disable input buffering on tcp sockets. -The method TcpSocket::DisableInputBuffer() will prevent all writing -to the input buffer. After that, the only way to receive data is to -implement an OnRawData method. TcpSocket derived classes that -already only use OnRawData as a means of receiving data should -call DisableInputBuffer() to improve performance (and turn off those -annoying warning messages). -OnOptions will now be called by UdpSocket. OnOptions is now a pure -virtual method in the Socket class. Moved default implementation of -OnOptions from Socket to TcpSocket. Added empty implementations of -OnOptions in ListenSocket<>, UdpSocket and PoolSocket. -Made Sockets-config compile on mingw systems. - -2.0.8 ------ -gethostbyname_r only used if the symbol LINUX is defined. -Sctp protocol by default disabled. Enable by defining USE_SCTP. -Fixed warnings about GetSocket/handler in connect and disconnect -situations. - -2.0.7 ------ -Added Resolve(ipaddr_t) and Resolve(const std::string&) in Socket class -for reverse lookup. Added OnResolveFailed() callback to Socket when a -Resolve call failed. -Moved definition of SOCKETS_DYNAMIC_TEMP to socket_include.h to avoid -breaking windows application not using Sockets-config to retrieve -compile time flags. -Added "fd XX" to StdoutLog debug printout whenever a socket instance -generates an event, where XX is the file descriptor of the socket or --1 if the file descriptor isn't valid. -Reset connected flag when read returns 0 - avoids using shutdown on -Close() and the following warning. -SCTP support added - see SctpSocket class. - -2.0.6 ------ -"gethostbyname()" calls are replaced with "gethostbyname_r()", to ensure -threadsafe operation. -If the flag SOCKETS_DYNAMIC_TEMP is defined at compile time of the library, -all application using the library must also define the same flag. In unix/ -linux Makefiles this is easiest done by adding `Sockets-config` to the -CPPFLAGS variable. -Optimized SocketHandler by removing the SocketHandler::GetSocket method -and adding better code in each place where it was used - Thanks Samuel. -CircularBuffer now has a ReadString method. -Added method to remove a specific event to the EventHandler class. -Added methods to the IEventOwner interface to remove all events or -one specific events. - Thanks Thomas - -2.0.5 ------ -Added missing call to OnRawData when using ssl. -Bugfix in HttpPostSocket, where the boundary variable was never set. -Reset connecting flag in TcpSocket when a connection attempt fails. -Define SOCKETS_DYNAMIC_TEMP to use dynamically allocated temporary -buffers in read operations - helps on ECOS. -Compile with -O0 if you are using gcc 2.9.x. - -2.0.4 ------ -Improved Http client classes, now they're all able to receive a response. -Use methods SetFilename() / SetDataPtr() to write response to a file -or to memory respectively. -Small fix for uuid.h include for mac os x. -Removed debug printout in SSLInitializer. - -2.0.3 ------ -Url parsing modified for Http Get/Put/Post classes to enable ssl if the -url protocol is https. -TcpSocket/SSL random file modified, see tutorial page at -http://www.alhem.net/Sockets/tutorial/using6d.html -Removed a lot of old debug printouts. - -2.0.2b ------- -Replaced direct read access to sockets map with a method looping through -the map, to avoid adding null pointers to non-existing file descriptors. - -2.0.2a ------- -The new add control logic broke tcp reconnect, so this is a fix for that. - -2.0.2 ------ -Fixed infinite loop that could lock the main process when a socket attempts -to connect, gets data to send, and then the connection fails. -Added control so the same file descriptor can't be added to the socket -handler twice. -Utility::rfc1738_encode buffer overflow (read only) fixed. -Moved local hostname resolution stuff from SocketHandler to Utility -- see http://www.alhem.net/Sockets/tutorial/using6c.html -Project files for visual studio 6 slightly modified (missing dependency, -FD_SETSIZE define removed). - -2.0.1 ------ -Moved Errno declaration outside sockets namespace when compiling for unix. -This was already done for the win32 implementation. -Made typedef for socket_m in SocketHandler protected, since its use are -already protected. -Fixed problem with reconnect. - -2.0 ---- -Optimizing SocketHandler. -Fixed SSL socket reconnect. -HttpGetSocket url parsing fixed. Really. -Increased char buffer size in HttpdSocket for large query_string's. -Added timer events, implemented in EventHandler. -Using _beginthreadex()/_endthreadex() to create/end thread in _win32. -Using GetTempPathA() explicitly when getting _win32 temporary path. - * Removed (almost) all sprintf's. -Visual studio .net project now build multithreaded library. -Removed redundant classes SSLSocket, HttpsGetSocket, and HttpsSocket -(all SSL functionality now in TcpSocket). -Using dummy ssl types in TcpSocket if HAVE_OPENSSL is not defined. -Moved a few typedef's outside the optional sockets namespace in the file -socket_include.h. -Fixed Thread/SocketThread to avoid using method on deleted pointer. -Added CXX in Makefile. -Bugfix in SocketThread so the correct sockethandler will be used by the -detached socket object. -Added full mutex threadsafe operations. The old _THREADSAFE_SOCKETS -Makefile option is no longer in use. -Improved graceful shutdown of tcp connections when possible. -Moved address resolution methods from class Socket to Utility. The methods -are isip, u2ip, l2ip. -Added fix for unassigned names in httpdform parser. - -1.9.9 ------ -Trying to remove all dynamic_cast's. They are used in ListenSocket to -check that the Create method returns correct type, and in the socket -handler to give extra functionality to tcp sockets. -New callback OnDisconnect is called only when a connected tcp socket -is set for reconnect, and has lost connection. -Memory leak in TcpSocket output buffering fixed. -HttpGetSocket.url_this fixed. -Replaced HttpGetSocket.m_content string with an allocated byte buffer. -Fix bug in Utility::rfc1738_decode. -SocketHandler.Select can be called without parameters, which means it -will not return until an event has been received by a socket. -Automatic purging of tcp sockets that hang around too long with data -still left to send. -Added virtual destructor for ICrypt pure virtual. - -1.9.8 ------ -Nasty bug fixed on macosx that caused OnConnect to be called even if -the connection failed. -SSL client functionality restored. Cached data was not sent on connect -because the connected flag was not set. -Two new callbacks added for TcpSocket, to indicate that ssl negotiation -failed: OnSSLConnectFailed and OnSSLAcceptFailed. -HttpGetSocket: getting a https: address enables ssl.... -Added fatal error if trying to use a ssl server without implementing -the initialization method (InitSSLServer). - -1.9.7 ------ -SocketHandler.OkToAccept now takes a socket class pointer as input -parameter, which can be used to identify which ListenSocket is -calling OkToAccept. -Treating socket exception as connection failed on win32 -(if trying to connect). -Reset "flush before close" flag on write/read error. -Moved sockethandler Add logic once again, this time outside loop -checking for fd_set events.. -Check if fd_set is getting full (trying to add more than FD_SETSIZE -sockets to the socket handler). Incoming connections are immediately -disconnected if the fd_set is full. TcpSocket::Open calls will -fail instantly if there is no more space in the fd_set. -Remember that FD_SETSIZE can be defined in socket_handler.h if there -is a need for larger fd_set's. The default on win32 is 64 slots which -is a bit thin. Linux and probably most unixes has 1024 slots... -On MacOsX the macro FD_COPY is used to copy the fd_set's before select(). -More debug logging on exactly how a connection was established. - -1.9.6 ------ -Bugfix protecting the sockethandler from using deleted sockets. -(Socket class destructor calls SocketHandler.Remove in case the socket -is deleted before it is removed from the sockethandler). -Removed a lot of warnings for visual studio .net / 2005 beta. -Fix for bsd sockets sigpipe disable, using SO_NOSIGPIPE. -Solaris use putenv in HttpdSocket. -Added flag flush before close, telling a (tcp) socket to send all data -before closing even while the SetCloseAndDelete flag is set. -Default value: flush before close = true. - -1.9.5 ------ -Visual studio 6 and .net project files updated. -DevCpp project files updated. -Using openssl win32 installer from www.slproweb.com, -with installation location c:\OpenSSL. -Merged Sockets and SocketsEx projects in all windows projects. -Added winsock error texts. - -ListenSocket.Bind slightly modified - if port 0 random assigned is -needed, 0 has to be specified in the Bind call (before this release -a Bind call with no parameters had the same effect). -Ipv6 support has been improved, with many of the ipv4/ipv6 methods -overall merged into one. Ipv6 support for reconnect and connection retry. -The connection pool now also support ipv6 connections. -Added SocketHandler.ResolverReady that indicates the resolverthread -is ready for queries. -UdpSocket constructor modified to also include an ipv6 boolean -parameter, because the socket file descriptor is created in the -constructor. -Change: UdpSocket.Bind returns 0 on success, -1 on failure, just like -ListenSocket<>.Bind. -Connection pool disabled by default. Use SocketHandler.EnablePool to -turn it back on. -HttpDebugSocket: Added first line of request (method url httpversion) to -page echoing the request. -TcpSocket ssl private key callback function no longer uses a static -member variable to store the password. This enables the use of any number -of private key files, each with a different password. - -1.9.4 ------ -Changed udp sockets to nonblocking. - -1.9.3 ------ -New define while compiling: _THREADSAFE_SOCKETS -This "thread safe" compile mode only protects OnWrite / SendBuf in -TcpSocket, but will probably include more sections of the code later on. -Mutex and Lock classes added. -HttpdCookies now excludes domain from the Set-Cookie http header -(if COOKIE_DOMAIN is defined as a blank string ""). -Incoming connections should now respond quicker even when using a long -Select() timeout. -Documentation: All classes and Socket class members at least briefly described. -Tcp and Udp socket now shares a common virtual description of the Send -and SendBuf methods. -Fixed bug that caused too long connection timeouts. -UDP sockets reads up to 10 messages in one read event. - -1.9.2 ------ -Support for HttpdSocket http/1.1 keep-alive operation added. -Fiddling with the connection / reconnect code. Not perfect by a long shot. -If a connection timeout is set, and the socket is supposed to reconnect, -the socket will wait the defined connection timeout until a connection -retry is made even if the connection fails immediately. -OnConnectFailed() will only be called after all connection retries has -been attempted. -OnConnectRetry() will be called before each connection retry. Return -false from this callback method to abort connection retries and kill the -socket permanently. -Data sent before / between connection is preserved, whatever that's worth. -Added optional namespace for the entire library. - -1.9.1 ------ -Added SetConnected() in ListenSocket.h for TcpSocket's on accept. -If not, all incoming tcp connections refused to send their data. - -1.9 ---- -Added reconnect and connection retry for TcpSocket's. -New callbacks: -OnConnectRetry() can return false to abort connection retries. -OnReconnect() when a connection has resumed. - -1.8.7 ------ -Added methods GetSsl() and GetSslContext() to access openssl structures -SSL resp. SSL_CTX in TcpSocket and SSLSocket. -HttpGetSocket no longer reports an error when initialized with an empty -filename. -SocketHandler::GetCount now returns actual number of active socket plus -number of sockets to be added to active sockets list. - -1.8.6 ------ -Socket::DisableRead - use this when creating a socket only for output -(the file descriptor will not be added to the read fd_set on select). -Added check to make sure no more than FD_SETSIZE sockets are added to -the socket handler. - -1.8.5 ------ -ReadLine fixed. - -1.8.4 ------ -Fixed a buffer problem that lost a byte for each read when doing large -http transfers (HTTPSocket, HttpsSocket, TcpSocket). -Added classes mentioned in v1.8.3... -Thread class implemented for win32 (not tested) - -1.8.3 ------ -(OnWriteComplete - pending) -(IFile - File - MemFile) -(HttpdSocket - HttpdForm - HttpdCookies) -Incoming sockets are no longer blocking -OnWrite no longer disconnect on EAGAIN error code -SSLSocket has been integrated with TcpSocket (still experimental) - -1.8.2 ------ -Removed warning about read after shutdown. -Socket does not try to do shutdown/close if the file descriptor is invalid. - -1.8 ---- -ListenSocketBase functionality moved to ListenSocket template class. -The important addition is the Create() method in Socket - use that to -create a socket instance with an alternative constructor if needed. -TcpSocket::Open bugfix - sometimes returned false (connection failed) -although the connection was perfectly fine. -Socks4 client functionality added for outgoing connections. See new -SetSocks4Host, SetSocks4Port, SetSocks4Userid and SetSocks4TryDirect -methods in SocketHandler. -HttpGetSocket stores retrieved document in a private string member -variable, reducing the need for disk access. -Asynchronous DNS functionality added. Use the new SocketHandler method -EnableResolver() to enable this for resolving of all outgoing connections. - -1.7.6 ------ -Small changes in UdpSocket -New class ListenSocketBase as an alternative to ListenSocket<> template -class -New callback in Socket: Create - used by ListenSocketBase - -1.7.5 ------ -New callback on socket class: OnOptions, called when a new socket has -been created, to set options like SetReuse and SetKeepalive. -New get methods on MinionSocket. -Socket::Close now does a recv() after shutdown(). -New logging level: Info - -1.7.2 ------ -HttpsGetSocket::url_this default port changed to 443 (was 80). -TcpSocket buffer sizes adjusted. -Switch off LineProtocol when reading the http body in HTTPSocket and -HttpsSocket. - - -1.7 ---- -HttpPostSocket added functionality, able to switch between url-encoded -form-data or multipart/form-data. -Connection pooling on TcpSocket's; When SetRetain() is called on a client -socket (that use Open / OnConnect), that sockets connection will be left -open and reused by the next TcpSocket the tries to open a new connection to -the same host / port. -This construction gives HTTPSocket HTTP/1.1 support for keep-alive -connections. -Pooled connections are stored as PoolSocket objects in the SocketHandler -socket list, and supervised like any other socket - if a pooled connection -is closed by the remote end, it's removed by the SocketHandler. - - -1.6.4 ------ -Socket::SetParent / ::GetParent added, as a way to find out which -ListenSocket created the Socket. GetParent returns the pointer to the -ListenSocket object, or NULL if the Socket was created by the -programmer. -Win32: WSA startup code is wrapped in a class, which is created as a -static instance in Socket. This should automatically initialize -winsock when the first Socket is created. - - -1.6.3 ------ -"errno" and "strerror" has been replaced by Errno and StrError, -and is defined for each operating system environment. -New classes for HTTP: HttpPutSocket, HttpPostSocket, HttpDebugSocket. - -1.6.2 ------ -Bugfix in ListenSocket, when opening a random port GetPort() returned -wrong port number - this is now fixed. -Defining methods depending on ipv4 or ipv6 was removed, and all ipv4 methods -renamed to their original names - without the '4'. - - -1.6.1 ------ -Dummy copy constructor / assignment operator added to classes that can't be -copied by default. -Minor improvements to HTTPSocket. -Removed typedef string_v - collision with other projects that use same name -for std::vector instead of internal use std::list - - -1.6 ---- -Improvements on win32 compile and linking. Remember to turn on rtti -information (/GR in visual studio), because I tend to use dynamic_cast a lot. - -It is now possible to exclude openssl specific code, by not having -HAVE_OPENSSL defined at compile time. -Define HAVE_OPENSSL in Makefile or project file if openssl is installed -on your machine. - -Bugfix in CircularBuffer. It finally works. - -Renamed CircularBuffer method GetCount to "ByteCounter" - the method returns -the total number of bytes to have ever gone through the buffer. - -Improved logging, and cleaned up old debug printouts. - -Fixed a number of memory leaks that would occur in an application that -creates and recreates a lot of SocketHandler's, and also in the threading -part of the library. - -Some optimizations for speed. - - -1.5.4 ------ -UdpSocket: Broadcast flag, Multicast stuff - - -1.5.3 ------ -SocketHandler no longer resolves local hostname on startup. -On hosts with unresolvable hostname this would cause a delay on startup. - -Changed unix socket i/o from read/write to recv/send with MSG_NOSIGNAL -flag, to avoid sigpipe - - see readsocket/writesocket macros in socket_include.h. - - -1.5 ---- - -New callback: OnConnectFailed - -new / modified methods to support ipv6: - Socket::CreateSocket6 - Socket::u2ip - Socket::l2ip - Socket::GetRemoteIP6 - Socket::IsIpv6 - - - -04-04-12 --------- -void TcpSocket::OnRawData(const char *,size_t) -called when new data is read - -bool SocketHandler::OkToAccept() -called by ListenSocket - default implementation returns true - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.cpp deleted file mode 100755 index 4d456fd902..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "Debug.h" -#include -#include - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -std::map Debug::m_level; -const char *Debug::colors[] = { - "\x1B[0;0m", // &n */ - "\x1B[0;0m\x1B[31m", // &r */ - "\x1B[0;0m\x1B[32m", // &g */ - "\x1B[0;0m\x1B[33m", // &y */ - "\x1B[0;0m\x1B[34m", // &b */ - "\x1B[0;0m\x1B[35m", // &m */ - "\x1B[0;0m\x1B[36m", // &c */ - "\x1B[0;0m\x1B[37m", // &w */ - "\x1B[1;31m", // &R */ - "\x1B[1;32m", // &G */ - "\x1B[1;33m", // &Y */ - "\x1B[1;34m", // &B */ - "\x1B[1;35m", // &M */ - "\x1B[1;36m", // &C */ - "\x1B[1;37m" }; // &W */ - - -void Debug::Print(const char *format, ...) -{ - char slask[5000]; // temporary for vsprintf / vsnprintf - va_list ap; - - va_start(ap, format); - vsnprintf(slask, sizeof(slask), format, ap); - va_end(ap); - - fprintf(stderr, "%s", colors[Utility::ThreadID() % 14 + 1]); - for (int i = 0; i < m_level[Utility::ThreadID()]; i++) - fprintf(stderr, " "); - if (slask[strlen(slask) - 1] == '\n') - slask[strlen(slask) - 1] = 0; - fprintf(stderr, "%s%s\n", slask, colors[0]); -} - - -Debug& Debug::operator<<(const char * str) -{ - m_line += str; - return *this; -} - - -Debug& Debug::operator<<(const std::string& str) -{ - m_line += str; - return *this; -} - - -Debug& Debug::operator<<(short l) -{ - m_line += Utility::l2string(l); - return *this; -} - - -Debug& Debug::operator<<(int l) -{ - m_line += Utility::l2string(l); - return *this; -} - - -Debug& Debug::operator<<(long l) -{ - m_line += Utility::l2string(l); - return *this; -} - - -Debug& Debug::operator<<(double d) -{ - char slask[100]; - snprintf(slask, sizeof(slask), "%f", d); - m_line += slask; - return *this; -} - - -Debug& Debug::operator<<(endl) -{ - Print("%s", m_line.c_str()); - m_line = ""; - return *this; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.h deleted file mode 100755 index e8f20be8df..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef _SOCKETS_Debug_H -#define _SOCKETS_Debug_H - -#include "sockets-config.h" -#include "Utility.h" -#include - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class Debug -{ - static const char *colors[]; -public: - class endl - { - public: - endl() {} - virtual ~endl() {} - }; - -public: - Debug() {} - Debug(const std::string& x) : m_id(0), m_text(x) { - fprintf(stderr, "%s", colors[Utility::ThreadID() % 14 + 1]); - - for (int i = 0; i < m_level[Utility::ThreadID()]; i++) - fprintf(stderr, " "); - - fprintf(stderr, "%s%s\n", x.c_str(), colors[0]); - m_level[Utility::ThreadID()]++; - } - Debug(int id, const std::string& x) : m_id(id), m_text(x) { - fprintf(stderr, "%s", colors[Utility::ThreadID() % 14 + 1]); - - for (int i = 0; i < m_level[Utility::ThreadID()]; i++) - fprintf(stderr, " "); - - fprintf(stderr, "%d> %s%s\n", m_id, x.c_str(), colors[0]); - m_level[Utility::ThreadID()]++; - } - ~Debug() { - if (!m_text.empty()) { - if (m_level[Utility::ThreadID()]) - m_level[Utility::ThreadID()]--; - - fprintf(stderr, "%s", colors[Utility::ThreadID() % 14 + 1]); - - for (int i = 0; i < m_level[Utility::ThreadID()]; i++) - fprintf(stderr, " "); - - if (m_id) - fprintf(stderr, "%d> /%s%s\n", m_id, m_text.c_str(), colors[0]); - else - fprintf(stderr, "/%s%s\n", m_text.c_str(), colors[0]); - - fflush(stderr); - } - } - static void Print(const char *format, ...); - - Debug& operator<<(const char *); - Debug& operator<<(const std::string& ); - Debug& operator<<(short); - Debug& operator<<(int); - Debug& operator<<(long); - Debug& operator<<(double); - Debug& operator<<(endl); - -private: - int m_id; - std::string m_text; - static std::map m_level; - std::string m_line; -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_Debug_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.cpp deleted file mode 100755 index 7398a06475..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/** \file Event.cpp - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "Event.h" -#ifdef _WIN32 -#else -#include -#endif - -//#include "IEventOwner.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// statics -long Event::m_unique_id = 0; - - -Event::Event(IEventOwner *from,long sec,long usec,unsigned long data) : m_from(from), m_data(data), m_time(sec, usec), m_id(++m_unique_id) -{ -} - - -Event::~Event() -{ -} - - -bool Event::operator<(Event& e) -{ - return m_time < e.m_time; -} - - -long Event::GetID() const -{ - return m_id; -} - - -const EventTime& Event::GetTime() const -{ - return m_time; -} - - -IEventOwner *Event::GetFrom() const -{ - return m_from; -} - - -unsigned long Event::Data() const -{ - return m_data; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.h deleted file mode 100755 index 62ea1a0478..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.h +++ /dev/null @@ -1,83 +0,0 @@ -/** \file Event.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Event_H -#define _SOCKETS_Event_H - -#include "sockets-config.h" -#ifdef _WIN32 -#else -#include -#endif -#include "EventTime.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IEventOwner; - -/** Store information about a timer event. - \ingroup timer */ -class Event -{ -public: - Event(IEventOwner *,long sec,long usec,unsigned long data = 0); - ~Event(); - - bool operator<(Event&); - long GetID() const; - const EventTime& GetTime() const; - IEventOwner *GetFrom() const; - unsigned long Data() const; - -private: - Event(const Event& ) {} // copy constructor - Event& operator=(const Event& ) { - return *this; // assignment operator - } - IEventOwner *m_from; - unsigned long m_data; - EventTime m_time; - static long m_unique_id; - long m_id; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Event_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.cpp deleted file mode 100755 index b5913424ba..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/** \file EventHandler.cpp - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "EventHandler.h" -#include "IEventOwner.h" -#include "Event.h" -#include "TcpSocket.h" -#include "ListenSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -EventHandler::EventHandler(StdLog *p) : SocketHandler(p), m_quit(false) -{ - EnableRelease(); -} - - -EventHandler::EventHandler(IMutex& m,StdLog *p) : SocketHandler(m, p), m_quit(false) -{ - EnableRelease(); -} - - -EventHandler::~EventHandler() -{ - while (m_events.size()) - { - std::list::iterator it = m_events.begin(); - Event *e = *it; - e -> GetFrom() -> SetHandlerInvalid(); - delete e; - m_events.erase(it); - } -} - - -bool EventHandler::GetTimeUntilNextEvent(struct timeval *tv) -{ - if (!m_events.size()) - return false; - std::list::iterator it = m_events.begin(); - if (it != m_events.end()) - { - EventTime now; - mytime_t diff = (*it) -> GetTime() - now; - if (diff < 1) - { - diff = 1; - } - tv -> tv_sec = static_cast(diff / 1000000); - tv -> tv_usec = static_cast(diff % 1000000); - return true; - } - return false; -} - - -void EventHandler::CheckEvents() -{ - EventTime now; - std::list::iterator it = m_events.begin(); - while (it != m_events.end() && (*it) -> GetTime() < now) - { - Event *e = *it; - Socket *s = dynamic_cast(e -> GetFrom()); - /* - s == NULL This is another object implementing 'IEventOwner' and not a socket. - s != NULL This is a Socket implementing IEventOwner, and we can check that the - object instance still is valid using SocketHandler::Valid. - */ - if (!s || (s && Valid( e -> Data() ))) - { - e -> GetFrom() -> OnEvent(e -> GetID()); - } - for (it = m_events.begin(); it != m_events.end(); ++it) - if (*it == e) - { - delete e; - break; - } - if (it != m_events.end()) - m_events.erase(it); - it = m_events.begin(); - } -} - - -long EventHandler::AddEvent(IEventOwner *from,long sec,long usec) -{ - Socket *s = dynamic_cast(from); - Event *e = new Event(from, sec, usec, s ? s -> UniqueIdentifier() : 0); - std::list::iterator it = m_events.begin(); - while (it != m_events.end() && *(*it) < *e) - { - ++it; - } - m_events.insert(it, e); - Release(); - return e -> GetID(); -} - - -void EventHandler::ClearEvents(IEventOwner *from) -{ - bool repeat; - do - { - repeat = false; - for (std::list::iterator it = m_events.begin(); it != m_events.end(); ++it) - { - Event *e = *it; - if (e -> GetFrom() == from) - { - delete e; - m_events.erase(it); - repeat = true; - break; - } - } - } while (repeat); -} - - -void EventHandler::EventLoop() -{ - while (!m_quit) - { - struct timeval tv; - if (GetTimeUntilNextEvent(&tv)) - { - Select(&tv); - CheckEvents(); - } - else - { - Select(); - } - } -} - - -void EventHandler::SetQuit(bool x) -{ - m_quit = x; -} - - -void EventHandler::RemoveEvent(IEventOwner *from, long eid) -{ - for (std::list::iterator it = m_events.begin(); it != m_events.end(); ++it) - { - Event *e = *it; - if (from == e -> GetFrom() && eid == e -> GetID()) - { - delete e; - m_events.erase(it); - break; - } - } -} - - -void EventHandler::Add(Socket *p) -{ - SocketHandler::Add( p ); -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.h deleted file mode 100755 index 1dc0425e0f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.h +++ /dev/null @@ -1,88 +0,0 @@ -/** \file EventHandler.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_EventHandler_H -#define _SOCKETS_EventHandler_H - -#include "sockets-config.h" -#include "SocketHandler.h" -#include "IEventHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class StdLog; -class IEventOwner; -class Event; -class TcpSocket; - -/** SocketHandler implementing the IEventHandler interface. - \ingroup timer */ -class EventHandler : public SocketHandler,public IEventHandler -{ -public: - EventHandler(StdLog * = NULL); - EventHandler(IMutex&,StdLog * = NULL); - ~EventHandler(); - - bool GetTimeUntilNextEvent(struct timeval *tv); - void CheckEvents(); - long AddEvent(IEventOwner *from,long sec,long usec); - void ClearEvents(IEventOwner *from); - void RemoveEvent(IEventOwner *from,long eid); - - /** SocketHandler while() loop implemented with event functionality. */ - void EventLoop(); - /** Stop event loop. */ - void SetQuit(bool = true); - - void Add(Socket *); - -private: - EventHandler(const EventHandler& ) {} // copy constructor - EventHandler& operator=(const EventHandler& ) { - return *this; // assignment operator - } - std::list m_events; - bool m_quit; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_EventHandler_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.cpp deleted file mode 100755 index ffd607cc25..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/** \file EventTime.cpp - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef MACOSX -#include -#include -#include -#endif -#include "EventTime.h" -#ifdef _WIN32 -#include -#else -#include -#include -#endif - - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -EventTime::EventTime() : m_time(Tick()) -{ -} - - -EventTime::EventTime(mytime_t sec,long usec) : m_time(Tick()) -{ - m_time += sec * 1000000 + usec; -} - - -EventTime::~EventTime() -{ -} - - -mytime_t EventTime::Tick() -{ - mytime_t t; -#ifdef _WIN32 - FILETIME ft; - GetSystemTimeAsFileTime(&ft); - t = ft.dwHighDateTime; - t = t << 32; - t += ft.dwLowDateTime; - t /= 10; // us -#else - struct timeval tv; - struct timezone tz; - gettimeofday(&tv, &tz); - t = tv.tv_sec; - t *= 1000000; - t += tv.tv_usec; -#endif - return t; -} - - -EventTime EventTime::operator - (const EventTime& x) const -{ - EventTime t; - t.m_time = m_time - x.m_time; - return t; -} - - -bool EventTime::operator < (const EventTime& x) const -{ - return m_time < x.m_time; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.h deleted file mode 100755 index 1342622061..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.h +++ /dev/null @@ -1,84 +0,0 @@ -/** \file EventTime.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_EventTime_H -#define _SOCKETS_EventTime_H - -#include "sockets-config.h" -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -#if defined( _WIN32) && !defined(__CYGWIN__) -typedef __int64 mytime_t; -#else -#include // int64_t -typedef int64_t mytime_t; -#endif - - -/** \defgroup timer EventTimer event handling */ - -/** EventTime primitive, returns current time as a 64-bit number. - \ingroup timer */ -class EventTime -{ -public: - EventTime(); - EventTime(mytime_t sec,long usec); - ~EventTime(); - - static mytime_t Tick(); - - operator mytime_t () { - return m_time; - } - EventTime operator - (const EventTime& x) const; - bool operator < (const EventTime& x) const; - -private: - EventTime(const EventTime& ) {} // copy constructor - EventTime& operator=(const EventTime& ) { - return *this; // assignment operator - } - mytime_t m_time; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_EventTime_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.cpp deleted file mode 100755 index f3898a0805..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/** - ** \file Exception.cpp - ** \date 2007-09-28 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "Exception.h" -#include "Utility.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - - -Exception::Exception(const std::string& description) : m_description(description) -, m_stack(Utility::Stack()) -{ -} - - -const std::string Exception::ToString() const -{ - return m_description; -} - - -const std::string Exception::Stack() const -{ - return m_stack; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.h deleted file mode 100755 index 52f96e4262..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - ** \file Exception.h - ** \date 2007-09-28 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _Sockets_Exception_H -#define _Sockets_Exception_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - - -class Exception -{ -public: - Exception(const std::string& description); - virtual ~Exception() {} - - virtual const std::string ToString() const; - virtual const std::string Stack() const; - - Exception(const Exception& ) {} // copy constructor - - Exception& operator=(const Exception& ) { - return *this; // assignment operator - } - -private: - std::string m_description; - std::string m_stack; - -}; - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _Sockets_Exception_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.cpp deleted file mode 100755 index fd9069ee91..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/** \file File.cpp - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include -#include -#include - -#include "File.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -File::File() -:m_fil(NULL) -,m_b_close(true) -,m_rptr(0) -,m_wptr(0) -{ -} - - -File::File(FILE *fil) -:m_fil(fil) -,m_b_close(false) -,m_rptr(0) -,m_wptr(0) -{ -} - - -File::File(const std::string& path, const std::string& mode) -:m_fil(NULL) -,m_b_close(true) -,m_rptr(0) -,m_wptr(0) -{ - fopen(path, mode); -} - - -File::~File() -{ - if (m_b_close) - { - fclose(); - } -} - - -bool File::fopen(const std::string& path, const std::string& mode) -{ - m_path = path; - m_mode = mode; -#if defined( _WIN32) && !defined(__CYGWIN__) - if (fopen_s(&m_fil, path.c_str(), mode.c_str())) - m_fil = NULL; -#else - m_fil = ::fopen(path.c_str(), mode.c_str()); -#endif - - return m_fil ? true : false; -} - - -void File::fclose() const -{ - if (m_fil) - { - ::fclose(m_fil); - m_fil = NULL; - } -} - - - -size_t File::fread(char *ptr, size_t size, size_t nmemb) const -{ - size_t r = 0; - if (m_fil) - { - fseek(m_fil, m_rptr, SEEK_SET); - r = ::fread(ptr, size, nmemb, m_fil); - m_rptr = ftell(m_fil); - } - return r; -} - - -size_t File::fwrite(const char *ptr, size_t size, size_t nmemb) -{ - size_t r = 0; - if (m_fil) - { - fseek(m_fil, m_wptr, SEEK_SET); - r = ::fwrite(ptr, size, nmemb, m_fil); - m_wptr = ftell(m_fil); - } - return r; -} - - - -char *File::fgets(char *s, int size) const -{ - char *r = NULL; - if (m_fil) - { - fseek(m_fil, m_rptr, SEEK_SET); - r = ::fgets(s, size, m_fil); - m_rptr = ftell(m_fil); - } - return r; -} - - -void File::fprintf(const char *format, ...) -{ - if (!m_fil) - return; - va_list ap; - va_start(ap, format); - fseek(m_fil, m_wptr, SEEK_SET); - vfprintf(m_fil, format, ap); - m_wptr = ftell(m_fil); - va_end(ap); -} - - -off_t File::size() const -{ - struct stat st; - if (stat(m_path.c_str(), &st) == -1) - { - return 0; - } - return st.st_size; -} - - -bool File::eof() const -{ - if (m_fil) - { - if (feof(m_fil)) - return true; - } - return false; -} - - -void File::reset_read() const -{ - m_rptr = 0; -} - - -void File::reset_write() -{ - m_wptr = 0; -} - - -const std::string& File::Path() const -{ - return m_path; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.h deleted file mode 100755 index 9abc510124..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.h +++ /dev/null @@ -1,95 +0,0 @@ -/** \file File.h - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_File_H -#define _SOCKETS_File_H - -#include "sockets-config.h" -#include "IFile.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** IFile implementation of a disk file. - \ingroup file */ -class File : public IFile -{ -public: - File(); - File(FILE *); - /** convenience: calls fopen() */ - File(const std::string& path, const std::string& mode); - ~File(); - - bool fopen(const std::string& path, const std::string& mode); - void fclose() const; - - size_t fread(char *, size_t, size_t) const; - size_t fwrite(const char *, size_t, size_t); - - char *fgets(char *, int) const; - void fprintf(const char *format, ...); - - off_t size() const; - bool eof() const; - - void reset_read() const; - void reset_write(); - - const std::string& Path() const; - -private: - File(const File& ) {} // copy constructor - File& operator=(const File& ) { - return *this; // assignment operator - } - - std::string m_path; - std::string m_mode; - mutable FILE *m_fil; - bool m_b_close; - mutable long m_rptr; - long m_wptr; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_File_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.cpp deleted file mode 100755 index d61ed983cd..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - ** \file FileStream.cpp - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "FileStream.h" -#include "IFile.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -FileStream::FileStream(IFile& file) : m_file(file) -{ -} - - -size_t FileStream::IStreamRead(char *buf, size_t max_sz) -{ - return m_file.fread(buf, 1, max_sz); -} - - -void FileStream::IStreamWrite(const char *buf, size_t sz) -{ - m_file.fwrite(buf, 1, sz); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.h deleted file mode 100755 index 7e41ee78cb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - ** \file FileStream.h - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_FileStream_H -#define _SOCKETS_FileStream_H - -#include "IStream.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IFile; - -class FileStream : public IStream -{ -public: - FileStream(IFile& file); - - size_t IStreamRead(char *buf, size_t max_sz); - - void IStreamWrite(const char *buf, size_t sz); - -private: - IFile& m_file; -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_FileStream_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.cpp deleted file mode 100755 index a316dd17ec..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.cpp +++ /dev/null @@ -1,519 +0,0 @@ -/** \file HTTPSocket.cpp - ** \date 2004-04-06 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HTTPSocket.h" -#include "Parse.h" -#include "ISocketHandler.h" -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HTTPSocket::HTTPSocket(ISocketHandler& h) -:TcpSocket(h) -,m_first(true) -,m_header(true) -,m_http_version("HTTP/1.0") -,m_request(false) -,m_response(false) -,m_body_size_left(0) -,m_b_http_1_1(false) -,m_b_keepalive(false) -,m_b_chunked(false) -,m_chunk_size(0) -,m_chunk_state(0) -,m_header_count(0) -,m_max_header_count(MAX_HTTP_HEADER_COUNT) -{ - SetLineProtocol(); - DisableInputBuffer(); -} - - -HTTPSocket::~HTTPSocket() -{ -} - - -void HTTPSocket::OnRawData(const char *buf,size_t len) -{ - if (!m_header) - { - if (m_b_chunked) - { - size_t ptr = 0; - while (ptr < len) - { - switch (m_chunk_state) - { - case 4: - while (ptr < len && (m_chunk_line.size() < 2 || m_chunk_line.substr(m_chunk_line.size() - 2) != "\r\n")) - m_chunk_line += buf[ptr++]; - if (m_chunk_line.size() > 1 && m_chunk_line.substr(m_chunk_line.size() - 2) == "\r\n") - { - OnDataComplete(); - // prepare for next request(or response) - m_b_chunked = false; - SetLineProtocol( true ); - m_first = true; - m_header = true; - m_body_size_left = 0; - if (len - ptr > 0) - { - char tmp[TCP_BUFSIZE_READ]; - memcpy(tmp, buf + ptr, len - ptr); - tmp[len - ptr] = 0; - OnRead( tmp, len - ptr ); - ptr = len; - } - } - break; - case 0: - while (ptr < len && (m_chunk_line.size() < 2 || m_chunk_line.substr(m_chunk_line.size() - 2) != "\r\n")) - m_chunk_line += buf[ptr++]; - if (m_chunk_line.size() > 1 && m_chunk_line.substr(m_chunk_line.size() - 2) == "\r\n") - { - m_chunk_line.resize(m_chunk_line.size() - 2); - Parse pa(m_chunk_line, ";"); - std::string size_str = pa.getword(); - m_chunk_size = Utility::hex2unsigned(size_str); - if (!m_chunk_size) - { - m_chunk_state = 4; - m_chunk_line = ""; - } - else - { - m_chunk_state = 1; - m_chunk_line = ""; - } - } - break; - case 1: - { - size_t left = len - ptr; - size_t sz = m_chunk_size < left ? m_chunk_size : left; - OnData(buf + ptr, sz); - m_chunk_size -= sz; - ptr += sz; - if (!m_chunk_size) - { - m_chunk_state = 2; - } - } - break; - case 2: // skip CR - ptr++; - m_chunk_state = 3; - break; - case 3: // skip LF - ptr++; - m_chunk_state = 0; - break; - } - } - } - else - if (!m_b_http_1_1 || !m_b_keepalive) - { - OnData(buf, len); - /* - request is HTTP/1.0 _or_ HTTP/1.1 and not keep-alive - - This means we destroy the connection after the response has been delivered, - hence no need to reset all internal state variables for a new incoming - request. - */ - m_body_size_left -= len; - if (!m_body_size_left) - { - OnDataComplete(); - } - } - else - { - size_t sz = m_body_size_left < len ? m_body_size_left : len; - OnData(buf, sz); - m_body_size_left -= sz; - if (!m_body_size_left) - { - OnDataComplete(); - // prepare for next request(or response) - SetLineProtocol( true ); - m_first = true; - m_header = true; - m_body_size_left = 0; - if (len - sz > 0) - { - char tmp[TCP_BUFSIZE_READ]; - memcpy(tmp, buf + sz, len - sz); - tmp[len - sz] = 0; - OnRead( tmp, len - sz ); - } - } - } - } -} - - -void HTTPSocket::OnLine(const std::string& line) -{ - if (m_first) - { - Parse pa(line); - std::string str = pa.getword(); - if (str.size() > 4 && Utility::ToLower(str.substr(0,5)) == "http/") // response - { - m_http_version = str; - m_status = pa.getword(); - m_status_text = pa.getrest(); - m_response = true; - } - else // request - { - m_method = str; - m_url = pa.getword(); - size_t spl = m_url.find("?"); - if (spl != std::string::npos) - { - m_uri = m_url.substr(0,spl); - m_query_string = m_url.substr(spl + 1); - } - else - { - m_uri = m_url; - m_query_string = ""; - } - m_http_version = pa.getword(); - m_b_http_1_1 = m_http_version.size() > 4 && m_http_version.substr(4) == "/1.1"; - m_b_keepalive = m_b_http_1_1; - m_request = true; - } - m_first = false; - OnFirst(); - return; - } - if (!line.size()) - { - if (m_body_size_left || !m_b_http_1_1 || !m_b_keepalive || m_b_chunked) - { - SetLineProtocol(false); - m_header = false; - } - OnHeaderComplete(); - if (!m_body_size_left && !m_b_chunked) - { - OnDataComplete(); - } - return; - } - Parse pa(line,":"); - std::string key = pa.getword(); - std::string value = pa.getrest(); - OnHeader(key,value); - if (Utility::ToLower(key) == "content-length") - { - m_body_size_left = atol(value.c_str()); - } - if (m_b_http_1_1 && Utility::ToLower(key) == "connection") - { - m_b_keepalive = Utility::ToLower(value) != "close"; - } - if (Utility::ToLower(key) == "transfer-encoding" && Utility::ToLower(value) == "chunked") - { - m_b_chunked = true; - } - /* If remote end tells us to keep connection alive, and we're operating - in http/1.1 mode (not http/1.0 mode), then we mark the socket to be - retained. */ -#ifdef ENABLE_POOL - if (m_b_http_1_1 && m_b_keepalive) - { - SetRetain(); - } -#endif - if (m_header_count++ > m_max_header_count) - { - SetCloseAndDelete(); - Handler().LogError(this, "OnLine", m_header_count, "http header count exceeds builtin limit of (" + Utility::l2string(m_max_header_count) + ")", LOG_LEVEL_FATAL); - } -} - - -void HTTPSocket::SendResponse() -{ - std::string msg; - msg = m_http_version + " " + m_status + " " + m_status_text + "\r\n"; - for (string_m::iterator it = m_response_header.begin(); it != m_response_header.end(); ++it) - { - std::string key = (*it).first; - std::string val = (*it).second; - msg += key + ": " + val + "\r\n"; - } - for (std::list >::iterator it2 = m_response_header_append.begin(); it2 != m_response_header_append.end(); ++it2) - { - msg += it2 -> first + ": " + it2 -> second + "\r\n"; - } - msg += "\r\n"; - Send( msg ); -} - - -void HTTPSocket::AddResponseHeader(const std::string& header, const char *format, ...) -{ - char slask[8192]; // temporary for vsprintf / vsnprintf - va_list ap; - - va_start(ap, format); - vsnprintf(slask, sizeof(slask), format, ap); - va_end(ap); - - m_response_header[header] = slask; -} - - -void HTTPSocket::SendRequest() -{ - std::string msg; - msg = m_method + " " + m_url + " " + m_http_version + "\r\n"; - for (string_m::iterator it = m_response_header.begin(); it != m_response_header.end(); ++it) - { - std::string key = (*it).first; - std::string val = (*it).second; - msg += key + ": " + val + "\r\n"; - } - msg += "\r\n"; - Send( msg ); -} - - -std::string HTTPSocket::MyUseragent() -{ - std::string version = "C++Sockets/"; -#ifdef _VERSION - version += _VERSION; -#endif - return version; -} - - -void HTTPSocket::Reset() -{ - m_first = true; - m_header = true; - m_request = false; - m_response = false; - SetLineProtocol(true); - while (m_response_header.size()) - { - string_m::iterator it = m_response_header.begin(); - m_response_header.erase(it); - } - while (m_response_header_append.size()) - { - std::list >::iterator it = m_response_header_append.begin(); - m_response_header_append.erase(it); - } - m_header_count = 0; - -} - - -const std::string& HTTPSocket::GetMethod() -{ - return m_method; -} - - -void HTTPSocket::SetMethod(const std::string& x) -{ - m_method = x; -} - - -const std::string& HTTPSocket::GetUrl() -{ - return m_url; -} - - -void HTTPSocket::SetUrl(const std::string& x) -{ - m_url = x; -} - - -const std::string& HTTPSocket::GetUri() -{ - return m_uri; -} - - -const std::string& HTTPSocket::GetQueryString() -{ - return m_query_string; -} - - -const std::string& HTTPSocket::GetHttpVersion() -{ - return m_http_version; -} - - -const std::string& HTTPSocket::GetStatus() -{ - return m_status; -} - - -const std::string& HTTPSocket::GetStatusText() -{ - return m_status_text; -} - - -bool HTTPSocket::IsRequest() -{ - return m_request; -} - - -bool HTTPSocket::IsResponse() -{ - return m_response; -} - - -void HTTPSocket::SetHttpVersion(const std::string& x) -{ - m_http_version = x; -} - - -void HTTPSocket::SetStatus(const std::string& x) -{ - m_status = x; -} - - -void HTTPSocket::SetStatusText(const std::string& x) -{ - m_status_text = x; -} - - -void HTTPSocket::AddResponseHeader(const std::string& x,const std::string& y) -{ - m_response_header[x] = y; -} - - -void HTTPSocket::AppendResponseHeader(const std::string& x,const std::string& y) -{ - m_response_header_append.push_back(std::pair(x,y)); -} - - -void HTTPSocket::SetUri(const std::string& x) -{ - m_uri = x; -} - - -void HTTPSocket::url_this(const std::string& url_in,std::string& protocol,std::string& host,port_t& port,std::string& url,std::string& file) -{ - Parse pa(url_in,"/"); - protocol = pa.getword(); // http - if (!strcasecmp(protocol.c_str(), "https:")) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - Handler().LogError(this, "url_this", -1, "SSL not available", LOG_LEVEL_WARNING); -#endif - port = 443; - } - else - { - port = 80; - } - host = pa.getword(); - if (strstr(host.c_str(),":")) - { - Parse pa(host,":"); - pa.getword(host); - port = static_cast(pa.getvalue()); - } - url = "/" + pa.getrest(); - { - Parse pa(url,"/"); - std::string tmp = pa.getword(); - while (tmp.size()) - { - file = tmp; - tmp = pa.getword(); - } - } -} // url_this - - -bool HTTPSocket::ResponseHeaderIsSet(const std::string& name) -{ - string_m::iterator it = m_response_header.find( name ); - if (it != m_response_header.end()) - { - return true; - } - std::list >::iterator it2; - for (it2 = m_response_header_append.begin(); it2 != m_response_header_append.end(); ++it2) - { - std::pair& ref = *it2; - if (!strcasecmp(ref.first.c_str(), name.c_str()) ) - { - return true; - } - } - return false; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.h deleted file mode 100755 index 37715618b5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.h +++ /dev/null @@ -1,175 +0,0 @@ -/** \file HTTPSocket.h Class HTTPSocket definition. - ** \date 2004-04-06 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HTTPSocket_H -#define _SOCKETS_HTTPSocket_H - -#include "sockets-config.h" -#include "TcpSocket.h" -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** \defgroup http HTTP Sockets */ -/** HTTP request/response base class. - \ingroup http */ -class HTTPSocket : public TcpSocket -{ - /** map to hold http header values. */ - typedef Utility::ncmap string_m; -public: - HTTPSocket(ISocketHandler& ); - ~HTTPSocket(); - - void OnRawData(const char *buf,size_t len); - void OnLine(const std::string& line); - - /** Callback executes when first line has been received. - GetMethod, GetUrl/GetUri, and GetHttpVersion are valid when this callback is executed. */ - virtual void OnFirst() = 0; - /** For each header line this callback is executed. - \param key Http header name - \param value Http header value */ - virtual void OnHeader(const std::string& key,const std::string& value) = 0; - /** Callback fires when all http headers have been received. */ - virtual void OnHeaderComplete() = 0; - /** Chunk of http body data recevied. */ - virtual void OnData(const char *,size_t) = 0; - /** The full request/response body has been received. */ - virtual void OnDataComplete() {} - - /** Get http method from incoming request, ie GET/POST/PUT etc */ - const std::string& GetMethod(); - /** Set http method to be used in request. */ - void SetMethod(const std::string& x); - /** Get url from request. */ - const std::string& GetUrl(); - /** Set url to be used in outgoing request. */ - void SetUrl(const std::string& x); - /** Get part of url before '?' character. */ - const std::string& GetUri(); - /** Now why would I need this when there is a SetUrl method? */ - void SetUri(const std::string& x); - /** Get part of url after '?' character. */ - const std::string& GetQueryString(); - /** Get http version from incoming request/response. */ - const std::string& GetHttpVersion(); - /** Get http status from incoming response. */ - const std::string& GetStatus(); - /** Get http statustext from incoming response. */ - const std::string& GetStatusText(); - /** Incoming header has been identified as a request (method url http_version\r\n). */ - bool IsRequest(); - /** Incoming header has been identified as a response (http_version status status_text\r\n). */ - bool IsResponse(); - /** Set http version to be used in outgoing request/response. */ - void SetHttpVersion(const std::string& x); - /** Set http status for outgoing response. */ - void SetStatus(const std::string& x); - /** Set http statustext for outgoing response. */ - void SetStatusText(const std::string& x); - /** Add (and replace if exists) http header. */ - void AddResponseHeader(const std::string& x,const std::string& y); - /** Add (and replace if exists) http header. */ - void AddResponseHeader(const std::string& x,const char *format, ...); - /** Add http header. */ - void AppendResponseHeader(const std::string& x,const std::string& y); - /** See if http header 'name' has been set. */ - bool ResponseHeaderIsSet(const std::string& name); - /** Send response prepared with calls to methods SetHttpVersion, SetStatus, SetStatusText, - and AddResponseHeader. */ - void SendResponse(); - /** Send request prepared with calls to methods SetMethod, SetUrl, SetHttpVersion, - and AddResponseHeader. */ - void SendRequest(); - - /** Implement this to return your own User-agent string. */ - virtual std::string MyUseragent(); - - /** Parse url. If protocol is https, EnableSSL() will be called. */ - void url_this(const std::string& url_in,std::string& protocol,std::string& host,port_t& port,std::string& url,std::string& file); - - /** Transfer coding 'chunked' */ - bool IsChunked() { - return m_b_chunked; - } - -protected: - HTTPSocket(const HTTPSocket& s) : TcpSocket(s) {} - /** Reset state of socket to sucessfully implement keep-alive. */ - virtual void Reset(); - - void SetMaxHeaderCount(int x) { - m_max_header_count = x; - } - -private: - HTTPSocket& operator=(const HTTPSocket& ) { - return *this; - } - bool m_first; - bool m_header; - std::string m_line; - std::string m_method; - std::string m_url; - std::string m_uri; - std::string m_query_string; - std::string m_http_version; - std::string m_status; - std::string m_status_text; - bool m_request; - bool m_response; - string_m m_response_header; - size_t m_body_size_left; - bool m_b_http_1_1; - bool m_b_keepalive; - std::list > m_response_header_append; - bool m_b_chunked; - size_t m_chunk_size; - int m_chunk_state; - std::string m_chunk_line; - int m_header_count; - int m_max_header_count; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HTTPSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.cpp deleted file mode 100755 index b4103c6397..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/** - ** \file AjpBaseSocket.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpBaseSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -HttpBaseSocket::HttpBaseSocket(ISocketHandler& h) -:HTTPSocket(h) -,m_b_keepalive(false) -{ -} - - -HttpBaseSocket::~HttpBaseSocket() -{ -} - - -void HttpBaseSocket::OnFirst() -{ -DEB(fprintf(stderr, " %s %s %s\n", GetMethod().c_str(), GetUri().c_str(), GetHttpVersion().c_str());) - m_req.SetHttpMethod( GetMethod() ); - m_req.SetUri( GetUri() ); - m_req.SetHttpVersion( GetHttpVersion() ); - - if (Utility::ToLower(GetMethod()) == "get" && !GetQueryString().empty()) - { - m_req.SetAttribute("query_string", GetQueryString() ); - } - - m_req.SetRemoteAddr( GetRemoteAddress() ); - m_req.SetRemoteHost( "" ); // %! - m_req.SetServerName( GetSockAddress() ); - m_req.SetServerPort( GetSockPort() ); -} - - -void HttpBaseSocket::OnHeader(const std::string& key,const std::string& value) -{ -DEB(fprintf(stderr, " (request)OnHeader %s: %s\n", key.c_str(), value.c_str());) - if (Utility::ToLower(key) == "cookie") - m_req.AddCookie(value); - else - m_req.SetHeader(key, value); -} - - -void HttpBaseSocket::OnHeaderComplete() -{ - m_body_size_left = atol( m_req.Header("content-length").c_str() ); - if (m_body_size_left > 0) - { - m_req.InitBody( m_body_size_left ); - } - else - { - // execute - Execute(); - } -} - - -void HttpBaseSocket::OnData(const char *buf,size_t sz) -{ - m_req.Write( buf, sz ); - m_body_size_left -= sz; - if (!m_body_size_left) - { - m_req.CloseBody(); - - // execute - Execute(); - } -} - - -// -------------------------------------------------------------------------------------- -void HttpBaseSocket::Execute() -{ - // parse form data / query_string and cookie header if available - m_req.ParseBody(); - -DEB(printf(" *** http version: %s\n", m_req.HttpVersion().c_str()); -printf(" *** connection: %s\n", m_req.Header("connection").c_str());) - if ( !(m_req.HttpVersion().size() > 4 && m_req.HttpVersion().substr(m_req.HttpVersion().size() - 4) == "/1.1") || - m_req.Header("connection") == "close") - { - m_b_keepalive = false; -DEB(printf(" *** keepalive: false\n");) - } - else - { - m_b_keepalive = true; -DEB(printf(" *** keepalive: true\n");) - } - - // prepare page - OnExec( m_req ); - - m_req.Reset(); - Reset(); -} - - -// -------------------------------------------------------------------------------------- -void HttpBaseSocket::Respond(const HttpResponse& res) -{ - m_res = res; - - SetHttpVersion( m_res.HttpVersion() ); - SetStatus( Utility::l2string(m_res.HttpStatusCode()) ); - SetStatusText( m_res.HttpStatusMsg() ); - - if (!ResponseHeaderIsSet("content-length")) - { - AddResponseHeader( "content-length", Utility::l2string( m_res.GetFile().size() ) ); - } - for (Utility::ncmap::const_iterator it = m_res.Headers().begin(); it != m_res.Headers().end(); ++it) - { - AddResponseHeader( it -> first, it -> second ); - } - std::list vec = m_res.CookieNames(); - for (std::list::iterator it2 = vec.begin(); it2 != vec.end(); ++it2) - { - AppendResponseHeader( "set-cookie", m_res.Cookie(*it2) ); - } - SendResponse(); - - OnTransferLimit(); -} - - -// -------------------------------------------------------------------------------------- -void HttpBaseSocket::OnTransferLimit() -{ - char msg[32768]; - size_t n = m_res.GetFile().fread(msg, 1, 32768); - while (n > 0) - { - SendBuf( msg, n ); - if (GetOutputLength() > 1) - { - SetTransferLimit( 1 ); - break; - } - n = m_res.GetFile().fread(msg, 1, 32768); - } - if (!GetOutputLength()) - { - SetTransferLimit(0); - m_res.GetFile().fclose(); - OnResponseComplete(); - if (!m_b_keepalive) - { - SetCloseAndDelete(); - } - } -} - - -// -------------------------------------------------------------------------------------- -void HttpBaseSocket::Reset() -{ - HTTPSocket::Reset(); - m_body_size_left = 0; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.h deleted file mode 100755 index 393c5fadcb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - ** \file HttpBaseSocket.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _HttpBaseSocket_H -#define _HttpBaseSocket_H - -#include "HTTPSocket.h" -#include "HttpRequest.h" -#include "IHttpServer.h" -#include "HttpResponse.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpResponse; - -class HttpBaseSocket : public HTTPSocket, public IHttpServer -{ -public: - HttpBaseSocket(ISocketHandler& h); - ~HttpBaseSocket(); - - void OnFirst(); - void OnHeader(const std::string& key,const std::string& value); - void OnHeaderComplete(); - void OnData(const char *,size_t); - - // implements IHttpServer::Respond - void Respond(const HttpResponse& res); - - void OnTransferLimit(); - -protected: - HttpBaseSocket(const HttpBaseSocket& s) : HTTPSocket(s) {} // copy constructor - // - HttpRequest m_req; - HttpResponse m_res; - void Reset(); - -private: - HttpBaseSocket& operator=(const HttpBaseSocket& ) { - return *this; // assignment operator - } - void Execute(); - // - size_t m_body_size_left; - bool m_b_keepalive; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _HttpBaseSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.cpp deleted file mode 100755 index 74d16978a5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/** - ** \file HttpClientSocket.cpp - ** \date 2006-04-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpClientSocket.h" -#include "StdLog.h" -#include "ISocketHandler.h" -#include "File.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HttpClientSocket::HttpClientSocket(ISocketHandler& h) -:HTTPSocket(h) -,m_data_ptr(NULL) -,m_data_size(0) -,m_content_length(0) -,m_data_ptr_set(false) -,m_fil(NULL) -,m_content_ptr(0) -,m_b_complete(false) -,m_b_close_when_complete(false) -{ -} - - -HttpClientSocket::HttpClientSocket(ISocketHandler& h,const std::string& url_in) -:HTTPSocket(h) -,m_data_ptr(NULL) -,m_data_size(0) -,m_content_length(0) -,m_data_ptr_set(false) -,m_fil(NULL) -,m_content_ptr(0) -,m_b_complete(false) -,m_b_close_when_complete(false) -{ - std::string url; - url_this(url_in, m_protocol, m_host, m_port, url, m_url_filename); - SetUrl( url ); -} - - -HttpClientSocket::HttpClientSocket(ISocketHandler& h,const std::string& host, port_t port, const std::string& url_in) -:HTTPSocket(h) -,m_data_ptr(NULL) -,m_data_size(0) -,m_content_length(0) -,m_data_ptr_set(false) -,m_fil(NULL) -,m_content_ptr(0) -,m_b_complete(false) -,m_b_close_when_complete(false) -{ - std::string url; - std::string tmp = "http://" + host + ":" + Utility::l2string(port) + url_in; - url_this(tmp, m_protocol, m_host, m_port, url, m_url_filename); - SetUrl( url ); -} - - -HttpClientSocket::~HttpClientSocket() -{ - if (m_data_ptr && !m_data_ptr_set) - { - delete[] m_data_ptr; - } - if (m_fil) - { - m_fil -> fclose(); - } -} - - -void HttpClientSocket::OnFirst() -{ - if (!IsResponse()) - { - Handler().LogError(this, "OnFirst", 0, "Response expected but not received - aborting", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - m_content = GetHttpVersion() + " " + GetStatus() + " " + GetStatusText() + "\r\n"; -} - - -void HttpClientSocket::OnHeader(const std::string& key,const std::string& value) -{ - m_content += key + ": " + value + "\r\n"; - if (!strcasecmp(key.c_str(), "content-length")) - { - m_content_length = atoi(value.c_str()); - } - else - if (!strcasecmp(key.c_str(), "content-type")) - { - m_content_type = value; - } -} - - -void HttpClientSocket::OnHeaderComplete() -{ - if (m_filename.size()) - { - m_fil = new File; - if (!m_fil -> fopen(m_filename, "wb")) - { - delete m_fil; - m_fil = NULL; - } - } - else - if (!m_data_ptr && m_content_length) - { - m_data_ptr = new unsigned char[m_content_length]; - m_data_size = m_content_length; - } -} - - -void HttpClientSocket::OnData(const char *buf,size_t len) -{ - if (m_fil) - { - m_fil -> fwrite(buf, 1, len); - } - else - if (m_data_ptr) - { - if (m_content_ptr + len > m_data_size) - { - Handler().LogError(this, "OnData", -1, "content buffer overflow", LOG_LEVEL_ERROR); - } - else - { - memcpy(m_data_ptr + m_content_ptr, buf, len); - } - } - m_content_ptr += len; - if (m_content_ptr == m_content_length && m_content_length) - { - if (m_fil) - { - m_fil -> fclose(); - delete m_fil; - m_fil = NULL; - } - m_b_complete = true; - OnContent(); - if (m_b_close_when_complete) - { - SetCloseAndDelete(); - } - } -} - - -void HttpClientSocket::OnDelete() -{ - if (!m_b_complete) - { - if (m_fil) - { - m_fil -> fclose(); - delete m_fil; - m_fil = NULL; - } - m_b_complete = true; - OnContent(); - } -} - - -void HttpClientSocket::SetFilename(const std::string& x) -{ - m_filename = x; -} - - -void HttpClientSocket::SetDataPtr(unsigned char *buf,size_t len) -{ - m_data_ptr = buf; - m_data_size = len; - m_data_ptr_set = true; -} - - -const std::string& HttpClientSocket::GetContent() -{ - return m_content; -} - - -size_t HttpClientSocket::GetContentLength() -{ - return m_content_length; -} - - -size_t HttpClientSocket::GetContentPtr() -{ - return m_content_ptr; -} - - -size_t HttpClientSocket::GetPos() -{ - return m_content_ptr; -} - - -bool HttpClientSocket::Complete() -{ - return m_b_complete; -} - - -const unsigned char *HttpClientSocket::GetDataPtr() const -{ - return m_data_ptr; -} - - -void HttpClientSocket::OnContent() -{ -} - - -void HttpClientSocket::SetCloseOnComplete(bool x) -{ - m_b_close_when_complete = x; -} - - -const std::string& HttpClientSocket::GetUrlProtocol() -{ - return m_protocol; -} - - -const std::string& HttpClientSocket::GetUrlHost() -{ - return m_host; -} - - -port_t HttpClientSocket::GetUrlPort() -{ - return m_port; -} - - -const std::string& HttpClientSocket::GetUrlFilename() -{ - return m_url_filename; -} - - -const std::string& HttpClientSocket::GetContentType() -{ - return m_content_type; -} - - -void HttpClientSocket::Url(const std::string& url_in,std::string& host,port_t& port) -{ - std::string url; - url_this(url_in, m_protocol, m_host, m_port, url, m_url_filename); - SetUrl(url); - host = GetUrlHost(); - port = GetUrlPort(); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.h deleted file mode 100755 index f2e9f83b0a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - ** \file HttpClientSocket.h - ** \date 2006-04-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpClientSocket_H -#define _SOCKETS_HttpClientSocket_H - -#include "sockets-config.h" -#include "HTTPSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IFile; - -/** Get http response to file or memory. - \ingroup http */ -class HttpClientSocket : public HTTPSocket -{ -public: - HttpClientSocket(ISocketHandler&); - HttpClientSocket(ISocketHandler&,const std::string& url_in); - HttpClientSocket(ISocketHandler&,const std::string& host, port_t port, const std::string& url_in); - ~HttpClientSocket(); - - /** Parse url to protocol,host,port,url and file. */ - void Url(const std::string& url_in,std::string& host,port_t& port); - - void OnFirst(); - void OnHeader(const std::string&,const std::string&); - void OnHeaderComplete(); - void OnData(const char *,size_t); - void OnDelete(); - - /** New callback method fires when all data is received. */ - virtual void OnContent(); - - /** Write response to this file */ - void SetFilename(const std::string& ); - const std::string& Filename() const { - return m_filename; - } - - /** Store response in this buffer. */ - void SetDataPtr(unsigned char *,size_t); - - /** Get response headers. */ - const std::string& GetContent(); - - /** Get size of response body. */ - size_t GetContentLength(); - - /** Get content type from response header. */ - const std::string& GetContentType(); - - /** Get size of received response body. */ - size_t GetContentPtr(); - /** Get size of received response body. */ - size_t GetPos(); - - /** Complete response has been received. */ - bool Complete(); - - /** Get ptr to response data buffer. */ - const unsigned char *GetDataPtr() const; - - /** Close socket when response received. */ - void SetCloseOnComplete(bool = true); - - /** Get protocol used from url. */ - const std::string& GetUrlProtocol(); - /** Get hostname from url. */ - const std::string& GetUrlHost(); - /** Get port from url. */ - port_t GetUrlPort(); - /** Get filename part of url. */ - const std::string& GetUrlFilename(); - -protected: - HttpClientSocket(const HttpClientSocket& s) : HTTPSocket(s) {} // copy constructor - HttpClientSocket& operator=(const HttpClientSocket& ) { - return *this; // assignment operator - } -private: - std::string m_filename; ///< Filename to write response to - unsigned char *m_data_ptr; ///< Ptr to buffer where to store response - size_t m_data_size; ///< Max size of data buffer - size_t m_content_length; ///< Content-length header received from remote - std::string m_content; ///< Received http headers - bool m_data_ptr_set; ///< Buffer set from outside, do not delete - IFile *m_fil; ///< Output file - size_t m_content_ptr; ///< Number of bytes received from body - bool m_b_complete; ///< The entire content-length number of bytes has been received - bool m_b_close_when_complete; ///< Close when the full response has been received - std::string m_protocol; ///< Protocol part of url_in - std::string m_host; ///< Hostname from url_in - port_t m_port; ///< Port from url_in - std::string m_url_filename; ///< Filename from url_in - std::string m_content_type; ///< Content-type: header from response -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // _SOCKETS_HttpClientSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.cpp deleted file mode 100755 index 87cbd749f9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/** \file HttpDebugSocket.cpp - ** \date 2004-10-08 -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom (grymse@alhem.net) - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpDebugSocket.h" -#include "ISocketHandler.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HttpDebugSocket::HttpDebugSocket(ISocketHandler& h) : HTTPSocket(h) -,m_content_length(0) -,m_read_ptr(0) -{ -} - - -HttpDebugSocket::~HttpDebugSocket() -{ -} - - -void HttpDebugSocket::Init() -{ - if (GetParent() -> GetPort() == 443) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - Handler().LogError(this, "url_this", -1, "SSL not available", LOG_LEVEL_WARNING); -#endif - } -} - - -void HttpDebugSocket::OnFirst() -{ - Send( - "HTTP/1.1 200 OK\n" - "Content-type: text/html\n" - "Connection: close\n" - "Server: HttpDebugSocket/1.0\n" - "\n"); - Send( - "Echo Request" - "

Request Header

"); - Send( "
" - "
" - "
"); - - // enctype 'multipart/form-data' - Sendf("
"); - Sendf("
"); - Sendf("
"); - Sendf(""); - Sendf("
"); - - Send( "
");
-	Send(GetMethod() + " " + GetUrl() + " " + GetHttpVersion() + "\n");
-}
-
-
-void HttpDebugSocket::OnHeader(const std::string& key,const std::string& value)
-{
-	if (!strcasecmp(key.c_str(),"content-length"))
-		m_content_length = atoi(value.c_str());
-
-	Send(key + ": " + value + "\n");
-}
-
-
-void HttpDebugSocket::OnHeaderComplete()
-{
-	if (m_content_length || IsChunked())
-	{
-		Send("

Request Body

");
-	}
-	else
-	{
-		Send("

"); - SetCloseAndDelete(); - } -} - - -void HttpDebugSocket::OnData(const char *p,size_t l) -{ - SendBuf(p,l); - m_read_ptr += (int)l; - if (m_read_ptr >= m_content_length && m_content_length) - { - Send("
"); - SetCloseAndDelete(); - } -} - - -void HttpDebugSocket::OnDataComplete() -{ - if (!CloseAndDelete()) - { - Send("
"); - SetCloseAndDelete(); - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.h deleted file mode 100755 index cd0b82d3ea..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.h +++ /dev/null @@ -1,76 +0,0 @@ -/** \file HttpDebugSocket.h - ** \date 2004-09-27 -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom (grymse@alhem.net) - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpDebugSocket_H -#define _SOCKETS_HttpDebugSocket_H - -#include "sockets-config.h" -#include "HTTPSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class ISocketHandler; - -/** HTTP request "echo" class. This class echoes a http request/body -with a html formatted page. - \ingroup http */ -class HttpDebugSocket : public HTTPSocket -{ -public: - HttpDebugSocket(ISocketHandler&); - ~HttpDebugSocket(); - - void Init(); - - void OnFirst(); - void OnHeader(const std::string& key,const std::string& value); - void OnHeaderComplete(); - void OnData(const char *,size_t); - void OnDataComplete(); - -private: - HttpDebugSocket(const HttpDebugSocket& s) : HTTPSocket(s) {} // copy constructor - HttpDebugSocket& operator=(const HttpDebugSocket& ) { - return *this; // assignment operator - } - int m_content_length; - int m_read_ptr; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpDebugSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.cpp deleted file mode 100755 index f7fd7e84d8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/** \file HttpGetSocket.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#else -#include -#endif -#include "ISocketHandler.h" -#include "HttpGetSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HttpGetSocket::HttpGetSocket(ISocketHandler& h) : HttpClientSocket(h) -{ -} - - -HttpGetSocket::HttpGetSocket(ISocketHandler& h,const std::string& url_in,const std::string& to_file) : HttpClientSocket(h, url_in) -{ - if (to_file.size()) - { - SetFilename(to_file); - } - if (!Open(GetUrlHost(),GetUrlPort())) - { - if (!Connecting()) - { - Handler().LogError(this, "HttpGetSocket", -1, "connect() failed miserably", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } -} - - -HttpGetSocket::HttpGetSocket(ISocketHandler& h,const std::string& host,port_t port,const std::string& url,const std::string& to_file) : HttpClientSocket(h, host, port, url) -{ - SetUrl(url); - if (to_file.size()) - { - SetFilename(to_file); - } - if (!Open(host, port)) - { - if (!Connecting()) - { - Handler().LogError(this, "HttpGetSocket", -1, "connect() failed miserably", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } -} - - -HttpGetSocket::~HttpGetSocket() -{ -} - - -void HttpGetSocket::OnConnect() -{ - SetMethod( "GET" ); - AddResponseHeader( "Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1"); - AddResponseHeader( "Accept-Language", "en-us,en;q=0.5"); - AddResponseHeader( "Accept-Encoding", "gzip,deflate"); - AddResponseHeader( "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); - AddResponseHeader( "User-agent", MyUseragent() ); - - if (GetUrlPort() != 80 && GetUrlPort() != 443) - AddResponseHeader( "Host", GetUrlHost() + ":" + Utility::l2string(GetUrlPort()) ); - else - AddResponseHeader( "Host", GetUrlHost() ); - SendRequest(); -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.h deleted file mode 100755 index 0fb96a23bd..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.h +++ /dev/null @@ -1,71 +0,0 @@ -/** \file HttpGetSocket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpGetSocket_H -#define _SOCKETS_HttpGetSocket_H - -#include "sockets-config.h" -#include "HttpClientSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Get http page. - \ingroup http */ -class HttpGetSocket : public HttpClientSocket -{ -public: - HttpGetSocket(ISocketHandler&); - HttpGetSocket(ISocketHandler&,const std::string& url,const std::string& to_file = ""); - HttpGetSocket(ISocketHandler&,const std::string& host,port_t port,const std::string& url,const std::string& to_file = ""); - ~HttpGetSocket(); - - void OnConnect(); - -protected: - HttpGetSocket& operator=(const HttpGetSocket& ) { - return *this; - } - HttpGetSocket(const HttpGetSocket& s) : HttpClientSocket(s) {} -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpGetSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.cpp deleted file mode 100755 index 97a44eb229..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/** \file HttpPostSocket.cpp - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#pragma warning(disable:4503) -#endif -#else -#include -#include -#endif -#include "ISocketHandler.h" -#include -#include -#include "Lock.h" -#include "File.h" - -#include "HttpPostSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -int HttpPostSocket::m_boundary_count = 0; -Mutex HttpPostSocket::m_boundary_mutex; - - -HttpPostSocket::HttpPostSocket(ISocketHandler& h) : HttpClientSocket(h) -,m_bMultipart(false) -{ -} - - -HttpPostSocket::HttpPostSocket(ISocketHandler& h,const std::string& url_in) : HttpClientSocket(h, url_in) -,m_bMultipart(false) -{ - Lock lock(m_boundary_mutex); - - m_boundary = "----"; - for (int i = 0; i < 12; i++) - { - char c = m_boundary_count++ % 128; - while (!isalnum(c)) - c = m_boundary_count++ % 128; - m_boundary += c; - } - m_boundary += "__" + Utility::l2string(m_boundary_count++); -} - - -HttpPostSocket::~HttpPostSocket() -{ -} - - -void HttpPostSocket::AddField(const std::string& name,const std::string& value) -{ - std::list vec; - vec.push_back(value); - AddMultilineField(name, vec); -} - - -void HttpPostSocket::AddMultilineField(const std::string& name,std::list& values) -{ - m_fields[name] = values; -} - - -void HttpPostSocket::AddFile(const std::string& name,const std::string& filename,const std::string& type) -{ - struct stat st; - if (!stat(filename.c_str(), &st)) - { - m_files[name] = filename; - m_content_length[filename] = st.st_size; - m_content_type[filename] = type; - m_bMultipart = true; - } - else - { - Handler().LogError(this, "AddFile", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } -} - - -void HttpPostSocket::Open() -{ - // why do I have to specify TcpSocket:: to get to the Open() method?? - TcpSocket::Open(GetUrlHost(), GetUrlPort()); -} - - -void HttpPostSocket::OnConnect() -{ - if (m_bMultipart) - { - DoMultipartPost(); - } - else - { - std::string body; - - // only fields, no files, add urlencoding - for (std::map >::iterator it = m_fields.begin(); it != m_fields.end(); ++it) - { - std::string name = (*it).first; - std::list& ref = (*it).second; - if (body.size()) - { - body += '&'; - } - body += name + "="; - bool first = true; - for (std::list::iterator it = ref.begin(); it != ref.end(); ++it) - { - std::string value = *it; - if (!first) - { - body += "%0d%0a"; // CRLF - } - body += Utility::rfc1738_encode(value); - first = false; - } - } - - // build header, send body - SetMethod("POST"); - SetHttpVersion( "HTTP/1.1" ); - AddResponseHeader( "Host", GetUrlHost() ); // oops - this is actually a request header that we're adding.. - AddResponseHeader( "User-agent", MyUseragent()); - AddResponseHeader( "Accept", "text/html, text/plain, */*;q=0.01" ); - AddResponseHeader( "Connection", "close" ); - AddResponseHeader( "Content-type", "application/x-www-form-urlencoded" ); - AddResponseHeader( "Content-length", Utility::l2string((long)body.size()) ); - SendRequest(); - - // send body - Send( body ); - } -} - - -void HttpPostSocket::DoMultipartPost() -{ - long length = 0; // calculate content_length of our post body - std::string tmp; - - // fields - { - for (std::map >::iterator it = m_fields.begin(); it != m_fields.end(); ++it) - { - std::string name = (*it).first; - std::list& ref = (*it).second; - tmp = "--" + m_boundary + "\r\n" - "content-disposition: form-data; name=\"" + name + "\"\r\n" - "\r\n"; - for (std::list::iterator it = ref.begin(); it != ref.end(); ++it) - { - std::string value = *it; - tmp += value + "\r\n"; - } - length += (long)tmp.size(); - } - } - - // files - { - for (std::map::iterator it = m_files.begin(); it != m_files.end(); ++it) - { - std::string name = (*it).first; - std::string filename = (*it).second; - long content_length = m_content_length[filename]; - std::string content_type = m_content_type[filename]; - tmp = "--" + m_boundary + "\r\n" - "content-disposition: form-data; name=\"" + name + "\"; filename=\"" + filename + "\"\r\n" - "content-type: " + content_type + "\r\n" - "\r\n"; - length += (long)tmp.size(); - length += content_length; - length += 2; // crlf after file - } - } - - // end - tmp = "--" + m_boundary + "--\r\n"; - length += (long)tmp.size(); - - // build header, send body - SetMethod("POST"); - SetHttpVersion( "HTTP/1.1" ); - AddResponseHeader( "Host", GetUrlHost() ); // oops - this is actually a request header that we're adding.. - AddResponseHeader( "User-agent", MyUseragent()); - AddResponseHeader( "Accept", "text/html, text/plain, */*;q=0.01" ); - AddResponseHeader( "Connection", "close" ); - AddResponseHeader( "Content-type", "multipart/form-data; boundary=" + m_boundary ); - AddResponseHeader( "Content-length", Utility::l2string(length) ); - - SendRequest(); - - // send fields - { - for (std::map >::iterator it = m_fields.begin(); it != m_fields.end(); ++it) - { - std::string name = (*it).first; - std::list& ref = (*it).second; - tmp = "--" + m_boundary + "\r\n" - "content-disposition: form-data; name=\"" + name + "\"\r\n" - "\r\n"; - for (std::list::iterator it = ref.begin(); it != ref.end(); ++it) - { - std::string value = *it; - tmp += value + "\r\n"; - } - Send( tmp ); - } - } - - // send files - { - for (std::map::iterator it = m_files.begin(); it != m_files.end(); ++it) - { - std::string name = (*it).first; - std::string filename = (*it).second; - std::string content_type = m_content_type[filename]; - tmp = "--" + m_boundary + "\r\n" - "content-disposition: form-data; name=\"" + name + "\"; filename=\"" + filename + "\"\r\n" - "content-type: " + content_type + "\r\n" - "\r\n"; - Send( tmp ); - { - std::auto_ptr fil = std::auto_ptr(new File); - if (fil -> fopen(filename, "rb")) - { - char slask[2000]; // for fread - size_t n; - while ((n = fil -> fread(slask, 1, 2000)) > 0) - { - SendBuf(slask, n); - } - fil -> fclose(); - } - } - Send("\r\n"); - } - } - - // end of send - Send("--" + m_boundary + "--\r\n"); -} - - -void HttpPostSocket::SetMultipart() -{ - m_bMultipart = true; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.h deleted file mode 100755 index 2985d6d6f7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.h +++ /dev/null @@ -1,101 +0,0 @@ -/** \file HttpPostSocket.h - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpPostSocket_H -#define _SOCKETS_HttpPostSocket_H - -#include "sockets-config.h" -#include "HttpClientSocket.h" -#include "Mutex.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class ISocketHandler; - -/** Generate a http post request, get response. - \ingroup http */ -class HttpPostSocket : public HttpClientSocket -{ -public: - HttpPostSocket(ISocketHandler&); - /* client constructor, - \param url_in = 'http://host:port/resource' */ - HttpPostSocket(ISocketHandler&,const std::string& url_in); - ~HttpPostSocket(); - - // these must be specified before connecting / adding to handler - /** Add field to post. */ - void AddField(const std::string& name,const std::string& value); - /** Add multiline field to post. */ - void AddMultilineField(const std::string& name,std::list& values); - /** Add file to post. */ - void AddFile(const std::string& name,const std::string& filename,const std::string& type); - - /** use this to post with content-type multipart/form-data. - // when adding a file to the post, this is the default and only content-type */ - void SetMultipart(); - - /** connect to host:port derived from url in constructor */ - void Open(); - - /** http put client implemented in OnConnect */ - void OnConnect(); - -protected: - std::map > m_fields; - -private: - HttpPostSocket(const HttpPostSocket& s) : HttpClientSocket(s) {} // copy constructor - HttpPostSocket& operator=(const HttpPostSocket& ) { - return *this; // assignment operator - } - void DoMultipartPost(); - // - std::map m_files; - std::string m_boundary; - std::map m_content_length; - std::map m_content_type; - bool m_bMultipart; - static int m_boundary_count; - static Mutex m_boundary_mutex; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpPostSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.cpp deleted file mode 100755 index b9eb64d1dc..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/** \file HttpPutSocket.cpp - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#else -#include -#endif -#include "ISocketHandler.h" -#include -#include -#include "File.h" - -#include "HttpPutSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HttpPutSocket::HttpPutSocket(ISocketHandler& h) : HttpClientSocket(h) -{ -} - - -HttpPutSocket::HttpPutSocket(ISocketHandler& h,const std::string& url_in) : HttpClientSocket(h, url_in) -{ -} - - -HttpPutSocket::~HttpPutSocket() -{ -} - - -void HttpPutSocket::SetFile(const std::string& file) -{ - struct stat st; - if (!stat(file.c_str(), &st)) - { - m_filename = file; - m_content_length = st.st_size; - } - else - { - Handler().LogError(this, "SetFile", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } -} - - -void HttpPutSocket::SetContentType(const std::string& type) -{ - m_content_type = type; -} - - - -void HttpPutSocket::Open() -{ - // why do I have to specify TcpSocket:: to get to the Open() method?? - TcpSocket::Open(GetUrlHost(), GetUrlPort()); -} - - -void HttpPutSocket::OnConnect() -{ - SetMethod( "PUT" ); - SetHttpVersion( "HTTP/1.1" ); - AddResponseHeader( "Host", GetUrlHost() ); - AddResponseHeader( "Content-type", m_content_type ); - AddResponseHeader( "Content-length", Utility::l2string(m_content_length) ); - AddResponseHeader( "User-agent", MyUseragent() ); - SendRequest(); - - std::auto_ptr fil = std::auto_ptr(new File); - if (fil -> fopen(m_filename, "rb")) - { - size_t n; - char buf[32768]; - while ((n = fil -> fread(buf, 1, 32768)) > 0) - { - SendBuf(buf, n); - } - fil -> fclose(); - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.h deleted file mode 100755 index 0d1f6c5e31..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.h +++ /dev/null @@ -1,88 +0,0 @@ -/** \file HttpPutSocket.h - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpPutSocket_H -#define _SOCKETS_HttpPutSocket_H - -#include "sockets-config.h" -#include "HttpClientSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class ISocketHandler; - -/** Put http page. - \ingroup http */ -class HttpPutSocket : public HttpClientSocket -{ -public: - HttpPutSocket(ISocketHandler&); - /** client constructor, - \param url_in = 'http://host:port/resource' */ - HttpPutSocket(ISocketHandler&,const std::string& url_in); - ~HttpPutSocket(); - - // these must be specified before connecting / adding to handler - /** Set filename to send. */ - void SetFile(const std::string& ); - /** Set mimetype of file to send. */ - void SetContentType(const std::string& ); - - /** connect to host:port derived from url in constructor */ - void Open(); - - /** http put client implemented in OnConnect */ - void OnConnect(); - -private: - HttpPutSocket(const HttpPutSocket& s) : HttpClientSocket(s) {} // copy constructor - HttpPutSocket& operator=(const HttpPutSocket& ) { - return *this; // assignment operator - } - // - std::string m_filename; - std::string m_content_type; - long m_content_length; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpPutSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.cpp deleted file mode 100755 index 5373c74f0b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/** - ** \file HttpRequest.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpRequest.h" -#include "MemFile.h" -#include "HttpdForm.h" -#include "HttpdCookies.h" -#include "Parse.h" -#include "Exception.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - - -// -------------------------------------------------------------------------------------- -HttpRequest::HttpRequest() : HttpTransaction() -, m_server_port(0) -, m_is_ssl(false) -, m_body_file(NULL) -, m_form(NULL) -{ -} - - -// -------------------------------------------------------------------------------------- -#ifndef _WIN32 -HttpRequest::HttpRequest(FILE *fil) : HttpTransaction() -, m_server_port(0) -, m_is_ssl(false) -, m_body_file(NULL) -, m_form(NULL) -{ - int i = 0; -DEB( std::cout << "Initialize HttpRequest from cgi...\n";) - while (environ[i] && *environ[i]) - { - Parse pa(environ[i], "="); - std::string key = pa.getword(); - std::string value = pa.getrest(); - if (key == "REQUEST_METHOD") - m_method = value; - else - if (key == "SERVER_PROTOCOL") - m_protocol = value; - else - if (key == "PATH_INFO") - m_req_uri = value; - else - if (key == "REMOTE_ADDR") - m_remote_addr = value; - else - if (key == "REMOTE_HOST") - m_remote_host = value; - else - if (key == "SERVER_NAME") - m_server_name = value; - else - if (key == "SERVER_PORT") - m_server_port = atoi(value.c_str()); - else - if (key.size() > 5 && key.substr(0, 5) == "HTTP_") - { - key = key.substr(5); - for (size_t pos = 0; pos < key.size(); pos++) - { - if (key[pos] == '_') - key[pos] = '-'; - else - if (key[pos] >= 'A' && key[pos] <= 'Z') - key[pos] |= 32; - } -DEB( std::cout << " http header '" << key << "' == '" << value << "\n";) - SetHeader(key, value); - } - ++i; - } -DEB( std::cout << " setup http form\n";) - m_form = std::auto_ptr(new HttpdForm(fil)); -} -#endif - - -// -------------------------------------------------------------------------------------- -HttpRequest::HttpRequest(const HttpRequest& src) : HttpTransaction(src) -, m_method(src.m_method) -, m_protocol(src.m_protocol) -, m_req_uri(src.m_req_uri) -, m_remote_addr(src.m_remote_addr) -, m_remote_host(src.m_remote_host) -, m_server_name(src.m_server_name) -, m_server_port(src.m_server_port) -, m_is_ssl(src.m_is_ssl) -, m_attribute(src.m_attribute) -, m_null(src.m_null) -, m_body_file(src.m_body_file) -, m_form(src.m_form) -, m_cookies(src.m_cookies) -, m_cookie(src.m_cookie) -{ -} - - -// -------------------------------------------------------------------------------------- -HttpRequest::~HttpRequest() -{ -} - - -// -------------------------------------------------------------------------------------- -HttpRequest& HttpRequest::operator=(const HttpRequest& src) -{ - m_method = src.m_method; - m_protocol = src.m_protocol; - m_req_uri = src.m_req_uri; - m_remote_addr = src.m_remote_addr; - m_remote_host = src.m_remote_host; - m_server_name = src.m_server_name; - m_server_port = src.m_server_port; - m_is_ssl = src.m_is_ssl; - m_attribute = src.m_attribute; - m_null = src.m_null; - m_body_file = src.m_body_file; - m_form = src.m_form; - m_cookies = src.m_cookies; - m_cookie = src.m_cookie; - - HttpTransaction::operator=(src); - - return *this; -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetHttpMethod(const std::string& value) -{ - m_method = value; -} - - -const std::string& HttpRequest::HttpMethod() const -{ - return m_method; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetHttpVersion(const std::string& value) -{ - m_protocol = value; -} - - -const std::string& HttpRequest::HttpVersion() const -{ - return m_protocol; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetUri(const std::string& value) -{ - m_req_uri = value; -} - - -const std::string& HttpRequest::Uri() const -{ - return m_req_uri; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetRemoteAddr(const std::string& value) -{ - m_remote_addr = value; -} - - -const std::string& HttpRequest::RemoteAddr() const -{ - return m_remote_addr; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetRemoteHost(const std::string& value) -{ - m_remote_host = value; -} - - -const std::string& HttpRequest::RemoteHost() const -{ - return m_remote_host; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetServerName(const std::string& value) -{ - m_server_name = value; -} - - -const std::string& HttpRequest::ServerName() const -{ - return m_server_name; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetServerPort(int value) -{ - m_server_port = value; -} - - -int HttpRequest::ServerPort() const -{ - return m_server_port; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetIsSsl(bool value) -{ - m_is_ssl = value; -} - - -bool HttpRequest::IsSsl() const -{ - return m_is_ssl; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetAttribute(const std::string& key, const std::string& value) -{ - m_attribute[key] = value; -} - - -void HttpRequest::SetAttribute(const std::string& key, long value) -{ - m_attribute[key] = Utility::l2string(value); -} - - -const std::string& HttpRequest::Attribute(const std::string& key) const -{ - Utility::ncmap::const_iterator it; - if ( (it = m_attribute.find(key)) != m_attribute.end()) - return it -> second; - return m_null; -} - - -// -------------------------------------------------------------------------------------- -const Utility::ncmap& HttpRequest::Attributes() const -{ - return m_attribute; -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::AddCookie(const std::string& str) -{ - m_cookies.add( str ); - Parse pa(str, ";"); - std::string lstr = pa.getword(); - while (!lstr.empty()) - { - Parse pa2(lstr, "="); - std::string name = pa2.getword(); - m_cookie[name] = lstr; -DEB(fprintf(stderr, " *** AddCookie '%s' = '%s'\n", name.c_str(), lstr.c_str());) - lstr = pa.getword(); - } -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::InitBody( size_t sz ) -{ - if (!m_body_file.get()) - m_body_file = std::auto_ptr(new MemFile); -DEB( else - fprintf(stderr, "Body data file already opened\n");) -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::Write( const char *buf, size_t sz ) -{ - if (m_body_file.get()) - m_body_file -> fwrite(buf, 1, sz); -DEB( else - fprintf(stderr, "Write: Body data file not open\n");) -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::CloseBody() -{ - if (m_body_file.get()) - m_body_file -> fclose(); -DEB( else - fprintf(stderr, "CloseBody: File not open\n");) -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::ParseBody() -{ - Utility::ncmap::const_iterator it; - if ( (it = m_attribute.find("query_string")) != m_attribute.end()) - { - std::string qs = it -> second; - m_form = std::auto_ptr(new HttpdForm( qs, qs.size() )); - } - else - if (m_body_file.get()) - { - m_form = std::auto_ptr(new HttpdForm( m_body_file.get(), ContentType(), ContentLength() )); - } - else - { - // dummy - m_form = std::auto_ptr(new HttpdForm( "", 0 )); - } -} - - -// -------------------------------------------------------------------------------------- -const HttpdForm& HttpRequest::Form() const -{ - if (!m_form.get()) - throw Exception("Form not available"); - return *m_form; -} - - -// -------------------------------------------------------------------------------------- -const HttpdCookies& HttpRequest::Cookies() const -{ - return m_cookies; -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::Reset() -{ - HttpTransaction::Reset(); - m_method = ""; - m_protocol = ""; - m_req_uri = ""; - m_remote_addr = ""; - m_remote_host = ""; - m_server_name = ""; - m_server_port = 0; - m_is_ssl = false; - while (!m_attribute.empty()) - { - m_attribute.erase(m_attribute.begin()); - } - m_body_file = std::auto_ptr(NULL); - m_form = std::auto_ptr(NULL); - m_cookies.Reset(); - while (!m_cookie.empty()) - { - m_cookie.erase(m_cookie.begin()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.h deleted file mode 100755 index e525bfbf2e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.h +++ /dev/null @@ -1,145 +0,0 @@ -/** - ** \file HttpRequest.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpRequest_H -#define _SOCKETS_HttpRequest_H - -#include "HttpTransaction.h" -#include "HttpdCookies.h" -#include "IFile.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpdForm; -class IFile; - -class HttpRequest : public HttpTransaction -{ -public: - HttpRequest(); - /** Create from plain old cgi request */ -#ifndef _WIN32 - HttpRequest(FILE *); -#endif - HttpRequest(const HttpRequest& src); - ~HttpRequest(); - - HttpRequest& operator=(const HttpRequest& src); - - /** Get, Post */ - void SetHttpMethod(const std::string& value); - const std::string& HttpMethod() const; - - /** HTTP/1.x */ - void SetHttpVersion(const std::string& value); - const std::string& HttpVersion() const; - - void SetUri(const std::string& value); - const std::string& Uri() const; - - void SetRemoteAddr(const std::string& value); - const std::string& RemoteAddr() const; - - void SetRemoteHost(const std::string& value); - const std::string& RemoteHost() const; - - void SetServerName(const std::string& value); - const std::string& ServerName() const; - - void SetServerPort(int value); - int ServerPort() const; - - void SetIsSsl(bool value); - bool IsSsl() const; - - /** Set / Read attribute value */ - void SetAttribute(const std::string& key, const std::string& value); - void SetAttribute(const std::string& key, long value); - const std::string& Attribute(const std::string& key) const; - - const Utility::ncmap& Attributes() const; - - /** Cookies */ - void AddCookie(const std::string& ); - const Utility::ncmap& CookieMap() const { - return m_cookie; - } - - /** Open file for body data */ - void InitBody( size_t sz ); - - /** Write body data */ - void Write( const char *buf, size_t sz ); - - /** No more writing */ - void CloseBody(); - - void ParseBody(); - - const HttpdForm& Form() const; - const HttpdCookies& Cookies() const; - - const IFile *BodyFile() const { - return m_body_file.get(); - } - - void Reset(); - -private: - std::string m_method; - std::string m_protocol; - std::string m_req_uri; - std::string m_remote_addr; - std::string m_remote_host; - std::string m_server_name; - int m_server_port; - bool m_is_ssl; - Utility::ncmap m_attribute; - std::string m_null; - mutable std::auto_ptr m_body_file; - mutable std::auto_ptr m_form; - HttpdCookies m_cookies; - Utility::ncmap m_cookie; - -}; // end of class - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_HttpRequest_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.cpp deleted file mode 100755 index 39b1c2792d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/** - ** \file HttpResponse.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#include - -#include "HttpResponse.h" -#include "HttpRequest.h" -#include "MemFile.h" -#include "File.h" -#include "Parse.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - - -// -------------------------------------------------------------------------------------- -HttpResponse::HttpResponse(const std::string& version) : HttpTransaction() -, m_http_version( version ) -, m_http_status_code(0) -, m_file( new MemFile ) -{ -} - - -// -------------------------------------------------------------------------------------- -HttpResponse::HttpResponse(const HttpResponse& src) : HttpTransaction(src) -, m_http_version( src.m_http_version ) -, m_http_status_code( src.m_http_status_code ) -, m_http_status_msg( src.m_http_status_msg ) -, m_cookie( src.m_cookie ) -, m_file( src.m_file ) -{ -} - - -// -------------------------------------------------------------------------------------- -HttpResponse::~HttpResponse() -{ -} - - -// -------------------------------------------------------------------------------------- -HttpResponse& HttpResponse::operator=(const HttpResponse& src) -{ - m_http_version = src.m_http_version; - m_http_status_code = src.m_http_status_code; - m_http_status_msg = src.m_http_status_msg; - m_cookie = src.m_cookie; - m_file = src.m_file; - - HttpTransaction::operator=(src); - - return *this; -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetHttpVersion(const std::string& value) -{ - m_http_version = value; -} - - -// -------------------------------------------------------------------------------------- -const std::string& HttpResponse::HttpVersion() const -{ - return m_http_version; -} - - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetHttpStatusCode(int value) -{ - m_http_status_code = value; -} - - -int HttpResponse::HttpStatusCode() const -{ - return m_http_status_code; -} - - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetHttpStatusMsg(const std::string& value) -{ - m_http_status_msg = value; -} - - -const std::string& HttpResponse::HttpStatusMsg() const -{ - return m_http_status_msg; -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetCookie(const std::string& value) -{ - Parse pa(value, "="); - std::string name = pa.getword(); - m_cookie[name] = value; -DEB(fprintf(stderr, "HttpResponse::Set-Cookie<%s>: %s\n", name.c_str(), value.c_str());) -} - - -const std::string HttpResponse::Cookie(const std::string& name) const -{ - Utility::ncmap::const_iterator it = m_cookie.find(name); -DEB(fprintf(stderr, "HttpResponse; get value of Cookie<%s>: ", name.c_str());) - if (it != m_cookie.end()) - { -DEB(fprintf(stderr, "%s\n", it -> second.c_str());) - return it -> second; - } -DEB(fprintf(stderr, "\n");) - return ""; -} - - -std::list HttpResponse::CookieNames() const -{ - std::list vec; - DEB(fprintf(stderr, "HttpResponse::CookieNames; ");) - for (Utility::ncmap::const_iterator it = m_cookie.begin(); it != m_cookie.end(); ++it) - { - DEB(fprintf(stderr, " %s", it -> first.c_str());) - vec.push_back(it -> first); - } - DEB(fprintf(stderr, "\n");) - return vec; -} - - - -// -------------------------------------------------------------------------------------- -void HttpResponse::Write( const std::string& str ) -{ - Write( str.c_str(), str.size() ); -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::Write( const char *buf, size_t sz ) -{ - m_file -> fwrite( buf, 1, sz ); -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::Writef( const char *format, ... ) -{ - va_list ap; - va_start(ap, format); - char tmp[10000]; - vsnprintf(tmp, sizeof(tmp), format, ap); - va_end(ap); - m_file -> fwrite( tmp, 1, strlen(tmp) ); -} - - -// -------------------------------------------------------------------------------------- -const IFile& HttpResponse::GetFile() const -{ - return *m_file; -} - - -// -------------------------------------------------------------------------------------- -IFile& HttpResponse::GetFile() -{ - return *m_file; -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetFile( const std::string& path ) -{ - m_file = std::auto_ptr(new File); - m_file -> fopen( path, "rb" ); -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetFile( IFile *f ) -{ - m_file = std::auto_ptr(f); -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::Reset() -{ - HttpTransaction::Reset(); - m_http_version = ""; - m_http_status_code = 0; - m_http_status_msg = ""; - while (!m_cookie.empty()) - { - m_cookie.erase(m_cookie.begin()); - } - m_file = std::auto_ptr(new MemFile); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.h deleted file mode 100755 index 8f64f9dc84..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - ** \file HttpResponse.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpResponse_H -#define _SOCKETS_HttpResponse_H - -#include "HttpTransaction.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IFile; - -class HttpResponse : public HttpTransaction -{ -public: - HttpResponse(const std::string& version = "HTTP/1.0"); - HttpResponse(const HttpResponse& src); - ~HttpResponse(); - - HttpResponse& operator=(const HttpResponse& src); - - /** HTTP/1.x */ - void SetHttpVersion(const std::string& value); - const std::string& HttpVersion() const; - - void SetHttpStatusCode(int value); - int HttpStatusCode() const; - - void SetHttpStatusMsg(const std::string& value); - const std::string& HttpStatusMsg() const; - - void SetCookie(const std::string& value); - const std::string Cookie(const std::string& name) const; - std::list CookieNames() const; - - void Write( const std::string& str ); - void Write( const char *buf, size_t sz ); - void Writef( const char *format, ... ); - - const IFile& GetFile() const; - IFile& GetFile(); - - /** Replace memfile with file on disk, opened for read. */ - void SetFile( const std::string& path ); - /** Replace memfile with another IFile */ - void SetFile( IFile *f ); - - void Reset(); - -private: - std::string m_http_version; - int m_http_status_code; - std::string m_http_status_msg; - Utility::ncmap m_cookie; - mutable std::auto_ptr m_file; - -}; // end of class - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_HttpResponse_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.cpp deleted file mode 100755 index 62a21d95fa..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/** - ** \file HttpTransaction.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpTransaction.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// -------------------------------------------------------------------------------------- -HttpTransaction::HttpTransaction() -{ -} - - -// -------------------------------------------------------------------------------------- -HttpTransaction::~HttpTransaction() -{ -} - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetHeader(const std::string& key, const std::string& value) -{ - m_header[key] = value; -} - - -void HttpTransaction::SetHeader(const std::string& key, long value) -{ - m_header[key] = Utility::l2string(value); -} - - -const std::string& HttpTransaction::Header(const std::string& key) const -{ - Utility::ncmap::const_iterator it; - if ((it = m_header.find(key)) != m_header.end()) - return it -> second; - return m_null; -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetAccept(const std::string& value) -{ - SetHeader("accept", value); -} - - -const std::string& HttpTransaction::Accept() const -{ - return Header("accept"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetAcceptCharset(const std::string& value) -{ - SetHeader("accept-charset", value); -} - - -const std::string& HttpTransaction::AcceptCharset() const -{ - return Header("accept-charset"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetAcceptEncoding(const std::string& value) -{ - SetHeader("accept-encoding", value); -} - - -const std::string& HttpTransaction::AcceptEncoding() const -{ - return Header("accept-encoding"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetAcceptLanguage(const std::string& value) -{ - SetHeader("accept-language", value); -} - - -const std::string& HttpTransaction::AcceptLanguage() const -{ - return Header("accept-language"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetConnection(const std::string& value) -{ - SetHeader("connection", value); -} - - -const std::string& HttpTransaction::Connection() const -{ - return Header("connection"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetContentType(const std::string& value) -{ - SetHeader("content-type", value); -} - - -const std::string& HttpTransaction::ContentType() const -{ - return Header("content-type"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetContentLength(long value) -{ - SetHeader("content-length", value ); -} - - -long HttpTransaction::ContentLength() const -{ - return atol(Header("content-length").c_str()); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetHost(const std::string& value) -{ - SetHeader("host", value); -} - - -const std::string& HttpTransaction::Host() const -{ - return Header("host"); -} - - -const std::string HttpTransaction::HostOnly() const -{ - std::string host = Header("host"); - size_t pos = host.find(":"); - if (pos != std::string::npos) - return host.substr(0, pos); - return host; -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetPragma(const std::string& value) -{ - SetHeader("pragma", value); -} - - -const std::string& HttpTransaction::Pragma() const -{ - return Header("pragma"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetReferer(const std::string& value) -{ - SetHeader("referer", value); -} - - -const std::string& HttpTransaction::Referer() const -{ - return Header("referer"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetUserAgent(const std::string& value) -{ - SetHeader("user-agent", value); -} - - -const std::string& HttpTransaction::UserAgent() const -{ - return Header("user-agent"); -} - - -// -------------------------------------------------------------------------------------- -const Utility::ncmap& HttpTransaction::Headers() const -{ - return m_header; -} - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::Reset() -{ - while (!m_header.empty()) - { - m_header.erase(m_header.begin()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.h deleted file mode 100755 index 89d2ba5b2a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.h +++ /dev/null @@ -1,106 +0,0 @@ -/** - ** \file HttpTransaction.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpTransaction_H -#define _SOCKETS_HttpTransaction_H - -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpTransaction -{ -public: - HttpTransaction(); - virtual ~HttpTransaction(); - - /** Set / Read http header value */ - void SetHeader(const std::string& key, const std::string& value); - void SetHeader(const std::string& key, long value); - const std::string& Header(const std::string& key) const; - - void SetAccept(const std::string& value); - const std::string& Accept() const; - - void SetAcceptCharset(const std::string& value); - const std::string& AcceptCharset() const; - - void SetAcceptEncoding(const std::string& value); - const std::string& AcceptEncoding() const; - - void SetAcceptLanguage(const std::string& value); - const std::string& AcceptLanguage() const; - - void SetConnection(const std::string& value); - const std::string& Connection() const; - - void SetContentType(const std::string& value); - const std::string& ContentType() const; - - void SetContentLength(long value); - long ContentLength() const; - - void SetHost(const std::string& value); - const std::string& Host() const; - const std::string HostOnly() const; - - void SetPragma(const std::string& value); - const std::string& Pragma() const; - - void SetReferer(const std::string& value); - const std::string& Referer() const; - - void SetUserAgent(const std::string& value); - const std::string& UserAgent() const; - - const Utility::ncmap& Headers() const; - - virtual void Reset(); - -private: - Utility::ncmap m_header; - std::string m_null; - -}; // end of class - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_HttpTransaction_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.cpp deleted file mode 100755 index 1b1c038ae8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/** \file HttpdCookies.cpp -*/ -/* -Copyright (C) 2003-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "Parse.h" -#include "HTTPSocket.h" -#include "HttpdCookies.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - - -HttpdCookies::HttpdCookies() -{ -} - -HttpdCookies::HttpdCookies(const std::string& s) -{ - Parse *pa = new Parse(s,";"); - - std::string slask = pa -> getword(); - while (slask.size()) - { - Parse *pa2 = new Parse(slask,"="); - std::string name = pa2 -> getword(); - std::string value = pa2 -> getword(); - delete pa2; - m_cookies.push_back(std::pair(name, value)); - // - slask = pa -> getword(); - } - delete pa; -} - -void HttpdCookies::add(const std::string& s) -{ - Parse *pa = new Parse(s,";"); -DEB(fprintf(stderr, "Parse cookie: %s\n", s.c_str());) - std::string slask = pa -> getword(); - while (slask.size()) - { - Parse *pa2 = new Parse(slask,"="); - std::string name = pa2 -> getword(); - std::string value = pa2 -> getword(); - delete pa2; - m_cookies.push_back(std::pair(name, value)); - // - slask = pa -> getword(); - } - delete pa; -} - -HttpdCookies::~HttpdCookies() -{ -} - -bool HttpdCookies::getvalue(const std::string& name,std::string& buffer) const -{ - for (cookie_v::const_iterator it = m_cookies.begin(); it != m_cookies.end(); ++it) - { - const std::pair& ref = *it; - if (!strcasecmp(ref.first.c_str(),name.c_str())) - { - buffer = ref.second; - return true; - } - } - buffer = ""; - return false; -} - -void HttpdCookies::replacevalue(const std::string& name,const std::string& value) -{ - for (cookie_v::iterator it = m_cookies.begin(); it != m_cookies.end(); ++it) - { - std::pair& ref = *it; - if (!strcasecmp(ref.first.c_str(),name.c_str())) - { - ref.second = value; - return; - } - } - m_cookies.push_back(std::pair(name, value)); - -} - -void HttpdCookies::replacevalue(const std::string& name,long l) -{ - replacevalue(name, Utility::l2string(l)); -} - -void HttpdCookies::replacevalue(const std::string& name,int i) -{ - replacevalue(name, Utility::l2string(i)); -} - -size_t HttpdCookies::getlength(const std::string& name) const -{ - for (cookie_v::const_iterator it = m_cookies.begin(); it != m_cookies.end(); ++it) - { - const std::pair& ref = *it; - if (!strcasecmp(ref.first.c_str(),name.c_str())) - { - return ref.second.size(); - } - } - return 0; -} - -void HttpdCookies::setcookie(HTTPSocket *sock, const std::string& domain, const std::string& path, const std::string& name, const std::string& value) -{ - size_t sz = name.size() + value.size() + domain.size() + path.size() + 100; - char *str = new char[sz]; - - // set-cookie response - if (domain.size()) - { - snprintf(str, sz, "%s=%s; domain=%s; path=%s; expires=%s", - name.c_str(), value.c_str(), - domain.c_str(), - path.c_str(), - expiredatetime().c_str()); - } - else - { - snprintf(str, sz, "%s=%s; path=%s; expires=%s", - name.c_str(), value.c_str(), - path.c_str(), - expiredatetime().c_str()); - } - sock -> AddResponseHeader("Set-cookie", str); - delete[] str; - - replacevalue(name, value); -} - -void HttpdCookies::setcookie(HTTPSocket *sock, const std::string& domain, const std::string& path, const std::string& name, long value) -{ - size_t sz = name.size() + domain.size() + path.size() + 100; - char *str = new char[sz]; - char dt[80]; - - // set-cookie response - if (domain.size()) - { - snprintf(str, sz, "%s=%ld; domain=%s; path=%s; expires=%s", - name.c_str(), value, - domain.c_str(), - path.c_str(), - expiredatetime().c_str()); - } - else - { - snprintf(str, sz, "%s=%ld; path=%s; expires=%s", - name.c_str(), value, - path.c_str(), - expiredatetime().c_str()); - } - sock -> AddResponseHeader("Set-cookie", str); - delete[] str; - - snprintf(dt, sizeof(dt), "%ld", value); - replacevalue(name, dt); -} - -void HttpdCookies::setcookie(HTTPSocket *sock, const std::string& domain, const std::string& path, const std::string& name, int value) -{ - size_t sz = name.size() + domain.size() + path.size() + 100; - char *str = new char[sz]; - char dt[80]; - - // set-cookie response - if (domain.size()) - { - snprintf(str, sz, "%s=%d; domain=%s; path=%s; expires=%s", - name.c_str(), value, - domain.c_str(), - path.c_str(), - expiredatetime().c_str()); - } - else - { - snprintf(str, sz, "%s=%d; path=%s; expires=%s", - name.c_str(), value, - path.c_str(), - expiredatetime().c_str()); - } - sock -> AddResponseHeader("Set-cookie", str); - delete[] str; - - snprintf(dt, sizeof(dt), "%d", value); - replacevalue(name, dt); -} - - -const std::string& HttpdCookies::expiredatetime() const -{ - const char *days[7] = {"Sunday", "Monday", - "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; - const char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", - "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - char dt[100]; - - time_t t = time(NULL); -#ifdef __CYGWIN__ - struct tm *tp = gmtime(&t); - snprintf(dt, sizeof(dt), "%s, %02d-%s-%04d %02d:%02d:%02d GMT", - days[tp -> tm_wday], - tp -> tm_mday, - months[tp -> tm_mon], - tp -> tm_year + 1910, - tp -> tm_hour, - tp -> tm_min, - tp -> tm_sec); -#else - struct tm tp; -#if defined( _WIN32) && !defined(__CYGWIN__) - gmtime_s(&tp, &t); -#else - gmtime_r(&t, &tp); -#endif - snprintf(dt, sizeof(dt), "%s, %02d-%s-%04d %02d:%02d:%02d GMT", - days[tp.tm_wday], - tp.tm_mday, - months[tp.tm_mon], - tp.tm_year + 1910, - tp.tm_hour, - tp.tm_min, - tp.tm_sec); -#endif - m_date = dt; - return m_date; -} - - -void HttpdCookies::Reset() -{ - while (!m_cookies.empty()) - { - m_cookies.erase(m_cookies.begin()); - } - m_date = ""; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.h deleted file mode 100755 index 0cc0d1cbe3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.h +++ /dev/null @@ -1,94 +0,0 @@ -/** \file HttpdCookies.h -*/ -/* -Copyright (C) 2003-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _SOCKETS_HttpdCookies_H -#define _SOCKETS_HttpdCookies_H - -#include "sockets-config.h" -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -//! Store the cookies name/value pairs. - - - -//! Retrieve and manage cookies during a cgi call. -class HTTPSocket; - -/** HTTP Cookie parse/container class. -\sa HttpdSocket -\sa HttpdForm -\ingroup webserver */ -class HttpdCookies -{ - /** list of key/value structs. */ - typedef std::list > cookie_v; - -public: - HttpdCookies(); - HttpdCookies(const std::string& query_string); - ~HttpdCookies(); - - void add(const std::string& s); - - bool getvalue(const std::string&,std::string&) const; - void replacevalue(const std::string& ,const std::string& ); - void replacevalue(const std::string& ,long); - void replacevalue(const std::string& ,int); - size_t getlength(const std::string& ) const; - void setcookie(HTTPSocket *,const std::string& d,const std::string& p,const std::string& c,const std::string& v); - void setcookie(HTTPSocket *,const std::string& d,const std::string& p,const std::string& c,long v); - void setcookie(HTTPSocket *,const std::string& d,const std::string& p,const std::string& c,int v); - const std::string& expiredatetime() const; - - cookie_v& GetHttpdCookies() { - return m_cookies; - } - - void Reset(); - -private: - cookie_v m_cookies; - mutable std::string m_date; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpdCookies_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.cpp deleted file mode 100755 index 765fa3ece7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.cpp +++ /dev/null @@ -1,717 +0,0 @@ -/** \file HttpdForm.cpp - read stdin, parse cgi input - ** - ** Written: 1999-Feb-10 grymse@alhem.net - **/ - -/* -Copyright (C) 1999-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "socket_include.h" -#include "Parse.h" -#include "IFile.h" -#include "HttpdForm.h" -#include "IFileUpload.h" -#include "IStream.h" -#include "File.h" - -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#define TMPSIZE 32000 -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -HttpdForm::HttpdForm(FILE *fil) -{ - const char *r_m = getenv("REQUEST_METHOD"); - const char *q_s = getenv("QUERY_STRING"); - if (r_m && !strcasecmp(r_m, "post")) - { - const char *c_t = getenv("CONTENT_TYPE"); - const char *c_l = getenv("CONTENT_LENGTH"); - if (c_t && c_l) - { - std::auto_ptr p = std::auto_ptr(new File(fil)); - ParseFormData( p.get(), c_t, atoi(c_l) ); - } - } - if (q_s && strlen(q_s)) - { - ParseQueryString(q_s, strlen(q_s)); - } -} - -HttpdForm::HttpdForm(IFile *infil, const std::string& content_type, size_t content_length) : raw(false) -, m_file_upload(NULL) -, m_upload_stream(NULL) -{ - ParseFormData(infil, content_type, content_length); -} - -// HttpdForm(buffer,l) -- request_method GET - -HttpdForm::HttpdForm(const std::string& buffer,size_t l) : raw(false) -, m_file_upload(NULL) -, m_upload_stream(NULL) -{ - ParseQueryString(buffer, l); -} - -void HttpdForm::ParseFormData(IFile *infil, const std::string& content_type, size_t content_length) -{ - CGI *cgi = NULL; - size_t extra = 2; - int cl = (int)content_length; - - m_current = m_cgi.end(); - - if (content_type.size() >= 19 && content_type.substr(0, 19) == "multipart/form-data") - { - Parse pa(content_type,";="); - char *tempcmp = NULL; - size_t tc = 0; - size_t l = 0; - std::string str = pa.getword(); - m_strBoundary = ""; - while (!str.empty()) - { - if (!strcmp(str.c_str(),"boundary")) - { - m_strBoundary = pa.getword(); - l = m_strBoundary.size(); - tempcmp = new char[l + extra]; - } - // - str = pa.getword(); - } - if (!m_strBoundary.empty()) - { - std::string content_type; - std::string current_name; - std::string current_filename; - char *slask = new char[TMPSIZE]; - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - while (cl >= 0 && !infil -> eof()) - { - while (strlen(slask) && (slask[strlen(slask) - 1] == 13 || slask[strlen(slask) - 1] == 10)) - { - slask[strlen(slask) - 1] = 0; - } - content_type = ""; - current_name = ""; - current_filename = ""; - if ((strstr(slask,m_strBoundary.c_str()) || strstr(m_strBoundary.c_str(),slask)) && strcmp(slask, m_strBoundary.c_str())) - { - m_strBoundary = slask; - l = m_strBoundary.size(); - delete[] tempcmp; - tempcmp = new char[l + extra]; - } - if (!strcmp(slask, m_strBoundary.c_str())) - { - // Get headers until empty line - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - while (strlen(slask) && (slask[strlen(slask) - 1] == 13 || slask[strlen(slask) - 1] == 10)) - { - slask[strlen(slask) - 1] = 0; - } - while (cl >= 0 && !infil -> eof() && *slask) - { - Parse pa(slask,":"); - std::string h = pa.getword(); - std::string h2 = pa.getrest(); - if (!strcasecmp(h.c_str(),"Content-type")) - { - Parse pa(h2, ";"); - content_type = pa.getword(); - } - else - if (!strcasecmp(h.c_str(),"Content-Disposition")) - { - Parse pa(h2, ";"); - h = pa.getword(); - if (!strcmp(h.c_str(),"form-data")) - { - pa.EnableQuote(true); - h = pa.getword(); - while (!h.empty()) - { - Parse pa2(h,"="); - std::string name = pa2.getword(); - h = pa2.getrest(); - if (!strcmp(name.c_str(),"name")) - { - if (!h.empty() && h[0] == '"') - { - current_name = h.substr(1, h.size() - 2); - } - else - { - current_name = h; - } - } - else - if (!strcmp(name.c_str(),"filename")) - { - if (!h.empty() && h[0] == '"') - { - current_filename = h.substr(1, h.size() - 2); - } - else - { - current_filename = h; - } - size_t x = 0; - for (size_t i = 0; i < current_filename.size(); i++) - { - if (current_filename[i] == '/' || current_filename[i] == '\\') - x = i + 1; - } - if (x) - { - current_filename = current_filename.substr(x); - } - } - h = pa.getword(); - } - } - } - // get next header value - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - while (strlen(slask) && (slask[strlen(slask) - 1] == 13 || slask[strlen(slask) - 1] == 10)) - { - slask[strlen(slask) - 1] = 0; - } - } - // Read content, save...? - if (current_filename.empty()) // not a file - { - std::string val; - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - while (cl >= 0 && !infil -> eof() && strncmp(slask,m_strBoundary.c_str(),m_strBoundary.size() )) - { - val += slask; - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - } - // remove trailing cr/linefeed - while (!val.empty() && (val[val.size() - 1] == 13 || val[val.size() - 1] == 10)) - { - val = val.substr(0,val.size() - 1); - } - cgi = new CGI(current_name, val); - m_cgi.push_back(cgi); - if (!cl) - { - break; - } - } - else // current_filename.size() > 0 - { - // read until m_strBoundary... - IFile *fil = NULL; - int out = 0; - char c; - char fn[2000]; // where post'd file will be saved -#ifdef _WIN32 - { - char tmp_path[2000]; - ::GetTempPathA(2000, tmp_path); - if (tmp_path[strlen(tmp_path) - 1] != '\\') - { -#ifdef __CYGWIN__ - strcat(tmp_path, "\\"); -#else - strcat_s(tmp_path, sizeof(tmp_path), "\\"); -#endif - } - snprintf(fn,sizeof(fn),"%s%s",tmp_path,current_filename.c_str()); - } -#else - snprintf(fn,sizeof(fn),"/tmp/%s",current_filename.c_str()); -#endif - if (m_file_upload && !m_upload_stream) - m_upload_stream = &m_file_upload -> IFileUploadBegin(current_name, current_filename, content_type); - else - { - fil = new File; - if (!fil -> fopen(fn, "wb")) - { - delete fil; - fil = NULL; - } - } - if (fil || m_upload_stream) - { - infil -> fread(&c,1,1); - cl -= 1; - while (cl >= 0 && !infil -> eof()) - { - if (out) - { - if (m_upload_stream) - m_upload_stream -> IStreamWrite(&tempcmp[tc], 1); - else - fil -> fwrite(&tempcmp[tc],1,1); - } - tempcmp[tc] = c; - tc++; - if (tc >= l + extra) - { - tc = 0; - out = 1; - } - if (tc) - { - if (!strncmp(tempcmp + tc + extra, m_strBoundary.c_str(), l - tc) && - !strncmp(tempcmp, m_strBoundary.c_str() + l - tc, tc)) - { - break; - } - } - else - { - if (!strncmp(tempcmp + extra, m_strBoundary.c_str(), l)) - { - break; - } - } - infil -> fread(&c,1,1); - cl -= 1; - } - if (m_file_upload && m_upload_stream) - { - m_file_upload -> IFileUploadEnd(); - m_upload_stream = NULL; - } - else - if (fil) - { - fil -> fclose(); - delete fil; - } - - cgi = new CGI(current_name,fn,fn); - m_cgi.push_back(cgi); - -#if defined( _WIN32) && !defined(__CYGWIN__) - strcpy_s(slask, TMPSIZE, m_strBoundary.c_str()); -#else - strcpy(slask, m_strBoundary.c_str()); -#endif - size_t l = strlen(slask); - infil -> fgets(slask + l, TMPSIZE - (int)l); // next line - cl -= (int)strlen(slask + l); - } - else - { - // couldn't open file - break; - } - if (!cl) - { - break; - } - } - } - else - { - // Probably '--' - break; - } - } // while (!infil -> eof()) - delete[] slask; - } // if (m_strBoundary) - if (tempcmp) - { - delete[] tempcmp; - } - } // end of multipart - else - if (strstr(content_type.c_str(), "x-www-form-urlencoded")) - { - bool got_name = false; // tnx to FatherNitwit - int cl = (int)content_length; - char c,chigh,clow; - std::string slask; - m_current = m_cgi.end(); - std::string name; - - infil -> fread(&c,1,1); - cl--; - while (cl >= 0 && !infil -> eof()) - { - switch (c) // built-in url decoder - { - case '=': /* end of name */ - name = slask; - slask.resize(0); - got_name = true; - break; - case '&': /* end of value */ - if (got_name) - { - cgi = new CGI(name,slask); - got_name = false; - } - else - { - cgi = new CGI(slask, ""); - } - slask.resize(0); - m_cgi.push_back(cgi); - break; - case '+': /* space */ - slask += " "; - break; - case '%': /* hex value */ - infil -> fread(&chigh,1,1); - cl--; - chigh -= 48 + (chigh > '9' ? 7 : 0) + (chigh >= 'a' ? 32 : 0); - infil -> fread(&clow,1,1); - cl--; - clow -= 48 + (clow > '9' ? 7 : 0) + (clow >= 'a' ? 32 : 0); - slask += (char)(chigh * 16 + clow); - break; - default: /* just another char */ - slask += c; - break; - } - // - if (cl > 0) - { - infil -> fread(&c,1,1); - } - cl--; - } - if (got_name) - { - cgi = new CGI(name,slask); - } - else - { - cgi = new CGI(slask, ""); - } - m_cgi.push_back(cgi); - } - else // read other content up to a limit - if (content_length > 0 && content_length < 500000) - { - int ptr = 0; - int cl = (int)content_length; - m_content.resize(cl); - while (ptr < cl) - { - int remaining = cl - ptr; - int n = fread(&m_content[ptr], 1, remaining, stdin); - if (n > 0) - ptr += n; - } - } -} - - -void HttpdForm::ParseQueryString(const std::string& buffer,size_t l) -{ - CGI *cgi = NULL; - std::string slask; - std::string name; - char c,chigh,clow; - size_t ptr = 0; - bool got_name = false; - - m_current = m_cgi.end(); - - ptr = 0; - while (ptr < l) - { - c = buffer[ptr++]; - switch (c) - { - case '=': /* end of name */ - name = slask; - slask.resize(0); - got_name = true; - break; - case '&': /* end of value */ - if (got_name) - { - cgi = new CGI(name,slask); - got_name = false; - } - else - { - cgi = new CGI(slask, ""); - } - slask.resize(0); - m_cgi.push_back(cgi); - break; - case '+': /* space */ - slask += " "; - break; - case '%': /* hex value */ - chigh = buffer[ptr++]; - chigh -= 48 + (chigh > '9' ? 7 : 0) + (chigh >= 'a' ? 32 : 0); - clow = buffer[ptr++]; - clow -= 48 + (clow > '9' ? 7 : 0) + (clow >= 'a' ? 32 : 0); - slask += (char)(chigh * 16 + clow); - break; - default: /* just another char */ - slask += c; - break; - } - } - if (got_name) - { - cgi = new CGI(name,slask); - } - else - { - cgi = new CGI(slask, ""); - } - m_cgi.push_back(cgi); -} - - -HttpdForm::~HttpdForm() -{ - CGI *cgi = NULL; //,*tmp; - - for (cgi_v::iterator it = m_cgi.begin(); it != m_cgi.end(); ++it) - { - cgi = *it; - delete cgi; - } -} - - -void HttpdForm::EnableRaw(bool b) -{ - raw = b; -} - - -void HttpdForm::strcpyval(std::string& v,const char *value) const -{ - v = ""; - for (size_t i = 0; i < strlen(value); i++) - { - if (value[i] == '<') - { - v += "<"; - } - else - if (value[i] == '>') - { - v += ">"; - } - else - if (value[i] == '&') - { - v += "&"; - } - else - { - v += value[i]; - } - } -} - - -bool HttpdForm::getfirst(std::string& n) const -{ - m_current = m_cgi.begin(); - return getnext(n); -} - - -bool HttpdForm::getnext(std::string& n) const -{ - if (m_current != m_cgi.end() ) - { - CGI *current = *m_current; - n = current -> name; - m_current++; - return true; - } - else - { - n = ""; - } - return false; -} - - -bool HttpdForm::getfirst(std::string& n,std::string& v) const -{ - m_current = m_cgi.begin(); - return getnext(n,v); -} - - -bool HttpdForm::getnext(std::string& n,std::string& v) const -{ - if (m_current != m_cgi.end() ) - { - CGI *current = *m_current; - n = current -> name; - if (raw) - { - v = current -> value; - } - else - { - strcpyval(v,current -> value.c_str()); - } - m_current++; - return true; - } - else - { - n = ""; - } - return false; -} - - -int HttpdForm::getvalue(const std::string& n,std::string& v) const -{ - CGI *cgi = NULL; - int r = 0; - - for (cgi_v::const_iterator it = m_cgi.begin(); it != m_cgi.end(); ++it) - { - cgi = *it; - if (cgi -> name == n) - break; - cgi = NULL; - } - if (cgi) - { - if (raw) - { - v = cgi -> value; - } - else - { - strcpyval(v,cgi -> value.c_str()); - } - r++; - } - else - { - v = ""; - } - - return r; -} - - -std::string HttpdForm::getvalue(const std::string& n) const -{ - for (cgi_v::const_iterator it = m_cgi.begin(); it != m_cgi.end(); ++it) - { - CGI *cgi = *it; - if (cgi -> name == n) - { - return cgi -> value; - } - } - return ""; -} - - -size_t HttpdForm::getlength(const std::string& n) const -{ - CGI *cgi = NULL; - size_t l; - - for (cgi_v::const_iterator it = m_cgi.begin(); it != m_cgi.end(); ++it) - { - cgi = *it; - if (cgi -> name == n) - break; - cgi = NULL; - } - l = cgi ? cgi -> value.size() : 0; - if (cgi && !raw) - { - for (size_t i = 0; i < cgi -> value.size(); i++) - { - switch (cgi -> value[i]) - { - case '<': // < - case '>': // > - l += 4; - break; - case '&': // & - l += 5; - break; - } - } - } - return l; -} - - -HttpdForm::cgi_v& HttpdForm::getbase() -{ - return m_cgi; -} - - -const std::string& HttpdForm::GetBoundary() const -{ - return m_strBoundary; -} - - -void HttpdForm::SetFileUpload(IFileUpload& cb) -{ - m_file_upload = &cb; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.h deleted file mode 100755 index c58de69a0e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.h +++ /dev/null @@ -1,147 +0,0 @@ -/** \file HttpdForm.h - read stdin, parse cgi input - ** - ** Written: 1999-Feb-10 grymse@alhem.net - **/ - -/* -Copyright (C) 1999-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _SOCKETS_HttpdForm_H -#define _SOCKETS_HttpdForm_H - -#include "sockets-config.h" -#include -#include -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IFile; -class IFileUpload; -class IStream; - -/** Parse/store a http query_string/form-data body. - \ingroup webserver */ -class HttpdForm -{ - /** - * Store the name/value pairs from a GET/POST operation. - * "name" does not have to be unique. - \ingroup webserver - */ - struct CGI { - CGI(const std::string& n,const std::string& v) : name(n),value(v) {} - CGI(const std::string& n,const std::string& v,const std::string& p) : name(n),value(v),path(p) {} - std::string name; - std::string value; - std::string path; - }; - /** list of key/value pairs. */ - typedef std::list cgi_v; - -public: - /** - * Default constructor - */ - HttpdForm(FILE *); - /** - * Constructor (used in POST operations). - * Input is read from stdin. Number of characters to read - * can be found in the environment variable CONTENT_LENGTH. - */ - HttpdForm(IFile *, const std::string& content_type, size_t content_length); - /** - * Another constructor (used in GET operations). - * Input is read from the environment variable QUERY_STRING. - * @param query_string The httpd server provided QUERY_STRING - * @param length Query string length. - */ - HttpdForm(const std::string& query_string,size_t length); - ~HttpdForm(); - - void ParseFormData(IFile *, const std::string&, size_t); - void ParseQueryString(const std::string& query_string, size_t length); - - void EnableRaw(bool); - - /** Encode characters '<' '>' '&' as < > & */ - void strcpyval(std::string&,const char *) const; - - /* get names */ - bool getfirst(std::string& n) const; - bool getnext(std::string& n) const; - - /* get names and values */ - bool getfirst(std::string& n,std::string& v) const; - bool getnext(std::string& n,std::string& v) const; - - /* get value */ - int getvalue(const std::string& ,std::string& ) const; - std::string getvalue(const std::string& ) const; - size_t getlength(const std::string& ) const; - cgi_v& getbase(); - - const std::string& GetBoundary() const; - - /** Enable IFileUpload callback */ - void SetFileUpload(IFileUpload& cb); - - bool ContentAvailable() const { - return !m_content.empty(); - } - const std::vector& GetContent() const { - return m_content; - } - -private: - HttpdForm(const HttpdForm& ) {} - HttpdForm& operator=(const HttpdForm& ) { - return *this; - } - cgi_v m_cgi; - mutable cgi_v::const_iterator m_current; - std::string m_strBoundary; - bool raw; - IFileUpload *m_file_upload; - IStream *m_upload_stream; - std::vector m_content; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpdForm_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.cpp deleted file mode 100755 index 40e5c33926..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/** \file HttpdSocket.cpp -*/ -/* -Copyright (C) 2001-2010 Anders Hedstrom (grymse@alhem.net) - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpdCookies.h" -#include "HttpdForm.h" -#include "MemFile.h" -#include "HttpdSocket.h" -#include "Base64.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#define TMPSIZE 10000 - - -// statics -int HttpdSocket::m_request_count = 0; -std::string HttpdSocket::m_start = ""; - - -HttpdSocket::HttpdSocket(ISocketHandler& h) -:HTTPSocket(h) -,m_content_length(0) -,m_file(NULL) -,m_received(0) -,m_request_id(++m_request_count) -,m_cookies(NULL) -,m_form(NULL) -{ - m_http_date = datetime2httpdate(GetDate()); - if (!m_start.size()) - m_start = m_http_date; -} - - -HttpdSocket::~HttpdSocket() -{ - if (m_file) - { - delete m_file; - } - if (m_cookies) - delete m_cookies; - if (m_form) - delete m_form; -} - - -void HttpdSocket::OnFirst() -{ -} - - -void HttpdSocket::OnHeader(const std::string& key,const std::string& value) -{ - if (!strcasecmp(key.c_str(),"content-length")) - { - m_content_length = atoi(value.c_str()); - m_content_length_str = value; - } - else - if (!strcasecmp(key.c_str(),"cookie")) - { - m_http_cookie = value; - } - else - if (!strcasecmp(key.c_str(),"content-type")) - { - m_content_type = value; - } - else - if (!strcasecmp(key.c_str(),"if-modified-since")) - { - m_if_modified_since = value; - } -} - - -void HttpdSocket::OnHeaderComplete() -{ - m_cookies = new HttpdCookies(m_http_cookie); - - if (GetMethod() == "GET") - { - Utility::SetEnv("QUERY_STRING", GetQueryString()); - } - Utility::SetEnv("REQUEST_METHOD", GetMethod()); - Utility::SetEnv("HTTP_COOKIE", m_http_cookie); - Utility::SetEnv("CONTENT_TYPE", m_content_type); - Utility::SetEnv("CONTENT_LENGTH", m_content_length_str); - if (GetMethod() == "POST") - { - m_file = new MemFile; - } - else - if (GetMethod() == "GET") - { - m_form = new HttpdForm(GetQueryString(), GetQueryString().size() ); - AddResponseHeader("Date", datetime2httpdate(GetDate()) ); - if (GetUri() == "/image") - { - Send64(Utility::Logo, "image/png"); - } - else - { - Exec(); - } - Reset(); // prepare for next request - } - else - { - AddResponseHeader("Date", GetHttpDate()); - AddResponseHeader("Connection", "close"); - SetStatus("405"); - SetStatusText("Method not allowed"); - SendResponse(); - } -} - - -void HttpdSocket::OnData(const char *p,size_t l) -{ - if (m_file) - { - m_file -> fwrite(p,1,l); - } - m_received += l; - if (m_received >= m_content_length && m_content_length) - { - // all done - if (m_file && !m_form) - { - m_form = new HttpdForm(m_file, m_content_type, m_content_length); - AddResponseHeader("Date", datetime2httpdate(GetDate()) ); - if (GetUri() == "/image") - { - Send64(Utility::Logo, "image/png"); - } - else - { - Exec(); - } - Reset(); // prepare for next request - } - } -} - - -void HttpdSocket::Send64(const std::string& str64, const std::string& type) -{ - Base64 bb; - - if (!strcasecmp(m_start.c_str(), m_if_modified_since.c_str())) - { - SetStatus("304"); - SetStatusText("Not Modified"); - SendResponse(); - } - else - { - size_t len = bb.decode_length(str64); - unsigned char *buf = new unsigned char[len]; - - SetStatus("200"); - SetStatusText("OK"); - - AddResponseHeader("Content-length", Utility::l2string( (long)len) ); - AddResponseHeader("Content-type", type ); - AddResponseHeader("Last-modified", m_start); - SendResponse(); - - bb.decode(str64, buf, len); - SendBuf( (char *)buf, len); - delete[] buf; - } -} - - -std::string HttpdSocket::datetime2httpdate(const std::string& dt) -{ - struct tm tp; - time_t t; - const char *days[] = { "Sun","Mon","Tue","Wed","Thu","Fri","Sat" }; - const char *months[] = { "Jan","Feb","Mar","Apr","May","Jun", - "Jul","Aug","Sep","Oct","Nov","Dec" }; - int i; - char s[40]; - -/* 1997-12-16 09:50:40 */ - - if (dt.size() == 19) - { - tp.tm_year = atoi(dt.substr(0,4).c_str()) - 1900; - i = atoi(dt.substr(5,2).c_str()) - 1; - tp.tm_mon = i >= 0 ? i : 0; - tp.tm_mday = atoi(dt.substr(8,2).c_str()); - tp.tm_hour = atoi(dt.substr(11,2).c_str()); - tp.tm_min = atoi(dt.substr(14,2).c_str()); - tp.tm_sec = atoi(dt.substr(17,2).c_str()); - tp.tm_wday = 0; - tp.tm_yday = 0; - tp.tm_isdst = 0; - t = mktime(&tp); - if (t == -1) - { - Handler().LogError(this, "datetime2httpdate", 0, "mktime() failed"); - } - - snprintf(s,sizeof(s),"%s, %02d %s %d %02d:%02d:%02d GMT", - days[tp.tm_wday], - tp.tm_mday, - months[tp.tm_mon], - tp.tm_year + 1900, - tp.tm_hour,tp.tm_min,tp.tm_sec); - } - else - { - *s = 0; - } - return s; -} - - -std::string HttpdSocket::GetDate() -{ - time_t t = time(NULL); - char slask[40]; // yyyy-mm-dd hh:mm:ss -#ifdef __CYGWIN__ - struct tm *tp = localtime(&t); - snprintf(slask,sizeof(slask),"%d-%02d-%02d %02d:%02d:%02d", - tp -> tm_year + 1900, - tp -> tm_mon + 1, - tp -> tm_mday, - tp -> tm_hour,tp -> tm_min,tp -> tm_sec); -#else - struct tm tp; -#if defined( _WIN32) && !defined(__CYGWIN__) - localtime_s(&tp, &t); -#else - localtime_r(&t, &tp); -#endif - snprintf(slask,sizeof(slask),"%d-%02d-%02d %02d:%02d:%02d", - tp.tm_year + 1900, - tp.tm_mon + 1, - tp.tm_mday, - tp.tm_hour,tp.tm_min,tp.tm_sec); -#endif - return slask; -} - - -void HttpdSocket::Reset() -{ - HTTPSocket::Reset(); - m_content_length = 0; - if (m_file) - { - delete m_file; - m_file = NULL; - } - m_received = 0; - m_request_id = ++m_request_count; - if (m_cookies) - delete m_cookies; - m_cookies = NULL; - if (m_form) - delete m_form; - m_form = NULL; -} - - -const std::string& HttpdSocket::GetHttpDate() const -{ - return m_http_date; -} - - -HttpdCookies *HttpdSocket::GetCookies() -{ - return m_cookies; -} - - -const HttpdForm *HttpdSocket::GetForm() const -{ - return m_form; -} - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.h deleted file mode 100755 index f28cdf5573..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.h +++ /dev/null @@ -1,117 +0,0 @@ -/** \file HttpdSocket.h -*/ -/* -Copyright (C) 2001-2010 Anders Hedstrom (grymse@alhem.net) - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_HttpdSocket_H -#define _SOCKETS_HttpdSocket_H - -#include "sockets-config.h" -#include "HTTPSocket.h" -#include "ISocketHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpdCookies; -class HttpdForm; -class IFile; - -/** \defgroup webserver Webserver framework */ -/** Web server socket framework. - \ingroup webserver */ -class HttpdSocket : public HTTPSocket -{ -public: - HttpdSocket(ISocketHandler& ); - ~HttpdSocket(); - - void OnFirst(); - void OnHeader(const std::string& key,const std::string& value); - void OnHeaderComplete(); - void OnData(const char *,size_t); - - /** This method needs to be implemented with logic to produce - a response to an incoming request. */ - virtual void Exec() = 0; - /** Get current date in http rfc format. */ - const std::string& GetHttpDate() const; - /** Get pointer to cookie class. */ - HttpdCookies *GetCookies(); - /** Get pointer to query string/form data class. */ - const HttpdForm *GetForm() const; - - size_t ContentLength() const { - return m_content_length; - } - const IFile *Body() const { - return m_file; - } - int RequestId() const { - return m_request_id; - } - -protected: - HttpdSocket(const HttpdSocket& s) : HTTPSocket(s) {} - /** Decode and send a base64-encoded string. - \param str64 Base64-encoded string - \param type Mime type of content (content-type header) */ - void Send64(const std::string& str64, const std::string& type); - std::string datetime2httpdate(const std::string& dt); - std::string GetDate(); - void Reset(); - // headers - std::string m_http_cookie; - std::string m_content_type; - std::string m_content_length_str; - std::string m_if_modified_since; - -private: - HttpdSocket& operator=(const HttpdSocket& s) { - return *this; - } - static int m_request_count; - static std::string m_start; - size_t m_content_length; - IFile *m_file; - size_t m_received; - int m_request_id; - std::string m_http_date; - HttpdCookies *m_cookies; - HttpdForm *m_form; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpdSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IBase.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IBase.h deleted file mode 100755 index 49449b0434..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IBase.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - ** \file - ** \date 2007-06-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_IBase_H -#define _SOCKETS_IBase_H - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IBase -{ -public: - virtual ~IBase() {} - -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_IBase_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventHandler.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventHandler.h deleted file mode 100755 index 16ee1c237c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventHandler.h +++ /dev/null @@ -1,78 +0,0 @@ -/** \file IEventHandler.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_IEventHandler_H -#define _SOCKETS_IEventHandler_H - -#include "sockets-config.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IEventOwner; - -/** Timer event handler pure virtual base class. - \ingroup timer */ -class IEventHandler -{ -public: - virtual ~IEventHandler() {} - - /** Return time left until next event. - \param tv Time struct that will be filled by method - \return true if time is set for next event */ - virtual bool GetTimeUntilNextEvent(struct timeval *) = 0; - /** Will fire events whose time has come. */ - virtual void CheckEvents() = 0; - /** Schedule event for an owner. - \param from Event owner - \param sec Seconds until event - \param usec Microseconds until event */ - virtual long AddEvent(IEventOwner *,long sec,long usec) = 0; - /** Clear all events for a specific owner. */ - virtual void ClearEvents(IEventOwner *) = 0; - /** Remove one specific event for an event owner. */ - virtual void RemoveEvent(IEventOwner *,long) = 0; - -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IEventHandler_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.cpp deleted file mode 100755 index a2ac5b70df..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** \file IEventOwner.cpp - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "IEventOwner.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -IEventOwner::IEventOwner(IEventHandler& h) : m_event_handler(h), m_handler_invalid(false) -{ -} - - -IEventOwner::~IEventOwner() -{ - if (!m_handler_invalid) - { - m_event_handler.ClearEvents(this); - } -} - - -IEventHandler& IEventOwner::GetEventHandler() -{ - return m_event_handler; -} - - -long IEventOwner::AddEvent(long sec,long usec) -{ - return m_event_handler.AddEvent(this, sec, usec); -} - - -void IEventOwner::ClearEvents() -{ - m_event_handler.ClearEvents(this); -} - - -void IEventOwner::RemoveEvent(long eid) -{ - m_event_handler.RemoveEvent(this, eid); -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.h deleted file mode 100755 index 4c4857b1a1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.h +++ /dev/null @@ -1,82 +0,0 @@ -/** \file IEventOwner.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_IEventOwner_H -#define _SOCKETS_IEventOwner_H - -#include "sockets-config.h" -#include "IEventHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Any class that wants to use timer events inherits this. - \ingroup timer */ -class IEventOwner -{ -public: - IEventOwner(IEventHandler& h); - virtual ~IEventOwner(); - - /** Schedule event. - \param sec Seconds until event - \param usec Microseconds until event - \return Event ID */ - long AddEvent(long sec,long usec); - /** Clear all events scheduled by this owner. */ - void ClearEvents(); - /** Remove one event scheduled by this owner. - \param eid Event ID to remove */ - void RemoveEvent(long eid); - /** Event callback will fire when time is up. */ - virtual void OnEvent(int) = 0; - - IEventHandler& GetEventHandler(); - void SetHandlerInvalid(bool x = true) { - m_handler_invalid = x; - } - -private: - IEventHandler& m_event_handler; - bool m_handler_invalid; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IEventOwner_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFile.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFile.h deleted file mode 100755 index 847b2c7610..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFile.h +++ /dev/null @@ -1,75 +0,0 @@ -/** \file IFile.h - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_IFile_H -#define _SOCKETS_IFile_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** \defgroup file File handling */ -/** Pure virtual file I/O interface. - \ingroup file */ -class IFile -{ -public: - virtual ~IFile() {} - - virtual bool fopen(const std::string&, const std::string&) = 0; - virtual void fclose() const = 0; - - virtual size_t fread(char *, size_t, size_t) const = 0; - virtual size_t fwrite(const char *, size_t, size_t) = 0; - - virtual char *fgets(char *, int) const = 0; - virtual void fprintf(const char *format, ...) = 0; - - virtual off_t size() const = 0; - virtual bool eof() const = 0; - - virtual void reset_read() const = 0; - virtual void reset_write() = 0; - - virtual const std::string& Path() const = 0; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IFile_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFileUpload.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFileUpload.h deleted file mode 100755 index a697ee7cf2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFileUpload.h +++ /dev/null @@ -1,61 +0,0 @@ -/** \file IFileUpload.h - ** \date 2009-04-22 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_IFileUpload_H -#define _SOCKETS_IFileUpload_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IStream; - -/** Multipart form file upload callback. - \ingroup webserver */ -class IFileUpload -{ -public: - virtual ~IFileUpload() {} - - virtual IStream& IFileUploadBegin(const std::string& input_name, const std::string& filename, const std::string& content_type) = 0; - - virtual void IFileUploadEnd() = 0; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IFileUpload_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IHttpServer.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IHttpServer.h deleted file mode 100755 index 545b563643..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IHttpServer.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - ** \file IHttpServer.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_IHttpServer_H -#define _SOCKETS_IHttpServer_H - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpRequest; -class HttpResponse; - -class IHttpServer -{ -public: - virtual ~IHttpServer() {} - - /** Complete request has been received and parsed. Send response - using the Respond() method. */ - virtual void OnExec(const HttpRequest& req) = 0; - - /** Send response. */ - virtual void Respond(const HttpResponse& res) = 0; - - /** Called when the body part of the response has been sent. */ - virtual void OnResponseComplete() = 0; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_IHttpServer_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IMutex.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IMutex.h deleted file mode 100755 index 031fcad38a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IMutex.h +++ /dev/null @@ -1,58 +0,0 @@ -/** \file IMutex.h - ** \date 2008-10-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_IMutex_H -#define _SOCKETS_IMutex_H - -#include "sockets-config.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** IMutex interface. - \ingroup threading */ -class IMutex -{ -public: - virtual ~IMutex() {} - - virtual void Lock() const = 0; - virtual void Unlock() const = 0; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // _SOCKETS_IMutex_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ISocketHandler.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ISocketHandler.h deleted file mode 100755 index 4926489a00..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ISocketHandler.h +++ /dev/null @@ -1,262 +0,0 @@ -/** \file ISocketHandler.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_ISocketHandler_H -#define _SOCKETS_ISocketHandler_H -#include "sockets-config.h" - -#include -#include - -#include "socket_include.h" -#include "Socket.h" -#include "StdLog.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class SocketAddress; -class IMutex; - - -/** Socket container class, event generator. - \ingroup basic */ -class ISocketHandler -{ - friend class Socket; - -public: - /** Connection pool class for internal use by the ISocketHandler. - \ingroup internal */ -#ifdef ENABLE_POOL - class PoolSocket : public Socket - { - public: - PoolSocket(ISocketHandler& h,Socket *src) : Socket(h) { - CopyConnection( src ); - SetIsClient(); - } - - void OnRead() { - Handler().LogError(this, "OnRead", 0, "data on hibernating socket", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - void OnOptions(int,int,int,SOCKET) {} - - }; -#endif - -public: - virtual ~ISocketHandler() {} - - /** Return another instance */ - virtual ISocketHandler *Create(StdLog * = NULL) = 0; - - /** Return another instance */ - virtual ISocketHandler *Create(IMutex&, ISocketHandler&, StdLog * = NULL) = 0; - - /** Handler created with parent */ - virtual bool ParentHandlerIsValid() = 0; - - /** Get parent sockethandler */ - virtual ISocketHandler& ParentHandler() = 0; - - /** Get thread handler with least connections */ - virtual ISocketHandler& GetRandomHandler() = 0; - - /** Return parent handler if valid, otherwise return normal handler */ - virtual ISocketHandler& GetEffectiveHandler() = 0; - - /** Enable threading */ - virtual void SetNumberOfThreads(size_t n) = 0; - - /** Threading is enabled */ - virtual bool IsThreaded() = 0; - - /** Enable select release */ - virtual void EnableRelease() = 0; - - /** Make select release */ - virtual void Release() = 0; - - /** Get mutex reference for threadsafe operations. */ - virtual IMutex& GetMutex() const = 0; - - /** Register StdLog object for error callback. - \param log Pointer to log class */ - virtual void RegStdLog(StdLog *log) = 0; - - /** Log error to log class for print out / storage. */ - virtual void LogError(Socket *p,const std::string& user_text,int err,const std::string& sys_err,loglevel_t t = LOG_LEVEL_WARNING) = 0; - - // ------------------------------------------------------------------------- - // Socket stuff - // ------------------------------------------------------------------------- - /** Add socket instance to socket map. Removal is always automatic. */ - virtual void Add(Socket *) = 0; - -protected: - /** Remove socket from socket map, used by Socket class. */ - virtual void Remove(Socket *) = 0; - - /** Actual call to select() */ - virtual int ISocketHandler_Select(struct timeval *) = 0; - -public: - /** Set read/write/exception file descriptor sets (fd_set). */ - virtual void ISocketHandler_Add(Socket *,bool bRead,bool bWrite) = 0; - virtual void ISocketHandler_Mod(Socket *,bool bRead,bool bWrite) = 0; - virtual void ISocketHandler_Del(Socket *) = 0; - - /** Wait for events, generate callbacks. */ - virtual int Select(long sec,long usec) = 0; - /** This method will not return until an event has been detected. */ - virtual int Select() = 0; - /** Wait for events, generate callbacks. */ - virtual int Select(struct timeval *tsel) = 0; - - /** Check that a socket really is handled by this socket handler. */ - virtual bool Valid(Socket *) = 0; - /** Preferred method - Check that a socket still is handled by this socket handler. */ - virtual bool Valid(socketuid_t) = 0; - - /** Return number of sockets handled by this handler. */ - virtual size_t GetCount() = 0; - - /** Return maximum number of sockets allowed. */ - virtual size_t MaxCount() = 0; - - /** Override and return false to deny all incoming connections. - \param p ListenSocket class pointer (use GetPort to identify which one) */ - virtual bool OkToAccept(Socket *p) = 0; - - /** Use with care, always lock with h.GetMutex() if multithreaded */ - virtual const std::map& AllSockets() = 0; - - /** Override to accept longer lines than TCP_LINE_SIZE */ - virtual size_t MaxTcpLineSize() = 0; - - virtual void SetCallOnConnect(bool = true) = 0; - virtual void SetDetach(bool = true) = 0; - virtual void SetTimeout(bool = true) = 0; - virtual void SetRetry(bool = true) = 0; - virtual void SetClose(bool = true) = 0; - - - // ------------------------------------------------------------------------- - // Connection pool - // ------------------------------------------------------------------------- -#ifdef ENABLE_POOL - /** Find available open connection (used by connection pool). */ - virtual ISocketHandler::PoolSocket *FindConnection(int type,const std::string& protocol,SocketAddress&) = 0; - /** Enable connection pool (by default disabled). */ - virtual void EnablePool(bool = true) = 0; - /** Check pool status. - \return true if connection pool is enabled */ - virtual bool PoolEnabled() = 0; -#endif // ENABLE_POOL - - // ------------------------------------------------------------------------- - // Socks4 - // ------------------------------------------------------------------------- -#ifdef ENABLE_SOCKS4 - /** Set socks4 server ip that all new tcp sockets should use. */ - virtual void SetSocks4Host(ipaddr_t) = 0; - /** Set socks4 server hostname that all new tcp sockets should use. */ - virtual void SetSocks4Host(const std::string& ) = 0; - /** Set socks4 server port number that all new tcp sockets should use. */ - virtual void SetSocks4Port(port_t) = 0; - /** Set optional socks4 userid. */ - virtual void SetSocks4Userid(const std::string& ) = 0; - /** If connection to socks4 server fails, immediately try direct connection to final host. */ - virtual void SetSocks4TryDirect(bool = true) = 0; - /** Get socks4 server ip. - \return socks4 server ip */ - virtual ipaddr_t GetSocks4Host() = 0; - /** Get socks4 port number. - \return socks4 port number */ - virtual port_t GetSocks4Port() = 0; - /** Get socks4 userid (optional). - \return socks4 userid */ - virtual const std::string& GetSocks4Userid() = 0; - /** Check status of socks4 try direct flag. - \return true if direct connection should be tried if connection to socks4 server fails */ - virtual bool Socks4TryDirect() = 0; -#endif // ENABLE_SOCKS4 - - // ------------------------------------------------------------------------- - // DNS resolve server - // ------------------------------------------------------------------------- -#ifdef ENABLE_RESOLVER - /** Enable asynchronous DNS. - \param port Listen port of asynchronous dns server */ - virtual void EnableResolver(port_t = 16667) = 0; - /** Check resolver status. - \return true if resolver is enabled */ - virtual bool ResolverEnabled() = 0; - /** Queue a dns request. - \param host Hostname to be resolved - \param port Port number will be echoed in Socket::OnResolved callback */ - virtual int Resolve(Socket *,const std::string& host,port_t port) = 0; -#ifdef ENABLE_IPV6 - virtual int Resolve6(Socket *,const std::string& host,port_t port) = 0; -#endif - /** Do a reverse dns lookup. */ - virtual int Resolve(Socket *,ipaddr_t a) = 0; -#ifdef ENABLE_IPV6 - virtual int Resolve(Socket *,in6_addr& a) = 0; -#endif - /** Get listen port of asynchronous dns server. */ - virtual port_t GetResolverPort() = 0; - /** Resolver thread ready for queries. */ - virtual bool ResolverReady() = 0; - /** Returns true if socket waiting for a resolve event. */ - virtual bool Resolving(Socket *) = 0; -#endif // ENABLE_RESOLVER - -#ifdef ENABLE_DETACH - /** Indicates that the handler runs under SocketThread. */ - virtual void SetSlave(bool x = true) = 0; - /** Indicates that the handler runs under SocketThread. */ - virtual bool IsSlave() = 0; -#endif // ENABLE_DETACH - -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_ISocketHandler_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IStream.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IStream.h deleted file mode 100755 index 0ac47408ad..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IStream.h +++ /dev/null @@ -1,61 +0,0 @@ -/** \file IStream.h - ** \date 2008-11-15 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_IStream_H -#define _SOCKETS_IStream_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IStream -{ -public: - virtual ~IStream() {} - - /** Try to read 'buf_sz' number of bytes from source. - \return Number of bytes actually read. */ - virtual size_t IStreamRead(char *buf, size_t buf_sz) = 0; - - /** Write 'sz' bytes to destination. */ - virtual void IStreamWrite(const char *buf, size_t sz) = 0; - -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IStream_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.cpp deleted file mode 100755 index 0c0ab82a08..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/** - ** \file Ipv4Address.cpp - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "Ipv4Address.h" -#include "Utility.h" -#ifndef _WIN32 -#include -#endif - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - - -Ipv4Address::Ipv4Address(port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons( port ); -} - - -Ipv4Address::Ipv4Address(ipaddr_t a,port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons( port ); - memcpy(&m_addr.sin_addr, &a, sizeof(struct in_addr)); -} - - -Ipv4Address::Ipv4Address(struct in_addr& a,port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons( port ); - m_addr.sin_addr = a; -} - - -Ipv4Address::Ipv4Address(const std::string& host,port_t port) : m_valid(false) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons( port ); - { - ipaddr_t a; - if (Utility::u2ip(host, a)) - { - memcpy(&m_addr.sin_addr, &a, sizeof(struct in_addr)); - m_valid = true; - } - } -} - - -Ipv4Address::Ipv4Address(struct sockaddr_in& sa) -{ - m_addr = sa; - m_valid = sa.sin_family == AF_INET; -} - - -Ipv4Address::~Ipv4Address() -{ -} - - -Ipv4Address::operator struct sockaddr *() -{ - return (struct sockaddr *)&m_addr; -} - - -Ipv4Address::operator socklen_t() -{ - return sizeof(struct sockaddr_in); -} - - -void Ipv4Address::SetPort(port_t port) -{ - m_addr.sin_port = htons( port ); -} - - -port_t Ipv4Address::GetPort() -{ - return ntohs( m_addr.sin_port ); -} - - -bool Ipv4Address::Resolve(const std::string& hostname,struct in_addr& a) -{ - struct sockaddr_in sa; - memset(&a, 0, sizeof(a)); - if (Utility::isipv4(hostname)) - { - if (!Utility::u2ip(hostname, sa, AI_NUMERICHOST)) - return false; - a = sa.sin_addr; - return true; - } - if (!Utility::u2ip(hostname, sa)) - return false; - a = sa.sin_addr; - return true; -} - - -bool Ipv4Address::Reverse(struct in_addr& a,std::string& name) -{ - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_addr = a; - return Utility::reverse((struct sockaddr *)&sa, sizeof(sa), name); -} - - -std::string Ipv4Address::Convert(bool include_port) -{ - if (include_port) - return Convert(m_addr.sin_addr) + ":" + Utility::l2string(GetPort()); - return Convert(m_addr.sin_addr); -} - - -std::string Ipv4Address::Convert(struct in_addr& a) -{ - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_addr = a; - std::string name; - Utility::reverse((struct sockaddr *)&sa, sizeof(sa), name, NI_NUMERICHOST); - return name; -} - - -void Ipv4Address::SetAddress(struct sockaddr *sa) -{ - memcpy(&m_addr, sa, sizeof(struct sockaddr_in)); -} - - -int Ipv4Address::GetFamily() -{ - return m_addr.sin_family; -} - - -bool Ipv4Address::IsValid() -{ - return m_valid; -} - - -bool Ipv4Address::operator==(SocketAddress& a) -{ - if (a.GetFamily() != GetFamily()) - return false; - if ((socklen_t)a != sizeof(m_addr)) - return false; - struct sockaddr *sa = a; - struct sockaddr_in *p = (struct sockaddr_in *)sa; - if (p -> sin_port != m_addr.sin_port) - return false; - if (memcmp(&p -> sin_addr, &m_addr.sin_addr, 4)) - return false; - return true; -} - - -std::auto_ptr Ipv4Address::GetCopy() -{ - return std::auto_ptr(new Ipv4Address(m_addr)); -} - - -std::string Ipv4Address::Reverse() -{ - std::string tmp; - Reverse(m_addr.sin_addr, tmp); - return tmp; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.h deleted file mode 100755 index 8b47a3501b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - ** \file Ipv4Address.h - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Ipv4Address_H -#define _SOCKETS_Ipv4Address_H - -#include "sockets-config.h" -#include "SocketAddress.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/* Ipv4 address implementation. - \ingroup basic */ -class Ipv4Address : public SocketAddress -{ -public: - /** Create empty Ipv4 address structure. - \param port Port number */ - Ipv4Address(port_t port = 0); - /** Create Ipv4 address structure. - \param a Socket address in network byte order (as returned by Utility::u2ip) - \param port Port number in host byte order */ - Ipv4Address(ipaddr_t a,port_t port); - /** Create Ipv4 address structure. - \param a Socket address in network byte order - \param port Port number in host byte order */ - Ipv4Address(struct in_addr& a,port_t port); - /** Create Ipv4 address structure. - \param host Hostname to be resolved - \param port Port number in host byte order */ - Ipv4Address(const std::string& host,port_t port); - Ipv4Address(struct sockaddr_in&); - ~Ipv4Address(); - - // SocketAddress implementation - - operator struct sockaddr *(); - operator socklen_t(); - bool operator==(SocketAddress&); - - void SetPort(port_t port); - port_t GetPort(); - - void SetAddress(struct sockaddr *sa); - int GetFamily(); - - bool IsValid(); - std::auto_ptr GetCopy(); - - /** Convert address struct to text. */ - std::string Convert(bool include_port = false); - std::string Reverse(); - - /** Resolve hostname. */ - static bool Resolve(const std::string& hostname,struct in_addr& a); - /** Reverse resolve (IP to hostname). */ - static bool Reverse(struct in_addr& a,std::string& name); - /** Convert address struct to text. */ - static std::string Convert(struct in_addr& a); - -private: - Ipv4Address(const Ipv4Address& ) {} // copy constructor - Ipv4Address& operator=(const Ipv4Address& ) { - return *this; // assignment operator - } - struct sockaddr_in m_addr; - bool m_valid; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // _SOCKETS_Ipv4Address_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.cpp deleted file mode 100755 index d9addf641a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/** - ** \file Ipv6Address.cpp - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include -#include "Ipv6Address.h" -#ifdef ENABLE_IPV6 - -#include "Utility.h" -#ifndef _WIN32 -#include -#endif -#ifdef IPPROTO_IPV6 - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -Ipv6Address::Ipv6Address(port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin6_family = AF_INET6; - m_addr.sin6_port = htons( port ); -} - - -Ipv6Address::Ipv6Address(struct in6_addr& a,port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin6_family = AF_INET6; - m_addr.sin6_port = htons( port ); - m_addr.sin6_addr = a; -} - - -Ipv6Address::Ipv6Address(const std::string& host,port_t port) : m_valid(false) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin6_family = AF_INET6; - m_addr.sin6_port = htons( port ); - { - struct in6_addr a; - if (Utility::u2ip(host, a)) - { - m_addr.sin6_addr = a; - m_valid = true; - } - } -} - - -Ipv6Address::Ipv6Address(struct sockaddr_in6& sa) -{ - m_addr = sa; - m_valid = sa.sin6_family == AF_INET6; -} - - -Ipv6Address::~Ipv6Address() -{ -} - - -Ipv6Address::operator struct sockaddr *() -{ - return (struct sockaddr *)&m_addr; -} - - -Ipv6Address::operator socklen_t() -{ - return sizeof(struct sockaddr_in6); -} - - -void Ipv6Address::SetPort(port_t port) -{ - m_addr.sin6_port = htons( port ); -} - - -port_t Ipv6Address::GetPort() -{ - return ntohs( m_addr.sin6_port ); -} - - -bool Ipv6Address::Resolve(const std::string& hostname,struct in6_addr& a) -{ - struct sockaddr_in6 sa; - memset(&a, 0, sizeof(a)); - if (Utility::isipv6(hostname)) - { - if (!Utility::u2ip(hostname, sa, AI_NUMERICHOST)) - return false; - a = sa.sin6_addr; - return true; - } - if (!Utility::u2ip(hostname, sa)) - return false; - a = sa.sin6_addr; - return true; -} - - -bool Ipv6Address::Reverse(struct in6_addr& a,std::string& name) -{ - struct sockaddr_in6 sa; - memset(&sa, 0, sizeof(sa)); - sa.sin6_family = AF_INET6; - sa.sin6_addr = a; - return Utility::reverse((struct sockaddr *)&sa, sizeof(sa), name); -} - - -std::string Ipv6Address::Convert(bool include_port) -{ - if (include_port) - return Convert(m_addr.sin6_addr) + ":" + Utility::l2string(GetPort()); - return Convert(m_addr.sin6_addr); -} - - -std::string Ipv6Address::Convert(struct in6_addr& a,bool mixed) -{ - char slask[100]; // l2ip temporary - *slask = 0; - unsigned int prev = 0; - bool skipped = false; - bool ok_to_skip = true; - if (mixed) - { - unsigned short x; - unsigned short addr16[8]; - memcpy(addr16, &a, sizeof(addr16)); - for (size_t i = 0; i < 6; i++) - { - x = ntohs(addr16[i]); - if (*slask && (x || !ok_to_skip || prev)) - { -#if defined( _WIN32) && !defined(__CYGWIN__) - strcat_s(slask,sizeof(slask),":"); -#else - strcat(slask,":"); -#endif - } - if (x || !ok_to_skip) - { - snprintf(slask + strlen(slask), sizeof(slask) - strlen(slask),"%x", x); - if (x && skipped) - ok_to_skip = false; - } - else - { - skipped = true; - } - prev = x; - } - x = ntohs(addr16[6]); - snprintf(slask + strlen(slask), sizeof(slask) - strlen(slask),":%u.%u",x / 256,x & 255); - x = ntohs(addr16[7]); - snprintf(slask + strlen(slask), sizeof(slask) - strlen(slask),".%u.%u",x / 256,x & 255); - } - else - { - struct sockaddr_in6 sa; - memset(&sa, 0, sizeof(sa)); - sa.sin6_family = AF_INET6; - sa.sin6_addr = a; - std::string name; - Utility::reverse((struct sockaddr *)&sa, sizeof(sa), name, NI_NUMERICHOST); - return name; - } - return slask; -} - - -void Ipv6Address::SetAddress(struct sockaddr *sa) -{ - memcpy(&m_addr, sa, sizeof(struct sockaddr_in6)); -} - - -int Ipv6Address::GetFamily() -{ - return m_addr.sin6_family; -} - - -void Ipv6Address::SetFlowinfo(uint32_t x) -{ - m_addr.sin6_flowinfo = x; -} - - -uint32_t Ipv6Address::GetFlowinfo() -{ - return m_addr.sin6_flowinfo; -} - - -#ifndef _WIN32 -void Ipv6Address::SetScopeId(uint32_t x) -{ - m_addr.sin6_scope_id = x; -} - - -uint32_t Ipv6Address::GetScopeId() -{ - return m_addr.sin6_scope_id; -} -#endif - - -bool Ipv6Address::IsValid() -{ - return m_valid; -} - - -bool Ipv6Address::operator==(SocketAddress& a) -{ - if (a.GetFamily() != GetFamily()) - return false; - if ((socklen_t)a != sizeof(m_addr)) - return false; - struct sockaddr *sa = a; - struct sockaddr_in6 *p = (struct sockaddr_in6 *)sa; - if (p -> sin6_port != m_addr.sin6_port) - return false; - if (memcmp(&p -> sin6_addr, &m_addr.sin6_addr, sizeof(struct in6_addr))) - return false; - return true; -} - - -std::auto_ptr Ipv6Address::GetCopy() -{ - return std::auto_ptr(new Ipv6Address(m_addr)); -} - - -std::string Ipv6Address::Reverse() -{ - std::string tmp; - Reverse(m_addr.sin6_addr, tmp); - return tmp; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // IPPROTO_IPV6 -#endif // ENABLE_IPV6 - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.h deleted file mode 100755 index 86957d360c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.h +++ /dev/null @@ -1,120 +0,0 @@ -/** - ** \file Ipv6Address.h - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Ipv6Address_H -#define _SOCKETS_Ipv6Address_H -#include "sockets-config.h" -#ifdef ENABLE_IPV6 - -#include "SocketAddress.h" -#ifdef IPPROTO_IPV6 -#if defined( _WIN32) && !defined(__CYGWIN__) -typedef unsigned __int32 uint32_t; -#endif - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Ipv6 address implementation. - \ingroup basic */ -class Ipv6Address : public SocketAddress -{ -public: - /** Create empty Ipv6 address structure. - \param port Port number */ - Ipv6Address(port_t port = 0); - /** Create Ipv6 address structure. - \param a Socket address in network byte order - \param port Port number in host byte order */ - Ipv6Address(struct in6_addr& a,port_t port); - /** Create Ipv6 address structure. - \param host Hostname to be resolved - \param port Port number in host byte order */ - Ipv6Address(const std::string& host,port_t port); - Ipv6Address(struct sockaddr_in6&); - ~Ipv6Address(); - - // SocketAddress implementation - - operator struct sockaddr *(); - operator socklen_t(); - bool operator==(SocketAddress&); - - void SetPort(port_t port); - port_t GetPort(); - - void SetAddress(struct sockaddr *sa); - int GetFamily(); - - bool IsValid(); - std::auto_ptr GetCopy(); - - /** Convert address struct to text. */ - std::string Convert(bool include_port = false); - std::string Reverse(); - - /** Resolve hostname. */ - static bool Resolve(const std::string& hostname,struct in6_addr& a); - /** Reverse resolve (IP to hostname). */ - static bool Reverse(struct in6_addr& a,std::string& name); - /** Convert address struct to text. */ - static std::string Convert(struct in6_addr& a,bool mixed = false); - - void SetFlowinfo(uint32_t); - uint32_t GetFlowinfo(); -#ifndef _WIN32 - void SetScopeId(uint32_t); - uint32_t GetScopeId(); -#endif - -private: - Ipv6Address(const Ipv6Address& ) {} // copy constructor - Ipv6Address& operator=(const Ipv6Address& ) { - return *this; // assignment operator - } - struct sockaddr_in6 m_addr; - bool m_valid; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // IPPROTO_IPV6 -#endif // ENABLE_IPV6 -#endif // _SOCKETS_Ipv6Address_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.cpp deleted file mode 100755 index 93791295b3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.cpp +++ /dev/null @@ -1,572 +0,0 @@ -#include "Json.h" -#include -#include -#include "Utility.h" - -#define C buffer[index] - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// -------------------------------------------------------------------------------- -Json::Json() : m_type(TYPE_UNKNOWN) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(char value) : m_type(TYPE_INTEGER), m_i_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(short value) : m_type(TYPE_INTEGER), m_i_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(long value) : m_type(TYPE_INTEGER), m_i_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -//Json::Json(int64_t value) : m_type(TYPE_INTEGER), m_i_value(value) -Json::Json(long long value) : m_type(TYPE_INTEGER), m_i_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(double value) : m_type(TYPE_REAL), m_d_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(const char *value) : m_type(TYPE_STRING), m_str_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(const std::string& value) : m_type(TYPE_STRING), m_str_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(bool value) : m_type(TYPE_BOOLEAN), m_b_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(json_type_t t) : m_type(t) -{ - if (t != TYPE_ARRAY && t != TYPE_OBJECT) - throw Exception("Must be type: Array or type: Object"); -} - - -// -------------------------------------------------------------------------------- -Json::~Json() -{ -} - - -// -------------------------------------------------------------------------------- -Json::json_type_t Json::Type() const { return m_type; } - - -// -------------------------------------------------------------------------------- -bool Json::HasValue(const std::string& name) const -{ - if (m_type != TYPE_OBJECT) - return false; - return m_object.find(name) != m_object.end(); -} - - -// -------------------------------------------------------------------------------- -Json::operator char() const -{ - return (char)m_i_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator short() const -{ - return (short)m_i_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator long() const -{ - return m_i_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator int64_t() const -{ - return m_i_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator double() const -{ - return m_d_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator std::string() const -{ - return m_str_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator bool() const -{ - return m_b_value; -} - - -// -------------------------------------------------------------------------------- -const Json& Json::operator[](const char *name) const -{ - if (m_type != TYPE_OBJECT) - throw Exception("Must be type: Object"); - json_map_t::const_iterator it = m_object.find(name); - if (it != m_object.end()) - return it -> second; - throw Exception("Key not found: " + std::string(name)); -} - -// -------------------------------------------------------------------------------- -Json& Json::operator[](const char *name) -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_OBJECT; - if (m_type != TYPE_OBJECT) - throw Exception("Must be type: Object"); - return m_object[name]; -} - - -// -------------------------------------------------------------------------------- -const Json& Json::operator[](const std::string& name) const -{ - if (m_type != TYPE_OBJECT) - throw Exception("Must be type: Object"); - json_map_t::const_iterator it = m_object.find(name); - if (it != m_object.end()) - return it -> second; - throw Exception("Key not found: " + name); -} - -// -------------------------------------------------------------------------------- -Json& Json::operator[](const std::string& name) -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_OBJECT; - if (m_type != TYPE_OBJECT) - throw Exception("Must be type: Object"); - return m_object[name]; -} - - -// -------------------------------------------------------------------------------- -void Json::Add(Json data) -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_ARRAY; - if (m_type != TYPE_ARRAY) - throw Exception("trying to add array data in non-array"); - m_array.push_back(data); -} - - -// -------------------------------------------------------------------------------- -const std::string& Json::GetString() const -{ - return m_str_value; -} - - -// -------------------------------------------------------------------------------- -Json::json_list_t& Json::GetArray() -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_ARRAY; - if (m_type != TYPE_ARRAY) - throw Exception("Json instance not of type: Array"); - return m_array; -} - - -// -------------------------------------------------------------------------------- -Json::json_map_t& Json::GetObject() -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_OBJECT; - if (m_type != TYPE_OBJECT) - throw Exception("Json instance not of type: Array"); - return m_object; -} - - -// -------------------------------------------------------------------------------- -const Json::json_list_t& Json::GetArray() const -{ - if (m_type != TYPE_ARRAY) - throw Exception("Json instance not of type: Array"); - return m_array; -} - - -// -------------------------------------------------------------------------------- -const Json::json_map_t& Json::GetObject() const -{ - if (m_type != TYPE_OBJECT) - throw Exception("Json instance not of type: Array"); - return m_object; -} - - -// -------------------------------------------------------------------------------- -Json Json::Parse(const std::string& data) -{ - size_t i = 0; - Json obj; - obj.Parse(data.c_str(), i); - return obj; -} - - -// -------------------------------------------------------------------------------- -char Json::Parse(const char *buffer, size_t& index) -{ - while (C == ' ' || C == 9 || C == 13 || C == 10) - ++index; - size_t x = index; // origin - std::string ord; - if (C == '-' || isdigit(C)) // Number - { - bool dot = false; - if (C == '-') - { - ++index; - } - while (isdigit(C) || C == '.') - { - if (C == '.') - dot = true; - ++index; - } - size_t sz = index - x; - ord.resize(sz); - memcpy(&ord[0], &buffer[x], sz); - if (dot) - { - m_type = TYPE_REAL; - m_d_value = atof(ord.c_str()); - } - else - { - m_type = TYPE_INTEGER; - m_i_value = atoi(ord.c_str()); - } - } - else - if (C == 34) // " - String - { - bool ign = false; - x = ++index; - while (C && (ign || C != 34)) - { - if (ign) - { - ign = false; - } - else - if (C == '\\') - { - ign = true; - } - ++index; - } - size_t sz = index - x; - ord.resize(sz); - memcpy(&ord[0], &buffer[x], sz); - decode(ord); - ++index; - m_type = TYPE_STRING; - m_str_value = ord; - } - else - if (!strncmp(&buffer[index], "null", 4)) // null value - { - m_type = TYPE_UNKNOWN; - index += 4; - } - else - if (!strncmp(&buffer[index], "true", 4)) // Boolean: true - { - m_type = TYPE_BOOLEAN; - m_b_value = true; - index += 4; - } - else - if (!strncmp(&buffer[index], "false", 5)) // Boolean: false - { - m_type = TYPE_BOOLEAN; - m_b_value = false; - index += 5; - } - else - if (C == '[') // Array - { - ++index; - m_type = TYPE_ARRAY; - while (true) - { - char res; - Json o; - if ((res = o.Parse(buffer, index)) == 0) - { - m_array.push_back(o); - } - else - if (res == ']') - { - break; - } - else - if (res == ',') // another element follows - { - } - else - { - throw Exception(std::string("Unexpected end of Array: ") + res); - } - } - } - else - if (C == ']') // end of Array - { - ++index; - return ']'; - } - else - if (C == '{') // Object - { - ++index; - m_type = TYPE_OBJECT; - int state = 0; - std::string element_name; - bool quit = false; - while (!quit) - { - Json o; - char res = o.Parse(buffer, index); - switch (state) - { - case 0: - if (res == ',') // another object follow - break; - if (res == '}') // end of Object - { - quit = true; - break; - } - if (res || o.Type() != TYPE_STRING) - throw Exception("Object element name missing"); - element_name = o.GetString(); - state = 1; - break; - case 1: - if (res != ':') - throw Exception("Object element separator missing"); - state = 2; - break; - case 2: - if (res) - throw Exception(std::string("Unexpected character when parsing anytype: ") + res); - m_object[element_name] = o; - state = 0; - break; - } - } - } - else - if (C == '}') // end of Object - { - ++index; - return '}'; - } - else - if (C == ',') - { - ++index; - return ','; - } - else - if (C == ':') - { - ++index; - return ':'; - } - else - { - throw Exception("Can't parse Json representation: " + std::string(&buffer[index])); - } - return 0; -} - - -// -------------------------------------------------------------------------------- -std::string Json::ToString(bool quote) const -{ - switch (m_type) - { - case TYPE_UNKNOWN: - break; - case TYPE_INTEGER: - return Utility::l2string(m_i_value); - case TYPE_REAL: - { - char slask[100]; - sprintf(slask, "%f", m_d_value); - return slask; - } - case TYPE_STRING: - { - std::ostringstream tmp; - tmp << "\"" << encode(m_str_value) << "\""; - return tmp.str(); - } - case TYPE_BOOLEAN: - return m_b_value ? "true" : "false"; - case TYPE_ARRAY: - { - std::ostringstream tmp; - bool first = true; - tmp << "["; - for (json_list_t::const_iterator it = m_array.begin(); it != m_array.end(); it++) - { - const Json& ref = *it; - if (!first) - tmp << ","; - tmp << ref.ToString(quote); - first = false; - } - tmp << "]"; - return tmp.str(); - } - case TYPE_OBJECT: - { - std::ostringstream tmp; - bool first = true; - tmp << "{"; - for (json_map_t::const_iterator it = m_object.begin(); it != m_object.end(); it++) - { - const std::pair& ref = *it; - if (!first) - tmp << ","; - if (quote) - tmp << "\"" << encode(ref.first) << "\":" << ref.second.ToString(quote); - else - tmp << ref.first << ":" << ref.second.ToString(quote); - first = false; - } - tmp << "}"; - return tmp.str(); - } - } - return "null"; -} - - -// -------------------------------------------------------------------------------- -void Json::encode(std::string& src) const -{ - size_t pos = src.find("\\"); - while (pos != std::string::npos) - { - src.replace(pos, 1, "\\\\"); - pos = src.find("\\", pos + 2); - } - pos = src.find("\r"); - while (pos != std::string::npos) - { - src.replace(pos, 1, "\\r"); - pos = src.find("\r", pos + 2); - } - pos = src.find("\n"); - while (pos != std::string::npos) - { - src.replace(pos, 1, "\\n"); - pos = src.find("\n", pos + 2); - } - pos = src.find("\""); - while (pos != std::string::npos) - { - src.replace(pos, 1, "\\\""); - pos = src.find("\"", pos + 2); - } -} - - -// -------------------------------------------------------------------------------- -void Json::decode(std::string& src) const -{ - size_t pos = src.find("\\\""); - while (pos != std::string::npos) - { - src.replace(pos, 2, "\""); - pos = src.find("\\\"", pos + 1); - } - pos = src.find("\\r"); - while (pos != std::string::npos) - { - src.replace(pos, 2, "\r"); - pos = src.find("\\r", pos + 1); - } - pos = src.find("\\n"); - while (pos != std::string::npos) - { - src.replace(pos, 2, "\n"); - pos = src.find("\\n", pos + 1); - } - pos = src.find("\\\\"); - while (pos != std::string::npos) - { - src.replace(pos, 2, "\\"); - pos = src.find("\\\\", pos + 1); - } -} - - -// -------------------------------------------------------------------------------- -std::string Json::encode(const std::string& src) const -{ - std::string tmp(src); - encode(tmp); - return tmp; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.h deleted file mode 100755 index 66792dba8c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef _SOCKETS_Json_H -#define _SOCKETS_Json_H - -#include "Exception.h" -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class Json -{ -public: - typedef std::list json_list_t; - typedef std::map json_map_t; - - typedef enum { - TYPE_UNKNOWN = 0, - TYPE_INTEGER, - TYPE_REAL, - TYPE_STRING, - TYPE_BOOLEAN, - TYPE_ARRAY, - TYPE_OBJECT - } json_type_t; - -public: - /** Default constructor */ - Json(); //m_type(TYPE_UNKNOWN); - - /** Basic type constructors */ - Json(char value); - Json(short value); - Json(long value); //m_type(TYPE_INTEGER), m_i_value(value); - Json(long long value); - // LG Json(int64_t value); - Json(double value); //m_type(TYPE_REAL), m_d_value(value); - Json(const char *value); //m_type(TYPE_STRING), m_str_value(value); - Json(const std::string& value); //m_type(TYPE_STRING), m_str_value(value); - Json(bool value); //m_type(TYPE_BOOLEAN), m_b_value(value); - - /** Complex type constructor (array, object) */ - Json(json_type_t t); //m_type(t); - - virtual ~Json(); - - char Parse(const char *buffer, size_t& index); - - json_type_t Type() const; - - bool HasValue(const std::string& name) const; - - operator char() const; - operator short() const; - operator long() const; - //operator int64_t() const; - operator long long() const; - operator double() const; - operator std::string() const; - operator bool() const; - - const Json& operator[](const char *name) const; - Json& operator[](const char *name); - - const Json& operator[](const std::string& name) const; - Json& operator[](const std::string& name); - - void Add(Json data); - - const std::string& GetString() const; - - const json_list_t& GetArray() const; - json_list_t& GetArray(); - - const json_map_t& GetObject() const; - json_map_t& GetObject(); - - std::string ToString(bool quote = true) const; - - static Json Parse(const std::string& data); - - void encode(std::string& src) const; - void decode(std::string& src) const; - std::string encode(const std::string&) const; - -private: - json_type_t m_type; - long m_i_value; - double m_d_value; - std::string m_str_value; - bool m_b_value; - json_list_t m_array; - json_map_t m_object; -}; - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_Json_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ListenSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ListenSocket.h deleted file mode 100755 index f1299617b4..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ListenSocket.h +++ /dev/null @@ -1,511 +0,0 @@ -/** \file ListenSocket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_ListenSocket_H -#define _SOCKETS_ListenSocket_H -#include "sockets-config.h" - -#ifdef _WIN32 -#include -#else -#include -#endif - -#include "ISocketHandler.h" -#include "Socket.h" -#include "Utility.h" -#include "SctpSocket.h" -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#ifdef ENABLE_EXCEPTIONS -#include "Exception.h" -#endif -#include "Lock.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Binds incoming port number to new Socket class X. - \ingroup basic */ -template -class ListenSocket : public Socket -{ -public: - /** Constructor. - \param h ISocketHandler reference - \param use_creator Optional use of creator (default true) */ - ListenSocket(ISocketHandler& h,bool use_creator = true) : Socket(h), m_depth(0), m_creator(NULL) - ,m_bHasCreate(false) { - if (use_creator) { - m_creator = new X(h); - Socket *tmp = m_creator -> Create(); - - if (tmp && dynamic_cast(tmp)) { - m_bHasCreate = true; - } - - if (tmp) { - delete tmp; - } - } - } - ~ListenSocket() { - if (m_creator) { - delete m_creator; - } - } - - /** Close file descriptor. */ - int Close() { - if (GetSocket() != INVALID_SOCKET) { - if (closesocket(GetSocket()) == -1) { - } else { - Attach(INVALID_SOCKET); - } - } - - return 0; - } - - /** Bind and listen to any interface. - \param port Port (0 is random) - \param depth Listen queue depth */ - int Bind(port_t port,int depth = 20) { -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (IsIpv6()) { - Ipv6Address ad(port); - return Bind(ad, depth); - } else -#endif -#endif - { - Ipv4Address ad(port); - return Bind(ad, depth); - } - } - - int Bind(SocketAddress& ad,int depth) { -#ifdef USE_SCTP - - if (dynamic_cast(m_creator)) { - return Bind(ad, "sctp", depth); - } - -#endif - return Bind(ad, "tcp", depth); - } - - /** Bind and listen to any interface, with optional protocol. - \param port Port (0 is random) - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(port_t port,const std::string& protocol,int depth = 20) { -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (IsIpv6()) { - Ipv6Address ad(port); - return Bind(ad, protocol, depth); - } else -#endif -#endif - { - Ipv4Address ad(port); - return Bind(ad, protocol, depth); - } - } - - /** Bind and listen to specific interface. - \param intf Interface hostname - \param port Port (0 is random) - \param depth Listen queue depth */ - int Bind(const std::string& intf,port_t port,int depth = 20) { -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (IsIpv6()) { - Ipv6Address ad(intf, port); - - if (ad.IsValid()) { - return Bind(ad, depth); - } - - Handler().LogError(this, "Bind", 0, "name resolution of interface name failed", LOG_LEVEL_FATAL); - return -1; - } else -#endif -#endif - { - Ipv4Address ad(intf, port); - - if (ad.IsValid()) { - return Bind(ad, depth); - } - - Handler().LogError(this, "Bind", 0, "name resolution of interface name failed", LOG_LEVEL_FATAL); - return -1; - } - } - - /** Bind and listen to specific interface. - \param intf Interface hostname - \param port Port (0 is random) - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(const std::string& intf,port_t port,const std::string& protocol,int depth = 20) { -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (IsIpv6()) { - Ipv6Address ad(intf, port); - - if (ad.IsValid()) { - return Bind(ad, protocol, depth); - } - - Handler().LogError(this, "Bind", 0, "name resolution of interface name failed", LOG_LEVEL_FATAL); - return -1; - } else -#endif -#endif - { - Ipv4Address ad(intf, port); - - if (ad.IsValid()) { - return Bind(ad, protocol, depth); - } - - Handler().LogError(this, "Bind", 0, "name resolution of interface name failed", LOG_LEVEL_FATAL); - return -1; - } - } - - /** Bind and listen to ipv4 interface. - \param a Ipv4 interface address - \param port Port (0 is random) - \param depth Listen queue depth */ - int Bind(ipaddr_t a,port_t port,int depth = 20) { - Ipv4Address ad(a, port); -#ifdef USE_SCTP - - if (dynamic_cast(m_creator)) { - return Bind(ad, "sctp", depth); - } - -#endif - return Bind(ad, "tcp", depth); - } - /** Bind and listen to ipv4 interface. - \param a Ipv4 interface address - \param port Port (0 is random) - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(ipaddr_t a,port_t port,const std::string& protocol,int depth) { - Ipv4Address ad(a, port); - return Bind(ad, protocol, depth); - } - -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - /** Bind and listen to ipv6 interface. - \param a Ipv6 interface address - \param port Port (0 is random) - \param depth Listen queue depth */ - int Bind(in6_addr a,port_t port,int depth = 20) { - Ipv6Address ad(a, port); -#ifdef USE_SCTP - - if (dynamic_cast(m_creator)) { - return Bind(ad, "sctp", depth); - } - -#endif - return Bind(ad, "tcp", depth); - } - /** Bind and listen to ipv6 interface. - \param a Ipv6 interface address - \param port Port (0 is random) - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(in6_addr a,port_t port,const std::string& protocol,int depth) { - Ipv6Address ad(a, port); - return Bind(ad, protocol, depth); - } -#endif -#endif - - /** Bind and listen to network interface. - \param ad Interface address - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(SocketAddress& ad,const std::string& protocol,int depth) { - SOCKET s; - - if ( (s = CreateSocket(ad.GetFamily(), SOCK_STREAM, protocol)) == INVALID_SOCKET) { - return -1; - } - - // socket must be nonblocking for async connect - if (!SetNonblocking(true, s)) { - closesocket(s); - return -1; - } - - if (bind(s, ad, ad) == -1) { - Handler().LogError(this, "bind", Errno, StrError(Errno), LOG_LEVEL_FATAL); - closesocket(s); -#ifdef ENABLE_EXCEPTIONS - throw Exception("bind() failed for port " + Utility::l2string(ad.GetPort()) + ": " + StrError(Errno)); -#endif - return -1; - } - - if (listen(s, depth) == -1) { - Handler().LogError(this, "listen", Errno, StrError(Errno), LOG_LEVEL_FATAL); - closesocket(s); -#ifdef ENABLE_EXCEPTIONS - throw Exception("listen() failed for port " + Utility::l2string(ad.GetPort()) + ": " + StrError(Errno)); -#endif - return -1; - } - - m_depth = depth; - Attach(s); - return 0; - } - - /** Return assigned port number. */ - port_t GetPort() { - return GetSockPort(); - } - - /** Return listen queue depth. */ - int GetDepth() { - return m_depth; - } - - /** OnRead on a ListenSocket receives an incoming connection. */ - void OnRead() { - struct sockaddr sa; - int max = 10; // process max 10 incoming connection in one call - - while (max--) { - socklen_t sa_len = sizeof(struct sockaddr); - SOCKET a_s = accept(GetSocket(), &sa, &sa_len); - - if (a_s == INVALID_SOCKET) { - // EAGAIN or EWOULDBLOCK -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - { - Handler().LogError(this, "accept", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - - return; - } - - if (!Handler().OkToAccept(this)) { - Handler().LogError(this, "accept", -1, "Not OK to accept", LOG_LEVEL_WARNING); - closesocket(a_s); - return; - } - - if (Handler().GetCount() >= Handler().MaxCount()) { - Handler().LogError(this, "accept", (int)Handler().GetCount(), "ISocketHandler socket limit reached", LOG_LEVEL_FATAL); - closesocket(a_s); - return; - } - - // - Socket *tmp = NULL; - - if (Handler().IsThreaded()) { - ISocketHandler& h = Handler().GetRandomHandler(); - tmp = new X(h); // %! no support for Create -#ifdef ENABLE_IPV6 - tmp -> SetIpv6( IsIpv6() ); -#endif - tmp -> SetParent(this); - tmp -> Attach(a_s); - tmp -> SetNonblocking(true); -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (sa_len == sizeof(struct sockaddr_in6)) { - if (reinterpret_cast(sa).sin6_family == AF_INET6) { - Ipv6Address ad(reinterpret_cast(sa).sin6_addr, - ntohs(reinterpret_cast(sa).sin6_port)); - ad.SetFlowinfo(reinterpret_cast(sa).sin6_flowinfo); -#ifndef _WIN32 - ad.SetScopeId(reinterpret_cast(sa).sin6_scope_id); -#endif - tmp -> SetRemoteAddress(ad); - } - } - -#endif -#endif - - if (sa_len == sizeof(struct sockaddr_in)) { - struct sockaddr_in *p = (struct sockaddr_in *)&sa; - - if (p -> sin_family == AF_INET) { - Ipv4Address ad(p -> sin_addr,ntohs(p -> sin_port)); - tmp -> SetRemoteAddress(ad); - } - } - - tmp -> SetConnected(true); - tmp -> Init(); - tmp -> SetDeleteByHandler(true); - { - Lock lock(h.GetMutex()); - h.Add(tmp); -#ifdef HAVE_OPENSSL - - if (tmp -> IsSSL()) { // SSL Enabled socket - // %! OnSSLAccept calls SSLNegotiate that can finish in this one call. - // %! If that happens and negotiation fails, the 'tmp' instance is - // %! still added to the list of active sockets in the sockethandler. - // %! See bugfix for this in SocketHandler::Select - don't Set rwx - // %! flags if CloseAndDelete() flag is true. - // %! An even better fugbix (see TcpSocket::OnSSLAccept) now avoids - // %! the Add problem altogether, so ignore the above. - // %! (OnSSLAccept does no longer call SSLNegotiate().) - tmp -> OnSSLAccept(); - } else -#endif - { - tmp -> OnAccept(); - } - } - h.Release(); - } else { - tmp = m_bHasCreate ? m_creator -> Create() : new X(Handler()); -#ifdef ENABLE_IPV6 - tmp -> SetIpv6( IsIpv6() ); -#endif - tmp -> SetParent(this); - tmp -> Attach(a_s); - tmp -> SetNonblocking(true); -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (sa_len == sizeof(struct sockaddr_in6)) { - if (reinterpret_cast(sa).sin6_family == AF_INET6) { - Ipv6Address ad(reinterpret_cast(sa).sin6_addr, - ntohs(reinterpret_cast(sa).sin6_port)); - ad.SetFlowinfo(reinterpret_cast(sa).sin6_flowinfo); -#ifndef _WIN32 - ad.SetScopeId(reinterpret_cast(sa).sin6_scope_id); -#endif - tmp -> SetRemoteAddress(ad); - } - } - -#endif -#endif - - if (sa_len == sizeof(struct sockaddr_in)) { - struct sockaddr_in *p = (struct sockaddr_in *)&sa; - - if (p -> sin_family == AF_INET) { - Ipv4Address ad(p -> sin_addr,ntohs(p -> sin_port)); - tmp -> SetRemoteAddress(ad); - } - } - - tmp -> SetConnected(true); - tmp -> Init(); - tmp -> SetDeleteByHandler(true); - Handler().Add(tmp); -#ifdef HAVE_OPENSSL - - if (tmp -> IsSSL()) { // SSL Enabled socket - // %! OnSSLAccept calls SSLNegotiate that can finish in this one call. - // %! If that happens and negotiation fails, the 'tmp' instance is - // %! still added to the list of active sockets in the sockethandler. - // %! See bugfix for this in SocketHandler::Select - don't Set rwx - // %! flags if CloseAndDelete() flag is true. - // %! An even better fugbix (see TcpSocket::OnSSLAccept) now avoids - // %! the Add problem altogether, so ignore the above. - // %! (OnSSLAccept does no longer call SSLNegotiate().) - tmp -> OnSSLAccept(); - } else -#endif - { - tmp -> OnAccept(); - } - } - } // while (true) - } - - /** Please don't use this method. - "accept()" is handled automatically in the OnRead() method. */ - virtual SOCKET Accept(SOCKET socket, struct sockaddr *saptr, socklen_t *lenptr) { - return accept(socket, saptr, lenptr); - } - - bool HasCreator() { - return m_bHasCreate; - } - - void OnOptions(int,int,int,SOCKET) { - SetSoReuseaddr(true); - } - -protected: - ListenSocket(const ListenSocket& s) : Socket(s) {} -private: - ListenSocket& operator=(const ListenSocket& ) { - return *this; - } - int m_depth; - X *m_creator; - bool m_bHasCreate; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_ListenSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.cpp deleted file mode 100755 index 01172e1b60..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/** \file Lock.cpp - ** \date 2005-08-22 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "IMutex.h" -#include "Lock.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -Lock::Lock(const IMutex& m) : m_mutex(m) -{ - m_mutex.Lock(); -} - - -Lock::~Lock() -{ - m_mutex.Unlock(); -} - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.h deleted file mode 100755 index 8a5a329f86..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.h +++ /dev/null @@ -1,62 +0,0 @@ -/** \file Lock.h - ** \date 2005-08-22 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Lock_H -#define _SOCKETS_Lock_H - -#include "sockets-config.h" -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IMutex; - -/** IMutex encapsulation class. - \ingroup threading */ -class Lock -{ -public: - Lock(const IMutex&); - ~Lock(); - -private: - const IMutex& m_mutex; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // _SOCKETS_Lock_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Makefile.am b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Makefile.am deleted file mode 100755 index 8e4fe2424e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Makefile.am +++ /dev/null @@ -1,44 +0,0 @@ -noinst_LIBRARIES = libsockets.a - -libsockets_a_SOURCES = Ajp13Socket.cpp HttpRequest.cpp SocketHandlerEp.cpp \ - AjpBaseSocket.cpp HttpResponse.cpp SocketHandlerThread.cpp \ - Base64.cpp HTTPSocket.cpp socket_include.cpp \ - Debug.cpp HttpTransaction.cpp \ - Event.cpp IEventOwner.cpp SocketStream.cpp \ - EventHandler.cpp Ipv4Address.cpp SocketThread.cpp \ - EventTime.cpp Ipv6Address.cpp SSLInitializer.cpp \ - Exception.cpp Json.cpp StdoutLog.cpp \ - File.cpp Lock.cpp StreamSocket.cpp \ - FileStream.cpp MemFile.cpp StreamWriter.cpp \ - HttpBaseSocket.cpp Mutex.cpp TcpSocket.cpp \ - HttpClientSocket.cpp Parse.cpp Thread.cpp \ - HttpdCookies.cpp ResolvServer.cpp UdpSocket.cpp \ - HttpDebugSocket.cpp ResolvSocket.cpp Utility.cpp \ - HttpdForm.cpp SctpSocket.cpp XmlDocument.cpp \ - HttpdSocket.cpp Semaphore.cpp XmlException.cpp \ - HttpGetSocket.cpp SmtpdSocket.cpp XmlNode.cpp \ - HttpPostSocket.cpp Socket.cpp \ - HttpPutSocket.cpp SocketHandler.cpp \ - ajp13.h HttpTransaction.h SocketAddress.h \ - Ajp13Socket.h IBase.h Socket.h \ - AjpBaseSocket.h IEventHandler.h SocketHandlerEp.h \ - Base64.h IEventOwner.h SocketHandler.h \ - Debug.h IFile.h SocketHandlerThread.h \ - Event.h IFileUpload.h socket_include.h \ - EventHandler.h IHttpServer.h sockets-config.h \ - EventTime.h IMutex.h SocketStream.h \ - Exception.h Ipv4Address.h SocketThread.h \ - File.h Ipv6Address.h SSLInitializer.h \ - FileStream.h ISocketHandler.h StdLog.h \ - HttpBaseSocket.h IStream.h StdoutLog.h \ - HttpClientSocket.h Json.h StreamSocket.h \ - HttpdCookies.h ListenSocket.h StreamWriter.h \ - HttpDebugSocket.h Lock.h TcpSocket.h \ - HttpdForm.h MemFile.h Thread.h \ - HttpdSocket.h Mutex.h UdpSocket.h \ - HttpGetSocket.h Parse.h Utility.h \ - HttpPostSocket.h ResolvServer.h XmlDocument.h \ - HttpPutSocket.h ResolvSocket.h XmlException.h \ - HttpRequest.h SctpSocket.h XmlNode.h \ - HttpResponse.h Semaphore.h \ - HTTPSocket.h SmtpdSocket.h diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.cpp deleted file mode 100755 index 6ed6a623c1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.cpp +++ /dev/null @@ -1,349 +0,0 @@ -/** \file MemFile.cpp - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#include -#include -#include - -#include "MemFile.h" -#include "Exception.h" -#include "Lock.h" -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -MemFile::MemFile() -:m_src(m_src) -,m_src_valid(false) -,m_base(new block_t) -,m_current_read(m_base) -,m_current_write(m_base) -,m_current_write_nr(0) -,m_read_ptr(0) -,m_write_ptr(0) -,m_b_read_caused_eof(false) -,m_ref_count(0) -,m_ref_decreased(false) -{ -} - - -MemFile::MemFile(MemFile& s) -:m_src(s) -,m_src_valid(true) -,m_base(s.m_base) -,m_current_read(m_base) -,m_current_write(s.m_current_write) -,m_current_write_nr(s.m_current_write_nr) -,m_read_ptr(0) -,m_write_ptr(s.m_write_ptr) -,m_b_read_caused_eof(false) -,m_ref_count(0) -,m_ref_decreased(false) -,m_path(s.m_path) -{ - m_src.Increase(); -} - - -MemFile::MemFile(File& f) -:m_src(m_src) -,m_src_valid(false) -,m_base(new block_t) -,m_current_read(NULL) -,m_current_write(NULL) -,m_current_write_nr(0) -,m_read_ptr(0) -,m_write_ptr(0) -,m_b_read_caused_eof(false) -,m_ref_count(0) -,m_ref_decreased(false) -,m_path(f.Path()) -{ - m_current_read = m_base; - m_current_write = m_base; - char slask[32768]; - size_t n; - while ((n = f.fread(slask, 1, 32768)) > 0) - { - fwrite(slask, 1, n); - } -} - - -MemFile::~MemFile() -{ - if (m_ref_count) - std::cerr << "MemFile destructor with a ref count of " + Utility::l2string(m_ref_count) << std::endl; - while (m_base && !m_src_valid) - { - block_t *p = m_base; - m_base = p -> next; - delete p; - } - if (m_src_valid && !m_ref_decreased) - { - m_src.Decrease(); - m_ref_decreased = true; - } -} - - -bool MemFile::fopen(const std::string& path, const std::string& mode) -{ - return true; -} - - -void MemFile::fclose() const -{ - if (m_src_valid && !m_ref_decreased) - { - m_src.Decrease(); - m_ref_decreased = true; - } -} - - -size_t MemFile::fread(char *ptr, size_t size, size_t nmemb) const -{ - size_t p = m_read_ptr % BLOCKSIZE; - size_t sz = size * nmemb; - size_t available = m_write_ptr - m_read_ptr; - if (sz > available) // read beyond eof - { - sz = available; - m_b_read_caused_eof = true; - } - if (!sz) - { - return 0; - } - if (p + sz < BLOCKSIZE) - { - memcpy(ptr, m_current_read -> data + p, sz); - m_read_ptr += sz; - } - else - { - size_t sz1 = BLOCKSIZE - p; - size_t sz2 = sz - sz1; - memcpy(ptr, m_current_read -> data + p, sz1); - m_read_ptr += sz1; - while (sz2 > BLOCKSIZE) - { - if (m_current_read -> next) - { - m_current_read = m_current_read -> next; - memcpy(ptr + sz1, m_current_read -> data, BLOCKSIZE); - m_read_ptr += BLOCKSIZE; - sz1 += BLOCKSIZE; - sz2 -= BLOCKSIZE; - } - else - { - return sz1; - } - } - if (m_current_read -> next) - { - m_current_read = m_current_read -> next; - memcpy(ptr + sz1, m_current_read -> data, sz2); - m_read_ptr += sz2; - } - else - { - return sz1; - } - } - return sz; -} - - -size_t MemFile::fwrite(const char *ptr, size_t size, size_t nmemb) -{ - size_t p = m_write_ptr % BLOCKSIZE; - int nr = (int)m_write_ptr / BLOCKSIZE; - size_t sz = size * nmemb; - if (m_current_write_nr < nr) - { - block_t *next = new block_t; - m_current_write -> next = next; - m_current_write = next; - m_current_write_nr++; - } - if (p + sz <= BLOCKSIZE) - { - memcpy(m_current_write -> data + p, ptr, sz); - m_write_ptr += sz; - } - else - { - size_t sz1 = BLOCKSIZE - p; // size left - size_t sz2 = sz - sz1; - memcpy(m_current_write -> data + p, ptr, sz1); - m_write_ptr += sz1; - while (sz2 > BLOCKSIZE) - { - if (m_current_write -> next) - { - m_current_write = m_current_write -> next; - m_current_write_nr++; - } - else - { - block_t *next = new block_t; - m_current_write -> next = next; - m_current_write = next; - m_current_write_nr++; - } - memcpy(m_current_write -> data, ptr + sz1, BLOCKSIZE); - m_write_ptr += BLOCKSIZE; - sz1 += BLOCKSIZE; - sz2 -= BLOCKSIZE; - } - if (m_current_write -> next) - { - m_current_write = m_current_write -> next; - m_current_write_nr++; - } - else - { - block_t *next = new block_t; - m_current_write -> next = next; - m_current_write = next; - m_current_write_nr++; - } - memcpy(m_current_write -> data, ptr + sz1, sz2); - m_write_ptr += sz2; - } - return sz; -} - - - -char *MemFile::fgets(char *s, int size) const -{ - int n = 0; - while (n < size - 1 && !eof()) - { - char c; - size_t sz = fread(&c, 1, 1); - if (sz) - { - if (c == 10) - { - s[n] = 0; - return s; - } - s[n++] = c; - } - } - s[n] = 0; - return s; -} - - -void MemFile::fprintf(const char *format, ...) -{ - va_list ap; - char tmp[BLOCKSIZE]; - va_start(ap, format); - vsnprintf(tmp, sizeof(tmp), format, ap); - va_end(ap); - fwrite(tmp, 1, strlen(tmp)); -} - - -off_t MemFile::size() const -{ - return (off_t)m_write_ptr; -} - - -bool MemFile::eof() const -{ - return m_b_read_caused_eof; //(m_read_ptr < m_write_ptr) ? false : true; -} - - -void MemFile::reset_read() const -{ - m_read_ptr = 0; - m_current_read = m_base; -} - - -void MemFile::reset_write() -{ - m_write_ptr = 0; - m_current_write = m_base; - m_current_write_nr = 0; -} - - -int MemFile::RefCount() const -{ - return m_ref_count; -} - - -void MemFile::Increase() -{ - ++m_ref_count; -} - - -void MemFile::Decrease() -{ - --m_ref_count; -} - - -const std::string& MemFile::Path() const -{ - return m_path; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.h deleted file mode 100755 index d66f571436..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.h +++ /dev/null @@ -1,118 +0,0 @@ -/** \file MemFile.h - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_MemFile_H -#define _SOCKETS_MemFile_H - -#include "sockets-config.h" -#include -#include "File.h" -#include "Mutex.h" - -#define BLOCKSIZE 32768 - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Implements a memory file. - \ingroup file */ -class MemFile : public IFile -{ -public: - /** File block structure. - \ingroup file */ - struct block_t { - block_t() : next(NULL) {} - struct block_t *next; - char data[BLOCKSIZE]; - }; -public: - /** Create temporary memory buffer, will be freed when object destructs */ - MemFile(); - /** Copy buffer from source, reset read ptr */ - MemFile(MemFile& ); - /** Read file and write to this, create non-temporary memory buffer from f.Path() */ - MemFile(File& f); - ~MemFile(); - - bool fopen(const std::string& path, const std::string& mode); - void fclose() const; - - size_t fread(char *ptr, size_t size, size_t nmemb) const; - size_t fwrite(const char *ptr, size_t size, size_t nmemb); - - char *fgets(char *s, int size) const; - void fprintf(const char *format, ...); - - off_t size() const; - bool eof() const; - - void reset_read() const; - void reset_write(); - - /** Reference count when copy constructor is used */ - int RefCount() const; - void Increase(); - void Decrease(); - - const std::string& Path() const; - -private: - MemFile& operator=(const MemFile& ) { - return *this; // assignment operator - } - - MemFile& m_src; - bool m_src_valid; - block_t *m_base; - mutable block_t *m_current_read; - block_t *m_current_write; - int m_current_write_nr; - mutable size_t m_read_ptr; - size_t m_write_ptr; - mutable bool m_b_read_caused_eof; - int m_ref_count; - mutable bool m_ref_decreased; - std::string m_path; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_MemFile_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.cpp deleted file mode 100755 index 80d9562c41..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/** \file Mutex.cpp - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "Mutex.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -Mutex::Mutex() -{ -#ifdef _WIN32 - m_mutex = ::CreateMutex(NULL, FALSE, NULL); -#else - pthread_mutex_init(&m_mutex, NULL); -#endif -} - - -Mutex::~Mutex() -{ -#ifdef _WIN32 - ::CloseHandle(m_mutex); -#else - pthread_mutex_destroy(&m_mutex); -#endif -} - - -void Mutex::Lock() const -{ -#ifdef _WIN32 - DWORD d = WaitForSingleObject(m_mutex, INFINITE); - /// \todo check 'd' for result -#else - pthread_mutex_lock(&m_mutex); -#endif -} - - -void Mutex::Unlock() const -{ -#ifdef _WIN32 - ::ReleaseMutex(m_mutex); -#else - pthread_mutex_unlock(&m_mutex); -#endif -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.h deleted file mode 100755 index 720209c1e9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.h +++ /dev/null @@ -1,73 +0,0 @@ -/** \file Mutex.h - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Mutex_H -#define _SOCKETS_Mutex_H - -#include "sockets-config.h" -#ifndef _WIN32 -#include -#else -#include "socket_include.h" -#include -#endif -#include "IMutex.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** Mutex container class, used by Lock. - \ingroup threading */ -class Mutex : public IMutex -{ -public: - Mutex(); - ~Mutex(); - - virtual void Lock() const; - virtual void Unlock() const; - -private: -#ifdef _WIN32 - HANDLE m_mutex; -#else - mutable pthread_mutex_t m_mutex; -#endif -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // _SOCKETS_Mutex_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/OSX.zip b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/OSX.zip deleted file mode 100755 index e4046a4a5c5a000d31ccca342dbb8489033a1e2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16669 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
~Ch`@HWEbsjD#K>Izn9!3hfi+Xb!t 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 AT>t<8 diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Parse.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Parse.cpp deleted file mode 100755 index 1286ff6db3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Parse.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/** \file Parse.cpp - parse a string - ** - ** Written: 1999-Feb-10 grymse@alhem.net - **/ - -/* -Copyright (C) 1999-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include -#include - -#include "Parse.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -/* implementation of class Parse */ - -Parse::Parse() -:pa_the_str("") -,pa_splits("") -,pa_ord("") -,pa_the_ptr(0) -,pa_breakchar(0) -,pa_enable(0) -,pa_disable(0) -,pa_nospace(0) -,pa_quote(false) -{ -} - -Parse::Parse(const std::string&s) -:pa_the_str(s) -,pa_splits("") -,pa_ord("") -,pa_the_ptr(0) -,pa_breakchar(0) -,pa_enable(0) -,pa_disable(0) -,pa_nospace(0) -,pa_quote(false) -{ -} - -Parse::Parse(const std::string&s,const std::string&sp) -:pa_the_str(s) -,pa_splits(sp) -,pa_ord("") -,pa_the_ptr(0) -,pa_breakchar(0) -,pa_enable(0) -,pa_disable(0) -,pa_nospace(0) -,pa_quote(false) -{ -} - -Parse::Parse(const std::string&s,const std::string&sp,short nospace) -:pa_the_str(s) -,pa_splits(sp) -,pa_ord("") -,pa_the_ptr(0) -,pa_breakchar(0) -,pa_enable(0) -,pa_disable(0) -,pa_nospace(1) -,pa_quote(false) -{ -} - - -Parse::~Parse() -{ -} - -#define C ((pa_the_ptr - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/***************************************************/ -/* interface of class Parse */ - -/** Splits a string whatever way you want. - \ingroup util */ -class Parse -{ -public: - Parse(); - Parse(const std::string&); - Parse(const std::string&,const std::string&); - Parse(const std::string&,const std::string&,short); - ~Parse(); - short issplit(const char); - void getsplit(); - void getsplit(std::string&); - std::string getword(); - void getword(std::string&); - void getword(std::string&,std::string&,int); - std::string getrest(); - void getrest(std::string&); - long getvalue(); - void setbreak(const char); - int getwordlen(); - int getrestlen(); - void enablebreak(const char c) { - pa_enable = c; - } - void disablebreak(const char c) { - pa_disable = c; - } - void getline(); - void getline(std::string&); - size_t getptr() { - return pa_the_ptr; - } - void EnableQuote(bool b) { - pa_quote = b; - } - -private: - std::string pa_the_str; - std::string pa_splits; - std::string pa_ord; - size_t pa_the_ptr; - char pa_breakchar; - char pa_enable; - char pa_disable; - short pa_nospace; - bool pa_quote; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Parse_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README deleted file mode 100755 index 6dbef38d34..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README +++ /dev/null @@ -1,90 +0,0 @@ -http://www.alhem.net/Sockets/ - -C++ Sockets Library :: installation instructions - - -Unix (and Cygwin/Mingw on windows) -================================== - -1. Change the 'PLATFORM =' line in Makefile - - Possible values are - linux-x86-32 - win32-cygwin - solaris9-sparc-64 - macosx - solaris8 - -2. If you want to use ssl encrypted socket communication, the library - has support for the third-party library openssl. If necessary, add - the following include directory to Makefile: - - INCLUDE = -I/include - - The openssl include directory contains only one directory named - 'openssl', in which all header files can be found. - - OpenSSL support is enabled by default. - - If you don't need encrypted communications, make sure to comment - out this line in the file 'sockets-config.h': - - #define HAVE_OPENSSL - -3. If you really need thread-safe dns lookups, and your operating has - support for *addrinfo and *nameinfo function calls, make sure this - line in 'sockets-config.h' is commented: - - #define NO_GETADDRINFO - - By default, dns lookups using getaddrinfo/getnameinfo is disabled. - -4. If your operating system supports SCTP, there might be a slight - chance the sctp code in the library works. Uncomment this line in - 'sockets-config.h' to try: - - //#define USE_SCTP - -5. If you need IPv6 support, uncomment this line in - 'sockets-config.h': - - //#define ENABLE_IPV6 - -6. Type 'make' - -7. If all builds ok, you'll find the static library file 'libSockets.a' - in the build directory. - - -When compiling the application, any flags used when compiling the library -also needs to be present when including the library .h files. All flags -can be retrieved using the 'Sockets-config' executable. Add something like -this in your Makefile: - -CFLAGS += `Sockets-config` -CPPFLAGS += `Sockets-config` - -When linking an application using the library, make sure the object and -library files are in correct order on your link command line: - - First: Application object files - 2nd: -lSockets - 3rd: openssl libraries - Finally: Everything else, ending with -lpthread - - -windows -======= - -Project files for various IDE's can be found here: - - Project/ Visual studio 6.0 - Project.net/ Visual studio .NET - DevCpp/ Dev C++ - -Please see steps 2-5 above for some details on configuring the library. - -When linking on cygwin/mingw, add the following libraries: - -lwsock32 - -lws2_32 - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README.macosx b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README.macosx deleted file mode 100755 index ffee721a97..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README.macosx +++ /dev/null @@ -1,9 +0,0 @@ -MAC notes ---------- - -The file OSX.zip contains xcode project files for an older version of the library. - -Find uuid.h (if missing) here: - http://www.die.net/doc/linux/include/uuid/uuid.h -This used to be a problem, but isn't any more afaik. - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.cpp deleted file mode 100755 index 5e5497e833..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/** \file ResolvServer.cpp - ** \date 2005-03-24 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "ResolvServer.h" -#ifdef ENABLE_RESOLVER -#include "StdoutLog.h" -#include "ListenSocket.h" -#include "ResolvSocket.h" -#include "SocketHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -ResolvServer::ResolvServer(port_t port) -:Thread() -,m_quit(false) -,m_port(port) -,m_ready(false) -{ -} - - -ResolvServer::~ResolvServer() -{ -} - - -void ResolvServer::Run() -{ -// StdoutLog log; - SocketHandler h; - ListenSocket l(h); - - if (l.Bind("127.0.0.1", m_port)) - { - return; - } - h.Add(&l); - - m_ready = true; - while (!m_quit && IsRunning() ) - { - h.Select(0, 500000); - } - SetRunning(false); -} - - -void ResolvServer::Quit() -{ - m_quit = true; -} - - -bool ResolvServer::Ready() -{ - return m_ready; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_RESOLVER - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.h deleted file mode 100755 index 5787d18bb0..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.h +++ /dev/null @@ -1,78 +0,0 @@ -/** \file ResolvServer.h - ** \date 2005-03-24 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_ResolvServer_H -#define _SOCKETS_ResolvServer_H -#include "sockets-config.h" -#ifdef ENABLE_RESOLVER -#include "socket_include.h" -#include "Thread.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** \defgroup async Asynchronous DNS */ -/** Async DNS resolver thread. - \ingroup async */ -class ResolvServer : public Thread -{ -public: - ResolvServer(port_t); - ~ResolvServer(); - - void Run(); - void Quit(); - - bool Ready(); - -private: - ResolvServer(const ResolvServer& ) {} // copy constructor - ResolvServer& operator=(const ResolvServer& ) { - return *this; // assignment operator - } - - bool m_quit; - port_t m_port; - bool m_ready; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_RESOLVER -#endif // _SOCKETS_ResolvServer_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.cpp deleted file mode 100755 index c07e78dce1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.cpp +++ /dev/null @@ -1,442 +0,0 @@ -/** \file ResolvSocket.cpp - ** \date 2005-03-24 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#pragma warning(disable:4503) -#endif -#else -#include -#endif -#include "ResolvSocket.h" -#ifdef ENABLE_RESOLVER -#include "Utility.h" -#include "Parse.h" -#include "ISocketHandler.h" -#include "Lock.h" -#include "Mutex.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -// static -ResolvSocket::cache_t ResolvSocket::m_cache; -ResolvSocket::timeout_t ResolvSocket::m_cache_to; -Mutex ResolvSocket::m_cache_mutex; - - -ResolvSocket::ResolvSocket(ISocketHandler& h) -:TcpSocket(h) -,m_bServer(false) -,m_parent(NULL) -,m_parent_uid(0) -#ifdef ENABLE_IPV6 -,m_resolve_ipv6(false) -#endif -,m_cached(false) -{ - SetLineProtocol(); -} - - -ResolvSocket::ResolvSocket(ISocketHandler& h, Socket *parent, const std::string& host, port_t port, bool ipv6) -:TcpSocket(h) -,m_bServer(false) -,m_parent(parent) -,m_parent_uid(parent -> UniqueIdentifier()) -,m_resolv_host(host) -,m_resolv_port(port) -#ifdef ENABLE_IPV6 -,m_resolve_ipv6(ipv6) -#endif -,m_cached(false) -{ - SetLineProtocol(); -} - - -ResolvSocket::ResolvSocket(ISocketHandler& h, Socket *parent, ipaddr_t a) -:TcpSocket(h) -,m_bServer(false) -,m_parent(parent) -,m_parent_uid(parent -> UniqueIdentifier()) -,m_resolv_port(0) -,m_resolv_address(a) -#ifdef ENABLE_IPV6 -,m_resolve_ipv6(false) -#endif -,m_cached(false) -{ - SetLineProtocol(); -} - - -#ifdef ENABLE_IPV6 -ResolvSocket::ResolvSocket(ISocketHandler& h, Socket *parent, in6_addr& a) -:TcpSocket(h) -,m_bServer(false) -,m_parent(parent) -,m_parent_uid(parent -> UniqueIdentifier()) -,m_resolv_port(0) -,m_resolve_ipv6(true) -,m_resolv_address6(a) -,m_cached(false) -{ - SetLineProtocol(); -} -#endif - - -ResolvSocket::~ResolvSocket() -{ -} - - -void ResolvSocket::OnLine(const std::string& line) -{ - Parse pa(line, ":"); - if (m_bServer) - { - m_query = pa.getword(); - m_data = pa.getrest(); -DEB( fprintf(stderr, " *** ResolvSocket server; query=%s, data=%s\n", m_query.c_str(), m_data.c_str());) - // %! check cache - { - Lock lock(m_cache_mutex); - if (m_cache[m_query].find(m_data) != m_cache[m_query].end()) - { - if (time(NULL) - m_cache_to[m_query][m_data] < 3600) // ttl - { - std::string result = m_cache[m_query][m_data]; -DEB(fprintf(stderr, " *** Returning cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), result.c_str());) - Send("Cached\n"); - if (!result.size()) /* failed */ - { - Send("Failed\n\n"); - SetCloseAndDelete(); - return; - } - else - if (m_query == "gethostbyname") - { - Send("A: " + result + "\n\n"); - SetCloseAndDelete(); - return; - } - else -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (m_query == "gethostbyname2") - { - Send("AAAA: " + result + "\n\n"); - SetCloseAndDelete(); - return; - } - else -#endif -#endif - if (m_query == "gethostbyaddr") - { - Send("Name: " + result + "\n\n"); - SetCloseAndDelete(); - return; - } - } - } - } - if (!Detach()) // detach failed? - { - SetCloseAndDelete(); - } - return; - } - std::string key = pa.getword(); - std::string value = pa.getrest(); -DEB( fprintf(stderr, " *** ResolvSocket response; %s: %s\n", key.c_str(), value.c_str());) - - if (key == "Cached") - { - m_cached = true; - } - else - if (key == "Failed" && m_parent) - { -DEB( fprintf(stderr, " ************ Resolve failed\n");) - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - m_parent -> OnResolveFailed(m_resolv_id); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; - } - else - if (key == "Name" && !m_resolv_host.size() && m_parent) - { - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - m_parent -> OnReverseResolved(m_resolv_id, value); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; - } - else - if (key == "A" && m_parent) - { - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - ipaddr_t l; - Utility::u2ip(value, l); // ip2ipaddr_t - m_parent -> OnResolved(m_resolv_id, l, m_resolv_port); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; // always use first ip in case there are several - } -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - else - if (key == "AAAA" && m_parent) - { - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - in6_addr a; - Utility::u2ip(value, a); - m_parent -> OnResolved(m_resolv_id, a, m_resolv_port); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; - } -#endif -#endif -} - - -void ResolvSocket::OnDetached() -{ -DEB( fprintf(stderr, " *** ResolvSocket::OnDetached(); query=%s, data=%s\n", m_query.c_str(), m_data.c_str());) - if (m_query == "gethostbyname") - { - struct sockaddr_in sa; - if (Utility::u2ip(m_data, sa)) - { - std::string ip; - Utility::l2ip(sa.sin_addr, ip); - Send("A: " + ip + "\n"); - } - else - { - Send("Failed\n"); - } - Send("\n"); - } - else -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (m_query == "gethostbyname2") - { - struct sockaddr_in6 sa; - if (Utility::u2ip(m_data, sa)) - { - std::string ip; - Utility::l2ip(sa.sin6_addr, ip); - Send("AAAA: " + ip + "\n"); - } - else - { - Send("Failed\n"); - } - Send("\n"); - } - else -#endif -#endif - if (m_query == "gethostbyaddr") - { - if (Utility::isipv4( m_data )) - { - struct sockaddr_in sa; - if (!Utility::u2ip(m_data, sa, AI_NUMERICHOST)) - { - Send("Failed: convert to sockaddr_in failed\n"); - } - else - { - std::string name; - if (!Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), name)) - { - Send("Failed: ipv4 reverse lookup of " + m_data + "\n"); - } - else - { - Send("Name: " + name + "\n"); - } - } - } - else -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (Utility::isipv6( m_data )) - { - struct sockaddr_in6 sa; - if (!Utility::u2ip(m_data, sa, AI_NUMERICHOST)) - { - Send("Failed: convert to sockaddr_in6 failed\n"); - } - else - { - std::string name; - if (!Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), name)) - { - Send("Failed: ipv6 reverse lookup of " + m_data + "\n"); - } - else - { - Send("Name: " + name + "\n"); - } - } - } - else -#endif -#endif - { - Send("Failed: malformed address\n"); - } - Send("\n"); - } - else - { - std::string msg = "Unknown query type: " + m_query; - Handler().LogError(this, "OnDetached", 0, msg); - Send("Unknown\n\n"); - } - SetCloseAndDelete(); -} - - -void ResolvSocket::OnConnect() -{ - if (m_resolv_host.size()) - { -#ifdef ENABLE_IPV6 - std::string msg = (m_resolve_ipv6 ? "gethostbyname2 " : "gethostbyname ") + m_resolv_host + "\n"; - m_query = m_resolve_ipv6 ? "gethostbyname2" : "gethostbyname"; -#else - std::string msg = "gethostbyname " + m_resolv_host + "\n"; - m_query = "gethostbyname"; -#endif - m_data = m_resolv_host; - Send( msg ); - return; - } -#ifdef ENABLE_IPV6 - if (m_resolve_ipv6) - { - std::string tmp; - Utility::l2ip(m_resolv_address6, tmp); - m_query = "gethostbyaddr"; - m_data = tmp; - std::string msg = "gethostbyaddr " + tmp + "\n"; - Send( msg ); - } -#endif - std::string tmp; - Utility::l2ip(m_resolv_address, tmp); - m_query = "gethostbyaddr"; - m_data = tmp; - std::string msg = "gethostbyaddr " + tmp + "\n"; - Send( msg ); -} - - -void ResolvSocket::OnDelete() -{ - if (m_parent) - { - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - m_parent -> OnResolveFailed(m_resolv_id); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); - std::string value; -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_RESOLVER - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.h deleted file mode 100755 index e080d01255..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.h +++ /dev/null @@ -1,120 +0,0 @@ -/** \file ResolvSocket.h - ** \date 2005-03-24 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_ResolvSocket_H -#define _SOCKETS_ResolvSocket_H -#include "sockets-config.h" -#ifdef ENABLE_RESOLVER -#include "TcpSocket.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class Mutex; - -/** Async DNS resolver socket. - \ingroup async */ -class ResolvSocket : public TcpSocket -{ - typedef std::map > cache_t; /* host, result */ - typedef std::map > timeout_t; /* host, time */ - -public: - ResolvSocket(ISocketHandler&); - ResolvSocket(ISocketHandler&, Socket *parent, const std::string& host, port_t port, bool ipv6 = false); - ResolvSocket(ISocketHandler&, Socket *parent, ipaddr_t); -#ifdef ENABLE_IPV6 - ResolvSocket(ISocketHandler&, Socket *parent, in6_addr&); -#endif - ~ResolvSocket(); - - void OnAccept() { - m_bServer = true; - } - void OnLine(const std::string& line); - void OnDetached(); - void OnDelete(); - - void SetId(int x) { - m_resolv_id = x; - } - int GetId() { - return m_resolv_id; - } - - void OnConnect(); - -#ifdef ENABLE_IPV6 - void SetResolveIpv6(bool x = true) { - m_resolve_ipv6 = x; - } -#endif - -private: - ResolvSocket(const ResolvSocket& s) : TcpSocket(s) {} // copy constructor - ResolvSocket& operator=(const ResolvSocket& ) { - return *this; // assignment operator - } - - std::string m_query; - std::string m_data; - bool m_bServer; - Socket *m_parent; - socketuid_t m_parent_uid; - int m_resolv_id; - std::string m_resolv_host; - port_t m_resolv_port; - ipaddr_t m_resolv_address; -#ifdef ENABLE_IPV6 - bool m_resolve_ipv6; - in6_addr m_resolv_address6; -#endif - static cache_t m_cache; - static timeout_t m_cache_to; - static Mutex m_cache_mutex; - bool m_cached; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_RESOLVER -#endif // _SOCKETS_ResolvSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.cpp deleted file mode 100755 index 29c2b8ac39..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/** - ** \file SSLInitializer.cpp - ** \date 2007-04-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#endif -#include "SSLInitializer.h" -#ifdef HAVE_OPENSSL -#include -#include "Utility.h" -#include -#include "Lock.h" - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -std::map *SSLInitializer::m_mmap = NULL; -Mutex *SSLInitializer::m_mmap_mutex = NULL; - - -SSLInitializer::SSLInitializer() -{ -DEB( fprintf(stderr, "SSLInitializer()\n");) - - bio_err = NULL; - m_rand_size = 1024; - - /* An error write context */ - bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); - - /* Global system initialization*/ - SSL_library_init(); - SSL_load_error_strings(); - OpenSSL_add_all_algorithms(); - CRYPTO_set_locking_callback( SSL_locking_function ); - CRYPTO_set_id_callback( SSL_id_function ); - - std::string randfile = Utility::GetEnv("RANDFILE"); - std::string home = Utility::GetEnv("HOME"); - if (randfile.empty() && home.empty()) - { - std::string homepath = Utility::GetEnv("HOMEPATH"); - if (!homepath.empty()) - { - Utility::SetEnv("HOME", homepath); - } - } - char path[512]; - *path = 0; - RAND_file_name(path, 512); - if (*path) - { - m_rand_file = path; - m_rand_size = 1024; - RAND_write_file(path); - } - else - { -DEB( fprintf(stderr, "SSLInitializer: no random file generated\n");) - } - - /* Load randomness */ - if (!m_rand_file.size() || !RAND_load_file(m_rand_file.c_str(), m_rand_size)) - { -DEB( fprintf(stderr, "SSLInitializer: PRNG not initialized\n");) - } - -} - - -SSLInitializer::~SSLInitializer() -{ -DEB( fprintf(stderr, "~SSLInitializer()\n");) - DeleteRandFile(); - // %! delete mutexes -} - - -void SSLInitializer::DeleteRandFile() -{ - if (m_rand_file.size()) - { -#ifdef _WIN32 - _unlink(m_rand_file.c_str()); -#else - unlink(m_rand_file.c_str()); -#endif - } -} - - -void SSLInitializer::SSL_locking_function(int mode, int n, const char *file, int line) -{ - IMutex *mutex = NULL; - { - Lock lock(MMapMutex()); - if (MMap().find(n) == MMap().end()) - { - MMap()[n] = new Mutex; - } - mutex = MMap()[n]; - } - if (mode & CRYPTO_LOCK) - { - mutex -> Lock(); - } - else - { - mutex -> Unlock(); - } -} - - -unsigned long SSLInitializer::SSL_id_function() -{ - return Utility::ThreadID(); -} - - -std::map& SSLInitializer::MMap() -{ - if (m_mmap == NULL) - m_mmap = new std::map(); - return *m_mmap; -} - - -Mutex& SSLInitializer::MMapMutex() -{ - if (m_mmap_mutex == NULL) - m_mmap_mutex = new Mutex(); - return *m_mmap_mutex; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // HAVE_OPENSSL - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.h deleted file mode 100755 index 4945458f92..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - ** \file SSLInitializer.h - ** \date 2007-04-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef __SOCKETS_SSLInitializer_H -#define __SOCKETS_SSLInitializer_H -#include "sockets-config.h" -#ifdef HAVE_OPENSSL - -#ifdef _WIN32 -#include -#endif -#include -#include -#include -#include "Mutex.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class SSLInitializer -{ -public: - /** - init openssl - bio_err - create random file - */ - SSLInitializer(); - - /** - remove random file - */ - ~SSLInitializer(); - - void DeleteRandFile(); - - /** SSL; mutex locking function callback. */ - static void SSL_locking_function(int mode, int n, const char *file, int line); - - /** Return thread id. */ - static unsigned long SSL_id_function(); - - BIO *bio_err; - -private: - std::string m_rand_file; - long m_rand_size; - static std::map *m_mmap; - static Mutex *m_mmap_mutex; - - static std::map& MMap(); - static Mutex& MMapMutex(); - -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // HAVE_OPENSSL -#endif // __SOCKETS_SSLInitializer_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.cpp deleted file mode 100755 index 767438c636..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.cpp +++ /dev/null @@ -1,506 +0,0 @@ -/** - ** \file SctpSocket.cpp - ** \date 2006-09-04 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "SctpSocket.h" -#ifdef USE_SCTP -#include "Utility.h" -#include "ISocketHandler.h" -#include -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#ifdef ENABLE_EXCEPTIONS -#include "Exception.h" -#endif - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -SctpSocket::SctpSocket(ISocketHandler& h,int type) : StreamSocket(h) -,m_type(type) -,m_buf(new char[SCTP_BUFSIZE_READ]) -{ - if (type != SOCK_STREAM && type != SOCK_SEQPACKET) - { - } -} - - -SctpSocket::~SctpSocket() -{ - delete[] m_buf; -} - - -int SctpSocket::Bind(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return Bind(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return Bind(ad); -} - - -int SctpSocket::Bind(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Attach(CreateSocket(ad.GetFamily(), m_type, "sctp")); - } - if (GetSocket() != INVALID_SOCKET) - { - int n = bind(GetSocket(), ad, ad); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "bind() failed", LOG_LEVEL_ERROR); -#ifdef ENABLE_EXCEPTIONS - throw Exception("bind() failed for SctpSocket, port: " + Utility::l2string(ad.GetPort())); -#endif - } - return n; - } - return -1; -} - - -int SctpSocket::AddAddress(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return AddAddress(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return AddAddress(ad); -} - - -int SctpSocket::AddAddress(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Handler().LogError(this, "SctpSocket", -1, "AddAddress called with invalid file descriptor", LOG_LEVEL_ERROR); - return -1; - } - int n = sctp_bindx(GetSocket(), ad, ad, SCTP_BINDX_ADD_ADDR); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_bindx() failed", LOG_LEVEL_ERROR); - } - return n; -} - - -int SctpSocket::RemoveAddress(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return RemoveAddress(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return RemoveAddress(ad); -} - - -int SctpSocket::RemoveAddress(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Handler().LogError(this, "SctpSocket", -1, "RemoveAddress called with invalid file descriptor", LOG_LEVEL_ERROR); - return -1; - } - int n = sctp_bindx(GetSocket(), ad, ad, SCTP_BINDX_REM_ADDR); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_bindx() failed", LOG_LEVEL_ERROR); - } - return n; -} - - -int SctpSocket::Open(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return Open(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return Open(ad); -} - - -int SctpSocket::Open(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Attach(CreateSocket(ad.GetFamily(), m_type, "sctp")); - } - if (GetSocket() != INVALID_SOCKET) - { - if (!SetNonblocking(true)) - { - return -1; - } - int n = connect(GetSocket(), ad, ad); - if (n == -1) - { - // check error code that means a connect is in progress -#ifdef _WIN32 - if (Errno == WSAEWOULDBLOCK) -#else - if (Errno == EINPROGRESS) -#endif - { - Handler().LogError(this, "connect: connection pending", Errno, StrError(Errno), LOG_LEVEL_INFO); - SetConnecting( true ); // this flag will control fd_set's - } - else - { - Handler().LogError(this, "SctpSocket", -1, "connect() failed", LOG_LEVEL_ERROR); - } - } - return n; - } - return -1; -} - - -#ifndef SOLARIS -int SctpSocket::AddConnection(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return AddConnection(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return AddConnection(ad); -} - - -int SctpSocket::AddConnection(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Handler().LogError(this, "SctpSocket", -1, "AddConnection called with invalid file descriptor", LOG_LEVEL_ERROR); - return -1; - } - int n = sctp_connectx(GetSocket(), ad, ad); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_connectx() failed", LOG_LEVEL_ERROR); - } - else - { - SetConnecting(); - } - return n; -} -#endif - - -int SctpSocket::getpaddrs(sctp_assoc_t id,std::list& vec) -{ - struct sockaddr *p = NULL; - int n = sctp_getpaddrs(GetSocket(), id, &p); - if (!n || n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_getpaddrs failed", LOG_LEVEL_WARNING); - return n; - } - for (int i = 0; i < n; i++) - { - vec.push_back(Utility::Sa2String(&p[i])); - } - sctp_freepaddrs(p); - return n; -} - - -int SctpSocket::getladdrs(sctp_assoc_t id,std::list& vec) -{ - struct sockaddr *p = NULL; - int n = sctp_getladdrs(GetSocket(), id, &p); - if (!n || n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_getladdrs failed", LOG_LEVEL_WARNING); - return n; - } - for (int i = 0; i < n; i++) - { - vec.push_back(Utility::Sa2String(&p[i])); - } - sctp_freeladdrs(p); - return n; -} - - -int SctpSocket::PeelOff(sctp_assoc_t id) -{ - int n = sctp_peeloff(GetSocket(), id); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "PeelOff failed", LOG_LEVEL_WARNING); - return -1; - } - Socket *p = Create(); - p -> Attach(n); - p -> SetDeleteByHandler(); - Handler().Add(p); - return n; -} - - -void SctpSocket::OnRead() -{ -/* - int sctp_recvmsg(int sd, void * msg, size_t * len, - struct sockaddr * from, socklen_t * fromlen, - struct sctp_sndrcvinfo * sinfo, int * msg_flags); - - DESCRIPTION - sctp_recvmsg is a wrapper library function that can be used to receive a message from a socket while using the advanced - features of SCTP. sd is the socket descriptor on which the message pointed to by msg of length len is received. - - If from is not NULL, the source address of the message is filled in. The argument fromlen is a value-result parameter. - initialized to the size of the buffer associated with from , and modified on return to indicate the actual size of the - address stored. - - sinfo is a pointer to a sctp_sndrcvinfo structure to be filled upon receipt of the message. msg_flags is a pointer to a - integer that is filled with any message flags like MSG_NOTIFICATION or MSG_EOR. - -*/ - struct sockaddr sa; - socklen_t sa_len = 0; - struct sctp_sndrcvinfo sinfo; - int flags = 0; - int n = sctp_recvmsg(GetSocket(), m_buf, SCTP_BUFSIZE_READ, &sa, &sa_len, &sinfo, &flags); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - else - { - OnReceiveMessage(m_buf, n, &sa, sa_len, &sinfo, flags); - } -} - - -void SctpSocket::OnReceiveMessage(const char *buf,size_t sz,struct sockaddr *sa,socklen_t sa_len,struct sctp_sndrcvinfo *sinfo,int msg_flags) -{ -} - - -void SctpSocket::OnWrite() -{ - if (Connecting()) - { - int err = SoError(); - - // don't reset connecting flag on error here, we want the OnConnectFailed timeout later on - /// \todo add to read fd_set here - if (!err) // ok - { - Set(!IsDisableRead(), false); - SetConnecting(false); - SetCallOnConnect(); - return; - } - Handler().LogError(this, "sctp: connect failed", err, StrError(err), LOG_LEVEL_FATAL); - Set(false, false); // no more monitoring because connection failed - - // failed -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - OnSocks4ConnectFailed(); - return; - } -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && GetConnectionRetries() < GetConnectionRetry()) ) - { - // even though the connection failed at once, only retry after - // the connection timeout. - // should we even try to connect again, when CheckConnect returns - // false it's because of a connection error - not a timeout... - return; - } - SetConnecting(false); - SetCloseAndDelete( true ); - /// \todo state reason why connect failed - OnConnectFailed(); - return; - } -} - - -void SctpSocket::OnConnectTimeout() -{ - Handler().LogError(this, "connect", -1, "connect timeout", LOG_LEVEL_FATAL); -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - OnSocks4ConnectFailed(); - // retry direct connection - } - else -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && GetConnectionRetries() < GetConnectionRetry()) ) - { - IncreaseConnectionRetries(); - // ask socket via OnConnectRetry callback if we should continue trying - if (OnConnectRetry()) - { - SetRetryClientConnect(); - } - else - { - SetCloseAndDelete( true ); - /// \todo state reason why connect failed - OnConnectFailed(); - } - } - else - { - SetCloseAndDelete(true); - /// \todo state reason why connect failed - OnConnectFailed(); - } - // - SetConnecting(false); -} - - -#ifdef _WIN32 -void SctpSocket::OnException() -{ - if (Connecting()) - { -#ifdef ENABLE_SOCKS4 - if (Socks4()) - OnSocks4ConnectFailed(); - else -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && - GetConnectionRetries() < GetConnectionRetry() )) - { - // even though the connection failed at once, only retry after - // the connection timeout - // should we even try to connect again, when CheckConnect returns - // false it's because of a connection error - not a timeout... - } - else - { - SetConnecting(false); // tnx snibbe - SetCloseAndDelete(); - OnConnectFailed(); - } - return; - } - // %! exception doesn't always mean something bad happened, this code should be reworked - // errno valid here? - int err = SoError(); - Handler().LogError(this, "exception on select", err, StrError(err), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -} -#endif // _WIN32 - - -int SctpSocket::Protocol() -{ - return IPPROTO_SCTP; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE -#endif - - -#endif // USE_SCTP - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.h deleted file mode 100755 index 61102ff2f5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - ** \file SctpSocket.h - ** \date 2006-09-04 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_SctpSocket_H -#define _SOCKETS_SctpSocket_H -#include "sockets-config.h" - -#include "StreamSocket.h" -#ifdef USE_SCTP -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#define SCTP_BUFSIZE_READ 16400 - -class SocketAddress; - - -class SctpSocket : public StreamSocket -{ -public: - /** SctpSocket constructor. - \param h Owner - \param type SCTP_STREAM or SCTP_SEQPACKET */ - SctpSocket(ISocketHandler& h,int type); - ~SctpSocket(); - - /** bind() */ - int Bind(const std::string&,port_t); - int Bind(SocketAddress&); - /** sctp_bindx() */ - int AddAddress(const std::string&,port_t); - int AddAddress(SocketAddress&); - /** sctp_bindx() */ - int RemoveAddress(const std::string&,port_t); - int RemoveAddress(SocketAddress&); - - /** connect() */ - int Open(const std::string&,port_t); - int Open(SocketAddress&); - - /** Connect timeout callback. */ - void OnConnectTimeout(); -#ifdef _WIN32 - /** Connection failed reported as exception on win32 */ - void OnException(); -#endif - -#ifndef SOLARIS - /** sctp_connectx() */ - int AddConnection(const std::string&,port_t); - int AddConnection(SocketAddress&); -#endif - - /** Get peer addresses of an association. */ - int getpaddrs(sctp_assoc_t id,std::list&); - /** Get all bound addresses of an association. */ - int getladdrs(sctp_assoc_t id,std::list&); - - /** sctp_peeloff */ - int PeelOff(sctp_assoc_t id); - - /** recvmsg callback */ - virtual void OnReceiveMessage(const char *buf,size_t sz,struct sockaddr *sa,socklen_t sa_len,struct sctp_sndrcvinfo *sinfo,int msg_flags) = 0; - - void OnOptions(int,int,int,SOCKET) {} - - virtual int Protocol(); - -protected: - SctpSocket(const SctpSocket& s) : StreamSocket(s) {} - void OnRead(); - void OnWrite(); - -private: - SctpSocket& operator=(const SctpSocket& s) { - return *this; - } - int m_type; ///< SCTP_STREAM or SCTP_SEQPACKET - char *m_buf; ///< Temporary receive buffer -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE -#endif - -#endif // USE_SCTP -#endif // _SOCKETS_SctpSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.cpp deleted file mode 100755 index 0fdf2245f2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/** - ** \file Semaphore.cpp - ** \date 2007-04-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "Semaphore.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// --------------------------------------------------------------- -#ifdef _WIN32 - -Semaphore::Semaphore(value_t start_val) -{ - m_handle = ::CreateSemaphore((LPSECURITY_ATTRIBUTES)NULL, start_val, 1, (LPCTSTR)NULL); -} - - -Semaphore::~Semaphore() -{ - ::CloseHandle(m_handle); -} - - -int Semaphore::Post() -{ - return (::ReleaseSemaphore(m_handle, 1, (LPLONG)NULL) != 0) ? 0 : -1; -} - - -int Semaphore::Wait() -{ - return (WaitForSingleObject(m_handle, INFINITE) == WAIT_OBJECT_0) ? 0 : -1; -} - - -int Semaphore::TryWait() -{ - return -1; // %! not implemented -} - - -int Semaphore::GetValue(int& i) -{ - return 0; // %! not implemented -} - -// --------------------------------------------------------------- -#else - -Semaphore::Semaphore(value_t start_val) -{ - sem_init(&m_sem, 0, start_val); -} - - -Semaphore::~Semaphore() -{ - sem_destroy(&m_sem); -} - - -int Semaphore::Post() -{ - return sem_post(&m_sem); -} - - -int Semaphore::Wait() -{ - return sem_wait(&m_sem); -} - - -int Semaphore::TryWait() -{ - return sem_trywait(&m_sem); -} - - -int Semaphore::GetValue(int& i) -{ - return sem_getvalue(&m_sem, &i); -} - -#endif - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.h deleted file mode 100755 index 02010093e2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.h +++ /dev/null @@ -1,100 +0,0 @@ -/** - ** \file Semaphore.h - ** \date 2007-04-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Semaphore_H -#define _SOCKETS_Semaphore_H - -#include "sockets-config.h" -#ifdef _WIN32 -#include "socket_include.h" -#include -#else -#include -#ifdef MACOSX -#include -#else -#include -#endif -#endif - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#ifdef _WIN32 -typedef LONG value_t; -#else -typedef unsigned int value_t; -#endif - -/** pthread semaphore wrapper. - \ingroup threading */ -class Semaphore -{ -public: - Semaphore(value_t start_val = 0); - ~Semaphore(); - - /** \return 0 if successful */ - int Post(); - /** Wait for Post - \return 0 if successful */ - int Wait(); - - /** Not implemented for win32 */ - int TryWait(); - - /** Not implemented for win32 */ - int GetValue(int&); - -private: - Semaphore(const Semaphore& ) {} // copy constructor - Semaphore& operator=(const Semaphore& ) { - return *this; // assignment operator - } -#ifdef _WIN32 - HANDLE m_handle; -#else - sem_t m_sem; -#endif -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // _SOCKETS_Semaphore_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.cpp deleted file mode 100755 index 17e831bbf6..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/** - ** \file SmtpdSocket.cpp - ** \date 2007-05-10 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "SmtpdSocket.h" -#include "Parse.h" -#include "Utility.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -SmtpdSocket::SmtpdSocket(ISocketHandler& h) -:TcpSocket(h) -,m_hello(false) -,m_data(false) -,m_header(false) -{ - SetLineProtocol(); -} - - -void SmtpdSocket::OnAccept() -{ - Send("220 ESMTP; \r\n"); -} - - -void SmtpdSocket::OnLine(const std::string& line) -{ - if (m_data) - { - if (m_header) - { - if (!line.size()) - { - if (m_header_line.size()) - { - Parse pa(m_header_line, ":"); - std::string key = pa.getword(); - OnHeader(key, pa.getrest()); - } - m_header = false; - OnHeaderComplete(); - } - else - if (line[0] == ' ' || line[0] == '\t') - { - m_header_line += line; - } - else - { - if (m_header_line.size()) - { - Parse pa(m_header_line, ":"); - std::string key = pa.getword(); - OnHeader(key, pa.getrest()); - } - m_header_line = line; - } - } - else - if (line == ".") - { - m_data = false; - if (OnDataComplete()) - Send("250 OK\r\n"); - else - Send("550 Failed\r\n"); - } - else - if (line.size() && line[0] == '.') - { - OnData(line.substr(1)); - } - else - { - OnData(line); - } - return; - } - Parse pa(line); - std::string cmd = Utility::ToUpper(pa.getword()); - - if (cmd == "EHLO") - { - if (!OnHello(pa.getrest())) - { - Send("550 Failed\r\n"); - } - else - { - m_hello = true; - Send("250 mail.alhem.net\r\n"); - } - } - else - if (cmd == "HELO") - { - if (!OnHello(pa.getrest())) - { - Send("550 Failed\r\n"); - } - else - { - m_hello = true; - Send("250 mail.alhem.net\r\n"); - } - } - else - if (!m_hello) - { - OnAbort(SMTP_NO_HELLO); - SetCloseAndDelete(); - } - else - if (cmd == "MAIL") // mail from: - { - Parse pa(line, ":"); - pa.getword(); // 'mail' - pa.getword(); // 'from' - std::string email = Utility::ToLower(pa.getrest()); - - EmailAddress addr( email ); - if (addr.GetName().size() > 64) - { - OnAbort(SMTP_NAME_TOO_LONG); - Send("500 Name too long.\r\n"); - return; - } - if (addr.GetDomain().size() > 64) - { - OnAbort(SMTP_DOMAIN_TOO_LONG); - Send("500 Domain too long.\r\n"); - return; - } - - if (!OnMailFrom( addr )) - { - Send("550 Failed\r\n"); - } - else - { - Send("250 OK\r\n"); - } - } - else - if (cmd == "RCPT") // rcpt to: - { - Parse pa(line, ":"); - pa.getword(); // 'rcpt' - pa.getword(); // 'to' - std::string email = Utility::ToLower(pa.getrest()); - // %! reject based on user / domain? - EmailAddress addr( email ); - - if (addr.GetName().size() > 64) - { - OnAbort(SMTP_NAME_TOO_LONG); - Send("500 Name too long.\r\n"); - return; - } - if (addr.GetDomain().size() > 64) - { - OnAbort(SMTP_DOMAIN_TOO_LONG); - Send("500 Domain too long.\r\n"); - return; - } - - if (!OnRcptTo( addr )) - { - Send("553 Failed\r\n"); - } - else - { - Send("250 OK\r\n"); - } - } - else - if (cmd == "DATA") - { - Send("354 Enter mail, end with \".\" on a line by itself\r\n"); - m_data = true; - m_header = false; - } - else - if (cmd == "RSET") - { - m_data = false; - m_header = false; - OnRset(); - Send("250 OK\r\n"); // %! ??? - } - else - if (cmd == "QUIT") - { - OnAbort(SMTP_QUIT); - Send("221 Bye Bye\r\n"); - SetCloseAndDelete(); - } - else - if (cmd == "NOOP") - { - Send("250 OK\r\n"); - } - else - { - OnNotSupported(cmd, pa.getrest()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.h deleted file mode 100755 index 7b42988bd7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.h +++ /dev/null @@ -1,171 +0,0 @@ -/** - ** \file SmtpdSocket.h - ** \date 2007-05-10 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_SmtpdSocket_H -#define _SOCKETS_SmtpdSocket_H - -#include "sockets-config.h" -#include -#include "TcpSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Smtp server base class. */ -class SmtpdSocket : public TcpSocket -{ -protected: - typedef enum { - SMTP_NO_HELLO, - SMTP_NAME_TOO_LONG, - SMTP_DOMAIN_TOO_LONG, - SMTP_QUIT - } reason_t; - -public: - class EmailAddress - { - public: - EmailAddress(const std::string& str_in) { - std::string str = str_in; - size_t i = str.find("<"); - - if (i != std::string::npos) - str = str.substr(i + 1); - - i = str.find("@"); - - if (i != std::string::npos) { - m_name = str.substr(0, i); - str = str.substr(i + 1); - i = str.find(">"); - - if (i != std::string::npos) - str = str.substr(0, i); - - m_domain = str; - } - - while (m_name.size() && m_name[m_name.size() - 1] == ' ') - m_name.resize(m_name.size() - 1); - - while (m_domain.size() && m_domain[m_domain.size() - 1] == ' ') - m_domain.resize(m_domain.size() - 1); - - while (m_name.size() && m_name[0] == ' ') - m_name = m_name.substr(1); - - while (m_domain.size() && m_domain[0] == ' ') - m_domain = m_domain.substr(1); - - m_top = m_domain; - { - for (size_t i = 0; i < m_domain.size(); i++) { - if (m_domain[i] == '.') { - m_sub = m_top; - m_top = m_domain.substr(i + 1); - } - } - } - } - - const std::string& GetName() const { - return m_name; - } - const std::string& GetDomain() const { - return m_domain; - } - const std::string& GetTopDomain() const { - return m_top; - } - const std::string& GetSubDomain() const { - return m_sub; - } - - std::string ToString() const { - return m_name + "@" + m_domain; - } - - private: - std::string m_name; - std::string m_domain; - std::string m_top; - std::string m_sub; - }; - -public: - SmtpdSocket(ISocketHandler&); - - void OnAccept(); - void OnLine(const std::string&); - - /** \return 'false' to abort */ - virtual bool OnHello(const std::string& domain) = 0; - - /** \return 'false' to abort */ - virtual bool OnMailFrom(const EmailAddress& addr) = 0; - - /** \return 'false' to abort */ - virtual bool OnRcptTo(const EmailAddress& addr) = 0; - - virtual void OnHeader(const std::string& key, const std::string& value) = 0; - - virtual void OnHeaderComplete() = 0; - - virtual void OnData(const std::string& line) = 0; - - /** \return 'false' if message write failed (message will probably be resent) */ - virtual bool OnDataComplete() = 0; - - virtual void OnRset() = 0; - - virtual void OnAbort(reason_t) = 0; - - virtual void OnNotSupported(const std::string& cmd, const std::string& arg) = 0; - -private: - bool m_hello; // we need HELO or EHLO first of all - bool m_data; - bool m_header; - std::string m_header_line; -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_SmtpdSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.cpp deleted file mode 100755 index 4adb6b3d60..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.cpp +++ /dev/null @@ -1,1875 +0,0 @@ -/** \file Socket.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "Socket.h" -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#else -#include -#include -#endif -#include -#include - -#include "Utility.h" - -#include "SocketAddress.h" -#include "SocketHandler.h" -#ifdef ENABLE_EXCEPTIONS -#include "Exception.h" -#endif -#include "Ipv4Address.h" -//#ifdef ENABLE_IPV6 -#include "Ipv6Address.h" -//#endif -#include "SocketThread.h" - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// statics -#ifdef _WIN32 -WSAInitializer Socket::m_winsock_init; -#endif -socketuid_t Socket::m_next_uid = 0; - - -Socket::Socket(ISocketHandler& h) -//:m_flags(0) -:m_handler(h) -,m_socket( INVALID_SOCKET ) -,m_bDel(false) -,m_bClose(false) -,m_tCreate(time(NULL)) -,m_parent(NULL) -,m_b_disable_read(false) -,m_connected(false) -,m_b_erased_by_handler(false) -,m_tClose(0) -,m_client_remote_address(NULL) -,m_remote_address(NULL) -,m_traffic_monitor(NULL) -,m_timeout_start(0) -,m_timeout_limit(0) -,m_bLost(false) -,m_uid(++Socket::m_next_uid) -,m_call_on_connect(false) -,m_b_retry_connect(false) -#ifdef HAVE_OPENSSL -,m_b_enable_ssl(false) -,m_b_ssl(false) -,m_b_ssl_server(false) -#endif -//#ifdef ENABLE_IPV6 -,m_ipv6(false) -//#endif -#ifdef ENABLE_POOL -,m_socket_type(0) -,m_bClient(false) -,m_bRetain(false) -#endif -#ifdef ENABLE_SOCKS4 -,m_bSocks4(false) -,m_socks4_host(h.GetSocks4Host()) -,m_socks4_port(h.GetSocks4Port()) -,m_socks4_userid(h.GetSocks4Userid()) -#endif -#ifdef ENABLE_DETACH -,m_detach(false) -,m_detached(false) -,m_pThread(NULL) -,m_slave_handler(NULL) -#endif -{ -} - - -Socket::~Socket() -{ - Handler().Remove(this); - if (m_socket != INVALID_SOCKET -#ifdef ENABLE_POOL - && !m_bRetain -#endif - ) - { - Close(); - } -} - - -void Socket::Init() -{ -} - - -void Socket::OnRead() -{ -} - - -void Socket::OnWrite() -{ -} - - -void Socket::OnException() -{ - // %! exception doesn't always mean something bad happened, this code should be reworked - // errno valid here? - int err = SoError(); - Handler().LogError(this, "exception on select", err, StrError(err), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -} - - -void Socket::OnDelete() -{ -} - - -void Socket::OnConnect() -{ -} - - -void Socket::OnAccept() -{ -} - - -int Socket::Close() -{ - if (m_socket == INVALID_SOCKET) // this could happen - { - Handler().LogError(this, "Socket::Close", 0, "file descriptor invalid", LOG_LEVEL_WARNING); - return 0; - } - int n; - Handler().ISocketHandler_Del(this); // remove from fd_set's - if ((n = closesocket(m_socket)) == -1) - { - // failed... - Handler().LogError(this, "close", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - m_socket = INVALID_SOCKET; - return n; -} - - -SOCKET Socket::CreateSocket(int af,int type, const std::string& protocol) -{ - struct protoent *p = NULL; - SOCKET s; - -#ifdef ENABLE_POOL - m_socket_type = type; - m_socket_protocol = protocol; -#endif - if (protocol.size()) - { - p = getprotobyname( protocol.c_str() ); - if (!p) - { - Handler().LogError(this, "getprotobyname", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -#ifdef ENABLE_EXCEPTIONS - throw Exception(std::string("getprotobyname() failed: ") + StrError(Errno)); -#endif - return INVALID_SOCKET; - } - } - int protno = p ? p -> p_proto : 0; - - s = socket(af, type, protno); - if (s == INVALID_SOCKET) - { - Handler().LogError(this, "socket", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -#ifdef ENABLE_EXCEPTIONS - throw Exception(std::string("socket() failed: ") + StrError(Errno)); -#endif - return INVALID_SOCKET; - } - Attach(s); - OnOptions(af, type, protno, s); - Attach(INVALID_SOCKET); - return s; -} - - -void Socket::Attach(SOCKET s) -{ - m_socket = s; -} - - -SOCKET Socket::GetSocket() -{ - return m_socket; -} - - -void Socket::SetDeleteByHandler(bool x) -{ - m_bDel = x; -} - - -bool Socket::DeleteByHandler() -{ - return m_bDel; -} - - -void Socket::SetCloseAndDelete(bool x) -{ - if (x != m_bClose) - { - m_bClose = x; - if (x) - { - m_tClose = time(NULL); - Handler().SetClose(); - } - } -} - - -bool Socket::CloseAndDelete() -{ - return m_bClose; -} - - -void Socket::SetRemoteAddress(SocketAddress& ad) //struct sockaddr* sa, socklen_t l) -{ - m_remote_address = ad.GetCopy(); -} - - -std::auto_ptr Socket::GetRemoteSocketAddress() -{ - return m_remote_address -> GetCopy(); -} - - -ISocketHandler& Socket::Handler() const -{ -#ifdef ENABLE_DETACH - if (IsDetached()) - return *m_slave_handler; -#endif - return m_handler; -} - - -ISocketHandler& Socket::MasterHandler() const -{ - return m_handler; -} - - -ipaddr_t Socket::GetRemoteIP4() -{ - ipaddr_t l = 0; -//#ifdef ENABLE_IPV6 - if (m_ipv6) - { - Handler().LogError(this, "GetRemoteIP4", 0, "get ipv4 address for ipv6 socket", LOG_LEVEL_WARNING); - } -//#endif - if (m_remote_address.get() != NULL) - { - struct sockaddr *p = *m_remote_address; - struct sockaddr_in *sa = (struct sockaddr_in *)p; - memcpy(&l, &sa -> sin_addr, sizeof(struct in_addr)); - } - return l; -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -struct in6_addr Socket::GetRemoteIP6() -{ - if (!m_ipv6) - { - Handler().LogError(this, "GetRemoteIP6", 0, "get ipv6 address for ipv4 socket", LOG_LEVEL_WARNING); - } - struct sockaddr_in6 fail; - if (m_remote_address.get() != NULL) - { - struct sockaddr *p = *m_remote_address; - memcpy(&fail, p, sizeof(struct sockaddr_in6)); - } - else - { - memset(&fail, 0, sizeof(struct sockaddr_in6)); - } - return fail.sin6_addr; -} -//#endif -//#endif - - -port_t Socket::GetRemotePort() -{ - if (!m_remote_address.get()) - { - return 0; - } - return m_remote_address -> GetPort(); -} - - -std::string Socket::GetRemoteAddress() -{ - if (!m_remote_address.get()) - { - return ""; - } - return m_remote_address -> Convert(false); -} - - -std::string Socket::GetRemoteHostname() -{ - if (!m_remote_address.get()) - { - return ""; - } - return m_remote_address -> Reverse(); -} - - -bool Socket::SetNonblocking(bool bNb) -{ -#ifdef _WIN32 - unsigned long l = bNb ? 1 : 0; - int n = ioctlsocket(m_socket, FIONBIO, &l); - if (n != 0) - { - Handler().LogError(this, "ioctlsocket(FIONBIO)", Errno, ""); - return false; - } - return true; -#else - if (bNb) - { - if (fcntl(m_socket, F_SETFL, O_NONBLOCK) == -1) - { - Handler().LogError(this, "fcntl(F_SETFL, O_NONBLOCK)", Errno, StrError(Errno), LOG_LEVEL_ERROR); - return false; - } - } - else - { - if (fcntl(m_socket, F_SETFL, 0) == -1) - { - Handler().LogError(this, "fcntl(F_SETFL, 0)", Errno, StrError(Errno), LOG_LEVEL_ERROR); - return false; - } - } - return true; -#endif -} - - -bool Socket::SetNonblocking(bool bNb, SOCKET s) -{ -#ifdef _WIN32 - unsigned long l = bNb ? 1 : 0; - int n = ioctlsocket(s, FIONBIO, &l); - if (n != 0) - { - Handler().LogError(this, "ioctlsocket(FIONBIO)", Errno, ""); - return false; - } - return true; -#else - if (bNb) - { - if (fcntl(s, F_SETFL, O_NONBLOCK) == -1) - { - Handler().LogError(this, "fcntl(F_SETFL, O_NONBLOCK)", Errno, StrError(Errno), LOG_LEVEL_ERROR); - return false; - } - } - else - { - if (fcntl(s, F_SETFL, 0) == -1) - { - Handler().LogError(this, "fcntl(F_SETFL, 0)", Errno, StrError(Errno), LOG_LEVEL_ERROR); - return false; - } - } - return true; -#endif -} - - -bool Socket::Ready() -{ - if (m_socket != INVALID_SOCKET && !CloseAndDelete()) - return true; - return false; -} - - -void Socket::OnLine(const std::string& ) -{ -} - - -void Socket::OnConnectFailed() -{ -} - - -Socket *Socket::GetParent() -{ - return m_parent; -} - - -void Socket::SetParent(Socket *x) -{ - m_parent = x; -} - - -port_t Socket::GetPort() -{ - Handler().LogError(this, "GetPort", 0, "GetPort only implemented for ListenSocket", LOG_LEVEL_WARNING); - return 0; -} - - -bool Socket::OnConnectRetry() -{ - return true; -} - - -#ifdef ENABLE_RECONNECT -void Socket::OnReconnect() -{ -} -#endif - - -time_t Socket::Uptime() -{ - return time(NULL) - m_tCreate; -} - - -//#ifdef ENABLE_IPV6 -void Socket::SetIpv6(bool x) -{ - m_ipv6 = x; -} - - -bool Socket::IsIpv6() -{ - return m_ipv6; -} -//#endif - - -void Socket::DisableRead(bool x) -{ - m_b_disable_read = x; -} - - -bool Socket::IsDisableRead() -{ - return m_b_disable_read; -} - - -void Socket::SendBuf(const char *,size_t,int) -{ -} - - -void Socket::Send(const std::string&,int) -{ -} - - -void Socket::SetConnected(bool x) -{ - m_connected = x; -} - - -bool Socket::IsConnected() -{ - return m_connected; -} - - -void Socket::OnDisconnect() -{ -} - - -void Socket::OnDisconnect(short, int) -{ -} - - -void Socket::SetLost() -{ - m_bLost = true; -} - - -bool Socket::Lost() -{ - return m_bLost; -} - - -void Socket::SetErasedByHandler(bool x) -{ - m_b_erased_by_handler = x; -} - - -bool Socket::ErasedByHandler() -{ - return m_b_erased_by_handler; -} - - -time_t Socket::TimeSinceClose() -{ - return time(NULL) - m_tClose; -} - - -void Socket::SetClientRemoteAddress(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SetClientRemoteAddress", 0, "remote address not valid", LOG_LEVEL_ERROR); - } - m_client_remote_address = ad.GetCopy(); -} - - -std::auto_ptr Socket::GetClientRemoteAddress() -{ - if (!m_client_remote_address.get()) - { - Handler().LogError(this, "GetClientRemoteAddress", 0, "remote address not yet set", LOG_LEVEL_ERROR); - } - return m_client_remote_address -> GetCopy(); -} - - -uint64_t Socket::GetBytesSent(bool) -{ - return 0; -} - - -uint64_t Socket::GetBytesReceived(bool) -{ - return 0; -} - - -void Socket::SetCallOnConnect(bool x) -{ - m_call_on_connect = x; - if (x) - Handler().SetCallOnConnect(); -} - - -bool Socket::CallOnConnect() -{ - return m_call_on_connect; -} - - -void Socket::SetRetryClientConnect(bool x) -{ - m_b_retry_connect = x; - if (x) - Handler().SetRetry(); -} - - -bool Socket::RetryClientConnect() -{ - return m_b_retry_connect; -} - - -#ifdef HAVE_OPENSSL -void Socket::OnSSLConnect() -{ -} - - -void Socket::OnSSLAccept() -{ -} - - -bool Socket::SSLNegotiate() -{ - return false; -} - - -bool Socket::IsSSL() -{ - return m_b_enable_ssl; -} - - -void Socket::EnableSSL(bool x) -{ - m_b_enable_ssl = x; -} - - -bool Socket::IsSSLNegotiate() -{ - return m_b_ssl; -} - - -void Socket::SetSSLNegotiate(bool x) -{ - m_b_ssl = x; -} - - -bool Socket::IsSSLServer() -{ - return m_b_ssl_server; -} - - -void Socket::SetSSLServer(bool x) -{ - m_b_ssl_server = x; -} - - -void Socket::OnSSLConnectFailed() -{ -} - - -void Socket::OnSSLAcceptFailed() -{ -} -#endif // HAVE_OPENSSL - - -#ifdef ENABLE_POOL -void Socket::CopyConnection(Socket *sock) -{ - Attach( sock -> GetSocket() ); -//#ifdef ENABLE_IPV6 - SetIpv6( sock -> IsIpv6() ); -//#endif - SetSocketType( sock -> GetSocketType() ); - SetSocketProtocol( sock -> GetSocketProtocol() ); - - SetClientRemoteAddress( *sock -> GetClientRemoteAddress() ); - SetRemoteAddress( *sock -> GetRemoteSocketAddress() ); -} - - -void Socket::SetIsClient() -{ - m_bClient = true; -} - - -void Socket::SetSocketType(int x) -{ - m_socket_type = x; -} - - -int Socket::GetSocketType() -{ - return m_socket_type; -} - - -void Socket::SetSocketProtocol(const std::string& x) -{ - m_socket_protocol = x; -} - - -const std::string& Socket::GetSocketProtocol() -{ - return m_socket_protocol; -} - - -void Socket::SetRetain() -{ - if (m_bClient) - m_bRetain = true; -} - - -bool Socket::Retain() -{ - return m_bRetain; -} - - -#endif // ENABLE_POOL - - -#ifdef ENABLE_SOCKS4 -void Socket::OnSocks4Connect() -{ - Handler().LogError(this, "OnSocks4Connect", 0, "Use with TcpSocket only"); -} - - -void Socket::OnSocks4ConnectFailed() -{ - Handler().LogError(this, "OnSocks4ConnectFailed", 0, "Use with TcpSocket only"); -} - - -bool Socket::OnSocks4Read() -{ - Handler().LogError(this, "OnSocks4Read", 0, "Use with TcpSocket only"); - return true; -} - - -void Socket::SetSocks4Host(const std::string& host) -{ - Utility::u2ip(host, m_socks4_host); -} - - -bool Socket::Socks4() -{ - return m_bSocks4; -} - - -void Socket::SetSocks4(bool x) -{ - m_bSocks4 = x; -} - - -void Socket::SetSocks4Host(ipaddr_t a) -{ - m_socks4_host = a; -} - - -void Socket::SetSocks4Port(port_t p) -{ - m_socks4_port = p; -} - - -void Socket::SetSocks4Userid(const std::string& x) -{ - m_socks4_userid = x; -} - - -ipaddr_t Socket::GetSocks4Host() -{ - return m_socks4_host; -} - - -port_t Socket::GetSocks4Port() -{ - return m_socks4_port; -} - - -const std::string& Socket::GetSocks4Userid() -{ - return m_socks4_userid; -} -#endif // ENABLE_SOCKS4 - - -#ifdef ENABLE_DETACH -bool Socket::Detach() -{ - if (!DeleteByHandler()) - return false; - if (m_pThread) - return false; - if (m_detached) - return false; - SetDetach(); - return true; -} - - -void Socket::DetachSocket() -{ - SetDetached(); - m_pThread = new SocketThread(this); - m_pThread -> SetRelease(true); -} - - -void Socket::OnDetached() -{ -} - - -void Socket::SetDetach(bool x) -{ - m_detach = x; - if (x) - Handler().SetDetach(); -} - - -bool Socket::IsDetach() -{ - return m_detach; -} - - -void Socket::SetDetached(bool x) -{ - m_detached = x; -} - - -const bool Socket::IsDetached() const -{ - return m_detached; -} - - -void Socket::SetSlaveHandler(ISocketHandler *p) -{ - m_slave_handler = p; -} - - -#endif // ENABLE_DETACH - - -#ifdef ENABLE_RESOLVER -int Socket::Resolve(const std::string& host,port_t port) -{ - return Handler().Resolve(this, host, port); -} - - -//#ifdef ENABLE_IPV6 -int Socket::Resolve6(const std::string& host,port_t port) -{ - return Handler().Resolve6(this, host, port); -} -//#endif - - -int Socket::Resolve(ipaddr_t a) -{ - return Handler().Resolve(this, a); -} - - -//#ifdef ENABLE_IPV6 -int Socket::Resolve(in6_addr& a) -{ - return Handler().Resolve(this, a); -} -//#endif - - -void Socket::OnResolved(int,ipaddr_t,port_t) -{ -} - - -//#ifdef ENABLE_IPV6 -void Socket::OnResolved(int,in6_addr&,port_t) -{ -} -//#endif - - -void Socket::OnReverseResolved(int,const std::string&) -{ -} - - -void Socket::OnResolveFailed(int) -{ -} -#endif // ENABLE_RESOLVER - - -/* IP options */ - - -bool Socket::SetIpOptions(const void *p, socklen_t len) -{ -#ifdef IP_OPTIONS - if (setsockopt(GetSocket(), IPPROTO_IP, IP_OPTIONS, (char *)p, len) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_OPTIONS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_OPTIONS", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef IP_PKTINFO -bool Socket::SetIpPktinfo(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_PKTINFO, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_PKTINFO)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_RECVTOS -bool Socket::SetIpRecvTOS(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVTOS, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVTOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_RECVTTL -bool Socket::SetIpRecvTTL(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVTTL, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVTTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_RECVOPTS -bool Socket::SetIpRecvopts(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVOPTS, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVOPTS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_RETOPTS -bool Socket::SetIpRetopts(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RETOPTS, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RETOPTS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetIpTOS(unsigned char tos) -{ -#ifdef IP_TOS - if (setsockopt(GetSocket(), IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(tos)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_TOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_TOS", LOG_LEVEL_INFO); - return false; -#endif -} - - -unsigned char Socket::IpTOS() -{ - unsigned char tos = 0; -#ifdef IP_TOS - socklen_t len = sizeof(tos); - if (getsockopt(GetSocket(), IPPROTO_IP, IP_TOS, (char *)&tos, &len) == -1) - { - Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_TOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "ip option not available", 0, "IP_TOS", LOG_LEVEL_INFO); -#endif - return tos; -} - - -bool Socket::SetIpTTL(int ttl) -{ -#ifdef IP_TTL - if (setsockopt(GetSocket(), IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_TTL", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::IpTTL() -{ - int ttl = 0; -#ifdef IP_TTL - socklen_t len = sizeof(ttl); - if (getsockopt(GetSocket(), IPPROTO_IP, IP_TTL, (char *)&ttl, &len) == -1) - { - Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "ip option not available", 0, "IP_TTL", LOG_LEVEL_INFO); -#endif - return ttl; -} - - -bool Socket::SetIpHdrincl(bool x) -{ -#ifdef IP_HDRINCL - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_HDRINCL, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_HDRINCL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_HDRINCL", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef IP_RECVERR -bool Socket::SetIpRecverr(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVERR, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVERR)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_MTU_DISCOVER -bool Socket::SetIpMtudiscover(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_MTU_DISCOVER, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MTU_DISCOVER)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_MTU -int Socket::IpMtu() -{ - int mtu = 0; - socklen_t len = sizeof(mtu); - if (getsockopt(GetSocket(), IPPROTO_IP, IP_MTU, (char *)&mtu, &len) == -1) - { - Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_MTU)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } - return mtu; -} -#endif - - -#ifdef IP_ROUTER_ALERT -bool Socket::SetIpRouterAlert(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_ROUTER_ALERT, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_ROUTER_ALERT)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetIpMulticastTTL(int ttl) -{ -#ifdef IP_MULTICAST_TTL - if (setsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MULTICAST_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_TTL", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::IpMulticastTTL() -{ - int ttl = 0; -#ifdef IP_MULTICAST_TTL - socklen_t len = sizeof(ttl); - if (getsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, &len) == -1) - { - Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_MULTICAST_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_TTL", LOG_LEVEL_INFO); -#endif - return ttl; -} - - -bool Socket::SetMulticastLoop(bool x) -{ -#ifdef IP_MULTICAST_LOOP - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MULTICAST_LOOP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_LOOP", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef LINUX -bool Socket::IpAddMembership(struct ip_mreqn& ref) -{ -#ifdef IP_ADD_MEMBERSHIP - if (setsockopt(GetSocket(), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreqn)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_ADD_MEMBERSHIP", LOG_LEVEL_INFO); - return false; -#endif -} -#endif - - -bool Socket::IpAddMembership(struct ip_mreq& ref) -{ -#ifdef IP_ADD_MEMBERSHIP - if (setsockopt(GetSocket(), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreq)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_ADD_MEMBERSHIP", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef LINUX -bool Socket::IpDropMembership(struct ip_mreqn& ref) -{ -#ifdef IP_DROP_MEMBERSHIP - if (setsockopt(GetSocket(), IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreqn)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_DROP_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_DROP_MEMBERSHIP", LOG_LEVEL_INFO); - return false; -#endif -} -#endif - - -bool Socket::IpDropMembership(struct ip_mreq& ref) -{ -#ifdef IP_DROP_MEMBERSHIP - if (setsockopt(GetSocket(), IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreq)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_DROP_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_DROP_MEMBERSHIP", LOG_LEVEL_INFO); - return false; -#endif -} - - -/* SOCKET options */ - - -bool Socket::SetSoReuseaddr(bool x) -{ -#ifdef SO_REUSEADDR - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_REUSEADDR)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_REUSEADDR", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoKeepalive(bool x) -{ -#ifdef SO_KEEPALIVE - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_KEEPALIVE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_KEEPALIVE", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef SO_NOSIGPIPE -bool Socket::SetSoNosigpipe(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_NOSIGPIPE, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_NOSIGPIPE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SoAcceptconn() -{ - int value = 0; -#ifdef SO_ACCEPTCONN - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_ACCEPTCONN, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_ACCEPTCONN)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_ACCEPTCONN", LOG_LEVEL_INFO); -#endif - return value ? true : false; -} - - -#ifdef SO_BSDCOMPAT -bool Socket::SetSoBsdcompat(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BSDCOMPAT, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_BSDCOMPAT)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef SO_BINDTODEVICE -bool Socket::SetSoBindtodevice(const std::string& intf) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BINDTODEVICE, (char *)intf.c_str(), intf.size()) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_BINDTODEVICE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetSoBroadcast(bool x) -{ -#ifdef SO_BROADCAST - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_BROADCAST)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_BROADCAST", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoDebug(bool x) -{ -#ifdef SO_DEBUG - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_DEBUG, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_DEBUG)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_DEBUG", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::SoError() -{ - int value = 0; -#ifdef SO_ERROR - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_ERROR, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_ERROR)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_ERROR", LOG_LEVEL_INFO); -#endif - return value; -} - - -bool Socket::SetSoDontroute(bool x) -{ -#ifdef SO_DONTROUTE - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_DONTROUTE, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_DONTROUTE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_DONTROUTE", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoLinger(int onoff, int linger) -{ -#ifdef SO_LINGER - struct linger stl; - stl.l_onoff = onoff; - stl.l_linger = linger; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_LINGER, (char *)&stl, sizeof(stl)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_LINGER)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_LINGER", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoOobinline(bool x) -{ -#ifdef SO_OOBINLINE - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_OOBINLINE, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_OOBINLINE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_OOBINLINE", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef SO_PASSCRED -bool Socket::SetSoPasscred(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_PASSCRED, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_PASSCRED)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef SO_PEERCRED -bool Socket::SoPeercred(struct ucred& ucr) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_PEERCRED, (char *)&ucr, sizeof(ucr)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_PEERCRED)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef SO_PRIORITY -bool Socket::SetSoPriority(int x) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_PRIORITY, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_PRIORITY)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetSoRcvlowat(int x) -{ -#ifdef SO_RCVLOWAT - if (setsockopt(GetSocket(), SOL_SOCKET, SO_RCVLOWAT, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_RCVLOWAT)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_RCVLOWAT", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoSndlowat(int x) -{ -#ifdef SO_SNDLOWAT - if (setsockopt(GetSocket(), SOL_SOCKET, SO_SNDLOWAT, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_SNDLOWAT)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_SNDLOWAT", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoRcvtimeo(struct timeval& tv) -{ -#ifdef SO_RCVTIMEO - if (setsockopt(GetSocket(), SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_RCVTIMEO)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_RCVTIMEO", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoSndtimeo(struct timeval& tv) -{ -#ifdef SO_SNDTIMEO - if (setsockopt(GetSocket(), SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_SNDTIMEO)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_SNDTIMEO", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoRcvbuf(int x) -{ -#ifdef SO_RCVBUF - if (setsockopt(GetSocket(), SOL_SOCKET, SO_RCVBUF, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_RCVBUF)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_RCVBUF", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::SoRcvbuf() -{ - int value = 0; -#ifdef SO_RCVBUF - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_RCVBUF, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_RCVBUF)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_RCVBUF", LOG_LEVEL_INFO); -#endif - return value; -} - - -#ifdef SO_RCVBUFFORCE -bool Socket::SetSoRcvbufforce(int x) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_RCVBUFFORCE, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_RCVBUFFORCE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetSoSndbuf(int x) -{ -#ifdef SO_SNDBUF - if (setsockopt(GetSocket(), SOL_SOCKET, SO_SNDBUF, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_SNDBUF)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_SNDBUF", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::SoSndbuf() -{ - int value = 0; -#ifdef SO_SNDBUF - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_SNDBUF, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_SNDBUF)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_SNDBUF", LOG_LEVEL_INFO); -#endif - return value; -} - - -#ifdef SO_SNDBUFFORCE -bool Socket::SetSoSndbufforce(int x) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_SNDBUFFORCE, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_SNDBUFFORCE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef SO_TIMESTAMP -bool Socket::SetSoTimestamp(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_TIMESTAMP, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_TIMESTAMP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -int Socket::SoType() -{ - int value = 0; -#ifdef SO_TYPE - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_TYPE, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_TYPE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_TYPE", LOG_LEVEL_INFO); -#endif - return value; -} - - -void Socket::SetTimeout(time_t secs) -{ - if (!secs) - { - m_timeout_start = 0; - m_timeout_limit = 0; - return; - } - m_timeout_start = time(NULL); - m_timeout_limit = secs; - Handler().SetTimeout(); -} - - -bool Socket::CheckTimeout() -{ - return m_timeout_start > 0 && m_timeout_limit > 0; -} - - -void Socket::OnTimeout() -{ -} - - -void Socket::OnConnectTimeout() -{ -} - - -bool Socket::Timeout(time_t tnow) -{ - if (m_timeout_start > 0 && tnow - m_timeout_start > m_timeout_limit) - return true; - return false; -} - - -/** Returns local port number for bound socket file descriptor. */ -port_t Socket::GetSockPort() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct sockaddr_in6 sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in6); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - return ntohs(sa.sin6_port); - } -//#endif -//#endif - struct sockaddr_in sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - return ntohs(sa.sin_port); -} - - -/** Returns local ipv4 address for bound socket file descriptor. */ -ipaddr_t Socket::GetSockIP4() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - return 0; - } -//#endif -//#endif - struct sockaddr_in sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - ipaddr_t a; - memcpy(&a, &sa.sin_addr, 4); - return a; -} - - -/** Returns local ipv4 address as text for bound socket file descriptor. */ -std::string Socket::GetSockAddress() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - return ""; - } -//#endif -//#endif - struct sockaddr_in sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - Ipv4Address addr( sa ); - return addr.Convert(); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -/** Returns local ipv6 address for bound socket file descriptor. */ -struct in6_addr Socket::GetSockIP6() -{ - if (IsIpv6()) - { - struct sockaddr_in6 sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in6); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - return sa.sin6_addr; - } - struct in6_addr a; - memset(&a, 0, sizeof(a)); - return a; -} - - -/** Returns local ipv6 address as text for bound socket file descriptor. */ -std::string Socket::GetSockAddress6() -{ - if (IsIpv6()) - { - struct sockaddr_in6 sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in6); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - Ipv6Address addr( sa ); - return addr.Convert(); - } - return ""; -} -//#endif -//#endif - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.h deleted file mode 100755 index cfdc0ec7af..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.h +++ /dev/null @@ -1,735 +0,0 @@ -/** \file Socket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Socket_H -#define _SOCKETS_Socket_H -#include "sockets-config.h" - -#include -#include -#include -#ifdef HAVE_OPENSSL -#include -#endif - -#include "socket_include.h" -#include -#include "SocketAddress.h" -#include "Thread.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class ISocketHandler; -class SocketAddress; -class IFile; -class SocketThread; - - -/** \defgroup basic Basic sockets */ -/** Socket base class. - \ingroup basic */ -class Socket -{ - /** Socket mode flags. */ - /* - enum { - // Socket - SOCK_DEL = 0x01, ///< Delete by handler flag - SOCK_CLOSE = 0x02, ///< Close and delete flag - SOCK_DISABLE_READ = 0x04, ///< Disable checking for read events - SOCK_CONNECTED = 0x08, ///< Socket is connected (tcp/udp) - - SOCK_ERASED_BY_HANDLER = 0x10, ///< Set by handler before delete - // HAVE_OPENSSL - SOCK_ENABLE_SSL = 0x20, ///< Enable SSL for this TcpSocket - SOCK_SSL = 0x40, ///< ssl negotiation mode (TcpSocket) - SOCK_SSL_SERVER = 0x80, ///< True if this is an incoming ssl TcpSocket connection - - // ENABLE_IPV6 - SOCK_IPV6 = 0x0100, ///< This is an ipv6 socket if this one is true - // ENABLE_POOL - SOCK_CLIENT = 0x0200, ///< only client connections are pooled - SOCK_RETAIN = 0x0400, ///< keep connection on close - SOCK_LOST = 0x0800, ///< connection lost - - // ENABLE_SOCKS4 - SOCK_SOCKS4 = 0x1000, ///< socks4 negotiation mode (TcpSocket) - // ENABLE_DETACH - SOCK_DETACH = 0x2000, ///< Socket ordered to detach flag - SOCK_DETACHED = 0x4000, ///< Socket has been detached - // StreamSocket - STREAMSOCK_CONNECTING = 0x8000, ///< Flag indicating connection in progress - - STREAMSOCK_FLUSH_BEFORE_CLOSE = 0x010000L, ///< Send all data before closing (default true) - STREAMSOCK_CALL_ON_CONNECT = 0x020000L, ///< OnConnect will be called next ISocketHandler cycle if true - STREAMSOCK_RETRY_CONNECT = 0x040000L, ///< Try another connection attempt next ISocketHandler cycle - STREAMSOCK_LINE_PROTOCOL = 0x080000L, ///< Line protocol mode flag - - }; - */ - -public: - /** "Default" constructor */ - Socket(ISocketHandler&); - - virtual ~Socket(); - - /** Socket class instantiation method. Used when a "non-standard" constructor - * needs to be used for the socket class. Note: the socket class still needs - * the "default" constructor with one ISocketHandler& as input parameter. - */ - virtual Socket *Create() { - return NULL; - } - - /** Returns reference to sockethandler that owns the socket. - If the socket is detached, this is a reference to the slave sockethandler. - */ - ISocketHandler& Handler() const; - - /** Returns reference to sockethandler that owns the socket. - This one always returns the reference to the original sockethandler, - even if the socket is detached. - */ - ISocketHandler& MasterHandler() const; - - /** Called by ListenSocket after accept but before socket is added to handler. - * CTcpSocket uses this to create its ICrypt member variable. - * The ICrypt member variable is created by a virtual method, therefore - * it can't be called directly from the CTcpSocket constructor. - * Also used to determine if incoming HTTP connection is normal (port 80) - * or ssl (port 443). - */ - virtual void Init(); - - /** Create a socket file descriptor. - \param af Address family AF_INET / AF_INET6 / ... - \param type SOCK_STREAM / SOCK_DGRAM / ... - \param protocol "tcp" / "udp" / ... */ - SOCKET CreateSocket(int af,int type,const std::string& protocol = ""); - - /** Assign this socket a file descriptor created - by a call to socket() or otherwise. */ - void Attach(SOCKET s); - - /** Return file descriptor assigned to this socket. */ - SOCKET GetSocket(); - - /** Close connection immediately - internal use. - \sa SetCloseAndDelete */ - virtual int Close(); - - /** Returns true when socket file descriptor is valid - and socket is not about to be closed. */ - virtual bool Ready(); - - /** Returns pointer to ListenSocket that created this instance - * on an incoming connection. */ - Socket *GetParent(); - - /** Used by ListenSocket to set parent pointer of newly created - * socket instance. */ - void SetParent(Socket *); - - /** Get listening port from ListenSocket<>. */ - virtual port_t GetPort(); - - /** Set socket non-block operation. */ - bool SetNonblocking(bool); - - /** Set socket non-block operation. */ - bool SetNonblocking(bool, SOCKET); - - /** Total lifetime of instance. */ - time_t Uptime(); - - /** Set address/port of last connect() call. */ - void SetClientRemoteAddress(SocketAddress&); - - /** Get address/port of last connect() call. */ - std::auto_ptr GetClientRemoteAddress(); - - /** Common interface for SendBuf used by Tcp and Udp sockets. */ - virtual void SendBuf(const char *,size_t,int = 0); - - /** Common interface for Send used by Tcp and Udp sockets. */ - virtual void Send(const std::string&,int = 0); - - /** Outgoing traffic counter. */ - virtual uint64_t GetBytesSent(bool clear = false); - - /** Incoming traffic counter. */ - virtual uint64_t GetBytesReceived(bool clear = false); - - // LIST_TIMEOUT - - /** Enable timeout control. 0=disable timeout check. */ - void SetTimeout(time_t secs); - - bool CheckTimeout(); - - /** Check timeout. \return true if time limit reached */ - bool Timeout(time_t tnow); - - /** Used by ListenSocket. ipv4 and ipv6 */ - void SetRemoteAddress(SocketAddress&); - - /** \name Event callbacks */ - //@{ - - /** Called when there is something to be read from the file descriptor. */ - virtual void OnRead(); - /** Called when there is room for another write on the file descriptor. */ - virtual void OnWrite(); - /** Called on socket exception. */ - virtual void OnException(); - /** Called before a socket class is deleted by the ISocketHandler. */ - virtual void OnDelete(); - /** Called when a connection has completed. */ - virtual void OnConnect(); - /** Called when an incoming connection has been completed. */ - virtual void OnAccept(); - /** Called when a complete line has been read and the socket is in - * line protocol mode. */ - virtual void OnLine(const std::string& ); - /** Called on connect timeout (5s). */ - virtual void OnConnectFailed(); - /** Called when a client socket is created, to set socket options. - \param family AF_INET, AF_INET6, etc - \param type SOCK_STREAM, SOCK_DGRAM, etc - \param protocol Protocol number (tcp, udp, sctp, etc) - \param s Socket file descriptor - */ - virtual void OnOptions(int family,int type,int protocol,SOCKET s) = 0; - /** Connection retry callback - return false to abort connection attempts */ - virtual bool OnConnectRetry(); -#ifdef ENABLE_RECONNECT - /** a reconnect has been made */ - virtual void OnReconnect(); -#endif - /** TcpSocket: When a disconnect has been detected (recv/SSL_read returns 0 bytes). */ - virtual void OnDisconnect(); - /** TcpSocket: When a disconnect has been detected (recv/SSL_read returns 0 bytes). - \param info bit 0 read(0)/write(1) - bit 1 normal(read or write returned 0)/error(r/w returned -1) - bit 2 ssl - \param code error code from read/write call (errno / ssl error) - */ - virtual void OnDisconnect(short info, int code); - /** Timeout callback. */ - virtual void OnTimeout(); - /** Connection timeout. */ - virtual void OnConnectTimeout(); - //@} - - /** \name Socket mode flags, set/reset */ - //@{ - /** Set delete by handler true when you want the sockethandler to - delete the socket instance after use. */ - void SetDeleteByHandler(bool = true); - /** Check delete by handler flag. - \return true if this instance should be deleted by the sockethandler */ - bool DeleteByHandler(); - - // LIST_CLOSE - conditional event queue - - /** Set close and delete to terminate the connection. */ - void SetCloseAndDelete(bool = true); - /** Check close and delete flag. - \return true if this socket should be closed and the instance removed */ - bool CloseAndDelete(); - - /** Return number of seconds since socket was ordered to close. \sa SetCloseAndDelete */ - time_t TimeSinceClose(); - - /** Ignore read events for an output only socket. */ - void DisableRead(bool x = true); - /** Check ignore read events flag. - \return true if read events should be ignored */ - bool IsDisableRead(); - - /** Set connected status. */ - void SetConnected(bool = true); - /** Check connected status. - \return true if connected */ - bool IsConnected(); - - /** Connection lost - error while reading/writing from a socket - TcpSocket only. */ - void SetLost(); - /** Check connection lost status flag, used by TcpSocket only. - \return true if there was an error while r/w causing the socket to close */ - bool Lost(); - - /** Set flag indicating the socket is being actively deleted by the sockethandler. */ - void SetErasedByHandler(bool x = true); - /** Get value of flag indicating socket is deleted by sockethandler. */ - bool ErasedByHandler(); - - //@} - - /** \name Information about remote connection */ - //@{ - /** Returns address of remote end. */ - std::auto_ptr GetRemoteSocketAddress(); - /** Returns address of remote end: ipv4. */ - ipaddr_t GetRemoteIP4(); - //#ifdef ENABLE_IPV6 - /** Returns address of remote end: ipv6. */ - //#ifdef IPPROTO_IPV6 - struct in6_addr GetRemoteIP6(); - //#endif - //#endif - /** Returns remote port number: ipv4 and ipv6. */ - port_t GetRemotePort(); - /** Returns remote ip as string? ipv4 and ipv6. */ - std::string GetRemoteAddress(); - /** ipv4 and ipv6(not implemented) */ - std::string GetRemoteHostname(); - //@} - - /** Returns local port number for bound socket file descriptor. */ - port_t GetSockPort(); - /** Returns local ipv4 address for bound socket file descriptor. */ - ipaddr_t GetSockIP4(); - /** Returns local ipv4 address as text for bound socket file descriptor. */ - std::string GetSockAddress(); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Returns local ipv6 address for bound socket file descriptor. */ - struct in6_addr GetSockIP6(); - /** Returns local ipv6 address as text for bound socket file descriptor. */ - std::string GetSockAddress6(); - //#endif - //#endif - socketuid_t UniqueIdentifier() { - return m_uid; - } - - // -------------------------------------------------------------------------- - /** @name IP options - When an ip or socket option is available on all of the operating systems - I'm testing on (linux 2.4.x, _win32, macosx, solaris9 intel) they are not - checked with an #ifdef below. - This might cause a compile error on other operating systems. */ - // -------------------------------------------------------------------------- - - // IP options - //@{ - - bool SetIpOptions(const void *p, socklen_t len); - bool SetIpTOS(unsigned char tos); - unsigned char IpTOS(); - bool SetIpTTL(int ttl); - int IpTTL(); - bool SetIpHdrincl(bool x = true); - bool SetIpMulticastTTL(int); - int IpMulticastTTL(); - bool SetMulticastLoop(bool x = true); - bool IpAddMembership(struct ip_mreq&); - bool IpDropMembership(struct ip_mreq&); - -#ifdef IP_PKTINFO - bool SetIpPktinfo(bool x = true); -#endif -#ifdef IP_RECVTOS - bool SetIpRecvTOS(bool x = true); -#endif -#ifdef IP_RECVTTL - bool SetIpRecvTTL(bool x = true); -#endif -#ifdef IP_RECVOPTS - bool SetIpRecvopts(bool x = true); -#endif -#ifdef IP_RETOPTS - bool SetIpRetopts(bool x = true); -#endif -#ifdef IP_RECVERR - bool SetIpRecverr(bool x = true); -#endif -#ifdef IP_MTU_DISCOVER - bool SetIpMtudiscover(bool x = true); -#endif -#ifdef IP_MTU - int IpMtu(); -#endif -#ifdef IP_ROUTER_ALERT - bool SetIpRouterAlert(bool x = true); -#endif -#ifdef LINUX - bool IpAddMembership(struct ip_mreqn&); -#endif -#ifdef LINUX - bool IpDropMembership(struct ip_mreqn&); -#endif - //@} - - // SOCKET options - /** @name Socket Options */ - //@{ - - bool SoAcceptconn(); - bool SetSoBroadcast(bool x = true); - bool SetSoDebug(bool x = true); - int SoError(); - bool SetSoDontroute(bool x = true); - bool SetSoLinger(int onoff, int linger); - bool SetSoOobinline(bool x = true); - bool SetSoRcvlowat(int); - bool SetSoSndlowat(int); - bool SetSoRcvtimeo(struct timeval&); - bool SetSoSndtimeo(struct timeval&); - bool SetSoRcvbuf(int); - int SoRcvbuf(); - bool SetSoSndbuf(int); - int SoSndbuf(); - int SoType(); - bool SetSoReuseaddr(bool x = true); - bool SetSoKeepalive(bool x = true); - -#ifdef SO_BSDCOMPAT - bool SetSoBsdcompat(bool x = true); -#endif -#ifdef SO_BINDTODEVICE - bool SetSoBindtodevice(const std::string& intf); -#endif -#ifdef SO_PASSCRED - bool SetSoPasscred(bool x = true); -#endif -#ifdef SO_PEERCRED - bool SoPeercred(struct ucred& ); -#endif -#ifdef SO_PRIORITY - bool SetSoPriority(int); -#endif -#ifdef SO_RCVBUFFORCE - bool SetSoRcvbufforce(int); -#endif -#ifdef SO_SNDBUFFORCE - bool SetSoSndbufforce(int); -#endif -#ifdef SO_TIMESTAMP - bool SetSoTimestamp(bool x = true); -#endif -#ifdef SO_NOSIGPIPE - bool SetSoNosigpipe(bool x = true); -#endif - //@} - - // TCP options in TcpSocket.h/TcpSocket.cpp - - - // LIST_CALLONCONNECT - - /** Instruct socket to call OnConnect callback next sockethandler cycle. */ - void SetCallOnConnect(bool x = true); - - /** Check call on connect flag. - \return true if OnConnect() should be called a.s.a.p */ - bool CallOnConnect(); - - // LIST_RETRY - - /** Set flag to initiate a connection attempt after a connection timeout. */ - void SetRetryClientConnect(bool x = true); - - /** Check if a connection attempt should be made. - \return true when another attempt should be made */ - bool RetryClientConnect(); - -#ifdef HAVE_OPENSSL - /** @name SSL Support */ - //@{ - /** SSL client/server support - internal use. \sa TcpSocket */ - virtual void OnSSLConnect(); - /** SSL client/server support - internal use. \sa TcpSocket */ - virtual void OnSSLAccept(); - /** SSL negotiation failed for client connect. */ - virtual void OnSSLConnectFailed(); - /** SSL negotiation failed for server accept. */ - virtual void OnSSLAcceptFailed(); - /** new SSL support */ - virtual bool SSLNegotiate(); - /** Check if SSL is Enabled for this TcpSocket. - \return true if this is a TcpSocket with SSL enabled */ - bool IsSSL(); - /** Enable SSL operation for a TcpSocket. */ - void EnableSSL(bool x = true); - /** Still negotiating ssl connection. - \return true if ssl negotiating is still in progress */ - bool IsSSLNegotiate(); - /** Set flag indicating ssl handshaking still in progress. */ - void SetSSLNegotiate(bool x = true); - /** OnAccept called with SSL Enabled. - \return true if this is a TcpSocket with an incoming SSL connection */ - bool IsSSLServer(); - /** Set flag indicating that this is a TcpSocket with incoming SSL connection. */ - void SetSSLServer(bool x = true); - /** SSL; Get pointer to ssl context structure. */ - virtual SSL_CTX *GetSslContext() { - return NULL; - } - /** SSL; Get pointer to ssl structure. */ - virtual SSL *GetSsl() { - return NULL; - } - //@} -#endif // HAVE_OPENSSL - - //#ifdef ENABLE_IPV6 - /** Enable ipv6 for this socket. */ - void SetIpv6(bool x = true); - /** Check ipv6 socket. - \return true if this is an ipv6 socket */ - bool IsIpv6(); - //#endif - -#ifdef ENABLE_POOL - /** @name Connection Pool */ - //@{ - /** Client = connecting TcpSocket. */ - void SetIsClient(); - /** Socket type from socket() call. */ - void SetSocketType(int x); - /** Socket type from socket() call. */ - int GetSocketType(); - /** Protocol type from socket() call. */ - void SetSocketProtocol(const std::string& x); - /** Protocol type from socket() call. */ - const std::string& GetSocketProtocol(); - /** Instruct a client socket to stay open in the connection pool after use. - If you have connected to a server using tcp, you can call SetRetain - to leave the connection open after your socket instance has been deleted. - The next connection you make to the same server will reuse the already - opened connection, if it is still available. - */ - void SetRetain(); - /** Check retain flag. - \return true if the socket should be moved to connection pool after use */ - bool Retain(); - /** Copy connection parameters from sock. */ - void CopyConnection(Socket *sock); - //@} -#endif // ENABLE_POOL - -#ifdef ENABLE_SOCKS4 - /** \name Socks4 support */ - //@{ - /** Socks4 client support internal use. \sa TcpSocket */ - virtual void OnSocks4Connect(); - /** Socks4 client support internal use. \sa TcpSocket */ - virtual void OnSocks4ConnectFailed(); - /** Socks4 client support internal use. \sa TcpSocket */ - virtual bool OnSocks4Read(); - /** Called when the last write caused the tcp output buffer to - * become empty. */ - /** socket still in socks4 negotiation mode */ - bool Socks4(); - /** Set flag indicating Socks4 handshaking in progress */ - void SetSocks4(bool x = true); - - /** Set socks4 server host address to use */ - void SetSocks4Host(ipaddr_t a); - /** Set socks4 server hostname to use. */ - void SetSocks4Host(const std::string& ); - /** Socks4 server port to use. */ - void SetSocks4Port(port_t p); - /** Provide a socks4 userid if required by the socks4 server. */ - void SetSocks4Userid(const std::string& x); - /** Get the ip address of socks4 server to use. - \return socks4 server host address */ - ipaddr_t GetSocks4Host(); - /** Get the socks4 server port to use. - \return socks4 server port */ - port_t GetSocks4Port(); - /** Get socks4 userid. - \return Socks4 userid */ - const std::string& GetSocks4Userid(); - //@} -#endif // ENABLE_SOCKS4 - -#ifdef ENABLE_RESOLVER - /** \name Asynchronous Resolver */ - //@{ - /** Request an asynchronous dns resolution. - \param host hostname to be resolved - \param port port number passed along for the ride - \return Resolve ID */ - int Resolve(const std::string& host,port_t port = 0); - //#ifdef ENABLE_IPV6 - int Resolve6(const std::string& host, port_t port = 0); - //#endif - /** Callback returning a resolved address. - \param id Resolve ID from Resolve call - \param a resolved ip address - \param port port number passed to Resolve */ - virtual void OnResolved(int id,ipaddr_t a,port_t port); - //#ifdef ENABLE_IPV6 - virtual void OnResolved(int id,in6_addr& a,port_t port); - //#endif - /** Request asynchronous reverse dns lookup. - \param a in_addr to be translated */ - int Resolve(ipaddr_t a); - //#ifdef ENABLE_IPV6 - int Resolve(in6_addr& a); - //#endif - /** Callback returning reverse resolve results. - \param id Resolve ID - \param name Resolved hostname */ - virtual void OnReverseResolved(int id,const std::string& name); - /** Callback indicating failed dns lookup. - \param id Resolve ID */ - virtual void OnResolveFailed(int id); - //@} -#endif // ENABLE_RESOLVER - -#ifdef ENABLE_DETACH - /** \name Thread Support */ - //@{ - /** Callback fires when a new socket thread has started and this - socket is ready for operation again. - \sa ResolvSocket */ - virtual void OnDetached(); - - // LIST_DETACH - - /** Internal use. */ - void SetDetach(bool x = true); - /** Check detach flag. - \return true if the socket should detach to its own thread */ - bool IsDetach(); - - /** Internal use. */ - void SetDetached(bool x = true); - /** Check detached flag. - \return true if the socket runs in its own thread. */ - const bool IsDetached() const; - /** Order this socket to start its own thread and call OnDetached - when ready for operation. */ - bool Detach(); - /** Store the slave sockethandler pointer. */ - void SetSlaveHandler(ISocketHandler *); - /** Create new thread for this socket to run detached in. */ - void DetachSocket(); - //@} -#endif // ENABLE_DETACH - - /** Write traffic to an IFile. Socket will not delete this object. */ - void SetTrafficMonitor(IFile *p) { - m_traffic_monitor = p; - } - -protected: - /** default constructor not available */ - Socket() : m_handler(m_handler) {} - /** copy constructor not available */ - Socket(const Socket& s) : m_handler(s.m_handler) {} - - /** assignment operator not available. */ - Socket& operator=(const Socket& ) { - return *this; - } - - /** All traffic will be written to this IFile, if set. */ - IFile *GetTrafficMonitor() { - return m_traffic_monitor; - } - - // unsigned long m_flags; ///< boolean flags, replacing old 'bool' members - -private: - ISocketHandler& m_handler; ///< Reference of ISocketHandler in control of this socket - SOCKET m_socket; ///< File descriptor - bool m_bDel; ///< Delete by handler flag - bool m_bClose; ///< Close and delete flag - time_t m_tCreate; ///< Time in seconds when this socket was created - Socket *m_parent; ///< Pointer to ListenSocket class, valid for incoming sockets - bool m_b_disable_read; ///< Disable checking for read events - bool m_connected; ///< Socket is connected (tcp/udp) - bool m_b_erased_by_handler; ///< Set by handler before delete - time_t m_tClose; ///< Time in seconds when ordered to close - std::auto_ptr m_client_remote_address; ///< Address of last connect() - std::auto_ptr m_remote_address; ///< Remote end address - IFile *m_traffic_monitor; - time_t m_timeout_start; ///< Set by SetTimeout - time_t m_timeout_limit; ///< Defined by SetTimeout - bool m_bLost; ///< connection lost - static socketuid_t m_next_uid; - socketuid_t m_uid; - bool m_call_on_connect; ///< OnConnect will be called next ISocketHandler cycle if true - bool m_b_retry_connect; ///< Try another connection attempt next ISocketHandler cycle - -#ifdef _WIN32 - static WSAInitializer m_winsock_init; ///< Winsock initialization singleton class -#endif - -#ifdef HAVE_OPENSSL - bool m_b_enable_ssl; ///< Enable SSL for this TcpSocket - bool m_b_ssl; ///< ssl negotiation mode (TcpSocket) - bool m_b_ssl_server; ///< True if this is an incoming ssl TcpSocket connection -#endif - - //#ifdef ENABLE_IPV6 - bool m_ipv6; ///< This is an ipv6 socket if this one is true - //#endif - -#ifdef ENABLE_POOL - int m_socket_type; ///< Type of socket, from socket() call - std::string m_socket_protocol; ///< Protocol, from socket() call - bool m_bClient; ///< only client connections are pooled - bool m_bRetain; ///< keep connection on close -#endif - -#ifdef ENABLE_SOCKS4 - bool m_bSocks4; ///< socks4 negotiation mode (TcpSocket) - ipaddr_t m_socks4_host; ///< socks4 server address - port_t m_socks4_port; ///< socks4 server port number - std::string m_socks4_userid; ///< socks4 server usedid -#endif - -#ifdef ENABLE_DETACH - bool m_detach; ///< Socket ordered to detach flag - bool m_detached; ///< Socket has been detached - SocketThread *m_pThread; ///< Detach socket thread class pointer - ISocketHandler *m_slave_handler; ///< Actual sockethandler while detached -#endif -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Socket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketAddress.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketAddress.h deleted file mode 100755 index 25d0a5f1d3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketAddress.h +++ /dev/null @@ -1,106 +0,0 @@ -/** - ** \file SocketAddress.h - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_SocketAddress_H -#define _SOCKETS_SocketAddress_H - -#include "sockets-config.h" -#include -#include -#include "socket_include.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** - This class and its subclasses is intended to be used as replacement - for the internal data type 'ipaddr_t' and various implementations of - IPv6 addressing found throughout the library. - 'ipaddr_t' is an IPv4 address in network byte order. - 'port_t' is the portnumber in host byte order. - 'struct in6_addr' is an IPv6 address. - 'struct in_addr' is an IPv4 address. - \ingroup basic -*/ -class SocketAddress -{ -public: - virtual ~SocketAddress() {} - - /** Get a pointer to the address struct. */ - virtual operator struct sockaddr *() = 0; - - /** Get length of address struct. */ - virtual operator socklen_t() = 0; - - /** Compare two addresses. */ - virtual bool operator==(SocketAddress&) = 0; - - /** Set port number. - \param port Port number in host byte order */ - virtual void SetPort(port_t port) = 0; - - /** Get port number. - \return Port number in host byte order. */ - virtual port_t GetPort() = 0; - - /** Set socket address. - \param sa Pointer to either 'struct sockaddr_in' or 'struct sockaddr_in6'. */ - virtual void SetAddress(struct sockaddr *sa) = 0; - - /** Convert address to text. */ - virtual std::string Convert(bool include_port) = 0; - - /** Reverse lookup of address. */ - virtual std::string Reverse() = 0; - - /** Get address family. */ - virtual int GetFamily() = 0; - - /** Address structure is valid. */ - virtual bool IsValid() = 0; - - /** Get a copy of this SocketAddress object. */ - virtual std::auto_ptr GetCopy() = 0; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // _SOCKETS_SocketAddress_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.cpp deleted file mode 100755 index fbc4fe102e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.cpp +++ /dev/null @@ -1,1419 +0,0 @@ -/** \file SocketHandler.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#endif -#include -#include -#include - -#include "SocketHandler.h" -#include "UdpSocket.h" -#include "ResolvSocket.h" -#include "ResolvServer.h" -#include "TcpSocket.h" -#include "IMutex.h" -#include "Utility.h" -#include "SocketAddress.h" -#include "Exception.h" -#include "SocketHandlerThread.h" -#include "Lock.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - - -SocketHandler::SocketHandler(StdLog *p) -:m_stdlog(p) -,m_mutex(m_mutex) -,m_b_use_mutex(false) -,m_parent(m_parent) -,m_b_parent_is_valid(false) -,m_release(NULL) -,m_maxsock(0) -,m_tlast(0) -,m_b_check_callonconnect(false) -,m_b_check_detach(false) -,m_b_check_timeout(false) -,m_b_check_retry(false) -,m_b_check_close(false) -#ifdef ENABLE_SOCKS4 -,m_socks4_host(0) -,m_socks4_port(0) -,m_bTryDirect(false) -#endif -#ifdef ENABLE_RESOLVER -,m_resolv_id(0) -,m_resolver(NULL) -#endif -#ifdef ENABLE_POOL -,m_b_enable_pool(false) -#endif -#ifdef ENABLE_DETACH -,m_slave(false) -#endif -{ - FD_ZERO(&m_rfds); - FD_ZERO(&m_wfds); - FD_ZERO(&m_efds); -} - - -SocketHandler::SocketHandler(IMutex& mutex,StdLog *p) -:m_stdlog(p) -,m_mutex(mutex) -,m_b_use_mutex(true) -,m_parent(m_parent) -,m_b_parent_is_valid(false) -,m_release(NULL) -,m_maxsock(0) -,m_tlast(0) -,m_b_check_callonconnect(false) -,m_b_check_detach(false) -,m_b_check_timeout(false) -,m_b_check_retry(false) -,m_b_check_close(false) -#ifdef ENABLE_SOCKS4 -,m_socks4_host(0) -,m_socks4_port(0) -,m_bTryDirect(false) -#endif -#ifdef ENABLE_RESOLVER -,m_resolv_id(0) -,m_resolver(NULL) -#endif -#ifdef ENABLE_POOL -,m_b_enable_pool(false) -#endif -#ifdef ENABLE_DETACH -,m_slave(false) -#endif -{ - m_mutex.Lock(); - FD_ZERO(&m_rfds); - FD_ZERO(&m_wfds); - FD_ZERO(&m_efds); -} - - -SocketHandler::SocketHandler(IMutex& mutex, ISocketHandler& parent, StdLog *p) -:m_stdlog(p) -,m_mutex(mutex) -,m_b_use_mutex(true) -,m_parent(parent) -,m_b_parent_is_valid(true) -,m_release(NULL) -,m_maxsock(0) -,m_tlast(0) -,m_b_check_callonconnect(false) -,m_b_check_detach(false) -,m_b_check_timeout(false) -,m_b_check_retry(false) -,m_b_check_close(false) -#ifdef ENABLE_SOCKS4 -,m_socks4_host(0) -,m_socks4_port(0) -,m_bTryDirect(false) -#endif -#ifdef ENABLE_RESOLVER -,m_resolv_id(0) -,m_resolver(NULL) -#endif -#ifdef ENABLE_POOL -,m_b_enable_pool(false) -#endif -#ifdef ENABLE_DETACH -,m_slave(false) -#endif -{ - m_mutex.Lock(); - FD_ZERO(&m_rfds); - FD_ZERO(&m_wfds); - FD_ZERO(&m_efds); -} - - -SocketHandler::~SocketHandler() -{ - for (std::list::iterator it = m_threads.begin(); it != m_threads.end(); it++) - { - SocketHandlerThread *p = *it; - p -> Stop(); - } -#ifdef ENABLE_RESOLVER - if (m_resolver) - { - m_resolver -> Quit(); - } -#endif - { - while (m_sockets.size()) - { -DEB( fprintf(stderr, "Emptying sockets list in SocketHandler destructor, %d instances\n", (int)m_sockets.size());) - socket_m::iterator it = m_sockets.begin(); - Socket *p = it -> second; - if (p) - { -DEB( fprintf(stderr, " fd %d\n", p -> GetSocket());) - p -> Close(); -DEB( fprintf(stderr, " fd closed %d\n", p -> GetSocket());) -// p -> OnDelete(); // hey, I turn this back on. what's the worst that could happen??!! - // MinionSocket breaks, calling MinderHandler methods in OnDelete - - // MinderHandler is already gone when that happens... - - // only delete socket when controlled - // ie master sockethandler can delete non-detached sockets - // and a slave sockethandler can only delete a detach socket - if (p -> DeleteByHandler() -#ifdef ENABLE_DETACH - && !(m_slave ^ p -> IsDetached()) -#endif - ) - { - p -> SetErasedByHandler(); - delete p; - } - m_sockets.erase(it); - } - else - { - m_sockets.erase(it); - } -DEB( fprintf(stderr, "next\n");) - } -DEB( fprintf(stderr, "/Emptying sockets list in SocketHandler destructor, %d instances\n", (int)m_sockets.size());) - } -#ifdef ENABLE_RESOLVER - if (m_resolver) - { - delete m_resolver; - } -#endif - if (m_b_use_mutex) - { - m_mutex.Unlock(); - } -} - - -ISocketHandler *SocketHandler::Create(StdLog *log) -{ - return new SocketHandler(log); -} - - -ISocketHandler *SocketHandler::Create(IMutex& mutex, ISocketHandler& parent, StdLog *log) -{ - return new SocketHandler(mutex, parent, log); -} - - -bool SocketHandler::ParentHandlerIsValid() -{ - return m_b_parent_is_valid; -} - - -ISocketHandler& SocketHandler::ParentHandler() -{ - if (!m_b_parent_is_valid) - throw Exception("No parent sockethandler available"); - return m_parent; -} - - -ISocketHandler& SocketHandler::GetRandomHandler() -{ - if (m_threads.empty()) - throw Exception("SocketHandler is not multithreaded"); - size_t min_count = 99999; - SocketHandlerThread *match = NULL; - for (std::list::iterator it = m_threads.begin(); it != m_threads.end(); it++) - { - SocketHandlerThread *thr = *it; - ISocketHandler& h = thr -> Handler(); - { - Lock lock(h.GetMutex()); - size_t sz = h.GetCount(); - if (sz < min_count) - { - min_count = sz; - match = thr; - } - } - } - if (match) - return match -> Handler(); - throw Exception("Can't locate free threaded sockethandler"); -} - - -ISocketHandler& SocketHandler::GetEffectiveHandler() -{ - return m_b_parent_is_valid ? m_parent : *this; -} - - -void SocketHandler::SetNumberOfThreads(size_t n) -{ - if (!m_threads.empty()) - { - return; // already set - } - if (n > 1 && n < 256) - { - for (int i = 1; i <= (int)n; i++) - { - SocketHandlerThread *p = new SocketHandlerThread(*this); - m_threads.push_back(p); - p -> SetDeleteOnExit(); - p -> Start(); - p -> Wait(); - } - } -} - - -bool SocketHandler::IsThreaded() -{ - return !m_threads.empty(); -} - - -void SocketHandler::EnableRelease() -{ - if (m_release) - return; - m_release = new UdpSocket(*this); - m_release -> SetDeleteByHandler(); - port_t port = 0; - m_release -> Bind("127.0.0.1", port); - Add(m_release); -} - - -void SocketHandler::Release() -{ - if (!m_release) - return; - m_release -> SendTo("127.0.0.1", m_release -> GetPort(), "\n"); -} - - -IMutex& SocketHandler::GetMutex() const -{ - return m_mutex; -} - - -#ifdef ENABLE_DETACH -void SocketHandler::SetSlave(bool x) -{ - m_slave = x; -} - - -bool SocketHandler::IsSlave() -{ - return m_slave; -} -#endif - - -void SocketHandler::RegStdLog(StdLog *log) -{ - m_stdlog = log; -} - - -void SocketHandler::LogError(Socket *p,const std::string& user_text,int err,const std::string& sys_err,loglevel_t t) -{ - if (m_stdlog) - { - m_stdlog -> error(this, p, user_text, err, sys_err, t); - } -} - - -void SocketHandler::Add(Socket *p) -{ - m_add.push_back(p); // no checks here -} - - -void SocketHandler::ISocketHandler_Add(Socket *p,bool bRead,bool bWrite) -{ - Set(p, bRead, bWrite); -} - - -void SocketHandler::ISocketHandler_Mod(Socket *p,bool bRead,bool bWrite) -{ - Set(p, bRead, bWrite); -} - - -void SocketHandler::ISocketHandler_Del(Socket *p) -{ - Set(p, false, false); -} - - -void SocketHandler::Set(Socket *p,bool bRead,bool bWrite) -{ - SOCKET s = p -> GetSocket(); - if (s >= 0) - { - bool bException = true; - if (bRead) - { - if (!FD_ISSET(s, &m_rfds)) - { - FD_SET(s, &m_rfds); - } - } - else - { - FD_CLR(s, &m_rfds); - } - if (bWrite) - { - if (!FD_ISSET(s, &m_wfds)) - { - FD_SET(s, &m_wfds); - } - } - else - { - FD_CLR(s, &m_wfds); - } - if (bException) - { - if (!FD_ISSET(s, &m_efds)) - { - FD_SET(s, &m_efds); - } - } - else - { - FD_CLR(s, &m_efds); - } - } -} - - -#ifdef ENABLE_RESOLVER -bool SocketHandler::Resolving(Socket *p0) -{ - std::map::iterator it = m_resolve_q.find(p0 -> UniqueIdentifier()); - return it != m_resolve_q.end(); -} -#endif - - -bool SocketHandler::Valid(Socket *p0) -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); ++it) - { - Socket *p = it -> second; - if (p0 == p) - return true; - } - return false; -} - - -bool SocketHandler::Valid(socketuid_t uid) -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); ++it) - { - Socket *p = it -> second; - if (p -> UniqueIdentifier() == uid) - return true; - } - return false; -} - - -bool SocketHandler::OkToAccept(Socket *) -{ - return true; -} - - -size_t SocketHandler::GetCount() -{ - return m_sockets.size() + m_add.size() + m_delete.size(); -} - - -#ifdef ENABLE_SOCKS4 -void SocketHandler::SetSocks4Host(ipaddr_t a) -{ - m_socks4_host = a; -} - - -void SocketHandler::SetSocks4Host(const std::string& host) -{ - Utility::u2ip(host, m_socks4_host); -} - - -void SocketHandler::SetSocks4Port(port_t port) -{ - m_socks4_port = port; -} - - -void SocketHandler::SetSocks4Userid(const std::string& id) -{ - m_socks4_userid = id; -} -#endif - - -#ifdef ENABLE_RESOLVER -int SocketHandler::Resolve(Socket *p,const std::string& host,port_t port) -{ - // check cache - ResolvSocket *resolv = new ResolvSocket(*this, p, host, port); - resolv -> SetId(++m_resolv_id); - resolv -> SetDeleteByHandler(); - ipaddr_t local; - Utility::u2ip("127.0.0.1", local); - if (!resolv -> Open(local, m_resolver_port)) - { - LogError(resolv, "Resolve", -1, "Can't connect to local resolve server", LOG_LEVEL_FATAL); - } - Add(resolv); - m_resolve_q[p -> UniqueIdentifier()] = true; -DEB( fprintf(stderr, " *** Resolve '%s:%d' id#%d m_resolve_q size: %d p: %p\n", host.c_str(), port, resolv -> GetId(), m_resolve_q.size(), p);) - return resolv -> GetId(); -} - - -#ifdef ENABLE_IPV6 -int SocketHandler::Resolve6(Socket *p,const std::string& host,port_t port) -{ - // check cache - ResolvSocket *resolv = new ResolvSocket(*this, p, host, port, true); - resolv -> SetId(++m_resolv_id); - resolv -> SetDeleteByHandler(); - ipaddr_t local; - Utility::u2ip("127.0.0.1", local); - if (!resolv -> Open(local, m_resolver_port)) - { - LogError(resolv, "Resolve", -1, "Can't connect to local resolve server", LOG_LEVEL_FATAL); - } - Add(resolv); - m_resolve_q[p -> UniqueIdentifier()] = true; - return resolv -> GetId(); -} -#endif - - -int SocketHandler::Resolve(Socket *p,ipaddr_t a) -{ - // check cache - ResolvSocket *resolv = new ResolvSocket(*this, p, a); - resolv -> SetId(++m_resolv_id); - resolv -> SetDeleteByHandler(); - ipaddr_t local; - Utility::u2ip("127.0.0.1", local); - if (!resolv -> Open(local, m_resolver_port)) - { - LogError(resolv, "Resolve", -1, "Can't connect to local resolve server", LOG_LEVEL_FATAL); - } - Add(resolv); - m_resolve_q[p -> UniqueIdentifier()] = true; - return resolv -> GetId(); -} - - -#ifdef ENABLE_IPV6 -int SocketHandler::Resolve(Socket *p,in6_addr& a) -{ - // check cache - ResolvSocket *resolv = new ResolvSocket(*this, p, a); - resolv -> SetId(++m_resolv_id); - resolv -> SetDeleteByHandler(); - ipaddr_t local; - Utility::u2ip("127.0.0.1", local); - if (!resolv -> Open(local, m_resolver_port)) - { - LogError(resolv, "Resolve", -1, "Can't connect to local resolve server", LOG_LEVEL_FATAL); - } - Add(resolv); - m_resolve_q[p -> UniqueIdentifier()] = true; - return resolv -> GetId(); -} -#endif - - -void SocketHandler::EnableResolver(port_t port) -{ - if (!m_resolver) - { - m_resolver_port = port; - m_resolver = new ResolvServer(port); - } -} - - -bool SocketHandler::ResolverReady() -{ - return m_resolver ? m_resolver -> Ready() : false; -} -#endif // ENABLE_RESOLVER - - -#ifdef ENABLE_SOCKS4 -void SocketHandler::SetSocks4TryDirect(bool x) -{ - m_bTryDirect = x; -} - - -ipaddr_t SocketHandler::GetSocks4Host() -{ - return m_socks4_host; -} - - -port_t SocketHandler::GetSocks4Port() -{ - return m_socks4_port; -} - - -const std::string& SocketHandler::GetSocks4Userid() -{ - return m_socks4_userid; -} - - -bool SocketHandler::Socks4TryDirect() -{ - return m_bTryDirect; -} -#endif - - -#ifdef ENABLE_RESOLVER -bool SocketHandler::ResolverEnabled() -{ - return m_resolver ? true : false; -} - - -port_t SocketHandler::GetResolverPort() -{ - return m_resolver_port; -} -#endif // ENABLE_RESOLVER - - -#ifdef ENABLE_POOL -ISocketHandler::PoolSocket *SocketHandler::FindConnection(int type,const std::string& protocol,SocketAddress& ad) -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end() && m_sockets.size(); ++it) - { - PoolSocket *pools = dynamic_cast(it -> second); - if (pools) - { - if (pools -> GetSocketType() == type && - pools -> GetSocketProtocol() == protocol && -// %! pools -> GetClientRemoteAddress() && - *pools -> GetClientRemoteAddress() == ad) - { - m_sockets.erase(it); - pools -> SetRetain(); // avoid Close in Socket destructor - return pools; // Caller is responsible that this socket is deleted - } - } - } - return NULL; -} - - -void SocketHandler::EnablePool(bool x) -{ - m_b_enable_pool = x; -} - - -bool SocketHandler::PoolEnabled() -{ - return m_b_enable_pool; -} -#endif - - -void SocketHandler::Remove(Socket *p) -{ -#ifdef ENABLE_RESOLVER - std::map::iterator it4 = m_resolve_q.find(p -> UniqueIdentifier()); - if (it4 != m_resolve_q.end()) - m_resolve_q.erase(it4); -#endif - if (p -> ErasedByHandler()) - { - return; - } - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); ++it) - { - if (it -> second == p) - { - LogError(p, "Remove", -1, "Socket destructor called while still in use", LOG_LEVEL_WARNING); - m_sockets.erase(it); - return; - } - } - for (std::list::iterator it2 = m_add.begin(); it2 != m_add.end(); ++it2) - { - if (*it2 == p) - { - LogError(p, "Remove", -2, "Socket destructor called while still in use", LOG_LEVEL_WARNING); - m_add.erase(it2); - return; - } - } - for (std::list::iterator it3 = m_delete.begin(); it3 != m_delete.end(); ++it3) - { - if (*it3 == p) - { - LogError(p, "Remove", -3, "Socket destructor called while still in use", LOG_LEVEL_WARNING); - m_delete.erase(it3); - return; - } - } -} - - -void SocketHandler::SetCallOnConnect(bool x) -{ - m_b_check_callonconnect = x; -} - - -void SocketHandler::SetDetach(bool x) -{ - m_b_check_detach = x; -} - - -void SocketHandler::SetTimeout(bool x) -{ - m_b_check_timeout = x; -} - - -void SocketHandler::SetRetry(bool x) -{ - m_b_check_retry = x; -} - - -void SocketHandler::SetClose(bool x) -{ - m_b_check_close = x; -} - - -void SocketHandler::DeleteSocket(Socket *p) -{ - p -> OnDelete(); - if (p -> DeleteByHandler() && !p -> ErasedByHandler()) - { - p -> SetErasedByHandler(); - } - m_fds_erase.push_back(p -> UniqueIdentifier()); -} - - -void SocketHandler::RebuildFdset() -{ - fd_set rfds; - fd_set wfds; - fd_set efds; - // rebuild fd_set's from active sockets list (m_sockets) here - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&efds); - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); ++it) - { - SOCKET s = it -> first; - Socket *p = it -> second; - if (s == p -> GetSocket() && s >= 0) - { - fd_set fds; - FD_ZERO(&fds); - FD_SET(s, &fds); - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 0; - int n = select((int)s + 1, &fds, NULL, NULL, &tv); - if (n == -1 && Errno == EBADF) - { - // %! bad fd, remove - LogError(p, "Select", (int)s, "Bad fd in fd_set (2)", LOG_LEVEL_ERROR); - DeleteSocket(p); - } - else - { - if (FD_ISSET(s, &m_rfds)) - FD_SET(s, &rfds); - if (FD_ISSET(s, &m_wfds)) - FD_SET(s, &wfds); - if (FD_ISSET(s, &m_efds)) - FD_SET(s, &efds); - } - } - else - { - // %! mismatch - LogError(p, "Select", (int)s, "Bad fd in fd_set (3)", LOG_LEVEL_ERROR); - DeleteSocket(p); - } - } - m_rfds = rfds; - m_wfds = wfds; - m_efds = efds; -} - - -void SocketHandler::AddIncoming() -{ - while (m_add.size() > 0) - { - if (m_sockets.size() >= MaxCount()) - { - LogError(NULL, "Select", (int)m_sockets.size(), "socket limit reached", LOG_LEVEL_WARNING); - break; - } - std::list::iterator it = m_add.begin(); - Socket *p = *it; - SOCKET s = p -> GetSocket(); -DEB( fprintf(stderr, "Trying to add fd %d, m_add.size() %d\n", (int)s, (int)m_add.size());) - // - if (s == INVALID_SOCKET) - { - LogError(p, "Add", -1, "Invalid socket", LOG_LEVEL_WARNING); - m_delete.push_back(p); - m_add.erase(it); - continue; - } - socket_m::iterator it2; - if ((it2 = m_sockets.find(s)) != m_sockets.end()) - { - Socket *found = it2 -> second; - if (p -> UniqueIdentifier() > found -> UniqueIdentifier()) - { - LogError(p, "Add", (int)p -> GetSocket(), "Replacing socket already in controlled queue (newer uid)", LOG_LEVEL_WARNING); - // replace - DeleteSocket(found); - } - else - if (p -> UniqueIdentifier() == found -> UniqueIdentifier()) - { - LogError(p, "Add", (int)p -> GetSocket(), "Attempt to add socket already in controlled queue (same uid)", LOG_LEVEL_ERROR); - // same - ignore - if (p != found) - m_delete.push_back(p); - m_add.erase(it); - continue; - } - else - { - LogError(p, "Add", (int)p -> GetSocket(), "Attempt to add socket already in controlled queue (older uid)", LOG_LEVEL_FATAL); - // %! it's a dup, don't add to delete queue, just ignore it - m_delete.push_back(p); - m_add.erase(it); - continue; - } - } - if (p -> CloseAndDelete()) - { - LogError(p, "Add", (int)p -> GetSocket(), "Added socket with SetCloseAndDelete() true", LOG_LEVEL_WARNING); - m_sockets[s] = p; - DeleteSocket(p); - p -> Close(); - } - else - { - StreamSocket *scp = dynamic_cast(p); - if (scp && scp -> Connecting()) // 'Open' called before adding socket - { - ISocketHandler_Add(p,false,true); - } - else - { - TcpSocket *tcp = dynamic_cast(p); - bool bWrite = tcp ? tcp -> GetOutputLength() != 0 : false; - if (p -> IsDisableRead()) - { - ISocketHandler_Add(p, false, bWrite); - } - else - { - ISocketHandler_Add(p, true, bWrite); - } - } - m_maxsock = (s > m_maxsock) ? s : m_maxsock; - m_sockets[s] = p; - } - // - m_add.erase(it); - } -} - - -void SocketHandler::CheckErasedSockets() -{ - // check erased sockets - bool check_max_fd = false; - while (m_fds_erase.size()) - { - std::list::iterator it = m_fds_erase.begin(); - socketuid_t uid = *it; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> UniqueIdentifier() == uid) - { - /* Sometimes a SocketThread class can finish its run before the master - sockethandler gets here. In that case, the SocketThread has set the - 'ErasedByHandler' flag on the socket which will make us end up with a - double delete on the socket instance. - The fix is to make sure that the master sockethandler only can delete - non-detached sockets, and a slave sockethandler only can delete - detach sockets. */ - if (p -> ErasedByHandler() -#ifdef ENABLE_DETACH - && !(m_slave ^ p -> IsDetached()) -#endif - ) - { - delete p; - } - m_sockets.erase(it); - break; - } - } - m_fds_erase.erase(it); - check_max_fd = true; - } - // calculate max file descriptor for select() call - if (check_max_fd) - { - m_maxsock = 0; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - SOCKET s = it -> first; - m_maxsock = s > m_maxsock ? s : m_maxsock; - } - } -} - - -void SocketHandler::CheckCallOnConnect() -{ - m_b_check_callonconnect = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> CallOnConnect()) - { - TcpSocket *tcp = dynamic_cast(p); - p -> SetConnected(); // moved here from inside if (tcp) check below -#ifdef HAVE_OPENSSL - if (p -> IsSSL()) // SSL Enabled socket - p -> OnSSLConnect(); - else -#endif -#ifdef ENABLE_SOCKS4 - if (p -> Socks4()) - p -> OnSocks4Connect(); - else -#endif - { - if (tcp) - { - if (tcp -> GetOutputLength()) - { - p -> OnWrite(); - } - } -#ifdef ENABLE_RECONNECT - if (tcp && tcp -> IsReconnect()) - p -> OnReconnect(); - else -#endif - { - p -> OnConnect(); - } - } - p -> SetCallOnConnect( false ); - m_b_check_callonconnect = true; - } - } -} - - -#ifdef ENABLE_DETACH -void SocketHandler::CheckDetach() -{ - m_b_check_detach = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> IsDetach()) - { - ISocketHandler_Del(p); - // After DetachSocket(), all calls to Handler() will return a reference - // to the new slave SocketHandler running in the new thread. - p -> DetachSocket(); - // Adding the file descriptor to m_fds_erase will now also remove the - // socket from the detach queue - tnx knightmad - m_fds_erase.push_back(p -> UniqueIdentifier()); - m_b_check_detach = true; - } - } -} -#endif - - -void SocketHandler::CheckTimeout(time_t tnow) -{ - m_b_check_timeout = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> CheckTimeout()) - { - if (p -> Timeout(tnow)) - { - StreamSocket *scp = dynamic_cast(p); - p -> SetTimeout(0); - if (scp && scp -> Connecting()) - { - p -> OnConnectTimeout(); - // restart timer - p -> SetTimeout( scp -> GetConnectTimeout() ); - } - else - { - p -> OnTimeout(); - } - } - m_b_check_timeout = true; - } - } -} - - -void SocketHandler::CheckRetry() -{ - m_b_check_retry = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> RetryClientConnect()) - { - TcpSocket *tcp = dynamic_cast(p); - tcp -> SetRetryClientConnect(false); -DEB( fprintf(stderr, "Close() before retry client connect\n");) - p -> Close(); // removes from m_fds_retry - std::auto_ptr ad = p -> GetClientRemoteAddress(); - if (ad.get()) - { - tcp -> Open(*ad); - } - else - { - LogError(p, "RetryClientConnect", 0, "no address", LOG_LEVEL_ERROR); - } - Add(p); - m_fds_erase.push_back(p -> UniqueIdentifier()); - m_b_check_retry = true; - } - } -} - - -void SocketHandler::CheckClose() -{ - m_b_check_close = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> CloseAndDelete() ) - { - TcpSocket *tcp = dynamic_cast(p); -#ifdef ENABLE_RECONNECT - if (p -> Lost() && !(tcp && tcp -> Reconnect())) -#else - if (p -> Lost()) -#endif - { - // remove instance when Lost, if not reconnect flag is set - DeleteSocket(p); - } - else - // new graceful tcp - flush and close timeout 5s - if (tcp && p -> IsConnected() && tcp -> GetFlushBeforeClose() && -#ifdef HAVE_OPENSSL - !tcp -> IsSSL() && -#endif - p -> TimeSinceClose() < 5) - { -DEB( fprintf(stderr, " close(1)\n");) - if (tcp -> GetOutputLength()) - { - LogError(p, "Closing", (int)tcp -> GetOutputLength(), "Sending all data before closing", LOG_LEVEL_INFO); - } - else // shutdown write when output buffer is empty - if (!(tcp -> GetShutdown() & SHUT_WR)) - { - SOCKET nn = it -> first; - if (nn != INVALID_SOCKET && shutdown(nn, SHUT_WR) == -1) - { - LogError(p, "graceful shutdown", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - tcp -> SetShutdown(SHUT_WR); - } - else - { - ISocketHandler_Del(p); - tcp -> Close(); - DeleteSocket(p); - } - } - else -#ifdef ENABLE_RECONNECT - if (tcp && p -> IsConnected() && tcp -> Reconnect()) - { - p -> SetCloseAndDelete(false); - tcp -> SetIsReconnect(); - p -> SetConnected(false); -DEB( fprintf(stderr, "Close() before reconnect\n");) - p -> Close(); // dispose of old file descriptor (Open creates a new) - p -> OnDisconnect(); - std::auto_ptr ad = p -> GetClientRemoteAddress(); - if (ad.get()) - { - tcp -> Open(*ad); - } - else - { - LogError(p, "Reconnect", 0, "no address", LOG_LEVEL_ERROR); - } - tcp -> ResetConnectionRetries(); - Add(p); - m_fds_erase.push_back(p -> UniqueIdentifier()); - } - else -#endif - { - if (tcp && p -> IsConnected() && tcp -> GetOutputLength()) - { - LogError(p, "Closing", (int)tcp -> GetOutputLength(), "Closing socket while data still left to send", LOG_LEVEL_WARNING); - } -#ifdef ENABLE_POOL - if (p -> Retain() && !p -> Lost()) - { - PoolSocket *p2 = new PoolSocket(*this, p); - p2 -> SetDeleteByHandler(); - Add(p2); - // - p -> SetCloseAndDelete(false); // added - remove from m_fds_close - } - else -#endif // ENABLE_POOL - { - ISocketHandler_Del(p); -DEB( fprintf(stderr, "Close() before OnDelete\n");) - p -> Close(); - } - DeleteSocket(p); - } - m_b_check_close = true; - } - } -} - - -int SocketHandler::ISocketHandler_Select(struct timeval *tsel) -{ -#ifdef MACOSX - fd_set rfds; - fd_set wfds; - fd_set efds; - FD_COPY(&m_rfds, &rfds); - FD_COPY(&m_wfds, &wfds); - FD_COPY(&m_efds, &efds); -#else - fd_set rfds = m_rfds; - fd_set wfds = m_wfds; - fd_set efds = m_efds; -#endif - int n; -DEB( -printf("select( %d, [", m_maxsock + 1); -for (size_t i = 0; i <= m_maxsock; i++) - if (FD_ISSET(i, &rfds)) - printf(" %d", i); -printf("], ["); -for (size_t i = 0; i <= m_maxsock; i++) - if (FD_ISSET(i, &wfds)) - printf(" %d", i); -printf("], ["); -for (size_t i = 0; i <= m_maxsock; i++) - if (FD_ISSET(i, &efds)) - printf(" %d", i); -printf("]\n"); -) - if (m_b_use_mutex) - { - m_mutex.Unlock(); - n = select( (int)(m_maxsock + 1),&rfds,&wfds,&efds,tsel); - m_mutex.Lock(); - } - else - { - n = select( (int)(m_maxsock + 1),&rfds,&wfds,&efds,tsel); - } - if (n == -1) // error on select - { - int err = Errno; - /* - EBADF An invalid file descriptor was given in one of the sets. - EINTR A non blocked signal was caught. - EINVAL n is negative. Or struct timeval contains bad time values (<0). - ENOMEM select was unable to allocate memory for internal tables. - */ -#ifdef _WIN32 - switch (err) - { - case WSAENOTSOCK: - RebuildFdset(); - break; - case WSAEINTR: - case WSAEINPROGRESS: - break; - case WSAEINVAL: - LogError(NULL, "SocketHandler::Select", err, StrError(err), LOG_LEVEL_FATAL); - throw Exception("select(n): n is negative. Or struct timeval contains bad time values (<0)."); - case WSAEFAULT: - LogError(NULL, "SocketHandler::Select", err, StrError(err), LOG_LEVEL_ERROR); - break; - case WSANOTINITIALISED: - throw Exception("WSAStartup not successfully called"); - case WSAENETDOWN: - throw Exception("Network subsystem failure"); - } -#else - switch (err) - { - case EBADF: - RebuildFdset(); - break; - case EINTR: - break; - case EINVAL: - LogError(NULL, "SocketHandler::Select", err, StrError(err), LOG_LEVEL_FATAL); - throw Exception("select(n): n is negative. Or struct timeval contains bad time values (<0)."); - case ENOMEM: - LogError(NULL, "SocketHandler::Select", err, StrError(err), LOG_LEVEL_ERROR); - break; - } -#endif - printf("error on select(): %d %s\n", Errno, StrError(err)); - } - else - if (!n) // timeout - { - } - else - if (n > 0) - { - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - SOCKET i = it -> first; - Socket *p = it -> second; - // --------------------------------------------------------------------------------- - if (FD_ISSET(i, &rfds)) - { -#ifdef HAVE_OPENSSL - if (p -> IsSSLNegotiate()) - { - p -> SSLNegotiate(); - } - else -#endif - { - p -> OnRead(); - } - } - // --------------------------------------------------------------------------------- - if (FD_ISSET(i, &wfds)) - { -#ifdef HAVE_OPENSSL - if (p -> IsSSLNegotiate()) - { - p -> SSLNegotiate(); - } - else -#endif - { - p -> OnWrite(); - } - } - // --------------------------------------------------------------------------------- - if (FD_ISSET(i, &efds)) - { - p -> OnException(); - } - } // m_sockets ... - } // if (n > 0) - return n; -} - - -int SocketHandler::Select(long sec,long usec) -{ - struct timeval tv; - tv.tv_sec = sec; - tv.tv_usec = usec; - return Select(&tv); -} - - -int SocketHandler::Select() -{ - if (m_b_check_callonconnect || - m_b_check_detach || - m_b_check_timeout || - m_b_check_retry || - m_b_check_close) - { - return Select(0, 200000); - } - return Select(NULL); -} - - -int SocketHandler::Select(struct timeval *tsel) -{ - if (!m_add.empty()) - { - AddIncoming(); - } - int n = ISocketHandler_Select(tsel); - // check CallOnConnect - EVENT - if (m_b_check_callonconnect) - { - CheckCallOnConnect(); - } - -#ifdef ENABLE_DETACH - // check detach of socket if master handler - EVENT - if (!m_slave && m_b_check_detach) - { - CheckDetach(); - } -#endif - - // check Connecting - connection timeout - conditional event - if (m_b_check_timeout) - { - time_t tnow = time(NULL); - if (tnow != m_tlast) - { - CheckTimeout(tnow); - m_tlast = tnow; - } // tnow != tlast - } - - // check retry client connect - EVENT - if (m_b_check_retry) - { - CheckRetry(); - } - - // check close and delete - conditional event - if (m_b_check_close) - { - CheckClose(); - } - - if (!m_fds_erase.empty()) - { - CheckErasedSockets(); - } - - // remove Add's that fizzed - while (m_delete.size()) - { - std::list::iterator it = m_delete.begin(); - Socket *p = *it; - p -> OnDelete(); - m_delete.erase(it); - if (p -> DeleteByHandler() -#ifdef ENABLE_DETACH - && !(m_slave ^ p -> IsDetached()) -#endif - ) - { - p -> SetErasedByHandler(); - delete p; - } - } - - return n; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.h deleted file mode 100755 index 79c28bc6b3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.h +++ /dev/null @@ -1,302 +0,0 @@ -/** \file SocketHandler.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_SocketHandler_H -#define _SOCKETS_SocketHandler_H - -#include "sockets-config.h" -#include -#include - -#include "socket_include.h" -#include "ISocketHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class Socket; -#ifdef ENABLE_RESOLVER -class ResolvServer; -#endif -class IMutex; -class SocketHandlerThread; -class UdpSocket; - -/** Socket container class, event generator. - \ingroup basic */ -class SocketHandler : public ISocketHandler -{ -protected: - /** Map type for holding file descriptors/socket object pointers. */ - typedef std::map socket_m; - -public: - /** SocketHandler constructor. - \param log Optional log class pointer */ - SocketHandler(StdLog *log = NULL); - - /** SocketHandler threadsafe constructor. - \param mutex Externally declared mutex variable - \param log Optional log class pointer */ - SocketHandler(IMutex& mutex,StdLog *log = NULL); - - SocketHandler(IMutex&, ISocketHandler& parent, StdLog * = NULL); - - ~SocketHandler(); - - virtual ISocketHandler *Create(StdLog * = NULL); - virtual ISocketHandler *Create(IMutex&, ISocketHandler&, StdLog * = NULL); - - virtual bool ParentHandlerIsValid(); - - virtual ISocketHandler& ParentHandler(); - - virtual ISocketHandler& GetRandomHandler(); - - virtual ISocketHandler& GetEffectiveHandler(); - - virtual void SetNumberOfThreads(size_t n); - virtual bool IsThreaded(); - - virtual void EnableRelease(); - virtual void Release(); - - /** Get mutex reference for threadsafe operations. */ - IMutex& GetMutex() const; - - /** Register StdLog object for error callback. - \param log Pointer to log class */ - void RegStdLog(StdLog *log); - - /** Log error to log class for print out / storage. */ - void LogError(Socket *p,const std::string& user_text,int err,const std::string& sys_err,loglevel_t t = LOG_LEVEL_WARNING); - - /** Add socket instance to socket map. Removal is always automatic. */ - void Add(Socket *); - - /** Set read/write/exception file descriptor sets (fd_set). */ - void ISocketHandler_Add(Socket *,bool bRead,bool bWrite); - void ISocketHandler_Mod(Socket *,bool bRead,bool bWrite); - void ISocketHandler_Del(Socket *); - - /** Wait for events, generate callbacks. */ - int Select(long sec,long usec); - - /** This method will not return until an event has been detected. */ - int Select(); - - /** Wait for events, generate callbacks. */ - int Select(struct timeval *tsel); - - /** Check that a socket really is handled by this socket handler. */ - bool Valid(Socket *); - bool Valid(socketuid_t); - - /** Return number of sockets handled by this handler. */ - size_t GetCount(); - size_t MaxCount() { - return FD_SETSIZE; - } - - /** Override and return false to deny all incoming connections. - \param p ListenSocket class pointer (use GetPort to identify which one) */ - bool OkToAccept(Socket *p); - - /** Use with care, always lock with h.GetMutex() if multithreaded */ - const std::map& AllSockets() { - return m_sockets; - } - - size_t MaxTcpLineSize() { - return TCP_LINE_SIZE; - } - - void SetCallOnConnect(bool = true); - void SetDetach(bool = true); - void SetTimeout(bool = true); - void SetRetry(bool = true); - void SetClose(bool = true); - -private: - static FILE *m_event_file; - static unsigned long m_event_counter; - -public: - // Connection pool -#ifdef ENABLE_POOL - /** Find available open connection (used by connection pool). */ - ISocketHandler::PoolSocket *FindConnection(int type,const std::string& protocol,SocketAddress&); - /** Enable connection pool (by default disabled). */ - void EnablePool(bool x = true); - /** Check pool status. - \return true if connection pool is enabled */ - bool PoolEnabled(); -#endif // ENABLE_POOL - - // Socks4 -#ifdef ENABLE_SOCKS4 - /** Set socks4 server ip that all new tcp sockets should use. */ - void SetSocks4Host(ipaddr_t); - /** Set socks4 server hostname that all new tcp sockets should use. */ - void SetSocks4Host(const std::string& ); - /** Set socks4 server port number that all new tcp sockets should use. */ - void SetSocks4Port(port_t); - /** Set optional socks4 userid. */ - void SetSocks4Userid(const std::string& ); - /** If connection to socks4 server fails, immediately try direct connection to final host. */ - void SetSocks4TryDirect(bool x = true); - /** Get socks4 server ip. - \return socks4 server ip */ - ipaddr_t GetSocks4Host(); - /** Get socks4 port number. - \return socks4 port number */ - port_t GetSocks4Port(); - /** Get socks4 userid (optional). - \return socks4 userid */ - const std::string& GetSocks4Userid(); - /** Check status of socks4 try direct flag. - \return true if direct connection should be tried if connection to socks4 server fails */ - bool Socks4TryDirect(); -#endif // ENABLE_SOCKS4 - - // DNS resolve server -#ifdef ENABLE_RESOLVER - /** Enable asynchronous DNS. - \param port Listen port of asynchronous dns server */ - void EnableResolver(port_t port = 16667); - /** Check resolver status. - \return true if resolver is enabled */ - bool ResolverEnabled(); - /** Queue a dns request. - \param host Hostname to be resolved - \param port Port number will be echoed in Socket::OnResolved callback */ - int Resolve(Socket *,const std::string& host,port_t port); -#ifdef ENABLE_IPV6 - int Resolve6(Socket *,const std::string& host,port_t port); -#endif - /** Do a reverse dns lookup. */ - int Resolve(Socket *,ipaddr_t a); -#ifdef ENABLE_IPV6 - int Resolve(Socket *,in6_addr& a); -#endif - /** Get listen port of asynchronous dns server. */ - port_t GetResolverPort(); - /** Resolver thread ready for queries. */ - bool ResolverReady(); - /** Returns true if the socket is waiting for a resolve event. */ - bool Resolving(Socket *); -#endif // ENABLE_RESOLVER - -#ifdef ENABLE_DETACH - /** Indicates that the handler runs under SocketThread. */ - void SetSlave(bool x = true); - /** Indicates that the handler runs under SocketThread. */ - bool IsSlave(); -#endif - -protected: - socket_m m_sockets; ///< Active sockets map - std::list m_add; ///< Sockets to be added to sockets map - std::list m_delete; ///< Sockets to be deleted (failed when Add) - -protected: - /** Actual call to select() */ - int ISocketHandler_Select(struct timeval *); - /** Remove socket from socket map, used by Socket class. */ - void Remove(Socket *); - /** Schedule socket for deletion */ - void DeleteSocket(Socket *); - void AddIncoming(); - void CheckErasedSockets(); - void CheckCallOnConnect(); - void CheckDetach(); - void CheckTimeout(time_t); - void CheckRetry(); - void CheckClose(); - // - StdLog *m_stdlog; ///< Registered log class, or NULL - IMutex& m_mutex; ///< Thread safety mutex - bool m_b_use_mutex; ///< Mutex correctly initialized - ISocketHandler& m_parent; - bool m_b_parent_is_valid; - -private: - void RebuildFdset(); - void Set(Socket *,bool,bool); - // - std::list m_threads; - UdpSocket *m_release; - // - SOCKET m_maxsock; ///< Highest file descriptor + 1 in active sockets list - fd_set m_rfds; ///< file descriptor set monitored for read events - fd_set m_wfds; ///< file descriptor set monitored for write events - fd_set m_efds; ///< file descriptor set monitored for exceptions - time_t m_tlast; ///< timeout control - - // state lists - std::list m_fds_erase; ///< File descriptors that are to be erased from m_sockets - - bool m_b_check_callonconnect; - bool m_b_check_detach; - bool m_b_check_timeout; - bool m_b_check_retry; - bool m_b_check_close; - -#ifdef ENABLE_SOCKS4 - ipaddr_t m_socks4_host; ///< Socks4 server host ip - port_t m_socks4_port; ///< Socks4 server port number - std::string m_socks4_userid; ///< Socks4 userid - bool m_bTryDirect; ///< Try direct connection if socks4 server fails -#endif -#ifdef ENABLE_RESOLVER - int m_resolv_id; ///< Resolver id counter - ResolvServer *m_resolver; ///< Resolver thread pointer - port_t m_resolver_port; ///< Resolver listen port - std::map m_resolve_q; ///< resolve queue -#endif -#ifdef ENABLE_POOL - bool m_b_enable_pool; ///< Connection pool enabled if true -#endif -#ifdef ENABLE_DETACH - bool m_slave; ///< Indicates that this is a ISocketHandler run in SocketThread -#endif -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_SocketHandler_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.cpp deleted file mode 100755 index 566e06f625..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/** \file SocketHandler.cpp - ** \date 2010-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "SocketHandlerEp.h" -#include "Exception.h" -#include "IMutex.h" -#include "Utility.h" - -#include - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -SocketHandlerEp::SocketHandlerEp(StdLog *p) -:SocketHandler(p) -,m_epoll(-1) -{ -#ifdef LINUX - m_epoll = epoll_create(FD_SETSIZE); - if (m_epoll == -1) - { - throw Exception(StrError(Errno)); - } -#endif -} - - -SocketHandlerEp::SocketHandlerEp(IMutex& mutex, StdLog *p) -:SocketHandler(mutex, p) -,m_epoll(-1) -{ -#ifdef LINUX - m_epoll = epoll_create(FD_SETSIZE); - if (m_epoll == -1) - { - throw Exception(StrError(Errno)); - } -#endif -} - - -SocketHandlerEp::SocketHandlerEp(IMutex& mutex, ISocketHandler& parent, StdLog *p) -:SocketHandler(mutex, parent, p) -,m_epoll(-1) -{ -#ifdef LINUX - m_epoll = epoll_create(FD_SETSIZE); - if (m_epoll == -1) - { - throw Exception(StrError(Errno)); - } -#endif -} - - -SocketHandlerEp::~SocketHandlerEp() -{ -#ifdef LINUX - if (m_epoll != -1) - { - close(m_epoll); - } -#endif -} - - -ISocketHandler *SocketHandlerEp::Create(StdLog *log) -{ - return new SocketHandlerEp(log); -} - - -ISocketHandler *SocketHandlerEp::Create(IMutex& mutex, ISocketHandler& parent, StdLog *log) -{ - return new SocketHandlerEp(mutex, parent, log); -} - - -#ifdef LINUX -void SocketHandlerEp::ISocketHandler_Add(Socket *p,bool bRead,bool bWrite) -{ - struct epoll_event stat; - SOCKET s = p -> GetSocket(); - stat.data.ptr = p; - stat.events = (bRead ? EPOLLIN : 0) | (bWrite ? EPOLLOUT : 0); - if (epoll_ctl(m_epoll, EPOLL_CTL_ADD, s, &stat) == -1) - { - LogError(NULL, "epoll_ctl: EPOLL_CTL_ADD", Errno, StrError(Errno)); - } -} - - -void SocketHandlerEp::ISocketHandler_Mod(Socket *p,bool r,bool w) -{ - struct epoll_event stat; - SOCKET s = p -> GetSocket(); - stat.data.ptr = p; - stat.events = (r ? EPOLLIN : 0) | (w ? EPOLLOUT : 0); - if (epoll_ctl(m_epoll, EPOLL_CTL_MOD, s, &stat) == -1) - { -// LogError(NULL, "epoll_ctl: EPOLL_CTL_MOD", Errno, StrError(Errno)); - } -} - - -void SocketHandlerEp::ISocketHandler_Del(Socket *p) -{ - struct epoll_event stat; - stat.events = 0; - stat.data.ptr = p; - if (epoll_ctl(m_epoll, EPOLL_CTL_DEL, p -> GetSocket(), &stat) == -1) - { -// LogError(NULL, "epoll_ctl: EPOLL_CTL_DEL", Errno, StrError(Errno)); - } -} - - -int SocketHandlerEp::ISocketHandler_Select(struct timeval *tsel) -{ - int n; - if (m_b_use_mutex) - { - m_mutex.Unlock(); - n = epoll_wait(m_epoll, m_events, MAX_EVENTS_EP_WAIT, tsel ? tsel -> tv_sec * 1000 + tsel -> tv_usec / 1000 : -1); - m_mutex.Lock(); - } - else - { - n = epoll_wait(m_epoll, m_events, MAX_EVENTS_EP_WAIT, tsel ? tsel -> tv_sec * 1000 + tsel -> tv_usec / 1000 : -1); - } - if (n == -1) - { - LogError(NULL, "epoll_wait", Errno, StrError(Errno)); - } - else - if (!n) - { - } - else - if (n > 0) - { - for (int x = 0; x < n; x++) - { - Socket *p = static_cast(m_events[x].data.ptr); - if ((m_events[x].events & EPOLLIN) || (m_events[x].events & EPOLLHUP)) - { -#ifdef HAVE_OPENSSL - if (p -> IsSSLNegotiate()) - { - p -> SSLNegotiate(); - } - else -#endif - { - p -> OnRead(); - } - } - if (m_events[x].events & EPOLLOUT) - { -#ifdef HAVE_OPENSSL - if (p -> IsSSLNegotiate()) - { - p -> SSLNegotiate(); - } - else -#endif - { - p -> OnWrite(); - } - } - if (m_events[x].events & EPOLLERR) - { - p -> OnException(); - } - } - } - return n; -} -#endif - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.h deleted file mode 100755 index fe6c8d5af5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.h +++ /dev/null @@ -1,96 +0,0 @@ -/** \file SocketHandlerEp.h - ** \date 2010-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETHANDLEREP_H -#define _SOCKETHANDLEREP_H - -#include "SocketHandler.h" -#ifdef LINUX -#include - -#define MAX_EVENTS_EP_WAIT 100 -#endif // LINUX - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class SocketHandlerEp : public SocketHandler -{ -public: - /** SocketHandler constructor. - \param log Optional log class pointer */ - SocketHandlerEp(StdLog *log = NULL); - - /** SocketHandler threadsafe constructor. - \param mutex Externally declared mutex variable - \param log Optional log class pointer */ - SocketHandlerEp(IMutex& mutex,StdLog *log = NULL); - - SocketHandlerEp(IMutex&, ISocketHandler& parent, StdLog * = NULL); - - ~SocketHandlerEp(); - - ISocketHandler *Create(StdLog * = NULL); - ISocketHandler *Create(IMutex&, ISocketHandler&, StdLog * = NULL); - -#ifdef LINUX - - /** Set read/write/exception file descriptor sets (fd_set). */ - void ISocketHandler_Add(Socket *,bool bRead,bool bWrite); - void ISocketHandler_Mod(Socket *,bool bRead,bool bWrite); - void ISocketHandler_Del(Socket *); - - size_t MaxCount() { - return 10000; // %! - } - -protected: - /** Actual call to select() */ - int ISocketHandler_Select(struct timeval *); -#endif // LINUX - -private: - int m_epoll; ///< epoll file descriptor -#ifdef LINUX - struct epoll_event m_events[MAX_EVENTS_EP_WAIT]; - -#endif // LINUX - -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETHANDLEREP_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.cpp deleted file mode 100755 index b097983adb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - ** \file SocketHandlerThread.cpp - ** \date 2010-03-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "SocketHandlerThread.h" -#include "Mutex.h" -#include "ISocketHandler.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -SocketHandlerThread::SocketHandlerThread(ISocketHandler& parent) : Thread(false) -, m_parent(parent) -, m_handler(NULL) -{ -} - - -SocketHandlerThread::~SocketHandlerThread() -{ -} - - -ISocketHandler& SocketHandlerThread::Handler() -{ - return *m_handler; -} - - -void SocketHandlerThread::Run() -{ - Mutex mutex; - m_handler = m_parent.Create(mutex, m_parent); - m_sem.Post(); - ISocketHandler& h = *m_handler; - h.EnableRelease(); - while (IsRunning()) - { - h.Select(1, 0); - } -} - - -void SocketHandlerThread::Wait() -{ - m_sem.Wait(); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.h deleted file mode 100755 index 8b02696812..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - ** \file SocketHandlerThread.h - ** \date 2010-03-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETHANDLERTHREAD_H -#define _SOCKETHANDLERTHREAD_H - -#include "Thread.h" -#include "Semaphore.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class ISocketHandler; - -class SocketHandlerThread : public Thread -{ -public: - SocketHandlerThread(ISocketHandler& parent); - ~SocketHandlerThread(); - - virtual void Run(); - - ISocketHandler& Handler(); - - void Wait(); - -private: - ISocketHandler& m_parent; - ISocketHandler *m_handler; - Semaphore m_sem; -}; - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETHANDLERTHREAD_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.cpp deleted file mode 100755 index a97d261f89..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/** - ** \file SocketStream.cpp - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "SocketStream.h" -#include "ISocketHandler.h" -#include "TcpSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -SocketStream::SocketStream(ISocketHandler& h, TcpSocket *sock) : m_handler(h), m_socket(sock) -, m_socket_uid(sock -> UniqueIdentifier()) -{ -} - - -size_t SocketStream::IStreamRead(char *buf, size_t max_sz) -{ - if (m_handler.Valid(m_socket_uid)) - { - return m_socket -> ReadInput(buf, max_sz); - } - return 0; -} - - -void SocketStream::IStreamWrite(const char *buf, size_t sz) -{ - if (m_handler.Valid(m_socket_uid)) - { - m_socket -> SendBuf(buf, sz); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.h deleted file mode 100755 index 76ff52478e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - ** \file SocketStream.h - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_SocketStream_H -#define _SOCKETS_SocketStream_H - -#include "IStream.h" - -#include "socket_include.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class ISocketHandler; -class TcpSocket; - -class SocketStream : public IStream -{ -public: - SocketStream(ISocketHandler& h, TcpSocket *sock); - - size_t IStreamRead(char *buf, size_t max_sz); - - void IStreamWrite(const char *buf, size_t sz); - -private: - ISocketHandler& m_handler; - TcpSocket *m_socket; - socketuid_t m_socket_uid; -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_SocketStream_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.cpp deleted file mode 100755 index 003f8e5ad7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "SocketThread.h" - -#ifdef ENABLE_DETACH -#include "Utility.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -SocketThread::SocketThread(Socket *p) -:Thread(false) -,m_socket(p) -{ - // Creator will release -} - - -SocketThread::~SocketThread() -{ - if (IsRunning()) - { - SetRelease(true); - SetRunning(false); - m_h.Release(); - Utility::Sleep(5); - } -} - - -void SocketThread::Run() -{ - m_h.SetSlave(); - m_h.Add(m_socket); - m_socket -> SetSlaveHandler(&m_h); - m_socket -> OnDetached(); - m_h.EnableRelease(); - while (m_h.GetCount() && IsRunning()) - { - m_h.Select(0, 500000); - } - // m_socket now deleted oops - // yeah oops m_socket delete its socket thread, that means this - // so Socket will no longer delete its socket thread, instead we do this: - SetDeleteOnExit(); -} - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // ENABLE_DETACH diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.h deleted file mode 100755 index 49e50c734f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _SOCKETTHREAD_H -#define _SOCKETTHREAD_H - -#include "sockets-config.h" -#ifdef ENABLE_DETACH - -#include "Thread.h" -#include "SocketHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class Socket; - -/** Detached socket run thread. - \ingroup internal */ -class SocketThread : public Thread -{ -public: - SocketThread(Socket *p); - ~SocketThread(); - - void Run(); - -private: - SocketThread(const SocketThread& s) : m_socket(s.m_socket) {} - SocketThread& operator=(const SocketThread& ) { - return *this; - } - - SocketHandler m_h; - Socket *m_socket; -}; - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // ENABLE_DETACH - -#endif // _SOCKETTHREAD_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config deleted file mode 100755 index 18f9a6596c8bc8394eb766f64605f8bce74d9880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10413 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 K# -#include -#include "sockets-config.h" -#include "socket_include.h" - -int main(int argc,char *argv[]) -{ - if (argc > 1 && !strcmp(argv[1], "-info")) - { -#ifdef HAVE_OPENSSL - printf("SSL support\n"); -#endif -#ifdef IPPROTO_IPV6 - printf("IPv6 support\n"); -#endif -#ifdef USE_SCTP -#ifdef IPPROTO_SCTP - printf("SCTP support\n"); -# ifdef HAVE_SCTP - printf(" HAVE_SCTP: yes\n"); -# else - printf(" HAVE_SCTP: no\n"); -# endif -# ifdef HAVE_KERNEL_SCTP - printf(" HAVE_KERNEL_SCTP: yes\n"); -# else - printf(" HAVE_KERNEL_SCTP: no\n"); -# endif -# ifdef HAVE_SCTP_PRSCTP - printf(" HAVE_SCTP_PRSCTP: yes\n"); -# else - printf(" HAVE_SCTP_PRSCTP: no\n"); -# endif -# ifdef HAVE_SCTP_ADDIP - printf(" HAVE_SCTP_ADDIP: yes\n"); -# else - printf(" HAVE_SCTP_ADDIP: no\n"); -# endif -# ifdef HAVE_SCTP_CANSET_PRIMARY - printf(" HAVE_SCTP_CANSETPRIMARY: yes\n"); -# else - printf(" HAVE_SCTP_CANSETPRIMARY: no\n"); -# endif -# ifdef HAVE_SCTP_SAT_NETWORK_CAPABILITY - printf(" HAVE_SCTP_SAT_NETWORK_CAPABILITY: yes\n"); -# else - printf(" HAVE_SCTP_SAT_NETWORK_CAPABILITY: no\n"); -# endif -# ifdef HAVE_SCTP_MULTIBUF - printf(" HAVE_SCTP_MULTIBUF: yes\n"); -# else - printf(" HAVE_SCTP_MULTIBUF: no\n"); -# endif -# ifdef HAVE_SCTP_NOCONNECT - printf(" HAVE_SCTP_NOCONNECT: yes\n"); -# else - printf(" HAVE_SCTP_NOCONNECT: no\n"); -# endif -# ifdef HAVE_SCTP_EXT_RCVINFO - printf(" HAVE_SCTP_EXT_RCVINFO: yes\n"); -# else - printf(" HAVE_SCTP_EXT_RCVINFO: no\n"); -# endif -#else - printf("No SCTP support\n"); -#endif -#endif - return 0; - } - printf(" -D_VERSION='\"%s\"'", _VERSION); - -#ifdef LINUX - printf(" -DLINUX"); -#endif -#ifdef MACOSX - printf(" -DMACOSX"); -#endif -#ifdef SOLARIS - printf(" -DSOLARIS"); -#endif -#ifdef SOLARIS8 - printf(" -DSOLARIS8"); -#endif -#ifdef _WIN32 - printf(" -D_WIN32"); -#endif -#ifdef __CYGWIN__ - printf(" -D__CYGWIN__"); -#endif -#ifdef SOCKETS_NAMESPACE - printf(" -DSOCKETS_NAMESPACE=%s", SOCKETS_NAMESPACE_STR); -#endif -#ifdef _DEBUG - printf(" -D_DEBUG"); -#endif - -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdLog.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdLog.h deleted file mode 100755 index 0ce120ca36..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdLog.h +++ /dev/null @@ -1,76 +0,0 @@ -/** \file StdLog.h - ** \date 2004-06-01 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_StdLog_H -#define _SOCKETS_StdLog_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** error level enum. */ -typedef enum { - LOG_LEVEL_INFO = 0, - LOG_LEVEL_WARNING, - LOG_LEVEL_ERROR, - LOG_LEVEL_FATAL -} loglevel_t; - - -class ISocketHandler; -class Socket; - -/** \defgroup logging Log help classes */ -/** Log class interface. - \ingroup logging */ -class StdLog -{ -public: - virtual ~StdLog() {} - - virtual void error(ISocketHandler *,Socket *, - const std::string& user_text, - int err, - const std::string& sys_err, - loglevel_t = LOG_LEVEL_WARNING) = 0; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_StdLog_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.cpp deleted file mode 100755 index 4cd199a991..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/** \file StdoutLog.cpp - ** \date 2004-06-01 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include -#include "ISocketHandler.h" -#include "StdoutLog.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - - - -void StdoutLog::error(ISocketHandler *,Socket *sock,const std::string& call,int err,const std::string& sys_err,loglevel_t lvl) -{ - if (lvl < m_min_level) - return; - char dt[40]; - time_t t = time(NULL); -#ifdef __CYGWIN__ - struct tm *tp = localtime(&t); - sprintf(dt, "%d-%02d-%02d %02d:%02d:%02d", - tp -> tm_year + 1900, - tp -> tm_mon + 1, - tp -> tm_mday, - tp -> tm_hour,tp -> tm_min,tp -> tm_sec); -#else - struct tm tp; -#if defined( _WIN32) && !defined(__CYGWIN__) - localtime_s(&tp, &t); -#else - localtime_r(&t, &tp); -#endif - sprintf(dt, "%d-%02d-%02d %02d:%02d:%02d", - tp.tm_year + 1900, - tp.tm_mon + 1, - tp.tm_mday, - tp.tm_hour,tp.tm_min,tp.tm_sec); -#endif - std::string level; - - switch (lvl) - { - case LOG_LEVEL_WARNING: - level = "Warning"; - break; - case LOG_LEVEL_ERROR: - level = "Error"; - break; - case LOG_LEVEL_FATAL: - level = "Fatal"; - break; - case LOG_LEVEL_INFO: - level = "Info"; - break; - } - if (sock) - { - printf("%s :: fd %d :: %s: %d %s (%s)\n", - dt, - sock -> GetSocket(), - call.c_str(),err,sys_err.c_str(),level.c_str()); - } - else - { - printf("%s :: %s: %d %s (%s)\n", - dt, - call.c_str(),err,sys_err.c_str(),level.c_str()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.h deleted file mode 100755 index dc40784864..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.h +++ /dev/null @@ -1,64 +0,0 @@ -/** \file StdoutLog.h - ** \date 2004-06-01 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_StdoutLog_H -#define _SOCKETS_StdoutLog_H - -#include "sockets-config.h" -#include "StdLog.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** StdLog implementation, logs to stdout. - \ingroup logging */ -class StdoutLog : public StdLog -{ -public: - StdoutLog(loglevel_t min_level = LOG_LEVEL_INFO) : m_min_level(min_level) {} - void error(ISocketHandler *,Socket *,const std::string& call,int err,const std::string& sys_err,loglevel_t); - -private: - loglevel_t m_min_level; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_StdoutLog_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.cpp deleted file mode 100755 index 646b1f88b5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/** - ** \file StreamSocket.cpp - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "StreamSocket.h" -#include "ISocketHandler.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -StreamSocket::StreamSocket(ISocketHandler& h) : Socket(h) -,m_bConnecting(false) -,m_connect_timeout(5) -,m_flush_before_close(true) -,m_connection_retry(0) -,m_retries(0) -,m_line_protocol(false) -,m_shutdown(0) -{ -} - - -StreamSocket::~StreamSocket() -{ -} - - -void StreamSocket::SetConnecting(bool x) -{ - if (x != m_bConnecting) - { - m_bConnecting = x; - if (x) - { - SetTimeout( GetConnectTimeout() ); - } - else - { - SetTimeout( 0 ); - } - } -} - - -bool StreamSocket::Connecting() -{ - return m_bConnecting; -} - - -bool StreamSocket::Ready() -{ - if (GetSocket() != INVALID_SOCKET && !Connecting() && !CloseAndDelete()) - return true; - return false; -} - - -void StreamSocket::SetConnectTimeout(int x) -{ - m_connect_timeout = x; -} - - -int StreamSocket::GetConnectTimeout() -{ - return m_connect_timeout; -} - - -void StreamSocket::SetFlushBeforeClose(bool x) -{ - m_flush_before_close = x; -} - - -bool StreamSocket::GetFlushBeforeClose() -{ - return m_flush_before_close; -} - - -int StreamSocket::GetConnectionRetry() -{ - return m_connection_retry; -} - - -void StreamSocket::SetConnectionRetry(int x) -{ - m_connection_retry = x; -} - - -int StreamSocket::GetConnectionRetries() -{ - return m_retries; -} - - -void StreamSocket::IncreaseConnectionRetries() -{ - m_retries++; -} - - -void StreamSocket::ResetConnectionRetries() -{ - m_retries = 0; -} - - -void StreamSocket::SetLineProtocol(bool x) -{ - m_line_protocol = x; -} - - -bool StreamSocket::LineProtocol() -{ - return m_line_protocol; -} - - -void StreamSocket::SetShutdown(int x) -{ - m_shutdown = x; -} - - -int StreamSocket::GetShutdown() -{ - return m_shutdown; -} - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.h deleted file mode 100755 index 367b1f1283..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.h +++ /dev/null @@ -1,142 +0,0 @@ -/** - ** \file StreamSocket.h - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _StreamSocket_H -#define _StreamSocket_H - -#include "Socket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** SOCK_STREAM Socket base class. - \ingroup basic */ -class StreamSocket : public Socket -{ -public: - StreamSocket(ISocketHandler& ); - ~StreamSocket(); - - /** Socket should Check Connect on next write event from select(). */ - void SetConnecting(bool = true); - - /** Check connecting flag. - \return true if the socket is still trying to connect */ - bool Connecting(); - - /** Returns true when socket file descriptor is valid, - socket connection is established, and socket is not about to - be closed. */ - bool Ready(); - - /** Set timeout to use for connection attempt. - \param x Timeout in seconds */ - void SetConnectTimeout(int x); - - /** Return number of seconds to wait for a connection. - \return Connection timeout (seconds) */ - int GetConnectTimeout(); - - /** Set flush before close to make a tcp socket completely empty its - output buffer before closing the connection. */ - void SetFlushBeforeClose(bool = true); - - /** Check flush before status. - \return true if the socket should send all data before closing */ - bool GetFlushBeforeClose(); - - /** Define number of connection retries (tcp only). - n = 0 - no retry - n > 0 - number of retries - n = -1 - unlimited retries */ - void SetConnectionRetry(int n); - - /** Get number of maximum connection retries (tcp only). */ - int GetConnectionRetry(); - - /** Increase number of actual connection retries (tcp only). */ - void IncreaseConnectionRetries(); - - /** Get number of actual connection retries (tcp only). */ - int GetConnectionRetries(); - - /** Reset actual connection retries (tcp only). */ - void ResetConnectionRetries(); - - /** Called after OnRead if socket is in line protocol mode. - \sa SetLineProtocol */ - /** Enable the OnLine callback. Do not create your own OnRead - * callback when using this. */ - virtual void SetLineProtocol(bool = true); - - /** Check line protocol mode. - \return true if socket is in line protocol mode */ - bool LineProtocol(); - - /** Set shutdown status. */ - void SetShutdown(int); - - /** Get shutdown status. */ - int GetShutdown(); - - /** Returns IPPROTO_TCP or IPPROTO_SCTP */ - virtual int Protocol() = 0; - -protected: - StreamSocket(const StreamSocket& ) {} // copy constructor - -private: - StreamSocket& operator=(const StreamSocket& ) { - return *this; // assignment operator - } - - bool m_bConnecting; ///< Flag indicating connection in progress - int m_connect_timeout; ///< Connection timeout (seconds) - bool m_flush_before_close; ///< Send all data before closing (default true) - int m_connection_retry; ///< Maximum connection retries (tcp) - int m_retries; ///< Actual number of connection retries (tcp) - bool m_line_protocol; ///< Line protocol mode flag - int m_shutdown; ///< Shutdown status -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - -#endif // _StreamSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.cpp deleted file mode 100755 index 6c1bd385ea..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/** - ** \file StreamWriter.cpp - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "StreamWriter.h" -#include "IStream.h" -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -StreamWriter::StreamWriter(IStream& stream) : m_stream(stream) -{ -} - - -StreamWriter& StreamWriter::operator<<(const char *buf) -{ - m_stream.IStreamWrite(buf, strlen(buf)); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(const std::string& str) -{ - m_stream.IStreamWrite(str.c_str(), str.size()); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(short x) -{ - *this << Utility::l2string(x); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(int x) -{ - *this << Utility::l2string(x); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(long x) -{ - *this << Utility::l2string(x); - return *this; -} - - -//StreamWriter& StreamWriter::operator<<(int64_t x) -StreamWriter& StreamWriter::operator<<(long long x) -{ - *this << Utility::bigint2string(x); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(double x) -{ - *this << Utility::ToString(x); - return *this; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.h deleted file mode 100755 index ad24ada902..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - ** \file StreamWriter.h - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _STREAMWRITER_H -#define _STREAMWRITER_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IStream; - -class StreamWriter -{ -public: - StreamWriter(IStream& stream); - virtual ~StreamWriter() {} - - StreamWriter& operator<<(const char *); - StreamWriter& operator<<(const std::string&); - StreamWriter& operator<<(short); - StreamWriter& operator<<(int); - StreamWriter& operator<<(long); - StreamWriter& operator<<(long long); - //StreamWriter& operator<<(int64_t); - StreamWriter& operator<<(double); - -private: - IStream& m_stream; - -}; - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _STREAMWRITER_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.cpp deleted file mode 100755 index c6d221529a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.cpp +++ /dev/null @@ -1,1851 +0,0 @@ -/** \file TcpSocket.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#else -#include -#endif -#include "ISocketHandler.h" -#include -#include -#include -#include -#ifdef HAVE_OPENSSL -#include -#include -#endif -#include - -#include "TcpSocket.h" -#include "Utility.h" -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#include "IFile.h" -#include "Lock.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -// statics -#ifdef HAVE_OPENSSL -SSLInitializer TcpSocket::m_ssl_init; -Mutex TcpSocket::m_server_ssl_mutex; -std::map TcpSocket::m_client_contexts; -std::map TcpSocket::m_server_contexts; -#endif - - -// thanks, q -#ifdef _MSC_VER -#pragma warning(disable:4355) -#endif -TcpSocket::TcpSocket(ISocketHandler& h) : StreamSocket(h) -,ibuf(TCP_BUFSIZE_READ) -,m_b_input_buffer_disabled(false) -,m_bytes_sent(0) -,m_bytes_received(0) -,m_skip_c(false) -,m_line(Handler().MaxTcpLineSize()) -,m_line_ptr(0) -#ifdef SOCKETS_DYNAMIC_TEMP -,m_buf(new char[TCP_BUFSIZE_READ + 1]) -#endif -,m_obuf_top(NULL) -,m_transfer_limit(0) -,m_output_length(0) -,m_repeat_length(0) -#ifdef HAVE_OPENSSL -,m_ssl_ctx(NULL) -,m_ssl(NULL) -,m_sbio(NULL) -#endif -#ifdef ENABLE_SOCKS4 -,m_socks4_state(0) -#endif -#ifdef ENABLE_RESOLVER -,m_resolver_id(0) -#endif -#ifdef ENABLE_RECONNECT -,m_b_reconnect(false) -,m_b_is_reconnect(false) -#endif -{ -} -#ifdef _MSC_VER -#pragma warning(default:4355) -#endif - - -#ifdef _MSC_VER -#pragma warning(disable:4355) -#endif -TcpSocket::TcpSocket(ISocketHandler& h,size_t isize,size_t osize) : StreamSocket(h) -,ibuf(isize) -,m_b_input_buffer_disabled(false) -,m_bytes_sent(0) -,m_bytes_received(0) -,m_skip_c(false) -,m_line(Handler().MaxTcpLineSize()) -,m_line_ptr(0) -#ifdef SOCKETS_DYNAMIC_TEMP -,m_buf(new char[TCP_BUFSIZE_READ + 1]) -#endif -,m_obuf_top(NULL) -,m_transfer_limit(0) -,m_output_length(0) -,m_repeat_length(0) -#ifdef HAVE_OPENSSL -,m_ssl_ctx(NULL) -,m_ssl(NULL) -,m_sbio(NULL) -#endif -#ifdef ENABLE_SOCKS4 -,m_socks4_state(0) -#endif -#ifdef ENABLE_RESOLVER -,m_resolver_id(0) -#endif -#ifdef ENABLE_RECONNECT -,m_b_reconnect(false) -,m_b_is_reconnect(false) -#endif -{ -} -#ifdef _MSC_VER -#pragma warning(default:4355) -#endif - - -TcpSocket::~TcpSocket() -{ -#ifdef SOCKETS_DYNAMIC_TEMP - delete[] m_buf; -#endif - // %! empty m_obuf - while (m_obuf.size()) - { - output_l::iterator it = m_obuf.begin(); - OUTPUT *p = *it; - delete p; - m_obuf.erase(it); - } -#ifdef HAVE_OPENSSL - if (m_ssl) - { - SSL_free(m_ssl); - } -#endif -} - - -bool TcpSocket::Open(ipaddr_t ip,port_t port,bool skip_socks) -{ - Ipv4Address ad(ip, port); - Ipv4Address local; - return Open(ad, local, skip_socks); -} - - -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 -bool TcpSocket::Open(in6_addr ip,port_t port,bool skip_socks) -{ - Ipv6Address ad(ip, port); - return Open(ad, skip_socks); -} -#endif -#endif - - -bool TcpSocket::Open(SocketAddress& ad,bool skip_socks) -{ - Ipv4Address bind_ad("0.0.0.0", 0); - return Open(ad, bind_ad, skip_socks); -} - - -bool TcpSocket::Open(SocketAddress& ad,SocketAddress& bind_ad,bool skip_socks) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "Open", 0, "Invalid SocketAddress", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - return false; - } - if (Handler().GetCount() >= Handler().MaxCount()) - { - Handler().LogError(this, "Open", 0, "no space left for more sockets", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - return false; - } - SetConnecting(false); -#ifdef ENABLE_SOCKS4 - SetSocks4(false); -#endif - // check for pooling -#ifdef ENABLE_POOL - if (Handler().PoolEnabled()) - { - ISocketHandler::PoolSocket *pools = Handler().FindConnection(SOCK_STREAM, "tcp", ad); - if (pools) - { - CopyConnection( pools ); - delete pools; - - SetIsClient(); - SetCallOnConnect(); // ISocketHandler must call OnConnect - Handler().LogError(this, "SetCallOnConnect", 0, "Found pooled connection", LOG_LEVEL_INFO); - return true; - } - } -#endif - // if not, create new connection - SOCKET s = CreateSocket(ad.GetFamily(), SOCK_STREAM, "tcp"); - if (s == INVALID_SOCKET) - { - return false; - } - // socket must be nonblocking for async connect - if (!SetNonblocking(true, s)) - { - SetCloseAndDelete(); - closesocket(s); - return false; - } -#ifdef ENABLE_POOL - SetIsClient(); // client because we connect -#endif - SetClientRemoteAddress(ad); - int n = 0; - if (bind_ad.GetPort() != 0) - { - bind(s, bind_ad, bind_ad); - } -#ifdef ENABLE_SOCKS4 - if (!skip_socks && GetSocks4Host() && GetSocks4Port()) - { - Ipv4Address sa(GetSocks4Host(), GetSocks4Port()); - { - std::string sockshost; - Utility::l2ip(GetSocks4Host(), sockshost); - Handler().LogError(this, "Open", 0, "Connecting to socks4 server @ " + sockshost + ":" + - Utility::l2string(GetSocks4Port()), LOG_LEVEL_INFO); - } - SetSocks4(); - n = connect(s, sa, sa); - SetRemoteAddress(sa); - } - else -#endif - { - n = connect(s, ad, ad); - SetRemoteAddress(ad); - } - if (n == -1) - { - // check error code that means a connect is in progress -#ifdef _WIN32 - if (Errno == WSAEWOULDBLOCK) -#else - if (Errno == EINPROGRESS) -#endif - { - Attach(s); - SetConnecting( true ); // this flag will control fd_set's - } - else -#ifdef ENABLE_SOCKS4 - if (Socks4() && Handler().Socks4TryDirect() ) // retry - { - closesocket(s); - return Open(ad, true); - } - else -#endif -#ifdef ENABLE_RECONNECT - if (Reconnect()) - { - Handler().LogError(this, "connect: failed, reconnect pending", Errno, StrError(Errno), LOG_LEVEL_INFO); - Attach(s); - SetConnecting( true ); // this flag will control fd_set's - } - else -#endif - { - Handler().LogError(this, "connect: failed", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - closesocket(s); - return false; - } - } - else - { - Attach(s); - SetCallOnConnect(); // ISocketHandler must call OnConnect - } - - // 'true' means connected or connecting(not yet connected) - // 'false' means something failed - return true; //!Connecting(); -} - - -bool TcpSocket::Open(const std::string &host,port_t port) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { -#ifdef ENABLE_RESOLVER - if (!Handler().ResolverEnabled() || Utility::isipv6(host) ) - { -#endif - in6_addr a; - if (!Utility::u2ip(host, a)) - { - SetCloseAndDelete(); - return false; - } - Ipv6Address ad(a, port); - Ipv6Address local; - return Open(ad, local); -#ifdef ENABLE_RESOLVER - } - m_resolver_id = Resolve6(host, port); - return true; -#endif - } -#endif -#endif -#ifdef ENABLE_RESOLVER - if (!Handler().ResolverEnabled() || Utility::isipv4(host) ) - { -#endif - ipaddr_t l; - if (!Utility::u2ip(host,l)) - { - SetCloseAndDelete(); - return false; - } - Ipv4Address ad(l, port); - Ipv4Address local; - return Open(ad, local); -#ifdef ENABLE_RESOLVER - } - // resolve using async resolver thread - m_resolver_id = Resolve(host, port); - return true; -#endif -} - - -#ifdef ENABLE_RESOLVER -void TcpSocket::OnResolved(int id,ipaddr_t a,port_t port) -{ -DEB( fprintf(stderr, "TcpSocket::OnResolved id %d addr %x port %d\n", id, a, port);) - if (id == m_resolver_id) - { - if (a && port) - { - Ipv4Address ad(a, port); - Ipv4Address local; - if (Open(ad, local)) - { - if (!Handler().Valid(this)) - { - Handler().Add(this); - } - } - } - else - { - Handler().LogError(this, "OnResolved", 0, "Resolver failed", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } - else - { - Handler().LogError(this, "OnResolved", id, "Resolver returned wrong job id", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } -} - - -#ifdef ENABLE_IPV6 -void TcpSocket::OnResolved(int id,in6_addr& a,port_t port) -{ - if (id == m_resolver_id) - { - Ipv6Address ad(a, port); - if (ad.IsValid()) - { - Ipv6Address local; - if (Open(ad, local)) - { - if (!Handler().Valid(this)) - { - Handler().Add(this); - } - } - } - } - else - { - Handler().LogError(this, "OnResolved", id, "Resolver returned wrong job id", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } -} -#endif -#endif - - -void TcpSocket::OnRead() -{ - int n = 0; -#ifdef SOCKETS_DYNAMIC_TEMP - char *buf = m_buf; -#else - char buf[TCP_BUFSIZE_READ]; -#endif -#ifdef HAVE_OPENSSL - if (IsSSL()) - { - if (!Ready()) - return; - n = SSL_read(m_ssl, buf, TCP_BUFSIZE_READ); - if (n == -1) - { - n = SSL_get_error(m_ssl, n); - switch (n) - { - case SSL_ERROR_NONE: - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - break; - case SSL_ERROR_ZERO_RETURN: -DEB( fprintf(stderr, "SSL_read() returns zero - closing socket\n");) - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_SSL|TCP_DISCONNECT_ERROR, n); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - break; - default: -DEB( fprintf(stderr, "SSL read problem, errcode = %d\n",n);) - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_SSL|TCP_DISCONNECT_ERROR, n); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - } - return; - } - else - if (!n) - { -DEB( n = SSL_get_error(m_ssl, n); - fprintf(stderr, "SSL_read returns 0, SSL_get_error: %d\n", n); - if (n == SSL_ERROR_SYSCALL) - { - fprintf(stderr, "ERR_get_error() returns %ld\n", ERR_get_error()); - perror("errno: SSL_read"); - }) - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_SSL, 0); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - SetShutdown(SHUT_WR); - return; - } - else - if (n > 0 && n <= TCP_BUFSIZE_READ) - { - m_bytes_received += n; - if (GetTrafficMonitor()) - { - GetTrafficMonitor() -> fwrite(buf, 1, n); - } - if (!m_b_input_buffer_disabled && !ibuf.Write(buf,n)) - { - Handler().LogError(this, "OnRead(ssl)", 0, "ibuf overflow", LOG_LEVEL_WARNING); - } - } - else - { - Handler().LogError(this, "OnRead(ssl)", n, "abnormal value from SSL_read", LOG_LEVEL_ERROR); - } - } - else -#endif // HAVE_OPENSSL - { - n = recv(GetSocket(), buf, TCP_BUFSIZE_READ, MSG_NOSIGNAL); - if (n == -1) - { - Handler().LogError(this, "read", Errno, StrError(Errno), LOG_LEVEL_FATAL); - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_ERROR, Errno); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - return; - } - else - if (!n) - { - OnDisconnect(); - OnDisconnect(0, 0); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - SetShutdown(SHUT_WR); - return; - } - else - if (n > 0 && n <= TCP_BUFSIZE_READ) - { - m_bytes_received += n; - if (GetTrafficMonitor()) - { - GetTrafficMonitor() -> fwrite(buf, 1, n); - } - if (!m_b_input_buffer_disabled && !ibuf.Write(buf,n)) - { - Handler().LogError(this, "OnRead", 0, "ibuf overflow", LOG_LEVEL_WARNING); - } - } - else - { - Handler().LogError(this, "OnRead", n, "abnormal value from recv", LOG_LEVEL_ERROR); - } - } - // - OnRead( buf, n ); -} - - -void TcpSocket::OnRead( char *buf, size_t n ) -{ - // unbuffered - if (n > 0 && n <= TCP_BUFSIZE_READ) - { - if (LineProtocol()) - { - buf[n] = 0; - size_t i = 0; - if (m_skip_c && (buf[i] == 13 || buf[i] == 10) && buf[i] != m_c) - { - m_skip_c = false; - i++; - } - size_t x = i; - for (; i < n && LineProtocol(); i++) - { - while ((buf[i] == 13 || buf[i] == 10) && LineProtocol()) - { - char c = buf[i]; - buf[i] = 0; - if (buf[x]) - { - size_t sz = strlen(&buf[x]); - if (m_line_ptr + sz < Handler().MaxTcpLineSize()) - { - memcpy(&m_line[m_line_ptr], &buf[x], sz); - m_line_ptr += sz; - } - else - { - Handler().LogError(this, "TcpSocket::OnRead", (int)(m_line_ptr + sz), "maximum tcp_line_size exceeded, connection closed", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } - if (m_line_ptr > 0) - OnLine( std::string(&m_line[0], m_line_ptr) ); - else - OnLine( "" ); - i++; - m_skip_c = true; - m_c = c; - if (i < n && (buf[i] == 13 || buf[i] == 10) && buf[i] != c) - { - m_skip_c = false; - i++; - } - x = i; - m_line_ptr = 0; - } - if (!LineProtocol()) - { - break; - } - } - if (!LineProtocol()) - { - if (i < n) - { - OnRawData(buf + i, n - i); - } - } - else - if (buf[x]) - { - size_t sz = strlen(&buf[x]); - if (m_line_ptr + sz < Handler().MaxTcpLineSize()) - { - memcpy(&m_line[m_line_ptr], &buf[x], sz); - m_line_ptr += sz; - } - else - { - Handler().LogError(this, "TcpSocket::OnRead", (int)(m_line_ptr + sz), "maximum tcp_line_size exceeded, connection closed", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } - } - else - { - OnRawData(buf, n); - } - } - if (m_b_input_buffer_disabled) - { - return; - } - // further processing: socks4 -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - bool need_more = false; - while (GetInputLength() && !need_more && !CloseAndDelete()) - { - need_more = OnSocks4Read(); - } - } -#endif -} - - -void TcpSocket::OnWriteComplete() -{ -} - - -void TcpSocket::OnWrite() -{ - if (Connecting()) - { - int err = SoError(); - - // don't reset connecting flag on error here, we want the OnConnectFailed timeout later on - if (!err) // ok - { - Handler().ISocketHandler_Mod(this, !IsDisableRead(), false); - SetConnecting(false); - SetCallOnConnect(); - return; - } - Handler().LogError(this, "tcp: connect failed", err, StrError(err), LOG_LEVEL_FATAL); - Handler().ISocketHandler_Mod(this, false, false); // no more monitoring because connection failed - - // failed -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - // %! leave 'Connecting' flag set? - OnSocks4ConnectFailed(); - return; - } -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && GetConnectionRetries() < GetConnectionRetry()) ) - { - // even though the connection failed at once, only retry after - // the connection timeout. - // should we even try to connect again, when CheckConnect returns - // false it's because of a connection error - not a timeout... - return; - } - SetConnecting(false); - SetCloseAndDelete( true ); - /// \todo state reason why connect failed - OnConnectFailed(); - return; - } - - SendFromOutputBuffer(); -} - - -void TcpSocket::SendFromOutputBuffer() -{ - // try send next block in buffer - // if full block is sent, repeat - // if all blocks are sent, reset m_wfds - - bool repeat = false; - size_t sz = m_transfer_limit ? GetOutputLength() : 0; - do - { - if (m_obuf.empty()) - { - Handler().LogError(this, "OnWrite", (int)m_output_length, "Empty output buffer in OnWrite", LOG_LEVEL_ERROR); - break; - } - output_l::iterator it = m_obuf.begin(); - OUTPUT *p = *it; - repeat = false; - int n = TryWrite(p -> Buf(), p -> Len()); - if (n > 0) - { - size_t left = p -> Remove(n); - m_output_length -= n; - if (!left) - { - delete p; - m_obuf.erase(it); - if (!m_obuf.size()) - { - m_obuf_top = NULL; - OnWriteComplete(); - } - else - { - repeat = true; - } - } - } - } while (repeat); - - if (m_transfer_limit && sz > m_transfer_limit && GetOutputLength() < m_transfer_limit) - { - OnTransferLimit(); - } - - // check output buffer set, set/reset m_wfds accordingly - { - bool br = !IsDisableRead(); - if (m_obuf.size()) - Handler().ISocketHandler_Mod(this, br, true); - else - Handler().ISocketHandler_Mod(this, br, false); - } -} - - -int TcpSocket::TryWrite(const char *buf, size_t len) -{ - int n = 0; -#ifdef HAVE_OPENSSL - if (IsSSL()) - { - n = SSL_write(m_ssl, buf, (int)(m_repeat_length ? m_repeat_length : len)); - if (n == -1) - { - int errnr = SSL_get_error(m_ssl, n); - if ( errnr == SSL_ERROR_WANT_READ || errnr == SSL_ERROR_WANT_WRITE ) - { - m_repeat_length = m_repeat_length ? m_repeat_length : len; - } - else - { - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_WRITE|TCP_DISCONNECT_ERROR|TCP_DISCONNECT_SSL, errnr); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - { - char errbuf[256]; - ERR_error_string_n(errnr, errbuf, 256); - Handler().LogError(this, "OnWrite/SSL_write", errnr, errbuf, LOG_LEVEL_FATAL); - } - } - return 0; - } - else - if (!n) - { - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_WRITE|TCP_DISCONNECT_SSL, 0); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - } - m_repeat_length = 0; - } - else -#endif // HAVE_OPENSSL - { - n = send(GetSocket(), buf, (int)len, MSG_NOSIGNAL); - if (n == -1) - { - // normal error codes: - // WSAEWOULDBLOCK - // EAGAIN or EWOULDBLOCK -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - { - Handler().LogError(this, "send", Errno, StrError(Errno), LOG_LEVEL_FATAL); - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_WRITE|TCP_DISCONNECT_ERROR, Errno); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - } - return 0; - } - } - if (n > 0) - { - m_bytes_sent += n; - if (GetTrafficMonitor()) - { - GetTrafficMonitor() -> fwrite(buf, 1, n); - } - } - return n; -} - - -void TcpSocket::Buffer(const char *buf, size_t len) -{ - size_t ptr = 0; - m_output_length += len; - while (ptr < len) - { - // buf/len => pbuf/sz - size_t space = 0; - if ((space = m_obuf_top ? m_obuf_top -> Space() : 0) > 0) - { - const char *pbuf = buf + ptr; - size_t sz = len - ptr; - if (space >= sz) - { - m_obuf_top -> Add(pbuf, sz); - ptr += sz; - } - else - { - m_obuf_top -> Add(pbuf, space); - ptr += space; - } - } - else - { - m_obuf_top = new OUTPUT; - m_obuf.push_back( m_obuf_top ); - } - } -} - - -void TcpSocket::Send(const std::string &str,int i) -{ - SendBuf(str.c_str(),str.size(),i); -} - - -void TcpSocket::SendBuf(const char *buf,size_t len,int) -{ - if (!Ready() && !Connecting()) - { - Handler().LogError(this, "SendBuf", -1, "Attempt to write to a non-ready socket" ); // warning - if (GetSocket() == INVALID_SOCKET) - Handler().LogError(this, "SendBuf", 0, " * GetSocket() == INVALID_SOCKET", LOG_LEVEL_INFO); - if (Connecting()) - Handler().LogError(this, "SendBuf", 0, " * Connecting()", LOG_LEVEL_INFO); - if (CloseAndDelete()) - Handler().LogError(this, "SendBuf", 0, " * CloseAndDelete()", LOG_LEVEL_INFO); - return; - } - if (!IsConnected()) - { - Handler().LogError(this, "SendBuf", -1, "Attempt to write to a non-connected socket, will be sent on connect" ); // warning - Buffer(buf, len); - return; - } - if (m_obuf_top) - { - Buffer(buf, len); - return; - } -#ifdef HAVE_OPENSSL - if (IsSSL()) - { - Buffer(buf, len); - SendFromOutputBuffer(); - return; - } -#endif - int n = TryWrite(buf, len); - if (n >= 0 && n < (int)len) - { - Buffer(buf + n, len - n); - } - // if ( data in buffer || !IsConnected ) - // { - // add to buffer - // } - // else - // try_send - // if any data is unsent, buffer it and set m_wfds - - // check output buffer set, set/reset m_wfds accordingly - { - bool br = !IsDisableRead(); - if (m_obuf.size()) - Handler().ISocketHandler_Mod(this, br, true); - else - Handler().ISocketHandler_Mod(this, br, false); - } -} - - -void TcpSocket::OnLine(const std::string& ) -{ -} - - -#ifdef _MSC_VER -#pragma warning(disable:4355) -#endif -TcpSocket::TcpSocket(const TcpSocket& s) -:StreamSocket(s) -,ibuf(0) -{ -} -#ifdef _MSC_VER -#pragma warning(default:4355) -#endif - - -#ifdef ENABLE_SOCKS4 -void TcpSocket::OnSocks4Connect() -{ - char request[1000]; - memset(request, 0, sizeof(request)); - request[0] = 4; // socks v4 - request[1] = 1; // command code: CONNECT - { - std::auto_ptr ad = GetClientRemoteAddress(); - if (ad.get()) - { - struct sockaddr *p0 = (struct sockaddr *)*ad; - struct sockaddr_in *p = (struct sockaddr_in *)p0; - if (p -> sin_family == AF_INET) - { - memcpy(request + 2, &p -> sin_port, 2); // nwbo is ok here - memcpy(request + 4, &p -> sin_addr, sizeof(struct in_addr)); - } - else - { - /// \todo warn - } - } - else - { - /// \todo warn - } - } -#if defined( _WIN32) && !defined(__CYGWIN__) - strcpy_s(request + 8, sizeof(request) - 8, GetSocks4Userid().c_str()); -#else - strcpy(request + 8, GetSocks4Userid().c_str()); -#endif - size_t length = GetSocks4Userid().size() + 8 + 1; - SendBuf(request, length); - m_socks4_state = 0; -} - - -void TcpSocket::OnSocks4ConnectFailed() -{ - Handler().LogError(this,"OnSocks4ConnectFailed",0,"connection to socks4 server failed, trying direct connection",LOG_LEVEL_WARNING); - if (!Handler().Socks4TryDirect()) - { - SetConnecting(false); - SetCloseAndDelete(); - OnConnectFailed(); // just in case - } - else - { - SetRetryClientConnect(); - } -} - - -bool TcpSocket::OnSocks4Read() -{ - switch (m_socks4_state) - { - case 0: - ibuf.Read(&m_socks4_vn, 1); - m_socks4_state = 1; - break; - case 1: - ibuf.Read(&m_socks4_cd, 1); - m_socks4_state = 2; - break; - case 2: - if (GetInputLength() > 1) - { - ibuf.Read( (char *)&m_socks4_dstport, 2); - m_socks4_state = 3; - } - else - { - return true; - } - break; - case 3: - if (GetInputLength() > 3) - { - ibuf.Read( (char *)&m_socks4_dstip, 4); - SetSocks4(false); - - switch (m_socks4_cd) - { - case 90: - OnConnect(); - Handler().LogError(this, "OnSocks4Read", 0, "Connection established", LOG_LEVEL_INFO); - break; - case 91: - case 92: - case 93: - Handler().LogError(this,"OnSocks4Read",m_socks4_cd,"socks4 server reports connect failed",LOG_LEVEL_FATAL); - SetConnecting(false); - SetCloseAndDelete(); - OnConnectFailed(); - break; - default: - Handler().LogError(this,"OnSocks4Read",m_socks4_cd,"socks4 server unrecognized response",LOG_LEVEL_FATAL); - SetCloseAndDelete(); - break; - } - } - else - { - return true; - } - break; - } - return false; -} -#endif - - -void TcpSocket::Sendf(const char *format, ...) -{ - va_list ap; - va_start(ap, format); - char slask[5000]; // vsprintf / vsnprintf temporary - vsnprintf(slask, sizeof(slask), format, ap); - va_end(ap); - Send( slask ); -} - - -#ifdef HAVE_OPENSSL -void TcpSocket::OnSSLConnect() -{ - SetNonblocking(true); - { - if (m_ssl_ctx) - { -DEB( fprintf(stderr, "SSL Context already initialized - closing socket\n");) - SetCloseAndDelete(true); - return; - } - InitSSLClient(); - } - if (m_ssl_ctx) - { - /* Connect the SSL socket */ - m_ssl = SSL_new(m_ssl_ctx); - if (!m_ssl) - { -DEB( fprintf(stderr, " m_ssl is NULL\n");) - SetCloseAndDelete(true); - return; - } - m_sbio = BIO_new_socket((int)GetSocket(), BIO_NOCLOSE); - if (!m_sbio) - { -DEB( fprintf(stderr, " m_sbio is NULL\n");) - SetCloseAndDelete(true); - return; - } - SSL_set_bio(m_ssl, m_sbio, m_sbio); - if (!SSLNegotiate()) - { - SetSSLNegotiate(); - } - } - else - { - SetCloseAndDelete(); - } -} - - -void TcpSocket::OnSSLAccept() -{ - SetNonblocking(true); - { - if (m_ssl_ctx) - { -DEB( fprintf(stderr, "SSL Context already initialized - closing socket\n");) - SetCloseAndDelete(true); - return; - } - InitSSLServer(); - SetSSLServer(); - } - if (m_ssl_ctx) - { - m_ssl = SSL_new(m_ssl_ctx); - if (!m_ssl) - { -DEB( fprintf(stderr, " m_ssl is NULL\n");) - SetCloseAndDelete(true); - return; - } - m_sbio = BIO_new_socket((int)GetSocket(), BIO_NOCLOSE); - if (!m_sbio) - { -DEB( fprintf(stderr, " m_sbio is NULL\n");) - SetCloseAndDelete(true); - return; - } - SSL_set_bio(m_ssl, m_sbio, m_sbio); -// if (!SSLNegotiate()) - { - SetSSLNegotiate(); - } - } -} - - -bool TcpSocket::SSLNegotiate() -{ - if (!IsSSLServer()) // client - { - int r = SSL_connect(m_ssl); - if (r > 0) - { - SetSSLNegotiate(false); - /// \todo: resurrect certificate check... client -// CheckCertificateChain( "");//ServerHOST); - SetConnected(); - if (GetOutputLength()) - { - OnWrite(); - } -#ifdef ENABLE_RECONNECT - if (IsReconnect()) - { - OnReconnect(); - } - else -#endif - { - OnConnect(); - } - Handler().LogError(this, "SSLNegotiate/SSL_connect", 0, "Connection established", LOG_LEVEL_INFO); - return true; - } - else - if (!r) - { - Handler().LogError(this, "SSLNegotiate/SSL_connect", 0, "Connection failed", LOG_LEVEL_INFO); - SetSSLNegotiate(false); - SetCloseAndDelete(); - OnSSLConnectFailed(); - } - else - { - r = SSL_get_error(m_ssl, r); - if (r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) - { - Handler().LogError(this, "SSLNegotiate/SSL_connect", -1, "Connection failed", LOG_LEVEL_INFO); -DEB( fprintf(stderr, "SSL_connect() failed - closing socket, return code: %d\n",r);) - SetSSLNegotiate(false); - SetCloseAndDelete(true); - OnSSLConnectFailed(); - } - } - } - else // server - { - int r = SSL_accept(m_ssl); - if (r > 0) - { - SetSSLNegotiate(false); - /// \todo: resurrect certificate check... server -// CheckCertificateChain( "");//ClientHOST); - SetConnected(); - if (GetOutputLength()) - { - OnWrite(); - } - OnAccept(); - Handler().LogError(this, "SSLNegotiate/SSL_accept", 0, "Connection established", LOG_LEVEL_INFO); - return true; - } - else - if (!r) - { - Handler().LogError(this, "SSLNegotiate/SSL_accept", 0, "Connection failed", LOG_LEVEL_INFO); - SetSSLNegotiate(false); - SetCloseAndDelete(); - OnSSLAcceptFailed(); - } - else - { - r = SSL_get_error(m_ssl, r); - if (r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) - { - Handler().LogError(this, "SSLNegotiate/SSL_accept", -1, "Connection failed", LOG_LEVEL_INFO); -DEB( fprintf(stderr, "SSL_accept() failed - closing socket, return code: %d\n",r);) - SetSSLNegotiate(false); - SetCloseAndDelete(true); - OnSSLAcceptFailed(); - } - } - } - return false; -} - - -void TcpSocket::InitSSLClient() -{ - InitializeContext("", SSLv23_method()); -} - - -void TcpSocket::InitSSLServer() -{ - Handler().LogError(this, "InitSSLServer", 0, "You MUST implement your own InitSSLServer method", LOG_LEVEL_FATAL); - SetCloseAndDelete(); -} - - -void TcpSocket::InitializeContext(const std::string& context, const SSL_METHOD *meth_in) -{ - static Mutex mutex; - Lock lock(mutex); - /* Create our context*/ - if (m_client_contexts.find(context) == m_client_contexts.end()) - { - SSL_METHOD *meth = const_cast(meth_in) ? - const_cast(meth_in) : const_cast(SSLv3_method()); - m_ssl_ctx = m_client_contexts[context] = SSL_CTX_new(meth); - SSL_CTX_set_mode(m_ssl_ctx, SSL_MODE_AUTO_RETRY|SSL_MODE_ENABLE_PARTIAL_WRITE); - } - else - { - m_ssl_ctx = m_client_contexts[context]; - } -} - - -void TcpSocket::InitializeContext(const std::string& context,const std::string& keyfile,const std::string& password,const SSL_METHOD *meth_in) -{ - Lock lock(m_server_ssl_mutex); - /* Create our context*/ - if (m_server_contexts.find(context) == m_server_contexts.end()) - { - SSL_METHOD *meth = meth_in ? const_cast(meth_in) : SSLv3_method(); - m_ssl_ctx = m_server_contexts[context] = SSL_CTX_new(meth); - SSL_CTX_set_mode(m_ssl_ctx, SSL_MODE_AUTO_RETRY|SSL_MODE_ENABLE_PARTIAL_WRITE); - // session id - if (context.size()) - SSL_CTX_set_session_id_context(m_ssl_ctx, (const unsigned char *)context.c_str(), (unsigned int)context.size()); - else - SSL_CTX_set_session_id_context(m_ssl_ctx, (const unsigned char *)"--empty--", 9); - } - else - { - m_ssl_ctx = m_server_contexts[context]; - } - - /* Load our keys and certificates*/ - if (!(SSL_CTX_use_certificate_file(m_ssl_ctx, keyfile.c_str(), SSL_FILETYPE_PEM))) - { - Handler().LogError(this, "TcpSocket InitializeContext", 0, "Couldn't read certificate file " + keyfile, LOG_LEVEL_FATAL); - } - - m_password = password; - SSL_CTX_set_default_passwd_cb(m_ssl_ctx, SSL_password_cb); - SSL_CTX_set_default_passwd_cb_userdata(m_ssl_ctx, this); - if (!(SSL_CTX_use_PrivateKey_file(m_ssl_ctx, keyfile.c_str(), SSL_FILETYPE_PEM))) - { - Handler().LogError(this, "TcpSocket InitializeContext", 0, "Couldn't read private key file " + keyfile, LOG_LEVEL_FATAL); - } -} - - -void TcpSocket::InitializeContext(const std::string& context,const std::string& certfile,const std::string& keyfile,const std::string& password,const SSL_METHOD *meth_in) -{ - Lock lock(m_server_ssl_mutex); - /* Create our context*/ - if (m_server_contexts.find(context) == m_server_contexts.end()) - { - SSL_METHOD *meth = meth_in ? const_cast(meth_in) : SSLv3_method(); - m_ssl_ctx = m_server_contexts[context] = SSL_CTX_new(meth); - SSL_CTX_set_mode(m_ssl_ctx, SSL_MODE_AUTO_RETRY|SSL_MODE_ENABLE_PARTIAL_WRITE); - // session id - if (context.size()) - SSL_CTX_set_session_id_context(m_ssl_ctx, (const unsigned char *)context.c_str(), (unsigned int)context.size()); - else - SSL_CTX_set_session_id_context(m_ssl_ctx, (const unsigned char *)"--empty--", 9); - } - else - { - m_ssl_ctx = m_server_contexts[context]; - } - - /* Load our keys and certificates*/ - if (!(SSL_CTX_use_certificate_file(m_ssl_ctx, certfile.c_str(), SSL_FILETYPE_PEM))) - { - Handler().LogError(this, "TcpSocket InitializeContext", 0, "Couldn't read certificate file " + keyfile, LOG_LEVEL_FATAL); - } - - m_password = password; - SSL_CTX_set_default_passwd_cb(m_ssl_ctx, SSL_password_cb); - SSL_CTX_set_default_passwd_cb_userdata(m_ssl_ctx, this); - if (!(SSL_CTX_use_PrivateKey_file(m_ssl_ctx, keyfile.c_str(), SSL_FILETYPE_PEM))) - { - Handler().LogError(this, "TcpSocket InitializeContext", 0, "Couldn't read private key file " + keyfile, LOG_LEVEL_FATAL); - } -} - - -int TcpSocket::SSL_password_cb(char *buf,int num,int rwflag,void *userdata) -{ - Socket *p0 = static_cast(userdata); - TcpSocket *p = dynamic_cast(p0); - std::string pw = p ? p -> GetPassword() : ""; - if ( (size_t)num < pw.size() + 1) - { - return 0; - } -#if defined( _WIN32) && !defined(__CYGWIN__) - strcpy_s(buf, num, pw.c_str()); -#else - strcpy(buf,pw.c_str()); -#endif - return (int)pw.size(); -} -#endif // HAVE_OPENSSL - - -int TcpSocket::Close() -{ - if (GetSocket() == INVALID_SOCKET) // this could happen - { - Handler().LogError(this, "Socket::Close", 0, "file descriptor invalid", LOG_LEVEL_WARNING); - return 0; - } - int n; - SetNonblocking(true); - if (!Lost() && IsConnected() && !(GetShutdown() & SHUT_WR)) - { - if (shutdown(GetSocket(), SHUT_WR) == -1) - { - // failed... - Handler().LogError(this, "shutdown", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - } - // - char tmp[1000]; - if (!Lost() && (n = recv(GetSocket(),tmp,1000,0)) >= 0) - { - if (n) - { - Handler().LogError(this, "read() after shutdown", n, "bytes read", LOG_LEVEL_WARNING); - } - } -#ifdef HAVE_OPENSSL - if (IsSSL() && m_ssl) - SSL_shutdown(m_ssl); - if (m_ssl) - { - SSL_free(m_ssl); - m_ssl = NULL; - } -#endif - return Socket::Close(); -} - - -#ifdef HAVE_OPENSSL -SSL_CTX *TcpSocket::GetSslContext() -{ - if (!m_ssl_ctx) - Handler().LogError(this, "GetSslContext", 0, "SSL Context is NULL; check InitSSLServer/InitSSLClient", LOG_LEVEL_WARNING); - return m_ssl_ctx; -} - -SSL *TcpSocket::GetSsl() -{ - if (!m_ssl) - Handler().LogError(this, "GetSsl", 0, "SSL is NULL; check InitSSLServer/InitSSLClient", LOG_LEVEL_WARNING); - return m_ssl; -} -#endif - - -#ifdef ENABLE_RECONNECT -void TcpSocket::SetReconnect(bool x) -{ - m_b_reconnect = x; -} -#endif - - -void TcpSocket::OnRawData(const char *buf_in,size_t len) -{ -} - - -size_t TcpSocket::GetInputLength() -{ - return ibuf.GetLength(); -} - - -size_t TcpSocket::ReadInput(char *buf, size_t max_sz) -{ - size_t sz = max_sz < GetInputLength() ? max_sz : GetInputLength(); - ibuf.Read(buf, sz); - return sz; -} - - -size_t TcpSocket::GetOutputLength() -{ - return m_output_length; -} - - -uint64_t TcpSocket::GetBytesReceived(bool clear) -{ - uint64_t z = m_bytes_received; - if (clear) - m_bytes_received = 0; - return z; -} - - -uint64_t TcpSocket::GetBytesSent(bool clear) -{ - uint64_t z = m_bytes_sent; - if (clear) - m_bytes_sent = 0; - return z; -} - - -#ifdef ENABLE_RECONNECT -bool TcpSocket::Reconnect() -{ - return m_b_reconnect; -} - - -void TcpSocket::SetIsReconnect(bool x) -{ - m_b_is_reconnect = x; -} - - -bool TcpSocket::IsReconnect() -{ - return m_b_is_reconnect; -} -#endif - - -#ifdef HAVE_OPENSSL -const std::string& TcpSocket::GetPassword() -{ - return m_password; -} -#endif - - -void TcpSocket::DisableInputBuffer(bool x) -{ - m_b_input_buffer_disabled = x; -} - - -void TcpSocket::OnOptions(int family,int type,int protocol,SOCKET s) -{ -DEB( fprintf(stderr, "Socket::OnOptions()\n");) -#ifdef SO_NOSIGPIPE - SetSoNosigpipe(true); -#endif - SetSoReuseaddr(true); - SetSoKeepalive(true); -} - - -void TcpSocket::SetLineProtocol(bool x) -{ - StreamSocket::SetLineProtocol(x); - DisableInputBuffer(x); -} - - -const std::string TcpSocket::GetLine() const -{ - if (!m_line_ptr) - return ""; - return std::string(&m_line[0], m_line_ptr); -} - - -bool TcpSocket::SetTcpNodelay(bool x) -{ -#ifdef TCP_NODELAY - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_TCP, TCP_NODELAY, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_TCP, TCP_NODELAY)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "TCP_NODELAY", LOG_LEVEL_INFO); - return false; -#endif -} - - -TcpSocket::CircularBuffer::CircularBuffer(size_t size) -:buf(new char[2 * size]) -,m_max(size) -,m_q(0) -,m_b(0) -,m_t(0) -,m_count(0) -{ -} - - -TcpSocket::CircularBuffer::~CircularBuffer() -{ - delete[] buf; -} - - -bool TcpSocket::CircularBuffer::Write(const char *s,size_t l) -{ - if (m_q + l > m_max) - { - return false; // overflow - } - m_count += (unsigned long)l; - if (m_t + l > m_max) // block crosses circular border - { - size_t l1 = m_max - m_t; // size left until circular border crossing - // always copy full block to buffer(buf) + top pointer(m_t) - // because we have doubled the buffer size for performance reasons - memcpy(buf + m_t, s, l); - memcpy(buf, s + l1, l - l1); - m_t = l - l1; - m_q += l; - } - else - { - memcpy(buf + m_t, s, l); - memcpy(buf + m_max + m_t, s, l); - m_t += l; - if (m_t >= m_max) - m_t -= m_max; - m_q += l; - } - return true; -} - - -bool TcpSocket::CircularBuffer::Read(char *s,size_t l) -{ - if (l > m_q) - { - return false; // not enough chars - } - if (m_b + l > m_max) // block crosses circular border - { - size_t l1 = m_max - m_b; - if (s) - { - memcpy(s, buf + m_b, l1); - memcpy(s + l1, buf, l - l1); - } - m_b = l - l1; - m_q -= l; - } - else - { - if (s) - { - memcpy(s, buf + m_b, l); - } - m_b += l; - if (m_b >= m_max) - m_b -= m_max; - m_q -= l; - } - if (!m_q) - { - m_b = m_t = 0; - } - return true; -} - - -bool TcpSocket::CircularBuffer::Remove(size_t l) -{ - return Read(NULL, l); -} - - -size_t TcpSocket::CircularBuffer::GetLength() -{ - return m_q; -} - - -const char *TcpSocket::CircularBuffer::GetStart() -{ - return buf + m_b; -} - - -size_t TcpSocket::CircularBuffer::GetL() -{ - return (m_b + m_q > m_max) ? m_max - m_b : m_q; -} - - -size_t TcpSocket::CircularBuffer::Space() -{ - return m_max - m_q; -} - - -unsigned long TcpSocket::CircularBuffer::ByteCounter(bool clear) -{ - if (clear) - { - unsigned long x = m_count; - m_count = 0; - return x; - } - return m_count; -} - - -std::string TcpSocket::CircularBuffer::ReadString(size_t l) -{ - char *sz = new char[l + 1]; - if (!Read(sz, l)) // failed, debug printout in Read() method - { - delete[] sz; - return ""; - } - sz[l] = 0; - std::string tmp = sz; - delete[] sz; - return tmp; -} - - -void TcpSocket::OnConnectTimeout() -{ - Handler().LogError(this, "connect", -1, "connect timeout", LOG_LEVEL_FATAL); -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - OnSocks4ConnectFailed(); - // retry direct connection - } - else -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && GetConnectionRetries() < GetConnectionRetry()) ) - { - IncreaseConnectionRetries(); - // ask socket via OnConnectRetry callback if we should continue trying - if (OnConnectRetry()) - { - SetRetryClientConnect(); - } - else - { - SetCloseAndDelete( true ); - /// \todo state reason why connect failed - OnConnectFailed(); - // - SetConnecting(false); - } - } - else - { - SetCloseAndDelete(true); - /// \todo state reason why connect failed - OnConnectFailed(); - // - SetConnecting(false); - } -} - - -#ifdef _WIN32 -void TcpSocket::OnException() -{ - if (Connecting()) - { -#ifdef ENABLE_SOCKS4 - if (Socks4()) - OnSocks4ConnectFailed(); - else -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && - GetConnectionRetries() < GetConnectionRetry() )) - { - // even though the connection failed at once, only retry after - // the connection timeout - // should we even try to connect again, when CheckConnect returns - // false it's because of a connection error - not a timeout... - } - else - { - SetConnecting(false); // tnx snibbe - SetCloseAndDelete(); - OnConnectFailed(); - } - return; - } - // %! exception doesn't always mean something bad happened, this code should be reworked - // errno valid here? - int err = SoError(); - Handler().LogError(this, "exception on select", err, StrError(err), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -} -#endif // _WIN32 - - -int TcpSocket::Protocol() -{ - return IPPROTO_TCP; -} - - -void TcpSocket::SetTransferLimit(size_t sz) -{ - m_transfer_limit = sz; -} - - -void TcpSocket::OnTransferLimit() -{ -} - - -TcpSocket::OUTPUT::OUTPUT() : _b(0), _t(0), _q(0) -{ -} - - -TcpSocket::OUTPUT::OUTPUT(const char *buf, size_t len) : _b(0), _t(len), _q(len) -{ - memcpy(_buf, buf, len); -} - - -size_t TcpSocket::OUTPUT::Space() -{ - return TCP_OUTPUT_CAPACITY - _t; -} - - -void TcpSocket::OUTPUT::Add(const char *buf, size_t len) -{ - memcpy(_buf + _t, buf, len); - _t += len; - _q += len; -} - - -size_t TcpSocket::OUTPUT::Remove(size_t len) -{ - _b += len; - _q -= len; - return _q; -} - - -const char *TcpSocket::OUTPUT::Buf() -{ - return _buf + _b; -} - - -size_t TcpSocket::OUTPUT::Len() -{ - return _q; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.h deleted file mode 100755 index 426b5b658a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.h +++ /dev/null @@ -1,370 +0,0 @@ -/** \file TcpSocket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_TcpSocket_H -#define _SOCKETS_TcpSocket_H -#include "sockets-config.h" -#include "StreamSocket.h" -#ifdef HAVE_OPENSSL -#include -#include "SSLInitializer.h" -#endif -#include "Mutex.h" -#include - - -#define TCP_BUFSIZE_READ 16400 -#define TCP_OUTPUT_CAPACITY 1024000 - -// flags used in OnDisconnect callback -#define TCP_DISCONNECT_WRITE 1 -#define TCP_DISCONNECT_ERROR 2 -#define TCP_DISCONNECT_SSL 4 - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class SocketAddress; - - -/** Socket implementation for TCP. - \ingroup basic */ -class TcpSocket : public StreamSocket -{ - /** \defgroup internal Internal utility */ -protected: - /** Buffer class containing one read/write circular buffer. - \ingroup internal */ - class CircularBuffer - { - public: - CircularBuffer(size_t size); - ~CircularBuffer(); - - /** append l bytes from p to buffer */ - bool Write(const char *p,size_t l); - /** copy l bytes from buffer to dest */ - bool Read(char *dest,size_t l); - /** skip l bytes from buffer */ - bool Remove(size_t l); - /** read l bytes from buffer, returns as string. */ - std::string ReadString(size_t l); - - /** total buffer length */ - size_t GetLength(); - /** pointer to circular buffer beginning */ - const char *GetStart(); - /** return number of bytes from circular buffer beginning to buffer physical end */ - size_t GetL(); - /** return free space in buffer, number of bytes until buffer overrun */ - size_t Space(); - - /** return total number of bytes written to this buffer, ever */ - unsigned long ByteCounter(bool clear = false); - - private: - CircularBuffer(const CircularBuffer& s) {} - CircularBuffer& operator=(const CircularBuffer& ) { - return *this; - } - char *buf; - size_t m_max; - size_t m_q; - size_t m_b; - size_t m_t; - unsigned long m_count; - }; - /** Output buffer struct. - \ingroup internal */ - struct OUTPUT { - OUTPUT(); - OUTPUT(const char *buf, size_t len); - size_t Space(); - void Add(const char *buf, size_t len); - size_t Remove(size_t len); - const char *Buf(); - size_t Len(); - - size_t _b; - size_t _t; - size_t _q; - char _buf[TCP_OUTPUT_CAPACITY]; - }; - typedef std::list output_l; - -public: - /** Constructor with standard values on input/output buffers. */ - TcpSocket(ISocketHandler& ); - /** Constructor with custom values for i/o buffer. - \param h ISocketHandler reference - \param isize Input buffer size - \param osize Output buffer size */ - TcpSocket(ISocketHandler& h,size_t isize,size_t osize); - ~TcpSocket(); - - /** Open a connection to a remote server. - If you want your socket to connect to a server, - always call Open before Add'ing a socket to the sockethandler. - If not, the connection attempt will not be monitored by the - socket handler... - \param ip IP address - \param port Port number - \param skip_socks Do not use socks4 even if configured */ - bool Open(ipaddr_t ip,port_t port,bool skip_socks = false); -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - /** Open connection. - \param ip Ipv6 address - \param port Port number - \param skip_socks Do not use socks4 even if configured */ - bool Open(in6_addr ip,port_t port,bool skip_socks = false); -#endif -#endif - bool Open(SocketAddress&,bool skip_socks = false); - bool Open(SocketAddress&,SocketAddress& bind_address,bool skip_socks = false); - /** Open connection. - \param host Hostname - \param port Port number */ - bool Open(const std::string &host,port_t port); - - /** Connect timeout callback. */ - void OnConnectTimeout(); -#ifdef _WIN32 - /** Connection failed reported as exception on win32 */ - void OnException(); -#endif - - /** Close file descriptor - internal use only. - \sa SetCloseAndDelete */ - int Close(); - - /** Send a string. - \param s String to send - \param f Dummy flags -- not used */ - void Send(const std::string &s,int f = 0); - /** Send string using printf formatting. */ - void Sendf(const char *format, ...); - /** Send buffer of bytes. - \param buf Buffer pointer - \param len Length of data - \param f Dummy flags -- not used */ - void SendBuf(const char *buf,size_t len,int f = 0); - /** This callback is executed after a successful read from the socket. - \param buf Pointer to the data - \param len Length of the data */ - virtual void OnRawData(const char *buf,size_t len); - - /** Called when output buffer has been sent. - Note: Will only be called IF the output buffer has been used. - Send's that was successful without needing the output buffer - will not generate a call to this method. */ - virtual void OnWriteComplete(); - /** Number of bytes in input buffer. */ - size_t GetInputLength(); - /** Read from input buffer. */ - size_t ReadInput(char *buf, size_t sz); - /** Number of bytes in output buffer. */ - size_t GetOutputLength(); - - /** Callback fires when a socket in line protocol has read one full line. - \param line Line read */ - void OnLine(const std::string& line); - /** Get counter of number of bytes received. */ - uint64_t GetBytesReceived(bool clear = false); - /** Get counter of number of bytes sent. */ - uint64_t GetBytesSent(bool clear = false); - - /** Socks4 specific callback. */ - void OnSocks4Connect(); - /** Socks4 specific callback. */ - void OnSocks4ConnectFailed(); - /** Socks4 specific callback. - \return 'need_more' */ - bool OnSocks4Read(); - -#ifdef ENABLE_RESOLVER - /** Callback executed when resolver thread has finished a resolve request. */ - void OnResolved(int id,ipaddr_t a,port_t port); -#ifdef ENABLE_IPV6 - void OnResolved(int id,in6_addr& a,port_t port); -#endif -#endif -#ifdef HAVE_OPENSSL - /** Callback for 'New' ssl support - replaces SSLSocket. Internal use. */ - void OnSSLConnect(); - /** Callback for 'New' ssl support - replaces SSLSocket. Internal use. */ - void OnSSLAccept(); - /** This method must be implemented to initialize - the ssl context for an outgoing connection. */ - virtual void InitSSLClient(); - /** This method must be implemented to initialize - the ssl context for an incoming connection. */ - virtual void InitSSLServer(); -#endif - -#ifdef ENABLE_RECONNECT - /** Flag that says a broken connection will try to reconnect. */ - void SetReconnect(bool = true); - /** Check reconnect on lost connection flag status. */ - bool Reconnect(); - /** Flag to determine if a reconnect is in progress. */ - void SetIsReconnect(bool x = true); - /** Socket is reconnecting. */ - bool IsReconnect(); -#endif - - /** Use this if you only use OnRawData to process received data. */ - void DisableInputBuffer(bool = true); - - void OnOptions(int,int,int,SOCKET); - - void SetLineProtocol(bool = true); - - /** Get the unfinished line when using SetLineProtocol = true. - The finished line will always be reported with a call to OnLine. - */ - const std::string GetLine() const; - - // TCP options - bool SetTcpNodelay(bool = true); - - virtual int Protocol(); - - /** Trigger limit for callback OnTransferLimit. */ - void SetTransferLimit(size_t sz); - /** This callback fires when the output buffer drops below the value - set by SetTransferLimit. Default: 0 (disabled). */ - virtual void OnTransferLimit(); - -protected: - TcpSocket(const TcpSocket& ); - - void OnRead(); - void OnRead( char *buf, size_t n ); - void OnWrite(); -#ifdef HAVE_OPENSSL - /** SSL; Initialize ssl context for a client socket. - \param meth_in SSL method */ - void InitializeContext(const std::string& context, const SSL_METHOD *meth_in = NULL); - /** SSL; Initialize ssl context for a server socket. - \param keyfile Combined private key/certificate file - \param password Password for private key - \param meth_in SSL method */ - void InitializeContext(const std::string& context, const std::string& keyfile, const std::string& password, const SSL_METHOD *meth_in = NULL); - /** SSL; Initialize ssl context for a server socket. - \param certfile Separate certificate file - \param keyfile Combined private key/certificate file - \param password Password for private key - \param meth_in SSL method */ - void InitializeContext(const std::string& context, const std::string& certfile, const std::string& keyfile, const std::string& password, const SSL_METHOD *meth_in = NULL); - /** SSL; Password callback method. */ - static int SSL_password_cb(char *buf,int num,int rwflag,void *userdata); - /** SSL; Get pointer to ssl context structure. */ - virtual SSL_CTX *GetSslContext(); - /** SSL; Get pointer to ssl structure. */ - virtual SSL *GetSsl(); - /** ssl; still negotiating connection. */ - bool SSLNegotiate(); - /** SSL; Get ssl password. */ - const std::string& GetPassword(); -#endif - - CircularBuffer ibuf; ///< Circular input buffer - -private: - TcpSocket& operator=(const TcpSocket& ) { - return *this; - } - - /** */ - void SendFromOutputBuffer(); - /** the actual send() */ - int TryWrite(const char *buf, size_t len); - /** add data to output buffer top */ - void Buffer(const char *buf, size_t len); - - // - bool m_b_input_buffer_disabled; - uint64_t m_bytes_sent; - uint64_t m_bytes_received; - bool m_skip_c; ///< Skip second char of CRLF or LFCR sequence in OnRead - char m_c; ///< First char in CRLF or LFCR sequence - std::vector m_line; ///< Current line in line protocol mode - size_t m_line_ptr; -#ifdef SOCKETS_DYNAMIC_TEMP - char *m_buf; ///< temporary read buffer -#endif - output_l m_obuf; ///< output buffer - OUTPUT *m_obuf_top; ///< output buffer on top - size_t m_transfer_limit; - size_t m_output_length; - size_t m_repeat_length; - -#ifdef HAVE_OPENSSL - static SSLInitializer m_ssl_init; - SSL_CTX *m_ssl_ctx; ///< ssl context - SSL *m_ssl; ///< ssl 'socket' - BIO *m_sbio; ///< ssl bio - std::string m_password; ///< ssl password - static Mutex m_server_ssl_mutex; - static std::map m_client_contexts; - static std::map m_server_contexts; -#endif - -#ifdef ENABLE_SOCKS4 - int m_socks4_state; ///< socks4 support - char m_socks4_vn; ///< socks4 support, temporary variable - char m_socks4_cd; ///< socks4 support, temporary variable - unsigned short m_socks4_dstport; ///< socks4 support - unsigned long m_socks4_dstip; ///< socks4 support -#endif - -#ifdef ENABLE_RESOLVER - int m_resolver_id; ///< Resolver id (if any) for current Open call -#endif - -#ifdef ENABLE_RECONNECT - bool m_b_reconnect; ///< Reconnect on lost connection flag - bool m_b_is_reconnect; ///< Trying to reconnect -#endif - -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_TcpSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.cpp deleted file mode 100755 index e794856d2a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/** \file Thread.cpp - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include -#ifdef _WIN32 -#include -#include "socket_include.h" -#else -#include -#endif - -#include "Thread.h" -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -Thread::Thread(bool release) -:m_thread(0) -,m_running(true) -,m_release(false) -,m_b_delete_on_exit(false) -,m_b_destructor(false) -{ -#ifdef _WIN32 -// m_thread = ::CreateThread(NULL, 0, StartThread, this, 0, &m_dwThreadId); - m_thread = (HANDLE)_beginthreadex(NULL, 0, &StartThread, this, 0, &m_dwThreadId); -#else - pthread_attr_t attr; - - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); - if (pthread_create(&m_thread,&attr, StartThread,this) == -1) - { - perror("Thread: create failed"); - SetRunning(false); - } -// pthread_attr_destroy(&attr); -#endif - m_release = release; - if (release) - m_sem.Post(); -} - - -Thread::~Thread() -{ - m_b_destructor = true; - if (m_running) - { - SetRelease(true); - SetRunning(false); - /* - Sleep one second to give thread class Run method enough time to - release from run loop - */ - Utility::Sleep(1000); - } -#ifdef _WIN32 - if (m_thread) - ::CloseHandle(m_thread); -#endif -} - - -threadfunc_t STDPREFIX Thread::StartThread(threadparam_t zz) -{ - /* - Sleep here to wait for derived thread class constructor to setup - vtable... hurts just looking at it - */ - Utility::Sleep(5); - - Thread *p = (Thread *)zz; - - p -> Wait(); - if (p -> m_running) - { - p -> Run(); - } - p -> SetRunning(false); // if return - if (p -> DeleteOnExit() && !p -> IsDestructor()) - { - delete p; - } -#ifdef _WIN32 - _endthreadex(0); -#endif - return (threadfunc_t)NULL; -} - - -bool Thread::IsRunning() -{ - return m_running; -} - - -void Thread::SetRunning(bool x) -{ - m_running = x; -} - - -bool Thread::IsReleased() -{ - return m_release; -} - - -void Thread::SetRelease(bool x) -{ - m_release = x; - if (x) - m_sem.Post(); -} - - -bool Thread::DeleteOnExit() -{ - return m_b_delete_on_exit; -} - - -void Thread::SetDeleteOnExit(bool x) -{ - m_b_delete_on_exit = x; -} - - -bool Thread::IsDestructor() -{ - return m_b_destructor; -} - - -void Thread::Wait() -{ - m_sem.Wait(); -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.h deleted file mode 100755 index 33262cdc98..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.h +++ /dev/null @@ -1,137 +0,0 @@ -/** \file Thread.h - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Thread_H -#define _SOCKETS_Thread_H - -#include "sockets-config.h" -#ifdef _WIN32 -#else -#include -#endif -#include "Semaphore.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#ifdef _WIN32 -// to be -//typedef DWORD threadfunc_t; -//typedef LPVOID threadparam_t; -//#define STDPREFIX WINAPI -typedef unsigned threadfunc_t; -typedef void * threadparam_t; -#define STDPREFIX __stdcall -#else - -typedef void * threadfunc_t; -typedef void * threadparam_t; -#define STDPREFIX -#endif - -/** \defgroup threading Threading */ -/** Thread base class. -The Thread class is used by the resolver (ResolvServer) and running a detached socket (SocketThread). -When you know some processing will take a long time and will freeze up a socket, there is always the -possibility to call Detach() on that socket before starting the processing. -When the OnDetached() callback is later called the processing can continue, now in its own thread. - \ingroup threading */ -class Thread -{ -public: - Thread(bool release = true); - virtual ~Thread(); - - static threadfunc_t STDPREFIX StartThread(threadparam_t); - - virtual void Run() = 0; - -#ifdef _WIN32 - HANDLE GetThread() { - return m_thread; - } - unsigned GetThreadId() { - return m_dwThreadId; - } -#else - pthread_t GetThread() { - return m_thread; - } -#endif - - bool IsRunning(); - void SetRunning(bool x); - bool IsReleased(); - void SetRelease(bool x); - bool DeleteOnExit(); - void SetDeleteOnExit(bool x = true); - bool IsDestructor(); - - void Start() { - SetRelease(true); - } - - void Stop() { - Start(); - SetRunning(false); - } - - void Wait(); - -protected: -#ifdef _WIN32 - HANDLE m_thread; - unsigned m_dwThreadId; -#else - pthread_t m_thread; -#endif - -private: - Thread(const Thread& ) {} - Thread& operator=(const Thread& ) { - return *this; - } - Semaphore m_sem; - bool m_running; - bool m_release; - bool m_b_delete_on_exit; - bool m_b_destructor; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Thread_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.cpp deleted file mode 100755 index bca1c6c501..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.cpp +++ /dev/null @@ -1,922 +0,0 @@ -/** \file UdpSocket.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include // LG -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#else -#include -#endif - -#include "ISocketHandler.h" -#include "UdpSocket.h" -#include "Utility.h" -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#ifdef ENABLE_EXCEPTIONS -#include "Exception.h" -#endif -// include this to see strange sights -//#include - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -UdpSocket::UdpSocket(ISocketHandler& h, int ibufsz, bool ipv6, int retries) : Socket(h) -, m_ibuf(new char[ibufsz]) -, m_ibufsz(ibufsz) -, m_bind_ok(false) -, m_port(0) -, m_last_size_written(-1) -, m_retries(retries) -, m_b_read_ts(false) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - SetIpv6(ipv6); -//#endif -//#endif -} - - -UdpSocket::~UdpSocket() -{ - Close(); - delete[] m_ibuf; -} - - -int UdpSocket::Bind(port_t &port, int range) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(port); - return Bind(ad, range); - } -//#endif -//#endif - Ipv4Address ad(port); - return Bind(ad, range); -} - - -int UdpSocket::Bind(const std::string& intf, port_t &port, int range) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(intf, port); - if (ad.IsValid()) - { - return Bind(ad, range); - } - SetCloseAndDelete(); - return -1; - } -//#endif -//#endif - Ipv4Address ad(intf, port); - if (ad.IsValid()) - { - return Bind(ad, range); - } - SetCloseAndDelete(); - return -1; -} - - -int UdpSocket::Bind(ipaddr_t a, port_t &port, int range) -{ - Ipv4Address ad(a, port); - return Bind(ad, range); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -int UdpSocket::Bind(in6_addr a, port_t &port, int range) -{ - Ipv6Address ad(a, port); - return Bind(ad, range); -} -//#endif -//#endif - - -int UdpSocket::Bind(SocketAddress& ad, int range) -{ - if (GetSocket() == INVALID_SOCKET) - { - Attach(CreateSocket(ad.GetFamily(), SOCK_DGRAM, "udp")); - } - if (GetSocket() != INVALID_SOCKET) - { - SetNonblocking(true); - int n = bind(GetSocket(), ad, ad); - int tries = range; - while (n == -1 && tries--) - { - ad.SetPort(ad.GetPort() + 1); - n = bind(GetSocket(), ad, ad); - } - if (n == -1) - { - Handler().LogError(this, "bind", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -#ifdef ENABLE_EXCEPTIONS - throw Exception("bind() failed for UdpSocket, port:range: " + Utility::l2string(ad.GetPort()) + ":" + Utility::l2string(range)); -#endif - return -1; - } - m_bind_ok = true; - m_port = ad.GetPort(); - return 0; - } - return -1; -} - - -/** if you wish to use Send, first Open a connection */ -bool UdpSocket::Open(ipaddr_t l, port_t port) -{ - Ipv4Address ad(l, port); - return Open(ad); -} - - -bool UdpSocket::Open(const std::string& host, port_t port) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(host, port); - if (ad.IsValid()) - { - return Open(ad); - } - return false; - } -//#endif -//#endif - Ipv4Address ad(host, port); - if (ad.IsValid()) - { - return Open(ad); - } - return false; -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -bool UdpSocket::Open(struct in6_addr& a, port_t port) -{ - Ipv6Address ad(a, port); - return Open(ad); -} -//#endif -//#endif - - -bool UdpSocket::Open(SocketAddress& ad) -{ - if (GetSocket() == INVALID_SOCKET) - { - Attach(CreateSocket(ad.GetFamily(), SOCK_DGRAM, "udp")); - } - if (GetSocket() != INVALID_SOCKET) - { - SetNonblocking(true); - if (connect(GetSocket(), ad, ad) == -1) - { - Handler().LogError(this, "connect", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - return false; - } - SetConnected(); - return true; - } - return false; -} - - -void UdpSocket::CreateConnection() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - if (GetSocket() == INVALID_SOCKET) - { - SOCKET s = CreateSocket(AF_INET6, SOCK_DGRAM, "udp"); - if (s == INVALID_SOCKET) - { - return; - } - SetNonblocking(true, s); - Attach(s); - } - return; - } -//#endif -//#endif - if (GetSocket() == INVALID_SOCKET) - { - SOCKET s = CreateSocket(AF_INET, SOCK_DGRAM, "udp"); - if (s == INVALID_SOCKET) - { - return; - } - SetNonblocking(true, s); - Attach(s); - } -} - - -/** send to specified address */ -void UdpSocket::SendToBuf(const std::string& h, port_t p, const char *data, int len, int flags) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(h, p); - if (ad.IsValid()) - { - fprintf(stderr, "UdpSocket::SendToBuf( IPv6 @=%s, port = %d, const char *data, len = %d, flags = %d)\n", h.c_str(), p, len, flags); - SendToBuf(ad, data, len, flags); - } else { - fprintf(stderr, "UdpSocket::SendToBuf(const std::string& h, port_t p, const char *data, int len, int flags) invalid @ IPv6\n"); - } - return; - } -//#endif -//#endif - Ipv4Address ad(h, p); - if (ad.IsValid()) - { - fprintf(stderr, "UdpSocket::SendToBuf( IPv4 @=%s, port = %d, const char *data, len = %d, flags = %d)\n", h.c_str(), p, len, flags); - SendToBuf(ad, data, len, flags); - } else { - fprintf(stderr, "UdpSocket::SendToBuf(const std::string& h, port_t p, const char *data, int len, int flags) invalid @ IPv4\n"); - } -} - - -/** send to specified address */ -void UdpSocket::SendToBuf(ipaddr_t a, port_t p, const char *data, int len, int flags) -{ - Ipv4Address ad(a, p); - fprintf(stderr, "UdpSocket::SendToBuf(ipaddr_t a, port_t p, const char *data, int len, int flags)\n"); - SendToBuf(ad, data, len, flags); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void UdpSocket::SendToBuf(in6_addr a, port_t p, const char *data, int len, int flags) -{ - Ipv6Address ad(a, p); - fprintf(stderr, "UdpSocket::SendToBuf(in6_addr a, port_t p, const char *data, int len, int flags)\n"); - SendToBuf(ad, data, len, flags); -} -//#endif -//#endif - - -void UdpSocket::SendToBuf(SocketAddress& ad, const char *data, int len, int flags) -{ - if (GetSocket() == INVALID_SOCKET) - { - fprintf(stderr, "UdpSocket::SendToBuf INVALID_SOCKET\n"); - Attach(CreateSocket(ad.GetFamily(), SOCK_DGRAM, "udp")); - } - if (GetSocket() != INVALID_SOCKET) - { - SetNonblocking(true); - if ((m_last_size_written = sendto(GetSocket(), data, len, flags, ad, ad)) == -1) - { - fprintf(stderr, "UdpSocket::SendToBuf ERROR\n"); - Handler().LogError(this, "sendto", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - } -} - - -void UdpSocket::SendTo(const std::string& a, port_t p, const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::SendTo(const std::string& a, port_t p, const std::string& str, int flags)\n"); - SendToBuf(a, p, str.c_str(), (int)str.size(), flags); -} - - -void UdpSocket::SendTo(ipaddr_t a, port_t p, const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::SendTo(ipaddr_t a, port_t p, const std::string& str, int flags)\n"); - SendToBuf(a, p, str.c_str(), (int)str.size(), flags); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void UdpSocket::SendTo(in6_addr a, port_t p, const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::SendTo(in6_addr a, port_t p, const std::string& str, int flags)\n"); - SendToBuf(a, p, str.c_str(), (int)str.size(), flags); -} -//#endif -//#endif - - -void UdpSocket::SendTo(SocketAddress& ad, const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::SendTo(SocketAddress& ad, const std::string& str, int flags)\n"); - SendToBuf(ad, str.c_str(), (int)str.size(), flags); -} - - -/** send to connected address */ -void UdpSocket::SendBuf(const char *data, size_t len, int flags) -{ - fprintf(stderr, "UdpSocket::SendBuf(const char *data, size_t len, int flags)\n"); - if (!IsConnected()) - { - Handler().LogError(this, "SendBuf", 0, "not connected", LOG_LEVEL_ERROR); - return; - } - if ((m_last_size_written = send(GetSocket(), data, (int)len, flags)) == -1) - { - Handler().LogError(this, "send", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } -} - - -void UdpSocket::Send(const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::Send(const std::string& str, int flags)\n"); - SendBuf(str.c_str(), (int)str.size(), flags); -} - - -#if defined(LINUX) || defined(MACOSX) -int UdpSocket::ReadTS(char *ioBuf, int inBufSize, struct sockaddr *from, socklen_t fromlen, struct timeval *ts) -{ - struct msghdr msg; - struct iovec vec[1]; - union { - struct cmsghdr cm; -#ifdef MACOSX -#ifdef __DARWIN_UNIX03 -#define ALIGNBYTES __DARWIN_ALIGNBYTES -#endif -#define myALIGN(p) (((unsigned int)(p) + ALIGNBYTES) &~ ALIGNBYTES) -#define myCMSG_SPACE(l) (myALIGN(sizeof(struct cmsghdr)) + myALIGN(l)) - char data[ myCMSG_SPACE(sizeof(struct timeval)) ]; -#else - char data[ CMSG_SPACE(sizeof(struct timeval)) ]; -#endif - } cmsg_un; - struct cmsghdr *cmsg; - struct timeval *tv; - - vec[0].iov_base = ioBuf; - vec[0].iov_len = inBufSize; - - memset(&msg, 0, sizeof(msg)); - memset(from, 0, fromlen); - memset(ioBuf, 0, inBufSize); - memset(&cmsg_un, 0, sizeof(cmsg_un)); - - msg.msg_name = (caddr_t)from; - msg.msg_namelen = fromlen; - msg.msg_iov = vec; - msg.msg_iovlen = 1; - msg.msg_control = cmsg_un.data; - msg.msg_controllen = sizeof(cmsg_un.data); - msg.msg_flags = 0; - - // Original version - for reference only - //int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - - int n = recvmsg(GetSocket(), &msg, MSG_DONTWAIT); - - // now ioBuf will contain the data, as if we used recvfrom - - // Now get the time - if(n != -1 && msg.msg_controllen >= sizeof(struct cmsghdr) && !(msg.msg_flags & MSG_CTRUNC)) - { - tv = 0; - for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) - { - if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_TIMESTAMP) - { - tv = (struct timeval *)CMSG_DATA(cmsg); - } - } - if (tv) - { - memcpy(ts, tv, sizeof(struct timeval)); - } - } - // The address is in network order, but that's OK right now - return n; -} -#endif - - -void UdpSocket::OnRead() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct sockaddr_in6 sa; - socklen_t sa_len = sizeof(sa); - if (m_b_read_ts) - { - struct timeval ts; - Utility::GetTime(&ts); -#if !defined(LINUX) && !defined(MACOSX) - int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); -#else - int n = ReadTS(m_ibuf, m_ibufsz, (struct sockaddr *)&sa, sa_len, &ts); -#endif - if (n > 0) - { - this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len, &ts); - } - else - if (n == -1) - { -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - return; - } - int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - int q = m_retries; // receive max 10 at one cycle - while (n > 0) - { - if (sa_len != sizeof(sa)) - { - Handler().LogError(this, "recvfrom", 0, "unexpected address struct size", LOG_LEVEL_WARNING); - } - this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len); - if (!q--) - break; - // - n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - } - if (n == -1) - { -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - return; - } -//#endif -//#endif - struct sockaddr_in sa; - socklen_t sa_len = sizeof(sa); - if (m_b_read_ts) - { - struct timeval ts; - Utility::GetTime(&ts); -#if !defined(LINUX) && !defined(MACOSX) - int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); -#else - int n = ReadTS(m_ibuf, m_ibufsz, (struct sockaddr *)&sa, sa_len, &ts); -#endif - if (n > 0) - { - this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len, &ts); - } - else - if (n == -1) - { -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - return; - } - int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - int q = m_retries; - while (n > 0) - { - if (sa_len != sizeof(sa)) - { - Handler().LogError(this, "recvfrom", 0, "unexpected address struct size", LOG_LEVEL_WARNING); - } - this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len); - if (!q--) - break; - // - n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - } - if (n == -1) - { -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } -} - - -void UdpSocket::SetBroadcast(bool b) -{ - int one = 1; - int zero = 0; - - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (b) - { - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BROADCAST, (char *) &one, sizeof(one)) == -1) - { - Handler().LogError(this, "SetBroadcast", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } - else - { - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BROADCAST, (char *) &zero, sizeof(zero)) == -1) - { - Handler().LogError(this, "SetBroadcast", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } -} - - -bool UdpSocket::IsBroadcast() -{ - int is_broadcast = 0; - socklen_t size; - - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (getsockopt(GetSocket(), SOL_SOCKET, SO_BROADCAST, (char *)&is_broadcast, &size) == -1) - { - Handler().LogError(this, "IsBroadcast", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return is_broadcast != 0; -} - - -void UdpSocket::SetMulticastTTL(int ttl) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (setsockopt(GetSocket(), SOL_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(int)) == -1) - { - Handler().LogError(this, "SetMulticastTTL", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} - - -int UdpSocket::GetMulticastTTL() -{ - int ttl = 0; - socklen_t size = sizeof(int); - - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (getsockopt(GetSocket(), SOL_IP, IP_MULTICAST_TTL, (char *)&ttl, &size) == -1) - { - Handler().LogError(this, "GetMulticastTTL", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return ttl; -} - - -void UdpSocket::SetMulticastLoop(bool x) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - int val = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&val, sizeof(int)) == -1) - { - Handler().LogError(this, "SetMulticastLoop(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return; - } -//#endif -//#endif - int val = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_IP, IP_MULTICAST_LOOP, (char *)&val, sizeof(int)) == -1) - { - Handler().LogError(this, "SetMulticastLoop(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} - - -bool UdpSocket::IsMulticastLoop() -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - int is_loop = 0; - socklen_t size = sizeof(int); - if (getsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&is_loop, &size) == -1) - { - Handler().LogError(this, "IsMulticastLoop(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return is_loop ? true : false; - } -//#endif -//#endif - int is_loop = 0; - socklen_t size = sizeof(int); - if (getsockopt(GetSocket(), SOL_IP, IP_MULTICAST_LOOP, (char *)&is_loop, &size) == -1) - { - Handler().LogError(this, "IsMulticastLoop(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return is_loop ? true : false; -} - - -void UdpSocket::AddMulticastMembership(const std::string& group, const std::string& local_if, int if_index) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct ipv6_mreq x; - struct in6_addr addr; - if (Utility::u2ip( group, addr )) - { - x.ipv6mr_multiaddr = addr; - x.ipv6mr_interface = if_index; - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&x, sizeof(struct ipv6_mreq)) == -1) - { - Handler().LogError(this, "AddMulticastMembership(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } - return; - } -//#endif -//#endif - struct ip_mreq x; // ip_mreqn - ipaddr_t addr; - if (Utility::u2ip( group, addr )) - { - memcpy(&x.imr_multiaddr.s_addr, &addr, sizeof(addr)); - Utility::u2ip( local_if, addr); - memcpy(&x.imr_interface.s_addr, &addr, sizeof(addr)); -// x.imr_ifindex = if_index; - if (setsockopt(GetSocket(), SOL_IP, IP_ADD_MEMBERSHIP, (char *)&x, sizeof(struct ip_mreq)) == -1) - { - Handler().LogError(this, "AddMulticastMembership(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } -} - - -void UdpSocket::DropMulticastMembership(const std::string& group, const std::string& local_if, int if_index) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct ipv6_mreq x; - struct in6_addr addr; - if (Utility::u2ip( group, addr )) - { - x.ipv6mr_multiaddr = addr; - x.ipv6mr_interface = if_index; - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, (char *)&x, sizeof(struct ipv6_mreq)) == -1) - { - Handler().LogError(this, "DropMulticastMembership(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } - return; - } -//#endif -//#endif - struct ip_mreq x; // ip_mreqn - ipaddr_t addr; - if (Utility::u2ip( group, addr )) - { - memcpy(&x.imr_multiaddr.s_addr, &addr, sizeof(addr)); - Utility::u2ip( local_if, addr); - memcpy(&x.imr_interface.s_addr, &addr, sizeof(addr)); -// x.imr_ifindex = if_index; - if (setsockopt(GetSocket(), SOL_IP, IP_DROP_MEMBERSHIP, (char *)&x, sizeof(struct ip_mreq)) == -1) - { - Handler().LogError(this, "DropMulticastMembership(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void UdpSocket::SetMulticastHops(int hops) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (!IsIpv6()) - { - Handler().LogError(this, "SetMulticastHops", 0, "Ipv6 only", LOG_LEVEL_ERROR); - return; - } - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&hops, sizeof(int)) == -1) - { - Handler().LogError(this, "SetMulticastHops", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} - - -int UdpSocket::GetMulticastHops() -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (!IsIpv6()) - { - Handler().LogError(this, "SetMulticastHops", 0, "Ipv6 only", LOG_LEVEL_ERROR); - return -1; - } - int hops = 0; - socklen_t size = sizeof(int); - if (getsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&hops, &size) == -1) - { - Handler().LogError(this, "GetMulticastHops", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return hops; -} -//#endif // IPPROTO_IPV6 -//#endif - - -bool UdpSocket::IsBound() -{ - return m_bind_ok; -} - - -void UdpSocket::OnRawData(const char *buf, size_t len, struct sockaddr *sa, socklen_t sa_len) -{ -} - - -void UdpSocket::OnRawData(const char *buf, size_t len, struct sockaddr *sa, socklen_t sa_len, struct timeval *ts) -{ -} - - -port_t UdpSocket::GetPort() -{ - return m_port; -} - - -int UdpSocket::GetLastSizeWritten() -{ - return m_last_size_written; -} - - -void UdpSocket::SetTimestamp(bool x) -{ - m_b_read_ts = x; -} - - -void UdpSocket::SetMulticastDefaultInterface(ipaddr_t a, int if_index) -{ - struct in_addr x; - memcpy(&x.s_addr, &a, sizeof(a)); - if (setsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_IF, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "SetMulticastDefaultInterface(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void UdpSocket::SetMulticastDefaultInterface(in6_addr a, int if_index) -{ - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_IF, &if_index, sizeof(if_index)) == -1) - { - Handler().LogError(this, "SetMulticastDefaultInterface(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} -//#endif -//#endif - - -void UdpSocket::SetMulticastDefaultInterface(const std::string& intf, int if_index) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct in6_addr a; - if (Utility::u2ip( intf, a )) - { - SetMulticastDefaultInterface( a, if_index ); - } - return; - } -//#endif -//#endif - ipaddr_t a; - if (Utility::u2ip( intf, a )) - { - SetMulticastDefaultInterface( a, if_index ); - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.h deleted file mode 100755 index da635f5591..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.h +++ /dev/null @@ -1,227 +0,0 @@ -/** \file UdpSocket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_UdpSocket_H -#define _SOCKETS_UdpSocket_H - -#include "sockets-config.h" -#include "Socket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** Socket implementation for UDP. - \ingroup basic */ -class UdpSocket : public Socket -{ -public: - /** Constructor. - \param h ISocketHandler reference - \param ibufsz Maximum size of receive message (extra bytes will be truncated) - \param ipv6 'true' if this is an ipv6 socket */ - UdpSocket(ISocketHandler& h,int ibufsz = 16384,bool ipv6 = false, int retries = 0); - ~UdpSocket(); - - /** Called when incoming data has been received. - \param buf Pointer to data - \param len Length of data - \param sa Pointer to sockaddr struct of sender - \param sa_len Length of sockaddr struct */ - virtual void OnRawData(const char *buf,size_t len,struct sockaddr *sa,socklen_t sa_len); - - /** Called when incoming data has been received and read timestamp is enabled. - \param buf Pointer to data - \param len Length of data - \param sa Pointer to sockaddr struct of sender - \param sa_len Length of sockaddr struct - \param ts Timestamp from message */ - virtual void OnRawData(const char *buf,size_t len,struct sockaddr *sa,socklen_t sa_len,struct timeval *ts); - - /** To receive incoming data, call Bind to setup an incoming port. - \param port Incoming port number - \param range Port range to try if ports already in use - \return 0 if bind succeeded */ - int Bind(port_t& port,int range = 1); - /** To receive data on a specific interface:port, use this. - \param intf Interface ip/hostname - \param port Port number - \param range Port range - \return 0 if bind succeeded */ - int Bind(const std::string& intf,port_t& port,int range = 1); - /** To receive data on a specific interface:port, use this. - \param a Ip address - \param port Port number - \param range Port range - \return 0 if bind succeeded */ - int Bind(ipaddr_t a,port_t& port,int range = 1); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** To receive data on a specific interface:port, use this. - \param a Ipv6 address - \param port Port number - \param range Port range - \return 0 if bind succeeded */ - int Bind(in6_addr a,port_t& port,int range = 1); - //#endif - //#endif - /** To receive data on a specific interface:port, use this. - \param ad Socket address - \param range Port range - \return 0 if bind succeeded */ - int Bind(SocketAddress& ad,int range = 1); - - /** Define remote host. - \param l Address of remote host - \param port Port of remote host - \return true if successful */ - bool Open(ipaddr_t l,port_t port); - /** Define remote host. - \param host Hostname - \param port Port number - \return true if successful */ - bool Open(const std::string& host,port_t port); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Define remote host. - \param a Address of remote host, ipv6 - \param port Port of remote host - \return true if successful */ - bool Open(struct in6_addr& a,port_t port); - //#endif - //#endif - /** Define remote host. - \param ad Socket address - \return true if successful */ - bool Open(SocketAddress& ad); - - /** Send to specified host */ - void SendToBuf(const std::string& ,port_t,const char *data,int len,int flags = 0); - /** Send to specified address */ - void SendToBuf(ipaddr_t,port_t,const char *data,int len,int flags = 0); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Send to specified ipv6 address */ - void SendToBuf(in6_addr,port_t,const char *data,int len,int flags = 0); - //#endif - //#endif - /** Send to specified socket address */ - void SendToBuf(SocketAddress& ad,const char *data,int len,int flags = 0); - - /** Send string to specified host */ - void SendTo(const std::string&,port_t,const std::string&,int flags = 0); - /** Send string to specified address */ - void SendTo(ipaddr_t,port_t,const std::string&,int flags = 0); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Send string to specified ipv6 address */ - void SendTo(in6_addr,port_t,const std::string&,int flags = 0); - //#endif - //#endif - /** Send string to specified socket address */ - void SendTo(SocketAddress& ad,const std::string&,int flags = 0); - - /** Send to connected address */ - void SendBuf(const char *data,size_t,int flags = 0); - /** Send string to connected address. */ - void Send(const std::string& ,int flags = 0); - - /** Set broadcast */ - void SetBroadcast(bool b = true); - /** Check broadcast flag. - \return true broadcast is enabled. */ - bool IsBroadcast(); - - /** multicast */ - void SetMulticastTTL(int ttl = 1); - int GetMulticastTTL(); - void SetMulticastLoop(bool = true); - bool IsMulticastLoop(); - void SetMulticastDefaultInterface(ipaddr_t a, int if_index = 0); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - void SetMulticastDefaultInterface(in6_addr a, int if_index = 0); - //#endif - //#endif - void SetMulticastDefaultInterface(const std::string& intf, int if_index = 0); - void AddMulticastMembership(const std::string& group,const std::string& intf = "0.0.0.0",int if_index = 0); - void DropMulticastMembership(const std::string& group,const std::string& intf = "0.0.0.0",int if_index = 0); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** multicast, ipv6 only */ - void SetMulticastHops(int = -1); - /** multicast, ipv6 only */ - int GetMulticastHops(); - //#endif - //#endif - /** Returns true if Bind succeeded. */ - bool IsBound(); - /** Return Bind port number */ - port_t GetPort(); - - void OnOptions(int,int,int,SOCKET) {} - - int GetLastSizeWritten(); - - /** Also read timestamp information from incoming message */ - void SetTimestamp(bool = true); - -protected: - UdpSocket(const UdpSocket& s) : Socket(s) {} - void OnRead(); -#if defined(LINUX) || defined(MACOSX) - /** This method emulates socket recvfrom, but uses messages so we can get the timestamp */ - int ReadTS(char *ioBuf, int inBufSize, struct sockaddr *from, socklen_t fromlen, struct timeval *ts); -#endif - -private: - UdpSocket& operator=(const UdpSocket& ) { - return *this; - } - /** create before using sendto methods */ - void CreateConnection(); - char *m_ibuf; ///< Input buffer - int m_ibufsz; ///< Size of input buffer - bool m_bind_ok; ///< Bind completed successfully - port_t m_port; ///< Bind port number - int m_last_size_written; - int m_retries; - bool m_b_read_ts; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_UdpSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.cpp deleted file mode 100755 index 946867da49..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.cpp +++ /dev/null @@ -1,1440 +0,0 @@ -/** \file Utility.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include -#include "Utility.h" -#include "Parse.h" -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#include "Base64.h" -#include -#ifdef _WIN32 -#include -#else -#include -#include -#include -#include -#endif -// --- stack -#ifdef LINUX -#include -#include -#include -#endif -// --- -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// defines for the random number generator -#define TWIST_IA 397 -#define TWIST_IB (TWIST_LEN - TWIST_IA) -#define UMASK 0x80000000 -#define LMASK 0x7FFFFFFF -#define MATRIX_A 0x9908B0DF -#define TWIST(b,i,j) ((b)[i] & UMASK) | ((b)[j] & LMASK) -#define MAGIC_TWIST(s) (((s) & 1) * MATRIX_A) - - -// statics -std::string Utility::m_host; -bool Utility::m_local_resolved = false; -ipaddr_t Utility::m_ip = 0; -std::string Utility::m_addr; -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 -struct in6_addr Utility::m_local_ip6; -std::string Utility::m_local_addr6; -#endif -#endif -const char *Utility::Logo = - "iVBORw0KGgoAAAANSUhEUgAAAGAAAABeCAIAAABTioayAAAACXBIWXMAAABkAAAAZAAPlsXdAAAAUHRF" - "WHRSYXcgcHJvZmlsZSB0eXBlIEFQUDEyAApnZW5lcmljIHByb2ZpbGUKICAgICAgMTUKNDQ3NTYzNmI3" - "OTAwMDEwMDA0MDAwMDAwM2MwMDAwCg2F1B0AABb4SURBVHja7Xx7rGVXed/3WGs/zvPeuTPXMzbjcUpq" - "HAwlpQlYoUlDaJsAiVuFFKSKGlUlKgXqIKJAKxfRR4IUZEpSt1FoQEK4oYQEErlSFAoKIEoo2BQasBmc" - "2NjyYzxz5957Hnufvfd6fF//2Oecez2hvbXvmZkg3U9b556Zc85ea//291rf+n0bVRWO5P8udLUn8Jdd" - "jgA6QI4AOkCOADpAjgA6QI4AOkCOADpAjgA6QI4AOkCOADpAjgA6QI4AOkCOADpAjgA6QMxVHHtfoUWx" - "/dP+C5fvABGv4gwBAK9qPWg5NLbvrjIY302ujgapAmKrQQiqC3xAQQF0H1AIcyXSq4XeZdegfedfWs78" - "jYKAAgDi3sVri4mqzH+D9DSTu+I2dyVNTEFRl34GUTUikiqotrgoAqqIAhBxqzj7ZocAighXWJUuI0Cq" - "injJ+SMAIZKolkXlGrOzM61mjfckCoN+X9UjorU26wgb7HTSPAfDRlVVFQAR21NeOT26XAC1p10CpKoI" - "iKTO+ckkFpO4vVX1Bh3kkKRsDCIBE4sIMRNx8FTPYgwQfJ1k4ZpT3W4nAQBVQaSF/1pcw+VE63JrEKiC" - "KhChC83Fi6EYEyp2uzxYN4kFY6H1O63TIUQAiCIIEgK5Rke7zWhUE2a9AR+/JunmpIr7of/eA2hhWREA" - "QUlBkGg8af7s7E4n75+6Lu/2iBkUAgJLhP2+RkSJsNU5ACUCQCAyxTQ88eS0rt1gSGdOD621Ik8zs8uH" - "0eUCSDSqCDHGUD/2mCvLXpbWp051bEqqGoIAINHeVRHRJTMREQBEACQEUDa0vT07/2QZvbvxphO9vhGh" - "1m0j0uVzSysGaOF6QASJQvD4yKN1UeiZ053eULzX4FsspB221RdVZWYARaTFaeYXjIgiqqpEag16jw9+" - "e3daTH/gBevHjw1EoIXle0ODdJH/KQiCxiiPPOLrWX7taeh1o3ek8wQH26jUao1qa1ZPy6VbgNovtIAi" - "gCoZK17l3GPNdFLf8H2djY1cRAlJUfHyhP+VAbQM6gsPAt/404uzypw509vYoMYhKCHOQxsAiAohaqtL" - "OhdEUlAm8iEQEgAQIRHHGJGQkBSAjILyhXNaN9VzTuOgn6jOl9yXQ49WvJpXEFUhoAcf2t7apn7f5p04" - "K9XVXkVcE4IXiSoRUEkFVYiAEZnZMltmoxFUKAYFJRWQiK4JwUfvoncxBnUNKMTBMUVKzj2OdSNzXC6P" - "ka1mLbZMdkCQSbZ36q3z2Oma4yesAipwEI8iLkTD4GNEBGZGAEJSBUBQ0RAcqLBJBdRYC0gxKKqKqgrE" - "4FUFgNAY7xFAOx0a79KTT4bvu4FVlYAUFRVgpXp0WID2W6gqIMXGyeOPN73ORm8QrcUQRFUUTNNEAIyt" - "CxJ1PmQ2H093vvr1L0rUm5//N+5/4N7g4o/92Cs7/R6AiAIxi4AKsOGvf/3Ljz/x0F974S2nr7/RNd5a" - "MqSj8e60JMPl9ddvSBRiVlBYaURbgQYtXI+qAhKce7JxLuMkGquq3K63GA0YEBFEFAEFNWx8rP7nV75w" - "/sJjhs31z7n54vaWd3Vd10nWFQ1EBACERlERaHc0vrD1eNNEIkMkIURQNMY0Lj7+xGzz5CCxCMqwak/0" - "7H3QUnf2LZR0VoWHHh7PytnO9nnnQ1XVohoVIqioMBMRGEuGbZbar977xe88+tDx9ecURVNUoZgUs6Is" - "at80TfAxBAEFkdi40ASoqqqYTJomqoIoEhkyNs0StlRV9qlzJSGLCuy391XICjRoEbmEGR9/fFo10utC" - "jFrOast2Vk2NtYRoGANCkiRRJDHm22fPfvozf3jL33w1BXvx4v+alOV4NPLONT5KlCyzPsQIEHxwXtTR" - "aLQ7Gu0W5cw5EAVERKC800nyrndxNmucF8OrzxhXFcUQMLjGl1N7zanrTGKStEtkvJcYNAbxPjLbpglV" - "1YjAuacufPx37+72jv3A837iqYtPlbNpPXNFWU3GRftNERGVEGII4l10LpSzejwqyqKqZm46KVUpeA1e" - "isKRZe+SyaSZJ2ErlRVFMVBGGs2aAMYQ9fs9BXFumqdJmiaACCCzqlHwosY7+MQnP/LYYw/f9o/vEORi" - "Ot0d7c6qZjQeVVWTcjYYWCIBTBHBeW1qrWqqinp3tF3WTROVrXGunhTNeBTKWTOMvU7emUz1+IYCoEgk" - "4vnEDq1QzxKgpwcvbZfsFy5MQ+xaE0WAmLrdfpIgoRKRQlTVqm66nfSP/uj3P/PH/+0fvvbtJzb/Su0q" - "1/jJZFqU1WRazGY7H/3ob/R6HcTYRmtCCh6cl0e+862imDnvkUwIDag4J87HPLfBu3FwwetzTiVsCXSV" - "FaNnr0HL4AUAIhEVgzOjUeHzWgHyvEekWZIzY5TIDACwPjz2rW9/84MffN8PvvjlP/wjP1nVZac7dL6a" - "TkvX+GJaFdPxZz/7iRi0hR0ASZkIFCXv9WMjdV0llpUzUGFkaxVJJECSmrKYNnXsJAKSrDBpfMYALW/O" - "Eh1VJcCyno2mNRECYlPXzAwgT20V/W5qEzZs2NhmWrz/vf8u65x4zWtuZ+LhIMsTU1bFZFq4BqbT0ax0" - "r339e05ec7KtRFtjIWhVO+T0Dz555wP/+3M+oAIoAmOa5mLTTGIkgqIsbd6/OCnO9NciRAa+agDtR2oJ" - "kAiEIGTs5uZ6NZv1el0RiTEAQu0ccQYosQl33fUr933ts6dP3/C+975FoicGBNy+cFEizqpqVpZFUW2e" - "uOn0mTMqjoiYGaJOZ42xPR9pMhkVxSwEQJQonsgAKJMR0PX19cY51amE1sL2V74PZW6HctLt8CISI6hQ" - "nnYIaTjsqcJ4PBkOB8SAqDHGTqf7B7939+/8zm+dueH5SL3zF84bY0UFVMqicIJFUZSzWTkbAVVpKgRC" - "BIjqnEuzCNhUs3I2mznvptNadcyUEHOWdkSE2cQYm8apoggorcA3rwagef4sKCJRBNgIBFVjDB8/fgxQ" - "CAEMJIbP3n//r773jtPX3/zP3/Yh5swY7ORZFAEwH/iPb/va1/64CaFpmqZyvdycOG4tISEBooidVaFu" - "uqpSOwhBogICIGrTVE3tQpQQfZqmo9F0Y70nogrKtLJgf9gwL6KiAKBN02xvT4hNJ82SxBpj806GKDFI" - "1ci7/tVbtnYvvPvffHzj2BnndrMsURCM5D35RqtZ5byv66quK9FgjHZSawzPLYUQALwPABCjDIdZU9fW" - "2DRLvZO6dgpS13WeZ7z4yQqToVVokGqMAgAhhG6WFeV4wIOqruumMgZ63WN3vu9f3PeVz7/lbXfe/MJb" - "Gr+1udlhQiT1XqsZGwoiERRANEQBVQARjcQUQqjrWhQBE5B51EeEPM+tsSKSJmysb1wdY0ySTGIZY0RE" - "YFxuq1w1gFpPqICiEqIqmMEgiYLdXj8EEY1BJOHhf/34f/7QB371lpfd+qpXvzHEyclret2cLRMAlI3v" - "pmnVjGblyLtZiD4ExxiJmE1AVIkBAEV0NqtCmAFAjI0hCKJISMgxQpJam1gFcFUTfIyArFHEECEAtstj" - "OETGeDgTUxBRERWJqpLnSZKse+/KcrZ+bC3GEIKcP7f9s6+7/Wd++o2G0RqXGCOxVrLGMIJToB//2z93" - "zbUveN6NL/GvelOMs43jJ6whZgYAUcny1MUmRveyv/X31teve+73v3Bra5JkTlW982nWAQUEBERmTVKM" - "Isv8bCVu+hmXXJel1dYxey/eh6ZxVdNs7QZrNpLEMhMxAmhTBwhUeDMa7wxz7PWstY21lCZp0zREtDtG" - "HzuzWspxk3XTTm7zxB8/Dnlm5gOBzup44byrfVo3ShAsl3mPCCnG2FaL8jzzPjDJcDAb9oeJpcRaZiZC" - "xMPuxj4zDbp0N1nb/wQRReRQz8qwneVZr9dLOQHQKN4FCUFOHM97nTSxIU1SQxo8MkdgyDLV2Yyk6fWU" - "2Tvv+r0OmVxViAgBQwQmO1hT2fWMIc0MU56kxrkmhIgISnFnvBMa6XZ0Y70bJBplFQReDaPmUKt5XToi" - "RRFNU5zNJiJxe3tre3u7KIrZrDQGT2z0+13D7NfWkk996g/f855f3tiwSWKtMYNB3uvRqVPZ5qY9ccKc" - "vKY/HOS+abwPTdOUsxJQAcQa3Niwv/4f7rh48dGN4700tb1+59ix9SxNsyzPsk6ScJoRES+LVIvjsLKi" - "ehBgjJLmJkmwqmaIEKOv6zgcDpxzdTUeDrKsY/MMyun2nz14v4+QWOyvZ9NCT5ywk0kwhGxoPK0Iw/qg" - "U85ciLC+1i3ruH7c7OzG8U519ptfrsvbmAFJCEkAu71OFLVJXnG0SSNRwPJyi2QlnKJnpkFPN+aWyoLz" - "aSARcmIBxK2tHcvzPM1s42rF2Ol0vnX/N19766t+6idv/dR//7RNekUDX/of99766p/+qZff8uZ/+iZj" - "+MMf/M3f/ujdx453Bv38Xe+648v33hsovPGNb3jlT7z0H/z9n/3zBx6KkhCa7dHk4siNp6WPMai4GIJG" - "wKDqDBgFBMW2ugmEK/HShzAxvfStqnY6eaebpanpdPJer9fr9YbD9aIs3vGOn7/x+T/0mte99fOf+0JZ" - "lI88svvuf/3OW156653v/y+TIv7Ld75z89RzP/yh3woOzn774XvuuefMDX/17W+9vdM99f67fv+vv/jl" - "7/iltzS1AyARcc4XRbmzuzuZTMbjcTWrfFNp8IbpcvAwnrGTXr7uV19cfGoMV43b2dkarh/LbYaIaUbf" - "eejPLfX/2Vt/hTJ8/W1vfujBb9x371cfefTs2Qfvu/9bX5lOii//yeff8E/eXjf1ffc++KUvfvpFP/gS" - "H8yXvvCZH/nRV9z1n37ZED7y8NlvfPMBm6RENktTiUmU2B5NMfFVsTHs4JxedVUBgqfxTlodVkREQiRE" - "JNVojbm4s9sd9keTOs+zaRUn4wJIHYhR7vWG1iaN4zw//tznvnQ8Lq6/nl70opcxnXzRi3/8Yx/78MMP" - "PvCKV77uyScKQnvt6RcgZszZbT//4sHGZhN8mvY6HZOmawIymkzzJCsnjliSNBVtAzoSLXahV+GEDluT" - "nk8KkJCIkEANwfra4PxT57Z3dra2tqbj0ckzN06K3Y/d/WtPPPrgPb97dzGbfP+NNyMZSjqv+pk31BL/" - "9IGvKcdXvOLnPvHxDzx57tGbnv+jtjvcOHndaLv4O3/39Zsbx//kc/cQpDF4xBgjxKigOuh1DSFIHAyG" - "CsDMuIBowf68Ghr0NHSWirTIxwgBVQyhihiDKupjmfU2b//FX/vNf3/Hpz/1yTPPu3FtfXNtbfNNb373" - "Rz5y529/+D3Dwdrtb/+3onLTTT/0kh9+5clrT2+evLZ201/4xbt+49d/6Rfe/HsR4bZ/9M5ud2392HUm" - "SceTqTWapMY19Xh31xhuw8RyDojz97CKKPbMMuk9hgIAqMYoPkgIsWl81YSmcXXtnYshiCiUVd3t9fP+" - "cGen9JK6Wpxz3W7X+4CIAJQwjXYvbhw/Nhx0ETUEr5CIRiZFgBDZC168uGWTZH1tfXd0AQkG/Rx02s3T" - "3e1t72O/lyeGU8M2NVlms4ST1GRpkjCzQaI5P+SqFcwAgWhu98zExMzCDDEqqnbSrKkbonrQ607KWQOB" - "GVRdmggzxhgQ0sFaDzE0bjwcDijgaLzT7XXSxDCR81HqsLm5joiI/sRG3/k6S7GqtWncrCz7vV7CbFqa" - "DBG1eLTri7lSH1p/njVAC2p3a1ZKRERMFJmZSIkQBFTVIJbTadaV4SDLsgBIWZ4TikosyzKx1DQ+SQkB" - "kDyA63Sp3zej8e7aYNhNE05w0aQACJTHFBGYOuPR7nA4yJIENBIxMzK1xwKhuXmtAKFD7WoAzkMYEREJ" - "MzMLMRCRkIAAgaYWm2rqfTUc9m3CXqssyQhtt7NujPU+IAKSVFWVZMYIGAOdLDWGi2ICACFERMzzXCCy" - "yqwoZ0XFDIYYRdkYYiIGNkgEhpEJiYB4CdBhI9khlxoICETErMzIBjkSMxsDqggiURRUEyYf/YXz59Is" - "TfJMYrDWpmnqQ8VMbAwADQd9UW2aRlUUYlFOo8S6rtsklFgIzWh7R6MYTgAEoR2XmdtXNmwMG95nYiuR" - "w0axNlwwozEkEcPcD0GMGgnaOiGAGkKTdmdlHZq65BJIh8Oh840PfmNjw9qWA62EqBrTNEGisiyzPGFI" - "xuPx1JfqAwJYNqCKCIw0d3zMhtttJSbGuYXNHZAeXomeGUBLYmXLgSYijUogimCIhMgyBKMqGiOqIiIH" - "RVBREUTpdVIVqYMGH3cu7HgNaZ5d3NoZrq0577zz62trTV1bm0gUDca5xte7KgKItuV3LsYlanUHmcka" - "NoaMIUJc1IBWoz7PUoP2ZQZKBAJEIkjEzMaiVVElEdMypZhBZP4rEQGANElSRBWJIhrBVc1Ove28Q8RY" - "haIsOnmH0bZfZgbLRkXaaN2GLGY2xliLxpJN2FhmA8xIzEiEuMo1x7MBaLHawAVNGZCQW1IUoFVVAYmg" - "iqpxUVTbIxPh3O7AkgGANLeimpqEEKPIsDdUEcaIBubETpnT69oYBQDMxIaY0RhjDVvDlts8A1ur3zfJ" - "w3qjFVDw2m4mImKGKGqYhUEtAMRFJQQAQaIsd0HaQonu8Z3mbHsCBInYEvD2XRsSIszTHWPYWDaGrGVr" - "rbXGEhkmg0SkiwxoZezdZ5sHPb0w1IZ7JmajAmqVFFnm21OMqAARkVQgxgiw7Kab3+OFz8BFjaldNMBy" - "qbe0LGZmA3PjssYYYoPGEDMiQbtiRpx35V3ltdg+QwNEIAAlMECw10CICIEQiABAJUIUbQmtqm2nwZ6z" - "WNxwwkV/Ai5Aovk6GA2zMcSGbELWmsQYYykxzKZNf9r4vr9n76omirAvnC3nxAjAtOCLIyoQARIgYowa" - "YqQAIiBRFz0sqqD7am+I+5WH2hxiniAbg8aSNdZYtoYSIsNsGKmNa4gAArrSGHZ4H7QPo7YnDIgVgBRV" - "ERNgDG3sjRikLYSKgJCIggrqJYRLFNhvVy0TcZEQGottOmgNW0OGqTUuwqU54cpb7lZCwZt7IiKAFhhS" - "QEbECNrmJoTIJMIUAkdZCqqAzjf3W19Ne9pD86yPGYnJEBlLxpBhYwwZg0xA7TGvbyxnskom8Ep40stZ" - "KQEqoKIAKBChUSRAAgJgJolqWH2MIlFUVEi17VFddnjMzYsIFot0ZAZitMxsyDAaZDZIDLioJQAoos49" - "0F9OEmcr863QFhqNhIotNoREFEVjUCIlQVGKIhpx2ciyNLNFgbJ1K+16AucHATOaeWFjrzxGcwtfrfNZ" - "NUB7ffCgiECttpMitMUPYQJBiCRRMLaaIyAK836fvS2kdqt9bmI8RwqJgQiZieep6Tx3aksul6+xdJUa" - "tLyBrZlw6ywVkQCh7elSZozCoqqCCu0eP+3xefZyn7k/MqhtcjNXJ8KFNQG2vAVcphp7r6u8qMuB/b7e" - "sbYFF1RVZb5vFURk7nsIVEV0uaEluFeraAFibJkuS+Rg8bnuux8rYwNdIYBgX/chwDy2qMCCM4xzy4I2" - "c95rFtzPN1jokS42BeZnJmrLKC0ul8XvXAmAYMlZaiGY3+TWHWP7CIa9msBfmALCHJe9dcjyKRZIl7Sq" - "fI+1hV+CUXu5oHvE8z2a9SJz0Zb7vO/JHrjvKRSLh5vsQ2+Oy+Wb+JUC6LuAden47Wf/HxO9Igb1Xca9" - "ks8PWjjvxXV+F7X4f/12/sUrC9KVfsDSpcPtIbX/sq+aQf1FubpPoPoekKOHvB0gRwAdIEcAHSBHAB0g" - "RwAdIEcAHSBHAB0gRwAdIEcAHSBHAB0gRwAdIP8HqHccFP4Rq4QAAAAASUVORK5CYII="; - - -std::string Utility::base64(const std::string& str_in) -{ - std::string str; - Base64 m_b; - m_b.encode(str_in, str, false); // , false == do not add cr/lf - return str; -} - - -std::string Utility::base64d(const std::string& str_in) -{ - std::string str; - Base64 m_b; - m_b.decode(str_in, str); - return str; -} - - -std::string Utility::l2string(long l) -{ - std::string str; - char tmp[100]; - snprintf(tmp,sizeof(tmp),"%ld",l); - str = tmp; - return str; -} - - -std::string Utility::bigint2string(int64_t l) -{ - std::string str; - int64_t tmp = l; - if (l < 0) - { - str = "-"; - tmp = -l; - } - while (tmp) - { - uint64_t a = tmp % 10; - str = (char)(a + 48) + str; - tmp /= 10; - } - if (!str.size()) - { - str = "0"; - } - return str; -} - - -std::string Utility::bigint2string(uint64_t l) -{ - std::string str; - uint64_t tmp = l; - while (tmp) - { - uint64_t a = tmp % 10; - str = (char)(a + 48) + str; - tmp /= 10; - } - if (!str.size()) - { - str = "0"; - } - return str; -} - - -uint64_t Utility::atoi64(const std::string& str) -{ - uint64_t l = 0; - for (size_t i = 0; i < str.size(); ++i) - { - l = l * 10 + str[i] - 48; - } - return l; -} - - -unsigned int Utility::hex2unsigned(const std::string& str) -{ - unsigned int r = 0; - for (size_t i = 0; i < str.size(); ++i) - { - r = r * 16 + str[i] - 48 - ((str[i] >= 'A') ? 7 : 0) - ((str[i] >= 'a') ? 32 : 0); - } - return r; -} - - -/* -* Encode string per RFC1738 URL encoding rules -* tnx rstaveley -*/ -std::string Utility::rfc1738_encode(const std::string& src) -{ -static char hex[] = "0123456789ABCDEF"; - std::string dst; - for (size_t i = 0; i < src.size(); ++i) - { - if (isalnum(src[i])) - { - dst += src[i]; - } - else - if (src[i] == ' ') - { - dst += '+'; - } - else - { - unsigned char c = static_cast(src[i]); - dst += '%'; - dst += hex[c / 16]; - dst += hex[c % 16]; - } - } - return dst; -} // rfc1738_encode - - -/* -* Decode string per RFC1738 URL encoding rules -* tnx rstaveley -*/ -std::string Utility::rfc1738_decode(const std::string& src) -{ - std::string dst; - for (size_t i = 0; i < src.size(); ++i) - { - if (src[i] == '%' && isxdigit(src[i + 1]) && isxdigit(src[i + 2])) - { - char c1 = src[++i]; - char c2 = src[++i]; - c1 = c1 - 48 - ((c1 >= 'A') ? 7 : 0) - ((c1 >= 'a') ? 32 : 0); - c2 = c2 - 48 - ((c2 >= 'A') ? 7 : 0) - ((c2 >= 'a') ? 32 : 0); - dst += (char)(c1 * 16 + c2); - } - else - if (src[i] == '+') - { - dst += ' '; - } - else - { - dst += src[i]; - } - } - return dst; -} // rfc1738_decode - - -bool Utility::isipv4(const std::string& str) -{ - int dots = 0; - // %! ignore :port? - for (size_t i = 0; i < str.size(); ++i) - { - if (str[i] == '.') - dots++; - else - if (!isdigit(str[i])) - return false; - } - if (dots != 3) - return false; - return true; -} - - -bool Utility::isipv6(const std::string& str) -{ - size_t qc = 0; - size_t qd = 0; - for (size_t i = 0; i < str.size(); ++i) - { - qc += (str[i] == ':') ? 1 : 0; - qd += (str[i] == '.') ? 1 : 0; - } - if (qc > 7) - { - fprintf(stderr, "tility::isipv6(%s) FALSE @1\n", str.c_str()); - return false; - } - if (qd && qd != 3) - { - fprintf(stderr, "tility::isipv6(%s) FALSE @2\n", str.c_str()); - return false; - } - Parse pa(str,":."); - std::string tmp = pa.getword(); - while (tmp.size()) - { - if (tmp.size() > 4) - { - fprintf(stderr, "tility::isipv6(%s) FALSE@3\n", str.c_str()); - return false; - } - for (size_t i = 0; i < tmp.size(); ++i) - { - if (tmp[i] < '0' || (tmp[i] > '9' && tmp[i] < 'A') || - (tmp[i] > 'F' && tmp[i] < 'a') || tmp[i] > 'f') - { - fprintf(stderr, "tility::isipv6(%s) FALSE@4\n", str.c_str()); - return false; - } - } - // - tmp = pa.getword(); - } - return true; -} - - -bool Utility::u2ip(const std::string& str, ipaddr_t& l) -{ - struct sockaddr_in sa; - bool r = Utility::u2ip(str, sa); - memcpy(&l, &sa.sin_addr, sizeof(l)); - return r; -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -bool Utility::u2ip(const std::string& str, struct in6_addr& l) -{ - struct sockaddr_in6 sa; - bool r = Utility::u2ip(str, sa); - l = sa.sin6_addr; - return r; -} -//#endif -//#endif - - -void Utility::l2ip(const ipaddr_t ip, std::string& str) -{ - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - memcpy(&sa.sin_addr, &ip, sizeof(sa.sin_addr)); - Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), str, NI_NUMERICHOST); -} - - -void Utility::l2ip(const in_addr& ip, std::string& str) -{ - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_addr = ip; - Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), str, NI_NUMERICHOST); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void Utility::l2ip(const struct in6_addr& ip, std::string& str,bool mixed) -{ - char slask[100]; // l2ip temporary - *slask = 0; - unsigned int prev = 0; - bool skipped = false; - bool ok_to_skip = true; - if (mixed) - { - unsigned short x; - unsigned short addr16[8]; - memcpy(addr16, &ip, sizeof(addr16)); - for (size_t i = 0; i < 6; ++i) - { - x = ntohs(addr16[i]); - if (*slask && (x || !ok_to_skip || prev)) - { -#if defined( _WIN32) && !defined(__CYGWIN__) - strcat_s(slask,sizeof(slask),":"); -#else - strcat(slask,":"); -#endif - } - if (x || !ok_to_skip) - { - snprintf(slask + strlen(slask),sizeof(slask) - strlen(slask),"%x", x); - if (x && skipped) - ok_to_skip = false; - } - else - { - skipped = true; - } - prev = x; - } - x = ntohs(addr16[6]); - snprintf(slask + strlen(slask),sizeof(slask) - strlen(slask),":%u.%u",x / 256,x & 255); - x = ntohs(addr16[7]); - snprintf(slask + strlen(slask),sizeof(slask) - strlen(slask),".%u.%u",x / 256,x & 255); - } - else - { - struct sockaddr_in6 sa; - memset(&sa, 0, sizeof(sa)); - sa.sin6_family = AF_INET6; - sa.sin6_addr = ip; - Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), str, NI_NUMERICHOST); - return; - } - str = slask; -} - - -int Utility::in6_addr_compare(in6_addr a,in6_addr b) -{ - for (size_t i = 0; i < 16; ++i) - { - if (a.s6_addr[i] < b.s6_addr[i]) - return -1; - if (a.s6_addr[i] > b.s6_addr[i]) - return 1; - } - return 0; -} -//#endif -//#endif - - -void Utility::ResolveLocal() -{ - char h[256]; - - // get local hostname and translate into ip-address - *h = 0; - gethostname(h,255); - { - if (Utility::u2ip(h, m_ip)) - { - Utility::l2ip(m_ip, m_addr); - } - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - memset(&m_local_ip6, 0, sizeof(m_local_ip6)); - { - if (Utility::u2ip(h, m_local_ip6)) - { - Utility::l2ip(m_local_ip6, m_local_addr6); - } - } -//#endif -//#endif - m_host = h; - m_local_resolved = true; -} - - -const std::string& Utility::GetLocalHostname() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_host; -} - - -ipaddr_t Utility::GetLocalIP() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_ip; -} - - -const std::string& Utility::GetLocalAddress() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_addr; -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -const struct in6_addr& Utility::GetLocalIP6() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_local_ip6; -} - - -const std::string& Utility::GetLocalAddress6() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_local_addr6; -} -//#endif -//#endif - - -const std::string Utility::GetEnv(const std::string& name) -{ -#if defined( _WIN32) && !defined(__CYGWIN__) - size_t sz = 0; - char tmp[2048]; - if (getenv_s(&sz, tmp, sizeof(tmp), name.c_str())) - { - *tmp = 0; - } - return tmp; -#else - char *s = getenv(name.c_str()); - if (!s) - return ""; - return s; -#endif -} - - -void Utility::SetEnv(const std::string& var,const std::string& value) -{ -#if (defined(SOLARIS8) || defined(SOLARIS)) - { - static std::map vmap; - if (vmap.find(var) != vmap.end()) - { - delete[] vmap[var]; - } - size_t sz = var.size() + 1 + value.size() + 1; - vmap[var] = new char[sz]; - snprintf(vmap[var], sz, "%s=%s", var.c_str(), value.c_str()); - putenv( vmap[var] ); - } -#elif defined _WIN32 - { - std::string slask = var + "=" + value; - _putenv( (char *)slask.c_str()); - } -#else - setenv(var.c_str(), value.c_str(), 1); -#endif -} - - -std::string Utility::Sa2String(struct sockaddr *sa) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (sa -> sa_family == AF_INET6) - { - struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa; - std::string tmp; - Utility::l2ip(sa6 -> sin6_addr, tmp); - return tmp + ":" + Utility::l2string(ntohs(sa6 -> sin6_port)); - } -//#endif -//#endif - if (sa -> sa_family == AF_INET) - { - struct sockaddr_in *sa4 = (struct sockaddr_in *)sa; - ipaddr_t a; - memcpy(&a, &sa4 -> sin_addr, 4); - std::string tmp; - Utility::l2ip(a, tmp); - return tmp + ":" + Utility::l2string(ntohs(sa4 -> sin_port)); - } - return ""; -} - - -void Utility::GetTime(struct timeval *p) -{ -#ifdef _WIN32 - FILETIME ft; // Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC). - GetSystemTimeAsFileTime(&ft); - uint64_t tt; - memcpy(&tt, &ft, sizeof(tt)); - tt /= 10; // make it usecs - p->tv_sec = (long)tt / 1000000; - p->tv_usec = (long)tt % 1000000; -#else - gettimeofday(p, NULL); -#endif -} - - -std::auto_ptr Utility::CreateAddress(struct sockaddr *sa,socklen_t sa_len) -{ - switch (sa -> sa_family) - { - case AF_INET: - if (sa_len == sizeof(struct sockaddr_in)) - { - struct sockaddr_in *p = (struct sockaddr_in *)sa; - return std::auto_ptr(new Ipv4Address(*p)); - } - break; -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - case AF_INET6: - if (sa_len == sizeof(struct sockaddr_in6)) - { - struct sockaddr_in6 *p = (struct sockaddr_in6 *)sa; - return std::auto_ptr(new Ipv6Address(*p)); - } - break; -//#endif -//#endif - } - return std::auto_ptr(NULL); -} - - -bool Utility::u2ip(const std::string& host, struct sockaddr_in& sa, int ai_flags) -{ - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; -#ifdef NO_GETADDRINFO - if ((ai_flags & AI_NUMERICHOST) != 0 || isipv4(host)) - { - Parse pa((char *)host.c_str(), "."); - union { - struct { - unsigned char b1; - unsigned char b2; - unsigned char b3; - unsigned char b4; - } a; - ipaddr_t l; - } u; - u.a.b1 = static_cast(pa.getvalue()); - u.a.b2 = static_cast(pa.getvalue()); - u.a.b3 = static_cast(pa.getvalue()); - u.a.b4 = static_cast(pa.getvalue()); - memcpy(&sa.sin_addr, &u.l, sizeof(sa.sin_addr)); - return true; - } -#ifndef LINUX - struct hostent *he = gethostbyname( host.c_str() ); - if (!he) - { - return false; - } - memcpy(&sa.sin_addr, he -> h_addr, sizeof(sa.sin_addr)); -#else - struct hostent he; - struct hostent *result = NULL; - int myerrno = 0; - char buf[2000]; - int n = gethostbyname_r(host.c_str(), &he, buf, sizeof(buf), &result, &myerrno); - if (n || !result) - { - return false; - } - if (he.h_addr_list && he.h_addr_list[0]) - memcpy(&sa.sin_addr, he.h_addr, 4); - else - return false; -#endif - return true; -#else - struct addrinfo hints; - memset(&hints, 0, sizeof(hints)); - // AI_NUMERICHOST - // AI_CANONNAME - // AI_PASSIVE - server - // AI_ADDRCONFIG - // AI_V4MAPPED - // AI_ALL - // AI_NUMERICSERV - hints.ai_flags = ai_flags; - hints.ai_family = AF_INET; - hints.ai_socktype = 0; - hints.ai_protocol = 0; - struct addrinfo *res; - if (Utility::isipv4(host)) - hints.ai_flags |= AI_NUMERICHOST; - int n = getaddrinfo(host.c_str(), NULL, &hints, &res); - if (!n) - { - std::vector vec; - struct addrinfo *ai = res; - while (ai) - { - if (ai -> ai_addrlen == sizeof(sa)) - vec.push_back( ai ); - ai = ai -> ai_next; - } - if (!vec.size()) - return false; - ai = vec[Utility::Rnd() % vec.size()]; - { - memcpy(&sa, ai -> ai_addr, ai -> ai_addrlen); - } - freeaddrinfo(res); - return true; - } - std::string error = "Error: "; -#ifndef __CYGWIN__ - error += gai_strerror(n); -#endif - return false; -#endif // NO_GETADDRINFO -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -bool Utility::u2ip(const std::string& host, struct sockaddr_in6& sa, int ai_flags) -{ - memset(&sa, 0, sizeof(sa)); - sa.sin6_family = AF_INET6; -#ifdef NO_GETADDRINFO - if ((ai_flags & AI_NUMERICHOST) != 0 || isipv6(host)) - { - std::list vec; - size_t x = 0; - for (size_t i = 0; i <= host.size(); ++i) - { - if (i == host.size() || host[i] == ':') - { - std::string s = host.substr(x, i - x); - // - if (strstr(s.c_str(),".")) // x.x.x.x - { - Parse pa(s,"."); - char slask[100]; // u2ip temporary hex2string conversion - unsigned long b0 = static_cast(pa.getvalue()); - unsigned long b1 = static_cast(pa.getvalue()); - unsigned long b2 = static_cast(pa.getvalue()); - unsigned long b3 = static_cast(pa.getvalue()); - snprintf(slask,sizeof(slask),"%lx",b0 * 256 + b1); - vec.push_back(slask); - snprintf(slask,sizeof(slask),"%lx",b2 * 256 + b3); - vec.push_back(slask); - } - else - { - vec.push_back(s); - } - // - x = i + 1; - } - } - size_t sz = vec.size(); // number of byte pairs - size_t i = 0; // index in in6_addr.in6_u.u6_addr16[] ( 0 .. 7 ) - unsigned short addr16[8]; - for (std::list::iterator it = vec.begin(); it != vec.end(); ++it) - { - std::string bytepair = *it; - if (bytepair.size()) - { - addr16[i++] = htons(Utility::hex2unsigned(bytepair)); - } - else - { - addr16[i++] = 0; - while (sz++ < 8) - { - addr16[i++] = 0; - } - } - } - memcpy(&sa.sin6_addr, addr16, sizeof(addr16)); - return true; - } -#ifdef SOLARIS - int errnum = 0; - struct hostent *he = getipnodebyname( host.c_str(), AF_INET6, 0, &errnum ); -#else - struct hostent *he = gethostbyname2( host.c_str(), AF_INET6 ); -#endif - if (!he) - { - return false; - } - memcpy(&sa.sin6_addr,he -> h_addr_list[0],he -> h_length); -#ifdef SOLARIS - free(he); -#endif - return true; -#else - struct addrinfo hints; - memset(&hints, 0, sizeof(hints)); - hints.ai_flags = ai_flags; - hints.ai_family = AF_INET6; - hints.ai_socktype = 0; - hints.ai_protocol = 0; - struct addrinfo *res; - if (Utility::isipv6(host)) - hints.ai_flags |= AI_NUMERICHOST; - int n = getaddrinfo(host.c_str(), NULL, &hints, &res); - if (!n) - { - std::vector vec; - struct addrinfo *ai = res; - while (ai) - { - if (ai -> ai_addrlen == sizeof(sa)) - vec.push_back( ai ); - ai = ai -> ai_next; - } - if (!vec.size()) - return false; - ai = vec[Utility::Rnd() % vec.size()]; - { - memcpy(&sa, ai -> ai_addr, ai -> ai_addrlen); - } - freeaddrinfo(res); - return true; - } - std::string error = "Error: "; -#ifndef __CYGWIN__ - error += gai_strerror(n); -#endif - return false; -#endif // NO_GETADDRINFO -} -//#endif // IPPROTO_IPV6 -//#endif // ENABLE_IPV6 - - -bool Utility::reverse(struct sockaddr *sa, socklen_t sa_len, std::string& hostname, int flags) -{ - std::string service; - return Utility::reverse(sa, sa_len, hostname, service, flags); -} - - -bool Utility::reverse(struct sockaddr *sa, socklen_t sa_len, std::string& hostname, std::string& service, int flags) -{ - hostname = ""; - service = ""; -#ifdef NO_GETADDRINFO - switch (sa -> sa_family) - { - case AF_INET: - if (flags & NI_NUMERICHOST) - { - union { - struct { - unsigned char b1; - unsigned char b2; - unsigned char b3; - unsigned char b4; - } a; - ipaddr_t l; - } u; - struct sockaddr_in *sa_in = (struct sockaddr_in *)sa; - memcpy(&u.l, &sa_in -> sin_addr, sizeof(u.l)); - char tmp[100]; - snprintf(tmp, sizeof(tmp), "%u.%u.%u.%u", u.a.b1, u.a.b2, u.a.b3, u.a.b4); - hostname = tmp; - return true; - } - else - { - struct sockaddr_in *sa_in = (struct sockaddr_in *)sa; - struct hostent *h = gethostbyaddr( (const char *)&sa_in -> sin_addr, sizeof(sa_in -> sin_addr), AF_INET); - if (h) - { - hostname = h -> h_name; - return true; - } - } - break; -//#ifdef ENABLE_IPV6 - case AF_INET6: - if (flags & NI_NUMERICHOST) - { - char slask[100]; // l2ip temporary - *slask = 0; - unsigned int prev = 0; - bool skipped = false; - bool ok_to_skip = true; - { - unsigned short addr16[8]; - struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)sa; - memcpy(addr16, &sa_in6 -> sin6_addr, sizeof(addr16)); - for (size_t i = 0; i < 8; ++i) - { - unsigned short x = ntohs(addr16[i]); - if (*slask && (x || !ok_to_skip || prev)) - { -#if defined( _WIN32) && !defined(__CYGWIN__) - strcat_s(slask, sizeof(slask),":"); -#else - strcat(slask,":"); -#endif - } - if (x || !ok_to_skip) - { - snprintf(slask + strlen(slask), sizeof(slask) - strlen(slask),"%x", x); - if (x && skipped) - ok_to_skip = false; - } - else - { - skipped = true; - } - prev = x; - } - } - if (!*slask) - { -#if defined( _WIN32) && !defined(__CYGWIN__) - strcpy_s(slask, sizeof(slask), "::"); -#else - strcpy(slask, "::"); -#endif - } - hostname = slask; - return true; - } - else - { - // %! TODO: ipv6 reverse lookup - struct sockaddr_in6 *sa_in = (struct sockaddr_in6 *)sa; - struct hostent *h = gethostbyaddr( (const char *)&sa_in -> sin6_addr, sizeof(sa_in -> sin6_addr), AF_INET6); - if (h) - { - hostname = h -> h_name; - return true; - } - } - break; -//#endif - } - return false; -#else - char host[NI_MAXHOST]; - // NI_NOFQDN - // NI_NUMERICHOST - // NI_NAMEREQD - // NI_NUMERICSERV - // NI_DGRAM - int n = getnameinfo(sa, sa_len, host, sizeof(host), NULL, 0, flags); - if (n) - { - // EAI_AGAIN - // EAI_BADFLAGS - // EAI_FAIL - // EAI_FAMILY - // EAI_MEMORY - // EAI_NONAME - // EAI_OVERFLOW - // EAI_SYSTEM - return false; - } - hostname = host; - return true; -#endif // NO_GETADDRINFO -} - - -bool Utility::u2service(const std::string& name, int& service, int ai_flags) -{ -#ifdef NO_GETADDRINFO - // %! - return false; -#else - struct addrinfo hints; - service = 0; - memset(&hints, 0, sizeof(hints)); - // AI_NUMERICHOST - // AI_CANONNAME - // AI_PASSIVE - server - // AI_ADDRCONFIG - // AI_V4MAPPED - // AI_ALL - // AI_NUMERICSERV - hints.ai_flags = ai_flags; - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = 0; - hints.ai_protocol = 0; - struct addrinfo *res; - int n = getaddrinfo(NULL, name.c_str(), &hints, &res); - if (!n) - { - service = res -> ai_protocol; - freeaddrinfo(res); - return true; - } - return false; -#endif // NO_GETADDRINFO -} - - -unsigned long Utility::ThreadID() -{ -#ifdef _WIN32 - return GetCurrentThreadId(); -#else - return (unsigned long)pthread_self(); -#endif -} - - -std::string Utility::ToLower(const std::string& str) -{ - std::string r; - for (size_t i = 0; i < str.size(); ++i) - { - if (str[i] >= 'A' && str[i] <= 'Z') - r += str[i] | 32; - else - r += str[i]; - } - return r; -} - - -std::string Utility::ToUpper(const std::string& str) -{ - std::string r; - for (size_t i = 0; i < str.size(); ++i) - { - if (str[i] >= 'a' && str[i] <= 'z') - r += (char)(str[i] - 32); - else - r += str[i]; - } - return r; -} - - -std::string Utility::ToString(double d) -{ - char tmp[100]; - snprintf(tmp, sizeof(tmp), "%f", d); - return tmp; -} - - -unsigned long Utility::Rnd() -{ -static Utility::Rng generator( (unsigned long)time(NULL) ); - return generator.Get(); -} - - -Utility::Rng::Rng(unsigned long seed) : m_value( 0 ) -{ - m_tmp[0] = seed & 0xffffffffUL; - for (int i = 1; i < TWIST_LEN; ++i) - { - m_tmp[i] = (1812433253UL * (m_tmp[i - 1] ^ (m_tmp[i - 1] >> 30)) + i); - } -} - - -unsigned long Utility::Rng::Get() -{ - unsigned long val = m_tmp[m_value]; - ++m_value; - if (m_value == TWIST_LEN) - { - for (int i = 0; i < TWIST_IB; ++i) - { - unsigned long s = TWIST(m_tmp, i, i + 1); - m_tmp[i] = m_tmp[i + TWIST_IA] ^ (s >> 1) ^ MAGIC_TWIST(s); - } - { - for (int i = 0; i < TWIST_LEN - 1; ++i) - { - unsigned long s = TWIST(m_tmp, i, i + 1); - m_tmp[i] = m_tmp[i - TWIST_IB] ^ (s >> 1) ^ MAGIC_TWIST(s); - } - } - unsigned long s = TWIST(m_tmp, TWIST_LEN - 1, 0); - m_tmp[TWIST_LEN - 1] = m_tmp[TWIST_IA - 1] ^ (s >> 1) ^ MAGIC_TWIST(s); - - m_value = 0; - } - return val; -} - - -bool Utility::ncmap_compare::operator()(const std::string& x, const std::string& y) const -{ - return strcasecmp(x.c_str(), y.c_str()) < 0; -} - - -Utility::Uri::Uri(const std::string& url) : m_url(url), m_port(0), m_path(url) -{ - size_t pos = url.find("://"); - if (pos != std::string::npos) - { - m_protocol = Utility::ToLower(url.substr(0, pos)); - m_port = (m_protocol == "http") ? 80 : - (m_protocol == "https") ? 443 : 0; - m_host = url.substr(pos + 3); - pos = m_host.find("/"); - if (pos != std::string::npos) - { - m_path = m_host.substr(pos); - m_host = m_host.substr(0, pos); - } - pos = m_host.find(":"); - if (pos != std::string::npos) - { - m_port = atoi(m_host.substr(pos + 1).c_str()); - m_host = m_host.substr(0, pos); - } - } - pos = m_path.find("?"); - if (pos != std::string::npos) - { - m_uri = m_path.substr(0, pos); - m_query_string = m_path.substr(pos + 1); - } - else - { - m_uri = m_path; - } - pos = std::string::npos; - for (size_t i = 0; i < m_uri.size(); ++i) - if (m_uri[i] == '/') - pos = i; - if (pos != std::string::npos) - m_file = m_uri.substr(pos + 1); - pos = std::string::npos; - for (size_t i = 0; i < m_uri.size(); ++i) - if (m_uri[i] == '.') - pos = i; - if (pos != std::string::npos) - m_ext = m_uri.substr(pos + 1); -} - - -Utility::Path::Path(const std::string& _str) -{ - std::string str = _str; - for (size_t i = 0; i < str.size(); ++i) - { -#ifdef _WIN32 - if (str[i] == '/') - str[i] = '\\'; -#else - if (str[i] == '\\') - str[i] = '/'; -#endif - } -#ifndef _WIN32 - struct stat st; - stat(str.c_str(), &st); - if (S_ISDIR(st.st_mode)) - { - m_path = str; - return; - } -#endif - size_t x = 0; - for (size_t i = 0; i < str.size(); ++i) - if (str[i] == '/' || str[i] == '\\') - x = i + 1; - m_path = str.substr(0, x); - m_file = str.substr(x); - for (size_t i = 0; i < m_file.size(); ++i) - if (m_file[i] == '.') - m_ext = m_file.substr(i + 1); -} - - -const std::string Utility::Stack() -{ -#if defined LINUX -#define BFSIZE 255 - void *buffer[BFSIZE]; - int n = backtrace(buffer, BFSIZE); - char **res = backtrace_symbols(buffer, n); - std::string tmp; - for (int i = 0; i < n; ++i) - { - std::string x = res[i]; - std::string plus; - std::string addr; - size_t pos = x.find("("); - if (pos != std::string::npos) - { - x = x.substr(pos + 1); // skip executable name - - pos = x.find(")"); - if (pos != std::string::npos) - { - addr = x.substr(pos + 1); - x = x.substr(0, pos); - } - - pos = x.find("+"); - if (pos != std::string::npos) - { - plus = x.substr(pos); - x = x.substr(0, pos); - } - } - char zz[1000]; - { - size_t sz = 1000; - int status = 0; - abi::__cxa_demangle( x.c_str(), zz, &sz, &status); - - if (!status) - { - tmp += zz; - tmp += plus; - tmp += addr; - } - else - { - tmp += res[i]; - } - tmp += "\n"; - } - // dladdr() test - if (0) - { - Dl_info info; - int n = dladdr(buffer[i], &info); - if (!n) - printf("%d: dladdr() failed\n", i); - else - { - size_t sz = 1000; - int status = 0; - abi::__cxa_demangle( info.dli_sname, zz, &sz, &status); - - printf("%d: %s: %s\n", i, info.dli_fname, info.dli_sname); - if (!status) - printf(" %s\n", zz); - } - } // end of dladdr() test - } // for (i) - free(res); - return tmp; -#else - return "Not available"; -#endif -} - - -const std::string Utility::FromUtf8(const std::string& str) -{ - if (!str.size()) - return ""; - std::string r; - for (size_t i = 0; i < str.size(); ++i) - { - if (i < str.size() - 1 && (str[i] & 0xe0) == 0xc0 && (str[i + 1] & 0xc0) == 0x80) - { - int c1 = str[i] & 0x1f; - int c2 = str[++i] & 0x3f; - int c = (c1 << 6) + c2; - r += (char)c; - } - else - { - r += str[i]; - } - } - return r; -} - -// 110yyyxx 10xxxxxx - -const std::string Utility::ToUtf8(const std::string& str) -{ - if (str.empty()) - return ""; - std::string r; - for (size_t i = 0; i < str.size(); ++i) - { - if (((unsigned)str[i] & 0x80) == 0x80) - { - r += (str[i] >> 6) | 0xc0; - r += (str[i] & 0x3f) | 0x80; - } - else - { - r += str[i]; - } - } - return r; -} - - -const Utility::Path Utility::CurrentDirectory() -{ -#ifdef _WIN32 - TCHAR slask[MAX_PATH + 1]; - DWORD ret = -#ifdef UNICODE - ::GetCurrentDirectoryW(MAX_PATH, slask); -#else - ::GetCurrentDirectoryA(MAX_PATH, slask); -#endif - if (!ret) - { - *slask = 0; - DWORD err = GetLastError(); - } - return Path(slask); -#else - char slask[32000]; - if (!getcwd(slask, 32000)) - { - return Path("."); - } - return Path(slask); -#endif -} - - -bool Utility::ChangeDirectory(const Utility::Path& to_dir) -{ -#ifdef _WIN32 - return SetCurrentDirectory(to_dir.GetPath().c_str()) ? true : false; -#else - if (chdir( to_dir.GetPath().c_str() ) == -1) - { - return false; - } - return true; -#endif -} - - -void Utility::Sleep(int ms) -{ -#ifdef _WIN32 - ::Sleep(ms); -#else - struct timeval tv; - tv.tv_sec = ms / 1000; - tv.tv_usec = (ms % 1000) * 1000; - select(0, NULL, NULL, NULL, &tv); -#endif -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.h deleted file mode 100755 index 24366bb631..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.h +++ /dev/null @@ -1,276 +0,0 @@ -/** \file Utility.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Utility_H -#define _SOCKETS_Utility_H - -#include "sockets-config.h" -#include -#include -#include "socket_include.h" -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#define TWIST_LEN 624 - -class SocketAddress; - -/** Conversion utilities. - \ingroup util */ -class Utility -{ - /** - The Mersenne Twister - http://www.math.keio.ac.jp/~matumoto/emt.html - */ - class Rng - { - public: - Rng(unsigned long seed); - - unsigned long Get(); - - private: - int m_value; - unsigned long m_tmp[TWIST_LEN]; - }; - class ncmap_compare - { - public: - bool operator()(const std::string& x, const std::string& y) const; - }; -public: - template class ncmap : public std::map - { - public: - ncmap() {} - }; - class Uri - { - public: - Uri(const std::string& url); - - const std::string& Url() const { - return m_url; - } - const std::string& UrlUri() const { - return m_uri; - } - const std::string& QueryString() const { - return m_query_string; - } - const std::string& Protocol() const { - return m_protocol; - } - const std::string& Host() const { - return m_host; - } - int Port() const { - return m_port; - } - const std::string& Path() const { - return m_path; - } - const std::string& File() const { - return m_file; - } - const std::string& Extension() const { - return m_ext; - } - - const std::string& ToString() const { - return m_url; - } - - private: - std::string m_url; - std::string m_uri; - std::string m_query_string; - std::string m_protocol; - std::string m_host; - int m_port; - std::string m_path; - std::string m_file; - std::string m_ext; - }; - class Path - { - public: - Path(const std::string& ); - - const std::string& GetPath() const { - return m_path; - } - const std::string& GetFilename() const { - return m_file; - } - const std::string& GetExtension() const { - return m_ext; - } - - private: - std::string m_path; - std::string m_file; - std::string m_ext; - }; -public: - static std::string base64(const std::string& str_in); - static std::string base64d(const std::string& str_in); - static std::string l2string(long l); - static std::string bigint2string(int64_t l); - static std::string bigint2string(uint64_t l); - static uint64_t atoi64(const std::string& str); - static unsigned int hex2unsigned(const std::string& str); - static std::string rfc1738_encode(const std::string& src); - static std::string rfc1738_decode(const std::string& src); - - /** Checks whether a string is a valid ipv4/ipv6 ip number. */ - static bool isipv4(const std::string&); - /** Checks whether a string is a valid ipv4/ipv6 ip number. */ - static bool isipv6(const std::string&); - - /** Hostname to ip resolution ipv4, not asynchronous. */ - static bool u2ip(const std::string&, ipaddr_t&); - static bool u2ip(const std::string&, struct sockaddr_in& sa, int ai_flags = 0); - - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Hostname to ip resolution ipv6, not asynchronous. */ - static bool u2ip(const std::string&, struct in6_addr&); - static bool u2ip(const std::string&, struct sockaddr_in6& sa, int ai_flags = 0); - //#endif - //#endif - - /** Reverse lookup of address to hostname */ - static bool reverse(struct sockaddr *sa, socklen_t sa_len, std::string&, int flags = 0); - static bool reverse(struct sockaddr *sa, socklen_t sa_len, std::string& hostname, std::string& service, int flags = 0); - - static bool u2service(const std::string& name, int& service, int ai_flags = 0); - - /** Convert binary ip address to string: ipv4. */ - static void l2ip(const ipaddr_t,std::string& ); - static void l2ip(const in_addr&,std::string& ); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Convert binary ip address to string: ipv6. */ - static void l2ip(const struct in6_addr&,std::string& ,bool mixed = false); - - /** ipv6 address compare. */ - static int in6_addr_compare(in6_addr,in6_addr); - //#endif - //#endif - /** ResolveLocal (hostname) - call once before calling any GetLocal method. */ - static void ResolveLocal(); - /** Returns local hostname, ResolveLocal must be called once before using. - \sa ResolveLocal */ - static const std::string& GetLocalHostname(); - /** Returns local ip, ResolveLocal must be called once before using. - \sa ResolveLocal */ - static ipaddr_t GetLocalIP(); - /** Returns local ip number as string. - \sa ResolveLocal */ - static const std::string& GetLocalAddress(); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Returns local ipv6 ip. - \sa ResolveLocal */ - static const struct in6_addr& GetLocalIP6(); - /** Returns local ipv6 address. - \sa ResolveLocal */ - static const std::string& GetLocalAddress6(); - //#endif - //#endif - /** Get environment variable */ - static const std::string GetEnv(const std::string& name); - /** Set environment variable. - \param var Name of variable to set - \param value Value */ - static void SetEnv(const std::string& var,const std::string& value); - /** Convert sockaddr struct to human readable string. - \param sa Ptr to sockaddr struct */ - static std::string Sa2String(struct sockaddr *sa); - - /** Get current time in sec/microseconds. */ - static void GetTime(struct timeval *); - - static std::auto_ptr CreateAddress(struct sockaddr *,socklen_t); - - static unsigned long ThreadID(); - - static std::string ToLower(const std::string& str); - static std::string ToUpper(const std::string& str); - - static std::string ToString(double d); - - /** Returns a random 32-bit integer */ - static unsigned long Rnd(); - - static const char *Logo; - - static const std::string Stack(); - - /** Utf8 decrypt, encrypt. */ - static const std::string FromUtf8(const std::string& ); - static const std::string ToUtf8(const std::string&); - - /** File system stuff */ - static const Path CurrentDirectory(); - static bool ChangeDirectory(const Path& to_dir); - - /** wait a specified number of ms */ - static void Sleep(int ms); - -private: - static std::string m_host; ///< local hostname - static ipaddr_t m_ip; ///< local ip address - static std::string m_addr; ///< local ip address in string format - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - static struct in6_addr m_local_ip6; ///< local ipv6 address - //#endif - static std::string m_local_addr6; ///< local ipv6 address in string format - //#endif - static bool m_local_resolved; ///< ResolveLocal has been called if true -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Utility_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.cpp deleted file mode 100755 index 7147a1008a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/** - ** \file XmlDocument.cpp - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "XmlDocument.h" -#include "XmlException.h" - -#ifdef ENABLE_XML - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif -namespace Xml { - - -XmlDocument::XmlDocument(const std::string& filename,const std::string& verify_ns,const std::string& verify_root) -: m_doc(NULL) -, m_ok(false) -{ - xmlNodePtr cur; - xmlNsPtr ns; - - if (!(m_doc = xmlParseFile(filename.c_str() ))) - { - throw XmlException("Parse of file failed: " + filename); - } - if (!(cur = xmlDocGetRootElement(m_doc))) - { - xmlFreeDoc(m_doc); - m_doc = NULL; - throw XmlException("Document is empty: " + filename); - } - if (verify_ns.size()) - { - if (!(ns = xmlSearchNsByHref(m_doc, cur, (const xmlChar *) verify_ns.c_str() ))) - { - xmlFreeDoc(m_doc); - m_doc = NULL; - throw XmlException("Document namespace != " + verify_ns); - } - } - if (verify_root.size()) - { - if (xmlStrcmp(cur -> name, (const xmlChar *) verify_root.c_str() )) - { - xmlFreeDoc(m_doc); - m_doc = NULL; - throw XmlException("Document root != " + verify_root); - } - } - m_ok = true; -} - - -XmlDocument::~XmlDocument() -{ - if (m_doc) - { - xmlFreeDoc(m_doc); - } -} - - -XmlDocument::operator xmlDocPtr() -{ - return m_doc; -} - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // ENABLE_XML diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.h deleted file mode 100755 index 11925e8540..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - ** \file XmlDocument.h - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _XmlDocument_H -#define _XmlDocument_H - -#include "sockets-config.h" - -#ifdef ENABLE_XML - -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -namespace Xml -{ - - -class XmlDocument -{ -public: - XmlDocument(const std::string& filename,const std::string& verify_ns = "",const std::string& verify_root = ""); - virtual ~XmlDocument(); - - /** Document parse successful. */ - bool IsOk() { - return m_ok; - } - - operator xmlDocPtr(); - -protected: - XmlDocument(const XmlDocument& ) {} // copy constructor - -private: - XmlDocument& operator=(const XmlDocument& ) { - return *this; // assignment operator - } - - xmlDocPtr m_doc; - bool m_ok; -}; - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_XML - -#endif // _XmlDocument_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.cpp deleted file mode 100755 index 045994ae24..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/** - ** \file XmlException.cpp - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "XmlException.h" -#ifdef ENABLE_XML - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif -namespace Xml { - - -XmlException::XmlException(const std::string& descr) -:Exception(descr) -{ -} - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // ENABLE_XML diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.h deleted file mode 100755 index 1504b27eb8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - ** \file XmlException.h - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _XmlException_H -#define _XmlException_H - -#include "sockets-config.h" -#ifdef ENABLE_XML -#include "Exception.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -namespace Xml -{ - - -class XmlException : public Exception -{ -public: - XmlException(const std::string& descr); - - XmlException(const XmlException& x) : Exception(x) {} // copy constructor - -private: - XmlException& operator=(const XmlException& ) { - return *this; // assignment operator - } - -}; - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_XML -#endif // _XmlException_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.cpp deleted file mode 100755 index 881c09936f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/** - ** \file XmlNode.cpp - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "XmlNode.h" -#include "XmlDocument.h" -#include "XmlException.h" -#include "Utility.h" - -#ifdef ENABLE_XML - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif -namespace Xml { - - -XmlNode::XmlNode(XmlDocument& doc) -: m_doc(doc) -, m_current( GetRootElement() ) -{ -} - - -XmlNode::XmlNode(XmlDocument& doc, const std::string& nodepath) -: m_doc(doc) -, m_current( GetRootElement() ) -{ - xmlNodePtr p = GetFirstElement( nodepath ); - SetCurrent( p ); -} - - -XmlNode::XmlNode(const XmlNode& node, const std::string& nodepath) -: m_doc( node.GetDocument() ) -, m_current( node ) -{ - xmlNodePtr p = GetFirstElement( node, nodepath ); - SetCurrent( p ); -} - - -XmlNode::XmlNode(XmlDocument& doc, xmlNodePtr ptr) -: m_doc(doc) -, m_current( ptr ) -{ -} - - -XmlNode::XmlNode(xmlDocPtr doc, xmlNodePtr ptr) -: m_doc(doc) -, m_current( ptr ) -{ -} - - -XmlNode::~XmlNode() -{ -} - - -xmlNodePtr XmlNode::GetRootElement() const -{ - m_current = xmlDocGetRootElement(m_doc); - return m_current; -} - - -std::string XmlNode::GetProperty(const std::string& name) const -{ - xmlChar *p = m_current ? xmlGetProp(m_current, (const xmlChar *) name.c_str() ) : NULL; - if (!p) - { - throw XmlException( "Property '" + name + "' not found in node: " + GetNodeName() ); - } - std::string str = (char *)p; - xmlFree(p); - return Utility::FromUtf8(str); -} - - -bool XmlNode::PropertyExists(const std::string& name) const -{ - xmlChar *p = m_current ? xmlGetProp(m_current, (const xmlChar *) name.c_str() ) : NULL; - if (!p) - { - return false; - } - xmlFree(p); - return true; -} - - -xmlNodePtr XmlNode::GetChildrenNode() const -{ - m_current = m_current ? m_current -> xmlChildrenNode : NULL; - return m_current; -} - - -xmlNodePtr XmlNode::GetNextNode() const -{ - do - { - m_current = m_current ? m_current -> next : NULL; - } while (m_current && xmlIsBlankNode( m_current )); - return m_current; -} - - -const std::string& XmlNode::GetNodeName() const -{ - if (m_current) - { - m_current_name = Utility::FromUtf8((char *)m_current -> name); - } - else - { - m_current_name = ""; - } - return m_current_name; -} - - -const std::string& XmlNode::GetContent() const -{ - m_content = ""; - if (m_current) - { - xmlNodePtr p = m_current; - xmlNodePtr p2 = GetChildrenNode(); - if (p2 && p2 -> content) - { - m_content = Utility::FromUtf8((char *)p2 -> content); - } - SetCurrent(p); - } - return m_content; -} - - -xmlNsPtr XmlNode::GetNodeNs() const -{ - if (m_current) - return m_current -> ns; - return NULL; -} - - -const std::string& XmlNode::GetNodeNsPrefix() const -{ - if (m_current && m_current -> ns && m_current -> ns -> prefix) - { - m_ns_prefix = Utility::FromUtf8((char *)m_current -> ns -> prefix); - } - else - { - m_ns_prefix = ""; - } - return m_ns_prefix; -} - - -const std::string& XmlNode::GetNodeNsHref() const -{ - if (m_current && m_current -> ns && m_current -> ns -> href) - { - m_ns_href = Utility::FromUtf8((char *)m_current -> ns -> href); - } - else - { - m_ns_href = ""; - } - return m_ns_href; -} - - -xmlNodePtr XmlNode::GetFirstElement(const std::string& name) const -{ - if (m_lookup_name.empty()) - m_lookup_name = name; - GetRootElement(); - xmlNodePtr p = GetChildrenNode(); - while (p) - { - if (name == GetNodeName()) - { - return p; - } - p = GetNextNode(); - } - return NULL; -} - - -xmlNodePtr XmlNode::GetFirstElement(xmlNodePtr base,const std::string& name) const -{ - if (m_lookup_name.empty()) - m_lookup_name = name; - SetCurrent(base); - xmlNodePtr p = GetChildrenNode(); - while (p) - { - if (name == GetNodeName()) - { - return p; - } - p = GetNextNode(); - } - return NULL; -} - - -xmlNodePtr XmlNode::GetNextElement(xmlNodePtr p,const std::string& name) const -{ - SetCurrent(p); - p = GetNextNode(); - while (p) - { - if (name == GetNodeName()) - { - return p; - } - p = GetNextNode(); - } - return NULL; -} - - -XmlNode::operator xmlNodePtr() const -{ - return m_current; -} - - -XmlNode XmlNode::operator[](const std::string& name) const -{ - xmlNodePtr p0 = m_current; - xmlNodePtr p = GetFirstElement( m_current, name ); - SetCurrent( p0 ); - if (p) - return XmlNode( m_doc, p ); - throw XmlException("Didn't find node: " + name); -} - - -bool XmlNode::Exists(const std::string& name) const -{ - xmlNodePtr p0 = m_current; - xmlNodePtr p = GetFirstElement( m_current, name ); - SetCurrent( p0 ); - if (p) - return true; - return false; -} - - -void XmlNode::operator++() const -{ - GetNextNode(); - while (m_current) - { - if (m_lookup_name == GetNodeName()) - { - return; - } - GetNextNode(); - } -} - - -std::map XmlNode::GetNsMap() const -{ - xmlNsPtr *p = xmlGetNsList(m_doc, m_current); - std::map vec; - int i = 0; - while (p[i]) - { - std::string href = Utility::FromUtf8((char *)p[i] -> href); - std::string prefix = p[i] -> prefix ? Utility::FromUtf8((char *)p[i] -> prefix) : ""; - vec[prefix] = href; - ++i; - } - return vec; -} - - -std::map XmlNode::GetNsMapRe() const -{ - xmlNsPtr *p = xmlGetNsList(m_doc, m_current); - std::map vec; - int i = 0; - while (p[i]) - { - std::string href = Utility::FromUtf8((char *)p[i] -> href); - std::string prefix = p[i] -> prefix ? Utility::FromUtf8((char *)p[i] -> prefix) : ""; - vec[href] = prefix; - if (!p[i] -> next) - break; - ++i; - } - return vec; -} - - -const std::string XmlNode::FindProperty(const std::string& propname, bool climb) const -{ - while (m_current) - { - if (PropertyExists(propname)) - { - return GetProperty(propname); - } - if (!climb) - { - break; - } - m_current = m_current -> parent; - } - return ""; -} - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_XML diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.h deleted file mode 100755 index 2e78485de9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - ** \file XmlNode.h - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _XmlNode_H -#define _XmlNode_H - -#include "sockets-config.h" - -#ifdef ENABLE_XML - -#include -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -namespace Xml -{ - -class XmlDocument; - -class XmlNode -{ -public: - XmlNode() {} - XmlNode(XmlDocument&); - XmlNode(XmlDocument&, const std::string& nodepath); - XmlNode(const XmlNode&, const std::string& nodepath); - XmlNode(xmlDocPtr, xmlNodePtr ptr); - XmlNode(XmlDocument&, xmlNodePtr ptr); - ~XmlNode(); - - operator xmlNodePtr() const; - XmlNode operator[](const std::string& name) const; - operator std::string() const { - return GetContent(); - } - void operator++() const; - - xmlDocPtr GetDocument() const { - return m_doc; - } - - bool Valid() const { - return m_current ? true : false; - } - - /** Assign document root element to 'current node'. - \return Current Node */ - xmlNodePtr GetRootElement() const; - - /** Return property 'propname' for 'current node'. */ - std::string GetProperty(const std::string& propname) const; - bool PropertyExists(const std::string& propname) const; - - /** Assign first child node of 'current node' to 'current node'. - \return Current Node */ - xmlNodePtr GetChildrenNode() const; - - /** Assign next non-blank (xmlIsBlankNode) node of 'current node' to 'current node'. - \return Current Node */ - xmlNodePtr GetNextNode() const; - - /** Return nodename of 'current node'. */ - const std::string& GetNodeName() const; - /** Return content of 'current node'. */ - const std::string& GetContent() const; - - /** Sets 'current node' that the following methods act on: - GetProperty - GetNodeName - GetContent - GetNodeNs - GetNodeNsPrefix - GetNodeNsHref - */ - void SetCurrent(xmlNodePtr p) const { - m_current = p; - } - - /** \return Namespace of 'current node'. */ - xmlNsPtr GetNodeNs() const; - /** \return Namespace prefix of 'current node'. */ - const std::string& GetNodeNsPrefix() const; - /** \return Namespace href of 'current node'. */ - const std::string& GetNodeNsHref() const; - - /** Search element named 'name' in Root element child nodes. - Set 'current node' to Root element. */ - xmlNodePtr GetFirstElement(const std::string& name) const; - - /** Search element named 'name' in 'parent' element child nodes. - Set 'current node' to 'parent'. */ - xmlNodePtr GetFirstElement(xmlNodePtr parent,const std::string& name) const; - - /** Find next element named 'name' on same level as 'node'. - Set 'current node' to 'p'. */ - xmlNodePtr GetNextElement(xmlNodePtr node,const std::string& name) const; - - /** Check that child element with name 'name' exists. */ - bool Exists(const std::string& name) const; - - /** [prefix] = href */ - std::map GetNsMap() const; - - /** [href] = prefix */ - std::map GetNsMapRe() const; - - const std::string FindProperty(const std::string& propname, bool climb = false) const; - -private: - xmlDocPtr m_doc; - mutable xmlNodePtr m_current; - mutable std::string m_current_name; - mutable std::string m_ns_prefix; - mutable std::string m_ns_href; - mutable std::string m_content; - mutable std::string m_lookup_name; -}; - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_XML -#endif // _XmlNode_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ajp13.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ajp13.h deleted file mode 100755 index d60fe4786d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ajp13.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - ** \file ajp13.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_Ajp13_H -#define _SOCKETS_Ajp13_H - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#define HTTP_REQUEST_ACCEPT 0xa001 -#define HTTP_REQUEST_ACCEPT_CHARSET 0xa002 -#define HTTP_REQUEST_ACCEPT_ENCODING 0xa003 -#define HTTP_REQUEST_ACCEPT_LANGUAGE 0xa004 -#define HTTP_REQUEST_AUTHORIZATION 0xa005 -#define HTTP_REQUEST_CONNECTION 0xa006 -#define HTTP_REQUEST_CONTENT_TYPE 0xa007 -#define HTTP_REQUEST_CONTENT_LENGTH 0xa008 -#define HTTP_REQUEST_COOKIE 0xa009 -#define HTTP_REQUEST_COOKIE2 0xa00a -#define HTTP_REQUEST_HOST 0xa00b -#define HTTP_REQUEST_PRAGMA 0xa00c -#define HTTP_REQUEST_REFERER 0xa00d -#define HTTP_REQUEST_USER_AGENT 0xa00e - -#define HTTP_METHOD_OPTIONS 1 -#define HTTP_METHOD_GET 2 -#define HTTP_METHOD_HEAD 3 -#define HTTP_METHOD_POST 4 -#define HTTP_METHOD_PUT 5 -#define HTTP_METHOD_DELETE 6 -#define HTTP_METHOD_TRACE 7 -#define HTTP_METHOD_PROPFIND 8 -#define HTTP_METHOD_PROPPATCH 9 -#define HTTP_METHOD_MKCOL 10 -#define HTTP_METHOD_COPY 11 -#define HTTP_METHOD_MOVE 12 -#define HTTP_METHOD_LOCK 13 -#define HTTP_METHOD_UNLOCK 14 -#define HTTP_METHOD_ACL 15 -#define HTTP_METHOD_REPORT 16 -#define HTTP_METHOD_VERSION_CONTROL 17 // with a dash "VERSION-CONTROL" -#define HTTP_METHOD_CHECKIN 18 -#define HTTP_METHOD_CHECKOUT 19 -#define HTTP_METHOD_UNCHECKOUT 20 -#define HTTP_METHOD_SEARCH 21 -#define HTTP_METHOD_MKWORKSPACE 22 -#define HTTP_METHOD_UPDATE 23 -#define HTTP_METHOD_LABEL 24 -#define HTTP_METHOD_MERGE 25 -#define HTTP_METHOD_BASELINE_CONTROL 26 -#define HTTP_METHOD_MKACTIVITY 27 - -#define ATTR_CONTEXT 1 -#define ATTR_SERVLET_PATH 2 -#define ATTR_REMOTE_USER 3 -#define ATTR_AUTH_TYPE 4 -#define ATTR_QUERY_STRING 5 -#define ATTR_ROUTE 6 -#define ATTR_SSL_CERT 7 -#define ATTR_SSL_CIPHER 8 -#define ATTR_SSL_SESSION 9 -#define ATTR_SSL_KEY_SIZE 11 -#define ATTR_SECRET 12 -#define ATTR_STORED_METHOD 13 - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_Ajp13_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/gpl.txt b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/gpl.txt deleted file mode 100755 index 5b6e7c66c2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/gpl.txt +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/mkdot.sh b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/mkdot.sh deleted file mode 100755 index 9999aff0f6..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/mkdot.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -PROJECT_DIR=/usr/local/apache/www.alhem.net/htdocs/Sockets -PROJECT_NAME=sockets -/usr/local/bin/dp \ - -D_RUN_DP \ - -DUSE_SCTP -D_THREADSAFE_SOCKETS \ - -DHAVE_OPENSSL -DENABLE_POOL -DENABLE_RECONNECT -DENABLE_SOCKS4 \ - -DENABLE_IPV6 -DENABLE_DETACH -DENABLE_RESOLVER -DENABLE_TRIGGERS \ - -DENABLE_XML \ - -fontsize 12 \ - -lr -dot -cluster | grep -v std > x.dot -dot -Tpng -o $PROJECT_DIR/sockets.png x.dot -dot -Tcmapx -o $PROJECT_DIR/sockets.cmap x.dot -/usr/local/bin/mkjs $PROJECT_DIR/$PROJECT_NAME.cmap > $PROJECT_DIR/$PROJECT_NAME.js diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc deleted file mode 100755 index 51f6953f2d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libSockets -Description: C++ Sockets Library -Version: 2.3.9.4 -Requires: libxml-2.0, libssl -Libs: -L${libdir} -lSockets -Libs.private: -lpthread -Cflags: -I${includedir} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc.IN b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc.IN deleted file mode 100755 index 05b625f55f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc.IN +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: lib%NAME% -Description: C++ Sockets Library -Version: %VERSION% -Requires: libxml-2.0, libssl -Libs: -L${libdir} -l%NAME% -Libs.private: -lpthread -Cflags: -I${includedir} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc deleted file mode 100755 index d4db1c93c9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libsockets2 -Description: C++ Sockets Library -Version: 2.3.9.4 -Requires: -Libs: -L${libdir} -lSockets -Libs.private: -lssl -lcrypto -lxml2 -lpthread -Cflags: -I${includedir} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc.IN b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc.IN deleted file mode 100755 index aa7af6b57b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc.IN +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libsockets2 -Description: C++ Sockets Library -Version: %VERSION% -Requires: -Libs: -L${libdir} -l%NAME% -Libs.private: -lssl -lcrypto -lxml2 -lpthread -Cflags: -I${includedir} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.cpp deleted file mode 100755 index c608238207..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/** \file socket_include.cpp - ** \date 2004-11-28 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include -#include "socket_include.h" - -// only to be included in win32 projects -const char *StrError(int x) -{ -static char tmp[100]; - switch (x) - { - case 10004: return "Interrupted function call."; - case 10013: return "Permission denied."; - case 10014: return "Bad address."; - case 10022: return "Invalid argument."; - case 10024: return "Too many open files."; - case 10035: return "Resource temporarily unavailable."; - case 10036: return "Operation now in progress."; - case 10037: return "Operation already in progress."; - case 10038: return "Socket operation on nonsocket."; - case 10039: return "Destination address required."; - case 10040: return "Message too long."; - case 10041: return "Protocol wrong type for socket."; - case 10042: return "Bad protocol option."; - case 10043: return "Protocol not supported."; - case 10044: return "Socket type not supported."; - case 10045: return "Operation not supported."; - case 10046: return "Protocol family not supported."; - case 10047: return "Address family not supported by protocol family."; - case 10048: return "Address already in use."; - case 10049: return "Cannot assign requested address."; - case 10050: return "Network is down."; - case 10051: return "Network is unreachable."; - case 10052: return "Network dropped connection on reset."; - case 10053: return "Software caused connection abort."; - case 10054: return "Connection reset by peer."; - case 10055: return "No buffer space available."; - case 10056: return "Socket is already connected."; - case 10057: return "Socket is not connected."; - case 10058: return "Cannot send after socket shutdown."; - case 10060: return "Connection timed out."; - case 10061: return "Connection refused."; - case 10064: return "Host is down."; - case 10065: return "No route to host."; - case 10067: return "Too many processes."; - case 10091: return "Network subsystem is unavailable."; - case 10092: return "Winsock.dll version out of range."; - case 10093: return "Successful WSAStartup not yet performed."; - case 10101: return "Graceful shutdown in progress."; - case 10109: return "Class type not found."; - case 11001: return "Host not found."; - case 11002: return "Nonauthoritative host not found."; - case 11003: return "This is a nonrecoverable error."; - case 11004: return "Valid name, no data record of requested type."; - - default: - break; - } - snprintf(tmp, sizeof(tmp), "Winsock error code: %d", x); - return tmp; -} - - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.h deleted file mode 100755 index 2660230670..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.h +++ /dev/null @@ -1,305 +0,0 @@ -/** \file socket_include.h - ** \date 2005-04-12 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_socket_include_H -#define _SOCKETS_socket_include_H -#include "sockets-config.h" - -#ifdef _MSC_VER -#pragma warning(disable:4514) -#endif - -// common defines affecting library and applications using library - -/* Define SOCKETS_DYNAMIC_TEMP to use dynamically allocated buffers - in read operations - helps on ECOS */ -#define SOCKETS_DYNAMIC_TEMP - -/** define type to uniquely identify a socket instance. */ -typedef unsigned long socketuid_t; - -// platform specific stuff -#if (defined(__unix__) || defined(unix)) && !defined(USG) -#include -#endif -#include - -// int64 -#ifdef _WIN32 -typedef unsigned __int64 uint64_t; -#else -#include -#ifdef SOLARIS -# include -#else -# include -#endif -#endif - -#ifndef _WIN32 -// ---------------------------------------- -// common unix includes / defines -#include -#include -#include -#include -#include - -// all typedefs in this file will be declared outside the sockets namespace, -// because some os's will already have one or more of the type defined. -typedef int SOCKET; -#define Errno errno -#define StrError strerror - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -// WIN32 adapt -#define closesocket close -#define INVALID_SOCKET -1 -#define SOCKET_ERROR -1 - -#ifndef INADDR_NONE -#define INADDR_NONE ((unsigned long) -1) -#endif // INADDR_NONE - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // !_WIN32 - - -// ---------------------------------------- -// Generic -#ifndef SOL_IP -#define SOL_IP IPPROTO_IP -#endif - - -// ---------------------------------------- -// OS specific adaptions - -#ifdef SOLARIS -// ---------------------------------------- -// Solaris -typedef unsigned short port_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#define s6_addr16 _S6_un._S6_u8 -#define MSG_NOSIGNAL 0 - -#elif defined __FreeBSD__ -// ---------------------------------------- -// FreeBSD -# if __FreeBSD_version >= 400014 -# define s6_addr16 __u6_addr.__u6_addr16 -# if !defined(MSG_NOSIGNAL) -# define MSG_NOSIGNAL 0 -# endif -# include -typedef in_addr_t ipaddr_t; -typedef in_port_t port_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - -# define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP -# define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP -# else -# error FreeBSD versions prior to 400014 does not support ipv6 -# endif - -#elif defined MACOSX -// ---------------------------------------- -// Mac OS X -//#include -#ifdef __DARWIN_UNIX03 -typedef unsigned short port_t; -#else -#include -#endif // __DARWIN_UNIX03 -typedef unsigned long ipaddr_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#define s6_addr16 __u6_addr.__u6_addr16 -#define MSG_NOSIGNAL 0 // oops - thanks Derek -#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP -#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP - -#elif defined _WIN32 -// ---------------------------------------- -// Win32 -#ifdef _MSC_VER -#pragma comment(lib, "wsock32.lib") -#endif -#define strcasecmp _stricmp -#ifndef __CYGWIN__ -#define snprintf sprintf_s -#define vsnprintf vsprintf_s -#endif - -typedef unsigned long ipaddr_t; -typedef unsigned short port_t; -typedef int socklen_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - -// 1.8.6: define FD_SETSIZE to something bigger than 64 if there are a lot of -// simultaneous connections (must be done before including winsock.h) -//#define FD_SETSIZE 1024 - -// windows 2000 with ipv6 preview installed: -// http://msdn.microsoft.com/downloads/sdks/platform/tpipv6.asp -// see the FAQ on how to install -#define WIN32_LEAN_AND_MEAN -#include -#include -#if _MSC_VER < 1200 -#ifndef __CYGWIN__ -#ifdef ENABLE_IPV6 -#include // For IPv6 Tech Preview. -#endif -#endif -#endif // _MSC_VER < 1200 - - -#define MSG_NOSIGNAL 0 -//#define SHUT_RDWR 2 -#define SHUT_WR 1 - -#define Errno WSAGetLastError() -const char *StrError(int x); - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -// class WSAInitializer is a part of the Socket class (on win32) -// as a static instance - so whenever an application uses a Socket, -// winsock is initialized -class WSAInitializer // Winsock Initializer -{ -public: - WSAInitializer() { - if (WSAStartup(0x101,&m_wsadata)) { - exit(-1); - } - } - ~WSAInitializer() { - WSACleanup(); - } -private: - WSADATA m_wsadata; -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#else -// ---------------------------------------- -// LINUX -typedef unsigned long ipaddr_t; -typedef unsigned short port_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - - -#endif - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -/** List type containing file descriptors. */ -typedef std::list socket_v; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - -// getaddrinfo / getnameinfo replacements -#ifdef NO_GETADDRINFO -#ifndef AI_NUMERICHOST -#define AI_NUMERICHOST 1 -#endif -#ifndef NI_NUMERICHOST -#define NI_NUMERICHOST 1 -#endif -#endif - - -#endif // _SOCKETS_socket_include_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/sockets-config.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/sockets-config.h deleted file mode 100755 index f85272ff90..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/sockets-config.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - ** \file sockets-config.h - ** \date 2007-04-14 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifndef _SOCKETS_CONFIG_H -#define _SOCKETS_CONFIG_H - -/* Limits */ -#define TCP_LINE_SIZE 8192 -#define MAX_HTTP_HEADER_COUNT 200 - -#ifndef _RUN_DP -/* First undefine symbols if already defined. */ -#undef HAVE_OPENSSL -#undef ENABLE_IPV6 -#undef USE_SCTP -#undef NO_GETADDRINFO -#undef ENABLE_POOL -#undef ENABLE_SOCKS4 -#undef ENABLE_RESOLVER -#undef ENABLE_RECONNECT -#undef ENABLE_DETACH -#undef ENABLE_EXCEPTIONS -#undef ENABLE_XML -#endif // _RUN_DP - - -/* OpenSSL support. */ -//#define HAVE_OPENSSL - - -/* Ipv6 support. */ -#define ENABLE_IPV6 - - -/* SCTP support. */ -//#define USE_SCTP - - -/* Define NO_GETADDRINFO if your operating system does not support - the "getaddrinfo" and "getnameinfo" function calls. */ -#define NO_GETADDRINFO - - -/* Connection pool support. */ -//#define ENABLE_POOL - - -/* Socks4 client support. */ -//#define ENABLE_SOCKS4 - - -/* Asynchronous resolver. */ -#define ENABLE_RESOLVER - - -/* Enable TCP reconnect on lost connection. - Socket::OnReconnect - Socket::OnDisconnect -*/ -#define ENABLE_RECONNECT - - -/* Enable socket thread detach functionality. */ -#define ENABLE_DETACH - - -/* Enabled exceptions. */ -#define ENABLE_EXCEPTIONS - - -/* XML classes. */ -//#define ENABLE_XML - - -/* Resolver uses the detach function so either enable both or disable both. */ -#ifndef ENABLE_DETACH -#undef ENABLE_RESOLVER -#endif - - -#endif // _SOCKETS_CONFIG_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/Makefile b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/Makefile deleted file mode 100755 index f3b8904287..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -SOCKETS = .. -PLATFORM = linux-x86-32 -LIBS = -#-L$(SOCKETS) -lSockets - -INCLUDE = -I$(SOCKETS) -include $(SOCKETS)/Makefile.version -include $(SOCKETS)/Makefile.Defines.$(PLATFORM) - -CPPFLAGS = $(CFLAGS) - -#LIBS += -lsctp - -LDFLAGS += -rdynamic - -PROGS = events resolve sockets_test base64 semtest \ - echoserver stressclient http httpd retry resume \ - http_post x copy crlf https sloppy_http chunked \ - threadstress listener httpd_test scanr json - -all: $(PROGS) - -events: events.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -resolve: resolve.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -sockets_test: sockets_test.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -base64: base64.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -semtest: semtest.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -echoserver: echoserver.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -stressclient: stressclient.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -http: http.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -httpd: httpd.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -retry: retry.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -resume: resume.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -http_post: http_post.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -x: x.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -copy: copy.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -crlf: crlf.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -https: https.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -sloppy_http: sloppy_http.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -chunked: chunked.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -threadstress: threadstress.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -listener: listener.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -scanr: scanr.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -httpd_test: httpd_test.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -json: json.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -clean: - rm -f *.o *~ slask *.d $(PROGS) - --include *.d diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/base64.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/base64.cpp deleted file mode 100755 index b7e5456a9f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/base64.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include - -#include "Base64.h" - - -int main(int argc,char *argv[]) -{ - if (argc < 2) - return -1; - std::string str; - std::string str2; - Base64 b; - if (!strcmp(argv[1],"-file")) - { - if (argc < 3) - return -2; - FILE *fil; - if ((fil = fopen(argv[2],"rt")) != NULL) - { - b.encode(fil, str); - fclose(fil); - } - printf("File:\n%s\n--End of File\n",str.c_str()); - b.decode(str, str2); - printf("Content:\n%s\n--End of Content\n",str2.c_str()); - } - else - { - b.encode(argv[1], strlen(argv[1]), str); - printf("'%s' ==> '%s'",argv[1], str.c_str()); - b.decode(str, str2); - printf(" ==> '%s'\n",str2.c_str()); - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/chunked.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/chunked.cpp deleted file mode 100755 index 32d6189d52..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/chunked.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include -#include - - -class Server : public TcpSocket -{ -public: - Server(ISocketHandler& h) : TcpSocket(h), m_header(true) { - SetLineProtocol(); - } - - void OnLine(const std::string& line) { - if (m_header && line.empty()) - { - m_header = false; - Send("HTTP/1.1 200 OK\r\n" -// "Server: Microsoft-IIS/5.0\r\n" -// "Date: Mon, 15 Aug 2005 11:39:18 GMT\r\n" - "Content-Type: text/html\r\n" -// "Set-Cookie: ASPSESSIONIDASTATTTA=PIMPPEJBIMEGJLHOBNPHMIDC; path=/\r\n" -// "Cache-control: private\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "0\r\n" - "\r\n"); - } - } - -private: - bool m_header; -}; - - -int main() -{ - SocketHandler h; - ListenSocket l(h); - try - { - l.Bind(12345); - h.Add(&l); - while (true) - { - h.Select(1, 0); - } - } - catch (const Exception& e) - { - std::cout << e.ToString() << std::endl; - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/copy.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/copy.cpp deleted file mode 100755 index 2134ac26a2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/copy.cpp +++ /dev/null @@ -1,264 +0,0 @@ -#include -#include -#include -#include - -#define BUFSZ 7024 - -#ifdef _WIN32 -#define MIN(a,b) (a 0 && GetOutputLength() < lim) - { - SendBuf(buf, n); - m_sz -= n; - n = MIN(m_sz, BUFSZ); - } - if (!n) - { - SetCloseAndDelete(); - } - else - { - SendBuf(buf, n); - m_sz -= n; - } - return; - } - size_t x = 0; - for (size_t i = 0; i < m_filename.size(); i++) - if (m_filename[i] == '/') - x = i + 1; - Send(m_filename.substr(x) + "\n"); - m_fil = fopen(m_filename.c_str(), "rb"); - if (m_fil) - { - char buf[BUFSZ]; - int n = fread(buf, 1, BUFSZ, m_fil); - while (n > 0 && GetOutputLength() < lim) - { - SendBuf(buf, n); - n = fread(buf, 1, BUFSZ, m_fil); - } - if (!n) - { - SetCloseAndDelete(); - fclose(m_fil); - m_fil = NULL; - } - else - { - SendBuf(buf, n); - } - } - } - - void OnWriteComplete() { - } - - void OnTransferLimit() { - if (!m_filename.size()) - { - char buf[BUFSZ]; - int n = MIN(m_sz, BUFSZ); - while (n > 0 && GetOutputLength() < lim) - { - SendBuf(buf, n); - m_sz -= n; - n = MIN(m_sz, BUFSZ); - } - if (!n) - { - SetCloseAndDelete(); - } - else - { - SendBuf(buf, n); - m_sz -= n; - } - return; - } - if (m_fil) - { - char buf[BUFSZ]; - int n = fread(buf, 1, BUFSZ, m_fil); - while (n > 0 && GetOutputLength() < lim) - { - SendBuf(buf, n); - n = fread(buf, 1, BUFSZ, m_fil); - } - if (!n) - { - SetCloseAndDelete(); - fclose(m_fil); - m_fil = NULL; - } - else - { - SendBuf(buf, n); - } - } - } - - void OnAccept() { - Utility::GetTime(&m_start); - m_b_server = true; - SetLineProtocol(); - DisableInputBuffer(); - } - - void OnLine(const std::string& line) { - if (line.size()) - m_out = fopen(line.c_str(), "wb"); - SetLineProtocol(false); - DisableInputBuffer(); - } - - void OnDelete() { - struct timeval stop; - Utility::GetTime(&stop); - stop.tv_sec -= m_start.tv_sec; - stop.tv_usec -= m_start.tv_usec; - if (stop.tv_usec < 0) - { - stop.tv_usec += 1000000; - stop.tv_sec -= 1; - } - double t = stop.tv_usec; - t /= 1000000; - t += stop.tv_sec; - printf("OnDelete: %s\n", m_b_server ? "SERVER" : "CLIENT"); - printf(" Time: %ld.%06ld (%f)\n", stop.tv_sec, stop.tv_usec, t); - double r = GetBytesReceived(); - printf(" bytes in: %lld (%f Mbytes/sec)\n", GetBytesReceived(), r / t / 1000000); - double s = GetBytesSent(); - printf(" bytes out: %lld (%f Mbytes/sec)\n", GetBytesSent(), s / t / 1000000); - printf("\n"); - if (m_out) - fclose(m_out); - } - - void OnRawData(const char *buf, size_t len) { - if (m_out) - fwrite(buf, 1, len, m_out); - } - -private: - std::string m_filename; - FILE *m_fil; - FILE *m_out; - bool m_b_server; - struct timeval m_start; - size_t m_sz; -}; - - -int main(int argc, char *argv[]) -{ - std::string host = "127.0.0.1"; - int port = 12344; - std::list filenames; - - for (int i = 1; i < argc; i++) - { - if (!strcmp(argv[i], "-host") && i < argc - 1) - host = argv[++i]; - else - if (!strcmp(argv[i], "-port") && i < argc - 1) - port = atoi(argv[++i]); - else - if (!strcmp(argv[i], "-h")) - { - fprintf(stderr, "Usage: %s [-host ] [-port ] []\n", *argv); - fprintf(stderr, " Will run as host only if isn't specified.\n"); - fprintf(stderr, " host default: 127.0.0.1\n"); - fprintf(stderr, " port default: 12344\n"); - return 0; - } - else - { - filenames.push_back( argv[i] ); - } - } - - try - { - SocketHandler h; - ListenSocket l(h); - if (filenames.empty()) - { - if (l.Bind( port ) != 0) - { - fprintf(stderr, "Bind() port %d failed - exiting\n", port); - return -1; - } - h.Add(&l); - } - for (std::list::iterator it = filenames.begin(); it != filenames.end(); it++) - { - std::string filename = *it; - size_t sz = atol(filename.c_str()); - if (sz) - { - CopySocket *sock = new CopySocket(h, sz); - sock -> SetDeleteByHandler(); - sock -> Open(host, port); - h.Add(sock); - } - else - { - CopySocket *sock = new CopySocket(h, filename); - sock -> SetDeleteByHandler(); - sock -> Open(host, port); - h.Add(sock); - } - } - if (!filenames.size()) - { - fprintf(stderr, "Starting as server only, listening on port %d\n", port); - quit++; - } - while (quit > 0) - { - h.Select(5, 0); - } - return 0; - } - catch (const Exception& e) - { - printf("%s\n", e.ToString().c_str()); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/crlf.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/crlf.cpp deleted file mode 100755 index 34500c48cb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/crlf.cpp +++ /dev/null @@ -1,139 +0,0 @@ -#include -#include -#include - - -static bool quit = false; - - -class IOSocket : public TcpSocket -{ -public: - IOSocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); - } - ~IOSocket() {} - - void OnConnect() { - Utility::GetTime(&m_start); - while (GetOutputLength() < 500000) - { - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - } -// Send("\r\n"); - } - - void OnAccept() { - SetLineProtocol(); - } - - void OnDelete() { - printf("OnDelete\n"); - } - - void OnWriteComplete() { -printf("OnWriteComplete\n"); - struct timeval tv; - Utility::GetTime(&tv); - - tv.tv_sec -= m_start.tv_sec; - tv.tv_usec -= m_start.tv_usec; - Utility::GetTime(&m_start); - if (tv.tv_usec < 0) - { - tv.tv_usec += 1000000; - tv.tv_sec -= 1; - } - double t = tv.tv_usec; - t /= 1000000; - t += tv.tv_sec; - printf(" Time: %ld.%06ld (%f)\n", tv.tv_sec, tv.tv_usec, t); - double r = GetBytesReceived(); - printf(" bytes in: %lld (%f Mbytes/sec)\n", GetBytesReceived(true), r / t / 1000000); - double s = GetBytesSent(); - printf(" bytes out: %lld (%f Mbytes/sec)\n", GetBytesSent(true), s / t / 1000000); - printf("\n"); - - while (GetOutputLength() < 500000) - { - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - } -// Send("\r\n"); - } - - void OnLine(const std::string& line) { - if (line == "") - { - struct timeval tv; - Utility::GetTime(&tv); - - tv.tv_sec -= m_start.tv_sec; - tv.tv_usec -= m_start.tv_usec; - Utility::GetTime(&m_start); - if (tv.tv_usec < 0) - { - tv.tv_usec += 1000000; - tv.tv_sec -= 1; - } - double t = tv.tv_usec; - t /= 1000000; - t += tv.tv_sec; - printf(" Time: %ld.%06ld (%f)\n", tv.tv_sec, tv.tv_usec, t); - double r = GetBytesReceived(); - printf(" bytes in: %lld (%f Mbytes/sec)\n", GetBytesReceived(true), r / t / 1000000); - double s = GetBytesSent(); - printf(" bytes out: %lld (%f Mbytes/sec)\n", GetBytesSent(true), s / t / 1000000); - printf("\n"); - - } - else - if (line != "zzzzzzzzzmmmmmmmmm1234lkkk54" && - line != "zzzzzzzzzmmmmmmmmm1234lkkk543") - { -printf("\n-------------------------------------------------------\n"); - for (size_t i = 0; i < line.size(); i++) - if (!isprint(line[i])) - printf("<%d>", line[i]); - else - printf("%c", line[i]); - printf("\n"); -fflush(stdout); -exit(-1); - quit = true; - } - } - - struct timeval m_start; -}; - - -int main(int argc, char *argv[]) -{ - SocketHandler h; - ListenSocket l(h); - l.Bind(12344); - h.Add(&l); - IOSocket sock(h); - sock.Open("192.168.7.4", 12344); - h.Add(&sock); - while (!quit) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/echoserver.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/echoserver.cpp deleted file mode 100755 index 35c23d0636..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/echoserver.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/** - ** \file echoserver.cpp - ** \date 2006-10-02 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif -#include -#include -#include -#include -#ifndef _WIN32 -#include -#endif -#include - - -#ifdef ENABLE_DETACH -static bool g_b_detach = false; -#endif -#ifdef HAVE_OPENSSL -static bool g_b_ssl = false; -#endif -static std::string gFilename = "server.pem"; -static std::string gPw; -static bool quit = false; -static bool g_b_http = false; -static bool g_b_nobuf = false; -#ifdef ENABLE_DETACH -static bool g_b_detach2 = false; -#endif - -#define DEB(x) - - -class MySocket : public TcpSocket -{ -public: - MySocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); -#ifdef HAVE_OPENSSL - if (g_b_ssl) - EnableSSL(); -#endif - if (g_b_nobuf) - DisableInputBuffer(); - } - ~MySocket() { - } - - void OnAccept() { -#ifdef ENABLE_DETACH - if (g_b_detach) - { - if (!Detach()) - fprintf(stderr, "\nDetach failed\n"); - } -#endif - } - - void OnRawData(const char *buf,size_t len) { - if (g_b_nobuf) - { - SendBuf(buf, len); - } - } - - void OnLine(const std::string& line) { -#ifdef ENABLE_DETACH - if (g_b_detach2 && !IsDetach()) - { - m_line = line; - if (!Detach()) - { - fprintf(stderr, "\nDetach failed\n"); - } - return; - } -DEB(printf("fd %d OnLine; %s\n", GetSocket(), Handler().IsSlave() ? "slave" : "master");) -#endif - Send(line + "\n"); - } - - void OnDetached() { -DEB(printf("fd %d OnDetached; %s\n", GetSocket(), Handler().IsSlave() ? "slave" : "master");) -// fprintf(stderr, "-"); -// fflush(stderr); -#ifdef ENABLE_DETACH - if (g_b_detach2) - { - Send(m_line + "\n"); - } -#endif - } - -#ifdef HAVE_OPENSSL - void InitSSLServer() { - InitializeContext("echoserver", gFilename, gPw, SSLv23_method()); - } -#endif - -private: - std::string m_line; -}; - - -#ifndef _WIN32 -void sigint(int) -{ - quit = true; -} -#endif - -int main(int argc,char *argv[]) -{ -#ifndef _WIN32 - signal(SIGPIPE, SIG_IGN); - signal(SIGINT, sigint); -#endif - port_t port = 2222; - bool enableLog = false; - int queue = 20; - for (int i = 1; i < argc; i++) - { -#ifdef ENABLE_DETACH - if (!strcmp(argv[i], "-detach")) - g_b_detach = true; - if (!strcmp(argv[i], "-detach2")) - g_b_detach2 = true; -#endif -#ifdef HAVE_OPENSSL - if (!strcmp(argv[i], "-ssl")) - g_b_ssl = true; - if (!strcmp(argv[i], "-file") && i < argc - 1) - gFilename = argv[++i]; -#endif - if (!strcmp(argv[i], "-port") && i < argc - 1) - port = atoi(argv[++i]); - if (!strcmp(argv[i], "-pw") && i < argc - 1) - gPw = argv[++i]; - if (!strcmp(argv[i], "-log")) - enableLog = true; - if (!strcmp(argv[i], "-queue") && i < argc - 1) - queue = atoi(argv[++i]); - if (!strcmp(argv[i], "-http")) - g_b_http = true; - if (!strcmp(argv[i], "-nobuf")) - g_b_nobuf = true; - if (!strcmp(argv[i], "-h")) - { - printf("Usage: %s [ options ] [-ssl]\n", *argv); - printf(" -port nn listen on port nn\n"); -#ifdef ENABLE_DETACH - printf(" -detach detach each socket on accept\n"); - printf(" -detach2 detach when line received\n"); -#endif -#ifdef HAVE_OPENSSL - printf(" -ssl run as ssl server, .pem file needed\n"); - printf(" -file xx .pem filename, default is \"server.pem\"\n"); -#endif - printf(" -pw xx private key password\n"); - printf(" -log enable sockethandler debug log\n"); - printf(" -queue nn listen queue size (default 20)\n"); - printf(" -http enable http server with dummy response\n"); - printf(" -nobuf echo raw data\n"); - exit(-1); - } - } - if (g_b_http && g_b_nobuf) - { - printf("Nobuf and Http does not work together\n"); - exit(-1); - } - StdoutLog *log = enableLog ? new StdoutLog() : NULL; - SocketHandlerEp h(log); - ListenSocket l(h); - ListenSocket l2(h); - h.SetNumberOfThreads(10); - if (!g_b_http) - { - if (l.Bind(port, queue)) - { - fprintf(stderr, "Bind to port %d failed\n", port); - return -1; - } - fprintf(stderr, "Listening on port %d\n", port); - h.Add(&l); - } - else - { - printf("Enable HttpDebugSocket\n"); - if (l2.Bind(port, queue)) - { - fprintf(stderr, "Bind to port %d failed\n", port); - return -1; - } - fprintf(stderr, "Listening on port %d\n", port); - h.Add(&l2); - } -#ifdef ENABLE_DETACH - if (g_b_detach) - fprintf(stderr, "Will detach each incoming socket\n"); -#endif -#ifdef HAVE_OPENSSL - if (g_b_ssl) - fprintf(stderr, "Using SSL\n"); -#endif - while (!quit) - { - h.Select(1, 0); - } - fprintf(stderr, "\nExiting...\n"); - if (log) - { -// delete log; - } - return 0; -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/events.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/events.cpp deleted file mode 100755 index f92ecd58c8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/events.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - - -double start; - -double gettime() -{ - struct timeval tv; - Utility::GetTime(&tv); - return tv.tv_sec + (double)tv.tv_usec / 1000000; -} - - -class MyEvHandler : public EventHandler -{ -public: - MyEvHandler() : EventHandler() {} - MyEvHandler(StdLog *p) : EventHandler(p) {} - -}; - - -class EvThread : public Thread -{ -public: - EvThread(Socket *p) : m_socket(p) {} - - void Run(); - -private: - Socket *m_socket; -}; - - -class EvSocket : public TcpSocket, public IEventOwner -{ -public: - EvSocket(ISocketHandler& h) : TcpSocket(h) - , IEventOwner( static_cast(h) ) { - } - - void OnEvent(int id) { - std::cout << "OnEvent" << std::endl; - std::cout << gettime() - start << std::endl; - SetCloseAndDelete(); - } - - void OnAccept() { - std::cout << "Incoming" << std::endl; - } - - void OnConnect() { - std::cout << "Connected" << std::endl; - EvThread *thr = new EvThread( this ); - thr -> SetDeleteOnExit(); - } - - void OnDelete() { - std::cout << "EvSocket::OnDelete()" << std::endl; - } -}; - - -void EvThread::Run() -{ - Socket *p0 = (Socket *)m_socket; - EvSocket *p = dynamic_cast(p0); - if (p) - { -#ifdef _WIN32 - Sleep( 5000 ); -#else - sleep(10); -#endif - std::cout << "Add event" << std::endl; - start = gettime(); - p -> AddEvent(1, 50000); - } - else - { - std::cout << "Thread: not an EvSocket" << std::endl; - } -} - - -//------------------------------------------------------------ -// myTimer class -//------------------------------------------------------------ -class myTimer : public IEventOwner -{ -public: - // Prototype of user call back function - typedef void (*myTimer_cb)(myTimer* user_func, void* user_id); - - myTimer(IEventHandler& h, long ssec, long susec, - long psec, long pusec, myTimer_cb func, void* id); - ~myTimer(); - -private: - void OnEvent(int id); - long ssec_; - long susec_; - long psec_; - long pusec_; - myTimer_cb user_func_; - void* user_id_; - bool periodic_; -}; - - -//------------------------------------------------------------ -myTimer::myTimer(IEventHandler& h, long ssec, long susec, - long psec, long pusec, myTimer_cb user_func, - void* user_id) : - IEventOwner(h), - ssec_(ssec), - susec_(susec), - psec_(psec), - pusec_(pusec), - user_func_(user_func), - user_id_(user_id), - periodic_(psec != 0 || pusec != 0) -{ - Debug deb("myTimer()"); - AddEvent(ssec_, susec_); -} - - -//------------------------------------------------------------ -myTimer::~myTimer() -{ - Debug deb("~myTimer()"); - ClearEvents(); -} - - -//------------------------------------------------------------ -void myTimer::OnEvent(int id) -{ - Debug deb("myTimer::OnEvent()"); - if (periodic_) - { - AddEvent(psec_, pusec_); - } - - user_func_(this, user_id_); - - if (!periodic_) - { - delete this; - } -} - - -//------------------------------------------------------------ -static void myfunc(myTimer* t, void* user_id) -{ - Debug deb("myTimer::myfunc()"); - deb << "Event " << ((char*)user_id) << Debug::endl(); -} - - -/* -int main(int argc, char *argv[]) -{ - EventHandler h; - - // Example 1: Create a 2 sec one-shot timer. - // No need to save the pointer as it will delete - // itself upon expiry. - new myTimer(h, 2, 0, 0, 0, myfunc, (void*)"My Timer 0"); - - // Example 2: Create a 1 sec periodic timer. - // Save the pointer because we can stop the timer - // later with a "delete mytimer". - myTimer* mytimer = new myTimer(h, 0, 0, 1, 0, myfunc, - (void*)"My Timer 1"); - - // Drop into the event handler .. - h.EventLoop(); -} -*/ - - -int main(int argc, char *argv[]) -{ - StdoutLog log; - MyEvHandler h(&log); - ListenSocket l(h); - l.Bind("localhost", 12344); - h.Add(&l); - - EvSocket sock(h); - sock.Open("localhost", 12344); - h.Add(&sock); - - // Example 1: Create a 2 sec one-shot timer. - // No need to save the pointer as it will delete - // itself upon expiry. - new myTimer(h, 2, 0, 0, 0, myfunc, (void*)"My Timer 0"); - - // Example 2: Create a 1 sec periodic timer. - // Save the pointer because we can stop the timer - // later with a "delete mytimer". - myTimer* mytimer = new myTimer(h, 0, 0, 1, 0, myfunc, - (void*)"My Timer 1"); - - h.EventLoop(); -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http.cpp deleted file mode 100755 index a15d4dbe1a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include - - -class tSocket : public HTTPSocket -{ -public: - tSocket(ISocketHandler& h, const std::string& host, int port) : HTTPSocket(h), m_host(host) - , m_first(false) - , m_sz(0) { - Open(host, port); - } - - void OnConnect() { - Send("GET /index.html HTTP/1.0\r\n"); - Send("Host: " + m_host + "\r\n"); - Send("\r\n"); - } - void OnDisconnect() { // or OnDelete() - Handler().LogError(this, "Disconnect", 0, "ServerSocket", LOG_LEVEL_INFO); - } - - void OnFirst() { - } - - void OnHeader(const std::string& key, const std::string& value) { - fprintf(stderr, "%s: %s\n", key.c_str(), value.c_str()); - } - - void OnHeaderComplete() { - fprintf(stderr, "\n"); - } - - void OnData(const char *buf, size_t sz) { -printf(" %d bytes\n", sz); - if (1||!m_first) - { - std::string str = buf; - str.resize( sz ); - printf("%s", str.c_str()); - m_first = true; - } - m_sz += sz; - } - - void OnDelete() { - fprintf(stderr, "Content length: %d\n", m_sz); - } - -private: - std::string m_host; - bool m_first; - size_t m_sz; -}; - - -int main(int argc, char *argv[]) -{ - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - int port = argc > 2 ? atoi(argv[2]) : 80; - StdoutLog log; - SocketHandler h(&log); - tSocket sock(h, host, port); - h.Add(&sock); - while (h.GetCount()) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http_post.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http_post.cpp deleted file mode 100755 index 3b0b830281..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http_post.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - - -class sSocket : public HttpdSocket -{ -public: - sSocket(ISocketHandler& h) : HttpdSocket(h) { - } - - void Init() - { - if (GetParent() -> GetPort() == 443 || GetParent() -> GetPort() == 8443) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - fprintf(stderr, "SSL not available\n"); -#endif - } - } - - void Exec() - { - std::string name; - std::string value; - GetForm() -> getfirst(name, value); - while (name.size()) - { -fprintf(stderr, "%s: '%s'\n", name.c_str(), value.c_str()); - GetForm() -> getnext(name, value); - } - CreateHeader(); - GenerateDocument(); - } - - void CreateHeader() - { - SetStatus("200"); - SetStatusText("OK"); -fprintf(stderr, "Uri: '%s'\n", GetUri().c_str()); - { - size_t x = 0; - for (size_t i = 0; i < GetUri().size(); i++) - if (GetUri()[i] == '.') - x = i; - std::string ext = GetUri().substr(x + 1); - if (ext == "gif" || ext == "jpg" || ext == "png") - AddResponseHeader("Content-type", "image/" + ext); - else - AddResponseHeader("Content-type", "text/" + ext); - } - AddResponseHeader("Connection", "close"); - SendResponse(); - } - - void GenerateDocument() - { - Send(""); - SetCloseAndDelete(); - } - -#ifdef HAVE_OPENSSL - void InitSSLServer() - { - InitializeContext("httpd", "comb.pem", "", SSLv23_method()); - } -#endif - -}; - - -int main(int argc, char *argv[]) -{ - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - StdoutLog log; - SocketHandler h(&log); - ListenSocket l(h); - if (l.Bind(1028)) - { - printf("Bind port 1028 failed\n"); - return -1; - } - h.Add(&l); - ListenSocket l2(h); - if (l2.Bind(8443)) - { - printf("Bind port 8443 failed\n"); - return -1; - } - h.Add(&l2); - HttpPostSocket sock(h, "http://localhost:1028/postdata"); - sock.AddField("name", "value"); - sock.Open(); - h.Add(&sock); - while (h.GetCount()) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd.cpp deleted file mode 100755 index e1106a0b6b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#include -#include - - -class sSocket : public HttpdSocket -{ -public: - sSocket(ISocketHandler& h) : HttpdSocket(h) { - } - - void Init() - { - if (GetParent() -> GetPort() == 443 || GetParent() -> GetPort() == 8443) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - fprintf(stderr, "SSL not available\n"); -#endif - } - } - - void Exec() - { - CreateHeader(); - GenerateDocument(); - } - - void CreateHeader() - { - SetStatus("200"); - SetStatusText("OK"); -fprintf(stderr, "Uri: '%s'\n", GetUri().c_str()); - { - size_t x = 0; - for (size_t i = 0; i < GetUri().size(); i++) - if (GetUri()[i] == '.') - x = i; - std::string ext = GetUri().substr(x + 1); - if (ext == "gif" || ext == "jpg" || ext == "png") - AddResponseHeader("Content-type", "image/" + ext); - else - AddResponseHeader("Content-type", "text/" + ext); - } - AddResponseHeader("Connection", "close"); - SendResponse(); - } - - void GenerateDocument() - { - std::string fn = GetUri().substr(1); - FILE *fil = fopen(fn.c_str(), "rb"); - if (fil) - { - char slask[1000]; - int n = fread(slask,1,1000,fil); - while (n > 0) - { - SendBuf(slask, n); - n = fread(slask,1,1000,fil); - } - fclose(fil); - } - else - { - SetStatus("404"); - SetStatusText("Not Found"); - } - SetCloseAndDelete(); - } - -#ifdef HAVE_OPENSSL - void InitSSLServer() - { - InitializeContext("httpd", "comb.pem", "", SSLv23_method()); - } -#endif - -}; - - -int main(int argc, char *argv[]) -{ - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - StdoutLog log; - SocketHandler h(&log); - ListenSocket l(h); - if (l.Bind(1028)) - { - printf("Bind port 1028 failed\n"); - return -1; - } - h.Add(&l); - ListenSocket l2(h); - if (l2.Bind(8443)) - { - printf("Bind port 8443 failed\n"); - return -1; - } - h.Add(&l2); - while (h.GetCount()) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd_test.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd_test.cpp deleted file mode 100755 index b8a4286705..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd_test.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include -#include -#include -#include -#include -#include - - - std::string host; - int port = 0; - bool https = false; - std::string full_request; - - int antal = 500; - - int interval = 500; - int delay = 5000; - - int connected = 0; - int failed = 0; - int lost = 0; - -class TestSocket : public TcpSocket, public IEventOwner -{ -public: - TestSocket(class EventHandler& h, bool add = false) : TcpSocket(h), IEventOwner(h) - , m_req_index(0) { - if (https) - { - EnableSSL(); - } - if (add) - { - m_event_open = AddEvent(interval / 1000, (interval % 1000) * 1000); - } - } - ~TestSocket() {} - - void OnConnect() { - connected++; - m_event_request = AddEvent(delay / 1000, (delay % 1000) * 1000); - printf("%9lu %5u Connected: %d\n", UniqueIdentifier(), GetSockPort(), connected); - } - - void OnConnectFailed() { - failed++; - printf("%9lu %5u Failed: %d\n", UniqueIdentifier(), GetSockPort(), failed); - } - - void OnDisconnect() { - printf("\n"); - printf("%s\n", Utility::Stack().c_str()); - lost++; - connected--; - printf("%9lu %5u Lost: %d\n", UniqueIdentifier(), GetSockPort(), lost); - } - - void OnEvent(int id) { - if (id == m_event_open) - { - if (connected < antal) - { - TestSocket *p = new TestSocket(static_cast(Handler())); - p -> SetDeleteByHandler(); - p -> Open(host, port); - Handler().Add(p); - } - else - { - printf("Finished connecting. %d connected / %d failed / %d lost\n", connected, failed, lost); - } - m_event_open = AddEvent(interval / 1000, (interval % 1000) * 1000); - } - else - if (id == m_event_request) - { - if (m_req_index < full_request.size()) - { - if (full_request[m_req_index] == '\r') - { - printf(""); - fflush(stdout); - } - if (full_request[m_req_index] == '\n') - { - printf(""); - fflush(stdout); - } - SendBuf( &full_request[m_req_index], 1 ); - m_req_index++; - m_event_request = AddEvent(delay / 1000, (delay % 1000) * 1000); - } - else - { - m_event_restart = AddEvent(3, 0); - } - } - else - if (id == m_event_restart) - { - m_req_index = 0; - m_event_request = AddEvent(delay / 1000, (delay % 1000) * 1000); - } - else - { - fprintf(stderr, "%9lu %5u Unknown event id\n", UniqueIdentifier(), GetSockPort()); - SetCloseAndDelete(); - } - } - - void OnRawData(const char *buf, size_t len) { - printf("<%lu,%d>", UniqueIdentifier(), len); - fflush(stdout); - } - -private: - long m_event_open; - long m_event_request; - long m_event_restart; - size_t m_req_index; -}; - - -int main(int argc, char *argv[]) -{ - try - { - EventHandler h; - - /* - $ httpd_test [options] url - - -host override host part of url - -port override port part of url - -uri override uri part of url - -qs override query string part of url - - -nn nn number of connections - - -interval interval between connections, in ms - -delay interval between each request char sent - */ - std::string url; - - std::string uri; - std::string qs; - - for (int i = 1; i < argc; i++) - { - if (!strcmp(argv[i], "-host") && i < argc - 1) - host = argv[++i]; - else - if (!strcmp(argv[i], "-port") && i < argc - 1) - port = atoi(argv[++i]); - else - if (!strcmp(argv[i], "-uri") && i < argc - 1) - uri = argv[++i]; - else - if (!strcmp(argv[i], "-qs") && i < argc - 1) - qs = argv[++i]; - else - if (strlen(argv[i]) > 1 && argv[i][0] == '-' && isdigit(argv[i][1])) - antal = atoi(&argv[i][1]); - else - if (!strcmp(argv[i], "-interval") && i < argc - 1) - interval = atoi(argv[++i]); - else - if (!strcmp(argv[i], "-delay") && i < argc - 1) - delay = atoi(argv[++i]); - else - if (argv[i][0] == '-') - printf("Huh? %s\n", argv[i]); - else - url = argv[i]; - } - Utility::Uri parser(url); - if (host.empty()) - host = parser.Host(); - if (!port) - port = parser.Port(); - if (uri.empty()) - uri = parser.UrlUri(); - if (qs.empty()) - qs = parser.QueryString(); - if (parser.Protocol() == "https") - https = true; - - full_request = "GET " + uri; - if (!qs.empty()) - full_request += "?" + qs; - full_request += " HTTP/1.1\r\n"; - full_request += "Host: " + parser.Host() + "\r\n"; - full_request += "\r\n"; - - printf("Host: %s\n", host.c_str()); - printf("Port: %d\n", port); - printf("----------------------------------\n"); - printf("%s", full_request.c_str()); - printf("----------------------------------\n"); - - TestSocket *p = new TestSocket(h, true); - p -> SetDeleteByHandler(); - p -> Open(host, port); - h.Add(p); - - h.EventLoop(); - } - catch (const Exception& e) - { - std::cerr << e.ToString() << std::endl; - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/https.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/https.cpp deleted file mode 100755 index 45b36ff80f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/https.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include -#include -#include - - -class tSocket : public HTTPSocket -{ -public: - tSocket(ISocketHandler& h) : HTTPSocket(h) - , m_first(false) - , m_sz(0) { - EnableSSL(); - } - - tSocket(ISocketHandler& h, const std::string& host) : HTTPSocket(h), m_host(host) - , m_first(false) - , m_sz(0) { - EnableSSL(); - Open(host, 4443); - } - - void InitSSLServer() { - InitializeContext("", "comb.pem", "", SSLv23_method()); - } - - void OnSSLAccept() { - printf("OnSSLAccept()\n"); - HTTPSocket::OnSSLAccept(); - } - - void OnSSLConnect() { - printf("OnSSLConnect()\n"); - HTTPSocket::OnSSLConnect(); - } - - void OnAccept() { -printf("OnAccept\n"); - } - - void OnConnect() { -printf("OnConnect\n"); - Send("GET /index.html HTTP/1.0\r\n"); - Send("Host: " + m_host + "\r\n"); - Send("\r\n"); - } - - void OnFirst() { - } - - void OnHeader(const std::string& key, const std::string& value) { - fprintf(stderr, "%s: %s\n", key.c_str(), value.c_str()); - } - - void OnHeaderComplete() { - fprintf(stderr, "\n"); - } - - void OnData(const char *buf, size_t sz) { - if (1||!m_first) - { - std::string str = buf; - str.resize( sz ); - printf("%s", str.c_str()); - m_first = true; - } - m_sz += sz; - } - - void OnDelete() { - fprintf(stderr, "Content length: %d\n", m_sz); - } - -private: - std::string m_host; - bool m_first; - size_t m_sz; -}; - - -int main(int argc, char *argv[]) -{ - try - { - SocketHandler h; - if (argc > 1 && !strcmp(argv[1], "-server")) - { - ListenSocket l(h); - l.Bind(4443); - h.Add(&l); - while (h.GetCount()) - { - h.Select(1, 0); - } - } - else - { - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - tSocket sock(h, host); - h.Add(&sock); - while (h.GetCount()) - { - h.Select(1, 0); - } - } - } - catch (const Exception& e) - { - printf("%s\n", e.ToString().c_str()); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/json.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/json.cpp deleted file mode 100755 index efe0f9c883..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/json.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "Json.h" -#include - - -int main(int argc, char *argv[]) -{ - try - { - Json js; - - std::string str("Test\\ string\\ end\\\nAnders was here\n\"Quoted string inside string\"\n"); - std::cout << " --------------- original\n"; - std::cout << str << std::endl; - - js.encode(str); - std::cout << " --------------- encoded\n"; - std::cout << str << std::endl; - - js.decode(str); - std::cout << " --------------- decoded\n"; - std::cout << str << std::endl; - - js["String"] = str; - str = js.ToString(); - std::cout << " --------------- from ToString()\n"; - std::cout << str << std::endl; - - Json js2 = Json::Parse(str); - std::cout << js2.ToString() << std::endl; - - std::cout << (std::string)js2["String"] << std::endl; - - str = "{\"no-value\":null}"; - Json js3 = Json::Parse(str); - std::cout << js3.ToString() << std::endl; - - std::cout << " --------------- request\n"; - Json req; - req["method"] = "test"; - Json params; - params["value1"] = 1L; - params["value2"] = "2"; - req["params"] = params; - std::cout << req.ToString() << std::endl; - } - catch (const Exception& e) - { - std::cerr << e.ToString() << std::endl; - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/listener.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/listener.cpp deleted file mode 100755 index 2c10951a4a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/listener.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include -#include -#include -#include -#include -#include - - -bool quit = false; - - -class ControlHandler : public SocketHandler -{ -public: - ControlHandler() : SocketHandler() {} - ~ControlHandler() {} - - void List(TcpSocket *p); - - void StopListen(); -}; - - -class ControlSocket : public TcpSocket -{ -public: - ControlSocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); - } - - void OnAccept() { - SendHelp(); - Send(">> "); - } - - void OnLine(const std::string& line) { - Parse pa(line); - std::string cmd = pa.getword(); - std::string arg = pa.getrest(); - - ControlHandler& h = static_cast(Handler()); - if (cmd == "help") - { - SendHelp(); - } - else - if (cmd == "quit") - { - SetCloseAndDelete(); - Send("Bye.\n"); - return; - } - else - if (cmd == "list") - { - h.List(this); - } - else - if (cmd == "stop") - { - h.StopListen(); - } - else - if (cmd == "bind") - { - port_t port = (port_t)atoi(arg.c_str()); - ListenSocket *p = new ListenSocket(Handler()); - p -> SetDeleteByHandler(); - p -> Bind(port); - h.Add(p); - } - else - { - Send("Huh?\n"); - } - Send(">> "); - } - - void SendHelp() { - Send("Commands available\n" - " help, quit, list, stop, bind \n" - "\n" - " list - list all sockets\n" - " stop - stop all listening sockets\n" - " bind - add a new listening socket\n" - " quit - leave\n" - " help - show this text\n" - "\n"); - } - -private: -}; - - -void ControlHandler::List(TcpSocket *from) -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - SOCKET s = it -> first; - Socket *p0 = it -> second; - ListenSocket *l = dynamic_cast *>(p0); - ControlSocket *p = dynamic_cast(p0); - if (l) - { - from -> Send(Utility::l2string(s) + ": ListenSocket on port " + Utility::l2string(l -> GetPort()) + "\n"); - } - else - if (p) - { - from -> Send(Utility::l2string(s) + ": ControlSocket\n"); - } - else - { - from -> Send(Utility::l2string(s) + ": \n"); - } - } -} - - -void ControlHandler::StopListen() -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p0 = it -> second; - ListenSocket *l = dynamic_cast *>(p0); - if (l) - { - l -> SetCloseAndDelete(); - } - } -} - - -int main(int argc, char *argv[]) -{ - try - { - ControlHandler h; - ListenSocket l(h); - l.Bind(2000); - h.Add(&l); - while (!quit && h.GetCount()) - { - h.Select(); - } - } - catch (const Exception& e) - { - std::cout << e.ToString() << std::endl; - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resolve.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resolve.cpp deleted file mode 100755 index 802b91016a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resolve.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include -#ifndef _WIN32 -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include - - -int main(int argc, char *argv[]) -{ - StdoutLog log; - SocketHandler h(&log); -/* - h.EnableResolver(9999); - -// printf("Waiting for resolver ..."); - while (!h.ResolverReady()) - ; -// printf(" resolver ready!\n"); -*/ - std::string hostname = argc < 2 ? "www.ipv6.org" : argv[1]; - - { - printf("Using hostname : %s\n", hostname.c_str()); - printf("------------------------------------------- normal (old) Utility::u2ip\n"); - ipaddr_t oa; - if (!Utility::u2ip(hostname, oa)) - printf("Ipv4 lookup failed\n"); -#ifdef ENABLE_IPV6 - in6_addr oa6; - if (!Utility::u2ip(hostname, oa6)) - printf("Ipv6 lookup failed\n"); -#endif - std::string oname; - Utility::l2ip(oa, oname); - printf("Ipv4 : %s (old)\n", oname.c_str()); - -#ifdef ENABLE_IPV6 - std::string oname6; - Utility::l2ip(oa6, oname6); - printf("Ipv6 : %s (old)\n", oname6.c_str()); -#endif - - printf("------------------------------------------- new Utility::u2ip, Utility::reverse\n"); - struct sockaddr_in sa; - if (!Utility::u2ip(hostname, sa)) - printf("Ipv4 lookup failed\n"); - - ipaddr_t a; - memcpy(&a, &sa.sin_addr, sizeof(a)); - std::string l2ipname; - Utility::l2ip(a, l2ipname); - printf("Ipv4 : %s\n", l2ipname.c_str()); - - std::string numeric; - Utility::reverse((struct sockaddr *)&sa, sizeof(sa), numeric, NI_NUMERICHOST); - printf("Ipv4 numeric : %s\n", numeric.c_str()); - - std::string rname; - if (!Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), rname)) - printf("Reverse Ipv4 failed\n"); - else - printf("Ipv4 Utility::reverse : %s\n", rname.c_str()); - -#ifdef ENABLE_IPV6 - printf("------------------------------------------- new Utility::u2ip, Utility::reverse (Ipv6)\n"); - struct sockaddr_in6 sa6; - if (!Utility::u2ip(hostname, sa6)) - printf("Ipv6 lookup failed\n"); - - std::string l2ipname6; - Utility::l2ip(sa6.sin6_addr, l2ipname6); - printf("Ipv6 : %s\n", l2ipname6.c_str()); - - std::string numeric6; - Utility::reverse((struct sockaddr *)&sa6, sizeof(sa6), numeric6, NI_NUMERICHOST); - printf("Ipv6 numeric : %s\n", numeric6.c_str()); - - std::string rname6; - if (!Utility::reverse( (struct sockaddr *)&sa6, sizeof(sa6), rname6)) - printf("Reverse Ipv6 failed\n"); - else - printf("Ipv6 Utility::reverse : %s\n", rname6.c_str()); -#endif - - printf("-------------------------------------------\n"); - in_addr ia; - /** Resolve hostname. */ -//static bool Resolve(const std::string& hostname,struct in_addr& a); - /** Reverse resolve (IP to hostname). */ -//static bool Reverse(struct in_addr& a,std::string& name); - /** Convert address struct to text. */ -//static std::string Convert(struct in_addr& a); - std::string name; - if (!Ipv4Address::Resolve(hostname, ia)) - printf("Ipv4 lookup failed (Ipv4Address)\n"); - memcpy(&a, &ia, sizeof(a)); - Utility::l2ip(a, name); - printf("Ipv4 : %s (Ipv4Address)\n", name.c_str()); - assert(name == l2ipname); - if (!Ipv4Address::Reverse(ia, name)) - printf("Reverse Ipv4 lookup failed (Ipv4Address)\n"); - else - printf("Reverse Ipv4 : %s\n", name.c_str()); - assert(name == rname); - assert(Ipv4Address::Convert(ia) == l2ipname); - -#ifdef ENABLE_IPV6 - printf("-------------------------------------------\n"); - /** Resolve hostname. */ -//static bool Resolve(const std::string& hostname,struct in6_addr& a); - /** Reverse resolve (IP to hostname). */ -//static bool Reverse(struct in6_addr& a,std::string& name); - /** Convert address struct to text. */ -//static std::string Convert(struct in6_addr& a,bool mixed = false); - if (!Ipv6Address::Resolve(hostname, oa6)) - printf("Ipv6 lookup failed (Ipv4Address)\n"); - Utility::l2ip(oa6, name); - assert(name == l2ipname6); - printf("Ipv6 : %s (Ipv6Address)\n", name.c_str()); - if (!Ipv6Address::Reverse(oa6, name)) - printf("Reverse Ipv6 lookup failed (Ipv4Address)\n"); - else - printf("Reverse Ipv6 : %s\n", name.c_str()); - assert(name == rname6); - std::string mixed_false = Ipv6Address::Convert(oa6, false); - std::string mixed_true = Ipv6Address::Convert(oa6, true); - printf("Ipv6Address::Convert(false) : %s\n", mixed_false.c_str()); - printf("Ipv6Address::Convert(true ) : %s\n", mixed_true.c_str()); - assert(mixed_false == l2ipname6); -#endif -/* - printf("-------------------------------------------\n"); - int protocol; - Utility::u2service("tcp", protocol); - printf("tcp: %d\n", protocol); - Utility::u2service("udp", protocol); - printf("udp: %d\n", protocol); - Utility::u2service("echo", protocol); - printf("echo: %d\n", protocol); -*/ - } - printf("\n"); - printf("OK\n"); - -// sleep(100); -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resume.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resume.cpp deleted file mode 100755 index 29d15ae979..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resume.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include -#include -#include -#include -#include - - -class eHandler : public EventHandler -{ -public: - eHandler() : EventHandler() {} - ~eHandler() { - } -}; - - -#define ID_STOP_SOCKET 1 -#define ID_STOP_LISTEN 2 - - -class eSocket : public TcpSocket, public IEventOwner -{ -public: - eSocket(ISocketHandler& h) : TcpSocket(h), IEventOwner(static_cast(h)), m_listen_socket(NULL), m_server(false) { - SetLineProtocol(); - } - ~eSocket() { - } - - bool OnConnectRetry() { - printf("Retrying connect\n"); - if (GetConnectionRetries() == 3) - { - printf("Creating ListenSocket\n"); - m_listen_socket = new ListenSocket(Handler()); - if (m_listen_socket -> Bind(12345)) - { - printf("Bind port 12345 failed\n"); - } - m_listen_socket -> SetDeleteByHandler(); - Handler().Add( m_listen_socket ); - } - return true; - } - - void OnAccept() { - m_events[AddEvent(5, 0)] = ID_STOP_SOCKET; - m_server = true; - } - - void OnConnect() { - m_events[AddEvent(10, 0)] = ID_STOP_LISTEN; - } - - void OnReconnect() { - m_events[AddEvent(10, 0)] = ID_STOP_LISTEN; - } - - void OnEvent(int id) { - if (m_events[id] == ID_STOP_SOCKET && m_server) - { - printf("Event: Server disconnect\n"); - SetCloseAndDelete(); - } - if (m_events[id] == ID_STOP_LISTEN && !m_server) - { - printf("Event: Stop listensocket\n"); - if (m_listen_socket) - { - m_listen_socket -> SetCloseAndDelete(); - m_listen_socket = NULL; - } - } - } - - void OnLine(const std::string& line) { - printf(" Incoming data: %s\n", line.c_str()); - } - - void OnDelete() { - printf("eSocket::OnDelete(), server: %s\n", m_server ? "true" : "false"); - } - - void OnDisconnect() { - printf("Disconnect, server: %s\n", m_server ? "true" : "false"); - } - -private: - ListenSocket *m_listen_socket; - std::map m_events; - bool m_server; -}; - - -class Sender : public IEventOwner -{ -public: - Sender(IEventHandler& h, TcpSocket& ref) : IEventOwner(h), m_socket(ref), m_count(1) { - } - - void OnEvent(int id) { - if (static_cast(GetEventHandler()).Valid(&m_socket)) - m_socket.Send("Event#" + Utility::l2string(m_count++) + "\n"); - AddEvent(1, 0); - } - -private: - TcpSocket& m_socket; - int m_count; -}; - - -int main(int argc, char *argv[]) -{ - eHandler h; - eSocket sock(h); - sock.SetConnectTimeout(3); - sock.SetConnectionRetry(-1); -#ifdef ENABLE_RECONNECT - sock.SetReconnect(); -#endif - sock.Open("localhost", 12345); - h.Add( &sock ); - Sender send(h, sock); - h.AddEvent( &send, 1, 0 ); - h.EventLoop(); -} - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/retry.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/retry.cpp deleted file mode 100755 index 36954a6fcf..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/retry.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include -#include - - - bool quit = false; - -/* - virtual bool OnConnectRetry(); -- void SetRetryClientConnect(bool x = true); -- bool RetryClientConnect(); - void SetConnectionRetry(int n); - int GetConnectionRetry(); - void IncreaseConnectionRetries(); - int GetConnectionRetries(); - void ResetConnectionRetries(); -*/ -class RetrySocket : public TcpSocket -{ -public: - RetrySocket(ISocketHandler& h) : TcpSocket(h) { - SetConnectTimeout(2); - SetConnectionRetry(-1); - } - - bool OnConnectRetry() { - printf("Connection attempt#%d\n", GetConnectionRetries()); - if (GetConnectionRetries() == 3) - { - ListenSocket *l = new ListenSocket(Handler()); - if (l -> Bind(12345)) - { - printf("Bind port 12345 failed\n"); - } - l -> SetDeleteByHandler(); - Handler().Add(l); - } - return true; - } - - void OnConnect() { - printf("Connected\n"); - printf("GetRemoteAddress(): %s\n", GetRemoteAddress().c_str()); - printf("Remote address: %s\n", GetRemoteSocketAddress() -> Convert(false).c_str()); - printf("Remote address: %s\n", GetRemoteSocketAddress() -> Convert(true).c_str()); - SetCloseAndDelete(); - } - - void OnDelete() { - quit = true; - } -}; - - -int main(int argc, char *argv[]) -{ - SocketHandler h; - RetrySocket sock(h); - sock.Open("localhost", 12345); - h.Add(&sock); - while (!quit) - { - h.Select(0, 200000); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/scanr.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/scanr.cpp deleted file mode 100755 index b6c4e2b2db..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/scanr.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include - - -class tSocket : public TcpSocket -{ -public: - tSocket(ISocketHandler& h, const std::string& host, int port) : TcpSocket(h), m_host(host) - { - SetLineProtocol(); - Open(host, port); - } - - void OnLine(const std::string& line) - { - printf("%s :: ", GetRemoteAddress().c_str()); - for (size_t i = 0; i < line.size(); i++) - { - if (isprint(line[i]) || line[i] == 13 || line[i] == 10) - { - printf("%c", line[i]); - } - } - printf("\n"); - } - -private: - std::string m_host; -}; - - -int main(int argc, char *argv[]) -{ - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - int port = argc > 2 ? atoi(argv[2]) : 80; - SocketHandler h; - for (int i = 1; i < 255; i++) - { - char host[40]; - sprintf(host, "10.170.23.%d", i); - tSocket *p = new tSocket(h, host, 23); - h.Add(p); - } - while (h.GetCount()) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/semtest.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/semtest.cpp deleted file mode 100755 index 442d5d663d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/semtest.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include -#include -#ifndef _WIN32 -#include -#include -#include -#include -#include -#include - - -class MyThread : public Thread -{ -public: - void Run() { - printf("Thread\n"); - } -}; - - -class SemLock -{ -public: - SemLock(Semaphore& sem) : m_sem(sem) { - m_sem.Wait(); - } - ~SemLock() { - m_sem.Post(); - } - -private: - Semaphore& m_sem; -}; - - -/** - * Return time difference between two struct timeval's, in seconds - * \param t0 start time - * \param t end time - */ -double Diff(struct timeval t0,struct timeval t) -{ - t.tv_sec -= t0.tv_sec; - t.tv_usec -= t0.tv_usec; - if (t.tv_usec < 0) - { - t.tv_usec += 1000000; - t.tv_sec -= 1; - } - return t.tv_sec + (double)t.tv_usec / 1000000; -} - - -static int val = 0; - -void lock(Mutex& m, int i) -{ - Lock l(m); - val += i; -} - - -void lock(Semaphore& s, int i) -{ - SemLock l(s); - val += i; -} -#endif // WIN32 - - -int main() -{ -#ifndef _WIN32 - Mutex mutex; - Semaphore sema(1); - struct timeval start; - struct timeval tt; - double d; - - Utility::GetTime(&start); - for (int i = 0; i < 100000; i++) - lock(mutex, i); - Utility::GetTime(&tt); - d = Diff(start, tt); - printf("%.4f sec\n", d); - - Utility::GetTime(&start); - for (int i = 0; i < 100000; i++) - lock(sema, i); - Utility::GetTime(&tt); - d = Diff(start, tt); - printf("%.4f sec\n", d); -#endif -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sloppy_http.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sloppy_http.cpp deleted file mode 100755 index b6bf07520f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sloppy_http.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include - - -class GetHttp : public TcpSocket -{ -public: - GetHttp(ISocketHandler& h, const char *request) : TcpSocket(h) - , m_request(request) {} - - void OnConnect() { - printf("... connected\n"); - Send( m_request ); - } - - void OnRawData( const char *buf, size_t len ) { - printf("... data\n"); - if (len > 0) { - std::string tmp; - tmp.resize( len ); - memcpy( &tmp[0], buf, len ); - m_response += tmp; - } - } - - const std::string& Response() { - return m_response; - } - -private: - std::string m_request; - std::string m_response; -}; - - -std::string get_http(const char *host, int port, const char *request) -{ - SocketHandler h; - GetHttp sock(h, request); - sock.Open( host, port ); - h.Add(&sock); - while (h.GetCount()) { - h.Select(1, 0); - } - return sock.Response(); -} - - -int main(int argc, char *argv[]) -{ - std::string zz = get_http("www.alhem.net", 80, "GET /index.html HTTP/1.0\r\n" - "Host: www.alhem.net\r\n" - "Connection: close\r\n" - "\r\n"); - printf("%s\n%d\n", zz.c_str(), zz.size()); -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sockets_test.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sockets_test.cpp deleted file mode 100755 index 966732f9bc..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sockets_test.cpp +++ /dev/null @@ -1,356 +0,0 @@ -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -using namespace SOCKETS_NAMESPACE; -#endif - - -class MyHandler : public SocketHandler -{ -public: - MyHandler(StdLog *p) : SocketHandler(p),m_done(false),m_quit(false) {} - ~MyHandler() {} - - void List(TcpSocket *p) { - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p0 = (*it).second; -#ifdef ENABLE_POOL - if (dynamic_cast(p0)) - { - p -> Send("PoolSocket\n"); - } - else -#endif - if (dynamic_cast(p0)) - { - p -> Send("HttpGetSocket\n"); - } - else - if (dynamic_cast(p0)) - { - p -> Send("TcpSocket\n"); - } - else - { - p -> Send("Some kind of Socket\n"); - } - } - } - void SetQuit() { m_quit = true; } - bool Quit() { return m_quit; } - void CheckHtml() { - if (m_done) - { - if (m_ok) - printf("Html OK:\n%s\n", m_html.c_str()); - else - printf("Html Failed\n"); - m_done = false; - } - } - - std::string m_html; - bool m_ok; - bool m_done; - -private: - bool m_quit; -}; - - -class MySocket : public TcpSocket -{ -public: - MySocket(ISocketHandler& h) : TcpSocket(h) { - } - void OnAccept() { - int port = GetParent() -> GetPort(); - Send("I'm the server at port " + - Utility::l2string(port) + "\n"); - SetCloseAndDelete(); - } -}; - - -class hSocket : public HttpGetSocket -{ -public: - hSocket(ISocketHandler& h,const std::string& x,const std::string& y) : HttpGetSocket(h,x,y) {} - - void OnConnect() { - printf("hSocket::OnConnect\n"); - HttpGetSocket::OnConnect(); - } -}; - - -class OrderSocket : public TcpSocket -{ -public: - OrderSocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); - } - Socket *Create() { - Handler().LogError(this, "Create", 0, "OrderSocket", LOG_LEVEL_INFO); - return new OrderSocket(Handler()); - } - void OnAccept() { - Send("Cmd (get,quit,list,stop,detach,count,resolve )>"); - } - void OnLine(const std::string& line) { - Parse pa(line); - std::string cmd = pa.getword(); - std::string arg = pa.getrest(); - try - { - if (cmd == "get") - { - HttpGetSocket *p = new hSocket(Handler(), arg, "tmpfile.html"); - p -> SetHttpVersion("HTTP/1.1"); - p -> AddResponseHeader("Connection", "keep-alive"); - p -> SetDeleteByHandler(); - Handler().Add( p ); - Send("Reading url '" + arg + "'\n"); - } - else - if (cmd == "quit") - { - Send("Goodbye!\n"); - SetCloseAndDelete(); - } - else - if (cmd == "list") - { - dynamic_cast(Handler()).List( this ); - } - else - if (cmd == "stop") - { - dynamic_cast(Handler()).SetQuit(); - } - else - if (cmd == "resolve") - { - //Resolve( arg ); - ipaddr_t a; - if (Utility::u2ip(arg, a)) - { - std::string tmp; - Utility::l2ip(a, tmp); - Send("Resolved: " + tmp + "\n"); - } - else - { - Send("Resolve failed: " + arg + "\n"); - } - } - else - /* - if (cmd == "reverse") - { - ipaddr_t a; - Utility::u2ip(arg, a); // ip -> ipaddr_t - int id = Socket::Resolve(a, 0); - Send("Resolve id = " + Utility::l2string(id) + "\n"); - } - else - */ - #ifdef ENABLE_DETACH - if (cmd == "detach") - { - if (!Detach()) - { - Send("Detach() call failed\n"); - } - else - { - Send("Ok.\n"); - } - } - else - #endif - if (cmd == "count") - { - Send("Socket count: " + Utility::l2string( (long)Handler().GetCount()) + "\n"); - } - else - { - Send("Huh?\n"); - } - } - catch (const std::exception& e) - { - Send(e.what() + std::string("\n")); - } - Send("Cmd>"); - } - void OnDelete() { - printf("OrderSocket::OnDelete()\n"); - } -#ifdef ENABLE_RESOLVER - void OnResolved(int id,ipaddr_t a,port_t port) - { - } - void OnResolved(int id,const std::string& name,port_t port) - { - Send("Resolve id " + Utility::l2string(id) + " = " + name + "\n"); - } -/* - void OnResolved(const char *p,size_t l) { - printf("OnResolved, %d bytes:\n", l); - for (size_t i = 0; i < l; i++) - { - unsigned char c = p[i]; - if (isprint(c)) - printf("%c",c); - else - printf("<%02X>",c); - } - printf("\n"); - } -*/ -#endif -#ifdef ENABLE_DETACH - void OnDetached() { - Send("\nDetached.\nCmd>"); - } -#endif -}; - - -class TestSocket : public TcpSocket -{ -public: - TestSocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); - } - void OnConnect() { - printf("TestSocket connected, sending QUIT\n"); - Send( "quit\n" ); - } - void OnConnectFailed() { - printf("TestSocket::OnConnectFailed\n"); - SetCloseAndDelete(); - } - void OnLine(const std::string& line) { - printf("TestSocket: %s\n", line.c_str()); - } - void OnDelete() { - printf("TestSocket::OnDelete()\n"); - } -#ifdef ENABLE_RESOLVER - void OnResolved(int id,ipaddr_t a,port_t port) { - printf("TestSocket::OnResolved(): %d, %08x:%d\n", id, a, port); - TcpSocket::OnResolved(id,a,port); - } -#endif -}; - - -int main() -{ - try - { - StdoutLog log; - MyHandler h(&log); - -#ifdef ENABLE_RESOLVER - h.EnableResolver(9999); -#endif -// Utility::ResolveLocal(); - printf(" *** My hostname: %s\n", Utility::GetLocalHostname().c_str()); - printf(" *** My local IP: %s\n", Utility::GetLocalAddress().c_str()); - - // socks4 options -/* - h.SetSocks4Host("127.0.0.1"); - h.SetSocks4Port(1080); - h.SetSocks4Userid("www.alhem.net"); - h.SetSocks4TryDirect( true ); - printf("Socks4Host: %x\n", h.GetSocks4Host()); -*/ - - // first server - ListenSocket l1(h); - if (l1.Bind(1024)) - { - printf("Bind 1024 failed\n"); - exit(-1); - } - h.Add(&l1); - - // second server - ListenSocket l2(h); - if (l2.Bind(1025)) - { - printf("Bind 1025 failed\n"); - exit(-1); - } - h.Add(&l2); - - // line server - ListenSocket l3(h); - if (l3.Bind(1027)) - { - printf("Bind 1027 failed\n"); - exit(-1); - } - h.Add(&l3); - - // http debug - ListenSocket l4(h); - if (l4.Bind(8080)) - { - printf("Bind 8080 failed\n"); - exit(-1); - } - h.Add(&l4); - - // wait for resolver to really start -#ifdef ENABLE_RESOLVER - printf("Waiting for resolver ..."); - while (!h.ResolverReady()) - ; - printf(" resolver ready!\n"); -#endif - - TestSocket ts(h); -printf(">>> TestSocket.Open\n"); - ts.Open("localhost", 1027); -printf(">>> Adding TestSocket\n"); - h.Add(&ts); - -printf(">>> Enter mainloop\n"); - h.Select(0,0); - while (!h.Quit()) - { - h.Select(1,0); - } -printf(">>> Leaving mainloop\n"); - - return 0; - } - catch (const Exception& e) - { - std::cerr << e.ToString() << std::endl; - } - catch (const std::exception& e) - { - std::cerr << e.what() << std::endl; - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/stressclient.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/stressclient.cpp deleted file mode 100755 index 2d38a066e5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/stressclient.cpp +++ /dev/null @@ -1,631 +0,0 @@ -/** - ** \file stressclient.cpp - ** \date 2006-10-02 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2006 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif -#include -#include -#include -#include -#include -#ifndef _WIN32 -#include -#include -#else -typedef __int64 int64_t; -#endif -#include -#include - - -static int g_ant = 0; -static double g_min_time = 10000; -static double g_max_time = 0; -static double g_tot_time = 0; - -static int g_ant2 = 0; -static double g_min_time2 = 10000; -static double g_max_time2 = 0; -static double g_tot_time2 = 0; - -static int64_t gBytesIn = 0; -static int64_t gBytesOut = 0; - -static int samples = 0; - -static int g_tot_ant = 0; -static double g_tot_min_t = 0; -static double g_tot_max_t = 0; -static double g_tot_tot_t = 0; - -static int g_tot_ant2 = 0; -static double g_tot_min_t2 = 0; -static double g_tot_max_t2 = 0; -static double g_tot_tot_t2 = 0; - -static int64_t tot_gBytesIn = 0; -static int64_t tot_gBytesOut = 0; - -static double tot_rt = 0; - -static bool gQuit = false; -static size_t g_max_connections = 0; -static std::string gHost = "localhost"; -static port_t gPort = 2222; -static bool g_b_flood = false; -static bool g_b_off = false; -static bool g_b_limit = false; -static bool g_b_repeat = false; -static std::string g_data; -static size_t g_data_size = 1024; -static bool g_b_stop = false; -#ifdef HAVE_OPENSSL -static bool g_b_ssl = false; -#endif -static bool g_b_instant = false; -static struct timeval g_t_start; - - -/** - * Return time difference between two struct timeval's, in seconds - * \param t0 start time - * \param t end time - */ -double Diff(struct timeval t0,struct timeval t) -{ - t.tv_sec -= t0.tv_sec; - t.tv_usec -= t0.tv_usec; - if (t.tv_usec < 0) - { - t.tv_usec += 1000000; - t.tv_sec -= 1; - } - return t.tv_sec + (double)t.tv_usec / 1000000; -} - - -void gettime(struct timeval *p, struct timezone *) -{ -#ifdef _WIN32 - FILETIME ft; // Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC). - GetSystemTimeAsFileTime(&ft); - uint64_t tt; - memcpy(&tt, &ft, sizeof(tt)); - tt /= 10; - p->tv_sec = tt / 1000000; - p->tv_usec = tt % 1000000; -#else - gettimeofday(p, NULL); -#endif -} - - -void print_tot() -{ - printf("c ----- %6d (%.4f/%.4f/%.4f)", g_tot_ant / samples, g_tot_min_t / samples, g_tot_max_t / samples, g_tot_tot_t / g_tot_ant); - - printf(" r --- %7d (%.4f/%.4f/%.4f)", g_tot_ant2 / samples, g_tot_min_t2 / samples, g_tot_max_t2 / samples, g_tot_tot_t2 / g_tot_ant2); - - double mbi = (double)tot_gBytesIn / 1024 / samples; - mbi /= 1024; - mbi /= tot_rt / samples; - printf(" -/in %11lld", tot_gBytesIn / samples); - printf(" (%5.2f MB/s)", mbi); - - double mbo = (double)tot_gBytesOut / 1024 / samples; - mbo /= 1024; - mbo /= tot_rt / samples; - printf(" -/out %11lld", tot_gBytesOut / samples); - printf(" (%5.2f MB/s)", mbo); - - printf(" %5.2f s\n", tot_rt / samples); - -} - - -void printreport() -{ - struct timeval tv; - gettime(&tv, NULL); - double rt = Diff(g_t_start, tv); - g_t_start = tv; - // -// printf("connect %6d (%.4f/%.4f/%.4f)", g_ant, g_min_time, g_max_time, g_tot_time / g_ant); - g_tot_ant += g_ant; - g_tot_min_t += g_min_time; - g_tot_max_t += g_max_time; - g_tot_tot_t += g_tot_time; - -// printf(" reply %7d (%.4f/%.4f/%.4f)", g_ant2, g_min_time2, g_max_time2, g_tot_time2 / g_ant2); - g_tot_ant2 += g_ant2; - g_tot_min_t2 += g_min_time2; - g_tot_max_t2 += g_max_time2; - g_tot_tot_t2 += g_tot_time2; - - double mbi = (double)gBytesIn / 1024; - mbi /= 1024; - mbi /= rt; -// printf(" b/in %11lld", gBytesIn); -// printf(" (%5.2f MB/s)", mbi); - tot_gBytesIn += gBytesIn; - - double mbo = (double)gBytesOut / 1024; - mbo /= 1024; - mbo /= rt; -// printf(" b/out %11lld", gBytesOut); -// printf(" (%5.2f MB/s)", mbo); - tot_gBytesOut += gBytesOut; - -// printf(" %5.2f s\n", rt); - tot_rt += rt; - - ++samples; - print_tot(); -} - - -void printreport_reset() -{ - printreport(); - // - g_min_time = 10000; - g_max_time = 0; - g_tot_time = 0; - g_ant = 0; - g_min_time2 = 10000; - g_max_time2 = 0; - g_tot_time2 = 0; - g_ant2 = 0; - gBytesIn = gBytesOut = 0; -} - - -class MySocket : public TcpSocket -{ -public: - MySocket(ISocketHandler& h,bool one) : TcpSocket(h), m_b_client(false), m_b_one(one), m_b_created(false), m_b_active(false) { - gettime(&m_create, NULL); - SetLineProtocol(); -#ifdef HAVE_OPENSSL - if (g_b_ssl) - EnableSSL(); -#endif - if (g_max_connections && !m_b_one && Handler().GetCount() >= g_max_connections) - { - fprintf(stderr, "\nConnection limit reached: %d, continuing in single connection stress mode\n", (int)g_max_connections); - if (g_b_off) - printreport_reset(); - g_b_limit = true; - m_b_one = true; - // - g_b_flood = g_b_repeat; - } -#ifndef USE_EPOLL - if (!m_b_one && Handler().GetCount() >= Handler().MaxCount() - 17) - { - fprintf(stderr, "\nFD_SETSIZE connection limit reached: %d, continuing in single connection stress mode\n", (int)Handler().GetCount()); - if (g_b_off) - printreport_reset(); - g_b_limit = true; - m_b_one = true; - // - g_b_flood = g_b_repeat; - } -#endif - } - ~MySocket() { - } - - void OnConnect() { - gettime(&m_connect, NULL); - m_b_active = true; - { - double tconnect = Diff(m_create, m_connect); - // - g_min_time = tconnect < g_min_time ? tconnect : g_min_time; - g_max_time = tconnect > g_max_time ? tconnect : g_max_time; - g_tot_time += tconnect; - g_ant += 1; - } - SendBlock(); - m_b_client = true; - } - - void SendBlock() { - gettime(&m_send, NULL); - Send(g_data + "\n"); - } - - void OnLine(const std::string& line) { - gettime(&m_reply, NULL); - m_b_active = true; - { - double treply = Diff(m_send, m_reply); - // - g_min_time2 = treply < g_min_time2 ? treply : g_min_time2; - g_max_time2 = treply > g_max_time2 ? treply : g_max_time2; - g_tot_time2 += treply; - g_ant2 += 1; - } - // - if (line != g_data) - { - fprintf(stderr, "\n%s\n%s\n", line.c_str(), g_data.c_str()); - fprintf(stderr, "(reply did not match data - exiting)\n"); - exit(-1); - } - // - gBytesIn += GetBytesReceived(true); - gBytesOut += GetBytesSent(true); - if (m_b_one) - { - SetCloseAndDelete(); - } - else - if (g_b_repeat && g_b_limit) - { - SendBlock(); - } - // add another - if (!m_b_created && (!g_b_limit || !g_b_off) && !g_b_instant) - { - MySocket *p = new MySocket(Handler(), m_b_one); - p -> SetDeleteByHandler(); - p -> Open(gHost, gPort); - Handler().Add(p); - m_b_created = true; - } - } - - bool IsActive() { - bool b = m_b_active; - m_b_active = false; - return b; - } - -private: - bool m_b_client; - bool m_b_one; - bool m_b_created; - bool m_b_active; - struct timeval m_create; - struct timeval m_connect; - struct timeval m_send; - struct timeval m_reply; -}; - - -class MyHttpSocket : public HttpGetSocket -{ -public: - MyHttpSocket(ISocketHandler& h,const std::string& url) : HttpGetSocket(h,url), m_url(url) { - gettime(&m_create, NULL); - AddResponseHeader("content-length", Utility::l2string(g_data_size)); - } - ~MyHttpSocket() {} - - void OnConnect() { - gettime(&m_connect, NULL); - { - double tconnect = Diff(m_create, m_connect); - // - g_min_time = tconnect < g_min_time ? tconnect : g_min_time; - g_max_time = tconnect > g_max_time ? tconnect : g_max_time; - g_tot_time += tconnect; - g_ant += 1; - } - gettime(&m_send, NULL); - - // send request header - HttpGetSocket::OnConnect(); - - // send body - Send(g_data); - } - - void OnContent() { -// std::cout << GetContentLength() << std::endl; - gettime(&m_reply, NULL); - { - double treply = Diff(m_send, m_reply); - // - g_min_time2 = treply < g_min_time2 ? treply : g_min_time2; - g_max_time2 = treply > g_max_time2 ? treply : g_max_time2; - g_tot_time2 += treply; - g_ant2 += 1; - } - gBytesIn += GetBytesReceived(true); - gBytesOut += GetBytesSent(true); - CreateNew(); - } - void CreateNew() { - if (g_b_off) - return; - MyHttpSocket *p = new MyHttpSocket(Handler(), m_url); - p -> SetDeleteByHandler(); - Handler().Add(p); - SetCloseAndDelete(); - } - - void OnDelete() { - } - -private: - std::string m_url; - struct timeval m_create; - struct timeval m_connect; - struct timeval m_send; - struct timeval m_reply; -}; - - -int connectors = 0; - -class ConnectorSocket : public TcpSocket -{ -public: - ConnectorSocket(ISocketHandler& h) : TcpSocket(h), m_state(0) { - } - ~ConnectorSocket() {} - - void OnConnect() { - SetTimeout(5); - connectors += 1; - std::cout << "Connected: " << connectors << std::endl; - } - - void OnTimeout() { - SetTimeout(5); - if (!m_state) - { - m_state = 1; - } - else - { - ConnectorSocket *s = new ConnectorSocket(Handler()); - s -> Open(gHost, gPort); - s -> SetDeleteByHandler(); - Handler().Add(s); - } - } - -private: - int m_state; -}; - - -#ifndef _WIN32 -void sigint(int) -{ - printreport(); - gQuit = true; -} - - -void sigusr1(int) -{ - g_b_flood = true; -} - - -void sigusr2(int) -{ - printreport_reset(); -} -#endif - - -class MyHandler : public SocketHandlerEp -{ -public: - MyHandler() : SocketHandlerEp() { - } - MyHandler(StdoutLog *p) : SocketHandlerEp(p) { - } - ~MyHandler() { - } - void Flood() { - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p0 = it -> second; - MySocket *p = dynamic_cast(p0); - if (p) - { - p -> SendBlock(); - } - } - } - void Report() { - int ant = 0; - int act = 0; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - MySocket *p = dynamic_cast(it -> second); - if (p) - { - ant++; - if (p -> IsActive()) - { - act++; - } - } - } -// printf(" Number of //stress// sockets: %d Active: %d\n", ant, act); - } -}; - - -int main(int argc,char *argv[]) -{ - bool many = false; - bool one = false; - bool enableLog = false; - bool http = false; - bool connector = false; - std::string url; - time_t report_period = 10; - for (int i = 1; i < argc; i++) - { - if (!strcmp(argv[i], "-many")) - many = true; - if (!strcmp(argv[i], "-one")) - one = true; - if (*argv[i] == '-' && strlen(argv[i]) > 1 && isdigit(argv[i][1]) ) - g_max_connections = atoi(argv[i] + 1); - if (!strcmp(argv[i], "-host") && i < argc - 1) - gHost = argv[++i]; - if (!strcmp(argv[i], "-port") && i < argc - 1) - gPort = atoi(argv[++i]); - if (!strcmp(argv[i], "-off")) - g_b_off = true; - if (!strcmp(argv[i], "-repeat")) - g_b_repeat = true; - if (!strcmp(argv[i], "-size") && i < argc - 1) - g_data_size = atoi(argv[++i]); - if (!strcmp(argv[i], "-log")) - enableLog = true; - if (!strcmp(argv[i], "-time") && i < argc - 1) - report_period = atoi(argv[++i]); - if (!strcmp(argv[i], "-stop")) - g_b_stop = true; -#ifdef HAVE_OPENSSL - if (!strcmp(argv[i], "-ssl")) - g_b_ssl = true; -#endif - if (!strcmp(argv[i], "-instant")) - g_b_instant = true; - if (!strcmp(argv[i], "-http")) - http = true; - if (!strcmp(argv[i], "-url") && i < argc - 1) - url = argv[++i]; - if (!strcmp(argv[i], "-connector")) - connector = true; - } - if (argc < 2 || (!many && !one && !g_max_connections && !http && !connector) ) - { - printf("Usage: %s [mode] [options]\n", *argv); - printf(" Modes (only use one of these):\n"); - printf(" -many start max number of connections\n"); - printf(" -one open - close - repeat\n"); - printf(" -nn open nn connections, then start -one mode\n"); - printf(" -http send/receive http request/response\n"); - printf(" Options:\n"); - printf(" -host xx host to connect to\n"); - printf(" -port nn port number to connection to\n"); - printf(" -off turn off new connections when connection limit reached\n"); - printf(" -repeat send new block when reply is received\n"); - printf(" -size nn size of block to send, default is 1024 bytes\n"); - printf(" -log enable debug log\n"); - printf(" -time nn time between reports, default 10s\n"); - printf(" -stop stop after time elapsed\n"); - printf(" -instant create all sockets at once\n"); -#ifdef HAVE_OPENSSL - printf(" -ssl use ssl\n"); -#endif - printf(" -url xx url to use in http mode (default http://:/)\n"); - printf(" -connector Use connector stress test\n"); - exit(-1); - } - fprintf(stderr, "Using data size: %d bytes\n", (int)g_data_size); - std::string chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - while (g_data.size() < g_data_size) - { - g_data += chars[rand() % chars.size()]; - } -#ifndef _WIN32 - signal(SIGINT, sigint); - signal(SIGUSR1, sigusr1); - signal(SIGUSR2, sigusr2); - signal(SIGPIPE, SIG_IGN); -#endif - StdoutLog *log = enableLog ? new StdoutLog() : NULL; - MyHandler h(log); - if (connector) - { - report_period = 4; - ConnectorSocket *s = new ConnectorSocket(h); - s -> Open(gHost, gPort); - s -> SetDeleteByHandler(); - h.Add(s); - } - else - if (http) - { - if (!url.size()) - { - url = "http://" + gHost + ":" + Utility::l2string(gPort) + "/"; - } - MyHttpSocket *s = new MyHttpSocket(h, url); - s -> SetDeleteByHandler(); - h.Add(s); - } - else - if (g_b_instant) - { - for (size_t i = 0; i < g_max_connections; i++) - { - MySocket *s = new MySocket(h, one); - s -> SetDeleteByHandler(); - s -> Open(gHost, gPort); - h.Add(s); - } - g_b_limit = true; - } - else - { - MySocket *s = new MySocket(h, one); - s -> SetDeleteByHandler(); - s -> Open(gHost, gPort); - h.Add(s); - } - time_t t = time(NULL); - gettime(&g_t_start, NULL); - while (!gQuit) - { - h.Select(1, 0); - if (g_b_flood) - { - fprintf(stderr, "\nFlooding\n"); - h.Flood(); - g_b_flood = false; - } - if (time(NULL) - t >= report_period) // report - { - t = time(NULL); - printreport_reset(); - h.Report(); - if (g_b_stop) - { - gQuit = true; - } - } - } - fprintf(stderr, "\nExiting...\n"); - if (log) - { -// delete log; - } - return 0; -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/threadstress.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/threadstress.cpp deleted file mode 100755 index 7f758e7391..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/threadstress.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#define DEB(x) x - - int count = 0; - -class EchoSocket : public TcpSocket -{ -public: - EchoSocket(ISocketHandler& h) : TcpSocket(h), m_client(false) { - SetLineProtocol(); - } - - void OnConnect() { - m_uid = "Test"; - Send(m_uid + "\n"); - m_client = true; - } - - void OnLine(const std::string& line) { - if (m_client) - { - if (line != m_uid) - throw Exception("Bad data returned."); - if (m_uid.size() < 8192) - m_uid = line + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random() % 26]; - else - SetCloseAndDelete(); - Send(m_uid + "\n"); -std::cout << m_uid << std::endl; - } - else - { - Send(line + "\n"); - } - } - - void Init() - { - if (GetParent() -> GetPort() >= 4000) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - throw Exception("SSL not available"); -#endif - } - } - -#ifdef HAVE_OPENSSL - void InitSSLServer() - { - InitializeContext("threadstress", "comb.pem", "", SSLv23_method()); - } -#endif - -private: - std::string m_uid; - bool m_client; -}; - -class StressThread : public Thread -{ -public: - StressThread(port_t port) : Thread(), m_port(port) { - SetDeleteOnExit(); - ++count; - } - ~StressThread() { - --count; - } - - void Run() { - try - { - StdoutLog log; - SocketHandler h(&log); - ListenSocket l(h); - l.Bind(m_port); - h.Add(&l); - EchoSocket client(h); - client.EnableSSL(); - client.Open("localhost", m_port); - h.Add(&client); - while (h.GetCount() > 1) - { - h.Select(1, 0); - } - std::cout << "Port#" << m_port << ": Leaving thread" << std::endl; - } - catch (const Exception& e) - { - std::cerr << "Port#" << m_port << ": " << e.ToString() << std::endl; - } - } - -private: - port_t m_port; -}; - -int main(int argc, char *argv[]) -{ - if (argc < 2) - { - printf("Usage: %s \n", *argv); - return -1; - } - signal(SIGPIPE, SIG_IGN); - for (int i = 0; i < atoi(argv[1]); i++) - new StressThread(4000 + i); - while (count > 0) - { - sleep(1); - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/x.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/x.cpp deleted file mode 100755 index 2ca9b261a1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/x.cpp +++ /dev/null @@ -1,298 +0,0 @@ -#include -#include -#include -#ifndef _WIN32 -#include -#endif -#include -#include - -#define HOST "localhost" -#define PORT 2222 - -#define TIME_US 250000 - -#define DEB(x) x - - -static bool quit = false; -static EventHandler *ph = NULL; - -static int lc = 0; -static int l2c = 0; -static int l3c = 0; - - -#ifndef _WIN32 -void sighandler(int s) -{ - quit = true; - ph -> SetQuit(); -} - - -void sigpipe(int s) -{ -} -#endif - - -class evHandler : public EventHandler -{ -public: - evHandler() : EventHandler() {} - evHandler(StdLog *p) : EventHandler(p) {} - - void CloseAll() { - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - p -> SetCloseAndDelete(); - } - } - -}; - - -class lSocket : public TcpSocket, public IEventOwner -{ -public: - lSocket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast(h)), m_id(0), m_first(first) { - SetLineProtocol(); - lc++; - } - ~lSocket() { - } - - void OnConnect() { - if (!m_id) - { - m_id = AddEvent(0, TIME_US); - } - printf("."); - fflush(stdout); - } - void OnConnectFailed() { - printf("lSocket::OnConnectFailed\n"); - } - - void OnDelete() { - if (m_first) - printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - } - - void OnEvent(int id) { - if (id != m_id) - { - printf("ID MISMATCH!\n"); - exit(-1); - } - if (!quit) - { - lSocket *p = new lSocket(Handler()); - p -> SetDeleteByHandler(); - p -> Open(HOST, PORT); - Handler().Add(p); - } - static_cast(Handler()).SetQuit( quit ); - SetCloseAndDelete(); - } - -private: - int m_id; - bool m_first; -}; - - -class l2Socket : public TcpSocket, public IEventOwner -{ -public: - l2Socket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast(h)), m_id(0), m_first(first) { - SetLineProtocol(); - l2c++; - } - ~l2Socket() { - } - - void OnConnect() { - printf("."); - fflush(stdout); - } - void OnConnectFailed() { - printf("l2Socket::OnConnectFailed\n"); - } - - void OnLine(const std::string& line) { - if (!m_id) - { - m_id = AddEvent(0, TIME_US); - } - } - - void OnDelete() { - if (m_first) - printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - } - - void OnEvent(int id) { - if (id != m_id) - { - printf("ID MISMATCH!\n"); - exit(-1); - } - if (!quit) - { - l2Socket *p = new l2Socket(Handler()); - p -> SetDeleteByHandler(); - p -> Open(HOST, PORT); - Handler().Add(p); - } - static_cast(Handler()).SetQuit( quit ); - SetCloseAndDelete(); - } - -private: - int m_id; - bool m_first; -}; - - -class l3Socket : public TcpSocket, public IEventOwner -{ -public: - l3Socket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast(h)), m_ehlo(false), m_id(0), m_first(first) { - SetLineProtocol(); - l3c++; - } - ~l3Socket() { - } - - void OnConnect() { - printf("."); - fflush(stdout); - } - void OnConnectFailed() { - printf("l3Socket::OnConnectFailed\n"); - } - - void OnLine(const std::string& line) { - if (!m_ehlo) - { - Send("EHLO alhem.net\r\n"); - m_ehlo = true; - } - else - if (!m_id) - { - m_id = AddEvent(0, TIME_US); - } - } - - void OnDelete() { - if (m_first) - printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - } - - void OnEvent(int id) { - if (id != m_id) - { - printf("ID MISMATCH!\n"); - exit(-1); - } - if (!quit) - { - l3Socket *p = new l3Socket(Handler()); - p -> SetDeleteByHandler(); - p -> Open(HOST, PORT); - Handler().Add(p); - } - static_cast(Handler()).SetQuit( quit ); - Send("QUIT\r\n"); - } - -private: - bool m_ehlo; - int m_id; - bool m_first; -}; - - -int main(int argc, char *argv[]) -{ -#ifndef _WIN32 - signal(SIGHUP, sighandler); - signal(SIGINT, sighandler); - signal(SIGPIPE, sigpipe); -#endif - - time_t tstart = time(NULL); - { - StdoutLog log; - { - evHandler h(&log); - ph = &h; - { - lSocket sock(h, true); - sock.Open(HOST, PORT); - h.Add(&sock); - { - l2Socket sock2(h, true); - sock2.Open(HOST, PORT); - h.Add(&sock2); - { - l3Socket sock3(h, true); - sock3.Open(HOST, PORT); - h.Add(&sock3); - - h.EventLoop(); - h.CloseAll(); - - // %! one socket refuses to go away - while (h.GetCount() > 1) - { - h.Select(1, 0); - } - printf("Exiting 1...\n"); - fflush(stdout); - } - printf("Exiting 2...\n"); - fflush(stdout); - } - printf("Exiting 3...\n"); - fflush(stdout); - } - printf("Exiting 4...\n"); - fflush(stdout); - } - printf("Exiting 5...\n"); - fflush(stdout); - } - printf("Exiting 6...\n"); - fflush(stdout); - - time_t tstop = time(NULL); - - time_t total = tstop - tstart + 1; - - printf("lc: %d\n", lc); - printf("l2c: %d\n", l2c); - printf("l3c: %d\n", l3c); - - printf("lc: %f\n", (double)lc / (double)total); - printf("l2c: %f\n", (double)l2c / (double)total); - printf("l3c: %f\n", (double)l3c / (double)total); -} - - diff --git a/openair2/UTIL/AT_COMMANDS/COPYING b/openair2/UTIL/AT_COMMANDS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/AT_COMMANDS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/AT_COMMANDS/parser.c b/openair2/UTIL/AT_COMMANDS/parser.c deleted file mode 100644 index 381a049f9b..0000000000 --- a/openair2/UTIL/AT_COMMANDS/parser.c +++ /dev/null @@ -1,513 +0,0 @@ -#define PARSER_C -//----------------------------------------------------------------------------- -#include "rtos_header.h" -#include "platform_types.h" -//----------------------------------------------------------------------------- -#include "parser.h" -#include -#include -#include // for random -//----------------------------------------------------------------------------- -at_command_t g_at_response_mapping[] = { - { "AT+CGATT=" , at_attach_or_detach }, - { "AT+CGATT?" , at_read_attach_status }, - { "AT+CGDCONT=" , at_set_pdcp_context }, - { "AT+CGDCONT?" , at_read_pdp_context }, - { "AT+CGACT?" , at_read_act_status }, - { "AT+CGACT=" , at_activate_pdp_context }, - { "AT+CGPADDR=" , at_read_pdp_add }, - { "AT+CGEQOS=" , at_show_eps_qos }, - { "AT+CGETFADS=", at_set_tfad_context }, - { "AT+CGETFADR=", at_read_tfad_context }, - { "AT+CGEBRMOD=", at_mod_bearer_req }, - { "AT+CGEBRMOD?", at_read_dedicated_bearer_cid }, - { "null" , NULL} -}; -//----------------------------------------------------------------------------- -size_t at_grab_string(const unsigned char *input, unsigned char **output) -//----------------------------------------------------------------------------- -{ - size_t size = 4, position = 0; - int inside_quotes = 0; - - /* Allocate initial buffer in case string is empty */ - *output = (unsigned char *)malloc(size); - - if (*output == NULL) { - printf("PARSER_LOG:Ran out of memory!\n"); - return 0; - } - - while (inside_quotes || - ( *input != ',' - && *input != ')' - && *input != 0x0d - && *input != 0x0a - && *input != 0x00)) { - - /* Check for quotes */ - if (*input == '"') { - inside_quotes = ! inside_quotes; - } - - /* We also allocate space for traling zero */ - if (position + 2 > size) { - size += 10; - *output = (unsigned char *)realloc(*output, size); - - if (*output == NULL) { - printf("PARSER_LOG:Ran out of memory!\n"); - return 0; - } - } - - /* Copy to output */ - (*output)[position] = *input; - position++; - input ++; - } - - (*output)[position] = 0; - - /* Strip quotes */ - if ((*output)[0] == '"' && (*output)[position - 1]) { - memmove(*output, (*output) + 1, position - 2); - (*output)[position - 2] = 0; - } - - printf("PARSER_LOG:Grabbed string from reply: \"%s\" (parsed %Id bytes)\n", *output, position); - return position; -} -//----------------------------------------------------------------------------- -int at_parse_command(const unsigned char *input, const char *format, ...) -//----------------------------------------------------------------------------- -{ - const char *fmt = format; - const char *inp = (const char *)input; - char *endptr; - unsigned char *out_us; - unsigned char *buffer; - size_t length; - size_t storage_size; - int *out_i; - long int *out_l; - va_list ap; - int error = 1; - - printf("PARSER_LOG:Parsing %s\n with %s\n", input, format); - - va_start(ap, format); - - while (*fmt) { - switch(*fmt++) { - case '@': - if (*fmt == 0) { - printf("PARSER_LOG:Invalid format string: %s\n", format); - error = 0; - goto end; - } - - switch(*fmt++) { - case 'i': - out_i = va_arg(ap, int *); - *out_i = strtol(inp, &endptr, 10); - - if (endptr == inp) { - error = 0; - goto end; - } - - printf("PARSER_LOG:Parsed int %d\n", *out_i); - inp = endptr; - break; - - case 'I': - out_i = va_arg(ap, int *); - *out_i = strtol(inp, &endptr, 10); - - if (endptr == inp) { - printf("PARSER_LOG:Number empty\n"); - *out_i = 0; - } else { - printf("PARSER_LOG:Parsed int %d\n", *out_i); - inp = endptr; - } - - break; - - case 'l': - out_l = va_arg(ap, long int *); - *out_l = strtol(inp, &endptr, 10); - - if (endptr == inp) { - error = 0; - goto end; - } - - printf("PARSER_LOG:Parsed long int %ld\n", *out_l); - inp = endptr; - break; - - case 'r': - out_us = va_arg(ap, unsigned char *); - storage_size = va_arg(ap, size_t); - length = at_grab_string(inp, &buffer); - printf("PARSER_LOG:Parsed raw string \"%s\"\n", buffer); - - if (strlen(buffer) > storage_size) { - free(buffer); - error = 0; - goto end; - } - - strcpy(out_us, buffer); - free(buffer); - inp += length; - break; - - case '@': - if (*inp++ != '@') { - error = 0; - goto end; - } - - break; - - case '0': - /* Just skip the rest */ - goto end; - - default: - printf("PARSER_LOG:Invalid format string (@%c): %s\n", *(fmt - 1), format); - error = 0; - goto end; - } - - break; - - case ' ': - while (isspace(*inp)) inp++; - - break; - - default: - if (*inp++ != *(fmt - 1)) { - error = 0; - goto end; - } - - break; - } - } - - /* Ignore trailing spaces */ - while (isspace(*inp)) inp++; - - if (*inp != 0) { - printf("PARSER_LOG:String do not end same!\n"); - error = 0; - goto end; - } - -end: - va_end(ap); - return error; -} -//----------------------------------------------------------------------------- -void at_attach_or_detach(char *string,int position) -//----------------------------------------------------------------------------- -{ - // From 3GPP TS 27.007 V10.4.0 (2011-06): - //---------------------+-------------------------------------------- - // Command | Possible Response(s) - //---------------------+-------------------------------------------- - // +CGATT=[] | OK - // | ERROR - //---------------------+-------------------------------------------- - // +CGATT? | +CGATT: - //---------------------+-------------------------------------------- - // +CGATT=? | +CGATT: (list of supported s) - //---------------------+-------------------------------------------- - // Description - // The execution command is used to attach the MT to, or detach the MT from, the Packet Domain service. After the - // command has completed, the MT remains in V.250 command state. If the MT is already in the requested state, the - // command is ignored and the OK response is returned. If the requested state cannot be achieved, an ERROR or - // +CME ERROR response is returned. Extended error responses are enabled by the +CMEE command. - // Any active PDP contexts will be automatically deactivated when the attachment state changes to detached. - // The read command returns the current Packet Domain service state. - // The test command is used for requesting information on the supported Packet Domain service states. - // NOTE: - // This command has the characteristics of both the V.250 action and parameter commands. Hence it has the - // read form in addition to the execution/set and test forms. - // - // Defined Values - // : : a numeric parameter that indicates the state of PS attachment - // 0 detached - // 1 attached - // Other values are reserved and will result in an ERROR response to the execution command. - - - char *temp; - char *str="+CGATT: (0,1)\r\nOK\r\n"; - int Error = -1,attach_status = -1; - - if(string[position + 1] == '?') { - printf("AT PARSER sending: %s\n",str); - at_response(str,strlen(str)); - return; - } - - temp = string + position +1; - Error = at_parse_command(temp," @i",&attach_status); - - if(Error == 1) { - switch(attach_status) { - case 1: - printf("AT PARSER: Attach command received\n"); - - if (mt_attach_request() == 1) { - at_response("OK\r\n",strlen("OK\r\n")); - - } else { - at_response("ERROR\r\n",strlen("ERROR\r\n")); - - } - - break; - - case 0: - printf("AT PARSER: Detach command received\n"); - - if (mt_detach_request() == 1) { - at_response("OK\r\n",strlen("OK\r\n")); - - } else { - at_response("ERROR\r\n",strlen("ERROR\r\n")); - - } - - break; - - default: - printf("AT PARSER: Invalid value %d\n",attach_status); - memset(at_error_log,'\0',sizeof(at_error_log)); - sprintf(at_error_log,"Invalid value %d",attach_status); - at_response(at_error_log,strlen(at_error_log)); - break; - } - } else { - printf("AT PARSER: Parse failed\n"); - memset(at_error_log,'\0',sizeof(at_error_log)); - sprintf(at_error_log,"ERROR\r\n"); - at_response(at_error_log,strlen(at_error_log)); - } -} -//----------------------------------------------------------------------------- -void at_read_attach_status(char *string,int position) -//----------------------------------------------------------------------------- -{ - if (mt_attach_state_request() == 1) { - printf( "\n PARSER_LOG: UE is Attached\n"); - at_response("+CGATT: 1\r\nOK\r\n",strlen("+CGATT: 1\r\nOK\r\n")); - } else { - printf( "\n PARSER_LOG: UE is Detached\n"); - at_response("+CGATT: 0\r\nOK\r\n",strlen("+CGATT: 0\r\nOK\r\n")); - } -} -//----------------------------------------------------------------------------- -void at_set_pdcp_context(char *string,int position) -//----------------------------------------------------------------------------- -{ - -} -//----------------------------------------------------------------------------- -void at_activate_pdp_context(char *string,int position) -//----------------------------------------------------------------------------- -{ -} -//----------------------------------------------------------------------------- -void at_read_pdp_add(char *string,int position) -//----------------------------------------------------------------------------- -{ -} - -//----------------------------------------------------------------------------- -void at_read_pdp_context(char *string,int position) -//----------------------------------------------------------------------------- -{ -} -//----------------------------------------------------------------------------- -void at_read_act_status(char *string,int position) -//----------------------------------------------------------------------------- -{ -} -//----------------------------------------------------------------------------- -void at_show_eps_qos(char *string,int position) -//----------------------------------------------------------------------------- -{ -} -//----------------------------------------------------------------------------- -void at_set_tfad_context(char *string,int position) -//----------------------------------------------------------------------------- -{ -} -//----------------------------------------------------------------------------- -void at_read_tfad_context(char *string,int position) -//----------------------------------------------------------------------------- -{ -} -//----------------------------------------------------------------------------- -void at_mod_bearer_req(char *string,int position) -//----------------------------------------------------------------------------- -{ -} -//----------------------------------------------------------------------------- -void at_read_dedicated_bearer_cid(char *string,int position) -//----------------------------------------------------------------------------- -{ -} -//----------------------------------------------------------------------------- -int at_convert_hex_to_dec(char *temp,int size) -//----------------------------------------------------------------------------- -{ - int res = 0,i =0,hex_value = 0,Power = 1,j; - - for(i = 0; i < size; i++) { - switch(temp[size - i - 1]) { - case 'A': - case 'a': - hex_value = 10; - break; - - case 'B': - case 'b': - hex_value = 11; - break; - - case 'C': - case 'c': - hex_value = 12; - break; - - case 'D': - case 'd': - hex_value = 13; - break; - - case 'E': - case 'e': - hex_value = 14; - break; - - case 'F': - case 'f': - hex_value = 15; - break; - - default: - hex_value = temp[size - i - 1] - '0'; - } - - for(j = 1,Power = 1; j <= i ; j++) - Power = Power * 16; - - res = res + (hex_value * Power); - } - - return res; -} -//----------------------------------------------------------------------------- -void at_parse_string(char * at_strP) -//----------------------------------------------------------------------------- -{ - char *buffer = NULL; - char format[4] = "=?\n"; - char * ptr; - int i=0,pos = -1,flag = 0; - - // was /r - if((buffer = strchr(at_strP,'\r'))!=NULL) { - memset(at_command, 0, AT_CMD_BUFFSIZE); - memcpy(at_command, at_strP, buffer-at_strP); - //*(buffer + 1) = '\0'; - printf("AT PARSER:received = %s\n",at_command); - } else { - printf("PARSER_LOG:invalid command : Enter Again\n"); - memset(at_error_log,'\0',sizeof(at_error_log)); - sprintf(at_error_log,"invalid command : Enter Again"); - at_response(at_error_log,strlen(at_error_log)); - return; - } - - buffer = at_command; - ptr = strpbrk(buffer,format); - pos = ptr - buffer; - - while(strcmp(g_at_response_mapping[i].command,"null")!=0) { - if(strncmp(buffer,g_at_response_mapping[i].command,pos+1)== 0) { - flag=1; - break; - } - - i++; - } - - if(flag == 0 ) { - printf("PARSER_LOG:unknown command \n"); - memset(at_error_log,'\0',sizeof(at_error_log)); - sprintf(at_error_log,"unknown command"); - printf("IFM<-UeMgr [ label = \"Unknown AT CMD\" ] ;"); - at_response(at_error_log,strlen(at_error_log)); - return; - } else { - g_at_response_mapping[i].ResponseFunction(at_command,pos); - } -} -//----------------------------------------------------------------------------- -void at_parse_init(void (*at_response_handler)(char*, int), - int (*mt_attach_state_request_handler)(void), - int (*mt_attach_request_handler)(void), - int (*mt_detach_request_handler)(void)) -//----------------------------------------------------------------------------- -{ - at_response = at_response_handler; - mt_attach_state_request = mt_attach_state_request_handler; - mt_attach_request = mt_attach_request_handler; - mt_detach_request = mt_detach_request_handler; -} -//----------------------------------------------------------------------------- -void at_null_callback_handler(char* string, int size) -//----------------------------------------------------------------------------- -{ - char at_response[AT_CMD_BUFFSIZE]; - - assert(size > 0); - assert(size < AT_CMD_BUFFSIZE); - strncpy(at_response, string, size); - at_response[size] = 0; - printf("AT DEFAULT CALLBACK HANDLER RECEIVED RESPONSE: %s\n", at_response); -} -//----------------------------------------------------------------------------- -int mt_null_attach_state_request_handler(void) -//----------------------------------------------------------------------------- -{ - int n; - n=rand() %2; /* n is random number in range of 0 - 1 */ - return(n); -} -//----------------------------------------------------------------------------- -int mt_null_attach_request_handler(void) -//----------------------------------------------------------------------------- -{ - int n; - n=rand() %2; /* n is random number in range of 0 - 1 */ - return(n); -} -//----------------------------------------------------------------------------- -int mt_null_detach_request_handler(void) -//----------------------------------------------------------------------------- -{ - int n; - n=rand() %2; /* n is random number in range of 0 - 1 */ - return(n); -} diff --git a/openair2/UTIL/AT_COMMANDS/parser.h b/openair2/UTIL/AT_COMMANDS/parser.h deleted file mode 100644 index 634b698ebf..0000000000 --- a/openair2/UTIL/AT_COMMANDS/parser.h +++ /dev/null @@ -1,220 +0,0 @@ -/***************************************************************** - * - * File Name : parser.h - * Author: Sharad Gupta - * Decription: contains declarations for parser functions - * - * Copyright 2009, Hughes Systique India Private Limited - * - ***************************************************************/ -#ifndef _PARSER_H -# define _PARSER_H -# ifdef PARSER_C -# define private_at_commands(x) x -# define protected_at_commands(x) x -# define public_at_commands(x) x -# else -# define private_at_commands(x) -# define protected_at_commands(x) -# define public_at_commands(x) extern x -# endif -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -#include "platform_types.h" -#include "log.h" - - -#define AT_CMD_BUFFSIZE 512 -//---------------------------------------------------------------------------- -typedef struct { - char *command; - void (*ResponseFunction) (char *,int); -} at_command_t; - - -//---------------------------------------------------------------------------- -protected_at_commands(char at_error_log[AT_CMD_BUFFSIZE];) -protected_at_commands(char at_command[AT_CMD_BUFFSIZE];) -//---------------------------------------------------------------------------- -/** -\fn void (*at_response)(char*, int) -Procedure callback for response to AT command. -@param string Response. -@param size Size of response in bytes. -**/ -public_at_commands(void (*at_response)(char* string, int size);) -/** -\fn int (*mt_attach_state_request)(void) -Procedure for requesting the status of the attachment of MT. -@return attach state of MT (1 for attached, 0 for detached). -**/ -public_at_commands(int (*mt_attach_state_request)(void);) -/** -\fn int (*mt_attach_request)(void) -Procedure for requesting the attach of MT. -@return Result of attach (1 for OK, 0 for ERROR). -**/ -public_at_commands(int (*mt_attach_request)(void);) -/** -\fn int (*mt_detach_request)(void) -Procedure for requesting the detach of MT. -@return Result of detach (1 for OK, 0 for ERROR). -**/ -public_at_commands(int (*mt_detach_request)(void);) -/** -\fn size_t at_grab_string(const unsigned char *input, unsigned char **output) - Grabs single string parameter from AT command reply. Removing possible quotes. -@param input Input string to parse. -@param output Pointer to pointer to char, buffer will be allocated. -@return Length of parsed string. -**/ -private_at_commands(size_t at_grab_string(const unsigned char *input, unsigned char **output);) -/** -\fn int at_parse_command(const unsigned char *input, const char *format, ...) -This function actually parses the string on the basis of format string provided. -@param input String to be parsed. -@param format This is the format string which contains format of input string. -@return success (1), or failure (0). -**/ -private_at_commands(int at_parse_command(const unsigned char *input, const char *format, ...);) -/** -\fn void at_attach_or_detach(char *string,int position) -This function attaches or detaches the UE based on the string. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_attach_or_detach(char *string,int position);) -/** -\fn void at_read_attach_status(char *string,int position) -This function checks whether the UE is attached or detached. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_read_attach_status(char *string,int position);) -/** -\fn void at_set_pdcp_context(char *string,int position) -This function stores the PDP context of a UE at a particular CID. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_set_pdcp_context(char *string,int position);) -/** -\fn void at_activate_pdp_context(char *string,int position) -This function activates a particular PDN connection on the basis of CID in the AT command. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_activate_pdp_context(char *string,int position);) -/** -\fn void at_read_pdp_add(char *string,int position) -This function reads the PDP address on the basis of CID in the AT command. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_read_pdp_add(char *string,int position);) -/** -\fn void at_read_pdp_context(char *string,int position) -This function reads the PDP context defined by the at_set_pdcp_context function. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_read_pdp_context(char *string,int position);) -/** -\fn void at_read_act_status(char *string,int position) -This function reads the activation status of a PDP context defined by the at_set_pdcp_context function. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_read_act_status(char *string,int position);) -/** -\fn void at_show_eps_qos(char *string,int position) -This function reads the QOS parameters on the basis of CID. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_show_eps_qos(char *string,int position);) -/** -\fn void at_set_tfad_context(char *string,int position) -This function sets the TFAD context for the UE. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_set_tfad_context(char *string,int position);) -/** -\fn void at_read_tfad_context(char *string,int position) -This function Read the TFAD context for the UE. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_read_tfad_context(char *string,int position);) -/** -\fn void at_mod_bearer_req(char *string,int position) -This function sends the Modify bearer request to RRC. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_mod_bearer_req(char *string,int position);) -/** -\fn void at_read_dedicated_bearer_cid(char *string,int position) -This function reads the dedicated bearer CIDs associated with the default bearer CID. -@param string string containing the AT command received. -@param position Position of the string from where the parsing is to be started. -**/ -private_at_commands(void at_read_dedicated_bearer_cid(char *string,int position);) -/** -\fn int at_convert_hex_to_dec(char *temp,int size) -This function converts the Hex string to decimal. -@param temp Hexadecimal string. -@param size bytes of the string to be converted. -@return Converted decimal value as an integer. -**/ -private_at_commands(int at_convert_hex_to_dec(char *temp,int size);) -/** -\fn void at_parse_string(char * str) -This function calls the appropriate parser function for parsing the command. -@param str AT command to be parsed. -**/ -public_at_commands(void at_parse_string(char * str);) -/** -\fn void at_parse_init(void (*at_response_handler)(char*, int)) -This function register the handler, handling responses from AT commands parser. -@param at_response_handler handler procedure. -**/ -public_at_commands(void at_parse_init(void (*at_response_handler)(char*, int), int (*mt_attach_state_request_handler)(void), int (*mt_attach_request_handler)(void), - int (*mt_detach_request_handler)(void));) -/** -\fn void at_null_callback_handler(char* string, int size) -This function register the handler, handling responses from AT commands parser. -@param string message sent back from the AT commands parser to the caller. -@param size Size in bytes of the message. -**/ -public_at_commands(void at_null_callback_handler(char* string, int size);) -/** -\fn int mt_null_attach_state_request_handler(void) -This function is a dummy MT handler for requesting the status of aatachment of the MT. -@return Random/simulated attach state of MT (1 for attached, 0 for detached). -**/ -public_at_commands(int mt_null_attach_state_request_handler(void);) -/** -\fn int mt_null_attach_request_handler(void) -This function is a dummy MT handler for requesting the attach of the MT. -@return Random/simulated attach state of MT (1 for OK, 0 for ERROR). -**/ -public_at_commands(int mt_null_attach_request_handler(void);) -/** -\fn int mt_null_detach_request_handler(void) -This function is a dummy MT handler for requesting the detach of the MT. -@return Random/simulated detach state of MT (1 for OK, 0 for ERROR). -**/ -public_at_commands(int mt_null_detach_request_handler(void);) - -#endif diff --git a/openair2/UTIL/OCG/Readme.doxy b/openair2/UTIL/OCG/Readme.doxy deleted file mode 100644 index e14086e4a0..0000000000 --- a/openair2/UTIL/OCG/Readme.doxy +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file Readme.doxy -* \brief explain how this block is organized, and how it works -* \author Lusheng Wang -* \date 2011 -* \version 0.1 -* \note This cde is under GNU GENERAL PUBLIC LICENSE, version 2, June 1991 -* \warning -*/ - -/*! \page _readme Readme - -The content of this readme is the following: - - -# What is this block about in OpenAirInterface - -# Organization of the folders and their dependancies - -# Folders and files description - -# Makefile targets and how to build - -# How to use OCG: run a simple experimentation - - -\section _block What is this block about in OpenAirInterface ? - - This block is called OpenAirInterface Configuration Generation (OCG). Its major function is to parse the XML configuration file and configure an emulation. - - When the user specifies a scenario for emulation from the web portal, the web portal will generate an XML configuration file in the scenario folder of OCG. OCG automatically detects this file and initiates an emulation for it. During the emulation, OCG calls other blocks (such as MobiGen and TrafficGen) and gets feedbacks from them. After the emulation, OCG generates output files in the created folder of the emulation. - - OCG contains the following key modules: - - a) get opt : Get options of the OCG command, e.g. "OCG -f" and "OCG -h" - - b) detect file : Detect new XML configuration file in the scenario folder - - c) parse filename : Parse the filename to get user name and file date - - d) create dir : Create directory in the output directory for an emulation - - e) parse XML : Parse the XML configuration file - - f) save XML : Save the XML configuration file in created directory - - g) call emu : Call the emulator - - h) generate report : Generate a report to show the states of OCG modules - - - \image html fsm_flow_chart.png "Finit State Machine of OCG" width=2cm - - -\section _organization Organization of the folders and their dependancies - - - - - - - - - -
Folder Description
src/contains source files
include/contains header files
demo/contains XML configuration files for demo
detecting_XML/contains nothing, but OCG will detect here the XML files generated by the web portal
output_folder/if filename of the XML file can be successfully parsed, OCG creates output folders for users and generates output files for emulations here
temp_output_folder/if filename of the XML file cannot be successfully parsed, OCG generates an output file here
- - -\section _folders Folders and files description - - - - - - - - - - - - - - - - - - - - - - -
Folder/File Description
src/OCG.ccontains the main() function with the FSM of OCG
src/OCG_get_opt.ccontains the get_opt() function
src/OCG_detect_file.ccontains the detect_file() function
src/OCG_parse_filename.ccontains the parse_filename() function
src/OCG_create_dir.ccontains the create_dir() function
src/OCG_parse_XML.ccontains the parse_XML() function
src/OCG_save_XML.ccontains the save_XML() function
src/OCG_call_emu.ccontains the call_emu() function
src/OCG_generate_report.ccontains the generate_report() function
include/OCG.hheader file of main(), contains the data structure of the basic OpenAirInterface Scenario Descriptor (OSD), etc.
include/OCG_get_opt.hheader file of get_opt()
include/OCG_detect_file.hheader file of detect_file()
include/OCG_parse_filename.hheader file of parse_filename()
include/OCG_create_dir.hheader file of create_dir()
include/OCG_parse_XML.hheader file of parse_XML(), contains the declaration of parsing position indicators
include/OCG_save_XML.hheader file of save_XML()
include/OCG_call_emu.hheader file of call_emu()
include/OCG_generate_report.hheader file of generate_report()
demo/eurecom.20110208110244.xmlcontains a demo
- - -\section _makefile Makefile targets and how to build - - - CC= gcc - CFLAGS = -I/usr/include/libxml2 - LIB = -lxml2 - - OCG: - ${CC} ${CFLAGS} ${LIB} src/OCG.c src/OCG_get_opt.c src/OCG_detect_file.c src/OCG_parse_filename.c src/OCG_create_dir.c src/OCG_parse_XML.c src/OCG_save_XML.c src/OCG_call_emu.c src/OCG_generate_OCG_report.c -o OCG - - -\section _howto How to use OCG: run a simple experimentation - - There are two methods to use the OCG for an emulation: - - a) DEMO mode : use command "OCG -f filename" to run a DEMO mode emulation - - The following steps are required for a DEMO mode emulation: - - i) Put your XML configuration file into the demo/ folder; - - ii) Change the filename as user_name.file_date.xml; - - iii) Run the emulation with the above command; - - iv) Check debug information in the shell, which indicates you the directory where OCG generates the outputs. - - To run an existing demo XML file, step i) and ii) are not required. - - Note that OCG automatically set the path of a demo XML file as demo/, so only filename is required in the command. - - b) USER mode : use command "OCG" to start OCG as a daemon - - The following steps are required for a USER mode emulation: - - i) Run OCG as a daemon with the above command; - - iiA) Configure an emulation scenario through the web portal and press the button to generate an XML file; or - - iiB) Copy your XML file to the detecting_XML/ folder directly; - - iii) Check debug information in the shell, which indicates you the directory where OCG generates the outputs. - - For option iiB), make sure the filename is with the correct format "user_name.file_date.xml". Moreover, make sure the configuration in the XML file is correct. - - For the format of the XML configuration file, refer to "demo/eurecom.20110208110244.xml". - -*/ - diff --git a/openair2/UTIL/OMG/TraCIConstants.h b/openair2/UTIL/OMG/TraCIConstants.h index 8968c2a283..6a123bb5d5 100644 --- a/openair2/UTIL/OMG/TraCIConstants.h +++ b/openair2/UTIL/OMG/TraCIConstants.h @@ -1,715 +1,52 @@ -/****************************************************************************/ -/// @file TraCIConstants.h -/// @author Axel Wegener -/// @date 2007/10/24 -/// @version $Id: TraCIConstants.h 9525 2011-01-04 21:22:52Z behrisch $ -/// -/// holds codes used for TraCI -/****************************************************************************/ -// SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ -// Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors -/****************************************************************************/ -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -/****************************************************************************/ - #ifndef TRACICONSTANTS_H #define TRACICONSTANTS_H +// command: subscribe simulation variable +#define CMD_SUBSCRIBE_SIM_VARIABLE 0xdb -// **************************************** -// COMMANDS -// **************************************** -// command: get version -#define CMD_GETVERSION 0x00 - -// command: simulation step -#define CMD_SIMSTEP 0x01 +// departed vehicle ids (get: simulation) +#define VAR_DEPARTED_VEHICLES_IDS 0x74 // command: simulation step (new version) #define CMD_SIMSTEP2 0x02 -// command: set maximum speed -#define CMD_SETMAXSPEED 0x11 +// command: close sumo +#define CMD_CLOSE 0x7F -// command: stop node -#define CMD_STOP 0x12 - -// command: set lane -#define CMD_CHANGELANE 0x13 - -// command: slow down -#define CMD_SLOWDOWN 0x14 - -// command: change route -#define CMD_CHANGEROUTE 0x30 - -// command: change target -#define CMD_CHANGETARGET 0x31 - -// command: subscribe lifecycles -#define CMD_SUBSCRIBELIFECYCLES 0x61 - -// command: unsubscribe lifecycles -#define CMD_UNSUBSCRIBELIFECYCLES 0x62 - -// command: object creation -#define CMD_OBJECTCREATION 0x63 - -// command: object destruction -#define CMD_OBJECTDESTRUCTION 0x64 - -// command: object domain subscription -#define CMD_SUBSCRIBEDOMAIN 0x65 - -// command: object domain unsubscription -#define CMD_UNSUBSCRIBEDOMAIN 0x66 - -// command: object update -#define CMD_UPDATEOBJECT 0x67 - -// command: Simulation Parameter -#define CMD_SIMPARAMETER 0x70 - -// command: Position Conversion -#define CMD_POSITIONCONVERSION 0x71 - -// command: Distance Request -#define CMD_DISTANCEREQUEST 0x72 +// command: get vehicle variable +#define CMD_GET_VEHICLE_VARIABLE 0xa4 // command: Scenario #define CMD_SCENARIO 0x73 -// command: add vehicle -#define CMD_ADDVEHICLE 0x74 +// max count of vehicles +#define DOMVAR_MAXCOUNT 0x0A -// command: move node -#define CMD_MOVENODE 0x80 - -// command: close sumo -#define CMD_CLOSE 0x7F - -// command: -#define CMD_UPDATECALIBRATOR 0x50 - -// command: get all traffic light ids -#define CMD_GETALLTLIDS 0x40 - -// command: get traffic light status -#define CMD_GETTLSTATUS 0x41 - -// command: report traffic light id -#define CMD_TLIDLIST 0x90 - -// command: report traffic light status switch -#define CMD_TLSWITCH 0x91 - -// command: get induction loop (e1) variable -#define CMD_GET_INDUCTIONLOOP_VARIABLE 0xa0 -// response: get induction loop (e1) variable -#define RESPONSE_GET_INDUCTIONLOOP_VARIABLE 0xb0 -// command: subscribe induction loop (e1) variable -#define CMD_SUBSCRIBE_INDUCTIONLOOP_VARIABLE 0xd0 -// response: subscribe induction loop (e1) variable -#define RESPONSE_SUBSCRIBE_INDUCTIONLOOP_VARIABLE 0xe0 - -// command: get multi-entry/multi-exit detector (e3) variable -#define CMD_GET_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE 0xa1 -// response: get areal detector (e3) variable -#define RESPONSE_GET_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE 0xb1 -// command: subscribe multi-entry/multi-exit detector (e3) variable -#define CMD_SUBSCRIBE_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE 0xd1 -// response: subscribe areal detector (e3) variable -#define RESPONSE_SUBSCRIBE_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE 0xe1 - -// command: get traffic lights variable -#define CMD_GET_TL_VARIABLE 0xa2 -// response: get traffic lights variable -#define RESPONSE_GET_TL_VARIABLE 0xb2 -// command: set traffic lights variable -#define CMD_SET_TL_VARIABLE 0xc2 -// command: subscribe traffic lights variable -#define CMD_SUBSCRIBE_TL_VARIABLE 0xd2 -// response: subscribe traffic lights variable -#define RESPONSE_SUBSCRIBE_TL_VARIABLE 0xe2 - -// command: get lane variable -#define CMD_GET_LANE_VARIABLE 0xa3 -// response: get lane variable -#define RESPONSE_GET_LANE_VARIABLE 0xb3 -// command: set lane variable -#define CMD_SET_LANE_VARIABLE 0xc3 -// command: subscribe lane variable -#define CMD_SUBSCRIBE_LANE_VARIABLE 0xd3 -// response: subscribe lane variable -#define RESPONSE_SUBSCRIBE_LANE_VARIABLE 0xe3 - -// command: get vehicle variable -#define CMD_GET_VEHICLE_VARIABLE 0xa4 -// response: get vehicle variable -#define RESPONSE_GET_VEHICLE_VARIABLE 0xb4 -// command: set vehicle variable -#define CMD_SET_VEHICLE_VARIABLE 0xc4 -// command: subscribe vehicle variable -#define CMD_SUBSCRIBE_VEHICLE_VARIABLE 0xd4 -// response: subscribe vehicle variable -#define RESPONSE_SUBSCRIBE_VEHICLE_VARIABLE 0xe4 - -// command: get vehicle type variable -#define CMD_GET_VEHICLETYPE_VARIABLE 0xa5 -// response: get vehicle type variable -#define RESPONSE_GET_VEHICLETYPE_VARIABLE 0xb5 -// command: set vehicle type variable -#define CMD_SET_VEHICLETYPE_VARIABLE 0xc5 -// command: subscribe vehicle type variable -#define CMD_SUBSCRIBE_VEHICLETYPE_VARIABLE 0xd5 -// response: subscribe vehicle type variable -#define RESPONSE_SUBSCRIBE_VEHICLETYPE_VARIABLE 0xe5 - -// command: get route variable -#define CMD_GET_ROUTE_VARIABLE 0xa6 -// response: get route variable -#define RESPONSE_GET_ROUTE_VARIABLE 0xb6 -// command: set route variable -#define CMD_SET_ROUTE_VARIABLE 0xc6 -// command: subscribe route variable -#define CMD_SUBSCRIBE_ROUTE_VARIABLE 0xd6 -// response: subscribe route variable -#define RESPONSE_SUBSCRIBE_ROUTE_VARIABLE 0xe6 - -// command: get poi variable -#define CMD_GET_POI_VARIABLE 0xa7 -// response: get poi variable -#define RESPONSE_GET_POI_VARIABLE 0xb7 -// command: set poi variable -#define CMD_SET_POI_VARIABLE 0xc7 -// command: subscribe poi variable -#define CMD_SUBSCRIBE_POI_VARIABLE 0xd7 -// response: subscribe poi variable -#define RESPONSE_SUBSCRIBE_POI_VARIABLE 0xe7 - -// command: get polygon variable -#define CMD_GET_POLYGON_VARIABLE 0xa8 -// response: get polygon variable -#define RESPONSE_GET_POLYGON_VARIABLE 0xb8 -// command: set polygon variable -#define CMD_SET_POLYGON_VARIABLE 0xc8 -// command: subscribe polygon variable -#define CMD_SUBSCRIBE_POLYGON_VARIABLE 0xd8 -// response: subscribe polygon variable -#define RESPONSE_SUBSCRIBE_POLYGON_VARIABLE 0xe8 - -// command: get junction variable -#define CMD_GET_JUNCTION_VARIABLE 0xa9 -// response: get junction variable -#define RESPONSE_GET_JUNCTION_VARIABLE 0xb9 -// command: set junction variable -#define CMD_SET_JUNCTION_VARIABLE 0xc9 -// command: subscribe junction variable -#define CMD_SUBSCRIBE_JUNCTION_VARIABLE 0xd9 -// response: subscribe junction variable -#define RESPONSE_SUBSCRIBE_JUNCTION_VARIABLE 0xe9 - -// command: get edge variable -#define CMD_GET_EDGE_VARIABLE 0xaa -// response: get edge variable -#define RESPONSE_GET_EDGE_VARIABLE 0xba -// command: set edge variable -#define CMD_SET_EDGE_VARIABLE 0xca -// command: subscribe edge variable -#define CMD_SUBSCRIBE_EDGE_VARIABLE 0xda -// response: subscribe edge variable -#define RESPONSE_SUBSCRIBE_EDGE_VARIABLE 0xea - -// command: get simulation variable -#define CMD_GET_SIM_VARIABLE 0xab -// response: get simulation variable -#define RESPONSE_GET_SIM_VARIABLE 0xbb -// command: set simulation variable -#define CMD_SET_SIM_VARIABLE 0xcb -// command: subscribe simulation variable -#define CMD_SUBSCRIBE_SIM_VARIABLE 0xdb -// response: subscribe simulation variable -#define RESPONSE_SUBSCRIBE_SIM_VARIABLE 0xeb - -// command: get GUI variable -#define CMD_GET_GUI_VARIABLE 0xac -// response: get GUI variable -#define RESPONSE_GET_GUI_VARIABLE 0xbc -// command: set GUI variable -#define CMD_SET_GUI_VARIABLE 0xcc -// command: subscribe GUI variable -#define CMD_SUBSCRIBE_GUI_VARIABLE 0xdc -// response: subscribe GUI variable -#define RESPONSE_SUBSCRIBE_GUI_VARIABLE 0xec - - - -// **************************************** -// POSITION REPRESENTATIONS -// **************************************** -// Omit position -#define POSITION_NONE 0x00 -// 2D cartesian coordinates -#define POSITION_2D 0x01 -// 2.5D cartesian coordinates -#define POSITION_2_5D 0x02 -// 3D cartesian coordinates -#define POSITION_3D 0x03 -// Position on road map -#define POSITION_ROADMAP 0x04 - - - -// **************************************** -// DATA TYPES -// **************************************** -// Boundary Box -#define TYPE_BOUNDINGBOX 0x05 -// Polygon -#define TYPE_POLYGON 0x06 -// unsigned byte -#define TYPE_UBYTE 0x07 -// signed byte -#define TYPE_BYTE 0x08 // 32 bit integer #define TYPE_INTEGER 0x09 -// float -#define TYPE_FLOAT 0x0A -// double -#define TYPE_DOUBLE 0x0B -// 8 bit ASCII string -#define TYPE_STRING 0x0C -// list of traffic light phases -#define TYPE_TLPHASELIST 0x0D -// list of strings -#define TYPE_STRINGLIST 0x0E -// compound object -#define TYPE_COMPOUND 0x0F -// color (four ubytes) -#define TYPE_COLOR 0x11 +// speed of a node +#define DOMVAR_SPEED 0x04 +// position of a domain object +#define DOMVAR_POSITION 0x02 + +// position (2D) (get: vehicle, poi, set: poi) +#define VAR_POSITION 0x42 + +// speed (get: vehicle) +#define VAR_SPEED 0x40 + +// position of a domain object +#define DOMVAR_POSITION 0x02 + +// ids of arrived vehicles (get: simulation) +#define VAR_ARRIVED_VEHICLES_IDS 0x7a // **************************************** // RESULT TYPES // **************************************** // result type: Ok #define RTYPE_OK 0x00 -// result type: not implemented -#define RTYPE_NOTIMPLEMENTED 0x01 -// result type: error -#define RTYPE_ERR 0xFF - - - -// **************************************** -// DOMAIN IDs (FOR SCENARIO COMMAND) -// **************************************** -// road map domain -#define DOM_ROADMAP 0x00 -// vehicle domain -#define DOM_VEHICLE 0x01 -// traffic lights domain -#define DOM_TRAFFICLIGHTS 0x02 -// points of interest domain -#define DOM_POI 0x03 -// polygon domain -#define DOM_POLYGON 0x04 - - - -// **************************************** -// VARIABLE IDs (FOR SCENARIO COMMAND) -// **************************************** -// count of domain objects -#define DOMVAR_COUNT 0x01 -// position of a domain object -#define DOMVAR_POSITION 0x02 -// boundaries of simulation net -#define DOMVAR_BOUNDINGBOX 0x03 -// speed of a node -#define DOMVAR_SPEED 0x04 -// actual phase of a traffic light -#define DOMVAR_CURTLPHASE 0x05 -// next phase of a traffic light -#define DOMVAR_NEXTTLPHASE 0x06 -// type of a domain object (poi, polygon) -#define DOMVAR_TYPE 0x07 -// layer a domain object is located at (poi, polygon) -#define DOMVAR_LAYER 0x08 -// shape of a polygon -#define DOMVAR_SHAPE 0x09 -// max count of vehicles -#define DOMVAR_MAXCOUNT 0x0A -// count of TraCI vehicles -#define DOMVAR_EQUIPPEDCOUNT 0x0B -// max count of TraCI vehicles -#define DOMVAR_EQUIPPEDCOUNTMAX 0x0C -// id string of a domain object -#define DOMVAR_NAME 0x0D -// route, a car plans to drive -#define DOMVAR_ROUTE 0x0E -// maximum allowed speed of a node -#define DOMVAR_ALLOWED_SPEED 0x0F -// air distance from a certain object to a position -#define DOMVAR_AIRDISTANCE 0x10 -// driving distance from a certain object to a position -#define DOMVAR_DRIVINGDISTANCE 0x11 -// external integer id of a certain object -#define DOMVAR_EXTID 0x12 -// angle of a certain object, in degrees [0..360) -#define DOMVAR_ANGLE 0x13 -// current simulation time -#define DOMVAR_SIMTIME 0x14 -// current CO2 emission of a node -#define DOMVAR_CO2EMISSION 0x20 -// current CO emission of a node -#define DOMVAR_COEMISSION 0x21 -// current HC emission of a node -#define DOMVAR_HCEMISSION 0x22 -// current PMx emission of a node -#define DOMVAR_PMXEMISSION 0x23 -// current NOx emission of a node -#define DOMVAR_NOXEMISSION 0x24 -// current fuel consumption of a node -#define DOMVAR_FUELCONSUMPTION 0x25 -// current noise emission of a node -#define DOMVAR_NOISEEMISSION 0x26 - - - -// **************************************** -// TRAFFIC LIGHT PHASES -// **************************************** -// red phase -#define TLPHASE_RED 0x01 -// yellow phase -#define TLPHASE_YELLOW 0x02 -// green phase -#define TLPHASE_GREEN 0x03 -// tl is blinking -#define TLPHASE_BLINKING 0x04 -// tl is off and not blinking -#define TLPHASE_NOSIGNAL 0x05 - - - -// **************************************** -// DIFFERENT DISTANCE REQUESTS -// **************************************** -// air distance -#define REQUEST_AIRDIST 0x00 -// driving distance -#define REQUEST_DRIVINGDIST 0x01 - - - -// **************************************** -// VARIABLE TYPES (for CMD_GET_*_VARIABLE) -// **************************************** -// list of instances' ids (get: induction loops, areal detector, traffic lights) -#define ID_LIST 0x00 - -// last step vehicle number (get: induction loops, multi-entry/multi-exit detector, lanes, edges) -#define LAST_STEP_VEHICLE_NUMBER 0x10 - -// last step vehicle number (get: induction loops, multi-entry/multi-exit detector, lanes, edges) -#define LAST_STEP_MEAN_SPEED 0x11 - -// last step vehicle number (get: induction loops, multi-entry/multi-exit detector, lanes, edges) -#define LAST_STEP_VEHICLE_ID_LIST 0x12 - -// last step occupancy (get: induction loops, lanes, edges) -#define LAST_STEP_OCCUPANCY 0x13 - -// last step vehicle halting number (get: multi-entry/multi-exit detector, lanes, edges) -#define LAST_STEP_VEHICLE_HALTING_NUMBER 0x14 - -// last step mean vehicle length (get: induction loops, lanes, edges) -#define LAST_STEP_LENGTH 0x15 - -// last step time since last detection (get: induction loops) -#define LAST_STEP_TIME_SINCE_DETECTION 0x16 - - -// traffic light states, encoded as rRgGyYoO tuple (get: traffic lights) -#define TL_RED_YELLOW_GREEN_STATE 0x20 - -// traffic light states, encoded phase, brake, and yellow tuple (get: traffic lights, set: traffic lights) -#define TL_PHASE_BRAKE_YELLOW_STATE 0x21 - -// index of the phase (set: traffic lights) -#define TL_PHASE_INDEX 0x22 - -// traffic light program (set: traffic lights) -#define TL_PROGRAM 0x23 - -// phase duration (set: traffic lights) -#define TL_PHASE_DURATION 0x24 - -// complete definition (get: traffic lights) -#define TL_COMPLETE_DEFINITION_PBY 0x25 - -// controlled lanes (get: traffic lights) -#define TL_CONTROLLED_LANES 0x26 - -// controlled links (get: traffic lights) -#define TL_CONTROLLED_LINKS 0x27 - -// index of the current phase (get: traffic lights) -#define TL_CURRENT_PHASE 0x28 - -// name of the current program (get: traffic lights) -#define TL_CURRENT_PROGRAM 0x29 - -// controlled junctions (get: traffic lights) -#define TL_CONTROLLED_JUNCTIONS 0x2a - -// complete definition (get: traffic lights) -#define TL_COMPLETE_DEFINITION_RYG 0x2b - -// complete program (set: traffic lights) -#define TL_COMPLETE_PROGRAM_RYG 0x2c - -// assumed time to next switch (get: traffic lights) -#define TL_NEXT_SWITCH 0x2d - - - -// outgoing link number (get: lanes) -#define LANE_LINK_NUMBER 0x30 - -// id of parent edge (get: lanes) -#define LANE_EDGE_ID 0x31 - -// outgoing link definitions (get: lanes) -#define LANE_LINKS 0x33 - -// list of allowed vehicle classes (get&set: lanes) -#define LANE_ALLOWED 0x34 - -// list of not allowed vehicle classes (get&set: lanes) -#define LANE_DISALLOWED 0x35 - - -// speed (get: vehicle) -#define VAR_SPEED 0x40 - -// maximum allowed/possible speed (get: vehicle types, lanes, set: edges, lanes) -#define VAR_MAXSPEED 0x41 - -// position (2D) (get: vehicle, poi, set: poi) -#define VAR_POSITION 0x42 - -// angle (get: vehicle) -#define VAR_ANGLE 0x43 - -// angle (get: vehicle types, lanes, set: lanes) -#define VAR_LENGTH 0x44 - -// color (get: vehicles, vehicle types, polygons, pois) -#define VAR_COLOR 0x45 - -// max. acceleration (get: vehicle types) -#define VAR_ACCEL 0x46 - -// max. deceleration (get: vehicle types) -#define VAR_DECEL 0x47 - -// driver reaction time (get: vehicle types) -#define VAR_TAU 0x48 - -// vehicle class (get: vehicle types) -#define VAR_VEHICLECLASS 0x49 - -// emission class (get: vehicle types) -#define VAR_EMISSIONCLASS 0x4a - -// shape class (get: vehicle types) -#define VAR_SHAPECLASS 0x4b - -// offset (brake gap) (get: vehicle types) -#define VAR_GUIOFFSET 0x4c - -// width (get: vehicle types) -#define VAR_WIDTH 0x4d - -// shape (get: polygons) -#define VAR_SHAPE 0x4e - -// type id (get: vehicles, polygons, pois) -#define VAR_TYPE 0x4f - -// road id (get: vehicles) -#define VAR_ROAD_ID 0x50 - -// lane id (get: vehicles) -#define VAR_LANE_ID 0x51 - -// lane index (get: vehicles) -#define VAR_LANE_INDEX 0x52 - -// route id (get & set: vehicles) -#define VAR_ROUTE_ID 0x53 - -// edges (get: routes) -#define VAR_EDGES 0x54 - -// filled? (get: polygons) -#define VAR_FILL 0x55 - -// position (1D along lane) (get: vehicle) -#define VAR_LANEPOSITION 0x56 - -// route (set: vehicles) -#define VAR_ROUTE 0x57 - -// travel time information (get&set: vehicle) -#define VAR_EDGE_TRAVELTIME 0x58 - -// effort information (get&set: vehicle) -#define VAR_EDGE_EFFORT 0x59 - -// last step travel time (get: edge, lane) -#define VAR_CURRENT_TRAVELTIME 0x5a - -// signals state (get/set: vehicle) -#define VAR_SIGNALS 0x5b - -// new lane/position along (set: vehicle) -#define VAR_MOVE_TO 0x5c - -// driver imperfection (set: vehicle) -#define VAR_IMPERFECTION 0x5d - -// speed factor (set: vehicle) -#define VAR_SPEED_FACTOR 0x5e - -// speed deviation (set: vehicle) -#define VAR_SPEED_DEVIATION 0x5f - -// speed without TraCI influence (get: vehicle) -#define VAR_SPEED_WITHOUT_TRACI 0xb1 - -// best lanes (get: vehicle) -#define VAR_BEST_LANES 0xb2 - - - - -// current CO2 emission of a node (get: vehicle, lane, edge) -#define VAR_CO2EMISSION 0x60 - -// current CO emission of a node (get: vehicle, lane, edge) -#define VAR_COEMISSION 0x61 - -// current HC emission of a node (get: vehicle, lane, edge) -#define VAR_HCEMISSION 0x62 - -// current PMx emission of a node (get: vehicle, lane, edge) -#define VAR_PMXEMISSION 0x63 - -// current NOx emission of a node (get: vehicle, lane, edge) -#define VAR_NOXEMISSION 0x64 - -// current fuel consumption of a node (get: vehicle, lane, edge) -#define VAR_FUELCONSUMPTION 0x65 - -// current noise emission of a node (get: vehicle, lane, edge) -#define VAR_NOISEEMISSION 0x66 - - - -// current time step (get: simulation) -#define VAR_TIME_STEP 0x70 - -// number of loaded vehicles (get: simulation) -#define VAR_LOADED_VEHICLES_NUMBER 0x71 - -// loaded vehicle ids (get: simulation) -#define VAR_LOADED_VEHICLES_IDS 0x72 - -// number of departed vehicle (get: simulation) -#define VAR_DEPARTED_VEHICLES_NUMBER 0x73 - -// departed vehicle ids (get: simulation) -#define VAR_DEPARTED_VEHICLES_IDS 0x74 - -// number of vehicles starting to teleport (get: simulation) -#define VAR_TELEPORT_STARTING_VEHICLES_NUMBER 0x75 - -// ids of vehicles starting to teleport (get: simulation) -#define VAR_TELEPORT_STARTING_VEHICLES_IDS 0x76 - -// number of vehicles ending to teleport (get: simulation) -#define VAR_TELEPORT_ENDING_VEHICLES_NUMBER 0x77 - -// ids of vehicles ending to teleport (get: simulation) -#define VAR_TELEPORT_ENDING_VEHICLES_IDS 0x78 - -// number of arrived vehicles (get: simulation) -#define VAR_ARRIVED_VEHICLES_NUMBER 0x79 - -// ids of arrived vehicles (get: simulation) -#define VAR_ARRIVED_VEHICLES_IDS 0x7a - -// delta t (get: simulation) -#define VAR_DELTA_T 0x7b - -// bounding box (get: simulation) -#define VAR_NET_BOUNDING_BOX 0x7c - - - - - - - - -// add an instance (poi, polygon) -#define ADD 0x80 - -// remove an instance (poi, polygon) -#define REMOVE 0x81 - - -// force rerouting based on travel time (vehicles) -#define CMD_REROUTE_TRAVELTIME 0x90 - -// force rerouting based on effort (vehicles) -#define CMD_REROUTE_EFFORT 0x91 - -// validates current route (vehicles) -#define VAR_ROUTE_VALID 0x92 - - - -// zoom -#define VAR_VIEW_ZOOM 0xa0 -// view position -#define VAR_VIEW_OFFSET 0xa1 -// view schema -#define VAR_VIEW_SCHEMA 0xa2 -// view by boundary -#define VAR_VIEW_BOUNDARY 0xa3 -// background color -#define VAR_VIEW_BACKGROUNDCOLOR 0xa4 -// screenshot -#define VAR_SCREENSHOT 0xa5 -// track vehicle -#define VAR_TRACK_VEHICLE 0xa6 -// network size (get: ) -#define VAR_NET_SIZE 0xa7 - - - - -#endif - - +#endif \ No newline at end of file diff --git a/openair2/UTIL/OPT/packet-mac-lte.c b/openair2/UTIL/OPT/packet-mac-lte.c deleted file mode 100644 index 6fd7ddd826..0000000000 --- a/openair2/UTIL/OPT/packet-mac-lte.c +++ /dev/null @@ -1,6195 +0,0 @@ -/* Routines for LTE MAC disassembly - * - * Martin Mathieson - * - * $Id: packet-mac-lte.c 42240 2012-04-25 20:02:12Z pascal $ - * - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 1998 Gerald Combs - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include - -#include -#include -#include -#include -#include - -#include "packet-mac-lte.h" -#include "packet-rlc-lte.h" - - -/* Described in: - * 3GPP TS 36.321 Evolved Universal Terrestrial Radio Access (E-UTRA) - * Medium Access Control (MAC) protocol specification (Release 10) - */ - - -/* Initialize the protocol and registered fields. */ -int proto_mac_lte = -1; - -static int mac_lte_tap = -1; - -/* Decoding context */ -static int hf_mac_lte_context = -1; -static int hf_mac_lte_context_radio_type = -1; -static int hf_mac_lte_context_direction = -1; -static int hf_mac_lte_context_rnti = -1; -static int hf_mac_lte_context_rnti_type = -1; -static int hf_mac_lte_context_ueid = -1; -static int hf_mac_lte_context_sysframe_number = -1; -static int hf_mac_lte_context_subframe_number = -1; -static int hf_mac_lte_context_grant_subframe_number = -1; -static int hf_mac_lte_context_predefined_frame = -1; -static int hf_mac_lte_context_length = -1; -static int hf_mac_lte_context_ul_grant_size = -1; -static int hf_mac_lte_context_bch_transport_channel = -1; -static int hf_mac_lte_context_retx_count = -1; -static int hf_mac_lte_context_retx_reason = -1; -static int hf_mac_lte_context_crc_status = -1; -static int hf_mac_lte_context_rapid = -1; -static int hf_mac_lte_context_rach_attempt_number = -1; - -/* Inferred context */ -static int hf_mac_lte_ues_ul_per_tti = -1; -static int hf_mac_lte_ues_dl_per_tti = -1; - - -/* Extra PHY context */ -static int hf_mac_lte_context_phy_ul = -1; -static int hf_mac_lte_context_phy_ul_modulation_type = -1; -static int hf_mac_lte_context_phy_ul_tbs_index = -1; -static int hf_mac_lte_context_phy_ul_resource_block_length = -1; -static int hf_mac_lte_context_phy_ul_resource_block_start = -1; -static int hf_mac_lte_context_phy_ul_harq_id = -1; -static int hf_mac_lte_context_phy_ul_ndi = -1; - -static int hf_mac_lte_context_phy_dl = -1; -static int hf_mac_lte_context_phy_dl_dci_format = -1; -static int hf_mac_lte_context_phy_dl_resource_allocation_type = -1; -static int hf_mac_lte_context_phy_dl_aggregation_level = -1; -static int hf_mac_lte_context_phy_dl_mcs_index = -1; -static int hf_mac_lte_context_phy_dl_redundancy_version_index = -1; -static int hf_mac_lte_context_phy_dl_retx = -1; -static int hf_mac_lte_context_phy_dl_resource_block_length = -1; -static int hf_mac_lte_context_phy_dl_crc_status = -1; -static int hf_mac_lte_context_phy_dl_harq_id = -1; -static int hf_mac_lte_context_phy_dl_ndi = -1; -static int hf_mac_lte_context_phy_dl_tb = -1; - - -/* Out-of-band events */ -static int hf_mac_lte_oob_send_preamble = -1; -static int hf_mac_lte_oob_send_sr = -1; -static int hf_mac_lte_number_of_srs = -1; -static int hf_mac_lte_oob_sr_failure = -1; - -/* MAC SCH/MCH header fields */ -static int hf_mac_lte_ulsch = -1; -static int hf_mac_lte_ulsch_header = -1; -static int hf_mac_lte_dlsch = -1; -static int hf_mac_lte_dlsch_header = -1; -static int hf_mac_lte_sch_subheader = -1; -static int hf_mac_lte_mch = -1; -static int hf_mac_lte_mch_header = -1; -static int hf_mac_lte_mch_subheader = -1; - -static int hf_mac_lte_sch_reserved = -1; -static int hf_mac_lte_dlsch_lcid = -1; -static int hf_mac_lte_ulsch_lcid = -1; -static int hf_mac_lte_sch_extended = -1; -static int hf_mac_lte_sch_format = -1; -static int hf_mac_lte_sch_length = -1; -static int hf_mac_lte_mch_reserved = -1; -static int hf_mac_lte_mch_lcid = -1; -static int hf_mac_lte_mch_extended = -1; -static int hf_mac_lte_mch_format = -1; -static int hf_mac_lte_mch_length = -1; - -static int hf_mac_lte_sch_header_only = -1; -static int hf_mac_lte_mch_header_only = -1; - -/* Data */ -static int hf_mac_lte_sch_sdu = -1; -static int hf_mac_lte_mch_sdu = -1; -static int hf_mac_lte_bch_pdu = -1; -static int hf_mac_lte_pch_pdu = -1; -static int hf_mac_lte_predefined_pdu = -1; -static int hf_mac_lte_raw_pdu = -1; -static int hf_mac_lte_padding_data = -1; -static int hf_mac_lte_padding_length = -1; - - -/* RAR fields */ -static int hf_mac_lte_rar = -1; -static int hf_mac_lte_rar_headers = -1; -static int hf_mac_lte_rar_header = -1; -static int hf_mac_lte_rar_extension = -1; -static int hf_mac_lte_rar_t = -1; -static int hf_mac_lte_rar_bi = -1; -static int hf_mac_lte_rar_rapid = -1; -static int hf_mac_lte_rar_reserved = -1; -static int hf_mac_lte_rar_body = -1; -static int hf_mac_lte_rar_reserved2 = -1; -static int hf_mac_lte_rar_ta = -1; -static int hf_mac_lte_rar_ul_grant = -1; -static int hf_mac_lte_rar_ul_grant_hopping = -1; -static int hf_mac_lte_rar_ul_grant_fsrba = -1; -static int hf_mac_lte_rar_ul_grant_tmcs = -1; -static int hf_mac_lte_rar_ul_grant_tcsp = -1; -static int hf_mac_lte_rar_ul_grant_ul_delay = -1; -static int hf_mac_lte_rar_ul_grant_cqi_request = -1; -static int hf_mac_lte_rar_temporary_crnti = -1; - -/* Common channel control values */ -static int hf_mac_lte_control_bsr = -1; -static int hf_mac_lte_control_bsr_lcg_id = -1; -static int hf_mac_lte_control_short_bsr_buffer_size = -1; -static int hf_mac_lte_control_long_bsr_buffer_size_0 = -1; -static int hf_mac_lte_control_long_bsr_buffer_size_1 = -1; -static int hf_mac_lte_control_long_bsr_buffer_size_2 = -1; -static int hf_mac_lte_control_long_bsr_buffer_size_3 = -1; -static int hf_mac_lte_control_short_ext_bsr_buffer_size = -1; -static int hf_mac_lte_control_long_ext_bsr_buffer_size_0 = -1; -static int hf_mac_lte_control_long_ext_bsr_buffer_size_1 = -1; -static int hf_mac_lte_control_long_ext_bsr_buffer_size_2 = -1; -static int hf_mac_lte_control_long_ext_bsr_buffer_size_3 = -1; -static int hf_mac_lte_control_crnti = -1; -static int hf_mac_lte_control_timing_advance = -1; -static int hf_mac_lte_control_timing_advance_reserved = -1; -static int hf_mac_lte_control_ue_contention_resolution = -1; -static int hf_mac_lte_control_ue_contention_resolution_identity = -1; -static int hf_mac_lte_control_ue_contention_resolution_msg3 = -1; -static int hf_mac_lte_control_ue_contention_resolution_msg3_matched = -1; -static int hf_mac_lte_control_ue_contention_resolution_time_since_msg3 = -1; -static int hf_mac_lte_control_power_headroom = -1; -static int hf_mac_lte_control_power_headroom_reserved = -1; -static int hf_mac_lte_control_power_headroom_level = -1; -static int hf_mac_lte_control_ext_power_headroom = -1; -static int hf_mac_lte_control_ext_power_headroom_c7 = -1; -static int hf_mac_lte_control_ext_power_headroom_c6 = -1; -static int hf_mac_lte_control_ext_power_headroom_c5 = -1; -static int hf_mac_lte_control_ext_power_headroom_c4 = -1; -static int hf_mac_lte_control_ext_power_headroom_c3 = -1; -static int hf_mac_lte_control_ext_power_headroom_c2 = -1; -static int hf_mac_lte_control_ext_power_headroom_c1 = -1; -static int hf_mac_lte_control_ext_power_headroom_reserved = -1; -static int hf_mac_lte_control_ext_power_headroom_power_backoff = -1; -static int hf_mac_lte_control_ext_power_headroom_value = -1; -static int hf_mac_lte_control_ext_power_headroom_level = -1; -static int hf_mac_lte_control_ext_power_headroom_reserved2 = -1; -static int hf_mac_lte_control_ext_power_headroom_pcmaxc = -1; -static int hf_mac_lte_control_activation_deactivation = -1; -static int hf_mac_lte_control_activation_deactivation_c7 = -1; -static int hf_mac_lte_control_activation_deactivation_c6 = -1; -static int hf_mac_lte_control_activation_deactivation_c5 = -1; -static int hf_mac_lte_control_activation_deactivation_c4 = -1; -static int hf_mac_lte_control_activation_deactivation_c3 = -1; -static int hf_mac_lte_control_activation_deactivation_c2 = -1; -static int hf_mac_lte_control_activation_deactivation_c1 = -1; -static int hf_mac_lte_control_activation_deactivation_reserved = -1; -static int hf_mac_lte_control_mch_scheduling_info = -1; -static int hf_mac_lte_control_mch_scheduling_info_lcid = -1; -static int hf_mac_lte_control_mch_scheduling_info_stop_mtch = -1; - -static int hf_mac_lte_dl_harq_resend_original_frame = -1; -static int hf_mac_lte_dl_harq_resend_time_since_previous_frame = -1; -static int hf_mac_lte_dl_harq_resend_next_frame = -1; -static int hf_mac_lte_dl_harq_resend_time_until_next_frame = -1; - -static int hf_mac_lte_ul_harq_resend_original_frame = -1; -static int hf_mac_lte_ul_harq_resend_time_since_previous_frame = -1; -static int hf_mac_lte_ul_harq_resend_next_frame = -1; -static int hf_mac_lte_ul_harq_resend_time_until_next_frame = -1; - - -static int hf_mac_lte_grant_answering_sr = -1; -static int hf_mac_lte_failure_answering_sr = -1; -static int hf_mac_lte_sr_leading_to_failure = -1; -static int hf_mac_lte_sr_leading_to_grant = -1; -static int hf_mac_lte_sr_invalid_event = -1; -static int hf_mac_lte_sr_time_since_request = -1; -static int hf_mac_lte_sr_time_until_answer = -1; - - -/* Subtrees. */ -static int ett_mac_lte = -1; -static int ett_mac_lte_context = -1; -static int ett_mac_lte_phy_context = -1; -static int ett_mac_lte_ulsch_header = -1; -static int ett_mac_lte_dlsch_header = -1; -static int ett_mac_lte_mch_header = -1; -static int ett_mac_lte_sch_subheader = -1; -static int ett_mac_lte_mch_subheader = -1; -static int ett_mac_lte_rar_headers = -1; -static int ett_mac_lte_rar_header = -1; -static int ett_mac_lte_rar_body = -1; -static int ett_mac_lte_rar_ul_grant = -1; -static int ett_mac_lte_bsr = -1; -static int ett_mac_lte_bch = -1; -static int ett_mac_lte_pch = -1; -static int ett_mac_lte_activation_deactivation = -1; -static int ett_mac_lte_contention_resolution = -1; -static int ett_mac_lte_power_headroom = -1; -static int ett_mac_lte_extended_power_headroom = -1; -static int ett_mac_lte_extended_power_headroom_cell = -1; -static int ett_mac_lte_mch_scheduling_info = -1; -static int ett_mac_lte_oob = -1; - - - -/* Constants and value strings */ - -static const value_string radio_type_vals[] = { - { FDD_RADIO, "FDD"}, - { TDD_RADIO, "TDD"}, - { 0, NULL } -}; - - -static const value_string direction_vals[] = { - { DIRECTION_UPLINK, "Uplink"}, - { DIRECTION_DOWNLINK, "Downlink"}, - { 0, NULL } -}; - - -static const value_string rnti_type_vals[] = { - { NO_RNTI, "NO-RNTI"}, - { P_RNTI, "P-RNTI"}, - { RA_RNTI, "RA-RNTI"}, - { C_RNTI, "C-RNTI"}, - { SI_RNTI, "SI-RNTI"}, - { SPS_RNTI, "SPS-RNTI"}, - { M_RNTI, "M-RNTI"}, - { 0, NULL } -}; - -static const value_string bch_transport_channel_vals[] = { - { SI_RNTI, "DL-SCH"}, - { NO_RNTI, "BCH"}, - { 0, NULL } -}; - -static const value_string crc_status_vals[] = { - { crc_success, "OK"}, - { crc_fail, "Failed"}, - { crc_high_code_rate, "High Code Rate"}, - { crc_pdsch_lost, "PDSCH Lost"}, - { crc_duplicate_nonzero_rv, "Duplicate_nonzero_rv"}, - { 0, NULL } -}; - - -static const value_string dci_format_vals[] = { - { 0, "0"}, - { 1, "1"}, - { 2, "1A"}, - { 3, "1B"}, - { 4, "1C"}, - { 5, "1D"}, - { 6, "2"}, - { 7, "2A"}, - { 8, "3/3A"}, - { 0, NULL } -}; - -static const value_string aggregation_level_vals[] = { - { 0, "1"}, - { 1, "2"}, - { 2, "4"}, - { 3, "8"}, - { 0, NULL } -}; - -static const value_string modulation_type_vals[] = { - { 2, "QPSK"}, - { 4, "QAM16"}, - { 6, "QAM64"}, - { 0, NULL } -}; - -static const true_false_string mac_lte_scell_ph_vals = { - "Reported", - "Not reported" -}; - -static const true_false_string mac_lte_power_backoff_vals = { - "Applied", - "Not applied" -}; - -static const true_false_string mac_lte_ph_value_vals = { - "Based on reference format", - "Based on real transmission" -}; - -static const true_false_string mac_lte_scell_status_vals = { - "Activated", - "Deactivated" -}; - -#define ACTIVATION_DEACTIVATION_LCID 0x1b -#define UE_CONTENTION_RESOLUTION_IDENTITY_LCID 0x1c -#define TIMING_ADVANCE_LCID 0x1d -#define DRX_COMMAND_LCID 0x1e -#define PADDING_LCID 0x1f - -static const value_string dlsch_lcid_vals[] = { - { 0, "CCCH"}, - { 1, "1"}, - { 2, "2"}, - { 3, "3"}, - { 4, "4"}, - { 5, "5"}, - { 6, "6"}, - { 7, "7"}, - { 8, "8"}, - { 9, "9"}, - { 10, "10"}, - { ACTIVATION_DEACTIVATION_LCID , "Activation/Deactivation"}, - { UE_CONTENTION_RESOLUTION_IDENTITY_LCID, "UE Contention Resolution Identity"}, - { TIMING_ADVANCE_LCID , "Timing Advance"}, - { DRX_COMMAND_LCID , "DRX Command"}, - { PADDING_LCID , "Padding" }, - { 0, NULL } -}; - -#define EXTENDED_POWER_HEADROOM_REPORT_LCID 0x19 -#define POWER_HEADROOM_REPORT_LCID 0x1a -#define CRNTI_LCID 0x1b -#define TRUNCATED_BSR_LCID 0x1c -#define SHORT_BSR_LCID 0x1d -#define LONG_BSR_LCID 0x1e - -static const value_string ulsch_lcid_vals[] = { - { 0, "CCCH"}, - { 1, "1"}, - { 2, "2"}, - { 3, "3"}, - { 4, "4"}, - { 5, "5"}, - { 6, "6"}, - { 7, "7"}, - { 8, "8"}, - { 9, "9"}, - { 10, "10"}, - { EXTENDED_POWER_HEADROOM_REPORT_LCID, "Extended Power Headroom Report"}, - { POWER_HEADROOM_REPORT_LCID, "Power Headroom Report"}, - { CRNTI_LCID, "C-RNTI"}, - { TRUNCATED_BSR_LCID, "Truncated BSR"}, - { SHORT_BSR_LCID, "Short BSR"}, - { LONG_BSR_LCID, "Long BSR"}, - { PADDING_LCID, "Padding" }, - { 0, NULL } -}; - -#define MCH_SCHEDULING_INFO_LCID 0x1e - -static const value_string mch_lcid_vals[] = { - { 0, "MCCH"}, - { 1, "1"}, - { 2, "2"}, - { 3, "3"}, - { 4, "4"}, - { 5, "5"}, - { 6, "6"}, - { 7, "7"}, - { 8, "8"}, - { 9, "9"}, - { 10, "10"}, - { 11, "11"}, - { 12, "12"}, - { 13, "13"}, - { 14, "14"}, - { 15, "15"}, - { 16, "16"}, - { 17, "17"}, - { 18, "18"}, - { 19, "19"}, - { 20, "20"}, - { 21, "21"}, - { 22, "22"}, - { 23, "23"}, - { 24, "24"}, - { 25, "25"}, - { 26, "26"}, - { 27, "27"}, - { 28, "28"}, - { MCH_SCHEDULING_INFO_LCID, "MCH Scheduling Information"}, - { PADDING_LCID, "Padding" }, - { 0, NULL } -}; - -static const value_string format_vals[] = { - { 0, "Data length is < 128 bytes"}, - { 1, "Data length is >= 128 bytes"}, - { 0, NULL } -}; - - -static const value_string rar_type_vals[] = { - { 0, "Backoff Indicator present"}, - { 1, "RAPID present"}, - { 0, NULL } -}; - - -static const value_string rar_bi_vals[] = { - { 0, "0"}, - { 1, "10"}, - { 2, "20"}, - { 3, "30"}, - { 4, "40"}, - { 5, "60"}, - { 6, "80"}, - { 7, "120"}, - { 8, "160"}, - { 9, "240"}, - { 10, "320"}, - { 11, "480"}, - { 12, "960"}, - { 0, NULL } -}; - - -static const value_string buffer_size_vals[] = { - { 0, "BS = 0"}, - { 1, "0 < BS <= 10"}, - { 2, "10 < BS <= 12"}, - { 3, "12 < BS <= 14"}, - { 4, "14 < BS <= 17"}, - { 5, "17 < BS <= 19"}, - { 6, "19 < BS <= 22"}, - { 7, "22 < BS <= 26"}, - { 8, "26 < BS <= 31"}, - { 9, "31 < BS <= 36"}, - { 10, "36 < BS <= 42"}, - { 11, "42 < BS <= 49"}, - { 12, "49 < BS <= 57"}, - { 13, "47 < BS <= 67"}, - { 14, "67 < BS <= 78"}, - { 15, "78 < BS <= 91"}, - { 16, "91 < BS <= 107"}, - { 17, "107 < BS <= 125"}, - { 18, "125 < BS <= 146"}, - { 19, "146 < BS <= 171"}, - { 20, "171 < BS <= 200"}, - { 21, "200 < BS <= 234"}, - { 22, "234 < BS <= 274"}, - { 23, "274 < BS <= 321"}, - { 24, "321 < BS <= 376"}, - { 25, "376 < BS <= 440"}, - { 26, "440 < BS <= 515"}, - { 27, "515 < BS <= 603"}, - { 28, "603 < BS <= 706"}, - { 29, "706 < BS <= 826"}, - { 30, "826 < BS <= 967"}, - { 31, "967 < BS <= 1132"}, - { 32, "1132 < BS <= 1326"}, - { 33, "1326 < BS <= 1552"}, - { 34, "1552 < BS <= 1817"}, - { 35, "1817 < BS <= 2127"}, - { 36, "2127 < BS <= 2490"}, - { 37, "2490 < BS <= 2915"}, - { 38, "2915 < BS <= 3413"}, - { 39, "3413 < BS <= 3995"}, - { 40, "3995 < BS <= 4677"}, - { 41, "4677 < BS <= 5476"}, - { 42, "5476 < BS <= 6411"}, - { 43, "6411 < BS <= 7505"}, - { 44, "7505 < BS <= 8787"}, - { 45, "8787 < BS <= 10276"}, - { 46, "10287 < BS <= 12043"}, - { 47, "12043 < BS <= 14099"}, - { 48, "14099 < BS <= 16507"}, - { 49, "16507 < BS <= 19325"}, - { 50, "19325 < BS <= 22624"}, - { 51, "22624 < BS <= 26487"}, - { 52, "26487 < BS <= 31009"}, - { 53, "31009 < BS <= 36304"}, - { 54, "36304 < BS <= 42502"}, - { 55, "42502 < BS <= 49759"}, - { 56, "49759 < BS <= 58255"}, - { 57, "58255 < BS <= 68201"}, - { 58, "68201 < BS <= 79846"}, - { 59, "79846 < BS <= 93479"}, - { 60, "93479 < BS <= 109439"}, - { 61, "109439 < BS <= 128125"}, - { 62, "128125 < BS <= 150000"}, - { 63, "BS > 150000"}, - { 0, NULL } -}; -static value_string_ext buffer_size_vals_ext = VALUE_STRING_EXT_INIT(buffer_size_vals); - -static const value_string ext_buffer_size_vals[] = { - { 0, "BS = 0"}, - { 1, "0 < BS <= 10"}, - { 2, "10 < BS <= 13"}, - { 3, "13 < BS <= 16"}, - { 4, "16 < BS <= 19"}, - { 5, "19 < BS <= 23"}, - { 6, "23 < BS <= 29"}, - { 7, "29 < BS <= 35"}, - { 8, "35 < BS <= 43"}, - { 9, "43 < BS <= 53"}, - { 10, "53 < BS <= 65"}, - { 11, "65 < BS <= 80"}, - { 12, "80 < BS <= 98"}, - { 13, "98 < BS <= 120"}, - { 14, "120 < BS <= 147"}, - { 15, "147 < BS <= 181"}, - { 16, "181 < BS <= 223"}, - { 17, "223 < BS <= 274"}, - { 18, "274 < BS <= 337"}, - { 19, "337 < BS <= 414"}, - { 20, "414 < BS <= 509"}, - { 21, "509 < BS <= 625"}, - { 22, "625 < BS <= 769"}, - { 23, "769 < BS <= 945"}, - { 24, "945 < BS <= 1162"}, - { 25, "1162 < BS <= 1429"}, - { 26, "1429 < BS <= 1757"}, - { 27, "1757 < BS <= 2161"}, - { 28, "2161 < BS <= 2657"}, - { 29, "2657 < BS <= 3267"}, - { 30, "3267 < BS <= 4017"}, - { 31, "4017 < BS <= 4940"}, - { 32, "4940 < BS <= 6074"}, - { 33, "6074 < BS <= 7469"}, - { 34, "7469 < BS <= 9185"}, - { 35, "9185 < BS <= 11294"}, - { 36, "11294 < BS <= 13888"}, - { 37, "13888 < BS <= 17077"}, - { 38, "17077 < BS <= 20999"}, - { 39, "20999 < BS <= 25822"}, - { 40, "25822 < BS <= 31752"}, - { 41, "31752 < BS <= 39045"}, - { 42, "39045 < BS <= 48012"}, - { 43, "48012 < BS <= 59039"}, - { 44, "59039 < BS <= 72598"}, - { 45, "72598 < BS <= 89272"}, - { 46, "89272 < BS <= 109774"}, - { 47, "109774 < BS <= 134986"}, - { 48, "134986 < BS <= 165989"}, - { 49, "165989 < BS <= 204111"}, - { 50, "204111 < BS <= 250990"}, - { 51, "250990 < BS <= 308634"}, - { 52, "308634 < BS <= 379519"}, - { 53, "379519 < BS <= 466683"}, - { 54, "466683 < BS <= 573866"}, - { 55, "573866 < BS <= 705666"}, - { 56, "705666 < BS <= 867737"}, - { 57, "867737 < BS <= 1067031"}, - { 58, "1067031 < BS <= 1312097"}, - { 59, "1312097 < BS <= 1613447"}, - { 60, "1613447 < BS <= 1984009"}, - { 61, "1984009 < BS <= 2439678"}, - { 62, "2439678 < BS <= 3000000"}, - { 63, "BS > 3000000"}, - { 0, NULL } -}; -static value_string_ext ext_buffer_size_vals_ext = VALUE_STRING_EXT_INIT(ext_buffer_size_vals); - -static const value_string power_headroom_vals[] = { - { 0, "-23 <= PH < -22"}, - { 1, "-22 <= PH < -21"}, - { 2, "-21 <= PH < -20"}, - { 3, "-20 <= PH < -19"}, - { 4, "-19 <= PH < -18"}, - { 5, "-18 <= PH < -17"}, - { 6, "-17 <= PH < -16"}, - { 7, "-16 <= PH < -15"}, - { 8, "-15 <= PH < -14"}, - { 9, "-14 <= PH < -13"}, - { 10, "-13 <= PH < -12"}, - { 11, "-12 <= PH < -11"}, - { 12, "-11 <= PH < -10"}, - { 13, "-10 <= PH < -9"}, - { 14, "-9 <= PH < -8"}, - { 15, "-8 <= PH < -7"}, - { 16, "-7 <= PH < -6"}, - { 17, "-6 <= PH < -5"}, - { 18, "-5 <= PH < -4"}, - { 19, "-4 <= PH < -3"}, - { 20, "-3 <= PH < -2"}, - { 21, "-2 <= PH < -1"}, - { 22, "-1 <= PH < 0"}, - { 23, "0 <= PH < 1"}, - { 24, "1 <= PH < 2"}, - { 25, "2 <= PH < 3"}, - { 26, "3 <= PH < 4"}, - { 27, "4 <= PH < 5"}, - { 28, "5 <= PH < 6"}, - { 29, "6 <= PH < 7"}, - { 30, "7 <= PH < 8"}, - { 31, "8 <= PH < 9"}, - { 32, "9 <= PH < 10"}, - { 33, "10 <= PH < 11"}, - { 34, "11 <= PH < 12"}, - { 35, "12 <= PH < 13"}, - { 36, "13 <= PH < 14"}, - { 37, "14 <= PH < 15"}, - { 38, "15 <= PH < 16"}, - { 39, "16 <= PH < 17"}, - { 40, "17 <= PH < 18"}, - { 41, "18 <= PH < 19"}, - { 42, "19 <= PH < 20"}, - { 43, "20 <= PH < 21"}, - { 44, "21 <= PH < 22"}, - { 45, "22 <= PH < 23"}, - { 46, "23 <= PH < 24"}, - { 47, "24 <= PH < 25"}, - { 48, "25 <= PH < 26"}, - { 49, "26 <= PH < 27"}, - { 50, "27 <= PH < 28"}, - { 51, "28 <= PH < 29"}, - { 52, "29 <= PH < 30"}, - { 53, "30 <= PH < 31"}, - { 54, "31 <= PH < 32"}, - { 55, "32 <= PH < 33"}, - { 56, "33 <= PH < 34"}, - { 57, "34 <= PH < 35"}, - { 58, "34 <= PH < 36"}, - { 59, "36 <= PH < 37"}, - { 60, "37 <= PH < 38"}, - { 61, "38 <= PH < 39"}, - { 62, "39 <= PH < 40"}, - { 63, "PH >= 40"}, - { 0, NULL } -}; -static value_string_ext power_headroom_vals_ext = VALUE_STRING_EXT_INIT(power_headroom_vals); - -static const value_string pcmaxc_vals[] = { - { 0, "Pcmax,c < -29"}, - { 1, "-29 <= Pcmax,c < -28"}, - { 2, "-28 <= Pcmax,c < -27"}, - { 3, "-27 <= Pcmax,c < -26"}, - { 4, "-26 <= Pcmax,c < -25"}, - { 5, "-25 <= Pcmax,c < -24"}, - { 6, "-24 <= Pcmax,c < -23"}, - { 7, "-23 <= Pcmax,c < -22"}, - { 8, "-22 <= Pcmax,c < -21"}, - { 9, "-21 <= Pcmax,c < -20"}, - { 10, "-20 <= Pcmax,c < -19"}, - { 11, "-19 <= Pcmax,c < -18"}, - { 12, "-18 <= Pcmax,c < -17"}, - { 13, "-17 <= Pcmax,c < -16"}, - { 14, "-16 <= Pcmax,c < -15"}, - { 15, "-15 <= Pcmax,c < -14"}, - { 16, "-14 <= Pcmax,c < -13"}, - { 17, "-13 <= Pcmax,c < -12"}, - { 18, "-12 <= Pcmax,c < -11"}, - { 19, "-11 <= Pcmax,c < -10"}, - { 20, "-10 <= Pcmax,c < -9"}, - { 21, "-9 <= Pcmax,c < -8"}, - { 22, "-8 <= Pcmax,c < -7"}, - { 23, "-7 <= Pcmax,c < -6"}, - { 24, "-6 <= Pcmax,c < -5"}, - { 25, "-5 <= Pcmax,c < -4"}, - { 26, "-4 <= Pcmax,c < -3"}, - { 27, "-3 <= Pcmax,c < -2"}, - { 28, "-2 <= Pcmax,c < -1"}, - { 29, "-1 <= Pcmax,c < 0"}, - { 30, "0 <= Pcmax,c < 1"}, - { 31, "1 <= Pcmax,c < 2"}, - { 32, "2 <= Pcmax,c < 3"}, - { 33, "3 <= Pcmax,c < 4"}, - { 34, "4 <= Pcmax,c < 5"}, - { 35, "5 <= Pcmax,c < 6"}, - { 36, "6 <= Pcmax,c < 7"}, - { 37, "7 <= Pcmax,c < 8"}, - { 38, "8 <= Pcmax,c < 9"}, - { 39, "9 <= Pcmax,c < 10"}, - { 40, "10 <= Pcmax,c < 11"}, - { 41, "11 <= Pcmax,c < 12"}, - { 42, "12 <= Pcmax,c < 13"}, - { 43, "13 <= Pcmax,c < 14"}, - { 44, "14 <= Pcmax,c < 15"}, - { 45, "15 <= Pcmax,c < 16"}, - { 46, "16 <= Pcmax,c < 17"}, - { 47, "17 <= Pcmax,c < 18"}, - { 48, "18 <= Pcmax,c < 19"}, - { 49, "19 <= Pcmax,c < 20"}, - { 50, "20 <= Pcmax,c < 21"}, - { 51, "21 <= Pcmax,c < 22"}, - { 52, "22 <= Pcmax,c < 23"}, - { 53, "23 <= Pcmax,c < 24"}, - { 54, "24 <= Pcmax,c < 25"}, - { 55, "25 <= Pcmax,c < 26"}, - { 56, "26 <= Pcmax,c < 27"}, - { 57, "27 <= Pcmax,c < 28"}, - { 58, "28 <= Pcmax,c < 29"}, - { 59, "29 <= Pcmax,c < 30"}, - { 60, "30 <= Pcmax,c < 31"}, - { 61, "31 <= Pcmax,c < 32"}, - { 62, "32 <= Pcmax,c < 33"}, - { 63, "33 <= Pcmax,c"}, - { 0, NULL } -}; -static value_string_ext pcmaxc_vals_ext = VALUE_STRING_EXT_INIT(pcmaxc_vals); - -static const value_string header_only_vals[] = { - { 0, "MAC PDU Headers and body present"}, - { 1, "MAC PDU Headers only"}, - { 0, NULL } -}; - -static const value_string predefined_frame_vals[] = { - { 0, "Real MAC PDU present - will dissect"}, - { 1, "Predefined frame present - will not dissect"}, - { 0, NULL } -}; - -static const value_string ul_retx_grant_vals[] = { - { 0, "PDCCH ReTx"}, - { 1, "PHICH NACK"}, - { 0, NULL } -}; - -/**************************************************************************/ -/* Preferences state */ -/**************************************************************************/ - -/* If this PDU has been NACK'd (by HARQ) more than a certain number of times, - we trigger an expert warning. */ -static gint global_mac_lte_retx_counter_trigger = 3; - -/* By default try to decode transparent data (BCH, PCH and CCCH) data using LTE RRC dissector */ -static gboolean global_mac_lte_attempt_rrc_decode = TRUE; - -/* Whether should attempt to dissect frames failing CRC check */ -static gboolean global_mac_lte_dissect_crc_failures = FALSE; - -/* Whether should attempt to decode lcid 1&2 SDUs as srb1/2 (i.e. AM RLC) */ -static gboolean global_mac_lte_attempt_srb_decode = TRUE; - -/* Where to take LCID -> DRB mappings from */ -enum lcid_drb_source { - FromStaticTable, FromConfigurationProtocol -}; -static gint global_mac_lte_lcid_drb_source = (gint)FromStaticTable; - -/* Threshold for warning in expert info about high BSR values */ -static gint global_mac_lte_bsr_warn_threshold = 50; /* default is 19325 -> 22624 */ - -/* Whether or not to track SRs and related frames */ -static gboolean global_mac_lte_track_sr = TRUE; - -/* Which layer info to show in the info column */ -enum layer_to_show { - ShowPHYLayer, ShowMACLayer, ShowRLCLayer -}; - -/* Which layer's details to show in Info column */ -static gint global_mac_lte_layer_to_show = (gint)ShowRLCLayer; - -/* When showing RLC info, count PDUs so can append info column properly */ -static guint8 s_number_of_rlc_pdus_shown = 0; - -/***********************************************************************/ -/* How to dissect lcid 3-10 (presume drb logical channels) */ - -static const value_string drb_lcid_vals[] = { - { 3, "LCID 3"}, - { 4, "LCID 4"}, - { 5, "LCID 5"}, - { 6, "LCID 6"}, - { 7, "LCID 7"}, - { 8, "LCID 8"}, - { 9, "LCID 9"}, - { 10, "LCID 10"}, - { 0, NULL } -}; - -typedef enum rlc_channel_type_t { - rlcRaw, - rlcTM, - rlcUM5, - rlcUM10, - rlcAM -} rlc_channel_type_t; - -static const value_string rlc_channel_type_vals[] = { - { rlcTM, "TM"}, - { rlcUM5 , "UM, SN Len=5"}, - { rlcUM10, "UM, SN Len=10"}, - { rlcAM , "AM"}, - { 0, NULL } -}; - - -/* Mapping type */ -typedef struct lcid_drb_mapping_t { - guint16 lcid; - gint drbid; - rlc_channel_type_t channel_type; -} lcid_drb_mapping_t; - -/* Mapping entity */ -static lcid_drb_mapping_t *lcid_drb_mappings = NULL; -static guint num_lcid_drb_mappings = 0; - -UAT_VS_DEF(lcid_drb_mappings, lcid, lcid_drb_mapping_t, 3, "LCID 3") -UAT_DEC_CB_DEF(lcid_drb_mappings, drbid, lcid_drb_mapping_t) -UAT_VS_DEF(lcid_drb_mappings, channel_type, lcid_drb_mapping_t, 2, "AM") - -/* UAT object */ -static uat_t* lcid_drb_mappings_uat; - -/* Dynamic mappings (set by configuration protocol) - LCID is the index into the array of these */ -typedef struct dynamic_lcid_drb_mapping_t { - gboolean valid; - gint drbid; - rlc_channel_type_t channel_type; - guint8 ul_priority; -} dynamic_lcid_drb_mapping_t; - -static dynamic_lcid_drb_mapping_t dynamic_lcid_drb_mapping[11]; - - -extern int proto_rlc_lte; - -/***************************************************************/ - - - -/***************************************************************/ -/* Keeping track of Msg3 bodies so they can be compared with */ -/* Contention Resolution bodies. */ - -typedef struct Msg3Data { - guint8 data[6]; - nstime_t msg3Time; - guint32 framenum; -} Msg3Data; - - -/* This table stores (RNTI -> Msg3Data*). Will be populated when - Msg3 frames are first read. */ -static GHashTable *mac_lte_msg3_hash = NULL; - -/* Hash table functions for mac_lte_msg3_hash. Hash is just the (RNTI) key */ -static gint mac_lte_rnti_hash_equal(gconstpointer v, gconstpointer v2) -{ - return (v == v2); -} - -static guint mac_lte_rnti_hash_func(gconstpointer v) -{ - return GPOINTER_TO_UINT(v); -} - - -typedef enum ContentionResolutionStatus { - NoMsg3, - Msg3Match, - Msg3NoMatch -} ContentionResolutionStatus; - -typedef struct ContentionResolutionResult { - ContentionResolutionStatus status; - guint msg3FrameNum; - guint msSinceMsg3; -} ContentionResolutionResult; - - -/* This table stores (CRFrameNum -> CRResult). It is assigned during the first - pass and used thereafter */ -static GHashTable *mac_lte_cr_result_hash = NULL; - -/* Hash table functions for mac_lte_cr_result_hash. Hash is just the (framenum) key */ -static gint mac_lte_framenum_hash_equal(gconstpointer v, gconstpointer v2) -{ - return (v == v2); -} - -static guint mac_lte_framenum_hash_func(gconstpointer v) -{ - return GPOINTER_TO_UINT(v); -} - -/**************************************************************************/ - - - -/****************************************************************/ -/* Keeping track of last DL frames per C-RNTI so can guess when */ -/* there has been a HARQ retransmission */ -/* TODO: this should be simplified now that harq-id & ndi are */ -/* being logged! */ - -/* Could be bigger, but more than enough to flag suspected resends */ -#define MAX_EXPECTED_PDU_LENGTH 2048 - -typedef struct LastFrameData { - gboolean inUse; - guint32 framenum; - gboolean ndi; - nstime_t received_time; - gint length; - guint8 data[MAX_EXPECTED_PDU_LENGTH]; -} LastFrameData; - -typedef struct DLHarqBuffers { - LastFrameData harqid[2][15]; /* 2 blocks (1 for each antenna) needed for DL */ -} DLHarqBuffers; - - -/* This table stores (RNTI -> DLHARQBuffers*). Will be populated when - DL frames are first read. */ -static GHashTable *mac_lte_dl_harq_hash = NULL; - -typedef struct DLHARQResult { - gboolean previousSet, nextSet; - guint previousFrameNum; - guint timeSincePreviousFrame; - guint nextFrameNum; - guint timeToNextFrame; -} DLHARQResult; - - -/* This table stores (FrameNumber -> *DLHARQResult). It is assigned during the first - pass and used thereafter */ -static GHashTable *mac_lte_dl_harq_result_hash = NULL; - -/**************************************************************************/ - - -/*****************************************************************/ -/* Keeping track of last UL frames per C-RNTI so can verify when */ -/* told that a frame is a retx */ - -typedef struct ULHarqBuffers { - LastFrameData harqid[8]; -} ULHarqBuffers; - - -/* This table stores (RNTI -> ULHarqBuffers*). Will be populated when - UL frames are first read. */ -static GHashTable *mac_lte_ul_harq_hash = NULL; - -typedef struct ULHARQResult { - gboolean previousSet, nextSet; - guint previousFrameNum; - guint timeSincePreviousFrame; - guint nextFrameNum; - guint timeToNextFrame; -} ULHARQResult; - - -/* This table stores (FrameNum -> ULHARQResult). It is assigned during the first - pass and used thereafter */ -static GHashTable *mac_lte_ul_harq_result_hash = NULL; - -/**************************************************************************/ - - -/**************************************************************************/ -/* Tracking of Scheduling Requests (SRs). */ -/* Keep track of: */ -/* - last grant before SR */ -/* - SR failures following request */ -/* - grant following SR */ - -typedef enum SREvent { - SR_Grant, - SR_Request, - SR_Failure -} SREvent; - -static const value_string sr_event_vals[] = { - { SR_Grant, "Grant"}, - { SR_Request, "SR Request"}, - { SR_Failure, "SR Failure"}, - { 0, NULL} -}; - -typedef enum SRStatus { - None, - SR_Outstanding, - SR_Failed -} SRStatus; - -static const value_string sr_status_vals[] = { - { None, "Receiving grants"}, - { SR_Outstanding, "SR Request outstanding"}, - { SR_Failed, "SR has Failed"}, - { 0, NULL} -}; - - -typedef struct SRState { - SRStatus status; - guint32 lastSRFramenum; - guint32 lastGrantFramenum; - nstime_t requestTime; -} SRState; - - -/* This table keeps track of the SR state for each UE. - (RNTI -> SRState) */ -static GHashTable *mac_lte_ue_sr_state = NULL; - - -typedef enum SRResultType { - GrantAnsweringSR, - FailureAnsweringSR, - SRLeadingToGrant, - SRLeadingToFailure, - InvalidSREvent -} SRResultType; - - -typedef struct SRResult { - SRResultType type; - guint32 frameNum; - guint32 timeDifference; - - /* These 2 are only used with InvalidSREvent */ - SRStatus status; - SREvent event; -} SRResult; - -/* Entries in this table are created during the first pass - It maps (SRFrameNum -> SRResult) */ -static GHashTable *mac_lte_sr_request_hash = NULL; - - -/**************************************************************************/ - - - -/* Forward declarations */ -void proto_reg_handoff_mac_lte(void); -void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); - -static guint8 get_mac_lte_channel_priority(guint16 ueid _U_, guint8 lcid, - guint8 direction); - - -/* Heuristic dissection */ -static gboolean global_mac_lte_heur = FALSE; - -static void call_with_catch_all(dissector_handle_t handle, tvbuff_t* tvb, packet_info *pinfo, proto_tree *tree) -{ - /* Call it (catch exceptions so that stats will be updated) */ - TRY { - call_dissector_only(handle, tvb, pinfo, tree); - } - CATCH_ALL { - } - ENDTRY -} - -/* Dissect context fields in the format described in packet-mac-lte.h. - Return TRUE if the necessary information was successfully found */ -gboolean dissect_mac_lte_context_fields(struct mac_lte_info *p_mac_lte_info, tvbuff_t *tvb, - gint *p_offset) -{ - gint offset = *p_offset; - guint8 tag = 0; - - /* Read fixed fields */ - p_mac_lte_info->radioType = tvb_get_guint8(tvb, offset++); - p_mac_lte_info->direction = tvb_get_guint8(tvb, offset++); - - /* TODO: currently no support for detailed PHY info... */ - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - p_mac_lte_info->detailed_phy_info.ul_info.present = FALSE; - } else { - p_mac_lte_info->detailed_phy_info.dl_info.present = FALSE; - } - - p_mac_lte_info->rntiType = tvb_get_guint8(tvb, offset++); - - /* Initialize RNTI with a default value in case optional field is not present */ - switch (p_mac_lte_info->rntiType) { - case M_RNTI: - p_mac_lte_info->rnti = 0xFFFD; - break; - - case P_RNTI: - p_mac_lte_info->rnti = 0xFFFE; - break; - - case SI_RNTI: - p_mac_lte_info->rnti = 0xFFFF; - break; - - case RA_RNTI: - case C_RNTI: - case SPS_RNTI: - p_mac_lte_info->rnti = 0x0001; - break; - - default: - break; - } - - /* Read optional fields */ - while (tag != MAC_LTE_PAYLOAD_TAG) { - /* Process next tag */ - tag = tvb_get_guint8(tvb, offset++); - - switch (tag) { - case MAC_LTE_RNTI_TAG: - p_mac_lte_info->rnti = tvb_get_ntohs(tvb, offset); - offset += 2; - break; - - case MAC_LTE_UEID_TAG: - p_mac_lte_info->ueid = tvb_get_ntohs(tvb, offset); - offset += 2; - break; - - case MAC_LTE_SUBFRAME_TAG: - p_mac_lte_info->sysframeNumber = tvb_get_ntohs(tvb, offset); - offset += 2; - p_mac_lte_info->subframeNumber = tvb_get_ntohs(tvb, offset); - offset += 2; - break; - - case MAC_LTE_PREDEFINED_DATA_TAG: - p_mac_lte_info->isPredefinedData = tvb_get_guint8(tvb, offset); - offset++; - break; - - case MAC_LTE_RETX_TAG: - p_mac_lte_info->reTxCount = tvb_get_guint8(tvb, offset); - offset++; - break; - - case MAC_LTE_CRC_STATUS_TAG: - p_mac_lte_info->crcStatusValid = TRUE; - p_mac_lte_info->detailed_phy_info.dl_info.crc_status = tvb_get_guint8(tvb, offset); - offset++; - break; - - case MAC_LTE_EXT_BSR_SIZES_TAG: - p_mac_lte_info->isExtendedBSRSizes = TRUE; - break; - - case MAC_LTE_OOB_EVENT_TAG: - p_mac_lte_info->oob_event = tvb_get_guint8(tvb, offset); - offset++; - p_mac_lte_info->rapid = tvb_get_guint8(tvb, offset); - offset++; - p_mac_lte_info->rach_attempt_number = tvb_get_guint8(tvb, offset); - offset++; - break; - - case MAC_LTE_PAYLOAD_TAG: - /* Have reached data, so set payload length and get out of loop */ - p_mac_lte_info->length= tvb_length_remaining(tvb, offset); - continue; - - default: - /* It must be a recognised tag */ - return FALSE; - } - } - - /* Pass out where offset is now */ - *p_offset = offset; - - return TRUE; -} - -/* Heuristic dissector looks for supported framing protocol (see wiki page) */ -static gboolean dissect_mac_lte_heur(tvbuff_t *tvb, packet_info *pinfo, - proto_tree *tree) -{ - gint offset = 0; - struct mac_lte_info *p_mac_lte_info; - tvbuff_t *mac_tvb; - gboolean infoAlreadySet = FALSE; - - /* This is a heuristic dissector, which means we get all the UDP - * traffic not sent to a known dissector and not claimed by - * a heuristic dissector called before us! - */ - - if (!global_mac_lte_heur) { - return FALSE; - } - - /* Do this again on re-dissection to re-discover offset of actual PDU */ - - /* Needs to be at least as long as: - - the signature string - - fixed header bytes - - tag for data - - at least one byte of MAC PDU payload */ - if ((size_t)tvb_length_remaining(tvb, offset) < (strlen(MAC_LTE_START_STRING)+3+2)) { - return FALSE; - } - - /* OK, compare with signature string */ - if (tvb_strneql(tvb, offset, MAC_LTE_START_STRING, strlen(MAC_LTE_START_STRING)) != 0) { - return FALSE; - } - - offset += (gint)strlen(MAC_LTE_START_STRING); - - /* If redissecting, use previous info struct (if available) */ - p_mac_lte_info = p_get_proto_data(pinfo->fd, proto_mac_lte); - - if (p_mac_lte_info == NULL) { - /* Allocate new info struct for this frame */ - p_mac_lte_info = se_alloc0(sizeof(struct mac_lte_info)); - infoAlreadySet = FALSE; - } else { - infoAlreadySet = TRUE; - } - - /* Dissect the fields to populate p_mac_lte */ - if (!dissect_mac_lte_context_fields(p_mac_lte_info, tvb, &offset)) { - return FALSE; - } - - - if (!infoAlreadySet) { - /* Store info in packet */ - p_add_proto_data(pinfo->fd, proto_mac_lte, p_mac_lte_info); - } - - /**************************************/ - /* OK, now dissect as MAC LTE */ - - /* Create tvb that starts at actual MAC PDU */ - mac_tvb = tvb_new_subset(tvb, offset, -1, tvb_reported_length(tvb)-offset); - dissect_mac_lte(mac_tvb, pinfo, tree); - - return TRUE; -} - - -/* Write the given formatted text to: - - the info column (if pinfo != NULL) - - 1 or 2 other labels (optional) -*/ -static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2, - packet_info *pinfo, const char *format, ...) -{ -#define MAX_INFO_BUFFER 256 - static char info_buffer[MAX_INFO_BUFFER]; - - va_list ap; - - va_start(ap, format); - g_vsnprintf(info_buffer, MAX_INFO_BUFFER, format, ap); - va_end(ap); - - /* Add to indicated places */ - if (pinfo != NULL) { - col_append_str(pinfo->cinfo, COL_INFO, info_buffer); - } - - if (ti1 != NULL) { - proto_item_append_text(ti1, "%s", info_buffer); - } - - if (ti2 != NULL) { - proto_item_append_text(ti2, "%s", info_buffer); - } -} - -/* Show extra PHY parameters (if present) */ -static void show_extra_phy_parameters(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, - struct mac_lte_info *p_mac_lte_info) -{ - proto_item *phy_ti; - proto_tree *phy_tree; - proto_item *ti; - - if (global_mac_lte_layer_to_show == ShowPHYLayer) { - /* Clear the info column */ - col_clear(pinfo->cinfo, COL_INFO); - } - - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - if (p_mac_lte_info->detailed_phy_info.ul_info.present) { - - /* Create root */ - phy_ti = proto_tree_add_string_format(tree, hf_mac_lte_context_phy_ul, - tvb, 0, 0, "", "UL PHY Context"); - phy_tree = proto_item_add_subtree(phy_ti, ett_mac_lte_phy_context); - PROTO_ITEM_SET_GENERATED(phy_ti); - - /* Add items */ - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_modulation_type, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.modulation_type); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_tbs_index, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.tbs_index); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_resource_block_length, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.resource_block_length); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_resource_block_start, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.resource_block_start); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_harq_id, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.harq_id); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_ndi, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.ndi); - PROTO_ITEM_SET_GENERATED(ti); - - - proto_item_append_text(phy_ti, " ("); - - write_pdu_label_and_info(phy_ti, NULL, - (global_mac_lte_layer_to_show == ShowPHYLayer) ? pinfo : NULL, - "UL: UEId=%u RNTI=%u %s Tbs_Index=%u RB_len=%u RB_start=%u", - p_mac_lte_info->ueid, - p_mac_lte_info->rnti, - val_to_str_const(p_mac_lte_info->detailed_phy_info.ul_info.modulation_type, - modulation_type_vals, "Unknown"), - p_mac_lte_info->detailed_phy_info.ul_info.tbs_index, - p_mac_lte_info->detailed_phy_info.ul_info.resource_block_length, - p_mac_lte_info->detailed_phy_info.ul_info.resource_block_start); - - proto_item_append_text(phy_ti, ")"); - - /* Don't want columns to be replaced now */ - if (global_mac_lte_layer_to_show == ShowPHYLayer) { - col_set_writable(pinfo->cinfo, FALSE); - } - } - } else { - if (p_mac_lte_info->detailed_phy_info.dl_info.present) { - - /* Create root */ - phy_ti = proto_tree_add_string_format(tree, hf_mac_lte_context_phy_dl, - tvb, 0, 0, "", "DL PHY Context"); - phy_tree = proto_item_add_subtree(phy_ti, ett_mac_lte_phy_context); - PROTO_ITEM_SET_GENERATED(phy_ti); - - /* Add items */ - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_dci_format, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.dci_format); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_resource_allocation_type, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.resource_allocation_type); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_aggregation_level, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.aggregation_level); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_mcs_index, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.mcs_index); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_redundancy_version_index, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.redundancy_version_index); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_boolean(phy_tree, hf_mac_lte_context_phy_dl_retx, - tvb, 0, 0, - p_mac_lte_info->dl_retx); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_resource_block_length, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.resource_block_length); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_crc_status, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.crc_status); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_harq_id, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.harq_id); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_ndi, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.ndi); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_tb, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.transport_block); - PROTO_ITEM_SET_GENERATED(ti); - - - proto_item_append_text(phy_ti, " ("); - - write_pdu_label_and_info(phy_ti, NULL, - (global_mac_lte_layer_to_show == ShowPHYLayer) ? pinfo : NULL, - "DL: UEId=%u RNTI=%u DCI_Format=%s Res_Alloc=%u Aggr_Level=%s MCS=%u RV=%u " - "Res_Block_len=%u CRC_status=%s HARQ_id=%u NDI=%u", - p_mac_lte_info->ueid, - p_mac_lte_info->rnti, - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.dci_format, - dci_format_vals, "Unknown"), - p_mac_lte_info->detailed_phy_info.dl_info.resource_allocation_type, - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.aggregation_level, - aggregation_level_vals, "Unknown"), - p_mac_lte_info->detailed_phy_info.dl_info.mcs_index, - p_mac_lte_info->detailed_phy_info.dl_info.redundancy_version_index, - p_mac_lte_info->detailed_phy_info.dl_info.resource_block_length, - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.crc_status, - crc_status_vals, "Unknown"), - p_mac_lte_info->detailed_phy_info.dl_info.harq_id, - p_mac_lte_info->detailed_phy_info.dl_info.ndi); - proto_item_append_text(phy_ti, ")"); - - /* Don't want columns to be replaced now */ - if (global_mac_lte_layer_to_show == ShowPHYLayer) { - col_set_writable(pinfo->cinfo, FALSE); - } - } - } -} - - -/* Dissect a single Random Access Reponse body */ -static gint dissect_rar_entry(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, - gint offset, guint8 rapid) -{ - guint8 reserved; - guint start_body_offset = offset; - proto_item *ti; - proto_item *rar_body_ti; - proto_tree *rar_body_tree; - proto_tree *ul_grant_tree; - proto_item *ul_grant_ti; - guint16 timing_advance; - guint32 ul_grant; - guint16 temp_crnti; - - /* Create tree for this Body */ - rar_body_ti = proto_tree_add_item(tree, - hf_mac_lte_rar_body, - tvb, offset, 0, ENC_ASCII|ENC_NA); - rar_body_tree = proto_item_add_subtree(rar_body_ti, ett_mac_lte_rar_body); - - /* Dissect an RAR entry */ - - /* Check reserved bit */ - reserved = (tvb_get_guint8(tvb, offset) & 0x80) >> 7; - ti = proto_tree_add_item(rar_body_tree, hf_mac_lte_rar_reserved2, tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "RAR body Reserved bit not zero (found 0x%x)", reserved); - } - - /* Timing Advance */ - timing_advance = (tvb_get_ntohs(tvb, offset) & 0x7ff0) >> 4; - ti = proto_tree_add_item(rar_body_tree, hf_mac_lte_rar_ta, tvb, offset, 2, ENC_BIG_ENDIAN); - - if (timing_advance != 0) { - expert_add_info_format(pinfo, ti, PI_SEQUENCE, (timing_advance <= 31) ? PI_NOTE : PI_WARN, - "RAR Timing advance not zero (%u)", timing_advance); - } - - offset++; - - /* UL Grant */ - ul_grant = (tvb_get_ntohl(tvb, offset) & 0x0fffff00) >> 8; - ul_grant_ti = proto_tree_add_item(rar_body_tree, hf_mac_lte_rar_ul_grant, tvb, offset, 3, ENC_BIG_ENDIAN); - - /* Break these 20 bits down as described in 36.213, section 6.2 */ - /* Create subtree for UL grant break-down */ - ul_grant_tree = proto_item_add_subtree(ul_grant_ti, ett_mac_lte_rar_ul_grant); - - /* Hopping flag (1 bit) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_hopping, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Fixed sized resource block assignment (10 bits) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_fsrba, - tvb, offset, 2, ENC_BIG_ENDIAN); - - /* Truncated Modulation and coding scheme (4 bits) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tmcs, - tvb, offset+1, 2, ENC_BIG_ENDIAN); - - /* TPC command for scheduled PUSCH (3 bits) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tcsp, - tvb, offset+2, 1, ENC_BIG_ENDIAN); - - /* UL delay (1 bit) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_ul_delay, - tvb, offset+2, 1, ENC_BIG_ENDIAN); - - /* CQI request (1 bit) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_cqi_request, - tvb, offset+2, 1, ENC_BIG_ENDIAN); - - offset += 3; - - /* Temporary C-RNTI */ - temp_crnti = tvb_get_ntohs(tvb, offset); - proto_tree_add_item(rar_body_tree, hf_mac_lte_rar_temporary_crnti, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - - write_pdu_label_and_info(pdu_ti, rar_body_ti, pinfo, - "(RAPID=%u: TA=%u, UL-Grant=%u, Temp C-RNTI=%u) ", - rapid, timing_advance, ul_grant, temp_crnti); - - proto_item_set_len(rar_body_ti, offset-start_body_offset); - - return offset; -} - - -#define MAX_RAR_PDUS 64 -/* Dissect Random Access Reponse (RAR) PDU */ -static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *pdu_ti, - gint offset, mac_lte_info *p_mac_lte_info, mac_lte_tap_info *tap_info) -{ - gint number_of_rars = 0; /* No of RAR bodies expected following headers */ - guint8 *rapids = ep_alloc(MAX_RAR_PDUS * sizeof(guint8)); - gboolean backoff_indicator_seen = FALSE; - guint8 backoff_indicator = 0; - guint8 extension; - gint n; - proto_tree *rar_headers_tree; - proto_item *ti; - proto_item *rar_headers_ti; - proto_item *padding_length_ti; - int start_headers_offset = offset; - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "RAR (RA-RNTI=%u, SF=%u) ", - p_mac_lte_info->rnti, p_mac_lte_info->subframeNumber); - - /* Create hidden 'virtual root' so can filter on mac-lte.rar */ - ti = proto_tree_add_item(tree, hf_mac_lte_rar, tvb, offset, -1, ENC_NA); - PROTO_ITEM_SET_HIDDEN(ti); - - /* Create headers tree */ - rar_headers_ti = proto_tree_add_item(tree, - hf_mac_lte_rar_headers, - tvb, offset, 0, ENC_ASCII|ENC_NA); - rar_headers_tree = proto_item_add_subtree(rar_headers_ti, ett_mac_lte_rar_headers); - - - /***************************/ - /* Read the header entries */ - do { - int start_header_offset = offset; - proto_tree *rar_header_tree; - proto_item *rar_header_ti; - guint8 type_value; - guint8 first_byte = tvb_get_guint8(tvb, offset); - - /* Create tree for this header */ - rar_header_ti = proto_tree_add_item(rar_headers_tree, - hf_mac_lte_rar_header, - tvb, offset, 0, ENC_ASCII|ENC_NA); - rar_header_tree = proto_item_add_subtree(rar_header_ti, ett_mac_lte_rar_header); - - /* Extension */ - extension = (first_byte & 0x80) >> 7; - proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_extension, tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Type */ - type_value = (first_byte & 0x40) >> 6; - proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_t, tvb, offset, 1, ENC_BIG_ENDIAN); - - if (type_value == 0) { - /* Backoff Indicator (BI) case */ - - guint8 reserved; - proto_item *tii; - proto_item *bi_ti; - - /* 2 Reserved bits */ - reserved = (tvb_get_guint8(tvb, offset) & 0x30) >> 4; - tii = proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, tii, PI_MALFORMED, PI_ERROR, - "RAR header Reserved bits not zero (found 0x%x)", reserved); - } - - /* Backoff Indicator */ - backoff_indicator = tvb_get_guint8(tvb, offset) & 0x0f; - bi_ti = proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_bi, tvb, offset, 1, ENC_BIG_ENDIAN); - - /* As of March 2009 spec, it must be first, and may only appear once */ - if (backoff_indicator_seen) { - expert_add_info_format(pinfo, bi_ti, PI_MALFORMED, PI_ERROR, - "MAC RAR PDU has > 1 Backoff Indicator subheader present"); - } - - backoff_indicator_seen = TRUE; - - write_pdu_label_and_info(pdu_ti, rar_header_ti, pinfo, - "(Backoff Indicator=%sms)", - val_to_str_const(backoff_indicator, rar_bi_vals, "Illegal-value ")); - - /* If present, it must be the first subheader */ - if (number_of_rars > 0) { - expert_add_info_format(pinfo, bi_ti, PI_MALFORMED, PI_WARN, - "Backoff Indicator must appear as first subheader"); - } - - } else { - /* RAPID case */ - /* TODO: complain if the same RAPID appears twice in same frame? */ - rapids[number_of_rars] = tvb_get_guint8(tvb, offset) & 0x3f; - proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_rapid, tvb, offset, 1, ENC_BIG_ENDIAN); - - proto_item_append_text(rar_header_ti, "(RAPID=%u)", rapids[number_of_rars]); - - number_of_rars++; - } - - offset++; - - /* Finalise length of header tree selection */ - proto_item_set_len(rar_header_ti, offset - start_header_offset); - - } while (extension && number_of_rars < MAX_RAR_PDUS); - - /* Append summary to headers root */ - proto_item_append_text(rar_headers_ti, " (%u RARs", number_of_rars); - - if (backoff_indicator_seen) { - proto_item_append_text(rar_headers_ti, ", BI=%sms)", - val_to_str_const(backoff_indicator, rar_bi_vals, "Illegal-value ")); - } else { - proto_item_append_text(rar_headers_ti, ")"); - } - - /* Set length for headers root */ - proto_item_set_len(rar_headers_ti, offset-start_headers_offset); - - - /***************************/ - /* Read any indicated RARs */ - for (n=0; n < number_of_rars; n++) { - offset = dissect_rar_entry(tvb, pinfo, tree, pdu_ti, offset, rapids[n]); - } - - /* Update TAP info */ - tap_info->number_of_rars += number_of_rars; - - /* Padding may follow */ - if (tvb_length_remaining(tvb, offset) > 0) { - proto_tree_add_item(tree, hf_mac_lte_padding_data, - tvb, offset, -1, ENC_NA); - } - - padding_length_ti = proto_tree_add_int(tree, hf_mac_lte_padding_length, - tvb, offset, 0, - p_mac_lte_info->length - offset); - PROTO_ITEM_SET_GENERATED(padding_length_ti); - - /* Update padding bytes in stats */ - tap_info->padding_bytes += (p_mac_lte_info->length - offset); -} - - -/* Dissect BCH PDU */ -static void dissect_bch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, - int offset, mac_lte_info *p_mac_lte_info) -{ - proto_item *ti; - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "BCH PDU (%u bytes, on %s transport) ", - tvb_length_remaining(tvb, offset), - val_to_str_const(p_mac_lte_info->rntiType, - bch_transport_channel_vals, - "Unknown")); - - /* Show which transport layer it came in on (inferred from RNTI type) */ - ti = proto_tree_add_uint(tree, hf_mac_lte_context_bch_transport_channel, - tvb, offset, 0, p_mac_lte_info->rntiType); - PROTO_ITEM_SET_GENERATED(ti); - - /****************************************/ - /* Whole frame is BCH data */ - - /* Raw data */ - ti = proto_tree_add_item(tree, hf_mac_lte_bch_pdu, - tvb, offset, -1, ENC_NA); - - if (global_mac_lte_attempt_rrc_decode) { - /* Attempt to decode payload using LTE RRC dissector */ - tvbuff_t *rrc_tvb = tvb_new_subset(tvb, offset, -1, tvb_length_remaining(tvb, offset)); - - /* Get appropriate dissector handle */ - dissector_handle_t protocol_handle = 0; - - if (p_mac_lte_info->rntiType == SI_RNTI) { - protocol_handle = find_dissector("lte_rrc.bcch_dl_sch"); - } else { - protocol_handle = find_dissector("lte_rrc.bcch_bch"); - } - - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(ti); - - call_with_catch_all(protocol_handle, rrc_tvb, pinfo, tree); - } - - /* Check that this *is* downlink! */ - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "BCH data should not be received in Uplink!"); - } -} - - -/* Dissect PCH PDU */ -static void dissect_pch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, int offset, guint8 direction) -{ - proto_item *ti; - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "PCH PDU (%u bytes) ", - tvb_length_remaining(tvb, offset)); - - /****************************************/ - /* Whole frame is PCH data */ - - /* Always show as raw data */ - ti = proto_tree_add_item(tree, hf_mac_lte_pch_pdu, - tvb, offset, -1, ENC_NA); - - if (global_mac_lte_attempt_rrc_decode) { - - /* Attempt to decode payload using LTE RRC dissector */ - tvbuff_t *rrc_tvb = tvb_new_subset(tvb, offset, -1, tvb_length_remaining(tvb, offset)); - - /* Get appropriate dissector handle */ - dissector_handle_t protocol_handle = find_dissector("lte-rrc.pcch"); - - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(ti); - - /* Call it (catch exceptions so that stats will be updated) */ - TRY { - call_dissector_only(protocol_handle, rrc_tvb, pinfo, tree); - } - CATCH_ALL { - } - ENDTRY - } - - /* Check that this *is* downlink! */ - if (direction == DIRECTION_UPLINK) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "PCH data should not be received in Uplink!"); - } -} - - -/* Does this header entry correspond to a fixed-sized control element? */ -static int is_fixed_sized_control_element(guint8 lcid, guint8 direction) -{ - if (direction == DIRECTION_UPLINK) { - /* Uplink */ - switch (lcid) { - case POWER_HEADROOM_REPORT_LCID: - case CRNTI_LCID: - case TRUNCATED_BSR_LCID: - case SHORT_BSR_LCID: - case LONG_BSR_LCID: - return TRUE; - - default: - return FALSE; - } - } else { - /* Assume Downlink */ - switch (lcid) { - case ACTIVATION_DEACTIVATION_LCID: - case UE_CONTENTION_RESOLUTION_IDENTITY_LCID: - case TIMING_ADVANCE_LCID: - case DRX_COMMAND_LCID: - return TRUE; - - default: - return FALSE; - } - } -} - - -/* Is this a BSR report header? */ -static int is_bsr_lcid(guint8 lcid) -{ - return ((lcid == TRUNCATED_BSR_LCID) || - (lcid == SHORT_BSR_LCID) || - (lcid == LONG_BSR_LCID)); -} - - -/* Helper function to call RLC dissector for SDUs (where channel params are known) */ -static void call_rlc_dissector(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, - int offset, guint16 data_length, - guint8 mode, guint8 direction, guint16 ueid, - guint16 channelType, guint16 channelId, - guint8 UMSequenceNumberLength, - guint8 priority) -{ - tvbuff_t *srb_tvb = tvb_new_subset(tvb, offset, data_length, data_length); - struct rlc_lte_info *p_rlc_lte_info; - - /* Get RLC dissector handle */ - volatile dissector_handle_t protocol_handle = find_dissector("rlc-lte"); - - /* Resuse or create RLC info */ - p_rlc_lte_info = p_get_proto_data(pinfo->fd, proto_rlc_lte); - - if (p_rlc_lte_info == NULL) { - p_rlc_lte_info = se_alloc0(sizeof(struct rlc_lte_info)); - } - - /* Fill in struct details for srb channels */ - p_rlc_lte_info->rlcMode = mode; - p_rlc_lte_info->direction = direction; - p_rlc_lte_info->priority = priority; - p_rlc_lte_info->ueid = ueid; - p_rlc_lte_info->channelType = channelType; - p_rlc_lte_info->channelId = channelId; - p_rlc_lte_info->pduLength = data_length; - p_rlc_lte_info->UMSequenceNumberLength = UMSequenceNumberLength; - - /* Store info in packet */ - p_add_proto_data(pinfo->fd, proto_rlc_lte, p_rlc_lte_info); - - if (global_mac_lte_layer_to_show != ShowRLCLayer) { - /* Don't want these columns replaced */ - col_set_writable(pinfo->cinfo, FALSE); - } else { - /* Clear info column before first RLC PDU */ - if (s_number_of_rlc_pdus_shown == 0) { - col_clear(pinfo->cinfo, COL_INFO); - } else { - /* Add a separator and protect column contents here */ - write_pdu_label_and_info(pdu_ti, NULL, pinfo, " || "); - col_set_fence(pinfo->cinfo, COL_INFO); - } - } - - s_number_of_rlc_pdus_shown++; - - /* Call it (catch exceptions so that stats will be updated) */ - TRY { - call_dissector_only(protocol_handle, srb_tvb, pinfo, tree); - } - CATCH_ALL { - } - ENDTRY - - /* Let columns be written to again */ - col_set_writable(pinfo->cinfo, TRUE); -} - - -/* For DL frames, look for previous Tx. Add link back if found */ -static void TrackReportedDLHARQResend(packet_info *pinfo, tvbuff_t *tvb, volatile int length, - proto_tree *tree, mac_lte_info *p_mac_lte_info) -{ - DLHARQResult *result = NULL; - DLHARQResult *original_result = NULL; - - /* If don't have detailed DL PHy info, just give up */ - if (!p_mac_lte_info->detailed_phy_info.dl_info.present) { - return; - } - - /* TDD may not work... */ - - if (!pinfo->fd->flags.visited) { - /* First time, so set result and update DL harq table */ - LastFrameData *lastData = NULL; - LastFrameData *thisData = NULL; - - DLHarqBuffers *ueData; - - /* Read these for convenience */ - guint8 harq_id = p_mac_lte_info->detailed_phy_info.dl_info.harq_id; - guint8 transport_block = p_mac_lte_info->detailed_phy_info.dl_info.transport_block; - - /* Check harq-id bounds, give up if invalid */ - if ((harq_id >= 15) || (transport_block+1 > 2)) { - return; - } - - /* Look up entry for this UE/RNTI */ - ueData = g_hash_table_lookup(mac_lte_dl_harq_hash, GUINT_TO_POINTER((guint)p_mac_lte_info->rnti)); - - if (ueData != NULL) { - /* Get previous info for this harq-id */ - lastData = &(ueData->harqid[transport_block][harq_id]); - - if (lastData->inUse) { - /* Compare time difference, ndi, data to see if this looks like a retx */ - if ((length == lastData->length) && - (p_mac_lte_info->detailed_phy_info.dl_info.ndi == lastData->ndi) && - tvb_memeql(tvb, 0, lastData->data, MIN(lastData->length, MAX_EXPECTED_PDU_LENGTH)) == 0) { - - /* Work out gap between frames */ - gint seconds_between_packets = (gint) - (pinfo->fd->abs_ts.secs - lastData->received_time.secs); - gint nseconds_between_packets = - pinfo->fd->abs_ts.nsecs - lastData->received_time.nsecs; - - /* Round difference to nearest millisecond */ - gint total_gap = (seconds_between_packets*1000) + - ((nseconds_between_packets+500000) / 1000000); - - /* Expect to be within (say) 8-13 subframes since previous */ - if ((total_gap >= 8) && (total_gap <= 13)) { - - /* Resend detected! Store result pointing back. */ - result = se_alloc0(sizeof(DLHARQResult)); - result->previousSet = TRUE; - result->previousFrameNum = lastData->framenum; - result->timeSincePreviousFrame = total_gap; - g_hash_table_insert(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num), result); - - /* Now make previous frame point forward to here */ - original_result = g_hash_table_lookup(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(lastData->framenum)); - - if (original_result == NULL) { - original_result = se_alloc0(sizeof(ULHARQResult)); - g_hash_table_insert(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(lastData->framenum), original_result); - } - - original_result->nextSet = TRUE; - original_result->nextFrameNum = pinfo->fd->num; - original_result->timeToNextFrame = total_gap; - } - } - } - } else { - /* Allocate entry in table for this UE/RNTI */ - ueData = se_alloc0(sizeof(DLHarqBuffers)); - g_hash_table_insert(mac_lte_dl_harq_hash, GUINT_TO_POINTER((guint)p_mac_lte_info->rnti), ueData); - } - - /* Store this frame's details in table */ - thisData = &(ueData->harqid[transport_block][harq_id]); - thisData->inUse = TRUE; - thisData->length = length; - tvb_memcpy(tvb, thisData->data, 0, MIN(thisData->length, MAX_EXPECTED_PDU_LENGTH)); - thisData->ndi = p_mac_lte_info->detailed_phy_info.dl_info.ndi; - thisData->framenum = pinfo->fd->num; - thisData->received_time = pinfo->fd->abs_ts; - } else { - /* Not first time, so just set whats already stored in result */ - result = g_hash_table_lookup(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - } - - - /***************************************************/ - /* Show link back to original frame (if available) */ - if (result != NULL) { - if (result->previousSet) { - proto_item *gap_ti; - proto_item *original_ti = proto_tree_add_uint(tree, hf_mac_lte_dl_harq_resend_original_frame, - tvb, 0, 0, result->previousFrameNum); - PROTO_ITEM_SET_GENERATED(original_ti); - - gap_ti = proto_tree_add_uint(tree, hf_mac_lte_dl_harq_resend_time_since_previous_frame, - tvb, 0, 0, result->timeSincePreviousFrame); - PROTO_ITEM_SET_GENERATED(gap_ti); - } - - if (result->nextSet) { - proto_item *gap_ti; - proto_item *next_ti = proto_tree_add_uint(tree, hf_mac_lte_dl_harq_resend_next_frame, - tvb, 0, 0, result->nextFrameNum); - PROTO_ITEM_SET_GENERATED(next_ti); - - gap_ti = proto_tree_add_uint(tree, hf_mac_lte_dl_harq_resend_time_until_next_frame, - tvb, 0, 0, result->timeToNextFrame); - PROTO_ITEM_SET_GENERATED(gap_ti); - } - - } -} - - -/* Return TRUE if the given packet is thought to be a retx */ -int is_mac_lte_frame_retx(packet_info *pinfo, guint8 direction) -{ - struct mac_lte_info *p_mac_lte_info = p_get_proto_data(pinfo->fd, proto_mac_lte); - - if (direction == DIRECTION_UPLINK) { - /* For UL, retx count is stored in per-packet struct */ - return ((p_mac_lte_info != NULL) && (p_mac_lte_info->reTxCount > 0)); - } else { - /* Use answer if told directly */ - if (p_mac_lte_info->dl_retx == dl_retx_yes) { - return TRUE; - } else { - /* Otherwise look up in table */ - DLHARQResult *result = g_hash_table_lookup(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - return ((result != NULL) && result->previousSet); - } - } -} - - -/* Track UL frames, so that when a retx is indicated, we can search for - the original tx. We will either find it, and provide a link back to it, - or flag that we couldn't find as an expert error */ -static void TrackReportedULHARQResend(packet_info *pinfo, tvbuff_t *tvb, volatile int offset, - proto_tree *tree, mac_lte_info *p_mac_lte_info, - proto_item *retx_ti) -{ - ULHARQResult *result = NULL; - - /* If don't have detailed DL PHY info, just give up */ - if (!p_mac_lte_info->detailed_phy_info.ul_info.present) { - return; - } - - /* Give up if harqid is out of range */ - if (p_mac_lte_info->detailed_phy_info.ul_info.harq_id >= 8) { - return; - } - - if (!pinfo->fd->flags.visited) { - /* First time, so set result and update UL harq table */ - LastFrameData *lastData = NULL; - LastFrameData *thisData = NULL; - - /* Look up entry for this UE/RNTI */ - ULHarqBuffers *ueData = - g_hash_table_lookup(mac_lte_ul_harq_hash, GUINT_TO_POINTER((guint)p_mac_lte_info->rnti)); - - if (ueData != NULL) { - if (p_mac_lte_info->reTxCount >= 1) { - /* Looking for frame previously on this harq-id */ - lastData = &(ueData->harqid[p_mac_lte_info->detailed_phy_info.ul_info.harq_id]); - - if (lastData->inUse) { - /* Compare time, sf, data to see if this looks like a retx */ - if ((tvb_length_remaining(tvb, offset) == lastData->length) && - (p_mac_lte_info->detailed_phy_info.ul_info.ndi == lastData->ndi) && - tvb_memeql(tvb, offset, lastData->data, MIN(lastData->length, MAX_EXPECTED_PDU_LENGTH)) == 0) { - - /* Work out gap between frames */ - gint seconds_between_packets = (gint) - (pinfo->fd->abs_ts.secs - lastData->received_time.secs); - gint nseconds_between_packets = - pinfo->fd->abs_ts.nsecs - lastData->received_time.nsecs; - - /* Round to nearest ms */ - gint total_gap = (seconds_between_packets*1000) + - ((nseconds_between_packets+500000) / 1000000); - - /* Could be as many as max-tx (which we don't know) * 8ms ago. - 32 is the most I've seen... */ - if (total_gap <= 33) { - ULHARQResult *original_result = NULL; - - /* Original detected!!! Store result pointing back */ - result = se_alloc0(sizeof(ULHARQResult)); - result->previousSet = TRUE; - result->previousFrameNum = lastData->framenum; - result->timeSincePreviousFrame = total_gap; - g_hash_table_insert(mac_lte_ul_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num), result); - - /* Now make previous frame point forward to here */ - original_result = g_hash_table_lookup(mac_lte_ul_harq_result_hash, GUINT_TO_POINTER(lastData->framenum)); - - if (original_result == NULL) { - original_result = se_alloc0(sizeof(ULHARQResult)); - g_hash_table_insert(mac_lte_ul_harq_result_hash, GUINT_TO_POINTER(lastData->framenum), original_result); - } - - original_result->nextSet = TRUE; - original_result->nextFrameNum = pinfo->fd->num; - original_result->timeToNextFrame = total_gap; - } - } - } - } - } else { - /* Allocate entry in table for this UE/RNTI */ - ueData = se_alloc0(sizeof(ULHarqBuffers)); - g_hash_table_insert(mac_lte_ul_harq_hash, GUINT_TO_POINTER((guint)p_mac_lte_info->rnti), ueData); - } - - /* Store this frame's details in table */ - thisData = &(ueData->harqid[p_mac_lte_info->detailed_phy_info.ul_info.harq_id]); - thisData->inUse = TRUE; - thisData->length = tvb_length_remaining(tvb, offset); - tvb_memcpy(tvb, thisData->data, offset, MIN(thisData->length, MAX_EXPECTED_PDU_LENGTH)); - thisData->ndi = p_mac_lte_info->detailed_phy_info.ul_info.ndi; - thisData->framenum = pinfo->fd->num; - thisData->received_time = pinfo->fd->abs_ts; - } else { - /* Not first time, so just get whats already stored in result */ - result = g_hash_table_lookup(mac_lte_ul_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - } - - /* Show any link back to previous Tx */ - if (retx_ti != NULL) { - if (result != NULL) { - if (result->previousSet) { - proto_item *original_ti, *gap_ti; - - original_ti = proto_tree_add_uint(tree, hf_mac_lte_ul_harq_resend_original_frame, - tvb, 0, 0, result->previousFrameNum); - PROTO_ITEM_SET_GENERATED(original_ti); - - gap_ti = proto_tree_add_uint(tree, hf_mac_lte_ul_harq_resend_time_since_previous_frame, - tvb, 0, 0, result->timeSincePreviousFrame); - PROTO_ITEM_SET_GENERATED(gap_ti); - } - } else { - expert_add_info_format(pinfo, retx_ti, PI_SEQUENCE, PI_ERROR, - "Original Tx of UL frame not found (UE %u) !!", p_mac_lte_info->ueid); - } - } - - /* Show link forward to any known next Tx */ - if ((result != NULL) && result->nextSet) { - proto_item *next_ti, *gap_ti; - - next_ti = proto_tree_add_uint(tree, hf_mac_lte_ul_harq_resend_next_frame, - tvb, 0, 0, result->nextFrameNum); - expert_add_info_format(pinfo, next_ti, PI_SEQUENCE, PI_WARN, - "UL MAC PDU (UE %u) needed to be retransmitted", p_mac_lte_info->ueid); - - PROTO_ITEM_SET_GENERATED(next_ti); - - gap_ti = proto_tree_add_uint(tree, hf_mac_lte_ul_harq_resend_time_until_next_frame, - tvb, 0, 0, result->timeToNextFrame); - PROTO_ITEM_SET_GENERATED(gap_ti); - } -} - - -/* Look up SRResult associated with a given frame. Will create one if necessary - if can_create is set */ -static SRResult *GetSRResult(guint32 frameNum, gboolean can_create) -{ - SRResult *result; - result = g_hash_table_lookup(mac_lte_sr_request_hash, GUINT_TO_POINTER(frameNum)); - - if ((result == NULL) && can_create) { - result = se_alloc0(sizeof(SRResult)); - g_hash_table_insert(mac_lte_sr_request_hash, GUINT_TO_POINTER((guint)frameNum), result); - } - - return result; -} - - -/* Keep track of SR requests, failures and related grants, in order to show them - as generated fields in these frames */ -static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree, - tvbuff_t *tvb, mac_lte_info *p_mac_lte_info, gint idx, proto_item *event_ti) -{ - SRResult *result = NULL; - SRState *state; - SRResult *resultForSRFrame = NULL; - - guint16 rnti; - guint16 ueid; - proto_item *ti; - - /* Get appropriate identifiers */ - if (event == SR_Request) { - rnti = p_mac_lte_info->oob_rnti[idx]; - ueid = p_mac_lte_info->oob_ueid[idx]; - } else { - rnti = p_mac_lte_info->rnti; - ueid = p_mac_lte_info->ueid; - } - - /* Create state for this RNTI if necessary */ - state = g_hash_table_lookup(mac_lte_ue_sr_state, GUINT_TO_POINTER((guint)rnti)); - - if (state == NULL) { - /* Allocate status for this RNTI */ - state = se_alloc(sizeof(SRState)); - state->status = None; - g_hash_table_insert(mac_lte_ue_sr_state, GUINT_TO_POINTER((guint)rnti), state); - } - - /* First time through - update state with new info */ - if (!pinfo->fd->flags.visited) { - guint32 timeSinceRequest; - - /* Store time of request */ - if (event == SR_Request) { - state->requestTime = pinfo->fd->abs_ts; - } - - switch (state->status) { - case None: - switch (event) { - case SR_Grant: - /* Got another grant - fine */ - - /* update state */ - state->lastGrantFramenum = pinfo->fd->num; - break; - - case SR_Request: - /* Sent an SR - fine */ - - /* Update state */ - state->status = SR_Outstanding; - state->lastSRFramenum = pinfo->fd->num; - break; - - case SR_Failure: - /* This is an error, since we hadn't send an SR... */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = InvalidSREvent; - result->status = None; - result->event = SR_Failure; - break; - } - - break; - - case SR_Outstanding: - timeSinceRequest = (guint32)(((pinfo->fd->abs_ts.secs - state->requestTime.secs) * 1000) + - ((pinfo->fd->abs_ts.nsecs - state->requestTime.nsecs) / 1000000)); - - switch (event) { - case SR_Grant: - /* Got grant we were waiting for, so state goes to None */ - - /* Update state */ - state->status = None; - - /* Set result info */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = GrantAnsweringSR; - result->frameNum = state->lastSRFramenum; - result->timeDifference = timeSinceRequest; - - /* Also set forward link for SR */ - resultForSRFrame = GetSRResult(state->lastSRFramenum, TRUE); - resultForSRFrame->type = SRLeadingToGrant; - resultForSRFrame->frameNum = pinfo->fd->num; - resultForSRFrame->timeDifference = timeSinceRequest; - break; - - case SR_Request: - /* Another request when already have one pending */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = InvalidSREvent; - result->status = SR_Outstanding; - result->event = SR_Request; - break; - - case SR_Failure: - /* We sent an SR but it failed */ - - /* Update state */ - state->status = SR_Failed; - - /* Set result info for failure frame */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = FailureAnsweringSR; - result->frameNum = state->lastSRFramenum; - result->timeDifference = timeSinceRequest; - - /* Also set forward link for SR */ - resultForSRFrame = GetSRResult(state->lastSRFramenum, TRUE); - resultForSRFrame->type = SRLeadingToFailure; - resultForSRFrame->frameNum = pinfo->fd->num; - resultForSRFrame->timeDifference = timeSinceRequest; - break; - } - - break; - - case SR_Failed: - switch (event) { - case SR_Grant: - /* Got a grant, presumably after a subsequent RACH - fine */ - - /* Update state */ - state->status = None; - break; - - case SR_Request: - /* Tried another SR after previous one failed. - Presumably a subsequent RACH was tried in-between... */ - - state->status = SR_Outstanding; - - result = GetSRResult(pinfo->fd->num, TRUE); - result->status = SR_Outstanding; - result->event = SR_Request; - break; - - case SR_Failure: - /* 2 failures in a row.... */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = InvalidSREvent; - result->status = SR_Failed; - result->event = SR_Failure; - break; - } - - break; - } - } - - /* Get stored result for this frame */ - result = GetSRResult(pinfo->fd->num, FALSE); - - if (result == NULL) { - /* For an SR frame, there should always be either a PDCCH grant or indication - that the SR has failed */ - if (event == SR_Request) { - expert_add_info_format(pinfo, event_ti, PI_SEQUENCE, PI_ERROR, - "UE %u: SR results in neither a grant nor a failure indication", - ueid); - } - - return; - } - - - /* Show result info */ - switch (result->type) { - case GrantAnsweringSR: - ti = proto_tree_add_uint(tree, hf_mac_lte_grant_answering_sr, - tvb, 0, 0, result->frameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_since_request, - tvb, 0, 0, result->timeDifference); - PROTO_ITEM_SET_GENERATED(ti); - break; - - case FailureAnsweringSR: - ti = proto_tree_add_uint(tree, hf_mac_lte_failure_answering_sr, - tvb, 0, 0, result->frameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_since_request, - tvb, 0, 0, result->timeDifference); - PROTO_ITEM_SET_GENERATED(ti); - break; - - case SRLeadingToGrant: - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_leading_to_grant, - tvb, 0, 0, result->frameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_until_answer, - tvb, 0, 0, result->timeDifference); - PROTO_ITEM_SET_GENERATED(ti); - - break; - - case SRLeadingToFailure: - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_leading_to_failure, - tvb, 0, 0, result->frameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_until_answer, - tvb, 0, 0, result->timeDifference); - PROTO_ITEM_SET_GENERATED(ti); - break; - - case InvalidSREvent: - ti = proto_tree_add_none_format(tree, hf_mac_lte_sr_invalid_event, - tvb, 0, 0, "UE %u: Invalid SR event - state=%s, event=%s", - ueid, - val_to_str_const(result->status, sr_status_vals, "Unknown"), - val_to_str_const(result->event, sr_event_vals, "Unknown")); - PROTO_ITEM_SET_GENERATED(ti); - expert_add_info_format(pinfo, ti, PI_SEQUENCE, PI_ERROR, - "Invalid SR event for UE %u (C-RNTI %u) - state=%s, event=%s", - ueid, rnti, - val_to_str_const(result->status, sr_status_vals, "Unknown"), - val_to_str_const(result->event, sr_event_vals, "Unknown")); - break; - } -} - - -/********************************************************/ -/* Count number of UEs/TTI (in both directions) */ -/********************************************************/ - -/* For keeping track during first pass */ -typedef struct tti_info_t { - guint16 subframe; - nstime_t ttiStartTime; - guint ues_in_tti; -} tti_info_t; - -static tti_info_t UL_tti_info; -static tti_info_t DL_tti_info; - -/* For associating with frame and displaying */ -typedef struct TTIInfoResult_t { - guint ues_in_tti; -} TTIInfoResult_t; - -/* This table stores (FrameNumber -> *TTIInfoResult_t). It is assigned during the first - pass and used thereafter */ -static GHashTable *mac_lte_tti_info_result_hash = NULL; - - -/* Work out which UE this is within TTI (within direction). Return answer */ -static guint16 count_ues_tti(mac_lte_info *p_mac_lte_info, packet_info *pinfo) -{ - gboolean same_tti = FALSE; - tti_info_t *tti_info; - - /* Just return any previous result */ - TTIInfoResult_t *result = g_hash_table_lookup(mac_lte_tti_info_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - - if (result != NULL) { - return result->ues_in_tti; - } - - /* Set tti_info based upon direction */ - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - tti_info = &UL_tti_info; - } else { - tti_info = &DL_tti_info; - } - - /* Work out if we are still in the same tti as before */ - if (tti_info->subframe == p_mac_lte_info->subframeNumber) { - gint seconds_between_packets = (gint) - (pinfo->fd->abs_ts.secs - tti_info->ttiStartTime.secs); - gint nseconds_between_packets = - pinfo->fd->abs_ts.nsecs - tti_info->ttiStartTime.nsecs; - - /* Round difference to nearest microsecond */ - gint total_us_gap = (seconds_between_packets*1000000) + - ((nseconds_between_packets+500) / 1000); - - if (total_us_gap < 1000) { - same_tti = TRUE; - } - } - - /* Update global state */ - if (!same_tti) { - tti_info->subframe = p_mac_lte_info->subframeNumber; - tti_info->ttiStartTime = pinfo->fd->abs_ts; - tti_info->ues_in_tti = 1; - } else { - tti_info->ues_in_tti++; - } - - /* Set result state for this frame */ - result = se_alloc(sizeof(TTIInfoResult_t)); - result->ues_in_tti = tti_info->ues_in_tti; - g_hash_table_insert(mac_lte_tti_info_result_hash, - GUINT_TO_POINTER(pinfo->fd->num), result); - - return tti_info->ues_in_tti; -} - - -/* Show which UE this is (within direction) for this TTI */ -static void show_ues_tti(packet_info *pinfo, mac_lte_info *p_mac_lte_info, tvbuff_t *tvb, proto_tree *context_tree) -{ - /* Look up result */ - TTIInfoResult_t *result = g_hash_table_lookup(mac_lte_tti_info_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - - if (result != NULL) { - proto_item *ti = proto_tree_add_uint(context_tree, - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? - hf_mac_lte_ues_ul_per_tti : - hf_mac_lte_ues_dl_per_tti, - tvb, 0, 0, result->ues_in_tti); - PROTO_ITEM_SET_GENERATED(ti); - } -} - - - -/* Lookup channel details for lcid */ -static void lookup_rlc_channel_from_lcid(guint8 lcid, - rlc_channel_type_t *rlc_channel_type, - guint8 *UM_seqnum_length, - gint *drb_id) -{ - /* Zero params (in case no match is found) */ - *rlc_channel_type = rlcRaw; - *UM_seqnum_length = 0; - *drb_id = 0; - - if (global_mac_lte_lcid_drb_source == (int)FromStaticTable) { - - /* Look up in static (UAT) table */ - guint m; - - for (m=0; m < num_lcid_drb_mappings; m++) { - if (lcid == lcid_drb_mappings[m].lcid) { - - *rlc_channel_type = lcid_drb_mappings[m].channel_type; - - /* Set UM_seqnum_length */ - switch (*rlc_channel_type) { - case rlcUM5: - *UM_seqnum_length = 5; - break; - - case rlcUM10: - *UM_seqnum_length = 10; - break; - - default: - break; - } - - /* Set drb_id */ - *drb_id = lcid_drb_mappings[m].drbid; - break; - } - } - } else { - /* Look up setting gleaned from configuration protocol */ - if (!dynamic_lcid_drb_mapping[lcid].valid) { - return; - } - - *rlc_channel_type = dynamic_lcid_drb_mapping[lcid].channel_type; - - /* Set UM_seqnum_length */ - switch (*rlc_channel_type) { - case rlcUM5: - *UM_seqnum_length = 5; - break; - - case rlcUM10: - *UM_seqnum_length = 10; - break; - - default: - break; - } - - /* Set drb_id */ - *drb_id = dynamic_lcid_drb_mapping[lcid].drbid; - } -} - - - -#define MAX_HEADERS_IN_PDU 1024 - -/* UL-SCH and DL-SCH formats have much in common, so handle them in a common - function */ -static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, - volatile guint32 offset, guint8 direction, - mac_lte_info *p_mac_lte_info, mac_lte_tap_info *tap_info, - proto_item *retx_ti, - proto_tree *context_tree) -{ - guint8 extension; - volatile guint16 n; - proto_item *truncated_ti; - proto_item *padding_length_ti; - proto_item *hidden_root_ti; - - /* Keep track of LCIDs and lengths as we dissect the header */ - volatile guint16 number_of_headers = 0; - guint8 lcids[MAX_HEADERS_IN_PDU]; - gint16 pdu_lengths[MAX_HEADERS_IN_PDU]; - - proto_item *pdu_header_ti; - proto_tree *pdu_header_tree; - - gboolean have_seen_data_header = FALSE; - guint8 number_of_padding_subheaders = 0; - gboolean have_seen_non_padding_control = FALSE; - gboolean have_seen_bsr = FALSE; - gboolean expecting_body_data = FALSE; - volatile guint32 is_truncated = FALSE; - - /* Maintain/show UEs/TTI count */ - tap_info->ueInTTI = count_ues_tti(p_mac_lte_info, pinfo); - show_ues_tti(pinfo, p_mac_lte_info, tvb, context_tree); - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "%s: (SF=%u) UEId=%-3u ", - (direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH", - p_mac_lte_info->subframeNumber, - p_mac_lte_info->ueid); - - tap_info->raw_length = p_mac_lte_info->length; - - /* For uplink frames, if this is logged as a resend, look for original tx */ - if (direction == DIRECTION_UPLINK) { - TrackReportedULHARQResend(pinfo, tvb, offset, tree, p_mac_lte_info, retx_ti); - } - - /* For uplink grants, update SR status. N.B. only newTx grant should stop SR */ - if ((direction == DIRECTION_UPLINK) && (p_mac_lte_info->reTxCount == 0) && - global_mac_lte_track_sr) { - - TrackSRInfo(SR_Grant, pinfo, tree, tvb, p_mac_lte_info, 0, NULL); - } - - /* Add hidden item to filter on */ - hidden_root_ti = proto_tree_add_string_format(tree, - (direction == DIRECTION_UPLINK) ? - hf_mac_lte_ulsch : - hf_mac_lte_dlsch, - tvb, offset, 0, - "", - "Hidden header"); - PROTO_ITEM_SET_HIDDEN(hidden_root_ti); - - /* Add PDU block header subtree */ - pdu_header_ti = proto_tree_add_string_format(tree, - (direction == DIRECTION_UPLINK) ? - hf_mac_lte_ulsch_header : - hf_mac_lte_dlsch_header, - tvb, offset, 0, - "", - "MAC PDU Header"); - pdu_header_tree = proto_item_add_subtree(pdu_header_ti, - (direction == DIRECTION_UPLINK) ? - ett_mac_lte_ulsch_header : - ett_mac_lte_dlsch_header); - - - /************************************************************************/ - /* Dissect each sub-header. */ - do { - guint8 reserved; - guint64 length = 0; - proto_item *pdu_subheader_ti; - proto_tree *pdu_subheader_tree; - proto_item *lcid_ti; - proto_item *ti; - gint offset_start_subheader = offset; - guint8 first_byte = tvb_get_guint8(tvb, offset); - - /* Add PDU block header subtree. - Default with length of 1 byte. */ - pdu_subheader_ti = proto_tree_add_string_format(pdu_header_tree, - hf_mac_lte_sch_subheader, - tvb, offset, 1, - "", - "Sub-header"); - pdu_subheader_tree = proto_item_add_subtree(pdu_subheader_ti, - ett_mac_lte_sch_subheader); - - /* Check 1st 2 reserved bits */ - reserved = (first_byte & 0xc0) >> 6; - ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_sch_reserved, - tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "%cL-SCH header Reserved bits not zero", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? 'U' : 'D'); - } - - /* Extended bit */ - extension = (first_byte & 0x20) >> 5; - proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_sch_extended, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* LCID. Has different meaning depending upon direction. */ - lcids[number_of_headers] = first_byte & 0x1f; - - if (direction == DIRECTION_UPLINK) { - - lcid_ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_ulsch_lcid, - tvb, offset, 1, ENC_BIG_ENDIAN); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "(%s", - val_to_str_const(lcids[number_of_headers], - ulsch_lcid_vals, "(Unknown LCID)")); - } else { - /* Downlink */ - lcid_ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_dlsch_lcid, - tvb, offset, 1, ENC_BIG_ENDIAN); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "(%s", - val_to_str_const(lcids[number_of_headers], - dlsch_lcid_vals, "(Unknown LCID)")); - - if (lcids[number_of_headers] == DRX_COMMAND_LCID) { - expert_add_info_format(pinfo, lcid_ti, PI_SEQUENCE, PI_NOTE, - "DRX command received for UE %u (RNTI %u)", - p_mac_lte_info->ueid, p_mac_lte_info->rnti); - } - } - - offset++; - - /* Remember if we've seen a data subheader */ - if (lcids[number_of_headers] <= 10) { - have_seen_data_header = TRUE; - expecting_body_data = TRUE; - } - - /* Show an expert item if a contol subheader (except Padding) appears - *after* a data PDU */ - if (have_seen_data_header && - (lcids[number_of_headers] > 10) && (lcids[number_of_headers] != PADDING_LCID)) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "%cL-SCH Control subheaders should not appear after data subheaders", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? 'U' : 'D'); - return; - } - - /* Show an expert item if we're seeing more then one BSR in a frame */ - if ((direction == DIRECTION_UPLINK) && is_bsr_lcid(lcids[number_of_headers])) { - if (have_seen_bsr) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "There shouldn't be > 1 BSR in a frame"); - return; - } - - have_seen_bsr = TRUE; - } - - /* Should not see padding after non-padding control... */ - if ((lcids[number_of_headers] > 10) && - (lcids[number_of_headers] == PADDING_LCID) && - extension) { - number_of_padding_subheaders++; - - if (number_of_padding_subheaders > 2) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_WARN, - "Should not see more than 2 padding subheaders in one frame"); - } - - if (have_seen_non_padding_control) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "Padding should come before other control subheaders!"); - } - } - - /* Remember that we've seen non-padding control */ - if ((lcids[number_of_headers] > 10) && - (lcids[number_of_headers] != PADDING_LCID)) { - have_seen_non_padding_control = TRUE; - } - - - - /********************************************************************/ - /* Length field follows if not the last header or for a fixed-sized - control element */ - if (!extension) { - /* Last one... */ - if (is_fixed_sized_control_element(lcids[number_of_headers], direction)) { - pdu_lengths[number_of_headers] = 0; - } else { - pdu_lengths[number_of_headers] = -1; - } - } else { - /* Not the last one */ - if (!is_fixed_sized_control_element(lcids[number_of_headers], direction) && - (lcids[number_of_headers] != PADDING_LCID)) { - - guint8 format; - - /* F(ormat) bit tells us how long the length field is */ - format = (tvb_get_guint8(tvb, offset) & 0x80) >> 7; - proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_sch_format, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Now read length field itself */ - if (format) { - /* >= 128 - use 15 bits */ - proto_tree_add_bits_ret_val(pdu_subheader_tree, hf_mac_lte_sch_length, - tvb, offset*8 + 1, 15, &length, ENC_BIG_ENDIAN); - - offset += 2; - } else { - /* Less than 128 - only 7 bits */ - proto_tree_add_bits_ret_val(pdu_subheader_tree, hf_mac_lte_sch_length, - tvb, offset*8 + 1, 7, &length, ENC_BIG_ENDIAN); - offset++; - } - - pdu_lengths[number_of_headers] = (gint16)length; - } else { - pdu_lengths[number_of_headers] = 0; - } - } - - - /* Close off description in info column */ - switch (pdu_lengths[number_of_headers]) { - case 0: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ") "); - break; - - case -1: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ":remainder) "); - break; - - default: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ":%u bytes) ", - pdu_lengths[number_of_headers]); - break; - } - - /* Append summary to subheader root */ - proto_item_append_text(pdu_subheader_ti, " (lcid=%s", - val_to_str_const(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? - ulsch_lcid_vals : - dlsch_lcid_vals, - "Unknown")); - - switch (pdu_lengths[number_of_headers]) { - case -1: - proto_item_append_text(pdu_subheader_ti, ", length is remainder)"); - proto_item_append_text(pdu_header_ti, " (%s:remainder)", - val_to_str_const(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals, - "Unknown")); - break; - - case 0: - proto_item_append_text(pdu_subheader_ti, ")"); - proto_item_append_text(pdu_header_ti, " (%s)", - val_to_str_const(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals, - "Unknown")); - break; - - default: - proto_item_append_text(pdu_subheader_ti, ", length=%u)", - pdu_lengths[number_of_headers]); - proto_item_append_text(pdu_header_ti, " (%s:%u)", - val_to_str_const(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals, - "Unknown"), - pdu_lengths[number_of_headers]); - break; - } - - - /* Flag unknown lcid values in expert info */ - if (match_strval(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals) == NULL) { - expert_add_info_format(pinfo, pdu_subheader_ti, PI_MALFORMED, PI_ERROR, - "%cL-SCH: Unexpected LCID received (%u)", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? 'U' : 'D', - lcids[number_of_headers]); - } - - /* Set length of this subheader */ - proto_item_set_len(pdu_subheader_ti, offset - offset_start_subheader); - - number_of_headers++; - } while ((number_of_headers < MAX_HEADERS_IN_PDU) && extension); - - /* Check that we didn't reach the end of the subheader array... */ - if (number_of_headers >= MAX_HEADERS_IN_PDU) { - proto_item *ti = proto_tree_add_text(tree, tvb, offset, 1, - "Reached %u subheaders - frame obviously malformed", - MAX_HEADERS_IN_PDU); - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Reached %u subheaders - frame obviously malformed", - MAX_HEADERS_IN_PDU); - return; - } - - - /* Append summary to overall PDU header root */ - proto_item_append_text(pdu_header_ti, " [%u subheaders]", - number_of_headers); - - /* And set its length to offset */ - proto_item_set_len(pdu_header_ti, offset); - - - /* For DL, see if this is a retx. Use whole PDU present (i.e. ignore padding if not logged) */ - if (direction == DIRECTION_DOWNLINK) { - /* Result will be added to context tree */ - TrackReportedDLHARQResend(pinfo, tvb, tvb_length_remaining(tvb, 0), context_tree, p_mac_lte_info); - - tap_info->isPHYRetx = (p_mac_lte_info->dl_retx == dl_retx_yes); - } - - - /************************************************************************/ - /* Dissect SDUs / control elements / padding. */ - /************************************************************************/ - - /* Dissect control element bodies first */ - - for (n=0; n < number_of_headers; n++) { - /* Get out of loop once see any data SDU subheaders */ - if (lcids[n] <= 10) { - break; - } - - /* Process what should be a valid control PDU type */ - if (direction == DIRECTION_DOWNLINK) { - - /****************************/ - /* DL-SCH Control PDUs */ - switch (lcids[n]) { - case ACTIVATION_DEACTIVATION_LCID: { - proto_item *ad_ti; - proto_tree *ad_tree; - proto_item *ti; - guint8 reserved; - - /* Create AD root */ - ad_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_activation_deactivation, - tvb, offset, 1, - "", - "Activation/Deactivation"); - ad_tree = proto_item_add_subtree(ad_ti, ett_mac_lte_activation_deactivation); - - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c7, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c6, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c5, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c4, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c3, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c2, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c1, - tvb, offset, 1, ENC_BIG_ENDIAN); - ti = proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_reserved, - tvb, offset, 1, ENC_BIG_ENDIAN); - reserved = tvb_get_guint8(tvb, offset) & 0x01; - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Activation/Deactivation Reserved bit not zero"); - } - - offset++; - } - break; - - case UE_CONTENTION_RESOLUTION_IDENTITY_LCID: { - proto_item *cr_ti; - proto_tree *cr_tree; - proto_item *ti; - ContentionResolutionResult *crResult; - - /* Create CR root */ - cr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_ue_contention_resolution, - tvb, offset, 6, - "", - "Contention Resolution"); - cr_tree = proto_item_add_subtree(cr_ti, ett_mac_lte_contention_resolution); - - - proto_tree_add_item(cr_tree, hf_mac_lte_control_ue_contention_resolution_identity, - tvb, offset, 6, ENC_NA); - - /* Get pointer to result struct for this frame */ - crResult = g_hash_table_lookup(mac_lte_cr_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - - if (crResult == NULL) { - - /* Need to set result by looking for and comparing with Msg3 */ - Msg3Data *msg3Data; - guint msg3Key = p_mac_lte_info->rnti; - - /* Allocate result and add it to the table */ - crResult = se_alloc(sizeof(ContentionResolutionResult)); - g_hash_table_insert(mac_lte_cr_result_hash, GUINT_TO_POINTER(pinfo->fd->num), crResult); - - /* Look for Msg3 */ - msg3Data = g_hash_table_lookup(mac_lte_msg3_hash, GUINT_TO_POINTER(msg3Key)); - - /* Compare CCCH bytes */ - if (msg3Data != NULL) { - crResult->msSinceMsg3 = (guint32)(((pinfo->fd->abs_ts.secs - msg3Data->msg3Time.secs) * 1000) + - ((pinfo->fd->abs_ts.nsecs - msg3Data->msg3Time.nsecs) / 1000000)); - crResult->msg3FrameNum = msg3Data->framenum; - - /* Compare the 6 bytes */ - if (tvb_memeql(tvb, offset, msg3Data->data, 6) == 0) { - crResult->status = Msg3Match; - } else { - crResult->status = Msg3NoMatch; - } - } else { - crResult->status = NoMsg3; - } - } - - /* Now show CR result in tree */ - switch (crResult->status) { - case NoMsg3: - proto_item_append_text(cr_ti, " (no corresponding Msg3 found!)"); - break; - - case Msg3Match: - ti = proto_tree_add_uint(cr_tree, hf_mac_lte_control_ue_contention_resolution_msg3, - tvb, 0, 0, crResult->msg3FrameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(cr_tree, hf_mac_lte_control_ue_contention_resolution_time_since_msg3, - tvb, 0, 0, crResult->msSinceMsg3); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_boolean(cr_tree, hf_mac_lte_control_ue_contention_resolution_msg3_matched, - tvb, 0, 0, TRUE); - PROTO_ITEM_SET_GENERATED(ti); - proto_item_append_text(cr_ti, " (matches Msg3 from frame %u, %ums ago)", - crResult->msg3FrameNum, crResult->msSinceMsg3); - break; - - case Msg3NoMatch: - ti = proto_tree_add_uint(cr_tree, hf_mac_lte_control_ue_contention_resolution_msg3, - tvb, 0, 0, crResult->msg3FrameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(cr_tree, hf_mac_lte_control_ue_contention_resolution_time_since_msg3, - tvb, 0, 0, crResult->msSinceMsg3); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_boolean(cr_tree, hf_mac_lte_control_ue_contention_resolution_msg3_matched, - tvb, 0, 0, FALSE); - expert_add_info_format(pinfo, ti, PI_SEQUENCE, PI_WARN, - "CR body in Msg4 doesn't match Msg3 CCCH in frame %u", - crResult->msg3FrameNum); - PROTO_ITEM_SET_GENERATED(ti); - proto_item_append_text(cr_ti, " (doesn't match Msg3 from frame %u, %u ago)", - crResult->msg3FrameNum, crResult->msSinceMsg3); - break; - }; - - offset += 6; - } - break; - - case TIMING_ADVANCE_LCID: { - proto_item *ta_ti; - proto_item *reserved_ti; - guint8 reserved; - guint8 ta_value; - - /* Check 2 reserved bits */ - reserved = (tvb_get_guint8(tvb, offset) & 0xc0) >> 6; - reserved_ti = proto_tree_add_item(tree, hf_mac_lte_control_timing_advance_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, reserved_ti, PI_MALFORMED, PI_ERROR, - "Timing Advance Reserved bits not zero (found 0x%x)", reserved); - } - - /* TA value */ - ta_value = tvb_get_guint8(tvb, offset) & 0x3f; - ta_ti = proto_tree_add_item(tree, hf_mac_lte_control_timing_advance, - tvb, offset, 1, ENC_BIG_ENDIAN); - - if (ta_value == 31) { - expert_add_info_format(pinfo, ta_ti, PI_SEQUENCE, - PI_NOTE, - "Timing Advance control element received (no correction needed)"); - } else { - expert_add_info_format(pinfo, ta_ti, PI_SEQUENCE, - PI_WARN, - "Timing Advance control element received (%u) %s correction needed", - ta_value, - (ta_value < 31) ? "-ve" : "+ve"); - } - - offset++; - } - break; - - case DRX_COMMAND_LCID: - /* No payload */ - break; - - case PADDING_LCID: - /* No payload (in this position) */ - tap_info->padding_bytes++; - break; - - default: - break; - } - } else { - - /**********************************/ - /* UL-SCH Control PDUs */ - switch (lcids[n]) { - case EXTENDED_POWER_HEADROOM_REPORT_LCID: { - proto_item *ephr_ti; - proto_tree *ephr_tree; - proto_item *ti; - proto_tree *ephr_cell_tree; - proto_item *ephr_cell_ti; - guint8 scell_bitmap; - guint8 scell_count; - guint8 byte; - guint i; - guint32 curr_offset = offset; - guint32 computed_header_offset; - - if (pdu_lengths[n] == -1) { - /* Control Element size is the remaining PDU */ - pdu_lengths[n] = (gint16)tvb_length_remaining(tvb, curr_offset); - } - - /* Create EPHR root */ - ephr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_ext_power_headroom, - tvb, curr_offset, pdu_lengths[n], - "", - "Extended Power Headroom"); - ephr_tree = proto_item_add_subtree(ephr_ti, ett_mac_lte_extended_power_headroom); - - scell_bitmap = tvb_get_guint8(tvb, curr_offset); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c7, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c6, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c5, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c4, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c3, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c2, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c1, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* Check Reserved bit */ - ti = proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_reserved, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - if (scell_bitmap & 0x01) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Extended Power Headroom Reserved bit not zero"); - } - - curr_offset++; - - /* Compute expected header size to deduce if PH Type 2 report is present or not */ - /* First count the number of SCells */ - for (i = 0, scell_count = 0; i < 7; i++) { - if (scell_bitmap & (0x80>>i)) { - scell_count++; - } - } - - /* Now quickly parse the header */ - computed_header_offset = curr_offset; - - for (i = 0; i < scell_count; i++) { - if (tvb_get_guint8(tvb, computed_header_offset) & 0x80) { - computed_header_offset++; - } - - computed_header_offset++; - } - - if ((gint16)(computed_header_offset + 1 - curr_offset) != pdu_lengths[n]) { - /* PH Type 2 is present */ - if (tvb_get_guint8(tvb, computed_header_offset) & 0x80) { - computed_header_offset++; - } - - computed_header_offset++; - - if ((gint16)(computed_header_offset + 1 - curr_offset) != pdu_lengths[n]) { - expert_add_info_format(pinfo, ephr_ti, PI_MALFORMED, PI_ERROR, - "Control Element has an unexpected size (computed=%d, actual=%d)", - computed_header_offset + 1 - curr_offset, pdu_lengths[n]); - offset += pdu_lengths[n]; - break; - } - - byte = tvb_get_guint8(tvb, curr_offset); - ephr_cell_ti = proto_tree_add_text(ephr_tree, tvb, curr_offset, ((byte&0x80)?2:1), "PCell"); - ephr_cell_tree = proto_item_add_subtree(ephr_cell_ti, ett_mac_lte_extended_power_headroom_cell); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_power_backoff, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_value, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_level, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ephr_cell_ti, " (%s)", - val_to_str_ext_const((byte&0x3f), &power_headroom_vals_ext, "Unknown")); - curr_offset++; - - if (byte & 0x80) { - /* Pcmax,c field is present */ - byte = tvb_get_guint8(tvb, curr_offset); - /* Check 2 Reserved bits */ - ti = proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_reserved2, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - if (byte & 0xc0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Extended Power Headroom Reserved bits not zero (found 0x%x)", - (byte & 0xc0) >> 6); - } - - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_pcmaxc, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ephr_cell_ti, " (%s)", - val_to_str_ext_const((byte&0x3f), &pcmaxc_vals_ext, "Unknown")); - curr_offset++; - } - } else { - if ((gint16)(computed_header_offset + 1 - curr_offset) != pdu_lengths[n]) { - expert_add_info_format(pinfo, ephr_ti, PI_MALFORMED, PI_ERROR, - "Control Element has an unexpected size (computed=%d, actual=%d)", - computed_header_offset + 1 - curr_offset, pdu_lengths[n]); - offset += pdu_lengths[n]; - break; - } - } - - for (i = 1, scell_bitmap>>=1; i <= 7; i++, scell_bitmap>>=1) { - if (scell_bitmap & 0x01) { - byte = tvb_get_guint8(tvb, curr_offset); - ephr_cell_ti = proto_tree_add_text(ephr_tree, tvb, curr_offset, ((byte&0x80)?2:1), "SCell Index %u", i); - ephr_cell_tree = proto_item_add_subtree(ephr_cell_ti, ett_mac_lte_extended_power_headroom_cell); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_power_backoff, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_value, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_level, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ephr_cell_ti, " (%s)", - val_to_str_ext_const((byte&0x3f), &power_headroom_vals_ext, "Unknown")); - curr_offset++; - - if (byte & 0x80) { - /* Pcmax,c field is present */ - byte = tvb_get_guint8(tvb, curr_offset); - /* Check 2 Reserved bits */ - ti = proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_reserved2, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - if (byte & 0xc0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Extended Power Headroom Reserved bits not zero (found 0x%x)", - (byte & 0xc0) >> 6); - } - - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_pcmaxc, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ephr_cell_ti, " (%s)", - val_to_str_ext_const((byte&0x3f), &pcmaxc_vals_ext, "Unknown")); - curr_offset++; - } - } - } - - offset += pdu_lengths[n]; - } - break; - - case POWER_HEADROOM_REPORT_LCID: { - proto_item *phr_ti; - proto_tree *phr_tree; - proto_item *ti; - guint8 reserved; - guint8 level; - - /* Create PHR root */ - phr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_power_headroom, - tvb, offset, 1, - "", - "Power Headroom"); - phr_tree = proto_item_add_subtree(phr_ti, ett_mac_lte_power_headroom); - - /* Check 2 Reserved bits */ - reserved = (tvb_get_guint8(tvb, offset) & 0xc0) >> 6; - ti = proto_tree_add_item(phr_tree, hf_mac_lte_control_power_headroom_reserved, - tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Power Headroom Reserved bits not zero (found 0x%x)", reserved); - } - - /* Level */ - level = tvb_get_guint8(tvb, offset) & 0x3f; - proto_tree_add_item(phr_tree, hf_mac_lte_control_power_headroom_level, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Show value in root label */ - proto_item_append_text(phr_ti, " (%s)", - val_to_str_ext_const(level, &power_headroom_vals_ext, "Unknown")); - offset++; - } - - - break; - - case CRNTI_LCID: - proto_tree_add_item(tree, hf_mac_lte_control_crnti, - tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - break; - - case TRUNCATED_BSR_LCID: - case SHORT_BSR_LCID: { - proto_tree *bsr_tree; - proto_item *bsr_ti; - proto_item *buffer_size_ti; - guint8 lcgid; - guint8 buffer_size; - int hfindex; - value_string_ext *p_vs_ext; - - if (p_mac_lte_info->isExtendedBSRSizes) { - hfindex = hf_mac_lte_control_short_ext_bsr_buffer_size; - p_vs_ext = &ext_buffer_size_vals_ext; - } else { - hfindex = hf_mac_lte_control_short_bsr_buffer_size; - p_vs_ext = &buffer_size_vals_ext; - } - - bsr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_bsr, - tvb, offset, 1, - "", - "Short BSR"); - bsr_tree = proto_item_add_subtree(bsr_ti, ett_mac_lte_bsr); - - /* LCG ID */ - lcgid = (tvb_get_guint8(tvb, offset) & 0xc0) >> 6; - proto_tree_add_item(bsr_tree, hf_mac_lte_control_bsr_lcg_id, - tvb, offset, 1, ENC_BIG_ENDIAN); - /* Buffer Size */ - buffer_size = tvb_get_guint8(tvb, offset) & 0x3f; - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex, - tvb, offset, 1, ENC_BIG_ENDIAN); - offset++; - - if (buffer_size >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG %u exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - lcgid, - buffer_size, - val_to_str_ext_const(buffer_size, p_vs_ext, "Unknown")); - } - - - proto_item_append_text(bsr_ti, " (lcgid=%u %s)", - lcgid, - val_to_str_ext_const(buffer_size, &buffer_size_vals_ext, "Unknown")); - } - break; - - case LONG_BSR_LCID: { - proto_tree *bsr_tree; - proto_item *bsr_ti; - proto_item *buffer_size_ti; - guint8 buffer_size[4]; - int hfindex[4]; - value_string_ext *p_vs_ext; - - if (p_mac_lte_info->isExtendedBSRSizes) { - hfindex[0] = hf_mac_lte_control_long_ext_bsr_buffer_size_0; - hfindex[1] = hf_mac_lte_control_long_ext_bsr_buffer_size_1; - hfindex[2] = hf_mac_lte_control_long_ext_bsr_buffer_size_2; - hfindex[3] = hf_mac_lte_control_long_ext_bsr_buffer_size_3; - p_vs_ext = &ext_buffer_size_vals_ext; - } else { - hfindex[0] = hf_mac_lte_control_long_bsr_buffer_size_0; - hfindex[1] = hf_mac_lte_control_long_bsr_buffer_size_1; - hfindex[2] = hf_mac_lte_control_long_bsr_buffer_size_2; - hfindex[3] = hf_mac_lte_control_long_bsr_buffer_size_3; - p_vs_ext = &buffer_size_vals_ext; - } - - bsr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_bsr, - tvb, offset, 3, - "", - "Long BSR"); - bsr_tree = proto_item_add_subtree(bsr_ti, ett_mac_lte_bsr); - - /* LCID Group 0 */ - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex[0], - tvb, offset, 1, ENC_BIG_ENDIAN); - buffer_size[0] = (tvb_get_guint8(tvb, offset) & 0xfc) >> 2; - - if (buffer_size[0] >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG 0 exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - buffer_size[0], - val_to_str_ext_const(buffer_size[0], p_vs_ext, "Unknown")); - } - - /* LCID Group 1 */ - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex[1], - tvb, offset, 2, ENC_BIG_ENDIAN); - buffer_size[1] = ((tvb_get_guint8(tvb, offset) & 0x03) << 4) | ((tvb_get_guint8(tvb, offset+1) & 0xf0) >> 4); - offset++; - - if (buffer_size[1] >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG 1 exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - buffer_size[1], - val_to_str_ext_const(buffer_size[1], p_vs_ext, "Unknown")); - } - - /* LCID Group 2 */ - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex[2], - tvb, offset, 2, ENC_BIG_ENDIAN); - - buffer_size[2] = ((tvb_get_guint8(tvb, offset) & 0x0f) << 2) | ((tvb_get_guint8(tvb, offset+1) & 0xc0) >> 6); - offset++; - - if (buffer_size[2] >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG 2 exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - buffer_size[2], - val_to_str_ext_const(buffer_size[2], p_vs_ext, "Unknown")); - } - - /* LCID Group 3 */ - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex[3], - tvb, offset, 1, ENC_BIG_ENDIAN); - buffer_size[3] = tvb_get_guint8(tvb, offset) & 0x3f; - offset++; - - if (buffer_size[3] >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG 3 exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - buffer_size[3], - val_to_str_ext_const(buffer_size[3], p_vs_ext, "Unknown")); - } - - /* Append summary to parent */ - proto_item_append_text(bsr_ti, " 0:(%s) 1:(%s) 2:(%s) 3:(%s)", - val_to_str_ext_const(buffer_size[0], p_vs_ext, "Unknown"), - val_to_str_ext_const(buffer_size[1], p_vs_ext, "Unknown"), - val_to_str_ext_const(buffer_size[2], p_vs_ext, "Unknown"), - val_to_str_ext_const(buffer_size[3], p_vs_ext, "Unknown")); - } - break; - - case PADDING_LCID: - /* No payload, in this position */ - tap_info->padding_bytes++; - break; - - default: - break; - } - } - } - - /* There might not be any data, if only headers (plus control data) were logged */ - is_truncated = ((tvb_length_remaining(tvb, offset) == 0) && expecting_body_data); - truncated_ti = proto_tree_add_uint(tree, hf_mac_lte_sch_header_only, tvb, 0, 0, - is_truncated); - - if (is_truncated) { - PROTO_ITEM_SET_GENERATED(truncated_ti); - expert_add_info_format(pinfo, truncated_ti, PI_SEQUENCE, PI_NOTE, - "MAC PDU SDUs have been omitted"); - return; - } else { - PROTO_ITEM_SET_HIDDEN(truncated_ti); - } - - - /* Now process remaining bodies, which should all be data */ - for (; n < number_of_headers; n++) { - - /* Data SDUs treated identically for Uplink or downlink channels */ - proto_item *sdu_ti; - const guint8 *pdu_data; - volatile guint16 data_length; - int i; - char buff[64]; - - /* Break out if meet padding */ - if (lcids[n] == PADDING_LCID) { - break; - } - - /* Work out length */ - data_length = (pdu_lengths[n] == -1) ? - tvb_length_remaining(tvb, offset) : - pdu_lengths[n]; - - /* Dissect SDU as raw bytes */ - sdu_ti = proto_tree_add_bytes_format(tree, hf_mac_lte_sch_sdu, tvb, offset, pdu_lengths[n], - NULL, "SDU (%s, length=%u bytes): ", - val_to_str_const(lcids[n], - (direction == DIRECTION_UPLINK) ? - ulsch_lcid_vals : - dlsch_lcid_vals, - "Unknown"), - data_length); - /* Show bytes too. There must be a nicer way of doing this! */ - pdu_data = tvb_get_ptr(tvb, offset, pdu_lengths[n]); - - for (i=0; i < data_length; i++) { - g_snprintf(buff+(i*2), 3, "%02x", pdu_data[i]); - - if (i >= 30) { - g_snprintf(buff+(i*2), 4, "..."); - break; - } - } - - proto_item_append_text(sdu_ti, "%s", buff); - - - /* Look for Msg3 data so that it may be compared with later - Contention Resolution body */ - if ((lcids[n] == 0) && (direction == DIRECTION_UPLINK) && (data_length == 6)) { - if (!pinfo->fd->flags.visited) { - guint key = p_mac_lte_info->rnti; - Msg3Data *data = g_hash_table_lookup(mac_lte_msg3_hash, GUINT_TO_POINTER(key)); - - /* Look for previous entry for this UE */ - if (data == NULL) { - /* Allocate space for data and add to table */ - data = se_alloc(sizeof(Msg3Data)); - g_hash_table_insert(mac_lte_msg3_hash, GUINT_TO_POINTER(key), data); - } - - /* Fill in data details */ - data->framenum = pinfo->fd->num; - tvb_memcpy(tvb, data->data, offset, data_length); - data->msg3Time = pinfo->fd->abs_ts; - } - } - - /* CCCH frames can be dissected directly by LTE RRC... */ - if ((lcids[n] == 0) && global_mac_lte_attempt_rrc_decode) { - tvbuff_t *rrc_tvb = tvb_new_subset(tvb, offset, data_length, data_length); - - /* Get appropriate dissector handle */ - volatile dissector_handle_t protocol_handle = 0; - - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - protocol_handle = find_dissector("lte_rrc.ul_ccch"); - } else { - protocol_handle = find_dissector("lte_rrc.dl_ccch"); - } - - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(sdu_ti); - - call_with_catch_all(protocol_handle, rrc_tvb, pinfo, tree); - } - - /* LCID 1 and 2 can be assumed to be srb1&2, so can dissect as RLC AM */ - else if ((lcids[n] == 1) || (lcids[n] == 2)) { - if (global_mac_lte_attempt_srb_decode) { - /* Call RLC dissector */ - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_AM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_SRB, lcids[n], 0, - get_mac_lte_channel_priority(p_mac_lte_info->ueid, - lcids[n], direction)); - - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(sdu_ti); - } - } - - else if ((lcids[n] >= 2) && (lcids[n] <= 10)) { - - /* Look for mapping for this LCID to drb channel set by UAT table */ - rlc_channel_type_t rlc_channel_type; - guint8 UM_seqnum_length; - gint drb_id; - guint8 priority = get_mac_lte_channel_priority(p_mac_lte_info->ueid, - lcids[n], direction); - - lookup_rlc_channel_from_lcid(lcids[n], - &rlc_channel_type, - &UM_seqnum_length, - &drb_id); - - /* Dissect according to channel type */ - switch (rlc_channel_type) { - case rlcUM5: - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_UM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_DRB, (guint16)drb_id, UM_seqnum_length, - priority); - break; - - case rlcUM10: - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_UM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_DRB, (guint16)drb_id, UM_seqnum_length, - priority); - break; - - case rlcAM: - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_AM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_DRB, (guint16)drb_id, 0, - priority); - break; - - case rlcTM: - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_TM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_DRB, (guint16)drb_id, 0, - priority); - break; - - case rlcRaw: - /* Nothing to do! */ - break; - } - - if (rlc_channel_type != rlcRaw) { - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(sdu_ti); - } - - } - - offset += data_length; - - /* Update tap byte count for this channel */ - tap_info->bytes_for_lcid[lcids[n]] += data_length; - tap_info->sdus_for_lcid[lcids[n]]++; - } - - - /* Now padding, if present, extends to the end of the PDU */ - if (lcids[number_of_headers-1] == PADDING_LCID) { - if (tvb_length_remaining(tvb, offset) > 0) { - proto_tree_add_item(tree, hf_mac_lte_padding_data, - tvb, offset, -1, ENC_NA); - } - - padding_length_ti = proto_tree_add_int(tree, hf_mac_lte_padding_length, - tvb, offset, 0, - p_mac_lte_info->length - offset); - PROTO_ITEM_SET_GENERATED(padding_length_ti); - - /* Update padding bytes in stats */ - tap_info->padding_bytes += (p_mac_lte_info->length - offset); - - /* Make sure the PDU isn't bigger than reported! */ - if (offset > p_mac_lte_info->length) { - expert_add_info_format(pinfo, padding_length_ti, PI_MALFORMED, PI_ERROR, - "%s MAC PDU is longer than reported length (reported=%u, actual=%u)", - (direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH", - p_mac_lte_info->length, offset); - } - } else { - /* There is no padding at the end of the frame */ - if (!is_truncated && (offset < p_mac_lte_info->length)) { - /* There is a problem if we haven't used all of the PDU */ - expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, - "%s PDU for UE %u is shorter than reported length (reported=%u, actual=%u)", - (direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH", - p_mac_lte_info->ueid, p_mac_lte_info->length, offset); - } - - if (!is_truncated && (offset > p_mac_lte_info->length)) { - /* There is a problem if the PDU is longer than rpeported */ - expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, - "%s PDU for UE %u is longer than reported length (reported=%u, actual=%u)", - (direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH", - p_mac_lte_info->ueid, p_mac_lte_info->length, offset); - } - } -} - -static void dissect_mch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *pdu_ti, - volatile guint32 offset, mac_lte_info *p_mac_lte_info) -{ - guint8 extension; - volatile guint16 n; - proto_item *truncated_ti; - proto_item *padding_length_ti; - proto_item *hidden_root_ti; - - /* Keep track of LCIDs and lengths as we dissect the header */ - volatile guint16 number_of_headers = 0; - guint8 lcids[MAX_HEADERS_IN_PDU]; - gint16 pdu_lengths[MAX_HEADERS_IN_PDU]; - - proto_item *pdu_header_ti; - proto_tree *pdu_header_tree; - - gboolean have_seen_data_header = FALSE; - guint8 number_of_padding_subheaders = 0; - gboolean have_seen_non_padding_control = FALSE; - gboolean expecting_body_data = FALSE; - volatile guint32 is_truncated = FALSE; - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "MCH: ", - p_mac_lte_info->subframeNumber); - - /* Add hidden item to filter on */ - hidden_root_ti = proto_tree_add_string_format(tree, hf_mac_lte_mch, tvb, - offset, 0, "", "Hidden header"); - PROTO_ITEM_SET_HIDDEN(hidden_root_ti); - - /* Add PDU block header subtree */ - pdu_header_ti = proto_tree_add_string_format(tree, hf_mac_lte_mch_header, - tvb, offset, 0, - "", - "MAC PDU Header"); - pdu_header_tree = proto_item_add_subtree(pdu_header_ti, ett_mac_lte_mch_header); - - - /************************************************************************/ - /* Dissect each sub-header. */ - do { - guint8 reserved; - guint64 length = 0; - proto_item *pdu_subheader_ti; - proto_tree *pdu_subheader_tree; - proto_item *lcid_ti; - proto_item *ti; - gint offset_start_subheader = offset; - guint8 first_byte = tvb_get_guint8(tvb, offset); - - /* Add PDU block header subtree. - Default with length of 1 byte. */ - pdu_subheader_ti = proto_tree_add_string_format(pdu_header_tree, - hf_mac_lte_mch_subheader, - tvb, offset, 1, - "", - "Sub-header"); - pdu_subheader_tree = proto_item_add_subtree(pdu_subheader_ti, - ett_mac_lte_mch_subheader); - - /* Check 1st 2 reserved bits */ - reserved = (first_byte & 0xc0) >> 6; - ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_mch_reserved, - tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "MCH header Reserved bits not zero"); - } - - /* Extended bit */ - extension = (first_byte & 0x20) >> 5; - proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_mch_extended, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* LCID */ - lcids[number_of_headers] = first_byte & 0x1f; - lcid_ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_mch_lcid, - tvb, offset, 1, ENC_BIG_ENDIAN); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "(%s", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, "(Unknown LCID)")); - offset++; - - /* Remember if we've seen a data subheader */ - if (lcids[number_of_headers] <= 28) { - have_seen_data_header = TRUE; - expecting_body_data = TRUE; - } - - /* Show an expert item if a contol subheader (except Padding) appears - *after* a data PDU */ - if (have_seen_data_header && - (lcids[number_of_headers] > 28) && (lcids[number_of_headers] != PADDING_LCID)) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "MCH Control subheaders should not appear after data subheaders"); - return; - } - - /* Should not see padding after non-padding control... */ - if ((lcids[number_of_headers] > 28) && - (lcids[number_of_headers] == PADDING_LCID) && - extension) { - number_of_padding_subheaders++; - - if (number_of_padding_subheaders > 2) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_WARN, - "Should not see more than 2 padding subheaders in one frame"); - } - - if (have_seen_non_padding_control) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "Padding should come before other control subheaders!"); - } - } - - /* Remember that we've seen non-padding control */ - if ((lcids[number_of_headers] > 28) && - (lcids[number_of_headers] != PADDING_LCID)) { - have_seen_non_padding_control = TRUE; - } - - - - /********************************************************************/ - /* Length field follows if not the last header or for a fixed-sized - control element */ - if (!extension) { - /* Last one... */ - pdu_lengths[number_of_headers] = -1; - } else { - /* Not the last one */ - if (lcids[number_of_headers] != PADDING_LCID) { - - guint8 format; - - /* F(ormat) bit tells us how long the length field is */ - format = (tvb_get_guint8(tvb, offset) & 0x80) >> 7; - proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_mch_format, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Now read length field itself */ - if (format) { - /* >= 128 - use 15 bits */ - proto_tree_add_bits_ret_val(pdu_subheader_tree, hf_mac_lte_mch_length, - tvb, offset*8 + 1, 15, &length, ENC_BIG_ENDIAN); - - offset += 2; - } else { - /* Less than 128 - only 7 bits */ - proto_tree_add_bits_ret_val(pdu_subheader_tree, hf_mac_lte_mch_length, - tvb, offset*8 + 1, 7, &length, ENC_BIG_ENDIAN); - offset++; - } - - if ((lcids[number_of_headers] == MCH_SCHEDULING_INFO_LCID) && (length & 0x01)) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_WARN, - "MCH Scheduling Information MAC Control Element should have an even size"); - } - - pdu_lengths[number_of_headers] = (gint16)length; - } else { - pdu_lengths[number_of_headers] = 0; - } - } - - - /* Close off description in info column */ - switch (pdu_lengths[number_of_headers]) { - case 0: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ") "); - break; - - case -1: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ":remainder) "); - break; - - default: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ":%u bytes) ", - pdu_lengths[number_of_headers]); - break; - } - - /* Append summary to subheader root */ - proto_item_append_text(pdu_subheader_ti, " (lcid=%s", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, "Unknown")); - - switch (pdu_lengths[number_of_headers]) { - case -1: - proto_item_append_text(pdu_subheader_ti, ", length is remainder)"); - proto_item_append_text(pdu_header_ti, " (%s:remainder)", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, - "Unknown")); - break; - - case 0: - proto_item_append_text(pdu_subheader_ti, ")"); - proto_item_append_text(pdu_header_ti, " (%s)", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, - "Unknown")); - break; - - default: - proto_item_append_text(pdu_subheader_ti, ", length=%u)", - pdu_lengths[number_of_headers]); - proto_item_append_text(pdu_header_ti, " (%s:%u)", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, - "Unknown"), - pdu_lengths[number_of_headers]); - break; - } - - - /* Flag unknown lcid values in expert info */ - if (match_strval(lcids[number_of_headers],mch_lcid_vals) == NULL) { - expert_add_info_format(pinfo, pdu_subheader_ti, PI_MALFORMED, PI_ERROR, - "MCH: Unexpected LCID received (%u)", - lcids[number_of_headers]); - } - - /* Set length of this subheader */ - proto_item_set_len(pdu_subheader_ti, offset - offset_start_subheader); - - number_of_headers++; - } while ((number_of_headers < MAX_HEADERS_IN_PDU) && extension); - - /* Check that we didn't reach the end of the subheader array... */ - if (number_of_headers >= MAX_HEADERS_IN_PDU) { - proto_item *ti = proto_tree_add_text(tree, tvb, offset, 1, - "Reached %u subheaders - frame obviously malformed", - MAX_HEADERS_IN_PDU); - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Reached %u subheaders - frame obviously malformed", - MAX_HEADERS_IN_PDU); - return; - } - - - /* Append summary to overall PDU header root */ - proto_item_append_text(pdu_header_ti, " (%u subheaders)", - number_of_headers); - - /* And set its length to offset */ - proto_item_set_len(pdu_header_ti, offset); - - - /************************************************************************/ - /* Dissect SDUs / control elements / padding. */ - /************************************************************************/ - - /* Dissect control element bodies first */ - - for (n=0; n < number_of_headers; n++) { - /* Get out of loop once see any data SDU subheaders */ - if (lcids[n] <= 28) { - break; - } - - /* Process what should be a valid control PDU type */ - switch (lcids[n]) { - case MCH_SCHEDULING_INFO_LCID: { - guint32 curr_offset = offset; - gint16 i; - guint16 stop_mtch_val; - proto_item *mch_sched_info_ti, *ti; - proto_tree *mch_sched_info_tree; - - mch_sched_info_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_mch_scheduling_info, - tvb, curr_offset, pdu_lengths[n], - "", - "MCH Scheduling Information"); - mch_sched_info_tree = proto_item_add_subtree(mch_sched_info_ti, ett_mac_lte_mch_scheduling_info); - - for (i=0; i<(pdu_lengths[n]/2); i++) { - proto_tree_add_item(mch_sched_info_tree, hf_mac_lte_control_mch_scheduling_info_lcid, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - stop_mtch_val = tvb_get_ntohs(tvb, curr_offset) & 0x7ff; - ti = proto_tree_add_item(mch_sched_info_tree, hf_mac_lte_control_mch_scheduling_info_stop_mtch, - tvb, curr_offset, 2, ENC_BIG_ENDIAN); - - if ((stop_mtch_val >= 2043) && (stop_mtch_val <= 2046)) { - proto_item_append_text(ti, " (reserved)"); - } else if (stop_mtch_val == 2047) { - proto_item_append_text(ti, " (MTCH is not scheduled)"); - } - - curr_offset += 2; - } - - offset += pdu_lengths[n]; - } - break; - - case PADDING_LCID: - /* No payload (in this position) */ - break; - - default: - break; - } - } - - - /* There might not be any data, if only headers (plus control data) were logged */ - is_truncated = ((tvb_length_remaining(tvb, offset) == 0) && expecting_body_data); - truncated_ti = proto_tree_add_uint(tree, hf_mac_lte_mch_header_only, tvb, 0, 0, - is_truncated); - - if (is_truncated) { - PROTO_ITEM_SET_GENERATED(truncated_ti); - expert_add_info_format(pinfo, truncated_ti, PI_SEQUENCE, PI_NOTE, - "MAC PDU SDUs have been omitted"); - return; - } else { - PROTO_ITEM_SET_HIDDEN(truncated_ti); - } - - - /* Now process remaining bodies, which should all be data */ - for (; n < number_of_headers; n++) { - - proto_item *sdu_ti; - const guint8 *pdu_data; - volatile guint16 data_length; - int i; - char buff[64]; - - /* Break out if meet padding */ - if (lcids[n] == PADDING_LCID) { - break; - } - - /* Work out length */ - data_length = (pdu_lengths[n] == -1) ? - tvb_length_remaining(tvb, offset) : - pdu_lengths[n]; - - /* Dissect SDU as raw bytes */ - sdu_ti = proto_tree_add_bytes_format(tree, hf_mac_lte_mch_sdu, tvb, offset, pdu_lengths[n], - NULL, "SDU (%s, length=%u bytes): ", - val_to_str_const(lcids[n], mch_lcid_vals, "Unknown"), - data_length); - /* Show bytes too. There must be a nicer way of doing this! */ - pdu_data = tvb_get_ptr(tvb, offset, pdu_lengths[n]); - - for (i=0; i < data_length; i++) { - g_snprintf(buff+(i*2), 3, "%02x", pdu_data[i]); - - if (i >= 30) { - g_snprintf(buff+(i*2), 4, "..."); - break; - } - } - - proto_item_append_text(sdu_ti, "%s", buff); - - offset += data_length; - } - - /* Now padding, if present, extends to the end of the PDU */ - if (lcids[number_of_headers-1] == PADDING_LCID) { - if (tvb_length_remaining(tvb, offset) > 0) { - proto_tree_add_item(tree, hf_mac_lte_padding_data, - tvb, offset, -1, ENC_NA); - } - - padding_length_ti = proto_tree_add_int(tree, hf_mac_lte_padding_length, - tvb, offset, 0, - p_mac_lte_info->length - offset); - PROTO_ITEM_SET_GENERATED(padding_length_ti); - - /* Make sure the PDU isn't bigger than reported! */ - if (offset > p_mac_lte_info->length) { - expert_add_info_format(pinfo, padding_length_ti, PI_MALFORMED, PI_ERROR, - "MAC PDU is longer than reported length (reported=%u, actual=%u)", - p_mac_lte_info->length, offset); - } - } else { - /* There is no padding at the end of the frame */ - if (!is_truncated && (offset < p_mac_lte_info->length)) { - /* There is a problem if we haven't used all of the PDU */ - expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, - "PDU is shorter than reported length (reported=%u, actual=%u)", - p_mac_lte_info->length, offset); - } - - if (!is_truncated && (offset > p_mac_lte_info->length)) { - /* There is a problem if the PDU is longer than rpeported */ - expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, - "PDU is longer than reported length (reported=%u, actual=%u)", - p_mac_lte_info->length, offset); - } - } -} - - -/*****************************/ -/* Main dissection function. */ -void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) -{ - proto_tree *mac_lte_tree; - proto_item *pdu_ti; - proto_tree *context_tree; - proto_item *context_ti; - proto_item *retx_ti = NULL; - proto_item *ti; - gint offset = 0; - struct mac_lte_info *p_mac_lte_info = NULL; - gint n; - - /* Allocate and zero tap struct */ - mac_lte_tap_info *tap_info = ep_alloc0(sizeof(mac_lte_tap_info)); - - /* Set protocol name */ - col_set_str(pinfo->cinfo, COL_PROTOCOL, "MAC-LTE"); - - /* Create protocol tree. */ - pdu_ti = proto_tree_add_item(tree, proto_mac_lte, tvb, offset, -1, ENC_NA); - proto_item_append_text(pdu_ti, " "); - mac_lte_tree = proto_item_add_subtree(pdu_ti, ett_mac_lte); - - - /* Look for packet info! */ - p_mac_lte_info = p_get_proto_data(pinfo->fd, proto_mac_lte); - - /* Can't dissect anything without it... */ - if (p_mac_lte_info == NULL) { - proto_item *tii = - proto_tree_add_text(mac_lte_tree, tvb, offset, -1, - "Can't dissect LTE MAC frame because no per-frame info was attached!"); - PROTO_ITEM_SET_GENERATED(tii); - return; - } - - /* Clear info column */ - col_clear(pinfo->cinfo, COL_INFO); - - - /*****************************************/ - /* Show context information */ - - /* Create context root */ - context_ti = proto_tree_add_string_format(mac_lte_tree, hf_mac_lte_context, - tvb, offset, 0, "", "Context"); - context_tree = proto_item_add_subtree(context_ti, ett_mac_lte_context); - PROTO_ITEM_SET_GENERATED(context_ti); - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_radio_type, - tvb, 0, 0, p_mac_lte_info->radioType); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_direction, - tvb, 0, 0, p_mac_lte_info->direction); - PROTO_ITEM_SET_GENERATED(ti); - - if (p_mac_lte_info->ueid != 0) { - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_ueid, - tvb, 0, 0, p_mac_lte_info->ueid); - PROTO_ITEM_SET_GENERATED(ti); - } - - /* There are several out-of-band MAC events that may be indicated in the context info. */ - /* Handle them here */ - if (p_mac_lte_info->length == 0) { - proto_item *preamble_ti; - proto_tree *preamble_tree; - - switch (p_mac_lte_info->oob_event) { - case ltemac_send_preamble: - preamble_ti = proto_tree_add_item(mac_lte_tree, hf_mac_lte_oob_send_preamble, - tvb, 0, 0, ENC_ASCII|ENC_NA); - preamble_tree = proto_item_add_subtree(preamble_ti, ett_mac_lte_oob); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(preamble_tree, hf_mac_lte_context_rapid, - tvb, 0, 0, p_mac_lte_info->rapid); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(preamble_tree, hf_mac_lte_context_rach_attempt_number, - tvb, 0, 0, p_mac_lte_info->rach_attempt_number); - PROTO_ITEM_SET_GENERATED(ti); - - /* Info column */ - write_pdu_label_and_info(pdu_ti, preamble_ti, pinfo, - "RACH Preamble sent for UE %u (RAPID=%u, attempt=%u)", - p_mac_lte_info->ueid, p_mac_lte_info->rapid, p_mac_lte_info->rach_attempt_number); - - /* Add expert info (a note, unless attempt > 1) */ - expert_add_info_format(pinfo, ti, PI_SEQUENCE, - (p_mac_lte_info->rach_attempt_number > 1) ? PI_WARN : PI_NOTE, - "RACH Preamble sent for UE %u (RAPID=%u, attempt=%u)", - p_mac_lte_info->ueid, p_mac_lte_info->rapid, - p_mac_lte_info->rach_attempt_number); - break; - - case ltemac_send_sr: - /* Count of SRs */ - ti = proto_tree_add_uint(mac_lte_tree, hf_mac_lte_number_of_srs, - tvb, 0, 0, p_mac_lte_info->number_of_srs); - PROTO_ITEM_SET_GENERATED(ti); - - - for (n=0; n < p_mac_lte_info->number_of_srs; n++) { - proto_item *sr_ti; - proto_tree *sr_tree; - - /* SR event is subtree */ - sr_ti = proto_tree_add_item(mac_lte_tree, hf_mac_lte_oob_send_sr, - tvb, 0, 0, ENC_NA); - sr_tree = proto_item_add_subtree(sr_ti, ett_mac_lte_oob); - PROTO_ITEM_SET_GENERATED(sr_ti); - - - /* RNTI */ - ti = proto_tree_add_uint(sr_tree, hf_mac_lte_context_rnti, - tvb, 0, 0, p_mac_lte_info->oob_rnti[n]); - PROTO_ITEM_SET_GENERATED(ti); - - /* UEID */ - ti = proto_tree_add_uint(sr_tree, hf_mac_lte_context_ueid, - tvb, 0, 0, p_mac_lte_info->oob_ueid[n]); - PROTO_ITEM_SET_GENERATED(ti); - - /* Add summary to root. */ - proto_item_append_text(sr_ti, " (UE=%u C-RNTI=%u)", - p_mac_lte_info->oob_ueid[n], - p_mac_lte_info->oob_rnti[n]); - - /* Info column */ - if (n == 0) { - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "Scheduling Requests (%u) sent: (UE=%u C-RNTI=%u)", - p_mac_lte_info->number_of_srs, - p_mac_lte_info->oob_ueid[n], - p_mac_lte_info->oob_rnti[n]); - } else { - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - " (UE=%u C-RNTI=%u)", - p_mac_lte_info->oob_ueid[n], - p_mac_lte_info->oob_rnti[n]); - } - - /* Add expert info (a note) */ - expert_add_info_format(pinfo, sr_ti, PI_SEQUENCE, PI_NOTE, - "Scheduling Request sent for UE %u (RNTI %u)", - p_mac_lte_info->oob_ueid[n], - p_mac_lte_info->oob_rnti[n]); - - /* Update SR status for this UE */ - if (global_mac_lte_track_sr) { - TrackSRInfo(SR_Request, pinfo, mac_lte_tree, tvb, p_mac_lte_info, n, sr_ti); - } - } - - break; - - case ltemac_sr_failure: - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_rnti, - tvb, 0, 0, p_mac_lte_info->rnti); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_item(mac_lte_tree, hf_mac_lte_oob_sr_failure, - tvb, 0, 0, ENC_NA); - PROTO_ITEM_SET_GENERATED(ti); - - /* Info column */ - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "Scheduling Request FAILED for UE %u (C-RNTI=%u)", - p_mac_lte_info->ueid, - p_mac_lte_info->rnti); - - /* Add expert info (an error) */ - expert_add_info_format(pinfo, ti, PI_SEQUENCE, PI_ERROR, - "Scheduling Request failed for UE %u (RNTI %u)", - p_mac_lte_info->ueid, - p_mac_lte_info->rnti); - - /* Update SR status */ - if (global_mac_lte_track_sr) { - TrackSRInfo(SR_Failure, pinfo, mac_lte_tree, tvb, p_mac_lte_info, 0, ti); - } - - break; - } - - /* Our work here is done */ - return; - } - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_sysframe_number, - tvb, 0, 0, p_mac_lte_info->sysframeNumber); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_subframe_number, - tvb, 0, 0, p_mac_lte_info->subframeNumber); - PROTO_ITEM_SET_GENERATED(ti); - - if (p_mac_lte_info->subframeNumber > 9) { - /* N.B. if we set it to valid value, it won't trigger when we rescan - (at least with DCT2000 files where the context struct isn't re-read). */ - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Subframe number (%u) was out of range - valid range is 0-9", - p_mac_lte_info->subframeNumber); - } - - if (p_mac_lte_info->subframeNumberOfGrantPresent) { - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_grant_subframe_number, - tvb, 0, 0, p_mac_lte_info->subframeNumberOfGrant); - PROTO_ITEM_SET_GENERATED(ti); - } - - if (p_mac_lte_info->rntiType != NO_RNTI) { - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_rnti, - tvb, 0, 0, p_mac_lte_info->rnti); - PROTO_ITEM_SET_GENERATED(ti); - } - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_rnti_type, - tvb, 0, 0, p_mac_lte_info->rntiType); - PROTO_ITEM_SET_GENERATED(ti); - - /* Check that RNTI value is consistent with given RNTI type */ - switch (p_mac_lte_info->rntiType) { - case M_RNTI: - if (p_mac_lte_info->rnti != 0xFFFD) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "M-RNTI indicated, but value is %u (0x%x) (must be 0x%x)", - p_mac_lte_info->rnti, p_mac_lte_info->rnti, 0xFFFD); - return; - } - - break; - - case P_RNTI: - if (p_mac_lte_info->rnti != 0xFFFE) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "P-RNTI indicated, but value is %u (0x%x) (must be 0x%x)", - p_mac_lte_info->rnti, p_mac_lte_info->rnti, 0xFFFE); - return; - } - - break; - - case SI_RNTI: - if (p_mac_lte_info->rnti != 0xFFFF) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "SI-RNTI indicated, but value is %u (0x%x) (must be 0x%x)", - p_mac_lte_info->rnti, p_mac_lte_info->rnti, 0xFFFE); - return; - } - - break; - - case RA_RNTI: - if ((p_mac_lte_info->rnti < 0x0001) || (p_mac_lte_info->rnti > 0x003C)) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "RA_RNTI indicated, but given value %u (0x%x)is out of range", - p_mac_lte_info->rnti, p_mac_lte_info->rnti); - return; - } - - break; - - case C_RNTI: - case SPS_RNTI: - if ((p_mac_lte_info->rnti < 0x0001) || (p_mac_lte_info->rnti > 0xFFF3)) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "%s indicated, but given value %u (0x%x)is out of range", - val_to_str_const(p_mac_lte_info->rntiType, rnti_type_vals, "Unknown"), - p_mac_lte_info->rnti, p_mac_lte_info->rnti); - return; - } - - break; - - default: - break; - } - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_predefined_frame, - tvb, 0, 0, p_mac_lte_info->isPredefinedData); - - if (p_mac_lte_info->isPredefinedData) { - PROTO_ITEM_SET_GENERATED(ti); - } else { - PROTO_ITEM_SET_HIDDEN(ti); - } - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_length, - tvb, 0, 0, p_mac_lte_info->length); - PROTO_ITEM_SET_GENERATED(ti); - - /* Infer uplink grant size */ - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_ul_grant_size, - tvb, 0, 0, p_mac_lte_info->length); - PROTO_ITEM_SET_GENERATED(ti); - } - - /* Retx count goes in top-level tree to make it more visible */ - if (p_mac_lte_info->reTxCount) { - proto_item *retx_reason_ti; - retx_ti = proto_tree_add_uint(mac_lte_tree, hf_mac_lte_context_retx_count, - tvb, 0, 0, p_mac_lte_info->reTxCount); - PROTO_ITEM_SET_GENERATED(retx_ti); - - if (p_mac_lte_info->reTxCount >= global_mac_lte_retx_counter_trigger) { - expert_add_info_format(pinfo, retx_ti, PI_SEQUENCE, PI_WARN, - "UE %u: UL MAC frame ReTX no. %u", - p_mac_lte_info->ueid, p_mac_lte_info->reTxCount); - } - - retx_reason_ti = proto_tree_add_uint(mac_lte_tree, hf_mac_lte_context_retx_reason, - tvb, 0, 0, p_mac_lte_info->isPHICHNACK); - PROTO_ITEM_SET_GENERATED(retx_reason_ti); - } - - if (p_mac_lte_info->crcStatusValid) { - /* Set status */ - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_crc_status, - tvb, 0, 0, p_mac_lte_info->detailed_phy_info.dl_info.crc_status); - PROTO_ITEM_SET_GENERATED(ti); - - /* Report non-success */ - if (p_mac_lte_info->detailed_phy_info.dl_info.crc_status != crc_success) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "%s Frame has CRC error problem (%s)", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? "UL" : "DL", - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.crc_status, - crc_status_vals, - "Unknown")); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "%s: UEId=%u %s=%u ", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? "UL" : "DL", - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.crc_status, - crc_status_vals, - "Unknown"), - p_mac_lte_info->ueid, - val_to_str_const(p_mac_lte_info->rntiType, rnti_type_vals, - "Unknown RNTI type"), - p_mac_lte_info->rnti); - } - } - - /* May also have extra Physical layer attributes set for this frame */ - show_extra_phy_parameters(pinfo, tvb, mac_lte_tree, p_mac_lte_info); - - /* Set context-info parts of tap struct */ - tap_info->rnti = p_mac_lte_info->rnti; - tap_info->ueid = p_mac_lte_info->ueid; - tap_info->rntiType = p_mac_lte_info->rntiType; - tap_info->isPredefinedData = p_mac_lte_info->isPredefinedData; - tap_info->isPHYRetx = (p_mac_lte_info->reTxCount >= 1); - tap_info->crcStatusValid = p_mac_lte_info->crcStatusValid; - tap_info->crcStatus = p_mac_lte_info->detailed_phy_info.dl_info.crc_status; - tap_info->direction = p_mac_lte_info->direction; - - tap_info->time = pinfo->fd->abs_ts; - - /* Also set total number of bytes (won't be used for UL/DL-SCH) */ - tap_info->single_number_of_bytes = tvb_length_remaining(tvb, offset); - - /* If we know its predefined data, don't try to decode any further */ - if (p_mac_lte_info->isPredefinedData) { - proto_tree_add_item(mac_lte_tree, hf_mac_lte_predefined_pdu, tvb, offset, -1, ENC_NA); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "Predefined data (%u bytes%s)", - p_mac_lte_info->length, - (p_mac_lte_info->length > tvb_length_remaining(tvb, offset) ? - " - truncated" : - "")); - - /* Queue tap info */ - if (!pinfo->flags.in_error_pkt) { - tap_queue_packet(mac_lte_tap, pinfo, tap_info); - } - - return; - } - - /* IF CRC status failed, just do decode as raw bytes */ - if (!global_mac_lte_dissect_crc_failures && - (p_mac_lte_info->crcStatusValid && - (p_mac_lte_info->detailed_phy_info.dl_info.crc_status != crc_success))) { - - proto_tree_add_item(mac_lte_tree, hf_mac_lte_raw_pdu, tvb, offset, -1, ENC_NA); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, "Raw data (%u bytes)", tvb_length_remaining(tvb, offset)); - - /* Queue tap info. - TODO: unfortunately DL retx detection won't get done if we return here... */ - if (!pinfo->flags.in_error_pkt) { - tap_queue_packet(mac_lte_tap, pinfo, tap_info); - } - - return; - } - - /* Reset this counter */ - s_number_of_rlc_pdus_shown = 0; - - /* Dissect the MAC PDU itself. Format depends upon RNTI type. */ - switch (p_mac_lte_info->rntiType) { - - case P_RNTI: - /* PCH PDU */ - dissect_pch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info->direction); - break; - - case RA_RNTI: - /* RAR PDU */ - dissect_rar(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info, tap_info); - break; - - case C_RNTI: - case SPS_RNTI: - /* Can be UL-SCH or DL-SCH */ - dissect_ulsch_or_dlsch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, - p_mac_lte_info->direction, p_mac_lte_info, tap_info, - retx_ti, context_tree); - break; - - case SI_RNTI: - /* BCH over DL-SCH */ - dissect_bch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info); - break; - - case M_RNTI: - /* MCH PDU */ - dissect_mch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info); - break; - - case NO_RNTI: - /* Must be BCH over BCH... */ - dissect_bch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info); - break; - - - default: - break; - } - - /* Queue tap info */ - tap_queue_packet(mac_lte_tap, pinfo, tap_info); -} - - - - -/* Initializes the hash tables each time a new - * file is loaded or re-loaded in wireshark */ -static void mac_lte_init_protocol(void) -{ - /* Destroy any existing tables. */ - if (mac_lte_msg3_hash) { - g_hash_table_destroy(mac_lte_msg3_hash); - } - - if (mac_lte_cr_result_hash) { - g_hash_table_destroy(mac_lte_cr_result_hash); - } - - if (mac_lte_dl_harq_hash) { - g_hash_table_destroy(mac_lte_dl_harq_hash); - } - - if (mac_lte_dl_harq_result_hash) { - g_hash_table_destroy(mac_lte_dl_harq_result_hash); - } - - if (mac_lte_ul_harq_hash) { - g_hash_table_destroy(mac_lte_ul_harq_hash); - } - - if (mac_lte_ul_harq_result_hash) { - g_hash_table_destroy(mac_lte_ul_harq_result_hash); - } - - if (mac_lte_ue_sr_state) { - g_hash_table_destroy(mac_lte_ue_sr_state); - } - - if (mac_lte_sr_request_hash) { - g_hash_table_destroy(mac_lte_sr_request_hash); - } - - if (mac_lte_tti_info_result_hash) { - g_hash_table_destroy(mac_lte_tti_info_result_hash); - } - - /* Reset structs */ - memset(&UL_tti_info, 0, sizeof(UL_tti_info)); - UL_tti_info.subframe = 0xff; /* Invalid value */ - memset(&DL_tti_info, 0, sizeof(DL_tti_info)); - DL_tti_info.subframe = 0xff; /* Invalid value */ - - /* Now create them over */ - mac_lte_msg3_hash = g_hash_table_new(mac_lte_rnti_hash_func, mac_lte_rnti_hash_equal); - mac_lte_cr_result_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); - - mac_lte_dl_harq_hash = g_hash_table_new(mac_lte_rnti_hash_func, mac_lte_rnti_hash_equal); - mac_lte_dl_harq_result_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); - - mac_lte_ul_harq_hash = g_hash_table_new(mac_lte_rnti_hash_func, mac_lte_rnti_hash_equal); - mac_lte_ul_harq_result_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); - - mac_lte_ue_sr_state = g_hash_table_new(mac_lte_rnti_hash_func, mac_lte_rnti_hash_equal); - mac_lte_sr_request_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); - - mac_lte_tti_info_result_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); -} - - -static void* lcid_drb_mapping_copy_cb(void* dest, const void* orig, size_t len _U_) -{ - const lcid_drb_mapping_t *o = orig; - lcid_drb_mapping_t *d = dest; - - /* Copy all items over */ - d->lcid = o->lcid; - d->drbid = o->drbid; - d->channel_type = o->channel_type; - - return d; -} - - - -void proto_register_mac_lte(void) -{ - static hf_register_info hf[] = { - /**********************************/ - /* Items for decoding context */ - { - &hf_mac_lte_context, - { - "Context", - "mac-lte.context", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_radio_type, - { - "Radio Type", - "mac-lte.radio-type", FT_UINT8, BASE_DEC, VALS(radio_type_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_direction, - { - "Direction", - "mac-lte.direction", FT_UINT8, BASE_DEC, VALS(direction_vals), 0x0, - "Direction of message", HFILL - } - }, - { - &hf_mac_lte_context_rnti, - { - "RNTI", - "mac-lte.rnti", FT_UINT16, BASE_DEC, 0, 0x0, - "RNTI associated with message", HFILL - } - }, - { - &hf_mac_lte_context_rnti_type, - { - "RNTI Type", - "mac-lte.rnti-type", FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, - "Type of RNTI associated with message", HFILL - } - }, - { - &hf_mac_lte_context_ueid, - { - "UEId", - "mac-lte.ueid", FT_UINT16, BASE_DEC, 0, 0x0, - "User Equipment Identifier associated with message", HFILL - } - }, - { - &hf_mac_lte_context_sysframe_number, - { - "System Frame Number", - "mac-lte.sfn", FT_UINT16, BASE_DEC, 0, 0x0, - "System Frame Number associated with message", HFILL - } - }, - { - &hf_mac_lte_context_subframe_number, - { - "Subframe", - "mac-lte.subframe", FT_UINT16, BASE_DEC, 0, 0x0, - "Subframe number associated with message", HFILL - } - }, - { - &hf_mac_lte_context_grant_subframe_number, - { - "Grant Subframe", - "mac-lte.grant-subframe", FT_UINT16, BASE_DEC, 0, 0x0, - "Subframe when grant for this PDU was received", HFILL - } - }, - { - &hf_mac_lte_context_predefined_frame, - { - "Predefined frame", - "mac-lte.is-predefined-frame", FT_UINT8, BASE_DEC, VALS(predefined_frame_vals), 0x0, - "Predefined test frame (or real MAC PDU)", HFILL - } - }, - { - &hf_mac_lte_context_length, - { - "Length of frame", - "mac-lte.length", FT_UINT8, BASE_DEC, 0, 0x0, - "Original length of frame (including SDUs and padding)", HFILL - } - }, - { - &hf_mac_lte_context_ul_grant_size, - { - "Uplink grant size", - "mac-lte.ul-grant-size", FT_UINT8, BASE_DEC, 0, 0x0, - "Uplink grant size (in bytes)", HFILL - } - }, - { - &hf_mac_lte_context_bch_transport_channel, - { - "Transport channel", - "mac-lte.bch-transport-channel", FT_UINT8, BASE_DEC, VALS(bch_transport_channel_vals), 0x0, - "Transport channel BCH data was carried on", HFILL - } - }, - { - &hf_mac_lte_context_retx_count, - { - "ReTX count", - "mac-lte.retx-count", FT_UINT8, BASE_DEC, 0, 0x0, - "Number of times this PDU has been retransmitted", HFILL - } - }, - { - &hf_mac_lte_context_retx_reason, - { - "ReTX reason", - "mac-lte.retx-reason", FT_UINT8, BASE_DEC, VALS(ul_retx_grant_vals), 0x0, - "Type of UL ReTx grant", HFILL - } - }, - { - &hf_mac_lte_context_crc_status, - { - "CRC Status", - "mac-lte.crc-status", FT_UINT8, BASE_DEC, VALS(crc_status_vals), 0x0, - "CRC Status as reported by PHY", HFILL - } - }, - { - &hf_mac_lte_context_rapid, - { - "RAPID", - "mac-lte.preamble-sent.rapid", FT_UINT8, BASE_DEC, 0, 0x0, - "RAPID sent in RACH preamble", HFILL - } - }, - { - &hf_mac_lte_context_rach_attempt_number, - { - "RACH Attempt Number", - "mac-lte.preamble-sent.attempt", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - { - &hf_mac_lte_ues_ul_per_tti, - { - "UL UE in TTI", - "mac-lte.ul-tti-count", FT_UINT8, BASE_DEC, 0, 0x0, - "In this TTI, this is the nth UL grant", HFILL - } - }, - { - &hf_mac_lte_ues_dl_per_tti, - { - "DL UE in TTI", - "mac-lte.dl-tti-count", FT_UINT8, BASE_DEC, 0, 0x0, - "In this TTI, this is the nth DL PDU", HFILL - } - }, - - - /* Extra PHY context */ - { - &hf_mac_lte_context_phy_ul, - { - "UL PHY attributes", - "mac-lte.ul-phy", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_modulation_type, - { - "Modulation type", - "mac-lte.ul-phy.modulation-type", FT_UINT8, BASE_DEC, VALS(modulation_type_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_tbs_index, - { - "TBs Index", - "mac-lte.ul-phy.tbs-index", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_resource_block_length, - { - "Resource Block Length", - "mac-lte.ul-phy.resource-block-length", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_resource_block_start, - { - "Resource Block Start", - "mac-lte.ul-phy.resource-block-start", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_harq_id, - { - "HARQ Id", - "mac-lte.ul-phy.harq-id", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_ndi, - { - "NDI", - "mac-lte.ul-phy.ndi", FT_UINT8, BASE_DEC, 0, 0x0, - "UL New Data Indicator", HFILL - } - }, - - { - &hf_mac_lte_context_phy_dl, - { - "DL PHY attributes", - "mac-lte.dl-phy", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_dci_format, - { - "DCI format", - "mac-lte.dl-phy.dci-format", FT_UINT8, BASE_DEC, VALS(dci_format_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_resource_allocation_type, - { - "Resource Allocation Type", - "mac-lte.dl-phy.resource-allocation-type", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_aggregation_level, - { - "Aggregation Level", - "mac-lte.dl-phy.aggregation-level", FT_UINT8, BASE_DEC, VALS(aggregation_level_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_mcs_index, - { - "MCS Index", - "mac-lte.dl-phy.mcs-index", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_redundancy_version_index, - { - "RV Index", - "mac-lte.dl-phy.rv-index", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_retx, - { - "DL Retx", - "mac-lte.dl-phy.dl-retx", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_resource_block_length, - { - "RB Length", - "mac-lte.dl-phy.rb-length", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_crc_status, - { - "CRC Status", - "mac-lte.dl-phy.crc-status", FT_UINT8, BASE_DEC, VALS(crc_status_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_harq_id, - { - "HARQ Id", - "mac-lte.dl-phy.harq-id", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_ndi, - { - "NDI", - "mac-lte.dl-phy.ndi", FT_UINT8, BASE_DEC, 0, 0x0, - "New Data Indicator", HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_tb, - { - "TB", - "mac-lte.dl-phy.tb", FT_UINT8, BASE_DEC, 0, 0x0, - "Transport Block (antenna #)", HFILL - } - }, - - /* Out-of-band events */ - { - &hf_mac_lte_oob_send_preamble, - { - "PRACH", - "mac-lte.preamble-sent", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_oob_send_sr, - { - "Scheduling Request sent", - "mac-lte.sr-req", FT_NONE, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_number_of_srs, - { - "Number of SRs", - "mac-lte.sr-req.count", FT_UINT32, BASE_DEC, 0, 0x0, - "Number of UEs doing SR in this frame", HFILL - } - }, - { - &hf_mac_lte_oob_sr_failure, - { - "Scheduling Request failure", - "mac-lte.sr-failure", FT_NONE, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - - /*******************************************/ - /* MAC shared channel header fields */ - { - &hf_mac_lte_ulsch, - { - "UL-SCH", - "mac-lte.ulsch", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_ulsch_header, - { - "UL-SCH Header", - "mac-lte.ulsch.header", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dlsch_header, - { - "DL-SCH Header", - "mac-lte.dlsch.header", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dlsch, - { - "DL-SCH", - "mac-lte.dlsch", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sch_subheader, - { - "SCH sub-header", - "mac-lte.sch.subheader", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch, - { - "MCH", - "mac-lte.mch", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_header, - { - "MCH Header", - "mac-lte.mch.header", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_subheader, - { - "MCH sub-header", - "mac-lte.mch.subheader", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sch_reserved, - { - "SCH reserved bits", - "mac-lte.sch.reserved", FT_UINT8, BASE_HEX, NULL, 0xc0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sch_extended, - { - "Extension", - "mac-lte.sch.extended", FT_UINT8, BASE_HEX, 0, 0x20, - "Extension - i.e. further headers after this one", HFILL - } - }, - { - &hf_mac_lte_dlsch_lcid, - { - "LCID", - "mac-lte.dlsch.lcid", FT_UINT8, BASE_HEX, VALS(dlsch_lcid_vals), 0x1f, - "DL-SCH Logical Channel Identifier", HFILL - } - }, - { - &hf_mac_lte_ulsch_lcid, - { - "LCID", - "mac-lte.ulsch.lcid", FT_UINT8, BASE_HEX, VALS(ulsch_lcid_vals), 0x1f, - "UL-SCH Logical Channel Identifier", HFILL - } - }, - { - &hf_mac_lte_sch_format, - { - "Format", - "mac-lte.sch.format", FT_UINT8, BASE_HEX, VALS(format_vals), 0x80, - NULL, HFILL - } - }, - { - &hf_mac_lte_sch_length, - { - "Length", - "mac-lte.sch.length", FT_UINT16, BASE_DEC, 0, 0x0, - "Length of MAC SDU or MAC control element", HFILL - } - }, - { - &hf_mac_lte_mch_reserved, - { - "MCH reserved bits", - "mac-lte.mch.reserved", FT_UINT8, BASE_HEX, NULL, 0xc0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_extended, - { - "Extension", - "mac-lte.mch.extended", FT_UINT8, BASE_HEX, 0, 0x20, - "Extension - i.e. further headers after this one", HFILL - } - }, - { - &hf_mac_lte_mch_lcid, - { - "LCID", - "mac-lte.mch.lcid", FT_UINT8, BASE_HEX, VALS(mch_lcid_vals), 0x1f, - "MCH Logical Channel Identifier", HFILL - } - }, - { - &hf_mac_lte_mch_format, - { - "Format", - "mac-lte.mch.format", FT_UINT8, BASE_HEX, VALS(format_vals), 0x80, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_length, - { - "Length", - "mac-lte.mch.length", FT_UINT16, BASE_DEC, 0, 0x0, - "Length of MAC SDU or MAC control element", HFILL - } - }, - { - &hf_mac_lte_sch_header_only, - { - "MAC PDU Header only", - "mac-lte.sch.header-only", FT_UINT8, BASE_DEC, VALS(header_only_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_header_only, - { - "MAC PDU Header only", - "mac-lte.mch.header-only", FT_UINT8, BASE_DEC, VALS(header_only_vals), 0x0, - NULL, HFILL - } - }, - - /********************************/ - /* Data */ - { - &hf_mac_lte_sch_sdu, - { - "SDU", - "mac-lte.sch.sdu", FT_BYTES, BASE_NONE, 0, 0x0, - "Shared channel SDU", HFILL - } - }, - { - &hf_mac_lte_mch_sdu, - { - "SDU", - "mac-lte.mch.sdu", FT_BYTES, BASE_NONE, 0, 0x0, - "Multicast channel SDU", HFILL - } - }, - { - &hf_mac_lte_bch_pdu, - { - "BCH PDU", - "mac-lte.bch.pdu", FT_BYTES, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_pch_pdu, - { - "PCH PDU", - "mac-lte.pch.pdu", FT_BYTES, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_predefined_pdu, - { - "Predefined data", - "mac-lte.predefined-data", FT_BYTES, BASE_NONE, 0, 0x0, - "Predefined test data", HFILL - } - }, - { - &hf_mac_lte_raw_pdu, - { - "Raw data", - "mac-lte.raw-data", FT_BYTES, BASE_NONE, 0, 0x0, - "Raw bytes of PDU (e.g. if CRC error)", HFILL - } - }, - { - &hf_mac_lte_padding_data, - { - "Padding data", - "mac-lte.padding-data", FT_BYTES, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_padding_length, - { - "Padding length", - "mac-lte.padding-length", FT_INT32, BASE_DEC, 0, 0x0, - "Length of padding data not included at end of frame", HFILL - } - }, - - - - /*********************************/ - /* RAR fields */ - { - &hf_mac_lte_rar, - { - "RAR", - "mac-lte.rar", FT_NONE, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_headers, - { - "RAR Headers", - "mac-lte.rar.headers", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_header, - { - "RAR Header", - "mac-lte.rar.header", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_extension, - { - "Extension", - "mac-lte.rar.e", FT_UINT8, BASE_HEX, 0, 0x80, - "Extension - i.e. further RAR headers after this one", HFILL - } - }, - { - &hf_mac_lte_rar_t, - { - "Type", - "mac-lte.rar.t", FT_UINT8, BASE_HEX, VALS(rar_type_vals), 0x40, - "Type field indicating whether the payload is RAPID or BI", HFILL - } - }, - { - &hf_mac_lte_rar_bi, - { - "BI", - "mac-lte.rar.bi", FT_UINT8, BASE_HEX, VALS(rar_bi_vals), 0x0f, - "Backoff Indicator (ms)", HFILL - } - }, - { - &hf_mac_lte_rar_rapid, - { - "RAPID", - "mac-lte.rar.rapid", FT_UINT8, BASE_HEX_DEC, 0, 0x3f, - "Random Access Preamble IDentifier", HFILL - } - }, - { - &hf_mac_lte_rar_reserved, - { - "Reserved", - "mac-lte.rar.reserved", FT_UINT8, BASE_HEX, 0, 0x30, - "Reserved bits in RAR header - should be 0", HFILL - } - }, - - { - &hf_mac_lte_rar_body, - { - "RAR Body", - "mac-lte.rar.body", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_reserved2, - { - "Reserved", - "mac-lte.rar.reserved2", FT_UINT8, BASE_HEX, 0, 0x80, - "Reserved bit in RAR body - should be 0", HFILL - } - }, - { - &hf_mac_lte_rar_ta, - { - "Timing Advance", - "mac-lte.rar.ta", FT_UINT16, BASE_DEC, 0, 0x7ff0, - "Required adjustment to uplink transmission timing", HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant, - { - "UL Grant", - "mac-lte.rar.ul-grant", FT_UINT24, BASE_DEC, 0, 0x0fffff, - "Size of UL Grant", HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_hopping, - { - "Hopping Flag", - "mac-lte.rar.ul-grant.hopping", FT_UINT8, BASE_DEC, 0, 0x08, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_fsrba, - { - "Fixed sized resource block assignment", - "mac-lte.rar.ul-grant.fsrba", FT_UINT16, BASE_DEC, 0, 0x07fe, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_tmcs, - { - "Truncated Modulation and coding scheme", - "mac-lte.rar.ul-grant.tmcs", FT_UINT16, BASE_DEC, 0, 0x01e0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_tcsp, - { - "TPC command for scheduled PUSCH", - "mac-lte.rar.ul-grant.tcsp", FT_UINT8, BASE_DEC, 0, 0x01c, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_ul_delay, - { - "UL Delay", - "mac-lte.rar.ul-grant.ul-delay", FT_UINT8, BASE_DEC, 0, 0x02, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_cqi_request, - { - "CQI Request", - "mac-lte.rar.ul-grant.cqi-request", FT_UINT8, BASE_DEC, 0, 0x01, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_temporary_crnti, - { - "Temporary C-RNTI", - "mac-lte.rar.temporary-crnti", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - /**********************/ - /* Control PDU fields */ - { - &hf_mac_lte_control_bsr, - { - "BSR", - "mac-lte.control.bsr", FT_STRING, BASE_NONE, 0, 0x0, - "Buffer Status Report", HFILL - } - }, - { - &hf_mac_lte_control_bsr_lcg_id, - { - "Logical Channel Group ID", - "mac-lte.control.bsr.lcg-id", FT_UINT8, BASE_DEC, 0, 0xc0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_short_bsr_buffer_size, - { - "Buffer Size", - "mac-lte.control.bsr.buffer-size", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0x3f, - "Buffer Size available in all channels in group", HFILL - } - }, - { - &hf_mac_lte_control_long_bsr_buffer_size_0, - { - "Buffer Size 0", - "mac-lte.control.bsr.buffer-size-0", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0xfc, - "Buffer Size available in logical channel group 0", HFILL - } - }, - { - &hf_mac_lte_control_long_bsr_buffer_size_1, - { - "Buffer Size 1", - "mac-lte.control.bsr.buffer-size-1", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0x03f0, - "Buffer Size available in logical channel group 1", HFILL - } - }, - { - &hf_mac_lte_control_long_bsr_buffer_size_2, - { - "Buffer Size 2", - "mac-lte.control.bsr.buffer-size-2", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0x0fc0, - "Buffer Size available in logical channel group 2", HFILL - } - }, - { - &hf_mac_lte_control_long_bsr_buffer_size_3, - { - "Buffer Size 3", - "mac-lte.control.bsr.buffer-size-3", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0x3f, - "Buffer Size available in logical channel group 3", HFILL - } - }, - { - &hf_mac_lte_control_short_ext_bsr_buffer_size, - { - "Buffer Size", - "mac-lte.control.bsr.buffer-size", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0x3f, - "Buffer Size available in all channels in group", HFILL - } - }, - { - &hf_mac_lte_control_long_ext_bsr_buffer_size_0, - { - "Buffer Size 0", - "mac-lte.control.bsr.buffer-size-0", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0xfc, - "Buffer Size available in logical channel group 0", HFILL - } - }, - { - &hf_mac_lte_control_long_ext_bsr_buffer_size_1, - { - "Buffer Size 1", - "mac-lte.control.bsr.buffer-size-1", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0x03f0, - "Buffer Size available in logical channel group 1", HFILL - } - }, - { - &hf_mac_lte_control_long_ext_bsr_buffer_size_2, - { - "Buffer Size 2", - "mac-lte.control.bsr.buffer-size-2", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0x0fc0, - "Buffer Size available in logical channel group 2", HFILL - } - }, - { - &hf_mac_lte_control_long_ext_bsr_buffer_size_3, - { - "Buffer Size 3", - "mac-lte.control.bsr.buffer-size-3", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0x3f, - "Buffer Size available in logical channel group 3", HFILL - } - }, - { - &hf_mac_lte_control_crnti, - { - "C-RNTI", - "mac-lte.control.crnti", FT_UINT16, BASE_DEC, 0, 0x0, - "C-RNTI for the UE", HFILL - } - }, - { - &hf_mac_lte_control_timing_advance, - { - "Timing Advance", - "mac-lte.control.timing-advance", FT_UINT8, BASE_DEC, 0, 0x3f, - "Timing Advance (0-1282 - see 36.213, 4.2.3)", HFILL - } - }, - { - &hf_mac_lte_control_timing_advance_reserved, - { - "Reserved", - "mac-lte.control.timing-advance.reserved", FT_UINT8, BASE_HEX, 0, 0xc0, - "Reserved bits", HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution, - { - "UE Contention Resolution", - "mac-lte.control.ue-contention-resolution", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution_identity, - { - "UE Contention Resolution Identity", - "mac-lte.control.ue-contention-resolution.identity", FT_BYTES, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution_msg3, - { - "Msg3", - "mac-lte.control.ue-contention-resolution.msg3", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution_msg3_matched, - { - "UE Contention Resolution Matches Msg3", - "mac-lte.control.ue-contention-resolution.matches-msg3", FT_BOOLEAN, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution_time_since_msg3, - { - "Time since Msg3", - "mac-lte.control.ue-contention-resolution.time-since-msg3", FT_UINT32, BASE_DEC, 0, 0x0, - "Time in ms since corresponding Msg3", HFILL - } - }, - - { - &hf_mac_lte_control_power_headroom, - { - "Power Headroom", - "mac-lte.control.power-headroom", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_power_headroom_reserved, - { - "Reserved", - "mac-lte.control.power-headroom.reserved", FT_UINT8, BASE_DEC, 0, 0xc0, - "Reserved bits, should be 0", HFILL - } - }, - { - &hf_mac_lte_control_power_headroom_level, - { - "Power Headroom Level", - "mac-lte.control.power-headroom.level", FT_UINT8, BASE_DEC|BASE_EXT_STRING, - &power_headroom_vals_ext, 0x3f, "Power Headroom Level in dB", HFILL - } - }, - - { - &hf_mac_lte_control_ext_power_headroom, - { - "Extended Power Headroom", - "mac-lte.control.ext-power-headroom", FT_STRING, BASE_NONE, - 0, 0x0, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c7, - { - "SCell Index 7 Power Headroom", - "mac-lte.control.ext-power-headroom.c7", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x80, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c6, - { - "SCell Index 6 Power Headroom", - "mac-lte.control.ext-power-headroom.c6", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x40, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c5, - { - "SCell Index 5 Power Headroom", - "mac-lte.control.ext-power-headroom.c5", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x20, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c4, - { - "SCell Index 4 Power Headroom", - "mac-lte.control.ext-power-headroom.c4", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x10, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c3, - { - "SCell Index 3 Power Headroom", - "mac-lte.control.ext-power-headroom.c3", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x08, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c2, - { - "SCell Index 2 Power Headroom", - "mac-lte.control.ext-power-headroom.c2", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x04, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c1, - { - "SCell Index 1 Power Headroom", - "mac-lte.control.ext-power-headroom.c1", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x02, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_reserved, - { - "Reserved", - "mac-lte.control.ext-power-headroom.reserved", FT_UINT8, BASE_DEC, - 0, 0x01, "Reserved bit, should be 0", HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_power_backoff, - { - "Power Backoff", - "mac-lte.control.ext-power-headroom.power-backoff", FT_BOOLEAN, 8, - TFS(&mac_lte_power_backoff_vals), 0x80, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_value, - { - "Power Headroom Value", - "mac-lte.control.ext-power-headroom.power-headroom-value", FT_BOOLEAN, 8, - TFS(&mac_lte_ph_value_vals), 0x40, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_level, - { - "Power Headroom Level", - "mac-lte.control.ext-power-headroom.level", FT_UINT8, BASE_DEC|BASE_EXT_STRING, - &power_headroom_vals_ext, 0x3f, "Power Headroom Level in dB", HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_reserved2, - { - "Reserved", - "mac-lte.control.ext-power-headroom.reserved2", FT_UINT8, BASE_DEC, - 0, 0xc0, "Reserved bits, should be 0", HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_pcmaxc, - { - "Configured UE Transmit Power", - "mac-lte.control.ext-power-headroom.pcmaxc", FT_UINT8, BASE_DEC|BASE_EXT_STRING, - &pcmaxc_vals_ext, 0x3f, "Pcmax,c in dBm", HFILL - } - }, - - { - &hf_mac_lte_control_activation_deactivation, - { - "Activation/Deactivation", - "mac-lte.control.activation-deactivation", FT_STRING, BASE_NONE, - 0, 0x0, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c7, - { - "SCell Index 7 Status", - "mac-lte.control.activation-deactivation.c7", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x80, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c6, - { - "SCell Index 6 Status", - "mac-lte.control.activation-deactivation.c6", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x40, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c5, - { - "SCell Index 5 Status", - "mac-lte.control.activation-deactivation.c5", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x20, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c4, - { - "SCell Index 4 Status", - "mac-lte.control.activation-deactivation.c4", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x10, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c3, - { - "SCell Index 3 Status", - "mac-lte.control.activation-deactivation.c3", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x08, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c2, - { - "SCell Index 2 Status", - "mac-lte.control.activation-deactivation.c2", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x04, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c1, - { - "SCell Index 1 Status", - "mac-lte.control.activation-deactivation.c1", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x02, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_reserved, - { - "Reserved", - "mac-lte.control.activation-deactivation.reserved", FT_UINT8, BASE_DEC, - 0, 0x01, "Reserved bit, should be 0", HFILL - } - }, - - { - &hf_mac_lte_control_mch_scheduling_info, - { - "MCH Scheduling Information", - "mac-lte.control.mch_scheduling_info", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_mch_scheduling_info_lcid, - { - "LCID", - "mac-lte.control.mch_scheduling_info.lcid", FT_UINT8, BASE_HEX, VALS(mch_lcid_vals), 0xf8, - "Logical Channel ID of the MTCH", HFILL - } - }, - { - &hf_mac_lte_control_mch_scheduling_info_stop_mtch, - { - "Stop MTCH", - "mac-lte.control.mch_scheduling_info.stop_mtch", FT_UINT16, BASE_DEC, 0, 0x07ff, - "Ordinal number of the subframe where the corresponding MTCH stops", HFILL - } - }, - - /* Generated fields */ - { - &hf_mac_lte_dl_harq_resend_original_frame, - { - "Frame with previous tx", - "mac-lte.dlsch.retx.original-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dl_harq_resend_time_since_previous_frame, - { - "Time since previous tx (ms)", - "mac-lte.dlsch.retx.time-since-previous", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dl_harq_resend_next_frame, - { - "Frame with next tx", - "mac-lte.dlsch.retx.next-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dl_harq_resend_time_until_next_frame, - { - "Time until next tx (ms)", - "mac-lte.dlsch.retx.time-until-next", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - { - &hf_mac_lte_ul_harq_resend_original_frame, - { - "Frame with previous tx", - "mac-lte.ulsch.retx.original-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_ul_harq_resend_time_since_previous_frame, - { - "Time since previous tx (ms)", - "mac-lte.ulsch.retx.time-since-previous", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_ul_harq_resend_next_frame, - { - "Frame with next tx", - "mac-lte.ulsch.retx.next-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_ul_harq_resend_time_until_next_frame, - { - "Time until next tx (ms)", - "mac-lte.ulsch.retx.time-until-next", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - { - &hf_mac_lte_grant_answering_sr, - { - "First Grant Following SR from", - "mac-lte.ulsch.grant-answering-sr", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_failure_answering_sr, - { - "SR which failed", - "mac-lte.ulsch.failure-answering-sr", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_leading_to_failure, - { - "This SR fails", - "mac-lte.ulsch.failure-answering-sr-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_leading_to_grant, - { - "This SR results in a grant here", - "mac-lte.ulsch.grant-answering-sr-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_invalid_event, - { - "Invalid event", - "mac-lte.ulsch.sr-invalid-event", FT_NONE, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_time_since_request, - { - "Time since SR (ms)", - "mac-lte.ulsch.time-since-sr", FT_UINT32, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_time_until_answer, - { - "Time until answer (ms)", - "mac-lte.ulsch.time-until-sr-answer", FT_UINT32, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - }; - - static gint *ett[] = { - &ett_mac_lte, - &ett_mac_lte_context, - &ett_mac_lte_phy_context, - &ett_mac_lte_rar_headers, - &ett_mac_lte_rar_header, - &ett_mac_lte_rar_body, - &ett_mac_lte_rar_ul_grant, - &ett_mac_lte_ulsch_header, - &ett_mac_lte_dlsch_header, - &ett_mac_lte_mch_header, - &ett_mac_lte_sch_subheader, - &ett_mac_lte_mch_subheader, - &ett_mac_lte_bch, - &ett_mac_lte_bsr, - &ett_mac_lte_pch, - &ett_mac_lte_activation_deactivation, - &ett_mac_lte_contention_resolution, - &ett_mac_lte_power_headroom, - &ett_mac_lte_extended_power_headroom, - &ett_mac_lte_extended_power_headroom_cell, - &ett_mac_lte_mch_scheduling_info, - &ett_mac_lte_oob - }; - - static enum_val_t show_info_col_vals[] = { - {"show-phy", "PHY Info", ShowPHYLayer}, - {"show-mac", "MAC Info", ShowMACLayer}, - {"show-rlc", "RLC Info", ShowRLCLayer}, - {NULL, NULL, -1} - }; - - static enum_val_t lcid_drb_source_vals[] = { - {"from-static-stable", "From static table", FromStaticTable}, - {"from-configuration-protocol", "From configuration protocol", FromConfigurationProtocol}, - {NULL, NULL, -1} - }; - - - module_t *mac_lte_module; - - static uat_field_t lcid_drb_mapping_flds[] = { - UAT_FLD_VS(lcid_drb_mappings, lcid, "lcid", drb_lcid_vals, "The MAC LCID"), - UAT_FLD_DEC(lcid_drb_mappings, drbid,"drb id (1-32)", "Identifier of logical data channel"), - UAT_FLD_VS(lcid_drb_mappings, channel_type, "RLC Channel Type", rlc_channel_type_vals, "The MAC LCID"), - UAT_END_FIELDS - }; - - /* Register protocol. */ - proto_mac_lte = proto_register_protocol("MAC-LTE", "MAC-LTE", "mac-lte"); - proto_register_field_array(proto_mac_lte, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - - /* Allow other dissectors to find this one by name. */ - register_dissector("mac-lte", dissect_mac_lte, proto_mac_lte); - - /* Register the tap name */ - mac_lte_tap = register_tap("mac-lte"); - - /* Preferences */ - mac_lte_module = prefs_register_protocol(proto_mac_lte, NULL); - - /* Obsolete preferences */ - prefs_register_obsolete_preference(mac_lte_module, "single_rar"); - prefs_register_obsolete_preference(mac_lte_module, "check_reserved_bits"); - prefs_register_obsolete_preference(mac_lte_module, "decode_rar_ul_grant"); - prefs_register_obsolete_preference(mac_lte_module, "show_rlc_info_column"); - prefs_register_obsolete_preference(mac_lte_module, "attempt_to_detect_dl_harq_resend"); - prefs_register_obsolete_preference(mac_lte_module, "attempt_to_track_ul_harq_resend"); - - prefs_register_uint_preference(mac_lte_module, "retx_count_warn", - "Number of Re-Transmits before expert warning triggered", - "Number of Re-Transmits before expert warning triggered", - 10, &global_mac_lte_retx_counter_trigger); - - prefs_register_bool_preference(mac_lte_module, "attempt_rrc_decode", - "Attempt to decode BCH, PCH and CCCH data using LTE RRC dissector", - "Attempt to decode BCH, PCH and CCCH data using LTE RRC dissector", - &global_mac_lte_attempt_rrc_decode); - - prefs_register_bool_preference(mac_lte_module, "attempt_to_dissect_crc_failures", - "Dissect frames that have failed CRC check", - "Attempt to dissect frames that have failed CRC check", - &global_mac_lte_dissect_crc_failures); - - prefs_register_bool_preference(mac_lte_module, "heuristic_mac_lte_over_udp", - "Try Heuristic LTE-MAC over UDP framing", - "When enabled, use heuristic dissector to find MAC-LTE frames sent with " - "UDP framing", - &global_mac_lte_heur); - - prefs_register_bool_preference(mac_lte_module, "attempt_to_dissect_srb_sdus", - "Attempt to dissect LCID 1&2 as srb1&2", - "Will call LTE RLC dissector with standard settings as per RRC spec", - &global_mac_lte_attempt_srb_decode); - - prefs_register_enum_preference(mac_lte_module, "lcid_to_drb_mapping_source", - "Source of LCID -> drb channel settings", - "Set whether LCID -> drb Table is taken from static table (below) or from " - "info learned from control protocol (e.g. RRC)", - &global_mac_lte_lcid_drb_source, lcid_drb_source_vals, FALSE); - - lcid_drb_mappings_uat = uat_new("Static LCID -> drb Table", - sizeof(lcid_drb_mapping_t), - "drb_logchans", - TRUE, - (void*) &lcid_drb_mappings, - &num_lcid_drb_mappings, - UAT_CAT_FFMT, - "", /* TODO: is this ref to help manual? */ - lcid_drb_mapping_copy_cb, - NULL, - NULL, - NULL, - lcid_drb_mapping_flds ); - - prefs_register_uat_preference(mac_lte_module, - "drb_table", - "LCID -> DRB Mappings Table", - "A table that maps from configurable lcids -> RLC logical channels", - lcid_drb_mappings_uat); - - prefs_register_uint_preference(mac_lte_module, "bsr_warn_threshold", - "BSR size when warning should be issued (0 - 63)", - "If any BSR report is >= this number, an expert warning will be added", - 10, &global_mac_lte_bsr_warn_threshold); - - prefs_register_bool_preference(mac_lte_module, "track_sr", - "Track status of SRs within UEs", - "Track status of SRs, providing links between requests, failure indications and grants", - &global_mac_lte_track_sr); - - prefs_register_enum_preference(mac_lte_module, "layer_to_show", - "Which layer info to show in Info column", - "Can show PHY, MAC or RLC layer info in Info column", - &global_mac_lte_layer_to_show, show_info_col_vals, FALSE); - - register_init_routine(&mac_lte_init_protocol); -} - - -/* Set LCID -> RLC channel mappings from signalling protocol (i.e. RRC or similar). - TODO: not using UEID yet - assume all UEs configured identically... */ -void set_mac_lte_channel_mapping(guint16 ueid _U_, guint8 lcid, - guint8 srbid, guint8 drbid, - guint8 rlcMode, guint8 um_sn_length, - guint8 ul_priority) -{ - /* Don't bother setting srb details - we just assume AM */ - if (srbid != 0) { - return; - } - - /* Ignore if LCID is out of range */ - if ((lcid < 3) || (lcid > 10)) { - return; - } - - /* Set array entry */ - dynamic_lcid_drb_mapping[lcid].valid = TRUE; - dynamic_lcid_drb_mapping[lcid].drbid = drbid; - dynamic_lcid_drb_mapping[lcid].ul_priority = ul_priority; - - switch (rlcMode) { - case RLC_AM_MODE: - dynamic_lcid_drb_mapping[lcid].channel_type = rlcAM; - break; - - case RLC_UM_MODE: - if (um_sn_length == 5) { - dynamic_lcid_drb_mapping[lcid].channel_type = rlcUM5; - } else { - dynamic_lcid_drb_mapping[lcid].channel_type = rlcUM10; - } - - break; - - default: - break; - } -} - -/* Return the configured UL priority for the channel */ -static guint8 get_mac_lte_channel_priority(guint16 ueid _U_, guint8 lcid, - guint8 direction) -{ - /* Priority only affects UL */ - if (direction == DIRECTION_DOWNLINK) { - return 0; - } - - /* Won't report value if channel not configured */ - if (!dynamic_lcid_drb_mapping[lcid].valid) { - return 0; - } else { - return dynamic_lcid_drb_mapping[lcid].ul_priority; - } -} - -/* Function to be called from outside this module (e.g. in a plugin) to get per-packet data */ -mac_lte_info *get_mac_lte_proto_data(packet_info *pinfo) -{ - return p_get_proto_data(pinfo->fd, proto_mac_lte); -} - -/* Function to be called from outside this module (e.g. in a plugin) to set per-packet data */ -void set_mac_lte_proto_data(packet_info *pinfo, mac_lte_info *p_mac_lte_info) -{ - p_add_proto_data(pinfo->fd, proto_mac_lte, p_mac_lte_info); -} - -void proto_reg_handoff_mac_lte(void) -{ - static dissector_handle_t mac_lte_handle; - - if (!mac_lte_handle) { - mac_lte_handle = find_dissector("mac-lte"); - - /* Add as a heuristic UDP dissector */ - heur_dissector_add("udp", dissect_mac_lte_heur, proto_mac_lte); - } -} - diff --git a/openair2/UTIL/OPT/packet-mac-lte.h b/openair2/UTIL/OPT/packet-mac-lte.h index d9c3105200..84c6254d9f 100644 --- a/openair2/UTIL/OPT/packet-mac-lte.h +++ b/openair2/UTIL/OPT/packet-mac-lte.h @@ -7,20 +7,6 @@ * By Gerald Combs * Copyright 1998 Gerald Combs * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * * This header file may also be distributed under * the terms of the BSD Licence as follows: * diff --git a/openair2/UTIL/OPT/packet-rlc-lte.h b/openair2/UTIL/OPT/packet-rlc-lte.h deleted file mode 100755 index d31d015662..0000000000 --- a/openair2/UTIL/OPT/packet-rlc-lte.h +++ /dev/null @@ -1,150 +0,0 @@ -/* packet-rlc-lte.h - * - * Martin Mathieson - * $Id$ - * - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 1998 Gerald Combs - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/* rlcMode */ -#define RLC_TM_MODE 1 -#define RLC_UM_MODE 2 -#define RLC_AM_MODE 4 -#define RLC_PREDEF 8 - -/* direction */ -#define DIRECTION_UPLINK 0 -#define DIRECTION_DOWNLINK 1 - -/* priority ? */ - -/* channelType */ -#define CHANNEL_TYPE_CCCH 1 -#define CHANNEL_TYPE_BCCH_BCH 2 -#define CHANNEL_TYPE_PCCH 3 -#define CHANNEL_TYPE_SRB 4 -#define CHANNEL_TYPE_DRB 5 -#define CHANNEL_TYPE_BCCH_DL_SCH 6 - -/* UMSequenceNumberLength */ -#define UM_SN_LENGTH_5_BITS 5 -#define UM_SN_LENGTH_10_BITS 10 - -/* Info attached to each LTE RLC frame */ -typedef struct rlc_lte_info { - guint8 rlcMode; - guint8 direction; - guint8 priority; - guint16 ueid; - guint16 channelType; - guint16 channelId; - guint16 pduLength; - guint8 UMSequenceNumberLength; -} rlc_lte_info; - - -typedef struct rlc_lte_tap_info { - /* Info from context */ - guint8 rlcMode; - guint8 direction; - guint8 priority; - guint16 ueid; - guint16 channelType; - guint16 channelId; - guint16 pduLength; - guint8 UMSequenceNumberLength; - - nstime_t time; - guint8 loggedInMACFrame; - guint16 sequenceNumber; - guint8 isResegmented; - guint8 isControlPDU; - guint16 ACKNo; -#define MAX_NACKs 128 - guint16 noOfNACKs; - guint16 NACKs[MAX_NACKs]; - - guint16 missingSNs; -} rlc_lte_tap_info; - - -/* Configure number of PDCP SN bits to use for DRB channels. */ -void set_rlc_lte_drb_pdcp_seqnum_length(guint16 ueid, guint8 drbid, guint8 userplane_seqnum_length); - - -/*****************************************************************/ -/* UDP framing format */ -/* ----------------------- */ -/* Several people have asked about dissecting RLC by framing */ -/* PDUs over IP. A suggested format over UDP has been defined */ -/* and implemented by this dissector, using the definitions */ -/* below. A link to an example program showing you how to encode */ -/* these headers and send LTE RLC PDUs on a UDP socket is */ -/* provided at http://wiki.wireshark.org/RLC-LTE */ -/* */ -/* A heuristic dissecter (enabled by a preference) will */ -/* recognise a signature at the beginning of these frames. */ -/* Until someone is using this format, suggestions for changes */ -/* are welcome. */ -/*****************************************************************/ - - -/* Signature. Rather than try to define a port for this, or make the - * port number a preference, frames will start with this string (with no - * terminating NULL */ -#define RLC_LTE_START_STRING "rlc-lte" - -/* Fixed field. This is followed by the following 1 mandatory field: - * - rlcMode (1 byte) - * (where the allowed values are defined above */ - -/* Conditional field. This field is mandatory in case of RLC Unacknowledged mode. - * The format is to have the tag, followed by the value (there is no length field, - * its implicit from the tag). The allowed values are defined above. */ - -#define RLC_LTE_UM_SN_LENGTH_TAG 0x02 -/* 1 byte */ - -/* Optional fields. Attaching this info to frames will allow you - * to show you display/filter/plot/add-custom-columns on these fields, so should - * be added if available. - * The format is to have the tag, followed by the value (there is no length field, - * its implicit from the tag) */ - -#define RLC_LTE_DIRECTION_TAG 0x03 -/* 1 byte */ - -#define RLC_LTE_PRIORITY_TAG 0x04 -/* 1 byte */ - -#define RLC_LTE_UEID_TAG 0x05 -/* 2 bytes, network order */ - -#define RLC_LTE_CHANNEL_TYPE_TAG 0x06 -/* 2 bytes, network order */ - -#define RLC_LTE_CHANNEL_ID_TAG 0x07 -/* 2 bytes, network order */ - - -/* RLC PDU. Following this tag comes the actual RLC PDU (there is no length, the PDU - * continues until the end of the frame) */ -#define RLC_LTE_PAYLOAD_TAG 0x01 - - diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c index eef98ae729..8f02c43456 100644 --- a/openair2/UTIL/OPT/probe.c +++ b/openair2/UTIL/OPT/probe.c @@ -29,36 +29,6 @@ * SUCH DAMAGE */ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - - OpenAirInterface is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file probe.c * \brief * \author navid nikaein diff --git a/openair2/UTIL/OPT/socket_sender.c b/openair2/UTIL/OPT/socket_sender.c deleted file mode 100644 index f4f8a2eaae..0000000000 --- a/openair2/UTIL/OPT/socket_sender.c +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - diff --git a/openair3/NAS/TEST/MSC/mscgen b/openair3/NAS/TEST/MSC/mscgen deleted file mode 100755 index 7a146811c77e7c0256a4bea0078cae6f1cc802d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197742 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
-** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
-** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
-** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
-** 
)^ -** -** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] -** macro. ^The sqlite3_libversion() function returns a pointer to the -** to the sqlite3_version[] string constant. The sqlite3_libversion() -** function is provided for use in DLLs since DLL users usually do not have -** direct access to string constants within the DLL. ^The -** sqlite3_libversion_number() function returns an integer equal to -** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns -** a pointer to a string constant whose value is the same as the -** [SQLITE_SOURCE_ID] C preprocessor macro. -** -** See also: [sqlite_version()] and [sqlite_source_id()]. -*/ -SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; -SQLITE_API const char *sqlite3_libversion(void); -SQLITE_API const char *sqlite3_sourceid(void); -SQLITE_API int sqlite3_libversion_number(void); - -/* -** CAPI3REF: Run-Time Library Compilation Options Diagnostics -** -** ^The sqlite3_compileoption_used() function returns 0 or 1 -** indicating whether the specified option was defined at -** compile time. ^The SQLITE_ prefix may be omitted from the -** option name passed to sqlite3_compileoption_used(). -** -** ^The sqlite3_compileoption_get() function allows iterating -** over the list of options that were defined at compile time by -** returning the N-th compile time option string. ^If N is out of range, -** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ -** prefix is omitted from any strings returned by -** sqlite3_compileoption_get(). -** -** ^Support for the diagnostic functions sqlite3_compileoption_used() -** and sqlite3_compileoption_get() may be omitted by specifying the -** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. -** -** See also: SQL functions [sqlite_compileoption_used()] and -** [sqlite_compileoption_get()] and the [compile_options pragma]. -*/ -#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS -SQLITE_API int sqlite3_compileoption_used(const char *zOptName); -SQLITE_API const char *sqlite3_compileoption_get(int N); -#endif - -/* -** CAPI3REF: Test To See If The Library Is Threadsafe -** -** ^The sqlite3_threadsafe() function returns zero if and only if -** SQLite was compiled mutexing code omitted due to the -** [SQLITE_THREADSAFE] compile-time option being set to 0. -** -** SQLite can be compiled with or without mutexes. When -** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes -** are enabled and SQLite is threadsafe. When the -** [SQLITE_THREADSAFE] macro is 0, -** the mutexes are omitted. Without the mutexes, it is not safe -** to use SQLite concurrently from more than one thread. -** -** Enabling mutexes incurs a measurable performance penalty. -** So if speed is of utmost importance, it makes sense to disable -** the mutexes. But for maximum safety, mutexes should be enabled. -** ^The default behavior is for mutexes to be enabled. -** -** This interface can be used by an application to make sure that the -** version of SQLite that it is linking against was compiled with -** the desired setting of the [SQLITE_THREADSAFE] macro. -** -** This interface only reports on the compile-time mutex setting -** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with -** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but -** can be fully or partially disabled using a call to [sqlite3_config()] -** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], -** or [SQLITE_CONFIG_MUTEX]. ^(The return value of the -** sqlite3_threadsafe() function shows only the compile-time setting of -** thread safety, not any run-time changes to that setting made by -** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() -** is unchanged by calls to sqlite3_config().)^ -** -** See the [threading mode] documentation for additional information. -*/ -SQLITE_API int sqlite3_threadsafe(void); - -/* -** CAPI3REF: Database Connection Handle -** KEYWORDS: {database connection} {database connections} -** -** Each open SQLite database is represented by a pointer to an instance of -** the opaque structure named "sqlite3". It is useful to think of an sqlite3 -** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and -** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] -** is its destructor. There are many other interfaces (such as -** [sqlite3_prepare_v2()], [sqlite3_create_function()], and -** [sqlite3_busy_timeout()] to name but three) that are methods on an -** sqlite3 object. -*/ -typedef struct sqlite3 sqlite3; - -/* -** CAPI3REF: 64-Bit Integer Types -** KEYWORDS: sqlite_int64 sqlite_uint64 -** -** Because there is no cross-platform way to specify 64-bit integer types -** SQLite includes typedefs for 64-bit signed and unsigned integers. -** -** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. -** The sqlite_int64 and sqlite_uint64 types are supported for backwards -** compatibility only. -** -** ^The sqlite3_int64 and sqlite_int64 types can store integer values -** between -9223372036854775808 and +9223372036854775807 inclusive. ^The -** sqlite3_uint64 and sqlite_uint64 types can store integer values -** between 0 and +18446744073709551615 inclusive. -*/ -#ifdef SQLITE_INT64_TYPE -typedef SQLITE_INT64_TYPE sqlite_int64; -typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; -#elif defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 sqlite_int64; -typedef unsigned __int64 sqlite_uint64; -#else -typedef long long int sqlite_int64; -typedef unsigned long long int sqlite_uint64; -#endif -typedef sqlite_int64 sqlite3_int64; -typedef sqlite_uint64 sqlite3_uint64; - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite3_int64 -#endif - -/* -** CAPI3REF: Closing A Database Connection -** -** ^The sqlite3_close() routine is the destructor for the [sqlite3] object. -** ^Calls to sqlite3_close() return SQLITE_OK if the [sqlite3] object is -** successfully destroyed and all associated resources are deallocated. -** -** Applications must [sqlite3_finalize | finalize] all [prepared statements] -** and [sqlite3_blob_close | close] all [BLOB handles] associated with -** the [sqlite3] object prior to attempting to close the object. ^If -** sqlite3_close() is called on a [database connection] that still has -** outstanding [prepared statements] or [BLOB handles], then it returns -** SQLITE_BUSY. -** -** ^If [sqlite3_close()] is invoked while a transaction is open, -** the transaction is automatically rolled back. -** -** The C parameter to [sqlite3_close(C)] must be either a NULL -** pointer or an [sqlite3] object pointer obtained -** from [sqlite3_open()], [sqlite3_open16()], or -** [sqlite3_open_v2()], and not previously closed. -** ^Calling sqlite3_close() with a NULL pointer argument is a -** harmless no-op. -*/ -SQLITE_API int sqlite3_close(sqlite3 *); - -/* -** The type for a callback function. -** This is legacy and deprecated. It is included for historical -** compatibility and is not documented. -*/ -typedef int (*sqlite3_callback)(void*,int,char**, char**); - -/* -** CAPI3REF: One-Step Query Execution Interface -** -** The sqlite3_exec() interface is a convenience wrapper around -** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], -** that allows an application to run multiple statements of SQL -** without having to use a lot of C code. -** -** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, -** semicolon-separate SQL statements passed into its 2nd argument, -** in the context of the [database connection] passed in as its 1st -** argument. ^If the callback function of the 3rd argument to -** sqlite3_exec() is not NULL, then it is invoked for each result row -** coming out of the evaluated SQL statements. ^The 4th argument to -** to sqlite3_exec() is relayed through to the 1st argument of each -** callback invocation. ^If the callback pointer to sqlite3_exec() -** is NULL, then no callback is ever invoked and result rows are -** ignored. -** -** ^If an error occurs while evaluating the SQL statements passed into -** sqlite3_exec(), then execution of the current statement stops and -** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() -** is not NULL then any error message is written into memory obtained -** from [sqlite3_malloc()] and passed back through the 5th parameter. -** To avoid memory leaks, the application should invoke [sqlite3_free()] -** on error message strings returned through the 5th parameter of -** of sqlite3_exec() after the error message string is no longer needed. -** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors -** occur, then sqlite3_exec() sets the pointer in its 5th parameter to -** NULL before returning. -** -** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() -** routine returns SQLITE_ABORT without invoking the callback again and -** without running any subsequent SQL statements. -** -** ^The 2nd argument to the sqlite3_exec() callback function is the -** number of columns in the result. ^The 3rd argument to the sqlite3_exec() -** callback is an array of pointers to strings obtained as if from -** [sqlite3_column_text()], one for each column. ^If an element of a -** result row is NULL then the corresponding string pointer for the -** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the -** sqlite3_exec() callback is an array of pointers to strings where each -** entry represents the name of corresponding result column as obtained -** from [sqlite3_column_name()]. -** -** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer -** to an empty string, or a pointer that contains only whitespace and/or -** SQL comments, then no SQL statements are evaluated and the database -** is not changed. -** -** Restrictions: -** -**
    -**
  • The application must insure that the 1st parameter to sqlite3_exec() -** is a valid and open [database connection]. -**
  • The application must not close [database connection] specified by -** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. -**
  • The application must not modify the SQL statement text passed into -** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. -**
-*/ -SQLITE_API int sqlite3_exec( - sqlite3*, /* An open database */ - const char *sql, /* SQL to be evaluated */ - int (*callback)(void*,int,char**,char**), /* Callback function */ - void *, /* 1st argument to callback */ - char **errmsg /* Error msg written here */ -); - -/* -** CAPI3REF: Result Codes -** KEYWORDS: SQLITE_OK {error code} {error codes} -** KEYWORDS: {result code} {result codes} -** -** Many SQLite functions return an integer result code from the set shown -** here in order to indicates success or failure. -** -** New error codes may be added in future versions of SQLite. -** -** See also: [SQLITE_IOERR_READ | extended result codes] -*/ -#define SQLITE_OK 0 /* Successful result */ -/* beginning-of-error-codes */ -#define SQLITE_ERROR 1 /* SQL error or missing database */ -#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ -#define SQLITE_PERM 3 /* Access permission denied */ -#define SQLITE_ABORT 4 /* Callback routine requested an abort */ -#define SQLITE_BUSY 5 /* The database file is locked */ -#define SQLITE_LOCKED 6 /* A table in the database is locked */ -#define SQLITE_NOMEM 7 /* A malloc() failed */ -#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ -#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ -#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ -#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ -#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ -#define SQLITE_FULL 13 /* Insertion failed because database is full */ -#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ -#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ -#define SQLITE_EMPTY 16 /* Database is empty */ -#define SQLITE_SCHEMA 17 /* The database schema changed */ -#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ -#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ -#define SQLITE_MISMATCH 20 /* Data type mismatch */ -#define SQLITE_MISUSE 21 /* Library used incorrectly */ -#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ -#define SQLITE_AUTH 23 /* Authorization denied */ -#define SQLITE_FORMAT 24 /* Auxiliary database format error */ -#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ -#define SQLITE_NOTADB 26 /* File opened that is not a database file */ -#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ -#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ -/* end-of-error-codes */ - -/* -** CAPI3REF: Extended Result Codes -** KEYWORDS: {extended error code} {extended error codes} -** KEYWORDS: {extended result code} {extended result codes} -** -** In its default configuration, SQLite API routines return one of 26 integer -** [SQLITE_OK | result codes]. However, experience has shown that many of -** these result codes are too coarse-grained. They do not provide as -** much information about problems as programmers might like. In an effort to -** address this, newer versions of SQLite (version 3.3.8 and later) include -** support for additional result codes that provide more detailed information -** about errors. The extended result codes are enabled or disabled -** on a per database connection basis using the -** [sqlite3_extended_result_codes()] API. -** -** Some of the available extended result codes are listed here. -** One may expect the number of extended result codes will be expand -** over time. Software that uses extended result codes should expect -** to see new result codes in future releases of SQLite. -** -** The SQLITE_OK result code will never be extended. It will always -** be exactly zero. -*/ -#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) -#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) -#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) -#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) -#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) -#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) -#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) -#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) -#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) -#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) -#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) -#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) -#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) -#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) -#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) -#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) -#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) -#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) -#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) -#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) -#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) -#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) -#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) - -/* -** CAPI3REF: Flags For File Open Operations -** -** These bit values are intended for use in the -** 3rd parameter to the [sqlite3_open_v2()] interface and -** in the 4th parameter to the xOpen method of the -** [sqlite3_vfs] object. -*/ -#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ -#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ -#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ -#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ -#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ -#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ -#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ -#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ -#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ -#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ -#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ - -/* -** CAPI3REF: Device Characteristics -** -** The xDeviceCharacteristics method of the [sqlite3_io_methods] -** object returns an integer which is a vector of the these -** bit values expressing I/O characteristics of the mass storage -** device that holds the file that the [sqlite3_io_methods] -** refers to. -** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -*/ -#define SQLITE_IOCAP_ATOMIC 0x00000001 -#define SQLITE_IOCAP_ATOMIC512 0x00000002 -#define SQLITE_IOCAP_ATOMIC1K 0x00000004 -#define SQLITE_IOCAP_ATOMIC2K 0x00000008 -#define SQLITE_IOCAP_ATOMIC4K 0x00000010 -#define SQLITE_IOCAP_ATOMIC8K 0x00000020 -#define SQLITE_IOCAP_ATOMIC16K 0x00000040 -#define SQLITE_IOCAP_ATOMIC32K 0x00000080 -#define SQLITE_IOCAP_ATOMIC64K 0x00000100 -#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 -#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 -#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 - -/* -** CAPI3REF: File Locking Levels -** -** SQLite uses one of these integer values as the second -** argument to calls it makes to the xLock() and xUnlock() methods -** of an [sqlite3_io_methods] object. -*/ -#define SQLITE_LOCK_NONE 0 -#define SQLITE_LOCK_SHARED 1 -#define SQLITE_LOCK_RESERVED 2 -#define SQLITE_LOCK_PENDING 3 -#define SQLITE_LOCK_EXCLUSIVE 4 - -/* -** CAPI3REF: Synchronization Type Flags -** -** When SQLite invokes the xSync() method of an -** [sqlite3_io_methods] object it uses a combination of -** these integer values as the second argument. -** -** When the SQLITE_SYNC_DATAONLY flag is used, it means that the -** sync operation only needs to flush data to mass storage. Inode -** information need not be flushed. If the lower four bits of the flag -** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. -** If the lower four bits equal SQLITE_SYNC_FULL, that means -** to use Mac OS X style fullsync instead of fsync(). -** -** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags -** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL -** settings. The [synchronous pragma] determines when calls to the -** xSync VFS method occur and applies uniformly across all platforms. -** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how -** energetic or rigorous or forceful the sync operations are and -** only make a difference on Mac OSX for the default SQLite code. -** (Third-party VFS implementations might also make the distinction -** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the -** operating systems natively supported by SQLite, only Mac OSX -** cares about the difference.) -*/ -#define SQLITE_SYNC_NORMAL 0x00002 -#define SQLITE_SYNC_FULL 0x00003 -#define SQLITE_SYNC_DATAONLY 0x00010 - -/* -** CAPI3REF: OS Interface Open File Handle -** -** An [sqlite3_file] object represents an open file in the -** [sqlite3_vfs | OS interface layer]. Individual OS interface -** implementations will -** want to subclass this object by appending additional fields -** for their own use. The pMethods entry is a pointer to an -** [sqlite3_io_methods] object that defines methods for performing -** I/O operations on the open file. -*/ -typedef struct sqlite3_file sqlite3_file; -struct sqlite3_file { - const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ -}; - -/* -** CAPI3REF: OS Interface File Virtual Methods Object -** -** Every file opened by the [sqlite3_vfs] xOpen method populates an -** [sqlite3_file] object (or, more commonly, a subclass of the -** [sqlite3_file] object) with a pointer to an instance of this object. -** This object defines the methods used to perform various operations -** against the open file represented by the [sqlite3_file] object. -** -** If the xOpen method sets the sqlite3_file.pMethods element -** to a non-NULL pointer, then the sqlite3_io_methods.xClose method -** may be invoked even if the xOpen reported that it failed. The -** only way to prevent a call to xClose following a failed xOpen -** is for the xOpen to set the sqlite3_file.pMethods element to NULL. -** -** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or -** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). -** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] -** flag may be ORed in to indicate that only the data of the file -** and not its inode needs to be synced. -** -** The integer values to xLock() and xUnlock() are one of -**
    -**
  • [SQLITE_LOCK_NONE], -**
  • [SQLITE_LOCK_SHARED], -**
  • [SQLITE_LOCK_RESERVED], -**
  • [SQLITE_LOCK_PENDING], or -**
  • [SQLITE_LOCK_EXCLUSIVE]. -**
-** xLock() increases the lock. xUnlock() decreases the lock. -** The xCheckReservedLock() method checks whether any database connection, -** either in this process or in some other process, is holding a RESERVED, -** PENDING, or EXCLUSIVE lock on the file. It returns true -** if such a lock exists and false otherwise. -** -** The xFileControl() method is a generic interface that allows custom -** VFS implementations to directly control an open file using the -** [sqlite3_file_control()] interface. The second "op" argument is an -** integer opcode. The third argument is a generic pointer intended to -** point to a structure that may contain arguments or space in which to -** write return values. Potential uses for xFileControl() might be -** functions to enable blocking locks with timeouts, to change the -** locking strategy (for example to use dot-file locks), to inquire -** about the status of a lock, or to break stale locks. The SQLite -** core reserves all opcodes less than 100 for its own use. -** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. -** Applications that define a custom xFileControl method should use opcodes -** greater than 100 to avoid conflicts. VFS implementations should -** return [SQLITE_NOTFOUND] for file control opcodes that they do not -** recognize. -** -** The xSectorSize() method returns the sector size of the -** device that underlies the file. The sector size is the -** minimum write that can be performed without disturbing -** other bytes in the file. The xDeviceCharacteristics() -** method returns a bit vector describing behaviors of the -** underlying device: -** -**
    -**
  • [SQLITE_IOCAP_ATOMIC] -**
  • [SQLITE_IOCAP_ATOMIC512] -**
  • [SQLITE_IOCAP_ATOMIC1K] -**
  • [SQLITE_IOCAP_ATOMIC2K] -**
  • [SQLITE_IOCAP_ATOMIC4K] -**
  • [SQLITE_IOCAP_ATOMIC8K] -**
  • [SQLITE_IOCAP_ATOMIC16K] -**
  • [SQLITE_IOCAP_ATOMIC32K] -**
  • [SQLITE_IOCAP_ATOMIC64K] -**
  • [SQLITE_IOCAP_SAFE_APPEND] -**
  • [SQLITE_IOCAP_SEQUENTIAL] -**
-** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -** -** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill -** in the unread portions of the buffer with zeros. A VFS that -** fails to zero-fill short reads might seem to work. However, -** failure to zero-fill short reads will eventually lead to -** database corruption. -*/ -typedef struct sqlite3_io_methods sqlite3_io_methods; -struct sqlite3_io_methods { - int iVersion; - int (*xClose)(sqlite3_file*); - int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); - int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); - int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); - int (*xSync)(sqlite3_file*, int flags); - int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); - int (*xLock)(sqlite3_file*, int); - int (*xUnlock)(sqlite3_file*, int); - int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); - int (*xFileControl)(sqlite3_file*, int op, void *pArg); - int (*xSectorSize)(sqlite3_file*); - int (*xDeviceCharacteristics)(sqlite3_file*); - /* Methods above are valid for version 1 */ - int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); - int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); - void (*xShmBarrier)(sqlite3_file*); - int (*xShmUnmap)(sqlite3_file*, int deleteFlag); - /* Methods above are valid for version 2 */ - /* Additional methods may be added in future releases */ -}; - -/* -** CAPI3REF: Standard File Control Opcodes -** -** These integer constants are opcodes for the xFileControl method -** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] -** interface. -** -** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This -** opcode causes the xFileControl method to write the current state of -** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], -** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) -** into an integer that the pArg argument points to. This capability -** is used during testing and only needs to be supported when SQLITE_TEST -** is defined. -** -** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS -** layer a hint of how large the database file will grow to be during the -** current transaction. This hint is not guaranteed to be accurate but it -** is often close. The underlying VFS might choose to preallocate database -** file space based on this hint in order to help writes to the database -** file run faster. -** -** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS -** extends and truncates the database file in chunks of a size specified -** by the user. The fourth argument to [sqlite3_file_control()] should -** point to an integer (type int) containing the new chunk-size to use -** for the nominated database. Allocating database file space in large -** chunks (say 1MB at a time), may reduce file-system fragmentation and -** improve performance on some systems. -** -** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer -** to the [sqlite3_file] object associated with a particular database -** connection. See the [sqlite3_file_control()] documentation for -** additional information. -** -** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by -** SQLite and sent to all VFSes in place of a call to the xSync method -** when the database connection has [PRAGMA synchronous] set to OFF.)^ -** Some specialized VFSes need this signal in order to operate correctly -** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most -** VFSes do not need this signal and should silently ignore this opcode. -** Applications should not call [sqlite3_file_control()] with this -** opcode as doing so may disrupt the operation of the specilized VFSes -** that do require it. -*/ -#define SQLITE_FCNTL_LOCKSTATE 1 -#define SQLITE_GET_LOCKPROXYFILE 2 -#define SQLITE_SET_LOCKPROXYFILE 3 -#define SQLITE_LAST_ERRNO 4 -#define SQLITE_FCNTL_SIZE_HINT 5 -#define SQLITE_FCNTL_CHUNK_SIZE 6 -#define SQLITE_FCNTL_FILE_POINTER 7 -#define SQLITE_FCNTL_SYNC_OMITTED 8 - - -/* -** CAPI3REF: Mutex Handle -** -** The mutex module within SQLite defines [sqlite3_mutex] to be an -** abstract type for a mutex object. The SQLite core never looks -** at the internal representation of an [sqlite3_mutex]. It only -** deals with pointers to the [sqlite3_mutex] object. -** -** Mutexes are created using [sqlite3_mutex_alloc()]. -*/ -typedef struct sqlite3_mutex sqlite3_mutex; - -/* -** CAPI3REF: OS Interface Object -** -** An instance of the sqlite3_vfs object defines the interface between -** the SQLite core and the underlying operating system. The "vfs" -** in the name of the object stands for "virtual file system". -** -** The value of the iVersion field is initially 1 but may be larger in -** future versions of SQLite. Additional fields may be appended to this -** object when the iVersion value is increased. Note that the structure -** of the sqlite3_vfs object changes in the transaction between -** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not -** modified. -** -** The szOsFile field is the size of the subclassed [sqlite3_file] -** structure used by this VFS. mxPathname is the maximum length of -** a pathname in this VFS. -** -** Registered sqlite3_vfs objects are kept on a linked list formed by -** the pNext pointer. The [sqlite3_vfs_register()] -** and [sqlite3_vfs_unregister()] interfaces manage this list -** in a thread-safe way. The [sqlite3_vfs_find()] interface -** searches the list. Neither the application code nor the VFS -** implementation should use the pNext pointer. -** -** The pNext field is the only field in the sqlite3_vfs -** structure that SQLite will ever modify. SQLite will only access -** or modify this field while holding a particular static mutex. -** The application should never modify anything within the sqlite3_vfs -** object once the object has been registered. -** -** The zName field holds the name of the VFS module. The name must -** be unique across all VFS modules. -** -** ^SQLite guarantees that the zFilename parameter to xOpen -** is either a NULL pointer or string obtained -** from xFullPathname() with an optional suffix added. -** ^If a suffix is added to the zFilename parameter, it will -** consist of a single "-" character followed by no more than -** 10 alphanumeric and/or "-" characters. -** ^SQLite further guarantees that -** the string will be valid and unchanged until xClose() is -** called. Because of the previous sentence, -** the [sqlite3_file] can safely store a pointer to the -** filename if it needs to remember the filename for some reason. -** If the zFilename parameter to xOpen is a NULL pointer then xOpen -** must invent its own temporary name for the file. ^Whenever the -** xFilename parameter is NULL it will also be the case that the -** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. -** -** The flags argument to xOpen() includes all bits set in -** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] -** or [sqlite3_open16()] is used, then flags includes at least -** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. -** If xOpen() opens a file read-only then it sets *pOutFlags to -** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. -** -** ^(SQLite will also add one of the following flags to the xOpen() -** call, depending on the object being opened: -** -**
    -**
  • [SQLITE_OPEN_MAIN_DB] -**
  • [SQLITE_OPEN_MAIN_JOURNAL] -**
  • [SQLITE_OPEN_TEMP_DB] -**
  • [SQLITE_OPEN_TEMP_JOURNAL] -**
  • [SQLITE_OPEN_TRANSIENT_DB] -**
  • [SQLITE_OPEN_SUBJOURNAL] -**
  • [SQLITE_OPEN_MASTER_JOURNAL] -**
  • [SQLITE_OPEN_WAL] -**
)^ -** -** The file I/O implementation can use the object type flags to -** change the way it deals with files. For example, an application -** that does not care about crash recovery or rollback might make -** the open of a journal file a no-op. Writes to this journal would -** also be no-ops, and any attempt to read the journal would return -** SQLITE_IOERR. Or the implementation might recognize that a database -** file will be doing page-aligned sector reads and writes in a random -** order and set up its I/O subsystem accordingly. -** -** SQLite might also add one of the following flags to the xOpen method: -** -**
    -**
  • [SQLITE_OPEN_DELETEONCLOSE] -**
  • [SQLITE_OPEN_EXCLUSIVE] -**
-** -** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be -** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] -** will be set for TEMP databases and their journals, transient -** databases, and subjournals. -** -** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction -** with the [SQLITE_OPEN_CREATE] flag, which are both directly -** analogous to the O_EXCL and O_CREAT flags of the POSIX open() -** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the -** SQLITE_OPEN_CREATE, is used to indicate that file should always -** be created, and that it is an error if it already exists. -** It is not used to indicate the file should be opened -** for exclusive access. -** -** ^At least szOsFile bytes of memory are allocated by SQLite -** to hold the [sqlite3_file] structure passed as the third -** argument to xOpen. The xOpen method does not have to -** allocate the structure; it should just fill it in. Note that -** the xOpen method must set the sqlite3_file.pMethods to either -** a valid [sqlite3_io_methods] object or to NULL. xOpen must do -** this even if the open fails. SQLite expects that the sqlite3_file.pMethods -** element will be valid after xOpen returns regardless of the success -** or failure of the xOpen call. -** -** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] -** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to -** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test whether a file is at least readable. The file can be a -** directory. -** -** ^SQLite will always allocate at least mxPathname+1 bytes for the -** output buffer xFullPathname. The exact size of the output buffer -** is also passed as a parameter to both methods. If the output buffer -** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is -** handled as a fatal error by SQLite, vfs implementations should endeavor -** to prevent this by setting mxPathname to a sufficiently large value. -** -** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() -** interfaces are not strictly a part of the filesystem, but they are -** included in the VFS structure for completeness. -** The xRandomness() function attempts to return nBytes bytes -** of good-quality randomness into zOut. The return value is -** the actual number of bytes of randomness obtained. -** The xSleep() method causes the calling thread to sleep for at -** least the number of microseconds given. ^The xCurrentTime() -** method returns a Julian Day Number for the current date and time as -** a floating point value. -** ^The xCurrentTimeInt64() method returns, as an integer, the Julian -** Day Number multipled by 86400000 (the number of milliseconds in -** a 24-hour day). -** ^SQLite will use the xCurrentTimeInt64() method to get the current -** date and time if that method is available (if iVersion is 2 or -** greater and the function pointer is not NULL) and will fall back -** to xCurrentTime() if xCurrentTimeInt64() is unavailable. -*/ -typedef struct sqlite3_vfs sqlite3_vfs; -struct sqlite3_vfs { - int iVersion; /* Structure version number (currently 2) */ - int szOsFile; /* Size of subclassed sqlite3_file */ - int mxPathname; /* Maximum file pathname length */ - sqlite3_vfs *pNext; /* Next registered VFS */ - const char *zName; /* Name of this virtual file system */ - void *pAppData; /* Pointer to application-specific data */ - int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, - int flags, int *pOutFlags); - int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); - int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); - int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); - void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); - void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); - void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); - void (*xDlClose)(sqlite3_vfs*, void*); - int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); - int (*xSleep)(sqlite3_vfs*, int microseconds); - int (*xCurrentTime)(sqlite3_vfs*, double*); - int (*xGetLastError)(sqlite3_vfs*, int, char *); - /* - ** The methods above are in version 1 of the sqlite_vfs object - ** definition. Those that follow are added in version 2 or later - */ - int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); - /* - ** The methods above are in versions 1 and 2 of the sqlite_vfs object. - ** New fields may be appended in figure versions. The iVersion - ** value will increment whenever this happens. - */ -}; - -/* -** CAPI3REF: Flags for the xAccess VFS method -** -** These integer constants can be used as the third parameter to -** the xAccess method of an [sqlite3_vfs] object. They determine -** what kind of permissions the xAccess method is looking for. -** With SQLITE_ACCESS_EXISTS, the xAccess method -** simply checks whether the file exists. -** With SQLITE_ACCESS_READWRITE, the xAccess method -** checks whether the named directory is both readable and writable -** (in other words, if files can be added, removed, and renamed within -** the directory). -** The SQLITE_ACCESS_READWRITE constant is currently used only by the -** [temp_store_directory pragma], though this could change in a future -** release of SQLite. -** With SQLITE_ACCESS_READ, the xAccess method -** checks whether the file is readable. The SQLITE_ACCESS_READ constant is -** currently unused, though it might be used in a future release of -** SQLite. -*/ -#define SQLITE_ACCESS_EXISTS 0 -#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ -#define SQLITE_ACCESS_READ 2 /* Unused */ - -/* -** CAPI3REF: Flags for the xShmLock VFS method -** -** These integer constants define the various locking operations -** allowed by the xShmLock method of [sqlite3_io_methods]. The -** following are the only legal combinations of flags to the -** xShmLock method: -** -**
    -**
  • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED -**
  • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE -**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED -**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE -**
-** -** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as -** was given no the corresponding lock. -** -** The xShmLock method can transition between unlocked and SHARED or -** between unlocked and EXCLUSIVE. It cannot transition between SHARED -** and EXCLUSIVE. -*/ -#define SQLITE_SHM_UNLOCK 1 -#define SQLITE_SHM_LOCK 2 -#define SQLITE_SHM_SHARED 4 -#define SQLITE_SHM_EXCLUSIVE 8 - -/* -** CAPI3REF: Maximum xShmLock index -** -** The xShmLock method on [sqlite3_io_methods] may use values -** between 0 and this upper bound as its "offset" argument. -** The SQLite core will never attempt to acquire or release a -** lock outside of this range -*/ -#define SQLITE_SHM_NLOCK 8 - - -/* -** CAPI3REF: Initialize The SQLite Library -** -** ^The sqlite3_initialize() routine initializes the -** SQLite library. ^The sqlite3_shutdown() routine -** deallocates any resources that were allocated by sqlite3_initialize(). -** These routines are designed to aid in process initialization and -** shutdown on embedded systems. Workstation applications using -** SQLite normally do not need to invoke either of these routines. -** -** A call to sqlite3_initialize() is an "effective" call if it is -** the first time sqlite3_initialize() is invoked during the lifetime of -** the process, or if it is the first time sqlite3_initialize() is invoked -** following a call to sqlite3_shutdown(). ^(Only an effective call -** of sqlite3_initialize() does any initialization. All other calls -** are harmless no-ops.)^ -** -** A call to sqlite3_shutdown() is an "effective" call if it is the first -** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only -** an effective call to sqlite3_shutdown() does any deinitialization. -** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ -** -** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() -** is not. The sqlite3_shutdown() interface must only be called from a -** single thread. All open [database connections] must be closed and all -** other SQLite resources must be deallocated prior to invoking -** sqlite3_shutdown(). -** -** Among other things, ^sqlite3_initialize() will invoke -** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() -** will invoke sqlite3_os_end(). -** -** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. -** ^If for some reason, sqlite3_initialize() is unable to initialize -** the library (perhaps it is unable to allocate a needed resource such -** as a mutex) it returns an [error code] other than [SQLITE_OK]. -** -** ^The sqlite3_initialize() routine is called internally by many other -** SQLite interfaces so that an application usually does not need to -** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] -** calls sqlite3_initialize() so the SQLite library will be automatically -** initialized when [sqlite3_open()] is called if it has not be initialized -** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] -** compile-time option, then the automatic calls to sqlite3_initialize() -** are omitted and the application must call sqlite3_initialize() directly -** prior to using any other SQLite interface. For maximum portability, -** it is recommended that applications always invoke sqlite3_initialize() -** directly prior to using any other SQLite interface. Future releases -** of SQLite may require this. In other words, the behavior exhibited -** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the -** default behavior in some future release of SQLite. -** -** The sqlite3_os_init() routine does operating-system specific -** initialization of the SQLite library. The sqlite3_os_end() -** routine undoes the effect of sqlite3_os_init(). Typical tasks -** performed by these routines include allocation or deallocation -** of static resources, initialization of global variables, -** setting up a default [sqlite3_vfs] module, or setting up -** a default configuration using [sqlite3_config()]. -** -** The application should never invoke either sqlite3_os_init() -** or sqlite3_os_end() directly. The application should only invoke -** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() -** interface is called automatically by sqlite3_initialize() and -** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate -** implementations for sqlite3_os_init() and sqlite3_os_end() -** are built into SQLite when it is compiled for Unix, Windows, or OS/2. -** When [custom builds | built for other platforms] -** (using the [SQLITE_OS_OTHER=1] compile-time -** option) the application must supply a suitable implementation for -** sqlite3_os_init() and sqlite3_os_end(). An application-supplied -** implementation of sqlite3_os_init() or sqlite3_os_end() -** must return [SQLITE_OK] on success and some other [error code] upon -** failure. -*/ -SQLITE_API int sqlite3_initialize(void); -SQLITE_API int sqlite3_shutdown(void); -SQLITE_API int sqlite3_os_init(void); -SQLITE_API int sqlite3_os_end(void); - -/* -** CAPI3REF: Configuring The SQLite Library -** -** The sqlite3_config() interface is used to make global configuration -** changes to SQLite in order to tune SQLite to the specific needs of -** the application. The default configuration is recommended for most -** applications and so this routine is usually not necessary. It is -** provided to support rare applications with unusual needs. -** -** The sqlite3_config() interface is not threadsafe. The application -** must insure that no other SQLite interfaces are invoked by other -** threads while sqlite3_config() is running. Furthermore, sqlite3_config() -** may only be invoked prior to library initialization using -** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. -** ^If sqlite3_config() is called after [sqlite3_initialize()] and before -** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. -** Note, however, that ^sqlite3_config() can be called as part of the -** implementation of an application-defined [sqlite3_os_init()]. -** -** The first argument to sqlite3_config() is an integer -** [SQLITE_CONFIG_SINGLETHREAD | configuration option] that determines -** what property of SQLite is to be configured. Subsequent arguments -** vary depending on the [SQLITE_CONFIG_SINGLETHREAD | configuration option] -** in the first argument. -** -** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. -** ^If the option is unknown or SQLite is unable to set the option -** then this routine returns a non-zero [error code]. -*/ -SQLITE_API int sqlite3_config(int, ...); - -/* -** CAPI3REF: Configure database connections -** -** The sqlite3_db_config() interface is used to make configuration -** changes to a [database connection]. The interface is similar to -** [sqlite3_config()] except that the changes apply to a single -** [database connection] (specified in the first argument). The -** sqlite3_db_config() interface should only be used immediately after -** the database connection is created using [sqlite3_open()], -** [sqlite3_open16()], or [sqlite3_open_v2()]. -** -** The second argument to sqlite3_db_config(D,V,...) is the -** configuration verb - an integer code that indicates what -** aspect of the [database connection] is being configured. -** The only choice for this value is [SQLITE_DBCONFIG_LOOKASIDE]. -** New verbs are likely to be added in future releases of SQLite. -** Additional arguments depend on the verb. -** -** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if -** the call is considered successful. -*/ -SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); - -/* -** CAPI3REF: Memory Allocation Routines -** -** An instance of this object defines the interface between SQLite -** and low-level memory allocation routines. -** -** This object is used in only one place in the SQLite interface. -** A pointer to an instance of this object is the argument to -** [sqlite3_config()] when the configuration option is -** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. -** By creating an instance of this object -** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) -** during configuration, an application can specify an alternative -** memory allocation subsystem for SQLite to use for all of its -** dynamic memory needs. -** -** Note that SQLite comes with several [built-in memory allocators] -** that are perfectly adequate for the overwhelming majority of applications -** and that this object is only useful to a tiny minority of applications -** with specialized memory allocation requirements. This object is -** also used during testing of SQLite in order to specify an alternative -** memory allocator that simulates memory out-of-memory conditions in -** order to verify that SQLite recovers gracefully from such -** conditions. -** -** The xMalloc and xFree methods must work like the -** malloc() and free() functions from the standard C library. -** The xRealloc method must work like realloc() from the standard C library -** with the exception that if the second argument to xRealloc is zero, -** xRealloc must be a no-op - it must not perform any allocation or -** deallocation. ^SQLite guarantees that the second argument to -** xRealloc is always a value returned by a prior call to xRoundup. -** And so in cases where xRoundup always returns a positive number, -** xRealloc can perform exactly as the standard library realloc() and -** still be in compliance with this specification. -** -** xSize should return the allocated size of a memory allocation -** previously obtained from xMalloc or xRealloc. The allocated size -** is always at least as big as the requested size but may be larger. -** -** The xRoundup method returns what would be the allocated size of -** a memory allocation given a particular requested size. Most memory -** allocators round up memory allocations at least to the next multiple -** of 8. Some allocators round up to a larger multiple or to a power of 2. -** Every memory allocation request coming in through [sqlite3_malloc()] -** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, -** that causes the corresponding memory allocation to fail. -** -** The xInit method initializes the memory allocator. (For example, -** it might allocate any require mutexes or initialize internal data -** structures. The xShutdown method is invoked (indirectly) by -** [sqlite3_shutdown()] and should deallocate any resources acquired -** by xInit. The pAppData pointer is used as the only parameter to -** xInit and xShutdown. -** -** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes -** the xInit method, so the xInit method need not be threadsafe. The -** xShutdown method is only called from [sqlite3_shutdown()] so it does -** not need to be threadsafe either. For all other methods, SQLite -** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the -** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which -** it is by default) and so the methods are automatically serialized. -** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other -** methods must be threadsafe or else make their own arrangements for -** serialization. -** -** SQLite will never invoke xInit() more than once without an intervening -** call to xShutdown(). -*/ -typedef struct sqlite3_mem_methods sqlite3_mem_methods; -struct sqlite3_mem_methods { - void *(*xMalloc)(int); /* Memory allocation function */ - void (*xFree)(void*); /* Free a prior allocation */ - void *(*xRealloc)(void*,int); /* Resize an allocation */ - int (*xSize)(void*); /* Return the size of an allocation */ - int (*xRoundup)(int); /* Round up request size to allocation size */ - int (*xInit)(void*); /* Initialize the memory allocator */ - void (*xShutdown)(void*); /* Deinitialize the memory allocator */ - void *pAppData; /* Argument to xInit() and xShutdown() */ -}; - -/* -** CAPI3REF: Configuration Options -** -** These constants are the available integer configuration options that -** can be passed as the first argument to the [sqlite3_config()] interface. -** -** New configuration options may be added in future releases of SQLite. -** Existing configuration options might be discontinued. Applications -** should check the return code from [sqlite3_config()] to make sure that -** the call worked. The [sqlite3_config()] interface will return a -** non-zero [error code] if a discontinued or unsupported configuration option -** is invoked. -** -**
-**
SQLITE_CONFIG_SINGLETHREAD
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Single-thread. In other words, it disables -** all mutexing and puts SQLite into a mode where it can only be used -** by a single thread. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to change the [threading mode] from its default -** value of Single-thread and so [sqlite3_config()] will return -** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD -** configuration option.
-** -**
SQLITE_CONFIG_MULTITHREAD
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Multi-thread. In other words, it disables -** mutexing on [database connection] and [prepared statement] objects. -** The application is responsible for serializing access to -** [database connections] and [prepared statements]. But other mutexes -** are enabled so that SQLite will be safe to use in a multi-threaded -** environment as long as no two threads attempt to use the same -** [database connection] at the same time. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to set the Multi-thread [threading mode] and -** [sqlite3_config()] will return [SQLITE_ERROR] if called with the -** SQLITE_CONFIG_MULTITHREAD configuration option.
-** -**
SQLITE_CONFIG_SERIALIZED
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Serialized. In other words, this option enables -** all mutexes including the recursive -** mutexes on [database connection] and [prepared statement] objects. -** In this mode (which is the default when SQLite is compiled with -** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access -** to [database connections] and [prepared statements] so that the -** application is free to use the same [database connection] or the -** same [prepared statement] in different threads at the same time. -** ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to set the Serialized [threading mode] and -** [sqlite3_config()] will return [SQLITE_ERROR] if called with the -** SQLITE_CONFIG_SERIALIZED configuration option.
-** -**
SQLITE_CONFIG_MALLOC
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mem_methods] structure. The argument specifies -** alternative low-level memory allocation routines to be used in place of -** the memory allocation routines built into SQLite.)^ ^SQLite makes -** its own private copy of the content of the [sqlite3_mem_methods] structure -** before the [sqlite3_config()] call returns.
-** -**
SQLITE_CONFIG_GETMALLOC
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] -** structure is filled with the currently defined memory allocation routines.)^ -** This option can be used to overload the default memory allocation -** routines with a wrapper that simulations memory allocation failure or -** tracks memory usage, for example.
-** -**
SQLITE_CONFIG_MEMSTATUS
-**
^This option takes single argument of type int, interpreted as a -** boolean, which enables or disables the collection of memory allocation -** statistics. ^(When memory allocation statistics are disabled, the -** following SQLite interfaces become non-operational: -**
    -**
  • [sqlite3_memory_used()] -**
  • [sqlite3_memory_highwater()] -**
  • [sqlite3_soft_heap_limit64()] -**
  • [sqlite3_status()] -**
)^ -** ^Memory allocation statistics are enabled by default unless SQLite is -** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory -** allocation statistics are disabled by default. -**
-** -**
SQLITE_CONFIG_SCRATCH
-**
^This option specifies a static memory buffer that SQLite can use for -** scratch memory. There are three arguments: A pointer an 8-byte -** aligned memory buffer from which the scrach allocations will be -** drawn, the size of each scratch allocation (sz), -** and the maximum number of scratch allocations (N). The sz -** argument must be a multiple of 16. -** The first argument must be a pointer to an 8-byte aligned buffer -** of at least sz*N bytes of memory. -** ^SQLite will use no more than two scratch buffers per thread. So -** N should be set to twice the expected maximum number of threads. -** ^SQLite will never require a scratch buffer that is more than 6 -** times the database page size. ^If SQLite needs needs additional -** scratch memory beyond what is provided by this configuration option, then -** [sqlite3_malloc()] will be used to obtain the memory needed.
-** -**
SQLITE_CONFIG_PAGECACHE
-**
^This option specifies a static memory buffer that SQLite can use for -** the database page cache with the default page cache implemenation. -** This configuration should not be used if an application-define page -** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option. -** There are three arguments to this option: A pointer to 8-byte aligned -** memory, the size of each page buffer (sz), and the number of pages (N). -** The sz argument should be the size of the largest database page -** (a power of two between 512 and 32768) plus a little extra for each -** page header. ^The page header size is 20 to 40 bytes depending on -** the host architecture. ^It is harmless, apart from the wasted memory, -** to make sz a little too large. The first -** argument should point to an allocation of at least sz*N bytes of memory. -** ^SQLite will use the memory provided by the first argument to satisfy its -** memory needs for the first N pages that it adds to cache. ^If additional -** page cache memory is needed beyond what is provided by this option, then -** SQLite goes to [sqlite3_malloc()] for the additional storage space. -** The pointer in the first argument must -** be aligned to an 8-byte boundary or subsequent behavior of SQLite -** will be undefined.
-** -**
SQLITE_CONFIG_HEAP
-**
^This option specifies a static memory buffer that SQLite will use -** for all of its dynamic memory allocation needs beyond those provided -** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. -** There are three arguments: An 8-byte aligned pointer to the memory, -** the number of bytes in the memory buffer, and the minimum allocation size. -** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts -** to using its default memory allocator (the system malloc() implementation), -** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the -** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or -** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory -** allocator is engaged to handle all of SQLites memory allocation needs. -** The first pointer (the memory pointer) must be aligned to an 8-byte -** boundary or subsequent behavior of SQLite will be undefined.
-** -**
SQLITE_CONFIG_MUTEX
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mutex_methods] structure. The argument specifies -** alternative low-level mutex routines to be used in place -** the mutex routines built into SQLite.)^ ^SQLite makes a copy of the -** content of the [sqlite3_mutex_methods] structure before the call to -** [sqlite3_config()] returns. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** the entire mutexing subsystem is omitted from the build and hence calls to -** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will -** return [SQLITE_ERROR].
-** -**
SQLITE_CONFIG_GETMUTEX
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mutex_methods] structure. The -** [sqlite3_mutex_methods] -** structure is filled with the currently defined mutex routines.)^ -** This option can be used to overload the default mutex allocation -** routines with a wrapper used to track mutex usage for performance -** profiling or testing, for example. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** the entire mutexing subsystem is omitted from the build and hence calls to -** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will -** return [SQLITE_ERROR].
-** -**
SQLITE_CONFIG_LOOKASIDE
-**
^(This option takes two arguments that determine the default -** memory allocation for the lookaside memory allocator on each -** [database connection]. The first argument is the -** size of each lookaside buffer slot and the second is the number of -** slots allocated to each database connection.)^ ^(This option sets the -** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] -** verb to [sqlite3_db_config()] can be used to change the lookaside -** configuration on individual connections.)^
-** -**
SQLITE_CONFIG_PCACHE
-**
^(This option takes a single argument which is a pointer to -** an [sqlite3_pcache_methods] object. This object specifies the interface -** to a custom page cache implementation.)^ ^SQLite makes a copy of the -** object and uses it for page cache memory allocations.
-** -**
SQLITE_CONFIG_GETPCACHE
-**
^(This option takes a single argument which is a pointer to an -** [sqlite3_pcache_methods] object. SQLite copies of the current -** page cache implementation into that object.)^
-** -**
SQLITE_CONFIG_LOG
-**
^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a -** function with a call signature of void(*)(void*,int,const char*), -** and a pointer to void. ^If the function pointer is not NULL, it is -** invoked by [sqlite3_log()] to process each logging event. ^If the -** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. -** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is -** passed through as the first parameter to the application-defined logger -** function whenever that function is invoked. ^The second parameter to -** the logger function is a copy of the first parameter to the corresponding -** [sqlite3_log()] call and is intended to be a [result code] or an -** [extended result code]. ^The third parameter passed to the logger is -** log message after formatting via [sqlite3_snprintf()]. -** The SQLite logging interface is not reentrant; the logger function -** supplied by the application must not invoke any SQLite interface. -** In a multi-threaded application, the application-defined logger -** function must be threadsafe.
-** -**
-*/ -#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ -#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ -#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ -#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ -#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ -#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ -#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ -#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ -#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ -/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ -#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ -#define SQLITE_CONFIG_PCACHE 14 /* sqlite3_pcache_methods* */ -#define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */ -#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ - -/* -** CAPI3REF: Database Connection Configuration Options -** -** These constants are the available integer configuration options that -** can be passed as the second argument to the [sqlite3_db_config()] interface. -** -** New configuration options may be added in future releases of SQLite. -** Existing configuration options might be discontinued. Applications -** should check the return code from [sqlite3_db_config()] to make sure that -** the call worked. ^The [sqlite3_db_config()] interface will return a -** non-zero [error code] if a discontinued or unsupported configuration option -** is invoked. -** -**
-**
SQLITE_DBCONFIG_LOOKASIDE
-**
^This option takes three additional arguments that determine the -** [lookaside memory allocator] configuration for the [database connection]. -** ^The first argument (the third parameter to [sqlite3_db_config()] is a -** pointer to an memory buffer to use for lookaside memory. -** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb -** may be NULL in which case SQLite will allocate the -** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the -** size of each lookaside buffer slot. ^The third argument is the number of -** slots. The size of the buffer in the first argument must be greater than -** or equal to the product of the second and third arguments. The buffer -** must be aligned to an 8-byte boundary. ^If the second argument to -** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally -** rounded down to the next smaller multiple of 8. ^(The lookaside memory -** configuration for a database connection can only be changed when that -** connection is not currently using lookaside memory, or in other words -** when the "current value" returned by -** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. -** Any attempt to change the lookaside memory configuration when lookaside -** memory is in use leaves the configuration unchanged and returns -** [SQLITE_BUSY].)^
-** -**
-*/ -#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ - - -/* -** CAPI3REF: Enable Or Disable Extended Result Codes -** -** ^The sqlite3_extended_result_codes() routine enables or disables the -** [extended result codes] feature of SQLite. ^The extended result -** codes are disabled by default for historical compatibility. -*/ -SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); - -/* -** CAPI3REF: Last Insert Rowid -** -** ^Each entry in an SQLite table has a unique 64-bit signed -** integer key called the [ROWID | "rowid"]. ^The rowid is always available -** as an undeclared column named ROWID, OID, or _ROWID_ as long as those -** names are not also used by explicitly declared columns. ^If -** the table has a column of type [INTEGER PRIMARY KEY] then that column -** is another alias for the rowid. -** -** ^This routine returns the [rowid] of the most recent -** successful [INSERT] into the database from the [database connection] -** in the first argument. ^If no successful [INSERT]s -** have ever occurred on that database connection, zero is returned. -** -** ^(If an [INSERT] occurs within a trigger, then the [rowid] of the inserted -** row is returned by this routine as long as the trigger is running. -** But once the trigger terminates, the value returned by this routine -** reverts to the last value inserted before the trigger fired.)^ -** -** ^An [INSERT] that fails due to a constraint violation is not a -** successful [INSERT] and does not change the value returned by this -** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, -** and INSERT OR ABORT make no changes to the return value of this -** routine when their insertion fails. ^(When INSERT OR REPLACE -** encounters a constraint violation, it does not fail. The -** INSERT continues to completion after deleting rows that caused -** the constraint problem so INSERT OR REPLACE will always change -** the return value of this interface.)^ -** -** ^For the purposes of this routine, an [INSERT] is considered to -** be successful even if it is subsequently rolled back. -** -** This function is accessible to SQL statements via the -** [last_insert_rowid() SQL function]. -** -** If a separate thread performs a new [INSERT] on the same -** database connection while the [sqlite3_last_insert_rowid()] -** function is running and thus changes the last insert [rowid], -** then the value returned by [sqlite3_last_insert_rowid()] is -** unpredictable and might not equal either the old or the new -** last insert [rowid]. -*/ -SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); - -/* -** CAPI3REF: Count The Number Of Rows Modified -** -** ^This function returns the number of database rows that were changed -** or inserted or deleted by the most recently completed SQL statement -** on the [database connection] specified by the first parameter. -** ^(Only changes that are directly specified by the [INSERT], [UPDATE], -** or [DELETE] statement are counted. Auxiliary changes caused by -** triggers or [foreign key actions] are not counted.)^ Use the -** [sqlite3_total_changes()] function to find the total number of changes -** including changes caused by triggers and foreign key actions. -** -** ^Changes to a view that are simulated by an [INSTEAD OF trigger] -** are not counted. Only real table changes are counted. -** -** ^(A "row change" is a change to a single row of a single table -** caused by an INSERT, DELETE, or UPDATE statement. Rows that -** are changed as side effects of [REPLACE] constraint resolution, -** rollback, ABORT processing, [DROP TABLE], or by any other -** mechanisms do not count as direct row changes.)^ -** -** A "trigger context" is a scope of execution that begins and -** ends with the script of a [CREATE TRIGGER | trigger]. -** Most SQL statements are -** evaluated outside of any trigger. This is the "top level" -** trigger context. If a trigger fires from the top level, a -** new trigger context is entered for the duration of that one -** trigger. Subtriggers create subcontexts for their duration. -** -** ^Calling [sqlite3_exec()] or [sqlite3_step()] recursively does -** not create a new trigger context. -** -** ^This function returns the number of direct row changes in the -** most recent INSERT, UPDATE, or DELETE statement within the same -** trigger context. -** -** ^Thus, when called from the top level, this function returns the -** number of changes in the most recent INSERT, UPDATE, or DELETE -** that also occurred at the top level. ^(Within the body of a trigger, -** the sqlite3_changes() interface can be called to find the number of -** changes in the most recently completed INSERT, UPDATE, or DELETE -** statement within the body of the same trigger. -** However, the number returned does not include changes -** caused by subtriggers since those have their own context.)^ -** -** See also the [sqlite3_total_changes()] interface, the -** [count_changes pragma], and the [changes() SQL function]. -** -** If a separate thread makes changes on the same database connection -** while [sqlite3_changes()] is running then the value returned -** is unpredictable and not meaningful. -*/ -SQLITE_API int sqlite3_changes(sqlite3*); - -/* -** CAPI3REF: Total Number Of Rows Modified -** -** ^This function returns the number of row changes caused by [INSERT], -** [UPDATE] or [DELETE] statements since the [database connection] was opened. -** ^(The count returned by sqlite3_total_changes() includes all changes -** from all [CREATE TRIGGER | trigger] contexts and changes made by -** [foreign key actions]. However, -** the count does not include changes used to implement [REPLACE] constraints, -** do rollbacks or ABORT processing, or [DROP TABLE] processing. The -** count does not include rows of views that fire an [INSTEAD OF trigger], -** though if the INSTEAD OF trigger makes changes of its own, those changes -** are counted.)^ -** ^The sqlite3_total_changes() function counts the changes as soon as -** the statement that makes them is completed (when the statement handle -** is passed to [sqlite3_reset()] or [sqlite3_finalize()]). -** -** See also the [sqlite3_changes()] interface, the -** [count_changes pragma], and the [total_changes() SQL function]. -** -** If a separate thread makes changes on the same database connection -** while [sqlite3_total_changes()] is running then the value -** returned is unpredictable and not meaningful. -*/ -SQLITE_API int sqlite3_total_changes(sqlite3*); - -/* -** CAPI3REF: Interrupt A Long-Running Query -** -** ^This function causes any pending database operation to abort and -** return at its earliest opportunity. This routine is typically -** called in response to a user action such as pressing "Cancel" -** or Ctrl-C where the user wants a long query operation to halt -** immediately. -** -** ^It is safe to call this routine from a thread different from the -** thread that is currently running the database operation. But it -** is not safe to call this routine with a [database connection] that -** is closed or might close before sqlite3_interrupt() returns. -** -** ^If an SQL operation is very nearly finished at the time when -** sqlite3_interrupt() is called, then it might not have an opportunity -** to be interrupted and might continue to completion. -** -** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. -** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE -** that is inside an explicit transaction, then the entire transaction -** will be rolled back automatically. -** -** ^The sqlite3_interrupt(D) call is in effect until all currently running -** SQL statements on [database connection] D complete. ^Any new SQL statements -** that are started after the sqlite3_interrupt() call and before the -** running statements reaches zero are interrupted as if they had been -** running prior to the sqlite3_interrupt() call. ^New SQL statements -** that are started after the running statement count reaches zero are -** not effected by the sqlite3_interrupt(). -** ^A call to sqlite3_interrupt(D) that occurs when there are no running -** SQL statements is a no-op and has no effect on SQL statements -** that are started after the sqlite3_interrupt() call returns. -** -** If the database connection closes while [sqlite3_interrupt()] -** is running then bad things will likely happen. -*/ -SQLITE_API void sqlite3_interrupt(sqlite3*); - -/* -** CAPI3REF: Determine If An SQL Statement Is Complete -** -** These routines are useful during command-line input to determine if the -** currently entered text seems to form a complete SQL statement or -** if additional input is needed before sending the text into -** SQLite for parsing. ^These routines return 1 if the input string -** appears to be a complete SQL statement. ^A statement is judged to be -** complete if it ends with a semicolon token and is not a prefix of a -** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within -** string literals or quoted identifier names or comments are not -** independent tokens (they are part of the token in which they are -** embedded) and thus do not count as a statement terminator. ^Whitespace -** and comments that follow the final semicolon are ignored. -** -** ^These routines return 0 if the statement is incomplete. ^If a -** memory allocation fails, then SQLITE_NOMEM is returned. -** -** ^These routines do not parse the SQL statements thus -** will not detect syntactically incorrect SQL. -** -** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior -** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked -** automatically by sqlite3_complete16(). If that initialization fails, -** then the return value from sqlite3_complete16() will be non-zero -** regardless of whether or not the input SQL is complete.)^ -** -** The input to [sqlite3_complete()] must be a zero-terminated -** UTF-8 string. -** -** The input to [sqlite3_complete16()] must be a zero-terminated -** UTF-16 string in native byte order. -*/ -SQLITE_API int sqlite3_complete(const char *sql); -SQLITE_API int sqlite3_complete16(const void *sql); - -/* -** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors -** -** ^This routine sets a callback function that might be invoked whenever -** an attempt is made to open a database table that another thread -** or process has locked. -** -** ^If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] -** is returned immediately upon encountering the lock. ^If the busy callback -** is not NULL, then the callback might be invoked with two arguments. -** -** ^The first argument to the busy handler is a copy of the void* pointer which -** is the third argument to sqlite3_busy_handler(). ^The second argument to -** the busy handler callback is the number of times that the busy handler has -** been invoked for this locking event. ^If the -** busy callback returns 0, then no additional attempts are made to -** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. -** ^If the callback returns non-zero, then another attempt -** is made to open the database for reading and the cycle repeats. -** -** The presence of a busy handler does not guarantee that it will be invoked -** when there is lock contention. ^If SQLite determines that invoking the busy -** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] -** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler. -** Consider a scenario where one process is holding a read lock that -** it is trying to promote to a reserved lock and -** a second process is holding a reserved lock that it is trying -** to promote to an exclusive lock. The first process cannot proceed -** because it is blocked by the second and the second process cannot -** proceed because it is blocked by the first. If both processes -** invoke the busy handlers, neither will make any progress. Therefore, -** SQLite returns [SQLITE_BUSY] for the first process, hoping that this -** will induce the first process to release its read lock and allow -** the second process to proceed. -** -** ^The default busy callback is NULL. -** -** ^The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] -** when SQLite is in the middle of a large transaction where all the -** changes will not fit into the in-memory cache. SQLite will -** already hold a RESERVED lock on the database file, but it needs -** to promote this lock to EXCLUSIVE so that it can spill cache -** pages into the database file without harm to concurrent -** readers. ^If it is unable to promote the lock, then the in-memory -** cache will be left in an inconsistent state and so the error -** code is promoted from the relatively benign [SQLITE_BUSY] to -** the more severe [SQLITE_IOERR_BLOCKED]. ^This error code promotion -** forces an automatic rollback of the changes. See the -** -** CorruptionFollowingBusyError wiki page for a discussion of why -** this is important. -** -** ^(There can only be a single busy handler defined for each -** [database connection]. Setting a new busy handler clears any -** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] -** will also set or clear the busy handler. -** -** The busy callback should not take any actions which modify the -** database connection that invoked the busy handler. Any such actions -** result in undefined behavior. -** -** A busy handler must not close the database connection -** or [prepared statement] that invoked the busy handler. -*/ -SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); - -/* -** CAPI3REF: Set A Busy Timeout -** -** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps -** for a specified amount of time when a table is locked. ^The handler -** will sleep multiple times until at least "ms" milliseconds of sleeping -** have accumulated. ^After at least "ms" milliseconds of sleeping, -** the handler returns 0 which causes [sqlite3_step()] to return -** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. -** -** ^Calling this routine with an argument less than or equal to zero -** turns off all busy handlers. -** -** ^(There can only be a single busy handler for a particular -** [database connection] any any given moment. If another busy handler -** was defined (using [sqlite3_busy_handler()]) prior to calling -** this routine, that other busy handler is cleared.)^ -*/ -SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); - -/* -** CAPI3REF: Convenience Routines For Running Queries -** -** This is a legacy interface that is preserved for backwards compatibility. -** Use of this interface is not recommended. -** -** Definition: A result table is memory data structure created by the -** [sqlite3_get_table()] interface. A result table records the -** complete query results from one or more queries. -** -** The table conceptually has a number of rows and columns. But -** these numbers are not part of the result table itself. These -** numbers are obtained separately. Let N be the number of rows -** and M be the number of columns. -** -** A result table is an array of pointers to zero-terminated UTF-8 strings. -** There are (N+1)*M elements in the array. The first M pointers point -** to zero-terminated strings that contain the names of the columns. -** The remaining entries all point to query results. NULL values result -** in NULL pointers. All other values are in their UTF-8 zero-terminated -** string representation as returned by [sqlite3_column_text()]. -** -** A result table might consist of one or more memory allocations. -** It is not safe to pass a result table directly to [sqlite3_free()]. -** A result table should be deallocated using [sqlite3_free_table()]. -** -** ^(As an example of the result table format, suppose a query result -** is as follows: -** -**
-**        Name        | Age
-**        -----------------------
-**        Alice       | 43
-**        Bob         | 28
-**        Cindy       | 21
-** 
-** -** There are two column (M==2) and three rows (N==3). Thus the -** result table has 8 entries. Suppose the result table is stored -** in an array names azResult. Then azResult holds this content: -** -**
-**        azResult[0] = "Name";
-**        azResult[1] = "Age";
-**        azResult[2] = "Alice";
-**        azResult[3] = "43";
-**        azResult[4] = "Bob";
-**        azResult[5] = "28";
-**        azResult[6] = "Cindy";
-**        azResult[7] = "21";
-** 
)^ -** -** ^The sqlite3_get_table() function evaluates one or more -** semicolon-separated SQL statements in the zero-terminated UTF-8 -** string of its 2nd parameter and returns a result table to the -** pointer given in its 3rd parameter. -** -** After the application has finished with the result from sqlite3_get_table(), -** it must pass the result table pointer to sqlite3_free_table() in order to -** release the memory that was malloced. Because of the way the -** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling -** function must not try to call [sqlite3_free()] directly. Only -** [sqlite3_free_table()] is able to release the memory properly and safely. -** -** The sqlite3_get_table() interface is implemented as a wrapper around -** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access -** to any internal data structures of SQLite. It uses only the public -** interface defined here. As a consequence, errors that occur in the -** wrapper layer outside of the internal [sqlite3_exec()] call are not -** reflected in subsequent calls to [sqlite3_errcode()] or -** [sqlite3_errmsg()]. -*/ -SQLITE_API int sqlite3_get_table( - sqlite3 *db, /* An open database */ - const char *zSql, /* SQL to be evaluated */ - char ***pazResult, /* Results of the query */ - int *pnRow, /* Number of result rows written here */ - int *pnColumn, /* Number of result columns written here */ - char **pzErrmsg /* Error msg written here */ -); -SQLITE_API void sqlite3_free_table(char **result); - -/* -** CAPI3REF: Formatted String Printing Functions -** -** These routines are work-alikes of the "printf()" family of functions -** from the standard C library. -** -** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their -** results into memory obtained from [sqlite3_malloc()]. -** The strings returned by these two routines should be -** released by [sqlite3_free()]. ^Both routines return a -** NULL pointer if [sqlite3_malloc()] is unable to allocate enough -** memory to hold the resulting string. -** -** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from -** the standard C library. The result is written into the -** buffer supplied as the second parameter whose size is given by -** the first parameter. Note that the order of the -** first two parameters is reversed from snprintf().)^ This is an -** historical accident that cannot be fixed without breaking -** backwards compatibility. ^(Note also that sqlite3_snprintf() -** returns a pointer to its buffer instead of the number of -** characters actually written into the buffer.)^ We admit that -** the number of characters written would be a more useful return -** value but we cannot change the implementation of sqlite3_snprintf() -** now without breaking compatibility. -** -** ^As long as the buffer size is greater than zero, sqlite3_snprintf() -** guarantees that the buffer is always zero-terminated. ^The first -** parameter "n" is the total size of the buffer, including space for -** the zero terminator. So the longest string that can be completely -** written will be n-1 characters. -** -** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). -** -** These routines all implement some additional formatting -** options that are useful for constructing SQL statements. -** All of the usual printf() formatting options apply. In addition, there -** is are "%q", "%Q", and "%z" options. -** -** ^(The %q option works like %s in that it substitutes a null-terminated -** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal.)^ By doubling each '\'' -** character it escapes that character and allows it to be inserted into -** the string. -** -** For example, assume the string variable zText contains text as follows: -** -**
-**  char *zText = "It's a happy day!";
-** 
-** -** One can use this text in an SQL statement as follows: -** -**
-**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
-**  sqlite3_exec(db, zSQL, 0, 0, 0);
-**  sqlite3_free(zSQL);
-** 
-** -** Because the %q format string is used, the '\'' character in zText -** is escaped and the SQL generated is as follows: -** -**
-**  INSERT INTO table1 VALUES('It''s a happy day!')
-** 
-** -** This is correct. Had we used %s instead of %q, the generated SQL -** would have looked like this: -** -**
-**  INSERT INTO table1 VALUES('It's a happy day!');
-** 
-** -** This second example is an SQL syntax error. As a general rule you should -** always use %q instead of %s when inserting text into a string literal. -** -** ^(The %Q option works like %q except it also adds single quotes around -** the outside of the total string. Additionally, if the parameter in the -** argument list is a NULL pointer, %Q substitutes the text "NULL" (without -** single quotes).)^ So, for example, one could say: -** -**
-**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
-**  sqlite3_exec(db, zSQL, 0, 0, 0);
-**  sqlite3_free(zSQL);
-** 
-** -** The code above will render a correct SQL statement in the zSQL -** variable even if the zText variable is a NULL pointer. -** -** ^(The "%z" formatting option works like "%s" but with the -** addition that after the string has been read and copied into -** the result, [sqlite3_free()] is called on the input string.)^ -*/ -SQLITE_API char *sqlite3_mprintf(const char*,...); -SQLITE_API char *sqlite3_vmprintf(const char*, va_list); -SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); -SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); - -/* -** CAPI3REF: Memory Allocation Subsystem -** -** The SQLite core uses these three routines for all of its own -** internal memory allocation needs. "Core" in the previous sentence -** does not include operating-system specific VFS implementation. The -** Windows VFS uses native malloc() and free() for some operations. -** -** ^The sqlite3_malloc() routine returns a pointer to a block -** of memory at least N bytes in length, where N is the parameter. -** ^If sqlite3_malloc() is unable to obtain sufficient free -** memory, it returns a NULL pointer. ^If the parameter N to -** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns -** a NULL pointer. -** -** ^Calling sqlite3_free() with a pointer previously returned -** by sqlite3_malloc() or sqlite3_realloc() releases that memory so -** that it might be reused. ^The sqlite3_free() routine is -** a no-op if is called with a NULL pointer. Passing a NULL pointer -** to sqlite3_free() is harmless. After being freed, memory -** should neither be read nor written. Even reading previously freed -** memory might result in a segmentation fault or other severe error. -** Memory corruption, a segmentation fault, or other severe error -** might result if sqlite3_free() is called with a non-NULL pointer that -** was not obtained from sqlite3_malloc() or sqlite3_realloc(). -** -** ^(The sqlite3_realloc() interface attempts to resize a -** prior memory allocation to be at least N bytes, where N is the -** second parameter. The memory allocation to be resized is the first -** parameter.)^ ^ If the first parameter to sqlite3_realloc() -** is a NULL pointer then its behavior is identical to calling -** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc(). -** ^If the second parameter to sqlite3_realloc() is zero or -** negative then the behavior is exactly the same as calling -** sqlite3_free(P) where P is the first parameter to sqlite3_realloc(). -** ^sqlite3_realloc() returns a pointer to a memory allocation -** of at least N bytes in size or NULL if sufficient memory is unavailable. -** ^If M is the size of the prior allocation, then min(N,M) bytes -** of the prior allocation are copied into the beginning of buffer returned -** by sqlite3_realloc() and the prior allocation is freed. -** ^If sqlite3_realloc() returns NULL, then the prior allocation -** is not freed. -** -** ^The memory returned by sqlite3_malloc() and sqlite3_realloc() -** is always aligned to at least an 8 byte boundary, or to a -** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time -** option is used. -** -** In SQLite version 3.5.0 and 3.5.1, it was possible to define -** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in -** implementation of these routines to be omitted. That capability -** is no longer provided. Only built-in memory allocators can be used. -** -** The Windows OS interface layer calls -** the system malloc() and free() directly when converting -** filenames between the UTF-8 encoding used by SQLite -** and whatever filename encoding is used by the particular Windows -** installation. Memory allocation errors are detected, but -** they are reported back as [SQLITE_CANTOPEN] or -** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. -** -** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] -** must be either NULL or else pointers obtained from a prior -** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have -** not yet been released. -** -** The application must not read or write any part of -** a block of memory after it has been released using -** [sqlite3_free()] or [sqlite3_realloc()]. -*/ -SQLITE_API void *sqlite3_malloc(int); -SQLITE_API void *sqlite3_realloc(void*, int); -SQLITE_API void sqlite3_free(void*); - -/* -** CAPI3REF: Memory Allocator Statistics -** -** SQLite provides these two interfaces for reporting on the status -** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] -** routines, which form the built-in memory allocation subsystem. -** -** ^The [sqlite3_memory_used()] routine returns the number of bytes -** of memory currently outstanding (malloced but not freed). -** ^The [sqlite3_memory_highwater()] routine returns the maximum -** value of [sqlite3_memory_used()] since the high-water mark -** was last reset. ^The values returned by [sqlite3_memory_used()] and -** [sqlite3_memory_highwater()] include any overhead -** added by SQLite in its implementation of [sqlite3_malloc()], -** but not overhead added by the any underlying system library -** routines that [sqlite3_malloc()] may call. -** -** ^The memory high-water mark is reset to the current value of -** [sqlite3_memory_used()] if and only if the parameter to -** [sqlite3_memory_highwater()] is true. ^The value returned -** by [sqlite3_memory_highwater(1)] is the high-water mark -** prior to the reset. -*/ -SQLITE_API sqlite3_int64 sqlite3_memory_used(void); -SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); - -/* -** CAPI3REF: Pseudo-Random Number Generator -** -** SQLite contains a high-quality pseudo-random number generator (PRNG) used to -** select random [ROWID | ROWIDs] when inserting new records into a table that -** already uses the largest possible [ROWID]. The PRNG is also used for -** the build-in random() and randomblob() SQL functions. This interface allows -** applications to access the same PRNG for other purposes. -** -** ^A call to this routine stores N bytes of randomness into buffer P. -** -** ^The first time this routine is invoked (either internally or by -** the application) the PRNG is seeded using randomness obtained -** from the xRandomness method of the default [sqlite3_vfs] object. -** ^On all subsequent invocations, the pseudo-randomness is generated -** internally and without recourse to the [sqlite3_vfs] xRandomness -** method. -*/ -SQLITE_API void sqlite3_randomness(int N, void *P); - -/* -** CAPI3REF: Compile-Time Authorization Callbacks -** -** ^This routine registers a authorizer callback with a particular -** [database connection], supplied in the first argument. -** ^The authorizer callback is invoked as SQL statements are being compiled -** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various -** points during the compilation process, as logic is being created -** to perform various actions, the authorizer callback is invoked to -** see if those actions are allowed. ^The authorizer callback should -** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the -** specific action but allow the SQL statement to continue to be -** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be -** rejected with an error. ^If the authorizer callback returns -** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] -** then the [sqlite3_prepare_v2()] or equivalent call that triggered -** the authorizer will fail with an error message. -** -** When the callback returns [SQLITE_OK], that means the operation -** requested is ok. ^When the callback returns [SQLITE_DENY], the -** [sqlite3_prepare_v2()] or equivalent call that triggered the -** authorizer will fail with an error message explaining that -** access is denied. -** -** ^The first parameter to the authorizer callback is a copy of the third -** parameter to the sqlite3_set_authorizer() interface. ^The second parameter -** to the callback is an integer [SQLITE_COPY | action code] that specifies -** the particular action to be authorized. ^The third through sixth parameters -** to the callback are zero-terminated strings that contain additional -** details about the action to be authorized. -** -** ^If the action code is [SQLITE_READ] -** and the callback returns [SQLITE_IGNORE] then the -** [prepared statement] statement is constructed to substitute -** a NULL value in place of the table column that would have -** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] -** return can be used to deny an untrusted user access to individual -** columns of a table. -** ^If the action code is [SQLITE_DELETE] and the callback returns -** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the -** [truncate optimization] is disabled and all rows are deleted individually. -** -** An authorizer is used when [sqlite3_prepare | preparing] -** SQL statements from an untrusted source, to ensure that the SQL statements -** do not try to access data they are not allowed to see, or that they do not -** try to execute malicious statements that damage the database. For -** example, an application may allow a user to enter arbitrary -** SQL queries for evaluation by a database. But the application does -** not want the user to be able to make arbitrary changes to the -** database. An authorizer could then be put in place while the -** user-entered SQL is being [sqlite3_prepare | prepared] that -** disallows everything except [SELECT] statements. -** -** Applications that need to process SQL from untrusted sources -** might also consider lowering resource limits using [sqlite3_limit()] -** and limiting database size using the [max_page_count] [PRAGMA] -** in addition to using an authorizer. -** -** ^(Only a single authorizer can be in place on a database connection -** at a time. Each call to sqlite3_set_authorizer overrides the -** previous call.)^ ^Disable the authorizer by installing a NULL callback. -** The authorizer is disabled by default. -** -** The authorizer callback must not do anything that will modify -** the database connection that invoked the authorizer callback. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the -** statement might be re-prepared during [sqlite3_step()] due to a -** schema change. Hence, the application should ensure that the -** correct authorizer callback remains in place during the [sqlite3_step()]. -** -** ^Note that the authorizer callback is invoked only during -** [sqlite3_prepare()] or its variants. Authorization is not -** performed during statement evaluation in [sqlite3_step()], unless -** as stated in the previous paragraph, sqlite3_step() invokes -** sqlite3_prepare_v2() to reprepare a statement after a schema change. -*/ -SQLITE_API int sqlite3_set_authorizer( - sqlite3*, - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), - void *pUserData -); - -/* -** CAPI3REF: Authorizer Return Codes -** -** The [sqlite3_set_authorizer | authorizer callback function] must -** return either [SQLITE_OK] or one of these two constants in order -** to signal SQLite whether or not the action is permitted. See the -** [sqlite3_set_authorizer | authorizer documentation] for additional -** information. -*/ -#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ -#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ - -/* -** CAPI3REF: Authorizer Action Codes -** -** The [sqlite3_set_authorizer()] interface registers a callback function -** that is invoked to authorize certain SQL statement actions. The -** second parameter to the callback is an integer code that specifies -** what action is being authorized. These are the integer action codes that -** the authorizer callback may be passed. -** -** These action code values signify what kind of operation is to be -** authorized. The 3rd and 4th parameters to the authorization -** callback function will be parameters or NULL depending on which of these -** codes is used as the second parameter. ^(The 5th parameter to the -** authorizer callback is the name of the database ("main", "temp", -** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback -** is the name of the inner-most trigger or view that is responsible for -** the access attempt or NULL if this access attempt is directly from -** top-level SQL code. -*/ -/******************************************* 3rd ************ 4th ***********/ -#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ -#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ -#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ -#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ -#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ -#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ -#define SQLITE_DELETE 9 /* Table Name NULL */ -#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ -#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ -#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ -#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ -#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ -#define SQLITE_DROP_VIEW 17 /* View Name NULL */ -#define SQLITE_INSERT 18 /* Table Name NULL */ -#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ -#define SQLITE_READ 20 /* Table Name Column Name */ -#define SQLITE_SELECT 21 /* NULL NULL */ -#define SQLITE_TRANSACTION 22 /* Operation NULL */ -#define SQLITE_UPDATE 23 /* Table Name Column Name */ -#define SQLITE_ATTACH 24 /* Filename NULL */ -#define SQLITE_DETACH 25 /* Database Name NULL */ -#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ -#define SQLITE_REINDEX 27 /* Index Name NULL */ -#define SQLITE_ANALYZE 28 /* Table Name NULL */ -#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ -#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ -#define SQLITE_FUNCTION 31 /* NULL Function Name */ -#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ -#define SQLITE_COPY 0 /* No longer used */ - -/* -** CAPI3REF: Tracing And Profiling Functions -** -** These routines register callback functions that can be used for -** tracing and profiling the execution of SQL statements. -** -** ^The callback function registered by sqlite3_trace() is invoked at -** various times when an SQL statement is being run by [sqlite3_step()]. -** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the -** SQL statement text as the statement first begins executing. -** ^(Additional sqlite3_trace() callbacks might occur -** as each triggered subprogram is entered. The callbacks for triggers -** contain a UTF-8 SQL comment that identifies the trigger.)^ -** -** ^The callback function registered by sqlite3_profile() is invoked -** as each SQL statement finishes. ^The profile callback contains -** the original statement text and an estimate of wall-clock time -** of how long that statement took to run. ^The profile callback -** time is in units of nanoseconds, however the current implementation -** is only capable of millisecond resolution so the six least significant -** digits in the time are meaningless. Future versions of SQLite -** might provide greater resolution on the profiler callback. The -** sqlite3_profile() function is considered experimental and is -** subject to change in future versions of SQLite. -*/ -SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); -SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*, - void(*xProfile)(void*,const char*,sqlite3_uint64), void*); - -/* -** CAPI3REF: Query Progress Callbacks -** -** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback -** function X to be invoked periodically during long running calls to -** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for -** database connection D. An example use for this -** interface is to keep a GUI updated during a large query. -** -** ^The parameter P is passed through as the only parameter to the -** callback function X. ^The parameter N is the number of -** [virtual machine instructions] that are evaluated between successive -** invocations of the callback X. -** -** ^Only a single progress handler may be defined at one time per -** [database connection]; setting a new progress handler cancels the -** old one. ^Setting parameter X to NULL disables the progress handler. -** ^The progress handler is also disabled by setting N to a value less -** than 1. -** -** ^If the progress callback returns non-zero, the operation is -** interrupted. This feature can be used to implement a -** "Cancel" button on a GUI progress dialog box. -** -** The progress handler callback must not do anything that will modify -** the database connection that invoked the progress handler. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -*/ -SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); - -/* -** CAPI3REF: Opening A New Database Connection -** -** ^These routines open an SQLite database file whose name is given by the -** filename argument. ^The filename argument is interpreted as UTF-8 for -** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte -** order for sqlite3_open16(). ^(A [database connection] handle is usually -** returned in *ppDb, even if an error occurs. The only exception is that -** if SQLite is unable to allocate memory to hold the [sqlite3] object, -** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] -** object.)^ ^(If the database is opened (and/or created) successfully, then -** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The -** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain -** an English language description of the error following a failure of any -** of the sqlite3_open() routines. -** -** ^The default encoding for the database will be UTF-8 if -** sqlite3_open() or sqlite3_open_v2() is called and -** UTF-16 in the native byte order if sqlite3_open16() is used. -** -** Whether or not an error occurs when it is opened, resources -** associated with the [database connection] handle should be released by -** passing it to [sqlite3_close()] when it is no longer required. -** -** The sqlite3_open_v2() interface works like sqlite3_open() -** except that it accepts two additional parameters for additional control -** over the new database connection. ^(The flags parameter to -** sqlite3_open_v2() can take one of -** the following three values, optionally combined with the -** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], -** and/or [SQLITE_OPEN_PRIVATECACHE] flags:)^ -** -**
-** ^(
[SQLITE_OPEN_READONLY]
-**
The database is opened in read-only mode. If the database does not -** already exist, an error is returned.
)^ -** -** ^(
[SQLITE_OPEN_READWRITE]
-**
The database is opened for reading and writing if possible, or reading -** only if the file is write protected by the operating system. In either -** case the database must already exist, otherwise an error is returned.
)^ -** -** ^(
[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
-**
The database is opened for reading and writing, and is created if -** it does not already exist. This is the behavior that is always used for -** sqlite3_open() and sqlite3_open16().
)^ -**
-** -** If the 3rd parameter to sqlite3_open_v2() is not one of the -** combinations shown above or one of the combinations shown above combined -** with the [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], -** [SQLITE_OPEN_SHAREDCACHE] and/or [SQLITE_OPEN_PRIVATECACHE] flags, -** then the behavior is undefined. -** -** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection -** opens in the multi-thread [threading mode] as long as the single-thread -** mode has not been set at compile-time or start-time. ^If the -** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens -** in the serialized [threading mode] unless single-thread was -** previously selected at compile-time or start-time. -** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be -** eligible to use [shared cache mode], regardless of whether or not shared -** cache is enabled using [sqlite3_enable_shared_cache()]. ^The -** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not -** participate in [shared cache mode] even if it is enabled. -** -** ^If the filename is ":memory:", then a private, temporary in-memory database -** is created for the connection. ^This in-memory database will vanish when -** the database connection is closed. Future versions of SQLite might -** make use of additional special filenames that begin with the ":" character. -** It is recommended that when a database filename actually does begin with -** a ":" character you should prefix the filename with a pathname such as -** "./" to avoid ambiguity. -** -** ^If the filename is an empty string, then a private, temporary -** on-disk database will be created. ^This private database will be -** automatically deleted as soon as the database connection is closed. -** -** ^The fourth parameter to sqlite3_open_v2() is the name of the -** [sqlite3_vfs] object that defines the operating system interface that -** the new database connection should use. ^If the fourth parameter is -** a NULL pointer then the default [sqlite3_vfs] object is used. -** -** Note to Windows users: The encoding used for the filename argument -** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever -** codepage is currently defined. Filenames containing international -** characters must be converted to UTF-8 prior to passing them into -** sqlite3_open() or sqlite3_open_v2(). -*/ -SQLITE_API int sqlite3_open( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -SQLITE_API int sqlite3_open16( - const void *filename, /* Database filename (UTF-16) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -SQLITE_API int sqlite3_open_v2( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb, /* OUT: SQLite db handle */ - int flags, /* Flags */ - const char *zVfs /* Name of VFS module to use */ -); - -/* -** CAPI3REF: Error Codes And Messages -** -** ^The sqlite3_errcode() interface returns the numeric [result code] or -** [extended result code] for the most recent failed sqlite3_* API call -** associated with a [database connection]. If a prior API call failed -** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() -** interface is the same except that it always returns the -** [extended result code] even when extended result codes are -** disabled. -** -** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language -** text that describes the error, as either UTF-8 or UTF-16 respectively. -** ^(Memory to hold the error message string is managed internally. -** The application does not need to worry about freeing the result. -** However, the error string might be overwritten or deallocated by -** subsequent calls to other SQLite interface functions.)^ -** -** When the serialized [threading mode] is in use, it might be the -** case that a second error occurs on a separate thread in between -** the time of the first error and the call to these interfaces. -** When that happens, the second error will be reported since these -** interfaces always report the most recent result. To avoid -** this, each thread can obtain exclusive use of the [database connection] D -** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning -** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after -** all calls to the interfaces listed here are completed. -** -** If an interface fails with SQLITE_MISUSE, that means the interface -** was invoked incorrectly by the application. In that case, the -** error code and message may or may not be set. -*/ -SQLITE_API int sqlite3_errcode(sqlite3 *db); -SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); -SQLITE_API const char *sqlite3_errmsg(sqlite3*); -SQLITE_API const void *sqlite3_errmsg16(sqlite3*); - -/* -** CAPI3REF: SQL Statement Object -** KEYWORDS: {prepared statement} {prepared statements} -** -** An instance of this object represents a single SQL statement. -** This object is variously known as a "prepared statement" or a -** "compiled SQL statement" or simply as a "statement". -** -** The life of a statement object goes something like this: -** -**
    -**
  1. Create the object using [sqlite3_prepare_v2()] or a related -** function. -**
  2. Bind values to [host parameters] using the sqlite3_bind_*() -** interfaces. -**
  3. Run the SQL by calling [sqlite3_step()] one or more times. -**
  4. Reset the statement using [sqlite3_reset()] then go back -** to step 2. Do this zero or more times. -**
  5. Destroy the object using [sqlite3_finalize()]. -**
-** -** Refer to documentation on individual methods above for additional -** information. -*/ -typedef struct sqlite3_stmt sqlite3_stmt; - -/* -** CAPI3REF: Run-time Limits -** -** ^(This interface allows the size of various constructs to be limited -** on a connection by connection basis. The first parameter is the -** [database connection] whose limit is to be set or queried. The -** second parameter is one of the [limit categories] that define a -** class of constructs to be size limited. The third parameter is the -** new limit for that construct.)^ -** -** ^If the new limit is a negative number, the limit is unchanged. -** ^(For each limit category SQLITE_LIMIT_NAME there is a -** [limits | hard upper bound] -** set at compile-time by a C preprocessor macro called -** [limits | SQLITE_MAX_NAME]. -** (The "_LIMIT_" in the name is changed to "_MAX_".))^ -** ^Attempts to increase a limit above its hard upper bound are -** silently truncated to the hard upper bound. -** -** ^Regardless of whether or not the limit was changed, the -** [sqlite3_limit()] interface returns the prior value of the limit. -** ^Hence, to find the current value of a limit without changing it, -** simply invoke this interface with the third parameter set to -1. -** -** Run-time limits are intended for use in applications that manage -** both their own internal database and also databases that are controlled -** by untrusted external sources. An example application might be a -** web browser that has its own databases for storing history and -** separate databases controlled by JavaScript applications downloaded -** off the Internet. The internal databases can be given the -** large, default limits. Databases managed by external sources can -** be given much smaller limits designed to prevent a denial of service -** attack. Developers might also want to use the [sqlite3_set_authorizer()] -** interface to further control untrusted SQL. The size of the database -** created by an untrusted script can be contained using the -** [max_page_count] [PRAGMA]. -** -** New run-time limit categories may be added in future releases. -*/ -SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); - -/* -** CAPI3REF: Run-Time Limit Categories -** KEYWORDS: {limit category} {*limit categories} -** -** These constants define various performance limits -** that can be lowered at run-time using [sqlite3_limit()]. -** The synopsis of the meanings of the various limits is shown below. -** Additional information is available at [limits | Limits in SQLite]. -** -**
-** ^(
SQLITE_LIMIT_LENGTH
-**
The maximum size of any string or BLOB or table row, in bytes.
)^ -** -** ^(
SQLITE_LIMIT_SQL_LENGTH
-**
The maximum length of an SQL statement, in bytes.
)^ -** -** ^(
SQLITE_LIMIT_COLUMN
-**
The maximum number of columns in a table definition or in the -** result set of a [SELECT] or the maximum number of columns in an index -** or in an ORDER BY or GROUP BY clause.
)^ -** -** ^(
SQLITE_LIMIT_EXPR_DEPTH
-**
The maximum depth of the parse tree on any expression.
)^ -** -** ^(
SQLITE_LIMIT_COMPOUND_SELECT
-**
The maximum number of terms in a compound SELECT statement.
)^ -** -** ^(
SQLITE_LIMIT_VDBE_OP
-**
The maximum number of instructions in a virtual machine program -** used to implement an SQL statement. This limit is not currently -** enforced, though that might be added in some future release of -** SQLite.
)^ -** -** ^(
SQLITE_LIMIT_FUNCTION_ARG
-**
The maximum number of arguments on a function.
)^ -** -** ^(
SQLITE_LIMIT_ATTACHED
-**
The maximum number of [ATTACH | attached databases].)^
-** -** ^(
SQLITE_LIMIT_LIKE_PATTERN_LENGTH
-**
The maximum length of the pattern argument to the [LIKE] or -** [GLOB] operators.
)^ -** -** ^(
SQLITE_LIMIT_VARIABLE_NUMBER
-**
The maximum index number of any [parameter] in an SQL statement.)^ -** -** ^(
SQLITE_LIMIT_TRIGGER_DEPTH
-**
The maximum depth of recursion for triggers.
)^ -**
-*/ -#define SQLITE_LIMIT_LENGTH 0 -#define SQLITE_LIMIT_SQL_LENGTH 1 -#define SQLITE_LIMIT_COLUMN 2 -#define SQLITE_LIMIT_EXPR_DEPTH 3 -#define SQLITE_LIMIT_COMPOUND_SELECT 4 -#define SQLITE_LIMIT_VDBE_OP 5 -#define SQLITE_LIMIT_FUNCTION_ARG 6 -#define SQLITE_LIMIT_ATTACHED 7 -#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 -#define SQLITE_LIMIT_VARIABLE_NUMBER 9 -#define SQLITE_LIMIT_TRIGGER_DEPTH 10 - -/* -** CAPI3REF: Compiling An SQL Statement -** KEYWORDS: {SQL statement compiler} -** -** To execute an SQL query, it must first be compiled into a byte-code -** program using one of these routines. -** -** The first argument, "db", is a [database connection] obtained from a -** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or -** [sqlite3_open16()]. The database connection must not have been closed. -** -** The second argument, "zSql", is the statement to be compiled, encoded -** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() -** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() -** use UTF-16. -** -** ^If the nByte argument is less than zero, then zSql is read up to the -** first zero terminator. ^If nByte is non-negative, then it is the maximum -** number of bytes read from zSql. ^When nByte is non-negative, the -** zSql string ends at either the first '\000' or '\u0000' character or -** the nByte-th byte, whichever comes first. If the caller knows -** that the supplied string is nul-terminated, then there is a small -** performance advantage to be gained by passing an nByte parameter that -** is equal to the number of bytes in the input string including -** the nul-terminator bytes. -** -** ^If pzTail is not NULL then *pzTail is made to point to the first byte -** past the end of the first SQL statement in zSql. These routines only -** compile the first statement in zSql, so *pzTail is left pointing to -** what remains uncompiled. -** -** ^*ppStmt is left pointing to a compiled [prepared statement] that can be -** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set -** to NULL. ^If the input text contains no SQL (if the input is an empty -** string or a comment) then *ppStmt is set to NULL. -** The calling procedure is responsible for deleting the compiled -** SQL statement using [sqlite3_finalize()] after it has finished with it. -** ppStmt may not be NULL. -** -** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; -** otherwise an [error code] is returned. -** -** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are -** recommended for all new programs. The two older interfaces are retained -** for backwards compatibility, but their use is discouraged. -** ^In the "v2" interfaces, the prepared statement -** that is returned (the [sqlite3_stmt] object) contains a copy of the -** original SQL text. This causes the [sqlite3_step()] interface to -** behave differently in three ways: -** -**
    -**
  1. -** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it -** always used to do, [sqlite3_step()] will automatically recompile the SQL -** statement and try to run it again. -**
  2. -** -**
  3. -** ^When an error occurs, [sqlite3_step()] will return one of the detailed -** [error codes] or [extended error codes]. ^The legacy behavior was that -** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code -** and the application would have to make a second call to [sqlite3_reset()] -** in order to find the underlying cause of the problem. With the "v2" prepare -** interfaces, the underlying reason for the error is returned immediately. -**
  4. -** -**
  5. -** ^If the specific value bound to [parameter | host parameter] in the -** WHERE clause might influence the choice of query plan for a statement, -** then the statement will be automatically recompiled, as if there had been -** a schema change, on the first [sqlite3_step()] call following any change -** to the [sqlite3_bind_text | bindings] of that [parameter]. -** ^The specific value of WHERE-clause [parameter] might influence the -** choice of query plan if the parameter is the left-hand side of a [LIKE] -** or [GLOB] operator or if the parameter is compared to an indexed column -** and the [SQLITE_ENABLE_STAT2] compile-time option is enabled. -** the -**
  6. -**
-*/ -SQLITE_API int sqlite3_prepare( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare_v2( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare16( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare16_v2( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); - -/* -** CAPI3REF: Retrieving Statement SQL -** -** ^This interface can be used to retrieve a saved copy of the original -** SQL text used to create a [prepared statement] if that statement was -** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. -*/ -SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Determine If An SQL Statement Writes The Database -** -** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if -** and only if the [prepared statement] X makes no direct changes to -** the content of the database file. -** -** Note that [application-defined SQL functions] or -** [virtual tables] might change the database indirectly as a side effect. -** ^(For example, if an application defines a function "eval()" that -** calls [sqlite3_exec()], then the following SQL statement would -** change the database file through side-effects: -** -**
-**    SELECT eval('DELETE FROM t1') FROM t2;
-** 
-** -** But because the [SELECT] statement does not change the database file -** directly, sqlite3_stmt_readonly() would still return true.)^ -** -** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], -** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, -** since the statements themselves do not actually modify the database but -** rather they control the timing of when other statements modify the -** database. ^The [ATTACH] and [DETACH] statements also cause -** sqlite3_stmt_readonly() to return true since, while those statements -** change the configuration of a database connection, they do not make -** changes to the content of the database files on disk. -*/ -SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Dynamically Typed Value Object -** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} -** -** SQLite uses the sqlite3_value object to represent all values -** that can be stored in a database table. SQLite uses dynamic typing -** for the values it stores. ^Values stored in sqlite3_value objects -** can be integers, floating point values, strings, BLOBs, or NULL. -** -** An sqlite3_value object may be either "protected" or "unprotected". -** Some interfaces require a protected sqlite3_value. Other interfaces -** will accept either a protected or an unprotected sqlite3_value. -** Every interface that accepts sqlite3_value arguments specifies -** whether or not it requires a protected sqlite3_value. -** -** The terms "protected" and "unprotected" refer to whether or not -** a mutex is held. A internal mutex is held for a protected -** sqlite3_value object but no mutex is held for an unprotected -** sqlite3_value object. If SQLite is compiled to be single-threaded -** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) -** or if SQLite is run in one of reduced mutex modes -** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] -** then there is no distinction between protected and unprotected -** sqlite3_value objects and they can be used interchangeably. However, -** for maximum code portability it is recommended that applications -** still make the distinction between protected and unprotected -** sqlite3_value objects even when not strictly required. -** -** ^The sqlite3_value objects that are passed as parameters into the -** implementation of [application-defined SQL functions] are protected. -** ^The sqlite3_value object returned by -** [sqlite3_column_value()] is unprotected. -** Unprotected sqlite3_value objects may only be used with -** [sqlite3_result_value()] and [sqlite3_bind_value()]. -** The [sqlite3_value_blob | sqlite3_value_type()] family of -** interfaces require protected sqlite3_value objects. -*/ -typedef struct Mem sqlite3_value; - -/* -** CAPI3REF: SQL Function Context Object -** -** The context in which an SQL function executes is stored in an -** sqlite3_context object. ^A pointer to an sqlite3_context object -** is always first parameter to [application-defined SQL functions]. -** The application-defined SQL function implementation will pass this -** pointer through into calls to [sqlite3_result_int | sqlite3_result()], -** [sqlite3_aggregate_context()], [sqlite3_user_data()], -** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], -** and/or [sqlite3_set_auxdata()]. -*/ -typedef struct sqlite3_context sqlite3_context; - -/* -** CAPI3REF: Binding Values To Prepared Statements -** KEYWORDS: {host parameter} {host parameters} {host parameter name} -** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} -** -** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, -** literals may be replaced by a [parameter] that matches one of following -** templates: -** -**
    -**
  • ? -**
  • ?NNN -**
  • :VVV -**
  • @VVV -**
  • $VVV -**
-** -** In the templates above, NNN represents an integer literal, -** and VVV represents an alphanumeric identifier.)^ ^The values of these -** parameters (also called "host parameter names" or "SQL parameters") -** can be set using the sqlite3_bind_*() routines defined here. -** -** ^The first argument to the sqlite3_bind_*() routines is always -** a pointer to the [sqlite3_stmt] object returned from -** [sqlite3_prepare_v2()] or its variants. -** -** ^The second argument is the index of the SQL parameter to be set. -** ^The leftmost SQL parameter has an index of 1. ^When the same named -** SQL parameter is used more than once, second and subsequent -** occurrences have the same index as the first occurrence. -** ^The index for named parameters can be looked up using the -** [sqlite3_bind_parameter_index()] API if desired. ^The index -** for "?NNN" parameters is the value of NNN. -** ^The NNN value must be between 1 and the [sqlite3_limit()] -** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). -** -** ^The third argument is the value to bind to the parameter. -** -** ^(In those routines that have a fourth argument, its value is the -** number of bytes in the parameter. To be clear: the value is the -** number of bytes in the value, not the number of characters.)^ -** ^If the fourth parameter is negative, the length of the string is -** the number of bytes up to the first zero terminator. -** -** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and -** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or -** string after SQLite has finished with it. ^The destructor is called -** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(), -** sqlite3_bind_text(), or sqlite3_bind_text16() fails. -** ^If the fifth argument is -** the special value [SQLITE_STATIC], then SQLite assumes that the -** information is in static, unmanaged space and does not need to be freed. -** ^If the fifth argument has the value [SQLITE_TRANSIENT], then -** SQLite makes its own private copy of the data immediately, before -** the sqlite3_bind_*() routine returns. -** -** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that -** is filled with zeroes. ^A zeroblob uses a fixed amount of memory -** (just an integer to hold its size) while it is being processed. -** Zeroblobs are intended to serve as placeholders for BLOBs whose -** content is later written using -** [sqlite3_blob_open | incremental BLOB I/O] routines. -** ^A negative value for the zeroblob results in a zero-length BLOB. -** -** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer -** for the [prepared statement] or with a prepared statement for which -** [sqlite3_step()] has been called more recently than [sqlite3_reset()], -** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() -** routine is passed a [prepared statement] that has been finalized, the -** result is undefined and probably harmful. -** -** ^Bindings are not cleared by the [sqlite3_reset()] routine. -** ^Unbound parameters are interpreted as NULL. -** -** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an -** [error code] if anything goes wrong. -** ^[SQLITE_RANGE] is returned if the parameter -** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. -** -** See also: [sqlite3_bind_parameter_count()], -** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); -SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); -SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); -SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); -SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); -SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); -SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); -SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); -SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); - -/* -** CAPI3REF: Number Of SQL Parameters -** -** ^This routine can be used to find the number of [SQL parameters] -** in a [prepared statement]. SQL parameters are tokens of the -** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as -** placeholders for values that are [sqlite3_bind_blob | bound] -** to the parameters at a later time. -** -** ^(This routine actually returns the index of the largest (rightmost) -** parameter. For all forms except ?NNN, this will correspond to the -** number of unique parameters. If parameters of the ?NNN form are used, -** there may be gaps in the list.)^ -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_name()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); - -/* -** CAPI3REF: Name Of A Host Parameter -** -** ^The sqlite3_bind_parameter_name(P,N) interface returns -** the name of the N-th [SQL parameter] in the [prepared statement] P. -** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" -** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" -** respectively. -** In other words, the initial ":" or "$" or "@" or "?" -** is included as part of the name.)^ -** ^Parameters of the form "?" without a following integer have no name -** and are referred to as "nameless" or "anonymous parameters". -** -** ^The first host parameter has an index of 1, not 0. -** -** ^If the value N is out of range or if the N-th parameter is -** nameless, then NULL is returned. ^The returned string is -** always in UTF-8 encoding even if the named parameter was -** originally specified as UTF-16 in [sqlite3_prepare16()] or -** [sqlite3_prepare16_v2()]. -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); - -/* -** CAPI3REF: Index Of A Parameter With A Given Name -** -** ^Return the index of an SQL parameter given its name. ^The -** index value returned is suitable for use as the second -** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero -** is returned if no matching parameter is found. ^The parameter -** name must be given in UTF-8 even if the original statement -** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); - -/* -** CAPI3REF: Reset All Bindings On A Prepared Statement -** -** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset -** the [sqlite3_bind_blob | bindings] on a [prepared statement]. -** ^Use this routine to reset all host parameters to NULL. -*/ -SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); - -/* -** CAPI3REF: Number Of Columns In A Result Set -** -** ^Return the number of columns in the result set returned by the -** [prepared statement]. ^This routine returns 0 if pStmt is an SQL -** statement that does not return data (for example an [UPDATE]). -** -** See also: [sqlite3_data_count()] -*/ -SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Column Names In A Result Set -** -** ^These routines return the name assigned to a particular column -** in the result set of a [SELECT] statement. ^The sqlite3_column_name() -** interface returns a pointer to a zero-terminated UTF-8 string -** and sqlite3_column_name16() returns a pointer to a zero-terminated -** UTF-16 string. ^The first parameter is the [prepared statement] -** that implements the [SELECT] statement. ^The second parameter is the -** column number. ^The leftmost column is number 0. -** -** ^The returned string pointer is valid until either the [prepared statement] -** is destroyed by [sqlite3_finalize()] or until the next call to -** sqlite3_column_name() or sqlite3_column_name16() on the same column. -** -** ^If sqlite3_malloc() fails during the processing of either routine -** (for example during a conversion from UTF-8 to UTF-16) then a -** NULL pointer is returned. -** -** ^The name of a result column is the value of the "AS" clause for -** that column, if there is an AS clause. If there is no AS clause -** then the name of the column is unspecified and may change from -** one release of SQLite to the next. -*/ -SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); -SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); - -/* -** CAPI3REF: Source Of Data In A Query Result -** -** ^These routines provide a means to determine the database, table, and -** table column that is the origin of a particular result column in -** [SELECT] statement. -** ^The name of the database or table or column can be returned as -** either a UTF-8 or UTF-16 string. ^The _database_ routines return -** the database name, the _table_ routines return the table name, and -** the origin_ routines return the column name. -** ^The returned string is valid until the [prepared statement] is destroyed -** using [sqlite3_finalize()] or until the same information is requested -** again in a different encoding. -** -** ^The names returned are the original un-aliased names of the -** database, table, and column. -** -** ^The first argument to these interfaces is a [prepared statement]. -** ^These functions return information about the Nth result column returned by -** the statement, where N is the second function argument. -** ^The left-most column is column 0 for these routines. -** -** ^If the Nth column returned by the statement is an expression or -** subquery and is not a column value, then all of these functions return -** NULL. ^These routine might also return NULL if a memory allocation error -** occurs. ^Otherwise, they return the name of the attached database, table, -** or column that query result column was extracted from. -** -** ^As with all other SQLite APIs, those whose names end with "16" return -** UTF-16 encoded strings and the other functions return UTF-8. -** -** ^These APIs are only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. -** -** If two or more threads call one or more of these routines against the same -** prepared statement and column at the same time then the results are -** undefined. -** -** If two or more threads call one or more -** [sqlite3_column_database_name | column metadata interfaces] -** for the same [prepared statement] and result column -** at the same time then the results are undefined. -*/ -SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); -SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); -SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Declared Datatype Of A Query Result -** -** ^(The first parameter is a [prepared statement]. -** If this statement is a [SELECT] statement and the Nth column of the -** returned result set of that [SELECT] is a table column (not an -** expression or subquery) then the declared type of the table -** column is returned.)^ ^If the Nth column of the result set is an -** expression or subquery, then a NULL pointer is returned. -** ^The returned string is always UTF-8 encoded. -** -** ^(For example, given the database schema: -** -** CREATE TABLE t1(c1 VARIANT); -** -** and the following statement to be compiled: -** -** SELECT c1 + 1, c1 FROM t1; -** -** this routine would return the string "VARIANT" for the second result -** column (i==1), and a NULL pointer for the first result column (i==0).)^ -** -** ^SQLite uses dynamic run-time typing. ^So just because a column -** is declared to contain a particular type does not mean that the -** data stored in that column is of the declared type. SQLite is -** strongly typed, but the typing is dynamic not static. ^Type -** is associated with individual values, not with the containers -** used to hold those values. -*/ -SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Evaluate An SQL Statement -** -** After a [prepared statement] has been prepared using either -** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy -** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function -** must be called one or more times to evaluate the statement. -** -** The details of the behavior of the sqlite3_step() interface depend -** on whether the statement was prepared using the newer "v2" interface -** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy -** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the -** new "v2" interface is recommended for new applications but the legacy -** interface will continue to be supported. -** -** ^In the legacy interface, the return value will be either [SQLITE_BUSY], -** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. -** ^With the "v2" interface, any of the other [result codes] or -** [extended result codes] might be returned as well. -** -** ^[SQLITE_BUSY] means that the database engine was unable to acquire the -** database locks it needs to do its job. ^If the statement is a [COMMIT] -** or occurs outside of an explicit transaction, then you can retry the -** statement. If the statement is not a [COMMIT] and occurs within a -** explicit transaction then you should rollback the transaction before -** continuing. -** -** ^[SQLITE_DONE] means that the statement has finished executing -** successfully. sqlite3_step() should not be called again on this virtual -** machine without first calling [sqlite3_reset()] to reset the virtual -** machine back to its initial state. -** -** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] -** is returned each time a new row of data is ready for processing by the -** caller. The values may be accessed using the [column access functions]. -** sqlite3_step() is called again to retrieve the next row of data. -** -** ^[SQLITE_ERROR] means that a run-time error (such as a constraint -** violation) has occurred. sqlite3_step() should not be called again on -** the VM. More information may be found by calling [sqlite3_errmsg()]. -** ^With the legacy interface, a more specific error code (for example, -** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) -** can be obtained by calling [sqlite3_reset()] on the -** [prepared statement]. ^In the "v2" interface, -** the more specific error code is returned directly by sqlite3_step(). -** -** [SQLITE_MISUSE] means that the this routine was called inappropriately. -** Perhaps it was called on a [prepared statement] that has -** already been [sqlite3_finalize | finalized] or on one that had -** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could -** be the case that the same database connection is being used by two or -** more threads at the same moment in time. -** -** For all versions of SQLite up to and including 3.6.23.1, a call to -** [sqlite3_reset()] was required after sqlite3_step() returned anything -** other than [SQLITE_ROW] before any subsequent invocation of -** sqlite3_step(). Failure to reset the prepared statement using -** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from -** sqlite3_step(). But after version 3.6.23.1, sqlite3_step() began -** calling [sqlite3_reset()] automatically in this circumstance rather -** than returning [SQLITE_MISUSE]. This is not considered a compatibility -** break because any application that ever receives an SQLITE_MISUSE error -** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option -** can be used to restore the legacy behavior. -** -** Goofy Interface Alert: In the legacy interface, the sqlite3_step() -** API always returns a generic error code, [SQLITE_ERROR], following any -** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call -** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the -** specific [error codes] that better describes the error. -** We admit that this is a goofy design. The problem has been fixed -** with the "v2" interface. If you prepare all of your SQL statements -** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead -** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, -** then the more specific [error codes] are returned directly -** by sqlite3_step(). The use of the "v2" interface is recommended. -*/ -SQLITE_API int sqlite3_step(sqlite3_stmt*); - -/* -** CAPI3REF: Number of columns in a result set -** -** ^The sqlite3_data_count(P) interface returns the number of columns in the -** current row of the result set of [prepared statement] P. -** ^If prepared statement P does not have results ready to return -** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of -** interfaces) then sqlite3_data_count(P) returns 0. -** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. -** -** See also: [sqlite3_column_count()] -*/ -SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Fundamental Datatypes -** KEYWORDS: SQLITE_TEXT -** -** ^(Every value in SQLite has one of five fundamental datatypes: -** -**
    -**
  • 64-bit signed integer -**
  • 64-bit IEEE floating point number -**
  • string -**
  • BLOB -**
  • NULL -**
)^ -** -** These constants are codes for each of those types. -** -** Note that the SQLITE_TEXT constant was also used in SQLite version 2 -** for a completely different meaning. Software that links against both -** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not -** SQLITE_TEXT. -*/ -#define SQLITE_INTEGER 1 -#define SQLITE_FLOAT 2 -#define SQLITE_BLOB 4 -#define SQLITE_NULL 5 -#ifdef SQLITE_TEXT -# undef SQLITE_TEXT -#else -# define SQLITE_TEXT 3 -#endif -#define SQLITE3_TEXT 3 - -/* -** CAPI3REF: Result Values From A Query -** KEYWORDS: {column access functions} -** -** These routines form the "result set" interface. -** -** ^These routines return information about a single column of the current -** result row of a query. ^In every case the first argument is a pointer -** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] -** that was returned from [sqlite3_prepare_v2()] or one of its variants) -** and the second argument is the index of the column for which information -** should be returned. ^The leftmost column of the result set has the index 0. -** ^The number of columns in the result can be determined using -** [sqlite3_column_count()]. -** -** If the SQL statement does not currently point to a valid row, or if the -** column index is out of range, the result is undefined. -** These routines may only be called when the most recent call to -** [sqlite3_step()] has returned [SQLITE_ROW] and neither -** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. -** If any of these routines are called after [sqlite3_reset()] or -** [sqlite3_finalize()] or after [sqlite3_step()] has returned -** something other than [SQLITE_ROW], the results are undefined. -** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] -** are called from a different thread while any of these routines -** are pending, then the results are undefined. -** -** ^The sqlite3_column_type() routine returns the -** [SQLITE_INTEGER | datatype code] for the initial data type -** of the result column. ^The returned value is one of [SQLITE_INTEGER], -** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value -** returned by sqlite3_column_type() is only meaningful if no type -** conversions have occurred as described below. After a type conversion, -** the value returned by sqlite3_column_type() is undefined. Future -** versions of SQLite may change the behavior of sqlite3_column_type() -** following a type conversion. -** -** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() -** routine returns the number of bytes in that BLOB or string. -** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts -** the string to UTF-8 and then returns the number of bytes. -** ^If the result is a numeric value then sqlite3_column_bytes() uses -** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns -** the number of bytes in that string. -** ^If the result is NULL, then sqlite3_column_bytes() returns zero. -** -** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() -** routine returns the number of bytes in that BLOB or string. -** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts -** the string to UTF-16 and then returns the number of bytes. -** ^If the result is a numeric value then sqlite3_column_bytes16() uses -** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns -** the number of bytes in that string. -** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. -** -** ^The values returned by [sqlite3_column_bytes()] and -** [sqlite3_column_bytes16()] do not include the zero terminators at the end -** of the string. ^For clarity: the values returned by -** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of -** bytes in the string, not the number of characters. -** -** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), -** even empty strings, are always zero terminated. ^The return -** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. -** -** ^The object returned by [sqlite3_column_value()] is an -** [unprotected sqlite3_value] object. An unprotected sqlite3_value object -** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. -** If the [unprotected sqlite3_value] object returned by -** [sqlite3_column_value()] is used in any other way, including calls -** to routines like [sqlite3_value_int()], [sqlite3_value_text()], -** or [sqlite3_value_bytes()], then the behavior is undefined. -** -** These routines attempt to convert the value where appropriate. ^For -** example, if the internal representation is FLOAT and a text result -** is requested, [sqlite3_snprintf()] is used internally to perform the -** conversion automatically. ^(The following table details the conversions -** that are applied: -** -**
-** -**
Internal
Type
Requested
Type
Conversion -** -**
NULL INTEGER Result is 0 -**
NULL FLOAT Result is 0.0 -**
NULL TEXT Result is NULL pointer -**
NULL BLOB Result is NULL pointer -**
INTEGER FLOAT Convert from integer to float -**
INTEGER TEXT ASCII rendering of the integer -**
INTEGER BLOB Same as INTEGER->TEXT -**
FLOAT INTEGER Convert from float to integer -**
FLOAT TEXT ASCII rendering of the float -**
FLOAT BLOB Same as FLOAT->TEXT -**
TEXT INTEGER Use atoi() -**
TEXT FLOAT Use atof() -**
TEXT BLOB No change -**
BLOB INTEGER Convert to TEXT then use atoi() -**
BLOB FLOAT Convert to TEXT then use atof() -**
BLOB TEXT Add a zero terminator if needed -**
-**
)^ -** -** The table above makes reference to standard C library functions atoi() -** and atof(). SQLite does not really use these functions. It has its -** own equivalent internal routines. The atoi() and atof() names are -** used in the table for brevity and because they are familiar to most -** C programmers. -** -** Note that when type conversions occur, pointers returned by prior -** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or -** sqlite3_column_text16() may be invalidated. -** Type conversions and pointer invalidations might occur -** in the following cases: -** -**
    -**
  • The initial content is a BLOB and sqlite3_column_text() or -** sqlite3_column_text16() is called. A zero-terminator might -** need to be added to the string.
  • -**
  • The initial content is UTF-8 text and sqlite3_column_bytes16() or -** sqlite3_column_text16() is called. The content must be converted -** to UTF-16.
  • -**
  • The initial content is UTF-16 text and sqlite3_column_bytes() or -** sqlite3_column_text() is called. The content must be converted -** to UTF-8.
  • -**
-** -** ^Conversions between UTF-16be and UTF-16le are always done in place and do -** not invalidate a prior pointer, though of course the content of the buffer -** that the prior pointer references will have been modified. Other kinds -** of conversion are done in place when it is possible, but sometimes they -** are not possible and in those cases prior pointers are invalidated. -** -** The safest and easiest to remember policy is to invoke these routines -** in one of the following ways: -** -**
    -**
  • sqlite3_column_text() followed by sqlite3_column_bytes()
  • -**
  • sqlite3_column_blob() followed by sqlite3_column_bytes()
  • -**
  • sqlite3_column_text16() followed by sqlite3_column_bytes16()
  • -**
-** -** In other words, you should call sqlite3_column_text(), -** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result -** into the desired format, then invoke sqlite3_column_bytes() or -** sqlite3_column_bytes16() to find the size of the result. Do not mix calls -** to sqlite3_column_text() or sqlite3_column_blob() with calls to -** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() -** with calls to sqlite3_column_bytes(). -** -** ^The pointers returned are valid until a type conversion occurs as -** described above, or until [sqlite3_step()] or [sqlite3_reset()] or -** [sqlite3_finalize()] is called. ^The memory space used to hold strings -** and BLOBs is freed automatically. Do not pass the pointers returned -** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into -** [sqlite3_free()]. -** -** ^(If a memory allocation error occurs during the evaluation of any -** of these routines, a default value is returned. The default value -** is either the integer 0, the floating point number 0.0, or a NULL -** pointer. Subsequent calls to [sqlite3_errcode()] will return -** [SQLITE_NOMEM].)^ -*/ -SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); -SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); -SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); -SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); -SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); -SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); - -/* -** CAPI3REF: Destroy A Prepared Statement Object -** -** ^The sqlite3_finalize() function is called to delete a [prepared statement]. -** ^If the most recent evaluation of the statement encountered no errors or -** or if the statement is never been evaluated, then sqlite3_finalize() returns -** SQLITE_OK. ^If the most recent evaluation of statement S failed, then -** sqlite3_finalize(S) returns the appropriate [error code] or -** [extended error code]. -** -** ^The sqlite3_finalize(S) routine can be called at any point during -** the life cycle of [prepared statement] S: -** before statement S is ever evaluated, after -** one or more calls to [sqlite3_reset()], or after any call -** to [sqlite3_step()] regardless of whether or not the statement has -** completed execution. -** -** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. -** -** The application must finalize every [prepared statement] in order to avoid -** resource leaks. It is a grievous error for the application to try to use -** a prepared statement after it has been finalized. Any use of a prepared -** statement after it has been finalized can result in undefined and -** undesirable behavior such as segfaults and heap corruption. -*/ -SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Reset A Prepared Statement Object -** -** The sqlite3_reset() function is called to reset a [prepared statement] -** object back to its initial state, ready to be re-executed. -** ^Any SQL statement variables that had values bound to them using -** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. -** Use [sqlite3_clear_bindings()] to reset the bindings. -** -** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S -** back to the beginning of its program. -** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], -** or if [sqlite3_step(S)] has never before been called on S, -** then [sqlite3_reset(S)] returns [SQLITE_OK]. -** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S indicated an error, then -** [sqlite3_reset(S)] returns an appropriate [error code]. -** -** ^The [sqlite3_reset(S)] interface does not change the values -** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. -*/ -SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Create Or Redefine SQL Functions -** KEYWORDS: {function creation routines} -** KEYWORDS: {application-defined SQL function} -** KEYWORDS: {application-defined SQL functions} -** -** ^These functions (collectively known as "function creation routines") -** are used to add SQL functions or aggregates or to redefine the behavior -** of existing SQL functions or aggregates. The only differences between -** these routines are the text encoding expected for -** the the second parameter (the name of the function being created) -** and the presence or absence of a destructor callback for -** the application data pointer. -** -** ^The first parameter is the [database connection] to which the SQL -** function is to be added. ^If an application uses more than one database -** connection then application-defined SQL functions must be added -** to each database connection separately. -** -** ^The second parameter is the name of the SQL function to be created or -** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 -** representation, exclusive of the zero-terminator. ^Note that the name -** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. -** ^Any attempt to create a function with a longer name -** will result in [SQLITE_MISUSE] being returned. -** -** ^The third parameter (nArg) -** is the number of arguments that the SQL function or -** aggregate takes. ^If this parameter is -1, then the SQL function or -** aggregate may take any number of arguments between 0 and the limit -** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third -** parameter is less than -1 or greater than 127 then the behavior is -** undefined. -** -** ^The fourth parameter, eTextRep, specifies what -** [SQLITE_UTF8 | text encoding] this SQL function prefers for -** its parameters. Every SQL function implementation must be able to work -** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. ^An application may -** invoke sqlite3_create_function() or sqlite3_create_function16() multiple -** times with the same function but with different values of eTextRep. -** ^When multiple implementations of the same function are available, SQLite -** will pick the one that involves the least amount of data conversion. -** If there is only a single implementation which does not care what text -** encoding is used, then the fourth argument should be [SQLITE_ANY]. -** -** ^(The fifth parameter is an arbitrary pointer. The implementation of the -** function can gain access to this pointer using [sqlite3_user_data()].)^ -** -** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are -** pointers to C-language functions that implement the SQL function or -** aggregate. ^A scalar SQL function requires an implementation of the xFunc -** callback only; NULL pointers must be passed as the xStep and xFinal -** parameters. ^An aggregate SQL function requires an implementation of xStep -** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing -** SQL function or aggregate, pass NULL poiners for all three function -** callbacks. -** -** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, -** then it is destructor for the application data pointer. -** The destructor is invoked when the function is deleted, either by being -** overloaded or when the database connection closes.)^ -** ^The destructor is also invoked if the call to -** sqlite3_create_function_v2() fails. -** ^When the destructor callback of the tenth parameter is invoked, it -** is passed a single argument which is a copy of the application data -** pointer which was the fifth parameter to sqlite3_create_function_v2(). -** -** ^It is permitted to register multiple implementations of the same -** functions with the same name but with either differing numbers of -** arguments or differing preferred text encodings. ^SQLite will use -** the implementation that most closely matches the way in which the -** SQL function is used. ^A function implementation with a non-negative -** nArg parameter is a better match than a function implementation with -** a negative nArg. ^A function where the preferred text encoding -** matches the database encoding is a better -** match than a function where the encoding is different. -** ^A function where the encoding difference is between UTF16le and UTF16be -** is a closer match than a function where the encoding difference is -** between UTF8 and UTF16. -** -** ^Built-in functions may be overloaded by new application-defined functions. -** -** ^An application-defined function is permitted to call other -** SQLite interfaces. However, such calls must not -** close the database connection nor finalize or reset the prepared -** statement in which the function is running. -*/ -SQLITE_API int sqlite3_create_function( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -SQLITE_API int sqlite3_create_function16( - sqlite3 *db, - const void *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -SQLITE_API int sqlite3_create_function_v2( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*), - void(*xDestroy)(void*) -); - -/* -** CAPI3REF: Text Encodings -** -** These constant define integer codes that represent the various -** text encodings supported by SQLite. -*/ -#define SQLITE_UTF8 1 -#define SQLITE_UTF16LE 2 -#define SQLITE_UTF16BE 3 -#define SQLITE_UTF16 4 /* Use native byte order */ -#define SQLITE_ANY 5 /* sqlite3_create_function only */ -#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ - -/* -** CAPI3REF: Deprecated Functions -** DEPRECATED -** -** These functions are [deprecated]. In order to maintain -** backwards compatibility with older code, these functions continue -** to be supported. However, new applications should avoid -** the use of these functions. To help encourage people to avoid -** using these functions, we are not going to tell you what they do. -*/ -#ifndef SQLITE_OMIT_DEPRECATED -SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); -SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); -SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64); -#endif - -/* -** CAPI3REF: Obtaining SQL Function Parameter Values -** -** The C-language implementation of SQL functions and aggregates uses -** this set of interface routines to access the parameter values on -** the function or aggregate. -** -** The xFunc (for scalar functions) or xStep (for aggregates) parameters -** to [sqlite3_create_function()] and [sqlite3_create_function16()] -** define callbacks that implement the SQL functions and aggregates. -** The 3rd parameter to these callbacks is an array of pointers to -** [protected sqlite3_value] objects. There is one [sqlite3_value] object for -** each parameter to the SQL function. These routines are used to -** extract values from the [sqlite3_value] objects. -** -** These routines work only with [protected sqlite3_value] objects. -** Any attempt to use these routines on an [unprotected sqlite3_value] -** object results in undefined behavior. -** -** ^These routines work just like the corresponding [column access functions] -** except that these routines take a single [protected sqlite3_value] object -** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. -** -** ^The sqlite3_value_text16() interface extracts a UTF-16 string -** in the native byte-order of the host machine. ^The -** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces -** extract UTF-16 strings as big-endian and little-endian respectively. -** -** ^(The sqlite3_value_numeric_type() interface attempts to apply -** numeric affinity to the value. This means that an attempt is -** made to convert the value to an integer or floating point. If -** such a conversion is possible without loss of information (in other -** words, if the value is a string that looks like a number) -** then the conversion is performed. Otherwise no conversion occurs. -** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ -** -** Please pay particular attention to the fact that the pointer returned -** from [sqlite3_value_blob()], [sqlite3_value_text()], or -** [sqlite3_value_text16()] can be invalidated by a subsequent call to -** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], -** or [sqlite3_value_text16()]. -** -** These routines must be called from the same thread as -** the SQL function that supplied the [sqlite3_value*] parameters. -*/ -SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); -SQLITE_API double sqlite3_value_double(sqlite3_value*); -SQLITE_API int sqlite3_value_int(sqlite3_value*); -SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); -SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); -SQLITE_API int sqlite3_value_type(sqlite3_value*); -SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); - -/* -** CAPI3REF: Obtain Aggregate Function Context -** -** Implementations of aggregate SQL functions use this -** routine to allocate memory for storing their state. -** -** ^The first time the sqlite3_aggregate_context(C,N) routine is called -** for a particular aggregate function, SQLite -** allocates N of memory, zeroes out that memory, and returns a pointer -** to the new memory. ^On second and subsequent calls to -** sqlite3_aggregate_context() for the same aggregate function instance, -** the same buffer is returned. Sqlite3_aggregate_context() is normally -** called once for each invocation of the xStep callback and then one -** last time when the xFinal callback is invoked. ^(When no rows match -** an aggregate query, the xStep() callback of the aggregate function -** implementation is never called and xFinal() is called exactly once. -** In those cases, sqlite3_aggregate_context() might be called for the -** first time from within xFinal().)^ -** -** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer if N is -** less than or equal to zero or if a memory allocate error occurs. -** -** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is -** determined by the N parameter on first successful call. Changing the -** value of N in subsequent call to sqlite3_aggregate_context() within -** the same aggregate function instance will not resize the memory -** allocation.)^ -** -** ^SQLite automatically frees the memory allocated by -** sqlite3_aggregate_context() when the aggregate query concludes. -** -** The first parameter must be a copy of the -** [sqlite3_context | SQL function context] that is the first parameter -** to the xStep or xFinal callback routine that implements the aggregate -** function. -** -** This routine must be called from the same thread in which -** the aggregate SQL function is running. -*/ -SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); - -/* -** CAPI3REF: User Data For Functions -** -** ^The sqlite3_user_data() interface returns a copy of -** the pointer that was the pUserData parameter (the 5th parameter) -** of the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. -** -** This routine must be called from the same thread in which -** the application-defined function is running. -*/ -SQLITE_API void *sqlite3_user_data(sqlite3_context*); - -/* -** CAPI3REF: Database Connection For Functions -** -** ^The sqlite3_context_db_handle() interface returns a copy of -** the pointer to the [database connection] (the 1st parameter) -** of the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. -*/ -SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); - -/* -** CAPI3REF: Function Auxiliary Data -** -** The following two functions may be used by scalar SQL functions to -** associate metadata with argument values. If the same value is passed to -** multiple invocations of the same SQL function during query execution, under -** some circumstances the associated metadata may be preserved. This may -** be used, for example, to add a regular-expression matching scalar -** function. The compiled version of the regular expression is stored as -** metadata associated with the SQL value passed as the regular expression -** pattern. The compiled regular expression can be reused on multiple -** invocations of the same function so that the original pattern string -** does not need to be recompiled on each invocation. -** -** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata -** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. ^If no metadata has been ever -** been set for the Nth argument of the function, or if the corresponding -** function parameter has changed since the meta-data was set, -** then sqlite3_get_auxdata() returns a NULL pointer. -** -** ^The sqlite3_set_auxdata() interface saves the metadata -** pointed to by its 3rd parameter as the metadata for the N-th -** argument of the application-defined function. Subsequent -** calls to sqlite3_get_auxdata() might return this data, if it has -** not been destroyed. -** ^If it is not NULL, SQLite will invoke the destructor -** function given by the 4th parameter to sqlite3_set_auxdata() on -** the metadata when the corresponding function parameter changes -** or when the SQL statement completes, whichever comes first. -** -** SQLite is free to call the destructor and drop metadata on any -** parameter of any function at any time. ^The only guarantee is that -** the destructor will be called before the metadata is dropped. -** -** ^(In practice, metadata is preserved between function calls for -** expressions that are constant at compile time. This includes literal -** values and [parameters].)^ -** -** These routines must be called from the same thread in which -** the SQL function is running. -*/ -SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); -SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); - - -/* -** CAPI3REF: Constants Defining Special Destructor Behavior -** -** These are special values for the destructor that is passed in as the -** final argument to routines like [sqlite3_result_blob()]. ^If the destructor -** argument is SQLITE_STATIC, it means that the content pointer is constant -** and will never change. It does not need to be destroyed. ^The -** SQLITE_TRANSIENT value means that the content will likely change in -** the near future and that SQLite should make its own private copy of -** the content before returning. -** -** The typedef is necessary to work around problems in certain -** C++ compilers. See ticket #2191. -*/ -typedef void (*sqlite3_destructor_type)(void*); -#define SQLITE_STATIC ((sqlite3_destructor_type)0) -#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) - -/* -** CAPI3REF: Setting The Result Of An SQL Function -** -** These routines are used by the xFunc or xFinal callbacks that -** implement SQL functions and aggregates. See -** [sqlite3_create_function()] and [sqlite3_create_function16()] -** for additional information. -** -** These functions work very much like the [parameter binding] family of -** functions used to bind values to host parameters in prepared statements. -** Refer to the [SQL parameter] documentation for additional information. -** -** ^The sqlite3_result_blob() interface sets the result from -** an application-defined function to be the BLOB whose content is pointed -** to by the second parameter and which is N bytes long where N is the -** third parameter. -** -** ^The sqlite3_result_zeroblob() interfaces set the result of -** the application-defined function to be a BLOB containing all zero -** bytes and N bytes in size, where N is the value of the 2nd parameter. -** -** ^The sqlite3_result_double() interface sets the result from -** an application-defined function to be a floating point value specified -** by its 2nd argument. -** -** ^The sqlite3_result_error() and sqlite3_result_error16() functions -** cause the implemented SQL function to throw an exception. -** ^SQLite uses the string pointed to by the -** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() -** as the text of an error message. ^SQLite interprets the error -** message string from sqlite3_result_error() as UTF-8. ^SQLite -** interprets the string from sqlite3_result_error16() as UTF-16 in native -** byte order. ^If the third parameter to sqlite3_result_error() -** or sqlite3_result_error16() is negative then SQLite takes as the error -** message all text up through the first zero character. -** ^If the third parameter to sqlite3_result_error() or -** sqlite3_result_error16() is non-negative then SQLite takes that many -** bytes (not characters) from the 2nd parameter as the error message. -** ^The sqlite3_result_error() and sqlite3_result_error16() -** routines make a private copy of the error message text before -** they return. Hence, the calling function can deallocate or -** modify the text after they return without harm. -** ^The sqlite3_result_error_code() function changes the error code -** returned by SQLite as a result of an error in a function. ^By default, -** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() -** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. -** -** ^The sqlite3_result_toobig() interface causes SQLite to throw an error -** indicating that a string or BLOB is too long to represent. -** -** ^The sqlite3_result_nomem() interface causes SQLite to throw an error -** indicating that a memory allocation failed. -** -** ^The sqlite3_result_int() interface sets the return value -** of the application-defined function to be the 32-bit signed integer -** value given in the 2nd argument. -** ^The sqlite3_result_int64() interface sets the return value -** of the application-defined function to be the 64-bit signed integer -** value given in the 2nd argument. -** -** ^The sqlite3_result_null() interface sets the return value -** of the application-defined function to be NULL. -** -** ^The sqlite3_result_text(), sqlite3_result_text16(), -** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces -** set the return value of the application-defined function to be -** a text string which is represented as UTF-8, UTF-16 native byte order, -** UTF-16 little endian, or UTF-16 big endian, respectively. -** ^SQLite takes the text result from the application from -** the 2nd parameter of the sqlite3_result_text* interfaces. -** ^If the 3rd parameter to the sqlite3_result_text* interfaces -** is negative, then SQLite takes result text from the 2nd parameter -** through the first zero character. -** ^If the 3rd parameter to the sqlite3_result_text* interfaces -** is non-negative, then as many bytes (not characters) of the text -** pointed to by the 2nd parameter are taken as the application-defined -** function result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that -** function as the destructor on the text or BLOB result when it has -** finished using that result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces or to -** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite -** assumes that the text or BLOB result is in constant space and does not -** copy the content of the parameter nor call a destructor on the content -** when it has finished using that result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT -** then SQLite makes a copy of the result into space obtained from -** from [sqlite3_malloc()] before it returns. -** -** ^The sqlite3_result_value() interface sets the result of -** the application-defined function to be a copy the -** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The -** sqlite3_result_value() interface makes a copy of the [sqlite3_value] -** so that the [sqlite3_value] specified in the parameter may change or -** be deallocated after sqlite3_result_value() returns without harm. -** ^A [protected sqlite3_value] object may always be used where an -** [unprotected sqlite3_value] object is required, so either -** kind of [sqlite3_value] object can be used with this interface. -** -** If these routines are called from within the different thread -** than the one containing the application-defined function that received -** the [sqlite3_context] pointer, the results are undefined. -*/ -SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_double(sqlite3_context*, double); -SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); -SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); -SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); -SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); -SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); -SQLITE_API void sqlite3_result_int(sqlite3_context*, int); -SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); -SQLITE_API void sqlite3_result_null(sqlite3_context*); -SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); -SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); -SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); -SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); - -/* -** CAPI3REF: Define New Collating Sequences -** -** ^These functions add, remove, or modify a [collation] associated -** with the [database connection] specified as the first argument. -** -** ^The name of the collation is a UTF-8 string -** for sqlite3_create_collation() and sqlite3_create_collation_v2() -** and a UTF-16 string in native byte order for sqlite3_create_collation16(). -** ^Collation names that compare equal according to [sqlite3_strnicmp()] are -** considered to be the same name. -** -** ^(The third argument (eTextRep) must be one of the constants: -**
    -**
  • [SQLITE_UTF8], -**
  • [SQLITE_UTF16LE], -**
  • [SQLITE_UTF16BE], -**
  • [SQLITE_UTF16], or -**
  • [SQLITE_UTF16_ALIGNED]. -**
)^ -** ^The eTextRep argument determines the encoding of strings passed -** to the collating function callback, xCallback. -** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep -** force strings to be UTF16 with native byte order. -** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin -** on an even byte address. -** -** ^The fourth argument, pArg, is a application data pointer that is passed -** through as the first argument to the collating function callback. -** -** ^The fifth argument, xCallback, is a pointer to the collating function. -** ^Multiple collating functions can be registered using the same name but -** with different eTextRep parameters and SQLite will use whichever -** function requires the least amount of data transformation. -** ^If the xCallback argument is NULL then the collating function is -** deleted. ^When all collating functions having the same name are deleted, -** that collation is no longer usable. -** -** ^The collating function callback is invoked with a copy of the pArg -** application data pointer and with two strings in the encoding specified -** by the eTextRep argument. The collating function must return an -** integer that is negative, zero, or positive -** if the first string is less than, equal to, or greater than the second, -** respectively. A collating function must alway return the same answer -** given the same inputs. If two or more collating functions are registered -** to the same collation name (using different eTextRep values) then all -** must give an equivalent answer when invoked with equivalent strings. -** The collating function must obey the following properties for all -** strings A, B, and C: -** -**
    -**
  1. If A==B then B==A. -**
  2. If A==B and B==C then A==C. -**
  3. If A<B THEN B>A. -**
  4. If A<B and B<C then A<C. -**
-** -** If a collating function fails any of the above constraints and that -** collating function is registered and used, then the behavior of SQLite -** is undefined. -** -** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() -** with the addition that the xDestroy callback is invoked on pArg when -** the collating function is deleted. -** ^Collating functions are deleted when they are overridden by later -** calls to the collation creation functions or when the -** [database connection] is closed using [sqlite3_close()]. -** -** ^The xDestroy callback is not called if the -** sqlite3_create_collation_v2() function fails. Applications that invoke -** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should -** check the return code and dispose of the application data pointer -** themselves rather than expecting SQLite to deal with it for them. -** This is different from every other SQLite interface. The inconsistency -** is unfortunate but cannot be changed without breaking backwards -** compatibility. -** -** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. -*/ -SQLITE_API int sqlite3_create_collation( - sqlite3*, - const char *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*) -); -SQLITE_API int sqlite3_create_collation_v2( - sqlite3*, - const char *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*), - void(*xDestroy)(void*) -); -SQLITE_API int sqlite3_create_collation16( - sqlite3*, - const void *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*) -); - -/* -** CAPI3REF: Collation Needed Callbacks -** -** ^To avoid having to register all collation sequences before a database -** can be used, a single callback function may be registered with the -** [database connection] to be invoked whenever an undefined collation -** sequence is required. -** -** ^If the function is registered using the sqlite3_collation_needed() API, -** then it is passed the names of undefined collation sequences as strings -** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, -** the names are passed as UTF-16 in machine native byte order. -** ^A call to either function replaces the existing collation-needed callback. -** -** ^(When the callback is invoked, the first argument passed is a copy -** of the second argument to sqlite3_collation_needed() or -** sqlite3_collation_needed16(). The second argument is the database -** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], -** or [SQLITE_UTF16LE], indicating the most desirable form of the collation -** sequence function required. The fourth parameter is the name of the -** required collation sequence.)^ -** -** The callback function should register the desired collation using -** [sqlite3_create_collation()], [sqlite3_create_collation16()], or -** [sqlite3_create_collation_v2()]. -*/ -SQLITE_API int sqlite3_collation_needed( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const char*) -); -SQLITE_API int sqlite3_collation_needed16( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const void*) -); - -#ifdef SQLITE_HAS_CODEC -/* -** Specify the key for an encrypted database. This routine should be -** called right after sqlite3_open(). -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -SQLITE_API int sqlite3_key( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The key */ -); - -/* -** Change the key on an open database. If the current database is not -** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the -** database is decrypted. -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -SQLITE_API int sqlite3_rekey( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The new key */ -); - -/* -** Specify the activation key for a SEE database. Unless -** activated, none of the SEE routines will work. -*/ -SQLITE_API void sqlite3_activate_see( - const char *zPassPhrase /* Activation phrase */ -); -#endif - -#ifdef SQLITE_ENABLE_CEROD -/* -** Specify the activation key for a CEROD database. Unless -** activated, none of the CEROD routines will work. -*/ -SQLITE_API void sqlite3_activate_cerod( - const char *zPassPhrase /* Activation phrase */ -); -#endif - -/* -** CAPI3REF: Suspend Execution For A Short Time -** -** The sqlite3_sleep() function causes the current thread to suspend execution -** for at least a number of milliseconds specified in its parameter. -** -** If the operating system does not support sleep requests with -** millisecond time resolution, then the time will be rounded up to -** the nearest second. The number of milliseconds of sleep actually -** requested from the operating system is returned. -** -** ^SQLite implements this interface by calling the xSleep() -** method of the default [sqlite3_vfs] object. If the xSleep() method -** of the default VFS is not implemented correctly, or not implemented at -** all, then the behavior of sqlite3_sleep() may deviate from the description -** in the previous paragraphs. -*/ -SQLITE_API int sqlite3_sleep(int); - -/* -** CAPI3REF: Name Of The Folder Holding Temporary Files -** -** ^(If this global variable is made to point to a string which is -** the name of a folder (a.k.a. directory), then all temporary files -** created by SQLite when using a built-in [sqlite3_vfs | VFS] -** will be placed in that directory.)^ ^If this variable -** is a NULL pointer, then SQLite performs a search for an appropriate -** temporary file directory. -** -** It is not safe to read or modify this variable in more than one -** thread at a time. It is not safe to read or modify this variable -** if a [database connection] is being used at the same time in a separate -** thread. -** It is intended that this variable be set once -** as part of process initialization and before any SQLite interface -** routines have been called and that this variable remain unchanged -** thereafter. -** -** ^The [temp_store_directory pragma] may modify this variable and cause -** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, -** the [temp_store_directory pragma] always assumes that any string -** that this variable points to is held in memory obtained from -** [sqlite3_malloc] and the pragma may attempt to free that memory -** using [sqlite3_free]. -** Hence, if this variable is modified directly, either it should be -** made NULL or made to point to memory obtained from [sqlite3_malloc] -** or else the use of the [temp_store_directory pragma] should be avoided. -*/ -SQLITE_API char *sqlite3_temp_directory; - -/* -** CAPI3REF: Test For Auto-Commit Mode -** KEYWORDS: {autocommit mode} -** -** ^The sqlite3_get_autocommit() interface returns non-zero or -** zero if the given database connection is or is not in autocommit mode, -** respectively. ^Autocommit mode is on by default. -** ^Autocommit mode is disabled by a [BEGIN] statement. -** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. -** -** If certain kinds of errors occur on a statement within a multi-statement -** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], -** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the -** transaction might be rolled back automatically. The only way to -** find out whether SQLite automatically rolled back the transaction after -** an error is to use this function. -** -** If another thread changes the autocommit status of the database -** connection while this routine is running, then the return value -** is undefined. -*/ -SQLITE_API int sqlite3_get_autocommit(sqlite3*); - -/* -** CAPI3REF: Find The Database Handle Of A Prepared Statement -** -** ^The sqlite3_db_handle interface returns the [database connection] handle -** to which a [prepared statement] belongs. ^The [database connection] -** returned by sqlite3_db_handle is the same [database connection] -** that was the first argument -** to the [sqlite3_prepare_v2()] call (or its variants) that was used to -** create the statement in the first place. -*/ -SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); - -/* -** CAPI3REF: Find the next prepared statement -** -** ^This interface returns a pointer to the next [prepared statement] after -** pStmt associated with the [database connection] pDb. ^If pStmt is NULL -** then this interface returns a pointer to the first prepared statement -** associated with the database connection pDb. ^If no prepared statement -** satisfies the conditions of this routine, it returns NULL. -** -** The [database connection] pointer D in a call to -** [sqlite3_next_stmt(D,S)] must refer to an open database -** connection and in particular must not be a NULL pointer. -*/ -SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Commit And Rollback Notification Callbacks -** -** ^The sqlite3_commit_hook() interface registers a callback -** function to be invoked whenever a transaction is [COMMIT | committed]. -** ^Any callback set by a previous call to sqlite3_commit_hook() -** for the same database connection is overridden. -** ^The sqlite3_rollback_hook() interface registers a callback -** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. -** ^Any callback set by a previous call to sqlite3_rollback_hook() -** for the same database connection is overridden. -** ^The pArg argument is passed through to the callback. -** ^If the callback on a commit hook function returns non-zero, -** then the commit is converted into a rollback. -** -** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions -** return the P argument from the previous call of the same function -** on the same [database connection] D, or NULL for -** the first call for each function on D. -** -** The callback implementation must not do anything that will modify -** the database connection that invoked the callback. Any actions -** to modify the database connection must be deferred until after the -** completion of the [sqlite3_step()] call that triggered the commit -** or rollback hook in the first place. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^Registering a NULL function disables the callback. -** -** ^When the commit hook callback routine returns zero, the [COMMIT] -** operation is allowed to continue normally. ^If the commit hook -** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. -** ^The rollback hook is invoked on a rollback that results from a commit -** hook returning non-zero, just as it would be with any other rollback. -** -** ^For the purposes of this API, a transaction is said to have been -** rolled back if an explicit "ROLLBACK" statement is executed, or -** an error or constraint causes an implicit rollback to occur. -** ^The rollback callback is not invoked if a transaction is -** automatically rolled back because the database connection is closed. -** -** See also the [sqlite3_update_hook()] interface. -*/ -SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); -SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); - -/* -** CAPI3REF: Data Change Notification Callbacks -** -** ^The sqlite3_update_hook() interface registers a callback function -** with the [database connection] identified by the first argument -** to be invoked whenever a row is updated, inserted or deleted. -** ^Any callback set by a previous call to this function -** for the same database connection is overridden. -** -** ^The second argument is a pointer to the function to invoke when a -** row is updated, inserted or deleted. -** ^The first argument to the callback is a copy of the third argument -** to sqlite3_update_hook(). -** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], -** or [SQLITE_UPDATE], depending on the operation that caused the callback -** to be invoked. -** ^The third and fourth arguments to the callback contain pointers to the -** database and table name containing the affected row. -** ^The final callback parameter is the [rowid] of the row. -** ^In the case of an update, this is the [rowid] after the update takes place. -** -** ^(The update hook is not invoked when internal system tables are -** modified (i.e. sqlite_master and sqlite_sequence).)^ -** -** ^In the current implementation, the update hook -** is not invoked when duplication rows are deleted because of an -** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook -** invoked when rows are deleted using the [truncate optimization]. -** The exceptions defined in this paragraph might change in a future -** release of SQLite. -** -** The update hook implementation must not do anything that will modify -** the database connection that invoked the update hook. Any actions -** to modify the database connection must be deferred until after the -** completion of the [sqlite3_step()] call that triggered the update hook. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^The sqlite3_update_hook(D,C,P) function -** returns the P argument from the previous call -** on the same [database connection] D, or NULL for -** the first call on D. -** -** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] -** interfaces. -*/ -SQLITE_API void *sqlite3_update_hook( - sqlite3*, - void(*)(void *,int ,char const *,char const *,sqlite3_int64), - void* -); - -/* -** CAPI3REF: Enable Or Disable Shared Pager Cache -** KEYWORDS: {shared cache} -** -** ^(This routine enables or disables the sharing of the database cache -** and schema data structures between [database connection | connections] -** to the same database. Sharing is enabled if the argument is true -** and disabled if the argument is false.)^ -** -** ^Cache sharing is enabled and disabled for an entire process. -** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, -** sharing was enabled or disabled for each thread separately. -** -** ^(The cache sharing mode set by this interface effects all subsequent -** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. -** Existing database connections continue use the sharing mode -** that was in effect at the time they were opened.)^ -** -** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled -** successfully. An [error code] is returned otherwise.)^ -** -** ^Shared cache is disabled by default. But this might change in -** future releases of SQLite. Applications that care about shared -** cache setting should set it explicitly. -** -** See Also: [SQLite Shared-Cache Mode] -*/ -SQLITE_API int sqlite3_enable_shared_cache(int); - -/* -** CAPI3REF: Attempt To Free Heap Memory -** -** ^The sqlite3_release_memory() interface attempts to free N bytes -** of heap memory by deallocating non-essential memory allocations -** held by the database library. Memory used to cache database -** pages to improve performance is an example of non-essential memory. -** ^sqlite3_release_memory() returns the number of bytes actually freed, -** which might be more or less than the amount requested. -** ^The sqlite3_release_memory() routine is a no-op returning zero -** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -*/ -SQLITE_API int sqlite3_release_memory(int); - -/* -** CAPI3REF: Impose A Limit On Heap Size -** -** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the -** soft limit on the amount of heap memory that may be allocated by SQLite. -** ^SQLite strives to keep heap memory utilization below the soft heap -** limit by reducing the number of pages held in the page cache -** as heap memory usages approaches the limit. -** ^The soft heap limit is "soft" because even though SQLite strives to stay -** below the limit, it will exceed the limit rather than generate -** an [SQLITE_NOMEM] error. In other words, the soft heap limit -** is advisory only. -** -** ^The return value from sqlite3_soft_heap_limit64() is the size of -** the soft heap limit prior to the call. ^If the argument N is negative -** then no change is made to the soft heap limit. Hence, the current -** size of the soft heap limit can be determined by invoking -** sqlite3_soft_heap_limit64() with a negative argument. -** -** ^If the argument N is zero then the soft heap limit is disabled. -** -** ^(The soft heap limit is not enforced in the current implementation -** if one or more of following conditions are true: -** -**
    -**
  • The soft heap limit is set to zero. -**
  • Memory accounting is disabled using a combination of the -** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and -** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. -**
  • An alternative page cache implementation is specifed using -** [sqlite3_config]([SQLITE_CONFIG_PCACHE],...). -**
  • The page cache allocates from its own memory pool supplied -** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than -** from the heap. -**
)^ -** -** Beginning with SQLite version 3.7.3, the soft heap limit is enforced -** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] -** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], -** the soft heap limit is enforced on every memory allocation. Without -** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced -** when memory is allocated by the page cache. Testing suggests that because -** the page cache is the predominate memory user in SQLite, most -** applications will achieve adequate soft heap limit enforcement without -** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** The circumstances under which SQLite will enforce the soft heap limit may -** changes in future releases of SQLite. -*/ -SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); - -/* -** CAPI3REF: Deprecated Soft Heap Limit Interface -** DEPRECATED -** -** This is a deprecated version of the [sqlite3_soft_heap_limit64()] -** interface. This routine is provided for historical compatibility -** only. All new applications should use the -** [sqlite3_soft_heap_limit64()] interface rather than this one. -*/ -SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); - - -/* -** CAPI3REF: Extract Metadata About A Column Of A Table -** -** ^This routine returns metadata about a specific column of a specific -** database table accessible using the [database connection] handle -** passed as the first function argument. -** -** ^The column is identified by the second, third and fourth parameters to -** this function. ^The second parameter is either the name of the database -** (i.e. "main", "temp", or an attached database) containing the specified -** table or NULL. ^If it is NULL, then all attached databases are searched -** for the table using the same algorithm used by the database engine to -** resolve unqualified table references. -** -** ^The third and fourth parameters to this function are the table and column -** name of the desired column, respectively. Neither of these parameters -** may be NULL. -** -** ^Metadata is returned by writing to the memory locations passed as the 5th -** and subsequent parameters to this function. ^Any of these arguments may be -** NULL, in which case the corresponding element of metadata is omitted. -** -** ^(
-** -**
Parameter Output
Type
Description -** -**
5th const char* Data type -**
6th const char* Name of default collation sequence -**
7th int True if column has a NOT NULL constraint -**
8th int True if column is part of the PRIMARY KEY -**
9th int True if column is [AUTOINCREMENT] -**
-**
)^ -** -** ^The memory pointed to by the character pointers returned for the -** declaration type and collation sequence is valid only until the next -** call to any SQLite API function. -** -** ^If the specified table is actually a view, an [error code] is returned. -** -** ^If the specified column is "rowid", "oid" or "_rowid_" and an -** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output -** parameters are set for the explicitly declared column. ^(If there is no -** explicitly declared [INTEGER PRIMARY KEY] column, then the output -** parameters are set as follows: -** -**
-**     data type: "INTEGER"
-**     collation sequence: "BINARY"
-**     not null: 0
-**     primary key: 1
-**     auto increment: 0
-** 
)^ -** -** ^(This function may load one or more schemas from database files. If an -** error occurs during this process, or if the requested table or column -** cannot be found, an [error code] is returned and an error message left -** in the [database connection] (to be retrieved using sqlite3_errmsg()).)^ -** -** ^This API is only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. -*/ -SQLITE_API int sqlite3_table_column_metadata( - sqlite3 *db, /* Connection handle */ - const char *zDbName, /* Database name or NULL */ - const char *zTableName, /* Table name */ - const char *zColumnName, /* Column name */ - char const **pzDataType, /* OUTPUT: Declared data type */ - char const **pzCollSeq, /* OUTPUT: Collation sequence name */ - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ - int *pPrimaryKey, /* OUTPUT: True if column part of PK */ - int *pAutoinc /* OUTPUT: True if column is auto-increment */ -); - -/* -** CAPI3REF: Load An Extension -** -** ^This interface loads an SQLite extension library from the named file. -** -** ^The sqlite3_load_extension() interface attempts to load an -** SQLite extension library contained in the file zFile. -** -** ^The entry point is zProc. -** ^zProc may be 0, in which case the name of the entry point -** defaults to "sqlite3_extension_init". -** ^The sqlite3_load_extension() interface returns -** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. -** ^If an error occurs and pzErrMsg is not 0, then the -** [sqlite3_load_extension()] interface shall attempt to -** fill *pzErrMsg with error message text stored in memory -** obtained from [sqlite3_malloc()]. The calling function -** should free this memory by calling [sqlite3_free()]. -** -** ^Extension loading must be enabled using -** [sqlite3_enable_load_extension()] prior to calling this API, -** otherwise an error will be returned. -** -** See also the [load_extension() SQL function]. -*/ -SQLITE_API int sqlite3_load_extension( - sqlite3 *db, /* Load the extension into this database connection */ - const char *zFile, /* Name of the shared library containing extension */ - const char *zProc, /* Entry point. Derived from zFile if 0 */ - char **pzErrMsg /* Put error message here if not 0 */ -); - -/* -** CAPI3REF: Enable Or Disable Extension Loading -** -** ^So as not to open security holes in older applications that are -** unprepared to deal with extension loading, and as a means of disabling -** extension loading while evaluating user-entered SQL, the following API -** is provided to turn the [sqlite3_load_extension()] mechanism on and off. -** -** ^Extension loading is off by default. See ticket #1863. -** ^Call the sqlite3_enable_load_extension() routine with onoff==1 -** to turn extension loading on and call it with onoff==0 to turn -** it back off again. -*/ -SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); - -/* -** CAPI3REF: Automatically Load Statically Linked Extensions -** -** ^This interface causes the xEntryPoint() function to be invoked for -** each new [database connection] that is created. The idea here is that -** xEntryPoint() is the entry point for a statically linked SQLite extension -** that is to be automatically loaded into all new database connections. -** -** ^(Even though the function prototype shows that xEntryPoint() takes -** no arguments and returns void, SQLite invokes xEntryPoint() with three -** arguments and expects and integer result as if the signature of the -** entry point where as follows: -** -**
-**    int xEntryPoint(
-**      sqlite3 *db,
-**      const char **pzErrMsg,
-**      const struct sqlite3_api_routines *pThunk
-**    );
-** 
)^ -** -** If the xEntryPoint routine encounters an error, it should make *pzErrMsg -** point to an appropriate error message (obtained from [sqlite3_mprintf()]) -** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg -** is NULL before calling the xEntryPoint(). ^SQLite will invoke -** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any -** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], -** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. -** -** ^Calling sqlite3_auto_extension(X) with an entry point X that is already -** on the list of automatic extensions is a harmless no-op. ^No entry point -** will be called more than once for each database connection that is opened. -** -** See also: [sqlite3_reset_auto_extension()]. -*/ -SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); - -/* -** CAPI3REF: Reset Automatic Extension Loading -** -** ^This interface disables all automatic extensions previously -** registered using [sqlite3_auto_extension()]. -*/ -SQLITE_API void sqlite3_reset_auto_extension(void); - -/* -** The interface to the virtual-table mechanism is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** Structures used by the virtual table interface -*/ -typedef struct sqlite3_vtab sqlite3_vtab; -typedef struct sqlite3_index_info sqlite3_index_info; -typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; -typedef struct sqlite3_module sqlite3_module; - -/* -** CAPI3REF: Virtual Table Object -** KEYWORDS: sqlite3_module {virtual table module} -** -** This structure, sometimes called a a "virtual table module", -** defines the implementation of a [virtual tables]. -** This structure consists mostly of methods for the module. -** -** ^A virtual table module is created by filling in a persistent -** instance of this structure and passing a pointer to that instance -** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. -** ^The registration remains valid until it is replaced by a different -** module or until the [database connection] closes. The content -** of this structure must not change while it is registered with -** any database connection. -*/ -struct sqlite3_module { - int iVersion; - int (*xCreate)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xConnect)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); - int (*xDisconnect)(sqlite3_vtab *pVTab); - int (*xDestroy)(sqlite3_vtab *pVTab); - int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); - int (*xClose)(sqlite3_vtab_cursor*); - int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, - int argc, sqlite3_value **argv); - int (*xNext)(sqlite3_vtab_cursor*); - int (*xEof)(sqlite3_vtab_cursor*); - int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); - int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); - int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); - int (*xBegin)(sqlite3_vtab *pVTab); - int (*xSync)(sqlite3_vtab *pVTab); - int (*xCommit)(sqlite3_vtab *pVTab); - int (*xRollback)(sqlite3_vtab *pVTab); - int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg); - int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); -}; - -/* -** CAPI3REF: Virtual Table Indexing Information -** KEYWORDS: sqlite3_index_info -** -** The sqlite3_index_info structure and its substructures is used as part -** of the [virtual table] interface to -** pass information into and receive the reply from the [xBestIndex] -** method of a [virtual table module]. The fields under **Inputs** are the -** inputs to xBestIndex and are read-only. xBestIndex inserts its -** results into the **Outputs** fields. -** -** ^(The aConstraint[] array records WHERE clause constraints of the form: -** -**
column OP expr
-** -** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is -** stored in aConstraint[].op using one of the -** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ -** ^(The index of the column is stored in -** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the -** expr on the right-hand side can be evaluated (and thus the constraint -** is usable) and false if it cannot.)^ -** -** ^The optimizer automatically inverts terms of the form "expr OP column" -** and makes other simplifications to the WHERE clause in an attempt to -** get as many WHERE clause terms into the form shown above as possible. -** ^The aConstraint[] array only reports WHERE clause terms that are -** relevant to the particular virtual table being queried. -** -** ^Information about the ORDER BY clause is stored in aOrderBy[]. -** ^Each term of aOrderBy records a column of the ORDER BY clause. -** -** The [xBestIndex] method must fill aConstraintUsage[] with information -** about what parameters to pass to xFilter. ^If argvIndex>0 then -** the right-hand side of the corresponding aConstraint[] is evaluated -** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit -** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite.)^ -** -** ^The idxNum and idxPtr values are recorded and passed into the -** [xFilter] method. -** ^[sqlite3_free()] is used to free idxPtr if and only if -** needToFreeIdxPtr is true. -** -** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in -** the correct order to satisfy the ORDER BY clause so that no separate -** sorting step is required. -** -** ^The estimatedCost value is an estimate of the cost of doing the -** particular lookup. A full scan of a table with N entries should have -** a cost of N. A binary search of a table of N entries should have a -** cost of approximately log(N). -*/ -struct sqlite3_index_info { - /* Inputs */ - int nConstraint; /* Number of entries in aConstraint */ - struct sqlite3_index_constraint { - int iColumn; /* Column on left-hand side of constraint */ - unsigned char op; /* Constraint operator */ - unsigned char usable; /* True if this constraint is usable */ - int iTermOffset; /* Used internally - xBestIndex should ignore */ - } *aConstraint; /* Table of WHERE clause constraints */ - int nOrderBy; /* Number of terms in the ORDER BY clause */ - struct sqlite3_index_orderby { - int iColumn; /* Column number */ - unsigned char desc; /* True for DESC. False for ASC. */ - } *aOrderBy; /* The ORDER BY clause */ - /* Outputs */ - struct sqlite3_index_constraint_usage { - int argvIndex; /* if >0, constraint is part of argv to xFilter */ - unsigned char omit; /* Do not code a test for this constraint */ - } *aConstraintUsage; - int idxNum; /* Number used to identify the index */ - char *idxStr; /* String, possibly obtained from sqlite3_malloc */ - int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ - int orderByConsumed; /* True if output is already ordered */ - double estimatedCost; /* Estimated cost of using this index */ -}; - -/* -** CAPI3REF: Virtual Table Constraint Operator Codes -** -** These macros defined the allowed values for the -** [sqlite3_index_info].aConstraint[].op field. Each value represents -** an operator that is part of a constraint term in the wHERE clause of -** a query that uses a [virtual table]. -*/ -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 - -/* -** CAPI3REF: Register A Virtual Table Implementation -** -** ^These routines are used to register a new [virtual table module] name. -** ^Module names must be registered before -** creating a new [virtual table] using the module and before using a -** preexisting [virtual table] for the module. -** -** ^The module name is registered on the [database connection] specified -** by the first parameter. ^The name of the module is given by the -** second parameter. ^The third parameter is a pointer to -** the implementation of the [virtual table module]. ^The fourth -** parameter is an arbitrary client data pointer that is passed through -** into the [xCreate] and [xConnect] methods of the virtual table module -** when a new virtual table is be being created or reinitialized. -** -** ^The sqlite3_create_module_v2() interface has a fifth parameter which -** is a pointer to a destructor for the pClientData. ^SQLite will -** invoke the destructor function (if it is not NULL) when SQLite -** no longer needs the pClientData pointer. ^The destructor will also -** be invoked if the call to sqlite3_create_module_v2() fails. -** ^The sqlite3_create_module() -** interface is equivalent to sqlite3_create_module_v2() with a NULL -** destructor. -*/ -SQLITE_API int sqlite3_create_module( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *p, /* Methods for the module */ - void *pClientData /* Client data for xCreate/xConnect */ -); -SQLITE_API int sqlite3_create_module_v2( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *p, /* Methods for the module */ - void *pClientData, /* Client data for xCreate/xConnect */ - void(*xDestroy)(void*) /* Module destructor function */ -); - -/* -** CAPI3REF: Virtual Table Instance Object -** KEYWORDS: sqlite3_vtab -** -** Every [virtual table module] implementation uses a subclass -** of this object to describe a particular instance -** of the [virtual table]. Each subclass will -** be tailored to the specific needs of the module implementation. -** The purpose of this superclass is to define certain fields that are -** common to all module implementations. -** -** ^Virtual tables methods can set an error message by assigning a -** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should -** take care that any prior string is freed by a call to [sqlite3_free()] -** prior to assigning a new string to zErrMsg. ^After the error message -** is delivered up to the client application, the string will be automatically -** freed by sqlite3_free() and the zErrMsg field will be zeroed. -*/ -struct sqlite3_vtab { - const sqlite3_module *pModule; /* The module for this virtual table */ - int nRef; /* NO LONGER USED */ - char *zErrMsg; /* Error message from sqlite3_mprintf() */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** CAPI3REF: Virtual Table Cursor Object -** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} -** -** Every [virtual table module] implementation uses a subclass of the -** following structure to describe cursors that point into the -** [virtual table] and are used -** to loop through the virtual table. Cursors are created using the -** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed -** by the [sqlite3_module.xClose | xClose] method. Cursors are used -** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods -** of the module. Each module implementation will define -** the content of a cursor structure to suit its own needs. -** -** This superclass exists in order to define fields of the cursor that -** are common to all implementations. -*/ -struct sqlite3_vtab_cursor { - sqlite3_vtab *pVtab; /* Virtual table of this cursor */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** CAPI3REF: Declare The Schema Of A Virtual Table -** -** ^The [xCreate] and [xConnect] methods of a -** [virtual table module] call this interface -** to declare the format (the names and datatypes of the columns) of -** the virtual tables they implement. -*/ -SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); - -/* -** CAPI3REF: Overload A Function For A Virtual Table -** -** ^(Virtual tables can provide alternative implementations of functions -** using the [xFindFunction] method of the [virtual table module]. -** But global versions of those functions -** must exist in order to be overloaded.)^ -** -** ^(This API makes sure a global version of a function with a particular -** name and number of parameters exists. If no such function exists -** before this API is called, a new function is created.)^ ^The implementation -** of the new function always causes an exception to be thrown. So -** the new function is not good for anything by itself. Its only -** purpose is to be a placeholder function that can be overloaded -** by a [virtual table]. -*/ -SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); - -/* -** The interface to the virtual-table mechanism defined above (back up -** to a comment remarkably similar to this one) is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** CAPI3REF: A Handle To An Open BLOB -** KEYWORDS: {BLOB handle} {BLOB handles} -** -** An instance of this object represents an open BLOB on which -** [sqlite3_blob_open | incremental BLOB I/O] can be performed. -** ^Objects of this type are created by [sqlite3_blob_open()] -** and destroyed by [sqlite3_blob_close()]. -** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces -** can be used to read or write small subsections of the BLOB. -** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. -*/ -typedef struct sqlite3_blob sqlite3_blob; - -/* -** CAPI3REF: Open A BLOB For Incremental I/O -** -** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located -** in row iRow, column zColumn, table zTable in database zDb; -** in other words, the same BLOB that would be selected by: -** -**
-**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
-** 
)^ -** -** ^If the flags parameter is non-zero, then the BLOB is opened for read -** and write access. ^If it is zero, the BLOB is opened for read access. -** ^It is not possible to open a column that is part of an index or primary -** key for writing. ^If [foreign key constraints] are enabled, it is -** not possible to open a column that is part of a [child key] for writing. -** -** ^Note that the database name is not the filename that contains -** the database but rather the symbolic name of the database that -** appears after the AS keyword when the database is connected using [ATTACH]. -** ^For the main database file, the database name is "main". -** ^For TEMP tables, the database name is "temp". -** -** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is written -** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set -** to be a null pointer.)^ -** ^This function sets the [database connection] error code and message -** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related -** functions. ^Note that the *ppBlob variable is always initialized in a -** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob -** regardless of the success or failure of this routine. -** -** ^(If the row that a BLOB handle points to is modified by an -** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects -** then the BLOB handle is marked as "expired". -** This is true if any column of the row is changed, even a column -** other than the one the BLOB handle is open on.)^ -** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for -** a expired BLOB handle fail with an return code of [SQLITE_ABORT]. -** ^(Changes written into a BLOB prior to the BLOB expiring are not -** rolled back by the expiration of the BLOB. Such changes will eventually -** commit if the transaction continues to completion.)^ -** -** ^Use the [sqlite3_blob_bytes()] interface to determine the size of -** the opened blob. ^The size of a blob may not be changed by this -** interface. Use the [UPDATE] SQL command to change the size of a -** blob. -** -** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces -** and the built-in [zeroblob] SQL function can be used, if desired, -** to create an empty, zero-filled blob in which to read or write using -** this interface. -** -** To avoid a resource leak, every open [BLOB handle] should eventually -** be released by a call to [sqlite3_blob_close()]. -*/ -SQLITE_API int sqlite3_blob_open( - sqlite3*, - const char *zDb, - const char *zTable, - const char *zColumn, - sqlite3_int64 iRow, - int flags, - sqlite3_blob **ppBlob -); - -/* -** CAPI3REF: Move a BLOB Handle to a New Row -** -** ^This function is used to move an existing blob handle so that it points -** to a different row of the same database table. ^The new row is identified -** by the rowid value passed as the second argument. Only the row can be -** changed. ^The database, table and column on which the blob handle is open -** remain the same. Moving an existing blob handle to a new row can be -** faster than closing the existing handle and opening a new one. -** -** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - -** it must exist and there must be either a blob or text value stored in -** the nominated column.)^ ^If the new row is not present in the table, or if -** it does not contain a blob or text value, or if another error occurs, an -** SQLite error code is returned and the blob handle is considered aborted. -** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or -** [sqlite3_blob_reopen()] on an aborted blob handle immediately return -** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle -** always returns zero. -** -** ^This function sets the database handle error code and message. -*/ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); - -/* -** CAPI3REF: Close A BLOB Handle -** -** ^Closes an open [BLOB handle]. -** -** ^Closing a BLOB shall cause the current transaction to commit -** if there are no other BLOBs, no pending prepared statements, and the -** database connection is in [autocommit mode]. -** ^If any writes were made to the BLOB, they might be held in cache -** until the close operation if they will fit. -** -** ^(Closing the BLOB often forces the changes -** out to disk and so if any I/O errors occur, they will likely occur -** at the time when the BLOB is closed. Any errors that occur during -** closing are reported as a non-zero return value.)^ -** -** ^(The BLOB is closed unconditionally. Even if this routine returns -** an error code, the BLOB is still closed.)^ -** -** ^Calling this routine with a null pointer (such as would be returned -** by a failed call to [sqlite3_blob_open()]) is a harmless no-op. -*/ -SQLITE_API int sqlite3_blob_close(sqlite3_blob *); - -/* -** CAPI3REF: Return The Size Of An Open BLOB -** -** ^Returns the size in bytes of the BLOB accessible via the -** successfully opened [BLOB handle] in its only argument. ^The -** incremental blob I/O routines can only read or overwriting existing -** blob content; they cannot change the size of a blob. -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -*/ -SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); - -/* -** CAPI3REF: Read Data From A BLOB Incrementally -** -** ^(This function is used to read data from an open [BLOB handle] into a -** caller-supplied buffer. N bytes of data are copied into buffer Z -** from the open BLOB, starting at offset iOffset.)^ -** -** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is -** less than zero, [SQLITE_ERROR] is returned and no data is read. -** ^The size of the blob (and hence the maximum value of N+iOffset) -** can be determined using the [sqlite3_blob_bytes()] interface. -** -** ^An attempt to read from an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. -** -** ^(On success, sqlite3_blob_read() returns SQLITE_OK. -** Otherwise, an [error code] or an [extended error code] is returned.)^ -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -** -** See also: [sqlite3_blob_write()]. -*/ -SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); - -/* -** CAPI3REF: Write Data Into A BLOB Incrementally -** -** ^This function is used to write data into an open [BLOB handle] from a -** caller-supplied buffer. ^N bytes of data are copied from the buffer Z -** into the open BLOB, starting at offset iOffset. -** -** ^If the [BLOB handle] passed as the first argument was not opened for -** writing (the flags parameter to [sqlite3_blob_open()] was zero), -** this function returns [SQLITE_READONLY]. -** -** ^This function may only modify the contents of the BLOB; it is -** not possible to increase the size of a BLOB using this API. -** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is written. ^If N is -** less than zero [SQLITE_ERROR] is returned and no data is written. -** The size of the BLOB (and hence the maximum value of N+iOffset) -** can be determined using the [sqlite3_blob_bytes()] interface. -** -** ^An attempt to write to an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred -** before the [BLOB handle] expired are not rolled back by the -** expiration of the handle, though of course those changes might -** have been overwritten by the statement that expired the BLOB handle -** or by other independent statements. -** -** ^(On success, sqlite3_blob_write() returns SQLITE_OK. -** Otherwise, an [error code] or an [extended error code] is returned.)^ -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -** -** See also: [sqlite3_blob_read()]. -*/ -SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); - -/* -** CAPI3REF: Virtual File System Objects -** -** A virtual filesystem (VFS) is an [sqlite3_vfs] object -** that SQLite uses to interact -** with the underlying operating system. Most SQLite builds come with a -** single default VFS that is appropriate for the host computer. -** New VFSes can be registered and existing VFSes can be unregistered. -** The following interfaces are provided. -** -** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. -** ^Names are case sensitive. -** ^Names are zero-terminated UTF-8 strings. -** ^If there is no match, a NULL pointer is returned. -** ^If zVfsName is NULL then the default VFS is returned. -** -** ^New VFSes are registered with sqlite3_vfs_register(). -** ^Each new VFS becomes the default VFS if the makeDflt flag is set. -** ^The same VFS can be registered multiple times without injury. -** ^To make an existing VFS into the default VFS, register it again -** with the makeDflt flag set. If two different VFSes with the -** same name are registered, the behavior is undefined. If a -** VFS is registered with a name that is NULL or an empty string, -** then the behavior is undefined. -** -** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. -** ^(If the default VFS is unregistered, another VFS is chosen as -** the default. The choice for the new VFS is arbitrary.)^ -*/ -SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); -SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); -SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); - -/* -** CAPI3REF: Mutexes -** -** The SQLite core uses these routines for thread -** synchronization. Though they are intended for internal -** use by SQLite, code that links against SQLite is -** permitted to use any of these routines. -** -** The SQLite source code contains multiple implementations -** of these mutex routines. An appropriate implementation -** is selected automatically at compile-time. ^(The following -** implementations are available in the SQLite core: -** -**
    -**
  • SQLITE_MUTEX_OS2 -**
  • SQLITE_MUTEX_PTHREAD -**
  • SQLITE_MUTEX_W32 -**
  • SQLITE_MUTEX_NOOP -**
)^ -** -** ^The SQLITE_MUTEX_NOOP implementation is a set of routines -** that does no real locking and is appropriate for use in -** a single-threaded application. ^The SQLITE_MUTEX_OS2, -** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations -** are appropriate for use on OS/2, Unix, and Windows. -** -** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor -** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex -** implementation is included with the library. In this case the -** application must supply a custom mutex implementation using the -** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function -** before calling sqlite3_initialize() or any other public sqlite3_ -** function that calls sqlite3_initialize().)^ -** -** ^The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. ^If it returns NULL -** that means that a mutex could not be allocated. ^SQLite -** will unwind its stack and return an error. ^(The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
    -**
  • SQLITE_MUTEX_FAST -**
  • SQLITE_MUTEX_RECURSIVE -**
  • SQLITE_MUTEX_STATIC_MASTER -**
  • SQLITE_MUTEX_STATIC_MEM -**
  • SQLITE_MUTEX_STATIC_MEM2 -**
  • SQLITE_MUTEX_STATIC_PRNG -**
  • SQLITE_MUTEX_STATIC_LRU -**
  • SQLITE_MUTEX_STATIC_LRU2 -**
)^ -** -** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) -** cause sqlite3_mutex_alloc() to create -** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. ^SQLite will only request a recursive mutex in -** cases where it really needs one. ^If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other -** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return -** a pointer to a static preexisting mutex. ^Six static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. ^But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. -** -** ^The sqlite3_mutex_free() routine deallocates a previously -** allocated dynamic mutex. ^SQLite is careful to deallocate every -** dynamic mutex that it allocates. The dynamic mutexes must not be in -** use when they are deallocated. Attempting to deallocate a static -** mutex results in undefined behavior. ^SQLite never deallocates -** a static mutex. -** -** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. ^If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] -** upon successful entry. ^(Mutexes created using -** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. -** In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter.)^ ^(If the same thread tries to enter any other -** kind of mutex more than once, the behavior is undefined. -** SQLite will never exhibit -** such behavior in its own use of mutexes.)^ -** -** ^(Some systems (for example, Windows 95) do not support the operation -** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() -** will always return SQLITE_BUSY. The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable behavior.)^ -** -** ^The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. ^(The behavior -** is undefined if the mutex is not currently entered by the -** calling thread or is not currently allocated. SQLite will -** never do either.)^ -** -** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or -** sqlite3_mutex_leave() is a NULL pointer, then all three routines -** behave as no-ops. -** -** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. -*/ -SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); -SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); -SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); -SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); -SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); - -/* -** CAPI3REF: Mutex Methods Object -** -** An instance of this structure defines the low-level routines -** used to allocate and use mutexes. -** -** Usually, the default mutex implementations provided by SQLite are -** sufficient, however the user has the option of substituting a custom -** implementation for specialized deployments or systems for which SQLite -** does not provide a suitable implementation. In this case, the user -** creates and populates an instance of this structure to pass -** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. -** Additionally, an instance of this structure can be used as an -** output variable when querying the system for the current mutex -** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. -** -** ^The xMutexInit method defined by this structure is invoked as -** part of system initialization by the sqlite3_initialize() function. -** ^The xMutexInit routine is called by SQLite exactly once for each -** effective call to [sqlite3_initialize()]. -** -** ^The xMutexEnd method defined by this structure is invoked as -** part of system shutdown by the sqlite3_shutdown() function. The -** implementation of this method is expected to release all outstanding -** resources obtained by the mutex methods implementation, especially -** those obtained by the xMutexInit method. ^The xMutexEnd() -** interface is invoked exactly once for each call to [sqlite3_shutdown()]. -** -** ^(The remaining seven methods defined by this structure (xMutexAlloc, -** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and -** xMutexNotheld) implement the following interfaces (respectively): -** -**
    -**
  • [sqlite3_mutex_alloc()]
  • -**
  • [sqlite3_mutex_free()]
  • -**
  • [sqlite3_mutex_enter()]
  • -**
  • [sqlite3_mutex_try()]
  • -**
  • [sqlite3_mutex_leave()]
  • -**
  • [sqlite3_mutex_held()]
  • -**
  • [sqlite3_mutex_notheld()]
  • -**
)^ -** -** The only difference is that the public sqlite3_XXX functions enumerated -** above silently ignore any invocations that pass a NULL pointer instead -** of a valid mutex handle. The implementations of the methods defined -** by this structure are not required to handle this case, the results -** of passing a NULL pointer instead of a valid mutex handle are undefined -** (i.e. it is acceptable to provide an implementation that segfaults if -** it is passed a NULL pointer). -** -** The xMutexInit() method must be threadsafe. ^It must be harmless to -** invoke xMutexInit() multiple times within the same process and without -** intervening calls to xMutexEnd(). Second and subsequent calls to -** xMutexInit() must be no-ops. -** -** ^xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] -** and its associates). ^Similarly, xMutexAlloc() must not use SQLite memory -** allocation for a static mutex. ^However xMutexAlloc() may use SQLite -** memory allocation for a fast or recursive mutex. -** -** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is -** called, but only if the prior call to xMutexInit returned SQLITE_OK. -** If xMutexInit fails in any way, it is expected to clean up after itself -** prior to returning. -*/ -typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; -struct sqlite3_mutex_methods { - int (*xMutexInit)(void); - int (*xMutexEnd)(void); - sqlite3_mutex *(*xMutexAlloc)(int); - void (*xMutexFree)(sqlite3_mutex *); - void (*xMutexEnter)(sqlite3_mutex *); - int (*xMutexTry)(sqlite3_mutex *); - void (*xMutexLeave)(sqlite3_mutex *); - int (*xMutexHeld)(sqlite3_mutex *); - int (*xMutexNotheld)(sqlite3_mutex *); -}; - -/* -** CAPI3REF: Mutex Verification Routines -** -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines -** are intended for use inside assert() statements. ^The SQLite core -** never uses these routines except inside an assert() and applications -** are advised to follow the lead of the core. ^The SQLite core only -** provides implementations for these routines when it is compiled -** with the SQLITE_DEBUG flag. ^External mutex implementations -** are only required to provide these routines if SQLITE_DEBUG is -** defined and if NDEBUG is not defined. -** -** ^These routines should return true if the mutex in their argument -** is held or not held, respectively, by the calling thread. -** -** ^The implementation is not required to provided versions of these -** routines that actually work. If the implementation does not provide working -** versions of these routines, it should at least provide stubs that always -** return true so that one does not get spurious assertion failures. -** -** ^If the argument to sqlite3_mutex_held() is a NULL pointer then -** the routine should return 1. This seems counter-intuitive since -** clearly the mutex cannot be held if it does not exist. But the -** the reason the mutex does not exist is because the build is not -** using mutexes. And we do not want the assert() containing the -** call to sqlite3_mutex_held() to fail, so a non-zero return is -** the appropriate thing to do. ^The sqlite3_mutex_notheld() -** interface should also return 1 when given a NULL pointer. -*/ -#ifndef NDEBUG -SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); -SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); -#endif - -/* -** CAPI3REF: Mutex Types -** -** The [sqlite3_mutex_alloc()] interface takes a single argument -** which is one of these integer constants. -** -** The set of static mutexes may change from one SQLite release to the -** next. Applications that override the built-in mutex logic must be -** prepared to accommodate additional static mutexes. -*/ -#define SQLITE_MUTEX_FAST 0 -#define SQLITE_MUTEX_RECURSIVE 1 -#define SQLITE_MUTEX_STATIC_MASTER 2 -#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ -#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ -#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ -#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ -#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ -#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ -#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ - -/* -** CAPI3REF: Retrieve the mutex for a database connection -** -** ^This interface returns a pointer the [sqlite3_mutex] object that -** serializes access to the [database connection] given in the argument -** when the [threading mode] is Serialized. -** ^If the [threading mode] is Single-thread or Multi-thread then this -** routine returns a NULL pointer. -*/ -SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); - -/* -** CAPI3REF: Low-Level Control Of Database Files -** -** ^The [sqlite3_file_control()] interface makes a direct call to the -** xFileControl method for the [sqlite3_io_methods] object associated -** with a particular database identified by the second argument. ^The -** name of the database is "main" for the main database or "temp" for the -** TEMP database, or the name that appears after the AS keyword for -** databases that are added using the [ATTACH] SQL command. -** ^A NULL pointer can be used in place of "main" to refer to the -** main database file. -** ^The third and fourth parameters to this routine -** are passed directly through to the second and third parameters of -** the xFileControl method. ^The return value of the xFileControl -** method becomes the return value of this routine. -** -** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes -** a pointer to the underlying [sqlite3_file] object to be written into -** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER -** case is a short-circuit path which does not actually invoke the -** underlying sqlite3_io_methods.xFileControl method. -** -** ^If the second parameter (zDbName) does not match the name of any -** open database file, then SQLITE_ERROR is returned. ^This error -** code is not remembered and will not be recalled by [sqlite3_errcode()] -** or [sqlite3_errmsg()]. The underlying xFileControl method might -** also return SQLITE_ERROR. There is no way to distinguish between -** an incorrect zDbName and an SQLITE_ERROR return from the underlying -** xFileControl method. -** -** See also: [SQLITE_FCNTL_LOCKSTATE] -*/ -SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); - -/* -** CAPI3REF: Testing Interface -** -** ^The sqlite3_test_control() interface is used to read out internal -** state of SQLite and to inject faults into SQLite for testing -** purposes. ^The first parameter is an operation code that determines -** the number, meaning, and operation of all subsequent parameters. -** -** This interface is not for use by applications. It exists solely -** for verifying the correct operation of the SQLite library. Depending -** on how the SQLite library is compiled, this interface might not exist. -** -** The details of the operation codes, their meanings, the parameters -** they take, and what they do are all subject to change without notice. -** Unlike most of the SQLite API, this function is not guaranteed to -** operate consistently from one release to the next. -*/ -SQLITE_API int sqlite3_test_control(int op, ...); - -/* -** CAPI3REF: Testing Interface Operation Codes -** -** These constants are the valid operation code parameters used -** as the first argument to [sqlite3_test_control()]. -** -** These parameters and their meanings are subject to change -** without notice. These values are for testing purposes only. -** Applications should not use any of these parameters or the -** [sqlite3_test_control()] interface. -*/ -#define SQLITE_TESTCTRL_FIRST 5 -#define SQLITE_TESTCTRL_PRNG_SAVE 5 -#define SQLITE_TESTCTRL_PRNG_RESTORE 6 -#define SQLITE_TESTCTRL_PRNG_RESET 7 -#define SQLITE_TESTCTRL_BITVEC_TEST 8 -#define SQLITE_TESTCTRL_FAULT_INSTALL 9 -#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 -#define SQLITE_TESTCTRL_PENDING_BYTE 11 -#define SQLITE_TESTCTRL_ASSERT 12 -#define SQLITE_TESTCTRL_ALWAYS 13 -#define SQLITE_TESTCTRL_RESERVE 14 -#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 -#define SQLITE_TESTCTRL_ISKEYWORD 16 -#define SQLITE_TESTCTRL_PGHDRSZ 17 -#define SQLITE_TESTCTRL_SCRATCHMALLOC 18 -#define SQLITE_TESTCTRL_LAST 18 - -/* -** CAPI3REF: SQLite Runtime Status -** -** ^This interface is used to retrieve runtime status information -** about the performance of SQLite, and optionally to reset various -** highwater marks. ^The first argument is an integer code for -** the specific parameter to measure. ^(Recognized integer codes -** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].)^ -** ^The current value of the parameter is returned into *pCurrent. -** ^The highest recorded value is returned in *pHighwater. ^If the -** resetFlag is true, then the highest record value is reset after -** *pHighwater is written. ^(Some parameters do not record the highest -** value. For those parameters -** nothing is written into *pHighwater and the resetFlag is ignored.)^ -** ^(Other parameters record only the highwater mark and not the current -** value. For these latter parameters nothing is written into *pCurrent.)^ -** -** ^The sqlite3_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. -** -** This routine is threadsafe but is not atomic. This routine can be -** called while other threads are running the same or different SQLite -** interfaces. However the values returned in *pCurrent and -** *pHighwater reflect the status of SQLite at different points in time -** and it is possible that another thread might change the parameter -** in between the times when *pCurrent and *pHighwater are written. -** -** See also: [sqlite3_db_status()] -*/ -SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); - - -/* -** CAPI3REF: Status Parameters -** -** These integer constants designate various run-time status parameters -** that can be returned by [sqlite3_status()]. -** -**
-** ^(
SQLITE_STATUS_MEMORY_USED
-**
This parameter is the current amount of memory checked out -** using [sqlite3_malloc()], either directly or indirectly. The -** figure includes calls made to [sqlite3_malloc()] by the application -** and internal memory usage by the SQLite library. Scratch memory -** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache -** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in -** this parameter. The amount returned is the sum of the allocation -** sizes as reported by the xSize method in [sqlite3_mem_methods].
)^ -** -** ^(
SQLITE_STATUS_MALLOC_SIZE
-**
This parameter records the largest memory allocation request -** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their -** internal equivalents). Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** ^(
SQLITE_STATUS_MALLOC_COUNT
-**
This parameter records the number of separate memory allocations -** currently checked out.
)^ -** -** ^(
SQLITE_STATUS_PAGECACHE_USED
-**
This parameter returns the number of pages used out of the -** [pagecache memory allocator] that was configured using -** [SQLITE_CONFIG_PAGECACHE]. The -** value returned is in pages, not in bytes.
)^ -** -** ^(
SQLITE_STATUS_PAGECACHE_OVERFLOW
-**
This parameter returns the number of bytes of page cache -** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] -** buffer and where forced to overflow to [sqlite3_malloc()]. The -** returned value includes allocations that overflowed because they -** where too large (they were larger than the "sz" parameter to -** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because -** no space was left in the page cache.
)^ -** -** ^(
SQLITE_STATUS_PAGECACHE_SIZE
-**
This parameter records the largest memory allocation request -** handed to [pagecache memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** ^(
SQLITE_STATUS_SCRATCH_USED
-**
This parameter returns the number of allocations used out of the -** [scratch memory allocator] configured using -** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not -** in bytes. Since a single thread may only have one scratch allocation -** outstanding at time, this parameter also reports the number of threads -** using scratch memory at the same time.
)^ -** -** ^(
SQLITE_STATUS_SCRATCH_OVERFLOW
-**
This parameter returns the number of bytes of scratch memory -** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] -** buffer and where forced to overflow to [sqlite3_malloc()]. The values -** returned include overflows because the requested allocation was too -** larger (that is, because the requested allocation was larger than the -** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer -** slots were available. -**
)^ -** -** ^(
SQLITE_STATUS_SCRATCH_SIZE
-**
This parameter records the largest memory allocation request -** handed to [scratch memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** ^(
SQLITE_STATUS_PARSER_STACK
-**
This parameter records the deepest parser stack. It is only -** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
)^ -**
-** -** New status parameters may be added from time to time. -*/ -#define SQLITE_STATUS_MEMORY_USED 0 -#define SQLITE_STATUS_PAGECACHE_USED 1 -#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 -#define SQLITE_STATUS_SCRATCH_USED 3 -#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 -#define SQLITE_STATUS_MALLOC_SIZE 5 -#define SQLITE_STATUS_PARSER_STACK 6 -#define SQLITE_STATUS_PAGECACHE_SIZE 7 -#define SQLITE_STATUS_SCRATCH_SIZE 8 -#define SQLITE_STATUS_MALLOC_COUNT 9 - -/* -** CAPI3REF: Database Connection Status -** -** ^This interface is used to retrieve runtime status information -** about a single [database connection]. ^The first argument is the -** database connection object to be interrogated. ^The second argument -** is an integer constant, taken from the set of -** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros, that -** determines the parameter to interrogate. The set of -** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros is likely -** to grow in future releases of SQLite. -** -** ^The current value of the requested parameter is written into *pCur -** and the highest instantaneous value is written into *pHiwtr. ^If -** the resetFlg is true, then the highest instantaneous value is -** reset back down to the current value. -** -** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. -** -** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. -*/ -SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); - -/* -** CAPI3REF: Status Parameters for database connections -** -** These constants are the available integer "verbs" that can be passed as -** the second argument to the [sqlite3_db_status()] interface. -** -** New verbs may be added in future releases of SQLite. Existing verbs -** might be discontinued. Applications should check the return code from -** [sqlite3_db_status()] to make sure that the call worked. -** The [sqlite3_db_status()] interface will return a non-zero error code -** if a discontinued or unsupported verb is invoked. -** -**
-** ^(
SQLITE_DBSTATUS_LOOKASIDE_USED
-**
This parameter returns the number of lookaside memory slots currently -** checked out.
)^ -** -** ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
-**
This parameter returns the number malloc attempts that were -** satisfied using lookaside memory. Only the high-water value is meaningful; -** the current value is always zero. -** checked out.
)^ -** -** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
-**
This parameter returns the number malloc attempts that might have -** been satisfied using lookaside memory but failed due to the amount of -** memory requested being larger than the lookaside slot size. -** Only the high-water value is meaningful; -** the current value is always zero. -** checked out.
)^ -** -** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
-**
This parameter returns the number malloc attempts that might have -** been satisfied using lookaside memory but failed due to all lookaside -** memory already being in use. -** Only the high-water value is meaningful; -** the current value is always zero. -** checked out.
)^ -** -** ^(
SQLITE_DBSTATUS_CACHE_USED
-**
This parameter returns the approximate number of of bytes of heap -** memory used by all pager caches associated with the database connection.)^ -** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. -** -** ^(
SQLITE_DBSTATUS_SCHEMA_USED
-**
This parameter returns the approximate number of of bytes of heap -** memory used to store the schema for all databases associated -** with the connection - main, temp, and any [ATTACH]-ed databases.)^ -** ^The full amount of memory used by the schemas is reported, even if the -** schema memory is shared with other database connections due to -** [shared cache mode] being enabled. -** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. -** -** ^(
SQLITE_DBSTATUS_STMT_USED
-**
This parameter returns the approximate number of of bytes of heap -** and lookaside memory used by all prepared statements associated with -** the database connection.)^ -** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. -**
-**
-*/ -#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 -#define SQLITE_DBSTATUS_CACHE_USED 1 -#define SQLITE_DBSTATUS_SCHEMA_USED 2 -#define SQLITE_DBSTATUS_STMT_USED 3 -#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 -#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 -#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 -#define SQLITE_DBSTATUS_MAX 6 /* Largest defined DBSTATUS */ - - -/* -** CAPI3REF: Prepared Statement Status -** -** ^(Each prepared statement maintains various -** [SQLITE_STMTSTATUS_SORT | counters] that measure the number -** of times it has performed specific operations.)^ These counters can -** be used to monitor the performance characteristics of the prepared -** statements. For example, if the number of table steps greatly exceeds -** the number of table searches or result rows, that would tend to indicate -** that the prepared statement is using a full table scan rather than -** an index. -** -** ^(This interface is used to retrieve and reset counter values from -** a [prepared statement]. The first argument is the prepared statement -** object to be interrogated. The second argument -** is an integer code for a specific [SQLITE_STMTSTATUS_SORT | counter] -** to be interrogated.)^ -** ^The current value of the requested counter is returned. -** ^If the resetFlg is true, then the counter is reset to zero after this -** interface call returns. -** -** See also: [sqlite3_status()] and [sqlite3_db_status()]. -*/ -SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); - -/* -** CAPI3REF: Status Parameters for prepared statements -** -** These preprocessor macros define integer codes that name counter -** values associated with the [sqlite3_stmt_status()] interface. -** The meanings of the various counters are as follows: -** -**
-**
SQLITE_STMTSTATUS_FULLSCAN_STEP
-**
^This is the number of times that SQLite has stepped forward in -** a table as part of a full table scan. Large numbers for this counter -** may indicate opportunities for performance improvement through -** careful use of indices.
-** -**
SQLITE_STMTSTATUS_SORT
-**
^This is the number of sort operations that have occurred. -** A non-zero value in this counter may indicate an opportunity to -** improvement performance through careful use of indices.
-** -**
SQLITE_STMTSTATUS_AUTOINDEX
-**
^This is the number of rows inserted into transient indices that -** were created automatically in order to help joins run faster. -** A non-zero value in this counter may indicate an opportunity to -** improvement performance by adding permanent indices that do not -** need to be reinitialized each time the statement is run.
-** -**
-*/ -#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 -#define SQLITE_STMTSTATUS_SORT 2 -#define SQLITE_STMTSTATUS_AUTOINDEX 3 - -/* -** CAPI3REF: Custom Page Cache Object -** -** The sqlite3_pcache type is opaque. It is implemented by -** the pluggable module. The SQLite core has no knowledge of -** its size or internal structure and never deals with the -** sqlite3_pcache object except by holding and passing pointers -** to the object. -** -** See [sqlite3_pcache_methods] for additional information. -*/ -typedef struct sqlite3_pcache sqlite3_pcache; - -/* -** CAPI3REF: Application Defined Page Cache. -** KEYWORDS: {page cache} -** -** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can -** register an alternative page cache implementation by passing in an -** instance of the sqlite3_pcache_methods structure.)^ -** In many applications, most of the heap memory allocated by -** SQLite is used for the page cache. -** By implementing a -** custom page cache using this API, an application can better control -** the amount of memory consumed by SQLite, the way in which -** that memory is allocated and released, and the policies used to -** determine exactly which parts of a database file are cached and for -** how long. -** -** The alternative page cache mechanism is an -** extreme measure that is only needed by the most demanding applications. -** The built-in page cache is recommended for most uses. -** -** ^(The contents of the sqlite3_pcache_methods structure are copied to an -** internal buffer by SQLite within the call to [sqlite3_config]. Hence -** the application may discard the parameter after the call to -** [sqlite3_config()] returns.)^ -** -** ^(The xInit() method is called once for each effective -** call to [sqlite3_initialize()])^ -** (usually only once during the lifetime of the process). ^(The xInit() -** method is passed a copy of the sqlite3_pcache_methods.pArg value.)^ -** The intent of the xInit() method is to set up global data structures -** required by the custom page cache implementation. -** ^(If the xInit() method is NULL, then the -** built-in default page cache is used instead of the application defined -** page cache.)^ -** -** ^The xShutdown() method is called by [sqlite3_shutdown()]. -** It can be used to clean up -** any outstanding resources before process shutdown, if required. -** ^The xShutdown() method may be NULL. -** -** ^SQLite automatically serializes calls to the xInit method, -** so the xInit method need not be threadsafe. ^The -** xShutdown method is only called from [sqlite3_shutdown()] so it does -** not need to be threadsafe either. All other methods must be threadsafe -** in multithreaded applications. -** -** ^SQLite will never invoke xInit() more than once without an intervening -** call to xShutdown(). -** -** ^SQLite invokes the xCreate() method to construct a new cache instance. -** SQLite will typically create one cache instance for each open database file, -** though this is not guaranteed. ^The -** first parameter, szPage, is the size in bytes of the pages that must -** be allocated by the cache. ^szPage will not be a power of two. ^szPage -** will the page size of the database file that is to be cached plus an -** increment (here called "R") of less than 250. SQLite will use the -** extra R bytes on each page to store metadata about the underlying -** database page on disk. The value of R depends -** on the SQLite version, the target platform, and how SQLite was compiled. -** ^(R is constant for a particular build of SQLite. Except, there are two -** distinct values of R when SQLite is compiled with the proprietary -** ZIPVFS extension.)^ ^The second argument to -** xCreate(), bPurgeable, is true if the cache being created will -** be used to cache database pages of a file stored on disk, or -** false if it is used for an in-memory database. The cache implementation -** does not have to do anything special based with the value of bPurgeable; -** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will -** never invoke xUnpin() except to deliberately delete a page. -** ^In other words, calls to xUnpin() on a cache with bPurgeable set to -** false will always have the "discard" flag set to true. -** ^Hence, a cache created with bPurgeable false will -** never contain any unpinned pages. -** -** ^(The xCachesize() method may be called at any time by SQLite to set the -** suggested maximum cache-size (number of pages stored by) the cache -** instance passed as the first argument. This is the value configured using -** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable -** parameter, the implementation is not required to do anything with this -** value; it is advisory only. -** -** The xPagecount() method must return the number of pages currently -** stored in the cache, both pinned and unpinned. -** -** The xFetch() method locates a page in the cache and returns a pointer to -** the page, or a NULL pointer. -** A "page", in this context, means a buffer of szPage bytes aligned at an -** 8-byte boundary. The page to be fetched is determined by the key. ^The -** mimimum key value is 1. After it has been retrieved using xFetch, the page -** is considered to be "pinned". -** -** If the requested page is already in the page cache, then the page cache -** implementation must return a pointer to the page buffer with its content -** intact. If the requested page is not already in the cache, then the -** cache implementation should use the value of the createFlag -** parameter to help it determined what action to take: -** -** -**
createFlag Behaviour when page is not already in cache -**
0 Do not allocate a new page. Return NULL. -**
1 Allocate a new page if it easy and convenient to do so. -** Otherwise return NULL. -**
2 Make every effort to allocate a new page. Only return -** NULL if allocating a new page is effectively impossible. -**
-** -** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite -** will only use a createFlag of 2 after a prior call with a createFlag of 1 -** failed.)^ In between the to xFetch() calls, SQLite may -** attempt to unpin one or more cache pages by spilling the content of -** pinned pages to disk and synching the operating system disk cache. -** -** ^xUnpin() is called by SQLite with a pointer to a currently pinned page -** as its second argument. If the third parameter, discard, is non-zero, -** then the page must be evicted from the cache. -** ^If the discard parameter is -** zero, then the page may be discarded or retained at the discretion of -** page cache implementation. ^The page cache implementation -** may choose to evict unpinned pages at any time. -** -** The cache must not perform any reference counting. A single -** call to xUnpin() unpins the page regardless of the number of prior calls -** to xFetch(). -** -** The xRekey() method is used to change the key value associated with the -** page passed as the second argument. If the cache -** previously contains an entry associated with newKey, it must be -** discarded. ^Any prior cache entry associated with newKey is guaranteed not -** to be pinned. -** -** When SQLite calls the xTruncate() method, the cache must discard all -** existing cache entries with page numbers (keys) greater than or equal -** to the value of the iLimit parameter passed to xTruncate(). If any -** of these pages are pinned, they are implicitly unpinned, meaning that -** they can be safely discarded. -** -** ^The xDestroy() method is used to delete a cache allocated by xCreate(). -** All resources associated with the specified cache should be freed. ^After -** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] -** handle invalid, and will not use it with any other sqlite3_pcache_methods -** functions. -*/ -typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; -struct sqlite3_pcache_methods { - void *pArg; - int (*xInit)(void*); - void (*xShutdown)(void*); - sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); - void (*xCachesize)(sqlite3_pcache*, int nCachesize); - int (*xPagecount)(sqlite3_pcache*); - void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); - void (*xUnpin)(sqlite3_pcache*, void*, int discard); - void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); - void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); - void (*xDestroy)(sqlite3_pcache*); -}; - -/* -** CAPI3REF: Online Backup Object -** -** The sqlite3_backup object records state information about an ongoing -** online backup operation. ^The sqlite3_backup object is created by -** a call to [sqlite3_backup_init()] and is destroyed by a call to -** [sqlite3_backup_finish()]. -** -** See Also: [Using the SQLite Online Backup API] -*/ -typedef struct sqlite3_backup sqlite3_backup; - -/* -** CAPI3REF: Online Backup API. -** -** The backup API copies the content of one database into another. -** It is useful either for creating backups of databases or -** for copying in-memory databases to or from persistent files. -** -** See Also: [Using the SQLite Online Backup API] -** -** ^SQLite holds a write transaction open on the destination database file -** for the duration of the backup operation. -** ^The source database is read-locked only while it is being read; -** it is not locked continuously for the entire backup operation. -** ^Thus, the backup may be performed on a live source database without -** preventing other database connections from -** reading or writing to the source database while the backup is underway. -** -** ^(To perform a backup operation: -**
    -**
  1. sqlite3_backup_init() is called once to initialize the -** backup, -**
  2. sqlite3_backup_step() is called one or more times to transfer -** the data between the two databases, and finally -**
  3. sqlite3_backup_finish() is called to release all resources -** associated with the backup operation. -**
)^ -** There should be exactly one call to sqlite3_backup_finish() for each -** successful call to sqlite3_backup_init(). -** -** sqlite3_backup_init() -** -** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the -** [database connection] associated with the destination database -** and the database name, respectively. -** ^The database name is "main" for the main database, "temp" for the -** temporary database, or the name specified after the AS keyword in -** an [ATTACH] statement for an attached database. -** ^The S and M arguments passed to -** sqlite3_backup_init(D,N,S,M) identify the [database connection] -** and database name of the source database, respectively. -** ^The source and destination [database connections] (parameters S and D) -** must be different or else sqlite3_backup_init(D,N,S,M) will fail with -** an error. -** -** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is -** returned and an error code and error message are stored in the -** destination [database connection] D. -** ^The error code and message for the failed call to sqlite3_backup_init() -** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or -** [sqlite3_errmsg16()] functions. -** ^A successful call to sqlite3_backup_init() returns a pointer to an -** [sqlite3_backup] object. -** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and -** sqlite3_backup_finish() functions to perform the specified backup -** operation. -** -** sqlite3_backup_step() -** -** ^Function sqlite3_backup_step(B,N) will copy up to N pages between -** the source and destination databases specified by [sqlite3_backup] object B. -** ^If N is negative, all remaining source pages are copied. -** ^If sqlite3_backup_step(B,N) successfully copies N pages and there -** are still more pages to be copied, then the function returns [SQLITE_OK]. -** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages -** from source to destination, then it returns [SQLITE_DONE]. -** ^If an error occurs while running sqlite3_backup_step(B,N), -** then an [error code] is returned. ^As well as [SQLITE_OK] and -** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], -** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. -** -** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if -**
    -**
  1. the destination database was opened read-only, or -**
  2. the destination database is using write-ahead-log journaling -** and the destination and source page sizes differ, or -**
  3. the destination database is an in-memory database and the -** destination and source page sizes differ. -**
)^ -** -** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then -** the [sqlite3_busy_handler | busy-handler function] -** is invoked (if one is specified). ^If the -** busy-handler returns non-zero before the lock is available, then -** [SQLITE_BUSY] is returned to the caller. ^In this case the call to -** sqlite3_backup_step() can be retried later. ^If the source -** [database connection] -** is being used to write to the source database when sqlite3_backup_step() -** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this -** case the call to sqlite3_backup_step() can be retried later on. ^(If -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or -** [SQLITE_READONLY] is returned, then -** there is no point in retrying the call to sqlite3_backup_step(). These -** errors are considered fatal.)^ The application must accept -** that the backup operation has failed and pass the backup operation handle -** to the sqlite3_backup_finish() to release associated resources. -** -** ^The first call to sqlite3_backup_step() obtains an exclusive lock -** on the destination file. ^The exclusive lock is not released until either -** sqlite3_backup_finish() is called or the backup operation is complete -** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to -** sqlite3_backup_step() obtains a [shared lock] on the source database that -** lasts for the duration of the sqlite3_backup_step() call. -** ^Because the source database is not locked between calls to -** sqlite3_backup_step(), the source database may be modified mid-way -** through the backup process. ^If the source database is modified by an -** external process or via a database connection other than the one being -** used by the backup operation, then the backup will be automatically -** restarted by the next call to sqlite3_backup_step(). ^If the source -** database is modified by the using the same database connection as is used -** by the backup operation, then the backup database is automatically -** updated at the same time. -** -** sqlite3_backup_finish() -** -** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the -** application wishes to abandon the backup operation, the application -** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). -** ^The sqlite3_backup_finish() interfaces releases all -** resources associated with the [sqlite3_backup] object. -** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any -** active write-transaction on the destination database is rolled back. -** The [sqlite3_backup] object is invalid -** and may not be used following a call to sqlite3_backup_finish(). -** -** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no -** sqlite3_backup_step() errors occurred, regardless or whether or not -** sqlite3_backup_step() completed. -** ^If an out-of-memory condition or IO error occurred during any prior -** sqlite3_backup_step() call on the same [sqlite3_backup] object, then -** sqlite3_backup_finish() returns the corresponding [error code]. -** -** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() -** is not a permanent error and does not affect the return value of -** sqlite3_backup_finish(). -** -** sqlite3_backup_remaining(), sqlite3_backup_pagecount() -** -** ^Each call to sqlite3_backup_step() sets two values inside -** the [sqlite3_backup] object: the number of pages still to be backed -** up and the total number of pages in the source database file. -** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces -** retrieve these two values, respectively. -** -** ^The values returned by these functions are only updated by -** sqlite3_backup_step(). ^If the source database is modified during a backup -** operation, then the values are not updated to account for any extra -** pages that need to be updated or the size of the source database file -** changing. -** -** Concurrent Usage of Database Handles -** -** ^The source [database connection] may be used by the application for other -** purposes while a backup operation is underway or being initialized. -** ^If SQLite is compiled and configured to support threadsafe database -** connections, then the source database connection may be used concurrently -** from within other threads. -** -** However, the application must guarantee that the destination -** [database connection] is not passed to any other API (by any thread) after -** sqlite3_backup_init() is called and before the corresponding call to -** sqlite3_backup_finish(). SQLite does not currently check to see -** if the application incorrectly accesses the destination [database connection] -** and so no error code is reported, but the operations may malfunction -** nevertheless. Use of the destination database connection while a -** backup is in progress might also also cause a mutex deadlock. -** -** If running in [shared cache mode], the application must -** guarantee that the shared cache used by the destination database -** is not accessed while the backup is running. In practice this means -** that the application must guarantee that the disk file being -** backed up to is not accessed by any connection within the process, -** not just the specific connection that was passed to sqlite3_backup_init(). -** -** The [sqlite3_backup] object itself is partially threadsafe. Multiple -** threads may safely make multiple concurrent calls to sqlite3_backup_step(). -** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() -** APIs are not strictly speaking threadsafe. If they are invoked at the -** same time as another thread is invoking sqlite3_backup_step() it is -** possible that they return invalid values. -*/ -SQLITE_API sqlite3_backup *sqlite3_backup_init( - sqlite3 *pDest, /* Destination database handle */ - const char *zDestName, /* Destination database name */ - sqlite3 *pSource, /* Source database handle */ - const char *zSourceName /* Source database name */ -); -SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); -SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); -SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); -SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); - -/* -** CAPI3REF: Unlock Notification -** -** ^When running in shared-cache mode, a database operation may fail with -** an [SQLITE_LOCKED] error if the required locks on the shared-cache or -** individual tables within the shared-cache cannot be obtained. See -** [SQLite Shared-Cache Mode] for a description of shared-cache locking. -** ^This API may be used to register a callback that SQLite will invoke -** when the connection currently holding the required lock relinquishes it. -** ^This API is only available if the library was compiled with the -** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. -** -** See Also: [Using the SQLite Unlock Notification Feature]. -** -** ^Shared-cache locks are released when a database connection concludes -** its current transaction, either by committing it or rolling it back. -** -** ^When a connection (known as the blocked connection) fails to obtain a -** shared-cache lock and SQLITE_LOCKED is returned to the caller, the -** identity of the database connection (the blocking connection) that -** has locked the required resource is stored internally. ^After an -** application receives an SQLITE_LOCKED error, it may call the -** sqlite3_unlock_notify() method with the blocked connection handle as -** the first argument to register for a callback that will be invoked -** when the blocking connections current transaction is concluded. ^The -** callback is invoked from within the [sqlite3_step] or [sqlite3_close] -** call that concludes the blocking connections transaction. -** -** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, -** there is a chance that the blocking connection will have already -** concluded its transaction by the time sqlite3_unlock_notify() is invoked. -** If this happens, then the specified callback is invoked immediately, -** from within the call to sqlite3_unlock_notify().)^ -** -** ^If the blocked connection is attempting to obtain a write-lock on a -** shared-cache table, and more than one other connection currently holds -** a read-lock on the same table, then SQLite arbitrarily selects one of -** the other connections to use as the blocking connection. -** -** ^(There may be at most one unlock-notify callback registered by a -** blocked connection. If sqlite3_unlock_notify() is called when the -** blocked connection already has a registered unlock-notify callback, -** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is -** called with a NULL pointer as its second argument, then any existing -** unlock-notify callback is canceled. ^The blocked connections -** unlock-notify callback may also be canceled by closing the blocked -** connection using [sqlite3_close()]. -** -** The unlock-notify callback is not reentrant. If an application invokes -** any sqlite3_xxx API functions from within an unlock-notify callback, a -** crash or deadlock may be the result. -** -** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always -** returns SQLITE_OK. -** -** Callback Invocation Details -** -** When an unlock-notify callback is registered, the application provides a -** single void* pointer that is passed to the callback when it is invoked. -** However, the signature of the callback function allows SQLite to pass -** it an array of void* context pointers. The first argument passed to -** an unlock-notify callback is a pointer to an array of void* pointers, -** and the second is the number of entries in the array. -** -** When a blocking connections transaction is concluded, there may be -** more than one blocked connection that has registered for an unlock-notify -** callback. ^If two or more such blocked connections have specified the -** same callback function, then instead of invoking the callback function -** multiple times, it is invoked once with the set of void* context pointers -** specified by the blocked connections bundled together into an array. -** This gives the application an opportunity to prioritize any actions -** related to the set of unblocked database connections. -** -** Deadlock Detection -** -** Assuming that after registering for an unlock-notify callback a -** database waits for the callback to be issued before taking any further -** action (a reasonable assumption), then using this API may cause the -** application to deadlock. For example, if connection X is waiting for -** connection Y's transaction to be concluded, and similarly connection -** Y is waiting on connection X's transaction, then neither connection -** will proceed and the system may remain deadlocked indefinitely. -** -** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock -** detection. ^If a given call to sqlite3_unlock_notify() would put the -** system in a deadlocked state, then SQLITE_LOCKED is returned and no -** unlock-notify callback is registered. The system is said to be in -** a deadlocked state if connection A has registered for an unlock-notify -** callback on the conclusion of connection B's transaction, and connection -** B has itself registered for an unlock-notify callback when connection -** A's transaction is concluded. ^Indirect deadlock is also detected, so -** the system is also considered to be deadlocked if connection B has -** registered for an unlock-notify callback on the conclusion of connection -** C's transaction, where connection C is waiting on connection A. ^Any -** number of levels of indirection are allowed. -** -** The "DROP TABLE" Exception -** -** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost -** always appropriate to call sqlite3_unlock_notify(). There is however, -** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, -** SQLite checks if there are any currently executing SELECT statements -** that belong to the same connection. If there are, SQLITE_LOCKED is -** returned. In this case there is no "blocking connection", so invoking -** sqlite3_unlock_notify() results in the unlock-notify callback being -** invoked immediately. If the application then re-attempts the "DROP TABLE" -** or "DROP INDEX" query, an infinite loop might be the result. -** -** One way around this problem is to check the extended error code returned -** by an sqlite3_step() call. ^(If there is a blocking connection, then the -** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in -** the special "DROP TABLE/INDEX" case, the extended error code is just -** SQLITE_LOCKED.)^ -*/ -SQLITE_API int sqlite3_unlock_notify( - sqlite3 *pBlocked, /* Waiting connection */ - void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ - void *pNotifyArg /* Argument to pass to xNotify */ -); - - -/* -** CAPI3REF: String Comparison -** -** ^The [sqlite3_strnicmp()] API allows applications and extensions to -** compare the contents of two buffers containing UTF-8 strings in a -** case-independent fashion, using the same definition of case independence -** that SQLite uses internally when comparing identifiers. -*/ -SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); - -/* -** CAPI3REF: Error Logging Interface -** -** ^The [sqlite3_log()] interface writes a message into the error log -** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. -** ^If logging is enabled, the zFormat string and subsequent arguments are -** used with [sqlite3_snprintf()] to generate the final output string. -** -** The sqlite3_log() interface is intended for use by extensions such as -** virtual tables, collating functions, and SQL functions. While there is -** nothing to prevent an application from calling sqlite3_log(), doing so -** is considered bad form. -** -** The zFormat string must not be NULL. -** -** To avoid deadlocks and other threading problems, the sqlite3_log() routine -** will not use dynamically allocated memory. The log message is stored in -** a fixed-length buffer on the stack. If the log message is longer than -** a few hundred characters, it will be truncated to the length of the -** buffer. -*/ -SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); - -/* -** CAPI3REF: Write-Ahead Log Commit Hook -** -** ^The [sqlite3_wal_hook()] function is used to register a callback that -** will be invoked each time a database connection commits data to a -** [write-ahead log] (i.e. whenever a transaction is committed in -** [journal_mode | journal_mode=WAL mode]). -** -** ^The callback is invoked by SQLite after the commit has taken place and -** the associated write-lock on the database released, so the implementation -** may read, write or [checkpoint] the database as required. -** -** ^The first parameter passed to the callback function when it is invoked -** is a copy of the third parameter passed to sqlite3_wal_hook() when -** registering the callback. ^The second is a copy of the database handle. -** ^The third parameter is the name of the database that was written to - -** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter -** is the number of pages currently in the write-ahead log file, -** including those that were just committed. -** -** The callback function should normally return [SQLITE_OK]. ^If an error -** code is returned, that error will propagate back up through the -** SQLite code base to cause the statement that provoked the callback -** to report an error, though the commit will have still occurred. If the -** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value -** that does not correspond to any valid SQLite error code, the results -** are undefined. -** -** A single database handle may have at most a single write-ahead log callback -** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any -** previously registered write-ahead log callback. ^Note that the -** [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will -** those overwrite any prior [sqlite3_wal_hook()] settings. -*/ -SQLITE_API void *sqlite3_wal_hook( - sqlite3*, - int(*)(void *,sqlite3*,const char*,int), - void* -); - -/* -** CAPI3REF: Configure an auto-checkpoint -** -** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around -** [sqlite3_wal_hook()] that causes any database on [database connection] D -** to automatically [checkpoint] -** after committing a transaction if there are N or -** more frames in the [write-ahead log] file. ^Passing zero or -** a negative value as the nFrame parameter disables automatic -** checkpoints entirely. -** -** ^The callback registered by this function replaces any existing callback -** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback -** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism -** configured by this function. -** -** ^The [wal_autocheckpoint pragma] can be used to invoke this interface -** from SQL. -** -** ^Every new [database connection] defaults to having the auto-checkpoint -** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] -** pages. The use of this interface -** is only necessary if the default setting is found to be suboptimal -** for a particular application. -*/ -SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); - -/* -** CAPI3REF: Checkpoint a database -** -** ^The [sqlite3_wal_checkpoint(D,X)] interface causes database named X -** on [database connection] D to be [checkpointed]. ^If X is NULL or an -** empty string, then a checkpoint is run on all databases of -** connection D. ^If the database connection D is not in -** [WAL | write-ahead log mode] then this interface is a harmless no-op. -** -** ^The [wal_checkpoint pragma] can be used to invoke this interface -** from SQL. ^The [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] can be used to cause this interface to be -** run whenever the WAL reaches a certain size threshold. -*/ -SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); - -/* -** Undo the hack that converts floating point types to integer for -** builds on processors without floating point support. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# undef double -#endif - -#if 0 -} /* End of the 'extern "C"' block */ -#endif -#endif - -/* -** 2010 August 30 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -*/ - -#ifndef _SQLITE3RTREE_H_ -#define _SQLITE3RTREE_H_ - - -#if 0 -extern "C" { -#endif - - typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; - - /* - ** Register a geometry callback named zGeom that can be used as part of an - ** R-Tree geometry query as follows: - ** - ** SELECT ... FROM WHERE MATCH $zGeom(... params ...) - */ - SQLITE_API int sqlite3_rtree_geometry_callback( - sqlite3 *db, - const char *zGeom, - int (*xGeom)(sqlite3_rtree_geometry *, int nCoord, double *aCoord, int *pRes), - void *pContext - ); - - - /* - ** A pointer to a structure of the following type is passed as the first - ** argument to callbacks registered using rtree_geometry_callback(). - */ - struct sqlite3_rtree_geometry { - void *pContext; /* Copy of pContext passed to s_r_g_c() */ - int nParam; /* Size of array aParam[] */ - double *aParam; /* Parameters passed to SQL geom function */ - void *pUser; /* Callback implementation user data */ - void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ - }; - - -#if 0 -} /* end of the 'extern "C"' block */ -#endif - -#endif /* ifndef _SQLITE3RTREE_H_ */ - - -/************** End of sqlite3.h *********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include hash.h in the middle of sqliteInt.h ******************/ -/************** Begin file hash.h ********************************************/ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the header file for the generic hash-table implemenation -** used in SQLite. -*/ -#ifndef _SQLITE_HASH_H_ -#define _SQLITE_HASH_H_ - -/* Forward declarations of structures. */ -typedef struct Hash Hash; -typedef struct HashElem HashElem; - -/* A complete hash table is an instance of the following structure. -** The internals of this structure are intended to be opaque -- client -** code should not attempt to access or modify the fields of this structure -** directly. Change this structure only by using the routines below. -** However, some of the "procedures" and "functions" for modifying and -** accessing this structure are really macros, so we can't really make -** this structure opaque. -** -** All elements of the hash table are on a single doubly-linked list. -** Hash.first points to the head of this list. -** -** There are Hash.htsize buckets. Each bucket points to a spot in -** the global doubly-linked list. The contents of the bucket are the -** element pointed to plus the next _ht.count-1 elements in the list. -** -** Hash.htsize and Hash.ht may be zero. In that case lookup is done -** by a linear search of the global list. For small tables, the -** Hash.ht table is never allocated because if there are few elements -** in the table, it is faster to do a linear search than to manage -** the hash table. -*/ -struct Hash { - unsigned int htsize; /* Number of buckets in the hash table */ - unsigned int count; /* Number of entries in this table */ - HashElem *first; /* The first element of the array */ - struct _ht { /* the hash table */ - int count; /* Number of entries with this hash */ - HashElem *chain; /* Pointer to first entry with this hash */ - } *ht; -}; - -/* Each element in the hash table is an instance of the following -** structure. All elements are stored on a single doubly-linked list. -** -** Again, this structure is intended to be opaque, but it can't really -** be opaque because it is used by macros. -*/ -struct HashElem { - HashElem *next, *prev; /* Next and previous elements in the table */ - void *data; /* Data associated with this element */ - const char *pKey; - int nKey; /* Key associated with this element */ -}; - -/* -** Access routines. To delete, insert a NULL pointer. -*/ -SQLITE_PRIVATE void sqlite3HashInit(Hash*); -SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, int nKey, void *pData); -SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey, int nKey); -SQLITE_PRIVATE void sqlite3HashClear(Hash*); - -/* -** Macros for looping over all elements of a hash table. The idiom is -** like this: -** -** Hash h; -** HashElem *p; -** ... -** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ -** SomeStructure *pData = sqliteHashData(p); -** // do something with pData -** } -*/ -#define sqliteHashFirst(H) ((H)->first) -#define sqliteHashNext(E) ((E)->next) -#define sqliteHashData(E) ((E)->data) -/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */ -/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */ - -/* -** Number of entries in a hash table -*/ -/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ - -#endif /* _SQLITE_HASH_H_ */ - -/************** End of hash.h ************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include parse.h in the middle of sqliteInt.h *****************/ -/************** Begin file parse.h *******************************************/ -#define TK_SEMI 1 -#define TK_EXPLAIN 2 -#define TK_QUERY 3 -#define TK_PLAN 4 -#define TK_BEGIN 5 -#define TK_TRANSACTION 6 -#define TK_DEFERRED 7 -#define TK_IMMEDIATE 8 -#define TK_EXCLUSIVE 9 -#define TK_COMMIT 10 -#define TK_END 11 -#define TK_ROLLBACK 12 -#define TK_SAVEPOINT 13 -#define TK_RELEASE 14 -#define TK_TO 15 -#define TK_TABLE 16 -#define TK_CREATE 17 -#define TK_IF 18 -#define TK_NOT 19 -#define TK_EXISTS 20 -#define TK_TEMP 21 -#define TK_LP 22 -#define TK_RP 23 -#define TK_AS 24 -#define TK_COMMA 25 -#define TK_ID 26 -#define TK_INDEXED 27 -#define TK_ABORT 28 -#define TK_ACTION 29 -#define TK_AFTER 30 -#define TK_ANALYZE 31 -#define TK_ASC 32 -#define TK_ATTACH 33 -#define TK_BEFORE 34 -#define TK_BY 35 -#define TK_CASCADE 36 -#define TK_CAST 37 -#define TK_COLUMNKW 38 -#define TK_CONFLICT 39 -#define TK_DATABASE 40 -#define TK_DESC 41 -#define TK_DETACH 42 -#define TK_EACH 43 -#define TK_FAIL 44 -#define TK_FOR 45 -#define TK_IGNORE 46 -#define TK_INITIALLY 47 -#define TK_INSTEAD 48 -#define TK_LIKE_KW 49 -#define TK_MATCH 50 -#define TK_NO 51 -#define TK_KEY 52 -#define TK_OF 53 -#define TK_OFFSET 54 -#define TK_PRAGMA 55 -#define TK_RAISE 56 -#define TK_REPLACE 57 -#define TK_RESTRICT 58 -#define TK_ROW 59 -#define TK_TRIGGER 60 -#define TK_VACUUM 61 -#define TK_VIEW 62 -#define TK_VIRTUAL 63 -#define TK_REINDEX 64 -#define TK_RENAME 65 -#define TK_CTIME_KW 66 -#define TK_ANY 67 -#define TK_OR 68 -#define TK_AND 69 -#define TK_IS 70 -#define TK_BETWEEN 71 -#define TK_IN 72 -#define TK_ISNULL 73 -#define TK_NOTNULL 74 -#define TK_NE 75 -#define TK_EQ 76 -#define TK_GT 77 -#define TK_LE 78 -#define TK_LT 79 -#define TK_GE 80 -#define TK_ESCAPE 81 -#define TK_BITAND 82 -#define TK_BITOR 83 -#define TK_LSHIFT 84 -#define TK_RSHIFT 85 -#define TK_PLUS 86 -#define TK_MINUS 87 -#define TK_STAR 88 -#define TK_SLASH 89 -#define TK_REM 90 -#define TK_CONCAT 91 -#define TK_COLLATE 92 -#define TK_BITNOT 93 -#define TK_STRING 94 -#define TK_JOIN_KW 95 -#define TK_CONSTRAINT 96 -#define TK_DEFAULT 97 -#define TK_NULL 98 -#define TK_PRIMARY 99 -#define TK_UNIQUE 100 -#define TK_CHECK 101 -#define TK_REFERENCES 102 -#define TK_AUTOINCR 103 -#define TK_ON 104 -#define TK_INSERT 105 -#define TK_DELETE 106 -#define TK_UPDATE 107 -#define TK_SET 108 -#define TK_DEFERRABLE 109 -#define TK_FOREIGN 110 -#define TK_DROP 111 -#define TK_UNION 112 -#define TK_ALL 113 -#define TK_EXCEPT 114 -#define TK_INTERSECT 115 -#define TK_SELECT 116 -#define TK_DISTINCT 117 -#define TK_DOT 118 -#define TK_FROM 119 -#define TK_JOIN 120 -#define TK_USING 121 -#define TK_ORDER 122 -#define TK_GROUP 123 -#define TK_HAVING 124 -#define TK_LIMIT 125 -#define TK_WHERE 126 -#define TK_INTO 127 -#define TK_VALUES 128 -#define TK_INTEGER 129 -#define TK_FLOAT 130 -#define TK_BLOB 131 -#define TK_REGISTER 132 -#define TK_VARIABLE 133 -#define TK_CASE 134 -#define TK_WHEN 135 -#define TK_THEN 136 -#define TK_ELSE 137 -#define TK_INDEX 138 -#define TK_ALTER 139 -#define TK_ADD 140 -#define TK_TO_TEXT 141 -#define TK_TO_BLOB 142 -#define TK_TO_NUMERIC 143 -#define TK_TO_INT 144 -#define TK_TO_REAL 145 -#define TK_ISNOT 146 -#define TK_END_OF_FILE 147 -#define TK_ILLEGAL 148 -#define TK_SPACE 149 -#define TK_UNCLOSED_STRING 150 -#define TK_FUNCTION 151 -#define TK_COLUMN 152 -#define TK_AGG_FUNCTION 153 -#define TK_AGG_COLUMN 154 -#define TK_CONST_FUNC 155 -#define TK_UMINUS 156 -#define TK_UPLUS 157 - -/************** End of parse.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -#include -#include -#include -#include -#include - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite_int64 -# define float sqlite_int64 -# define LONGDOUBLE_TYPE sqlite_int64 -# ifndef SQLITE_BIG_DBL -# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) -# endif -# define SQLITE_OMIT_DATETIME_FUNCS 1 -# define SQLITE_OMIT_TRACE 1 -# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT -# undef SQLITE_HAVE_ISNAN -#endif -#ifndef SQLITE_BIG_DBL -# define SQLITE_BIG_DBL (1e99) -#endif - -/* -** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 -** afterward. Having this macro allows us to cause the C compiler -** to omit code used by TEMP tables without messy #ifndef statements. -*/ -#ifdef SQLITE_OMIT_TEMPDB -#define OMIT_TEMPDB 1 -#else -#define OMIT_TEMPDB 0 -#endif - -/* -** The "file format" number is an integer that is incremented whenever -** the VDBE-level file format changes. The following macros define the -** the default file format for new databases and the maximum file format -** that the library can read. -*/ -#define SQLITE_MAX_FILE_FORMAT 4 -#ifndef SQLITE_DEFAULT_FILE_FORMAT -# define SQLITE_DEFAULT_FILE_FORMAT 1 -#endif - -/* -** Determine whether triggers are recursive by default. This can be -** changed at run-time using a pragma. -*/ -#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS -# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 -#endif - -/* -** Provide a default value for SQLITE_TEMP_STORE in case it is not specified -** on the command-line -*/ -#ifndef SQLITE_TEMP_STORE -# define SQLITE_TEMP_STORE 1 -#endif - -/* -** GCC does not define the offsetof() macro so we'll have to do it -** ourselves. -*/ -#ifndef offsetof -#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) -#endif - -/* -** Check to see if this machine uses EBCDIC. (Yes, believe it or -** not, there are still machines out there that use EBCDIC.) -*/ -#if 'A' == '\301' -# define SQLITE_EBCDIC 1 -#else -# define SQLITE_ASCII 1 -#endif - -/* -** Integers of known sizes. These typedefs might change for architectures -** where the sizes very. Preprocessor macros are available so that the -** types can be conveniently redefined at compile-type. Like this: -** -** cc '-DUINTPTR_TYPE=long long int' ... -*/ -#ifndef UINT32_TYPE -# ifdef HAVE_UINT32_T -# define UINT32_TYPE uint32_t -# else -# define UINT32_TYPE unsigned int -# endif -#endif -#ifndef UINT16_TYPE -# ifdef HAVE_UINT16_T -# define UINT16_TYPE uint16_t -# else -# define UINT16_TYPE unsigned short int -# endif -#endif -#ifndef INT16_TYPE -# ifdef HAVE_INT16_T -# define INT16_TYPE int16_t -# else -# define INT16_TYPE short int -# endif -#endif -#ifndef UINT8_TYPE -# ifdef HAVE_UINT8_T -# define UINT8_TYPE uint8_t -# else -# define UINT8_TYPE unsigned char -# endif -#endif -#ifndef INT8_TYPE -# ifdef HAVE_INT8_T -# define INT8_TYPE int8_t -# else -# define INT8_TYPE signed char -# endif -#endif -#ifndef LONGDOUBLE_TYPE -# define LONGDOUBLE_TYPE long double -#endif -typedef sqlite_int64 i64; /* 8-byte signed integer */ -typedef sqlite_uint64 uint64_t; /* 8-byte unsigned integer */ -typedef UINT32_TYPE uint32_t; /* 4-byte unsigned integer */ -typedef UINT16_TYPE uint16_t; /* 2-byte unsigned integer */ -typedef INT16_TYPE i16; /* 2-byte signed integer */ -typedef UINT8_TYPE uint8_t; /* 1-byte unsigned integer */ -typedef INT8_TYPE i8; /* 1-byte signed integer */ - -/* -** SQLITE_MAX_U32 is a uint64_t constant that is the maximum uint64_t value -** that can be stored in a uint32_t without loss of data. The value -** is 0x00000000ffffffff. But because of quirks of some compilers, we -** have to specify the value in the less intuitive manner shown: -*/ -#define SQLITE_MAX_U32 ((((uint64_t)1)<<32)-1) - -/* -** Macros to determine whether the machine is big or little endian, -** evaluated at runtime. -*/ -#ifdef SQLITE_AMALGAMATION -SQLITE_PRIVATE const int sqlite3one = 1; -#else -SQLITE_PRIVATE const int sqlite3one; -#endif -#if defined(i386) || defined(__i386__) || defined(_M_IX86)\ - || defined(__x86_64) || defined(__x86_64__) -# define SQLITE_BIGENDIAN 0 -# define SQLITE_LITTLEENDIAN 1 -# define SQLITE_UTF16NATIVE SQLITE_UTF16LE -#else -# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) -# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) -# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) -#endif - -/* -** Constants for the largest and smallest possible 64-bit signed integers. -** These macros are designed to work correctly on both 32-bit and 64-bit -** compilers. -*/ -#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) -#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) - -/* -** Round up a number to the next larger multiple of 8. This is used -** to force 8-byte alignment on 64-bit architectures. -*/ -#define ROUND8(x) (((x)+7)&~7) - -/* -** Round down to the nearest multiple of 8 -*/ -#define ROUNDDOWN8(x) ((x)&~7) - -/* -** Assert that the pointer X is aligned to an 8-byte boundary. This -** macro is used only within assert() to verify that the code gets -** all alignment restrictions correct. -** -** Except, if SQLITE_4_BYTE_ALIGNED_MALLOC is defined, then the -** underlying malloc() implemention might return us 4-byte aligned -** pointers. In that case, only verify 4-byte alignment. -*/ -#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC -# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0) -#else -# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) -#endif - - -/* -** An instance of the following structure is used to store the busy-handler -** callback for a given sqlite handle. -** -** The sqlite.busyHandler member of the sqlite struct contains the busy -** callback for the database handle. Each pager opened via the sqlite -** handle is passed a pointer to sqlite.busyHandler. The busy-handler -** callback is currently invoked only from within pager.c. -*/ -typedef struct BusyHandler BusyHandler; -struct BusyHandler { - int (*xFunc)(void *,int); /* The busy callback */ - void *pArg; /* First arg to busy callback */ - int nBusy; /* Incremented with each busy call */ -}; - -/* -** Name of the master database table. The master database table -** is a special table that holds the names and attributes of all -** user tables and indices. -*/ -#define MASTER_NAME "sqlite_master" -#define TEMP_MASTER_NAME "sqlite_temp_master" - -/* -** The root-page of the master database table. -*/ -#define MASTER_ROOT 1 - -/* -** The name of the schema table. -*/ -#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) - -/* -** A convenience macro that returns the number of elements in -** an array. -*/ -#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0]))) - -/* -** The following value as a destructor means to use sqlite3DbFree(). -** This is an internal extension to SQLITE_STATIC and SQLITE_TRANSIENT. -*/ -#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3DbFree) - -/* -** When SQLITE_OMIT_WSD is defined, it means that the target platform does -** not support Writable Static Data (WSD) such as global and static variables. -** All variables must either be on the stack or dynamically allocated from -** the heap. When WSD is unsupported, the variable declarations scattered -** throughout the SQLite code must become constants instead. The SQLITE_WSD -** macro is used for this purpose. And instead of referencing the variable -** directly, we use its constant as a key to lookup the run-time allocated -** buffer that holds real variable. The constant is also the initializer -** for the run-time allocated buffer. -** -** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL -** macros become no-ops and have zero performance impact. -*/ -#ifdef SQLITE_OMIT_WSD -#define SQLITE_WSD const -#define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) -#define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) -SQLITE_API int sqlite3_wsd_init(int N, int J); -SQLITE_API void *sqlite3_wsd_find(void *K, int L); -#else -#define SQLITE_WSD -#define GLOBAL(t,v) v -#define sqlite3GlobalConfig sqlite3Config -#endif - -/* -** The following macros are used to suppress compiler warnings and to -** make it clear to human readers when a function parameter is deliberately -** left unused within the body of a function. This usually happens when -** a function is called via a function pointer. For example the -** implementation of an SQL aggregate step callback may not use the -** parameter indicating the number of arguments passed to the aggregate, -** if it knows that this is enforced elsewhere. -** -** When a function parameter is not used at all within the body of a function, -** it is generally named "NotUsed" or "NotUsed2" to make things even clearer. -** However, these macros may also be used to suppress warnings related to -** parameters that may or may not be used depending on compilation options. -** For example those parameters only used in assert() statements. In these -** cases the parameters are named as per the usual conventions. -*/ -#define UNUSED_PARAMETER(x) (void)(x) -#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y) - -/* -** Forward references to structures -*/ -typedef struct AggInfo AggInfo; -typedef struct AuthContext AuthContext; -typedef struct AutoincInfo AutoincInfo; -typedef struct Bitvec Bitvec; -typedef struct CollSeq CollSeq; -typedef struct Column Column; -typedef struct Db Db; -typedef struct Schema Schema; -typedef struct Expr Expr; -typedef struct ExprList ExprList; -typedef struct ExprSpan ExprSpan; -typedef struct FKey FKey; -typedef struct FuncDestructor FuncDestructor; -typedef struct FuncDef FuncDef; -typedef struct FuncDefHash FuncDefHash; -typedef struct IdList IdList; -typedef struct Index Index; -typedef struct IndexSample IndexSample; -typedef struct KeyClass KeyClass; -typedef struct KeyInfo KeyInfo; -typedef struct Lookaside Lookaside; -typedef struct LookasideSlot LookasideSlot; -typedef struct Module Module; -typedef struct NameContext NameContext; -typedef struct Parse Parse; -typedef struct RowSet RowSet; -typedef struct Savepoint Savepoint; -typedef struct Select Select; -typedef struct SrcList SrcList; -typedef struct StrAccum StrAccum; -typedef struct Table Table; -typedef struct TableLock TableLock; -typedef struct Token Token; -typedef struct Trigger Trigger; -typedef struct TriggerPrg TriggerPrg; -typedef struct TriggerStep TriggerStep; -typedef struct UnpackedRecord UnpackedRecord; -typedef struct VTable VTable; -typedef struct Walker Walker; -typedef struct WherePlan WherePlan; -typedef struct WhereInfo WhereInfo; -typedef struct WhereLevel WhereLevel; - -/* -** Defer sourcing vdbe.h and btree.h until after the "uint8_t" and -** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque -** pointer types (i.e. FuncDef) defined above. -*/ -/************** Include btree.h in the middle of sqliteInt.h *****************/ -/************** Begin file btree.h *******************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite B-Tree file -** subsystem. See comments in the source code for a detailed description -** of what each interface routine does. -*/ -#ifndef _BTREE_H_ -#define _BTREE_H_ - -/* TODO: This definition is just included so other modules compile. It -** needs to be revisited. -*/ -#define SQLITE_N_BTREE_META 10 - -/* -** If defined as non-zero, auto-vacuum is enabled by default. Otherwise -** it must be turned on for each database using "PRAGMA auto_vacuum = 1". -*/ -#ifndef SQLITE_DEFAULT_AUTOVACUUM -#define SQLITE_DEFAULT_AUTOVACUUM 0 -#endif - -#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ -#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ -#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ - -/* -** Forward declarations of structure -*/ -typedef struct Btree Btree; -typedef struct BtCursor BtCursor; -typedef struct BtShared BtShared; -typedef struct BtreeMutexArray BtreeMutexArray; - -/* -** This structure records all of the Btrees that need to hold -** a mutex before we enter sqlite3VdbeExec(). The Btrees are -** are placed in aBtree[] in order of aBtree[]->pBt. That way, -** we can always lock and unlock them all quickly. -*/ -struct BtreeMutexArray { - int nMutex; - Btree *aBtree[SQLITE_MAX_ATTACHED+1]; -}; - - -SQLITE_PRIVATE int sqlite3BtreeOpen( - const char *zFilename, /* Name of database file to open */ - sqlite3 *db, /* Associated database connection */ - Btree **ppBtree, /* Return open Btree* here */ - int flags, /* Flags */ - int vfsFlags /* Flags passed through to VFS open */ -); - -/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the -** following values. -** -** NOTE: These values must match the corresponding PAGER_ values in -** pager.h. -*/ -#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */ -#define BTREE_NO_READLOCK 2 /* Omit readlocks on readonly files */ -#define BTREE_MEMORY 4 /* This is an in-memory DB */ -#define BTREE_SINGLE 8 /* The file contains at most 1 b-tree */ -#define BTREE_UNORDERED 16 /* Use of a hash implementation is OK */ - -SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(Btree*,int,int,int); -SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); -SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); -SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); -SQLITE_PRIVATE uint32_t sqlite3BtreeLastPage(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); -SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); -SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); -SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*); -SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); -SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*); -SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags); -SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*); -SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*); -SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); -SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); -SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); -SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, uint8_t isWriteLock); -SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); - -SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); -SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *); -SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *); - -SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); - -/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR -** of the flags shown below. -** -** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set. -** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data -** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With -** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored -** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL -** indices.) -*/ -#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ -#define BTREE_BLOBKEY 2 /* Table has keys only - no data */ - -SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*); -SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*); -SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree*, int); - -SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, uint32_t *pValue); -SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, uint32_t value); - -/* -** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta -** should be one of the following values. The integer values are assigned -** to constants so that the offset of the corresponding field in an -** SQLite database header may be found using the following formula: -** -** offset = 36 + (idx * 4) -** -** For example, the free-page-count field is located at byte offset 36 of -** the database file header. The incr-vacuum-flag field is located at -** byte offset 64 (== 36+4*7). -*/ -#define BTREE_FREE_PAGE_COUNT 0 -#define BTREE_SCHEMA_VERSION 1 -#define BTREE_FILE_FORMAT 2 -#define BTREE_DEFAULT_CACHE_SIZE 3 -#define BTREE_LARGEST_ROOT_PAGE 4 -#define BTREE_TEXT_ENCODING 5 -#define BTREE_USER_VERSION 6 -#define BTREE_INCR_VACUUM 7 - -SQLITE_PRIVATE int sqlite3BtreeCursor( - Btree*, /* BTree containing table to open */ - int iTable, /* Index of root page */ - int wrFlag, /* 1 for writing. 0 for read-only */ - struct KeyInfo*, /* First argument to compare function */ - BtCursor *pCursor /* Space to write cursor structure */ -); -SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); -SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); - -SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( - BtCursor*, - UnpackedRecord *pUnKey, - i64 intKey, - int bias, - int *pRes -); -SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*, int*); -SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey, - const void *pData, int nData, - int nZero, int bias, int seekResult); -SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor*, i64 *pSize); -SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, uint32_t offset, uint32_t amt, void*); -SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt); -SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt); -SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, uint32_t *pSize); -SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, uint32_t offset, uint32_t amt, void*); -SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64); -SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*); - -SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); -SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); - -SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, uint32_t offset, uint32_t amt, void*); -SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *); -SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); - -SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); - -#ifndef NDEBUG -SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); -#endif - -#ifndef SQLITE_OMIT_BTREECOUNT -SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *); -#endif - -#ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); -SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); -#endif - -#ifndef SQLITE_OMIT_WAL -SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*); -#endif - -/* -** If we are not using shared cache, then there is no need to -** use mutexes to access the BtShared structures. So make the -** Enter and Leave procedures no-ops. -*/ -#ifndef SQLITE_OMIT_SHARED_CACHE -SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); -SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); -#else -# define sqlite3BtreeEnter(X) -# define sqlite3BtreeEnterAll(X) -#endif - -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE -SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); -SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); -SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); -SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); -SQLITE_PRIVATE void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*); -SQLITE_PRIVATE void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*); -SQLITE_PRIVATE void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*); -#ifndef NDEBUG -/* These routines are used inside assert() statements only. */ -SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); -SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); -#endif -#else - -# define sqlite3BtreeLeave(X) -# define sqlite3BtreeEnterCursor(X) -# define sqlite3BtreeLeaveCursor(X) -# define sqlite3BtreeLeaveAll(X) -# define sqlite3BtreeMutexArrayEnter(X) -# define sqlite3BtreeMutexArrayLeave(X) -# define sqlite3BtreeMutexArrayInsert(X,Y) - -# define sqlite3BtreeHoldsMutex(X) 1 -# define sqlite3BtreeHoldsAllMutexes(X) 1 -#endif - - -#endif /* _BTREE_H_ */ - -/************** End of btree.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include vdbe.h in the middle of sqliteInt.h ******************/ -/************** Begin file vdbe.h ********************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Header file for the Virtual DataBase Engine (VDBE) -** -** This header defines the interface to the virtual database engine -** or VDBE. The VDBE implements an abstract machine that runs a -** simple program to access and modify the underlying database. -*/ -#ifndef _SQLITE_VDBE_H_ -#define _SQLITE_VDBE_H_ - -/* -** A single VDBE is an opaque structure named "Vdbe". Only routines -** in the source file sqliteVdbe.c are allowed to see the insides -** of this structure. -*/ -typedef struct Vdbe Vdbe; - -/* -** The names of the following types declared in vdbeInt.h are required -** for the VdbeOp definition. -*/ -typedef struct VdbeFunc VdbeFunc; -typedef struct Mem Mem; -typedef struct SubProgram SubProgram; - -/* -** A single instruction of the virtual machine has an opcode -** and as many as three operands. The instruction is recorded -** as an instance of the following structure: -*/ -struct VdbeOp { - uint8_t opcode; /* What operation to perform */ - signed char p4type; /* One of the P4_xxx constants for p4 */ - uint8_t opflags; /* Mask of the OPFLG_* flags in opcodes.h */ - uint8_t p5; /* Fifth parameter is an unsigned character */ - int p1; /* First operand */ - int p2; /* Second parameter (often the jump destination) */ - int p3; /* The third parameter */ - union { /* fourth parameter */ - int i; /* Integer value if p4type==P4_INT32 */ - void *p; /* Generic pointer */ - char *z; /* Pointer to data for string (char array) types */ - i64 *pI64; /* Used when p4type is P4_INT64 */ - double *pReal; /* Used when p4type is P4_REAL */ - FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ - VdbeFunc *pVdbeFunc; /* Used when p4type is P4_VDBEFUNC */ - CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ - Mem *pMem; /* Used when p4type is P4_MEM */ - VTable *pVtab; /* Used when p4type is P4_VTAB */ - KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ - int *ai; /* Used when p4type is P4_INTARRAY */ - SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ - } p4; -#ifdef SQLITE_DEBUG - char *zComment; /* Comment to improve readability */ -#endif -#ifdef VDBE_PROFILE - int cnt; /* Number of times this instruction was executed */ - uint64_t cycles; /* Total time spent executing this instruction */ -#endif -}; -typedef struct VdbeOp VdbeOp; - - -/* -** A sub-routine used to implement a trigger program. -*/ -struct SubProgram { - VdbeOp *aOp; /* Array of opcodes for sub-program */ - int nOp; /* Elements in aOp[] */ - int nMem; /* Number of memory cells required */ - int nCsr; /* Number of cursors required */ - void *token; /* id that may be used to recursive triggers */ - SubProgram *pNext; /* Next sub-program already visited */ -}; - -/* -** A smaller version of VdbeOp used for the VdbeAddOpList() function because -** it takes up less space. -*/ -struct VdbeOpList { - uint8_t opcode; /* What operation to perform */ - signed char p1; /* First operand */ - signed char p2; /* Second parameter (often the jump destination) */ - signed char p3; /* Third parameter */ -}; -typedef struct VdbeOpList VdbeOpList; - -/* -** Allowed values of VdbeOp.p4type -*/ -#define P4_NOTUSED 0 /* The P4 parameter is not used */ -#define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ -#define P4_STATIC (-2) /* Pointer to a static string */ -#define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */ -#define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */ -#define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ -#define P4_VDBEFUNC (-7) /* P4 is a pointer to a VdbeFunc structure */ -#define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ -#define P4_TRANSIENT (-9) /* P4 is a pointer to a transient string */ -#define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ -#define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ -#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ -#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ -#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */ -#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ -#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */ - -/* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure -** is made. That copy is freed when the Vdbe is finalized. But if the -** argument is P4_KEYINFO_HANDOFF, the passed in pointer is used. It still -** gets freed when the Vdbe is finalized so it still should be obtained -** from a single sqliteMalloc(). But no copy is made and the calling -** function should *not* try to free the KeyInfo. -*/ -#define P4_KEYINFO_HANDOFF (-16) -#define P4_KEYINFO_STATIC (-17) - -/* -** The Vdbe.aColName array contains 5n Mem structures, where n is the -** number of columns of data returned by the statement. -*/ -#define COLNAME_NAME 0 -#define COLNAME_DECLTYPE 1 -#define COLNAME_DATABASE 2 -#define COLNAME_TABLE 3 -#define COLNAME_COLUMN 4 -#ifdef SQLITE_ENABLE_COLUMN_METADATA -# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ -#else -# ifdef SQLITE_OMIT_DECLTYPE -# define COLNAME_N 1 /* Store only the name */ -# else -# define COLNAME_N 2 /* Store the name and decltype */ -# endif -#endif - -/* -** The following macro converts a relative address in the p2 field -** of a VdbeOp structure into a negative number so that -** sqlite3VdbeAddOpList() knows that the address is relative. Calling -** the macro again restores the address. -*/ -#define ADDR(X) (-1-(X)) - -/* -** The makefile scans the vdbe.c source file and creates the "opcodes.h" -** header file that defines a number for each opcode used by the VDBE. -*/ -/************** Include opcodes.h in the middle of vdbe.h ********************/ -/************** Begin file opcodes.h *****************************************/ -/* Automatically generated. Do not edit */ -/* See the mkopcodeh.awk script for details */ -#define OP_Goto 1 -#define OP_Gosub 2 -#define OP_Return 3 -#define OP_Yield 4 -#define OP_HaltIfNull 5 -#define OP_Halt 6 -#define OP_Integer 7 -#define OP_Int64 8 -#define OP_Real 130 /* same as TK_FLOAT */ -#define OP_String8 94 /* same as TK_STRING */ -#define OP_String 9 -#define OP_Null 10 -#define OP_Blob 11 -#define OP_Variable 12 -#define OP_Move 13 -#define OP_Copy 14 -#define OP_SCopy 15 -#define OP_ResultRow 16 -#define OP_Concat 91 /* same as TK_CONCAT */ -#define OP_Add 86 /* same as TK_PLUS */ -#define OP_Subtract 87 /* same as TK_MINUS */ -#define OP_Multiply 88 /* same as TK_STAR */ -#define OP_Divide 89 /* same as TK_SLASH */ -#define OP_Remainder 90 /* same as TK_REM */ -#define OP_CollSeq 17 -#define OP_Function 18 -#define OP_BitAnd 82 /* same as TK_BITAND */ -#define OP_BitOr 83 /* same as TK_BITOR */ -#define OP_ShiftLeft 84 /* same as TK_LSHIFT */ -#define OP_ShiftRight 85 /* same as TK_RSHIFT */ -#define OP_AddImm 20 -#define OP_MustBeInt 21 -#define OP_RealAffinity 22 -#define OP_ToText 141 /* same as TK_TO_TEXT */ -#define OP_ToBlob 142 /* same as TK_TO_BLOB */ -#define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/ -#define OP_ToInt 144 /* same as TK_TO_INT */ -#define OP_ToReal 145 /* same as TK_TO_REAL */ -#define OP_Eq 76 /* same as TK_EQ */ -#define OP_Ne 75 /* same as TK_NE */ -#define OP_Lt 79 /* same as TK_LT */ -#define OP_Le 78 /* same as TK_LE */ -#define OP_Gt 77 /* same as TK_GT */ -#define OP_Ge 80 /* same as TK_GE */ -#define OP_Permutation 23 -#define OP_Compare 24 -#define OP_Jump 25 -#define OP_And 69 /* same as TK_AND */ -#define OP_Or 68 /* same as TK_OR */ -#define OP_Not 19 /* same as TK_NOT */ -#define OP_BitNot 93 /* same as TK_BITNOT */ -#define OP_If 26 -#define OP_IfNot 27 -#define OP_IsNull 73 /* same as TK_ISNULL */ -#define OP_NotNull 74 /* same as TK_NOTNULL */ -#define OP_Column 28 -#define OP_Affinity 29 -#define OP_MakeRecord 30 -#define OP_Count 31 -#define OP_Savepoint 32 -#define OP_AutoCommit 33 -#define OP_Transaction 34 -#define OP_ReadCookie 35 -#define OP_SetCookie 36 -#define OP_VerifyCookie 37 -#define OP_OpenRead 38 -#define OP_OpenWrite 39 -#define OP_OpenAutoindex 40 -#define OP_OpenEphemeral 41 -#define OP_OpenPseudo 42 -#define OP_Close 43 -#define OP_SeekLt 44 -#define OP_SeekLe 45 -#define OP_SeekGe 46 -#define OP_SeekGt 47 -#define OP_Seek 48 -#define OP_NotFound 49 -#define OP_Found 50 -#define OP_IsUnique 51 -#define OP_NotExists 52 -#define OP_Sequence 53 -#define OP_NewRowid 54 -#define OP_Insert 55 -#define OP_InsertInt 56 -#define OP_Delete 57 -#define OP_ResetCount 58 -#define OP_RowKey 59 -#define OP_RowData 60 -#define OP_Rowid 61 -#define OP_NullRow 62 -#define OP_Last 63 -#define OP_Sort 64 -#define OP_Rewind 65 -#define OP_Prev 66 -#define OP_Next 67 -#define OP_IdxInsert 70 -#define OP_IdxDelete 71 -#define OP_IdxRowid 72 -#define OP_IdxLT 81 -#define OP_IdxGE 92 -#define OP_Destroy 95 -#define OP_Clear 96 -#define OP_CreateIndex 97 -#define OP_CreateTable 98 -#define OP_ParseSchema 99 -#define OP_LoadAnalysis 100 -#define OP_DropTable 101 -#define OP_DropIndex 102 -#define OP_DropTrigger 103 -#define OP_IntegrityCk 104 -#define OP_RowSetAdd 105 -#define OP_RowSetRead 106 -#define OP_RowSetTest 107 -#define OP_Program 108 -#define OP_Param 109 -#define OP_FkCounter 110 -#define OP_FkIfZero 111 -#define OP_MemMax 112 -#define OP_IfPos 113 -#define OP_IfNeg 114 -#define OP_IfZero 115 -#define OP_AggStep 116 -#define OP_AggFinal 117 -#define OP_Checkpoint 118 -#define OP_JournalMode 119 -#define OP_Vacuum 120 -#define OP_IncrVacuum 121 -#define OP_Expire 122 -#define OP_TableLock 123 -#define OP_VBegin 124 -#define OP_VCreate 125 -#define OP_VDestroy 126 -#define OP_VOpen 127 -#define OP_VFilter 128 -#define OP_VColumn 129 -#define OP_VNext 131 -#define OP_VRename 132 -#define OP_VUpdate 133 -#define OP_Pagecount 134 -#define OP_MaxPgcnt 135 -#define OP_Trace 136 -#define OP_Noop 137 -#define OP_Explain 138 - -/* The following opcode values are never used */ -#define OP_NotUsed_139 139 -#define OP_NotUsed_140 140 - - -/* Properties such as "out2" or "jump" that are specified in -** comments following the "case" for each opcode in the vdbe.c -** are encoded into bitvectors as follows: -*/ -#define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */ -#define OPFLG_OUT2_PRERELEASE 0x0002 /* out2-prerelease: */ -#define OPFLG_IN1 0x0004 /* in1: P1 is an input */ -#define OPFLG_IN2 0x0008 /* in2: P2 is an input */ -#define OPFLG_IN3 0x0010 /* in3: P3 is an input */ -#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */ -#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */ -#define OPFLG_INITIALIZER {\ -/* 0 */ 0x00, 0x01, 0x05, 0x04, 0x04, 0x10, 0x00, 0x02,\ -/* 8 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x24, 0x24,\ -/* 16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\ -/* 24 */ 0x00, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02,\ -/* 32 */ 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00,\ -/* 40 */ 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11,\ -/* 48 */ 0x08, 0x11, 0x11, 0x11, 0x11, 0x02, 0x02, 0x00,\ -/* 56 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01,\ -/* 64 */ 0x01, 0x01, 0x01, 0x01, 0x4c, 0x4c, 0x08, 0x00,\ -/* 72 */ 0x02, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\ -/* 80 */ 0x15, 0x01, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\ -/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x01, 0x24, 0x02, 0x02,\ -/* 96 */ 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 104 */ 0x00, 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01,\ -/* 112 */ 0x08, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02,\ -/* 120 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 128 */ 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02,\ -/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,\ -/* 144 */ 0x04, 0x04,} - -/************** End of opcodes.h *********************************************/ -/************** Continuing where we left off in vdbe.h ***********************/ - -/* -** Prototypes for the VDBE interface. See comments on the implementation -** for a description of what each of these routines does. -*/ -SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3*); -SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); -SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); -SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); -SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); -SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, uint8_t P5); -SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); -SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe*, int addr, int N); -SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); -SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); -SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); -SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeDeleteObject(sqlite3*,Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,int,int,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); -SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); -#ifdef SQLITE_DEBUG -SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); -SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe*,FILE*); -#endif -SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*); -SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); -SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); -SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); -SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int); -SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); -SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); -SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe*, int, uint8_t); -SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int); -#ifndef SQLITE_OMIT_TRACE -SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); -#endif - -SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,char*,int); -SQLITE_PRIVATE void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord*); -SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); - -#ifndef SQLITE_OMIT_TRIGGER -SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); -#endif - - -#ifndef NDEBUG -SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...); -# define VdbeComment(X) sqlite3VdbeComment X -SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); -# define VdbeNoopComment(X) sqlite3VdbeNoopComment X -#else -# define VdbeComment(X) -# define VdbeNoopComment(X) -#endif - -#endif - -/************** End of vdbe.h ************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include pager.h in the middle of sqliteInt.h *****************/ -/************** Begin file pager.h *******************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite page cache -** subsystem. The page cache subsystem reads and writes a file a page -** at a time and provides a journal for rollback. -*/ - -#ifndef _PAGER_H_ -#define _PAGER_H_ - -/* -** Default maximum size for persistent journal files. A negative -** value means no limit. This value may be overridden using the -** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". -*/ -#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -#define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 -#endif - -/* -** The type used to represent a page number. The first page in a file -** is called page 1. 0 is used to represent "not a page". -*/ -typedef uint32_t Pgno; - -/* -** Each open file is managed by a separate instance of the "Pager" structure. -*/ -typedef struct Pager Pager; - -/* -** Handle type for pages. -*/ -typedef struct PgHdr DbPage; - -/* -** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is -** reserved for working around a windows/posix incompatibility). It is -** used in the journal to signify that the remainder of the journal file -** is devoted to storing a master journal name - there are no more pages to -** roll back. See comments for function writeMasterJournal() in pager.c -** for details. -*/ -#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) - -/* -** Allowed values for the flags parameter to sqlite3PagerOpen(). -** -** NOTE: These values must match the corresponding BTREE_ values in btree.h. -*/ -#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ -#define PAGER_NO_READLOCK 0x0002 /* Omit readlocks on readonly files */ -#define PAGER_MEMORY 0x0004 /* In-memory database */ - -/* -** Valid values for the second argument to sqlite3PagerLockingMode(). -*/ -#define PAGER_LOCKINGMODE_QUERY -1 -#define PAGER_LOCKINGMODE_NORMAL 0 -#define PAGER_LOCKINGMODE_EXCLUSIVE 1 - -/* -** Numeric constants that encode the journalmode. -*/ -#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ -#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ -#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ -#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ -#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ -#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ -#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ - -/* -** The remainder of this file contains the declarations of the functions -** that make up the Pager sub-system API. See source code comments for -** a detailed description of each routine. -*/ - -/* Open and close a Pager connection. */ -SQLITE_PRIVATE int sqlite3PagerOpen( - sqlite3_vfs*, - Pager **ppPager, - const char*, - int, - int, - int, - void(*)(DbPage*) -); -SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); - -/* Functions used to configure a Pager object. */ -SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *); -SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, uint32_t*, int); -SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); -SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); -SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int,int); -SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); -SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int); -SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*); -SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*); -SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); -SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); - -/* Functions used to obtain and release page references. */ -SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); -#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0) -SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); -SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); -SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); - -/* Operations on page references. */ -SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); -SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); -SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); -SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); -SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); -SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); - -/* Functions used to manage pager transactions and savepoints. */ -SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*); -SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); -SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); -SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); -SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); -SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); -SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); -SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); -SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); - -SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); -SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager); - -/* Functions used to query pager state and configuration. */ -SQLITE_PRIVATE uint8_t sqlite3PagerIsreadonly(Pager*); -SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); -SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); -SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*); -SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager*); -SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); -SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); -SQLITE_PRIVATE int sqlite3PagerNosync(Pager*); -SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); -SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); - -/* Functions used to truncate the database file. */ -SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); - -#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) -SQLITE_PRIVATE void *sqlite3PagerCodec(DbPage *); -#endif - -/* Functions to support testing and debugging. */ -#if !defined(NDEBUG) || defined(SQLITE_TEST) -SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); -SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); -#endif -#ifdef SQLITE_TEST -SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); -SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); -void disable_simulated_io_errors(void); -void enable_simulated_io_errors(void); -#else -# define disable_simulated_io_errors() -# define enable_simulated_io_errors() -#endif - -#endif /* _PAGER_H_ */ - -/************** End of pager.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include pcache.h in the middle of sqliteInt.h ****************/ -/************** Begin file pcache.h ******************************************/ -/* -** 2008 August 05 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite page cache -** subsystem. -*/ - -#ifndef _PCACHE_H_ - -typedef struct PgHdr PgHdr; -typedef struct PCache PCache; - -/* -** Every page in the cache is controlled by an instance of the following -** structure. -*/ -struct PgHdr { - void *pData; /* Content of this page */ - void *pExtra; /* Extra content */ - PgHdr *pDirty; /* Transient list of dirty pages */ - Pgno pgno; /* Page number for this page */ - Pager *pPager; /* The pager this page is part of */ -#ifdef SQLITE_CHECK_PAGES - uint32_t pageHash; /* Hash of page content */ -#endif - uint16_t flags; /* PGHDR flags defined below */ - - /********************************************************************** - ** Elements above are public. All that follows is private to pcache.c - ** and should not be accessed by other modules. - */ - i16 nRef; /* Number of users of this page */ - PCache *pCache; /* Cache that owns this page */ - - PgHdr *pDirtyNext; /* Next element in list of dirty pages */ - PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ -}; - -/* Bit values for PgHdr.flags */ -#define PGHDR_DIRTY 0x002 /* Page has changed */ -#define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before - ** writing this page to the database */ -#define PGHDR_NEED_READ 0x008 /* Content is unread */ -#define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */ -#define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */ - -/* Initialize and shutdown the page cache subsystem */ -SQLITE_PRIVATE int sqlite3PcacheInitialize(void); -SQLITE_PRIVATE void sqlite3PcacheShutdown(void); - -/* Page cache buffer management: -** These routines implement SQLITE_CONFIG_PAGECACHE. -*/ -SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); - -/* Create a new pager cache. -** Under memory stress, invoke xStress to try to make pages clean. -** Only clean and unpinned pages can be reclaimed. -*/ -SQLITE_PRIVATE void sqlite3PcacheOpen( - int szPage, /* Size of every page */ - int szExtra, /* Extra space associated with each page */ - int bPurgeable, /* True if pages are on backing store */ - int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */ - void *pStress, /* Argument to xStress */ - PCache *pToInit /* Preallocated space for the PCache */ -); - -/* Modify the page-size after the cache has been created. */ -SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *, int); - -/* Return the size in bytes of a PCache object. Used to preallocate -** storage space. -*/ -SQLITE_PRIVATE int sqlite3PcacheSize(void); - -/* One release per successful fetch. Page is pinned until released. -** Reference counted. -*/ -SQLITE_PRIVATE int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**); -SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*); - -SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */ -SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ -SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ -SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ - -/* Change a page number. Used by incr-vacuum. */ -SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); - -/* Remove all pages with pgno>x. Reset the cache if x==0 */ -SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x); - -/* Get a list of all dirty pages in the cache, sorted by page number */ -SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*); - -/* Reset and close the cache object */ -SQLITE_PRIVATE void sqlite3PcacheClose(PCache*); - -/* Clear flags from pages of the page cache */ -SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *); - -/* Discard the contents of the cache */ -SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); - -/* Return the total number of outstanding page references */ -SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*); - -/* Increment the reference count of an existing page */ -SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*); - -SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*); - -/* Return the total number of pages stored in the cache */ -SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); - -#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) -/* Iterate through all dirty pages currently stored in the cache. This -** interface is only available if SQLITE_CHECK_PAGES is defined when the -** library is built. -*/ -SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); -#endif - -/* Set and get the suggested cache-size for the specified pager-cache. -** -** If no global maximum is configured, then the system attempts to limit -** the total number of pages cached by purgeable pager-caches to the sum -** of the suggested cache-sizes. -*/ -SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); -#ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); -#endif - -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT -/* Try to return memory used by the pcache module to the main memory heap */ -SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); -#endif - -#ifdef SQLITE_TEST -SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); -#endif - -SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); - -#endif /* _PCACHE_H_ */ - -/************** End of pcache.h **********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - -/************** Include os.h in the middle of sqliteInt.h ********************/ -/************** Begin file os.h **********************************************/ -/* -** 2001 September 16 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This header file (together with is companion C source-code file -** "os.c") attempt to abstract the underlying operating system so that -** the SQLite library will work on both POSIX and windows systems. -** -** This header file is #include-ed by sqliteInt.h and thus ends up -** being included by every source file. -*/ -#ifndef _SQLITE_OS_H_ -#define _SQLITE_OS_H_ - -/* -** Figure out if we are dealing with Unix, Windows, or some other -** operating system. After the following block of preprocess macros, -** all of SQLITE_OS_UNIX, SQLITE_OS_WIN, SQLITE_OS_OS2, and SQLITE_OS_OTHER -** will defined to either 1 or 0. One of the four will be 1. The other -** three will be 0. -*/ -#if defined(SQLITE_OS_OTHER) -# if SQLITE_OS_OTHER==1 -# undef SQLITE_OS_UNIX -# define SQLITE_OS_UNIX 0 -# undef SQLITE_OS_WIN -# define SQLITE_OS_WIN 0 -# undef SQLITE_OS_OS2 -# define SQLITE_OS_OS2 0 -# else -# undef SQLITE_OS_OTHER -# endif -#endif -#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) -# define SQLITE_OS_OTHER 0 -# ifndef SQLITE_OS_WIN -# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) -# define SQLITE_OS_WIN 1 -# define SQLITE_OS_UNIX 0 -# define SQLITE_OS_OS2 0 -# elif defined(__EMX__) || defined(_OS2) || defined(OS2) || defined(_OS2_) || defined(__OS2__) -# define SQLITE_OS_WIN 0 -# define SQLITE_OS_UNIX 0 -# define SQLITE_OS_OS2 1 -# else -# define SQLITE_OS_WIN 0 -# define SQLITE_OS_UNIX 1 -# define SQLITE_OS_OS2 0 -# endif -# else -# define SQLITE_OS_UNIX 0 -# define SQLITE_OS_OS2 0 -# endif -#else -# ifndef SQLITE_OS_WIN -# define SQLITE_OS_WIN 0 -# endif -#endif - -/* -** Determine if we are dealing with WindowsCE - which has a much -** reduced API. -*/ -#if defined(_WIN32_WCE) -# define SQLITE_OS_WINCE 1 -#else -# define SQLITE_OS_WINCE 0 -#endif - - -/* -** Define the maximum size of a temporary filename -*/ -#if SQLITE_OS_WIN -# include -# define SQLITE_TEMPNAME_SIZE (MAX_PATH+50) -#elif SQLITE_OS_OS2 -# if (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 3) && defined(OS2_HIGH_MEMORY) -# include /* has to be included before os2.h for linking to work */ -# endif -# define INCL_DOSDATETIME -# define INCL_DOSFILEMGR -# define INCL_DOSERRORS -# define INCL_DOSMISC -# define INCL_DOSPROCESS -# define INCL_DOSMODULEMGR -# define INCL_DOSSEMAPHORES -# include -# include -# define SQLITE_TEMPNAME_SIZE (CCHMAXPATHCOMP) -#else -# define SQLITE_TEMPNAME_SIZE 200 -#endif - -/* If the SET_FULLSYNC macro is not defined above, then make it -** a no-op -*/ -#ifndef SET_FULLSYNC -# define SET_FULLSYNC(x,y) -#endif - -/* -** The default size of a disk sector -*/ -#ifndef SQLITE_DEFAULT_SECTOR_SIZE -# define SQLITE_DEFAULT_SECTOR_SIZE 512 -#endif - -/* -** Temporary files are named starting with this prefix followed by 16 random -** alphanumeric characters, and no file extension. They are stored in the -** OS's standard temporary file directory, and are deleted prior to exit. -** If sqlite is being embedded in another program, you may wish to change the -** prefix to reflect your program's name, so that if your program exits -** prematurely, old temporary files can be easily identified. This can be done -** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. -** -** 2006-10-31: The default prefix used to be "sqlite_". But then -** Mcafee started using SQLite in their anti-virus product and it -** started putting files with the "sqlite" name in the c:/temp folder. -** This annoyed many windows users. Those users would then do a -** Google search for "sqlite", find the telephone numbers of the -** developers and call to wake them up at night and complain. -** For this reason, the default name prefix is changed to be "sqlite" -** spelled backwards. So the temp files are still identified, but -** anybody smart enough to figure out the code is also likely smart -** enough to know that calling the developer will not help get rid -** of the file. -*/ -#ifndef SQLITE_TEMP_FILE_PREFIX -# define SQLITE_TEMP_FILE_PREFIX "etilqs_" -#endif - -/* -** The following values may be passed as the second argument to -** sqlite3OsLock(). The various locks exhibit the following semantics: -** -** SHARED: Any number of processes may hold a SHARED lock simultaneously. -** RESERVED: A single process may hold a RESERVED lock on a file at -** any time. Other processes may hold and obtain new SHARED locks. -** PENDING: A single process may hold a PENDING lock on a file at -** any one time. Existing SHARED locks may persist, but no new -** SHARED locks may be obtained by other processes. -** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. -** -** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a -** process that requests an EXCLUSIVE lock may actually obtain a PENDING -** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to -** sqlite3OsLock(). -*/ -#define NO_LOCK 0 -#define SHARED_LOCK 1 -#define RESERVED_LOCK 2 -#define PENDING_LOCK 3 -#define EXCLUSIVE_LOCK 4 - -/* -** File Locking Notes: (Mostly about windows but also some info for Unix) -** -** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because -** those functions are not available. So we use only LockFile() and -** UnlockFile(). -** -** LockFile() prevents not just writing but also reading by other processes. -** A SHARED_LOCK is obtained by locking a single randomly-chosen -** byte out of a specific range of bytes. The lock byte is obtained at -** random so two separate readers can probably access the file at the -** same time, unless they are unlucky and choose the same lock byte. -** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. -** There can only be one writer. A RESERVED_LOCK is obtained by locking -** a single byte of the file that is designated as the reserved lock byte. -** A PENDING_LOCK is obtained by locking a designated byte different from -** the RESERVED_LOCK byte. -** -** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, -** which means we can use reader/writer locks. When reader/writer locks -** are used, the lock is placed on the same range of bytes that is used -** for probabilistic locking in Win95/98/ME. Hence, the locking scheme -** will support two or more Win95 readers or two or more WinNT readers. -** But a single Win95 reader will lock out all WinNT readers and a single -** WinNT reader will lock out all other Win95 readers. -** -** The following #defines specify the range of bytes used for locking. -** SHARED_SIZE is the number of bytes available in the pool from which -** a random byte is selected for a shared lock. The pool of bytes for -** shared locks begins at SHARED_FIRST. -** -** The same locking strategy and -** byte ranges are used for Unix. This leaves open the possiblity of having -** clients on win95, winNT, and unix all talking to the same shared file -** and all locking correctly. To do so would require that samba (or whatever -** tool is being used for file sharing) implements locks correctly between -** windows and unix. I'm guessing that isn't likely to happen, but by -** using the same locking range we are at least open to the possibility. -** -** Locking in windows is manditory. For this reason, we cannot store -** actual data in the bytes used for locking. The pager never allocates -** the pages involved in locking therefore. SHARED_SIZE is selected so -** that all locks will fit on a single page even at the minimum page size. -** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE -** is set high so that we don't have to allocate an unused page except -** for very large databases. But one should test the page skipping logic -** by setting PENDING_BYTE low and running the entire regression suite. -** -** Changing the value of PENDING_BYTE results in a subtly incompatible -** file format. Depending on how it is changed, you might not notice -** the incompatibility right away, even running a full regression test. -** The default location of PENDING_BYTE is the first byte past the -** 1GB boundary. -** -*/ -#ifdef SQLITE_OMIT_WSD -# define PENDING_BYTE (0x40000000) -#else -# define PENDING_BYTE sqlite3PendingByte -#endif -#define RESERVED_BYTE (PENDING_BYTE+1) -#define SHARED_FIRST (PENDING_BYTE+2) -#define SHARED_SIZE 510 - -/* -** Wrapper around OS specific sqlite3_os_init() function. -*/ -SQLITE_PRIVATE int sqlite3OsInit(void); - -/* -** Functions for accessing sqlite3_file methods -*/ -SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file*); -SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); -SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); -SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); -SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); -SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); -SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); -#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 -SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **); -SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int); -SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); - -/* -** Functions for accessing sqlite3_vfs methods -*/ -SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); -SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); -SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut); -SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); -#ifndef SQLITE_OMIT_LOAD_EXTENSION -SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); -SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *); -SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void); -SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); -#endif /* SQLITE_OMIT_LOAD_EXTENSION */ -SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); -SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); -SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); - -/* -** Convenience functions for opening and closing files using -** sqlite3_malloc() to obtain space for the file-handle structure. -*/ -SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); -SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); - -#endif /* _SQLITE_OS_H_ */ - -/************** End of os.h **************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include mutex.h in the middle of sqliteInt.h *****************/ -/************** Begin file mutex.h *******************************************/ -/* -** 2007 August 28 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file contains the common header for all mutex implementations. -** The sqliteInt.h header #includes this file so that it is available -** to all source files. We break it out in an effort to keep the code -** better organized. -** -** NOTE: source files should *not* #include this header file directly. -** Source files should #include the sqliteInt.h file and let that file -** include this one indirectly. -*/ - - -/* -** Figure out what version of the code to use. The choices are -** -** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The -** mutexes implemention cannot be overridden -** at start-time. -** -** SQLITE_MUTEX_NOOP For single-threaded applications. No -** mutual exclusion is provided. But this -** implementation can be overridden at -** start-time. -** -** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. -** -** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. -** -** SQLITE_MUTEX_OS2 For multi-threaded applications on OS/2. -*/ -#if !SQLITE_THREADSAFE -# define SQLITE_MUTEX_OMIT -#endif -#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) -# if SQLITE_OS_UNIX -# define SQLITE_MUTEX_PTHREADS -# elif SQLITE_OS_WIN -# define SQLITE_MUTEX_W32 -# elif SQLITE_OS_OS2 -# define SQLITE_MUTEX_OS2 -# else -# define SQLITE_MUTEX_NOOP -# endif -#endif - -#ifdef SQLITE_MUTEX_OMIT -/* -** If this is a no-op implementation, implement everything as macros. -*/ -#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) -#define sqlite3_mutex_free(X) -#define sqlite3_mutex_enter(X) -#define sqlite3_mutex_try(X) SQLITE_OK -#define sqlite3_mutex_leave(X) -#define sqlite3_mutex_held(X) ((void)(X),1) -#define sqlite3_mutex_notheld(X) ((void)(X),1) -#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) -#define sqlite3MutexInit() SQLITE_OK -#define sqlite3MutexEnd() -#endif /* defined(SQLITE_MUTEX_OMIT) */ - -/************** End of mutex.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - - -/* -** Each database file to be accessed by the system is an instance -** of the following structure. There are normally two of these structures -** in the sqlite.aDb[] array. aDb[0] is the main database file and -** aDb[1] is the database file used to hold temporary tables. Additional -** databases may be attached. -*/ -struct Db { - char *zName; /* Name of this database */ - Btree *pBt; /* The B*Tree structure for this database file */ - uint8_t inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */ - uint8_t safety_level; /* How aggressive at syncing data to disk */ - Schema *pSchema; /* Pointer to database schema (possibly shared) */ -}; - -/* -** An instance of the following structure stores a database schema. -*/ -struct Schema { - int schema_cookie; /* Database schema version number for this file */ - Hash tblHash; /* All tables indexed by name */ - Hash idxHash; /* All (named) indices indexed by name */ - Hash trigHash; /* All triggers indexed by name */ - Hash fkeyHash; /* All foreign keys by referenced table name */ - Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ - uint8_t file_format; /* Schema format version for this file */ - uint8_t enc; /* Text encoding used by this database */ - uint16_t flags; /* Flags associated with this schema */ - int cache_size; /* Number of pages to use in the cache */ -}; - -/* -** These macros can be used to test, set, or clear bits in the -** Db.pSchema->flags field. -*/ -#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))==(P)) -#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))!=0) -#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->flags|=(P) -#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->flags&=~(P) - -/* -** Allowed values for the DB.pSchema->flags field. -** -** The DB_SchemaLoaded flag is set after the database schema has been -** read into internal hash tables. -** -** DB_UnresetViews means that one or more views have column names that -** have been filled out. If the schema changes, these column names might -** changes and so the view will need to be reset. -*/ -#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ -#define DB_UnresetViews 0x0002 /* Some views have defined column names */ -#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ - -/* -** The number of different kinds of things that can be limited -** using the sqlite3_limit() interface. -*/ -#define SQLITE_N_LIMIT (SQLITE_LIMIT_TRIGGER_DEPTH+1) - -/* -** Lookaside malloc is a set of fixed-size buffers that can be used -** to satisfy small transient memory allocation requests for objects -** associated with a particular database connection. The use of -** lookaside malloc provides a significant performance enhancement -** (approx 10%) by avoiding numerous malloc/free requests while parsing -** SQL statements. -** -** The Lookaside structure holds configuration information about the -** lookaside malloc subsystem. Each available memory allocation in -** the lookaside subsystem is stored on a linked list of LookasideSlot -** objects. -** -** Lookaside allocations are only allowed for objects that are associated -** with a particular database connection. Hence, schema information cannot -** be stored in lookaside because in shared cache mode the schema information -** is shared by multiple database connections. Therefore, while parsing -** schema information, the Lookaside.bEnabled flag is cleared so that -** lookaside allocations are not used to construct the schema objects. -*/ -struct Lookaside { - uint16_t sz; /* Size of each buffer in bytes */ - uint8_t bEnabled; /* False to disable new lookaside allocations */ - uint8_t bMalloced; /* True if pStart obtained from sqlite3_malloc() */ - int nOut; /* Number of buffers currently checked out */ - int mxOut; /* Highwater mark for nOut */ - int anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ - LookasideSlot *pFree; /* List of available buffers */ - void *pStart; /* First byte of available memory space */ - void *pEnd; /* First byte past end of available space */ -}; -struct LookasideSlot { - LookasideSlot *pNext; /* Next buffer in the list of free buffers */ -}; - -/* -** A hash table for function definitions. -** -** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. -** Collisions are on the FuncDef.pHash chain. -*/ -struct FuncDefHash { - FuncDef *a[23]; /* Hash table for functions */ -}; - -/* -** Each database connection is an instance of the following structure. -** -** The sqlite.lastRowid records the last insert rowid generated by an -** insert statement. Inserts on views do not affect its value. Each -** trigger has its own context, so that lastRowid can be updated inside -** triggers as usual. The previous value will be restored once the trigger -** exits. Upon entering a before or instead of trigger, lastRowid is no -** longer (since after version 2.8.12) reset to -1. -** -** The sqlite.nChange does not count changes within triggers and keeps no -** context. It is reset at start of sqlite3_exec. -** The sqlite.lsChange represents the number of changes made by the last -** insert, update, or delete statement. It remains constant throughout the -** length of a statement and is then updated by OP_SetCounts. It keeps a -** context stack just like lastRowid so that the count of changes -** within a trigger is not seen outside the trigger. Changes to views do not -** affect the value of lsChange. -** The sqlite.csChange keeps track of the number of current changes (since -** the last statement) and is used to update sqlite_lsChange. -** -** The member variables sqlite.errCode, sqlite.zErrMsg and sqlite.zErrMsg16 -** store the most recent error code and, if applicable, string. The -** internal function sqlite3Error() is used to set these variables -** consistently. -*/ -struct sqlite3 { - sqlite3_vfs *pVfs; /* OS Interface */ - int nDb; /* Number of backends currently in use */ - Db *aDb; /* All backends */ - int flags; /* Miscellaneous flags. See below */ - int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ - int errCode; /* Most recent error code (SQLITE_*) */ - int errMask; /* & result codes with this before returning */ - uint8_t autoCommit; /* The auto-commit flag. */ - uint8_t temp_store; /* 1: file 2: memory 0: default */ - uint8_t mallocFailed; /* True if we have seen a malloc failure */ - uint8_t dfltLockMode; /* Default locking-mode for attached dbs */ - signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ - uint8_t suppressErr; /* Do not issue error messages if true */ - int nextPagesize; /* Pagesize after VACUUM if >0 */ - int nTable; /* Number of tables in the database */ - CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ - i64 lastRowid; /* ROWID of most recent insert (see above) */ - uint32_t magic; /* Magic number for detect library misuse */ - int nChange; /* Value returned by sqlite3_changes() */ - int nTotalChange; /* Value returned by sqlite3_total_changes() */ - sqlite3_mutex *mutex; /* Connection mutex */ - int aLimit[SQLITE_N_LIMIT]; /* Limits */ - struct sqlite3InitInfo { /* Information used during initialization */ - int iDb; /* When back is being initialized */ - int newTnum; /* Rootpage of table being initialized */ - uint8_t busy; /* TRUE if currently initializing */ - uint8_t orphanTrigger; /* Last statement is orphaned TEMP trigger */ - } init; - int nExtension; /* Number of loaded extensions */ - void **aExtension; /* Array of shared library handles */ - struct Vdbe *pVdbe; /* List of active virtual machines */ - int activeVdbeCnt; /* Number of VDBEs currently executing */ - int writeVdbeCnt; /* Number of active VDBEs that are writing */ - int vdbeExecCnt; /* Number of nested calls to VdbeExec() */ - void (*xTrace)(void*,const char*); /* Trace function */ - void *pTraceArg; /* Argument to the trace function */ - void (*xProfile)(void*,const char*,uint64_t); /* Profiling function */ - void *pProfileArg; /* Argument to profile function */ - void *pCommitArg; /* Argument to xCommitCallback() */ - int (*xCommitCallback)(void*); /* Invoked at every commit. */ - void *pRollbackArg; /* Argument to xRollbackCallback() */ - void (*xRollbackCallback)(void*); /* Invoked at every commit. */ - void *pUpdateArg; - void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); -#ifndef SQLITE_OMIT_WAL - int (*xWalCallback)(void *, sqlite3 *, const char *, int); - void *pWalArg; -#endif - void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); - void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); - void *pCollNeededArg; - sqlite3_value *pErr; /* Most recent error message */ - char *zErrMsg; /* Most recent error message (UTF-8 encoded) */ - char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */ - union { - volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ - double notUsed1; /* Spacer */ - } u1; - Lookaside lookaside; /* Lookaside malloc configuration */ -#ifndef SQLITE_OMIT_AUTHORIZATION - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); - /* Access authorization function */ - void *pAuthArg; /* 1st argument to the access auth function */ -#endif -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - int (*xProgress)(void *); /* The progress callback */ - void *pProgressArg; /* Argument to the progress callback */ - int nProgressOps; /* Number of opcodes for progress callback */ -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - Hash aModule; /* populated by sqlite3_create_module() */ - Table *pVTab; /* vtab with active Connect/Create method */ - VTable **aVTrans; /* Virtual tables with open transactions */ - int nVTrans; /* Allocated size of aVTrans */ - VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ -#endif - FuncDefHash aFunc; /* Hash table of connection functions */ - Hash aCollSeq; /* All collating sequences */ - BusyHandler busyHandler; /* Busy callback */ - int busyTimeout; /* Busy handler timeout, in msec */ - Db aDbStatic[2]; /* Static space for the 2 default backends */ - Savepoint *pSavepoint; /* List of active savepoints */ - int nSavepoint; /* Number of non-transaction savepoints */ - int nStatement; /* Number of nested statement-transactions */ - uint8_t isTransactionSavepoint; /* True if the outermost savepoint is a TS */ - i64 nDeferredCons; /* Net deferred constraints this transaction. */ - int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ - -#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY - /* The following variables are all protected by the STATIC_MASTER - ** mutex, not by sqlite3.mutex. They are used by code in notify.c. - ** - ** When X.pUnlockConnection==Y, that means that X is waiting for Y to - ** unlock so that it can proceed. - ** - ** When X.pBlockingConnection==Y, that means that something that X tried - ** tried to do recently failed with an SQLITE_LOCKED error due to locks - ** held by Y. - */ - sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ - sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ - void *pUnlockArg; /* Argument to xUnlockNotify */ - void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ - sqlite3 *pNextBlocked; /* Next in list of all blocked connections */ -#endif -}; - -/* -** A macro to discover the encoding of a database. -*/ -#define ENC(db) ((db)->aDb[0].pSchema->enc) - -/* -** Possible values for the sqlite3.flags. -*/ -#define SQLITE_VdbeTrace 0x00000100 /* True to trace VDBE execution */ -#define SQLITE_InternChanges 0x00000200 /* Uncommitted Hash table changes */ -#define SQLITE_FullColNames 0x00000400 /* Show full column names on SELECT */ -#define SQLITE_ShortColNames 0x00000800 /* Show short columns names */ -#define SQLITE_CountRows 0x00001000 /* Count rows changed by INSERT, */ -/* DELETE, or UPDATE and return */ -/* the count using a callback. */ -#define SQLITE_NullCallback 0x00002000 /* Invoke the callback once if the */ -/* result set is empty */ -#define SQLITE_SqlTrace 0x00004000 /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing 0x00008000 /* Debug listings of VDBE programs */ -#define SQLITE_WriteSchema 0x00010000 /* OK to update SQLITE_MASTER */ -#define SQLITE_NoReadlock 0x00020000 /* Readlocks are omitted when - ** accessing read-only databases */ -#define SQLITE_IgnoreChecks 0x00040000 /* Do not enforce check constraints */ -#define SQLITE_ReadUncommitted 0x0080000 /* For shared-cache mode */ -#define SQLITE_LegacyFileFmt 0x00100000 /* Create new databases in format 1 */ -#define SQLITE_FullFSync 0x00200000 /* Use full fsync on the backend */ -#define SQLITE_CkptFullFSync 0x00400000 /* Use full fsync for checkpoint */ -#define SQLITE_RecoveryMode 0x00800000 /* Ignore schema errors */ -#define SQLITE_ReverseOrder 0x01000000 /* Reverse unordered SELECTs */ -#define SQLITE_RecTriggers 0x02000000 /* Enable recursive triggers */ -#define SQLITE_ForeignKeys 0x04000000 /* Enforce foreign key constraints */ -#define SQLITE_AutoIndex 0x08000000 /* Enable automatic indexes */ -#define SQLITE_PreferBuiltin 0x10000000 /* Preference to built-in funcs */ -#define SQLITE_LoadExtension 0x20000000 /* Enable load_extension */ - -/* -** Bits of the sqlite3.flags field that are used by the -** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface. -** These must be the low-order bits of the flags field. -*/ -#define SQLITE_QueryFlattener 0x01 /* Disable query flattening */ -#define SQLITE_ColumnCache 0x02 /* Disable the column cache */ -#define SQLITE_IndexSort 0x04 /* Disable indexes for sorting */ -#define SQLITE_IndexSearch 0x08 /* Disable indexes for searching */ -#define SQLITE_IndexCover 0x10 /* Disable index covering table */ -#define SQLITE_GroupByOrder 0x20 /* Disable GROUPBY cover of ORDERBY */ -#define SQLITE_FactorOutConst 0x40 /* Disable factoring out constants */ -#define SQLITE_OptMask 0xff /* Mask of all disablable opts */ - -/* -** Possible values for the sqlite.magic field. -** The numbers are obtained at random and have no special meaning, other -** than being distinct from one another. -*/ -#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ -#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ -#define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */ -#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ -#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ - -/* -** Each SQL function is defined by an instance of the following -** structure. A pointer to this structure is stored in the sqlite.aFunc -** hash table. When multiple functions have the same name, the hash table -** points to a linked list of these structures. -*/ -struct FuncDef { - i16 nArg; /* Number of arguments. -1 means unlimited */ - uint8_t iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */ - uint8_t flags; /* Some combination of SQLITE_FUNC_* */ - void *pUserData; /* User data parameter */ - FuncDef *pNext; /* Next function with same name */ - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ - void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ - void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */ - char *zName; /* SQL name of the function. */ - FuncDef *pHash; /* Next with a different name but the same hash */ - FuncDestructor *pDestructor; /* Reference counted destructor function */ -}; - -/* -** This structure encapsulates a user-function destructor callback (as -** configured using create_function_v2()) and a reference counter. When -** create_function_v2() is called to create a function with a destructor, -** a single object of this type is allocated. FuncDestructor.nRef is set to -** the number of FuncDef objects created (either 1 or 3, depending on whether -** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor -** member of each of the new FuncDef objects is set to point to the allocated -** FuncDestructor. -** -** Thereafter, when one of the FuncDef objects is deleted, the reference -** count on this object is decremented. When it reaches 0, the destructor -** is invoked and the FuncDestructor structure freed. -*/ -struct FuncDestructor { - int nRef; - void (*xDestroy)(void *); - void *pUserData; -}; - -/* -** Possible values for FuncDef.flags -*/ -#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */ -#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */ -#define SQLITE_FUNC_EPHEM 0x04 /* Ephemeral. Delete with VDBE */ -#define SQLITE_FUNC_NEEDCOLL 0x08 /* sqlite3GetFuncCollSeq() might be called */ -#define SQLITE_FUNC_PRIVATE 0x10 /* Allowed for internal use only */ -#define SQLITE_FUNC_COUNT 0x20 /* Built-in count(*) aggregate */ -#define SQLITE_FUNC_COALESCE 0x40 /* Built-in coalesce() or ifnull() function */ - -/* -** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are -** used to create the initializers for the FuncDef structures. -** -** FUNCTION(zName, nArg, iArg, bNC, xFunc) -** Used to create a scalar function definition of a function zName -** implemented by C function xFunc that accepts nArg arguments. The -** value passed as iArg is cast to a (void*) and made available -** as the user-data (sqlite3_user_data()) for the function. If -** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. -** -** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) -** Used to create an aggregate function definition implemented by -** the C functions xStep and xFinal. The first four parameters -** are interpreted in the same way as the first 4 parameters to -** FUNCTION(). -** -** LIKEFUNC(zName, nArg, pArg, flags) -** Used to create a scalar function definition of a function zName -** that accepts nArg arguments and is implemented by a call to C -** function likeFunc. Argument pArg is cast to a (void *) and made -** available as the function user-data (sqlite3_user_data()). The -** FuncDef.flags variable is set to the value passed as the flags -** parameter. -*/ -#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ - {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ - SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} -#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ - {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ - pArg, 0, xFunc, 0, 0, #zName, 0, 0} -#define LIKEFUNC(zName, nArg, arg, flags) \ - {nArg, SQLITE_UTF8, flags, (void *)arg, 0, likeFunc, 0, 0, #zName, 0, 0} -#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ - {nArg, SQLITE_UTF8, nc*SQLITE_FUNC_NEEDCOLL, \ - SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} - -/* -** All current savepoints are stored in a linked list starting at -** sqlite3.pSavepoint. The first element in the list is the most recently -** opened savepoint. Savepoints are added to the list by the vdbe -** OP_Savepoint instruction. -*/ -struct Savepoint { - char *zName; /* Savepoint name (nul-terminated) */ - i64 nDeferredCons; /* Number of deferred fk violations */ - Savepoint *pNext; /* Parent savepoint (if any) */ -}; - -/* -** The following are used as the second parameter to sqlite3Savepoint(), -** and as the P1 argument to the OP_Savepoint instruction. -*/ -#define SAVEPOINT_BEGIN 0 -#define SAVEPOINT_RELEASE 1 -#define SAVEPOINT_ROLLBACK 2 - - -/* -** Each SQLite module (virtual table definition) is defined by an -** instance of the following structure, stored in the sqlite3.aModule -** hash table. -*/ -struct Module { - const sqlite3_module *pModule; /* Callback pointers */ - const char *zName; /* Name passed to create_module() */ - void *pAux; /* pAux passed to create_module() */ - void (*xDestroy)(void *); /* Module destructor function */ -}; - -/* -** information about each column of an SQL table is held in an instance -** of this structure. -*/ -struct Column { - char *zName; /* Name of this column */ - Expr *pDflt; /* Default value of this column */ - char *zDflt; /* Original text of the default value */ - char *zType; /* Data type for this column */ - char *zColl; /* Collating sequence. If NULL, use the default */ - uint8_t notNull; /* True if there is a NOT NULL constraint */ - uint8_t isPrimKey; /* True if this column is part of the PRIMARY KEY */ - char affinity; /* One of the SQLITE_AFF_... values */ -#ifndef SQLITE_OMIT_VIRTUALTABLE - uint8_t isHidden; /* True if this column is 'hidden' */ -#endif -}; - -/* -** A "Collating Sequence" is defined by an instance of the following -** structure. Conceptually, a collating sequence consists of a name and -** a comparison routine that defines the order of that sequence. -** -** There may two separate implementations of the collation function, one -** that processes text in UTF-8 encoding (CollSeq.xCmp) and another that -** processes text encoded in UTF-16 (CollSeq.xCmp16), using the machine -** native byte order. When a collation sequence is invoked, SQLite selects -** the version that will require the least expensive encoding -** translations, if any. -** -** The CollSeq.pUser member variable is an extra parameter that passed in -** as the first argument to the UTF-8 comparison function, xCmp. -** CollSeq.pUser16 is the equivalent for the UTF-16 comparison function, -** xCmp16. -** -** If both CollSeq.xCmp and CollSeq.xCmp16 are NULL, it means that the -** collating sequence is undefined. Indices built on an undefined -** collating sequence may not be read or written. -*/ -struct CollSeq { - char *zName; /* Name of the collating sequence, UTF-8 encoded */ - uint8_t enc; /* Text encoding handled by xCmp() */ - uint8_t type; /* One of the SQLITE_COLL_... values below */ - void *pUser; /* First argument to xCmp() */ - int (*xCmp)(void*,int, const void*, int, const void*); - void (*xDel)(void*); /* Destructor for pUser */ -}; - -/* -** Allowed values of CollSeq.type: -*/ -#define SQLITE_COLL_BINARY 1 /* The default memcmp() collating sequence */ -#define SQLITE_COLL_NOCASE 2 /* The built-in NOCASE collating sequence */ -#define SQLITE_COLL_REVERSE 3 /* The built-in REVERSE collating sequence */ -#define SQLITE_COLL_USER 0 /* Any other user-defined collating sequence */ - -/* -** A sort order can be either ASC or DESC. -*/ -#define SQLITE_SO_ASC 0 /* Sort in ascending order */ -#define SQLITE_SO_DESC 1 /* Sort in ascending order */ - -/* -** Column affinity types. -** -** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and -** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve -** the speed a little by numbering the values consecutively. -** -** But rather than start with 0 or 1, we begin with 'a'. That way, -** when multiple affinity types are concatenated into a string and -** used as the P4 operand, they will be more readable. -** -** Note also that the numeric types are grouped together so that testing -** for a numeric type is a single comparison. -*/ -#define SQLITE_AFF_TEXT 'a' -#define SQLITE_AFF_NONE 'b' -#define SQLITE_AFF_NUMERIC 'c' -#define SQLITE_AFF_INTEGER 'd' -#define SQLITE_AFF_REAL 'e' - -#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) - -/* -** The SQLITE_AFF_MASK values masks off the significant bits of an -** affinity value. -*/ -#define SQLITE_AFF_MASK 0x67 - -/* -** Additional bit values that can be ORed with an affinity without -** changing the affinity. -*/ -#define SQLITE_JUMPIFNULL 0x08 /* jumps if either operand is NULL */ -#define SQLITE_STOREP2 0x10 /* Store result in reg[P2] rather than jump */ -#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ - -/* -** An object of this type is created for each virtual table present in -** the database schema. -** -** If the database schema is shared, then there is one instance of this -** structure for each database connection (sqlite3*) that uses the shared -** schema. This is because each database connection requires its own unique -** instance of the sqlite3_vtab* handle used to access the virtual table -** implementation. sqlite3_vtab* handles can not be shared between -** database connections, even when the rest of the in-memory database -** schema is shared, as the implementation often stores the database -** connection handle passed to it via the xConnect() or xCreate() method -** during initialization internally. This database connection handle may -** then used by the virtual table implementation to access real tables -** within the database. So that they appear as part of the callers -** transaction, these accesses need to be made via the same database -** connection as that used to execute SQL operations on the virtual table. -** -** All VTable objects that correspond to a single table in a shared -** database schema are initially stored in a linked-list pointed to by -** the Table.pVTable member variable of the corresponding Table object. -** When an sqlite3_prepare() operation is required to access the virtual -** table, it searches the list for the VTable that corresponds to the -** database connection doing the preparing so as to use the correct -** sqlite3_vtab* handle in the compiled query. -** -** When an in-memory Table object is deleted (for example when the -** schema is being reloaded for some reason), the VTable objects are not -** deleted and the sqlite3_vtab* handles are not xDisconnect()ed -** immediately. Instead, they are moved from the Table.pVTable list to -** another linked list headed by the sqlite3.pDisconnect member of the -** corresponding sqlite3 structure. They are then deleted/xDisconnected -** next time a statement is prepared using said sqlite3*. This is done -** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. -** Refer to comments above function sqlite3VtabUnlockList() for an -** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect -** list without holding the corresponding sqlite3.mutex mutex. -** -** The memory for objects of this type is always allocated by -** sqlite3DbMalloc(), using the connection handle stored in VTable.db as -** the first argument. -*/ -struct VTable { - sqlite3 *db; /* Database connection associated with this table */ - Module *pMod; /* Pointer to module implementation */ - sqlite3_vtab *pVtab; /* Pointer to vtab instance */ - int nRef; /* Number of pointers to this structure */ - VTable *pNext; /* Next in linked list (see above) */ -}; - -/* -** Each SQL table is represented in memory by an instance of the -** following structure. -** -** Table.zName is the name of the table. The case of the original -** CREATE TABLE statement is stored, but case is not significant for -** comparisons. -** -** Table.nCol is the number of columns in this table. Table.aCol is a -** pointer to an array of Column structures, one for each column. -** -** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of -** the column that is that key. Otherwise Table.iPKey is negative. Note -** that the datatype of the PRIMARY KEY must be INTEGER for this field to -** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of -** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid -** is generated for each row of the table. TF_HasPrimaryKey is set if -** the table has any PRIMARY KEY, INTEGER or otherwise. -** -** Table.tnum is the page number for the root BTree page of the table in the -** database file. If Table.iDb is the index of the database table backend -** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that -** holds temporary tables and indices. If TF_Ephemeral is set -** then the table is stored in a file that is automatically deleted -** when the VDBE cursor to the table is closed. In this case Table.tnum -** refers VDBE cursor number that holds the table open, not to the root -** page number. Transient tables are used to hold the results of a -** sub-query that appears instead of a real table name in the FROM clause -** of a SELECT statement. -*/ -struct Table { - char *zName; /* Name of the table or view */ - int iPKey; /* If not negative, use aCol[iPKey] as the primary key */ - int nCol; /* Number of columns in this table */ - Column *aCol; /* Information about each column */ - Index *pIndex; /* List of SQL indexes on this table. */ - int tnum; /* Root BTree node for this table (see note above) */ - unsigned nRowEst; /* Estimated rows in table - from sqlite_stat1 table */ - Select *pSelect; /* NULL for tables. Points to definition if a view. */ - uint16_t nRef; /* Number of pointers to this Table */ - uint8_t tabFlags; /* Mask of TF_* values */ - uint8_t keyConf; /* What to do in case of uniqueness conflict on iPKey */ - FKey *pFKey; /* Linked list of all foreign keys in this table */ - char *zColAff; /* String defining the affinity of each column */ -#ifndef SQLITE_OMIT_CHECK - Expr *pCheck; /* The AND of all CHECK constraints */ -#endif -#ifndef SQLITE_OMIT_ALTERTABLE - int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - VTable *pVTable; /* List of VTable objects. */ - int nModuleArg; /* Number of arguments to the module */ - char **azModuleArg; /* Text of all module args. [0] is module name */ -#endif - Trigger *pTrigger; /* List of triggers stored in pSchema */ - Schema *pSchema; /* Schema that contains this table */ - Table *pNextZombie; /* Next on the Parse.pZombieTab list */ -}; - -/* -** Allowed values for Tabe.tabFlags. -*/ -#define TF_Readonly 0x01 /* Read-only system table */ -#define TF_Ephemeral 0x02 /* An ephemeral table */ -#define TF_HasPrimaryKey 0x04 /* Table has a primary key */ -#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */ -#define TF_Virtual 0x10 /* Is a virtual table */ -#define TF_NeedMetadata 0x20 /* aCol[].zType and aCol[].pColl missing */ - - - -/* -** Test to see whether or not a table is a virtual table. This is -** done as a macro so that it will be optimized out when virtual -** table support is omitted from the build. -*/ -#ifndef SQLITE_OMIT_VIRTUALTABLE -# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0) -# define IsHiddenColumn(X) ((X)->isHidden) -#else -# define IsVirtual(X) 0 -# define IsHiddenColumn(X) 0 -#endif - -/* -** Each foreign key constraint is an instance of the following structure. -** -** A foreign key is associated with two tables. The "from" table is -** the table that contains the REFERENCES clause that creates the foreign -** key. The "to" table is the table that is named in the REFERENCES clause. -** Consider this example: -** -** CREATE TABLE ex1( -** a INTEGER PRIMARY KEY, -** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) -** ); -** -** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". -** -** Each REFERENCES clause generates an instance of the following structure -** which is attached to the from-table. The to-table need not exist when -** the from-table is created. The existence of the to-table is not checked. -*/ -struct FKey { - Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */ - FKey *pNextFrom; /* Next foreign key in pFrom */ - char *zTo; /* Name of table that the key points to (aka: Parent) */ - FKey *pNextTo; /* Next foreign key on table named zTo */ - FKey *pPrevTo; /* Previous foreign key on table named zTo */ - int nCol; /* Number of columns in this key */ - /* EV: R-30323-21917 */ - uint8_t isDeferred; /* True if constraint checking is deferred till COMMIT */ - uint8_t aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */ - Trigger *apTrigger[2]; /* Triggers for aAction[] actions */ - struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ - int iFrom; /* Index of column in pFrom */ - char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */ - } aCol[1]; /* One entry for each of nCol column s */ -}; - -/* -** SQLite supports many different ways to resolve a constraint -** error. ROLLBACK processing means that a constraint violation -** causes the operation in process to fail and for the current transaction -** to be rolled back. ABORT processing means the operation in process -** fails and any prior changes from that one operation are backed out, -** but the transaction is not rolled back. FAIL processing means that -** the operation in progress stops and returns an error code. But prior -** changes due to the same operation are not backed out and no rollback -** occurs. IGNORE means that the particular row that caused the constraint -** error is not inserted or updated. Processing continues and no error -** is returned. REPLACE means that preexisting database rows that caused -** a UNIQUE constraint violation are removed so that the new insert or -** update can proceed. Processing continues and no error is reported. -** -** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. -** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the -** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign -** key is set to NULL. CASCADE means that a DELETE or UPDATE of the -** referenced table row is propagated into the row that holds the -** foreign key. -** -** The following symbolic values are used to record which type -** of action to take. -*/ -#define OE_None 0 /* There is no constraint to check */ -#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ -#define OE_Abort 2 /* Back out changes but do no rollback transaction */ -#define OE_Fail 3 /* Stop the operation but leave all prior changes */ -#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ -#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ - -#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ -#define OE_SetNull 7 /* Set the foreign key value to NULL */ -#define OE_SetDflt 8 /* Set the foreign key value to its default */ -#define OE_Cascade 9 /* Cascade the changes */ - -#define OE_Default 99 /* Do whatever the default action is */ - - -/* -** An instance of the following structure is passed as the first -** argument to sqlite3VdbeKeyCompare and is used to control the -** comparison of the two index keys. -*/ -struct KeyInfo { - sqlite3 *db; /* The database connection */ - uint8_t enc; /* Text encoding - one of the SQLITE_UTF* values */ - uint16_t nField; /* Number of entries in aColl[] */ - uint8_t *aSortOrder; /* Sort order for each column. May be NULL */ - CollSeq *aColl[1]; /* Collating sequence for each term of the key */ -}; - -/* -** An instance of the following structure holds information about a -** single index record that has already been parsed out into individual -** values. -** -** A record is an object that contains one or more fields of data. -** Records are used to store the content of a table row and to store -** the key of an index. A blob encoding of a record is created by -** the OP_MakeRecord opcode of the VDBE and is disassembled by the -** OP_Column opcode. -** -** This structure holds a record that has already been disassembled -** into its constituent fields. -*/ -struct UnpackedRecord { - KeyInfo *pKeyInfo; /* Collation and sort-order information */ - uint16_t nField; /* Number of entries in apMem[] */ - uint16_t flags; /* Boolean settings. UNPACKED_... below */ - i64 rowid; /* Used by UNPACKED_PREFIX_SEARCH */ - Mem *aMem; /* Values */ -}; - -/* -** Allowed values of UnpackedRecord.flags -*/ -#define UNPACKED_NEED_FREE 0x0001 /* Memory is from sqlite3Malloc() */ -#define UNPACKED_NEED_DESTROY 0x0002 /* apMem[]s should all be destroyed */ -#define UNPACKED_IGNORE_ROWID 0x0004 /* Ignore trailing rowid on key1 */ -#define UNPACKED_INCRKEY 0x0008 /* Make this key an epsilon larger */ -#define UNPACKED_PREFIX_MATCH 0x0010 /* A prefix match is considered OK */ -#define UNPACKED_PREFIX_SEARCH 0x0020 /* A prefix match is considered OK */ - -/* -** Each SQL index is represented in memory by an -** instance of the following structure. -** -** The columns of the table that are to be indexed are described -** by the aiColumn[] field of this structure. For example, suppose -** we have the following table and index: -** -** CREATE TABLE Ex1(c1 int, c2 int, c3 text); -** CREATE INDEX Ex2 ON Ex1(c3,c1); -** -** In the Table structure describing Ex1, nCol==3 because there are -** three columns in the table. In the Index structure describing -** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. -** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the -** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. -** The second column to be indexed (c1) has an index of 0 in -** Ex1.aCol[], hence Ex2.aiColumn[1]==0. -** -** The Index.onError field determines whether or not the indexed columns -** must be unique and what to do if they are not. When Index.onError=OE_None, -** it means this is not a unique index. Otherwise it is a unique index -** and the value of Index.onError indicate the which conflict resolution -** algorithm to employ whenever an attempt is made to insert a non-unique -** element. -*/ -struct Index { - char *zName; /* Name of this index */ - int nColumn; /* Number of columns in the table used by this index */ - int *aiColumn; /* Which columns are used by this index. 1st is 0 */ - unsigned *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */ - Table *pTable; /* The SQL table being indexed */ - int tnum; /* Page containing root of this index in database file */ - uint8_t onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - uint8_t autoIndex; /* True if is automatically created (ex: by UNIQUE) */ - char *zColAff; /* String defining the affinity of each column */ - Index *pNext; /* The next index associated with the same table */ - Schema *pSchema; /* Schema containing this index */ - uint8_t *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */ - char **azColl; /* Array of collation sequence names for index */ - IndexSample *aSample; /* Array of SQLITE_INDEX_SAMPLES samples */ -}; - -/* -** Each sample stored in the sqlite_stat2 table is represented in memory -** using a structure of this type. -*/ -struct IndexSample { - union { - char *z; /* Value if eType is SQLITE_TEXT or SQLITE_BLOB */ - double r; /* Value if eType is SQLITE_FLOAT or SQLITE_INTEGER */ - } u; - uint8_t eType; /* SQLITE_NULL, SQLITE_INTEGER ... etc. */ - uint8_t nByte; /* Size in byte of text or blob. */ -}; - -/* -** Each token coming out of the lexer is an instance of -** this structure. Tokens are also used as part of an expression. -** -** Note if Token.z==0 then Token.dyn and Token.n are undefined and -** may contain random values. Do not make any assumptions about Token.dyn -** and Token.n when Token.z==0. -*/ -struct Token { - const char *z; /* Text of the token. Not NULL-terminated! */ - unsigned int n; /* Number of characters in this token */ -}; - -/* -** An instance of this structure contains information needed to generate -** code for a SELECT that contains aggregate functions. -** -** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a -** pointer to this structure. The Expr.iColumn field is the index in -** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate -** code for that node. -** -** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the -** original Select structure that describes the SELECT statement. These -** fields do not need to be freed when deallocating the AggInfo structure. -*/ -struct AggInfo { - uint8_t directMode; /* Direct rendering mode means take data directly - ** from source tables rather than from accumulators */ - uint8_t useSortingIdx; /* In direct mode, reference the sorting index rather - ** than the source table */ - int sortingIdx; /* Cursor number of the sorting index */ - ExprList *pGroupBy; /* The group by clause */ - int nSortingColumn; /* Number of columns in the sorting index */ - struct AggInfo_col { /* For each column used in source tables */ - Table *pTab; /* Source table */ - int iTable; /* Cursor number of the source table */ - int iColumn; /* Column number within the source table */ - int iSorterColumn; /* Column number in the sorting index */ - int iMem; /* Memory location that acts as accumulator */ - Expr *pExpr; /* The original expression */ - } *aCol; - int nColumn; /* Number of used entries in aCol[] */ - int nColumnAlloc; /* Number of slots allocated for aCol[] */ - int nAccumulator; /* Number of columns that show through to the output. - ** Additional columns are used only as parameters to - ** aggregate functions */ - struct AggInfo_func { /* For each aggregate function */ - Expr *pExpr; /* Expression encoding the function */ - FuncDef *pFunc; /* The aggregate function implementation */ - int iMem; /* Memory location that acts as accumulator */ - int iDistinct; /* Ephemeral table used to enforce DISTINCT */ - } *aFunc; - int nFunc; /* Number of entries in aFunc[] */ - int nFuncAlloc; /* Number of slots allocated for aFunc[] */ -}; - -/* -** The datatype ynVar is a signed integer, either 16-bit or 32-bit. -** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater -** than 32767 we have to make it 32-bit. 16-bit is preferred because -** it uses less memory in the Expr object, which is a big memory user -** in systems with lots of prepared statements. And few applications -** need more than about 10 or 20 variables. But some extreme users want -** to have prepared statements with over 32767 variables, and for them -** the option is available (at compile-time). -*/ -#if SQLITE_MAX_VARIABLE_NUMBER<=32767 -typedef i16 ynVar; -#else -typedef int ynVar; -#endif - -/* -** Each node of an expression in the parse tree is an instance -** of this structure. -** -** Expr.op is the opcode. The integer parser token codes are reused -** as opcodes here. For example, the parser defines TK_GE to be an integer -** code representing the ">=" operator. This same integer code is reused -** to represent the greater-than-or-equal-to operator in the expression -** tree. -** -** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, -** or TK_STRING), then Expr.token contains the text of the SQL literal. If -** the expression is a variable (TK_VARIABLE), then Expr.token contains the -** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), -** then Expr.token contains the name of the function. -** -** Expr.pRight and Expr.pLeft are the left and right subexpressions of a -** binary operator. Either or both may be NULL. -** -** Expr.x.pList is a list of arguments if the expression is an SQL function, -** a CASE expression or an IN expression of the form " IN (, ...)". -** Expr.x.pSelect is used if the expression is a sub-select or an expression of -** the form " IN (SELECT ...)". If the EP_xIsSelect bit is set in the -** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is -** valid. -** -** An expression of the form ID or ID.ID refers to a column in a table. -** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is -** the integer cursor number of a VDBE cursor pointing to that table and -** Expr.iColumn is the column number for the specific column. If the -** expression is used as a result in an aggregate SELECT, then the -** value is also stored in the Expr.iAgg column in the aggregate so that -** it can be accessed after all aggregates are computed. -** -** If the expression is an unbound variable marker (a question mark -** character '?' in the original SQL) then the Expr.iTable holds the index -** number for that variable. -** -** If the expression is a subquery then Expr.iColumn holds an integer -** register number containing the result of the subquery. If the -** subquery gives a constant result, then iTable is -1. If the subquery -** gives a different answer at different times during statement processing -** then iTable is the address of a subroutine that computes the subquery. -** -** If the Expr is of type OP_Column, and the table it is selecting from -** is a disk table or the "old.*" pseudo-table, then pTab points to the -** corresponding table definition. -** -** ALLOCATION NOTES: -** -** Expr objects can use a lot of memory space in database schema. To -** help reduce memory requirements, sometimes an Expr object will be -** truncated. And to reduce the number of memory allocations, sometimes -** two or more Expr objects will be stored in a single memory allocation, -** together with Expr.zToken strings. -** -** If the EP_Reduced and EP_TokenOnly flags are set when -** an Expr object is truncated. When EP_Reduced is set, then all -** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees -** are contained within the same memory allocation. Note, however, that -** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately -** allocated, regardless of whether or not EP_Reduced is set. -*/ -struct Expr { - uint8_t op; /* Operation performed by this node */ - char affinity; /* The affinity of the column or 0 if not a column */ - uint16_t flags; /* Various flags. EP_* See below */ - union { - char *zToken; /* Token value. Zero terminated and dequoted */ - int iValue; /* Integer value if EP_IntValue */ - } u; - - /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no - ** space is allocated for the fields below this point. An attempt to - ** access them will result in a segfault or malfunction. - *********************************************************************/ - - Expr *pLeft; /* Left subnode */ - Expr *pRight; /* Right subnode */ - union { - ExprList *pList; /* Function arguments or in " IN ( IN (

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 diff --git a/openair3/TEST/test_util.c b/openair3/TEST/test_util.c deleted file mode 100644 index 87fd2428f0..0000000000 --- a/openair3/TEST/test_util.c +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (C) 2004-2012 Free Software Foundation, Inc. - * - * Author: Simon Josefsson - * - * This file is part of GnuTLS. - * - * GnuTLS is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * GnuTLS is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GnuTLS; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include - -#include "test_util.h" - -int debug = 0; -int error_count = 0; -int break_on_error = 0; - -/* -1 means invalid */ -static const signed char hex_digits[0x100] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -}; - -void -fail (const char *format, ...) -{ - char str[1024]; - va_list arg_ptr; - - va_start (arg_ptr, format); - vsnprintf ( str, sizeof(str), format, arg_ptr); - va_end (arg_ptr); - fputs(str, stderr); - error_count++; - - if (break_on_error) - exit (1); -} - -void -success (const char *format, ...) -{ - char str[1024]; - va_list arg_ptr; - - va_start (arg_ptr, format); - vsnprintf ( str, sizeof(str), format, arg_ptr); - va_end (arg_ptr); - fputs(str, stderr); -} - -void -escapeprint (const char *str, size_t len) -{ - size_t i; - - printf (" (length %d bytes):\n\t", (int) len); - - for (i = 0; i < len; i++) { - if (((str[i] & 0xFF) >= 'A' && (str[i] & 0xFF) <= 'Z') || - ((str[i] & 0xFF) >= 'a' && (str[i] & 0xFF) <= 'z') || - ((str[i] & 0xFF) >= '0' && (str[i] & 0xFF) <= '9') - || (str[i] & 0xFF) == ' ' || (str[i] & 0xFF) == '.') - printf ("%c", (str[i] & 0xFF)); - else - printf ("\\x%02X", (str[i] & 0xFF)); - - if ((i + 1) % 16 == 0 && (i + 1) < len) - printf ("'\n\t'"); - } - - printf ("\n"); -} - -void -hexprint (const void *_str, size_t len) -{ - size_t i; - const char* str = _str; - - printf ("\t;; "); - - for (i = 0; i < len; i++) { - printf ("%02x ", (str[i] & 0xFF)); - - if ((i + 1) % 8 == 0) - printf (" "); - - if ((i + 1) % 16 == 0 && i + 1 < len) - printf ("\n\t;; "); - } - - printf ("\n"); -} - -void -binprint (const void *_str, size_t len) -{ - size_t i; - const char* str = _str; - - printf ("\t;; "); - - for (i = 0; i < len; i++) { - printf ("%d%d%d%d%d%d%d%d ", - (str[i] & 0xFF) & 0x80 ? 1 : 0, - (str[i] & 0xFF) & 0x40 ? 1 : 0, - (str[i] & 0xFF) & 0x20 ? 1 : 0, - (str[i] & 0xFF) & 0x10 ? 1 : 0, - (str[i] & 0xFF) & 0x08 ? 1 : 0, - (str[i] & 0xFF) & 0x04 ? 1 : 0, - (str[i] & 0xFF) & 0x02 ? 1 : 0, (str[i] & 0xFF) & 0x01 ? 1 : 0); - - if ((i + 1) % 3 == 0) - printf (" "); - - if ((i + 1) % 6 == 0 && i + 1 < len) - printf ("\n\t;; "); - } - - printf ("\n"); -} - -int -compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, - const uint8_t *pattern, const uint32_t length_pattern) -{ - int i; - - if (length_buffer != length_pattern) { - printf("Length mismatch, expecting %d bytes, got %d bytes\n", length_pattern, - length_buffer); - hexprint(buffer, length_buffer); - return -1; - } - - for (i = 0; i < length_buffer; i++) { - if (pattern[i] != buffer[i]) { - printf("Expecting:\n"); - hexprint(pattern, length_pattern); - printf("Received:\n"); - hexprint(buffer, length_buffer); - printf("Mismatch fount in byte %d\nExpecting 0x%02x, got 0x%02x\n", - i, pattern[i], buffer[i]); - return -1; - } - } - - return 0; -} - -unsigned -decode_hex_length(const char *h) -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned count; - unsigned i; - - for (count = i = 0; hex[i]; i++) { - if (isspace(hex[i])) - continue; - - if (hex_digits[hex[i]] < 0) - abort(); - - count++; - } - - if (count % 2) - abort(); - - return count / 2; -} - -int -decode_hex(uint8_t *dst, const char *h) -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned i = 0; - - for (;;) { - int high, low; - - while (*hex && isspace(*hex)) - hex++; - - if (!*hex) - return 1; - - high = hex_digits[*hex++]; - - if (high < 0) - return 0; - - while (*hex && isspace(*hex)) - hex++; - - if (!*hex) - return 0; - - low = hex_digits[*hex++]; - - if (low < 0) - return 0; - - dst[i++] = (high << 4) | low; - } -} - -uint8_t * -decode_hex_dup(const char *hex) -{ - uint8_t *p; - unsigned length = decode_hex_length(hex); - - p = malloc(length * sizeof(uint8_t)); - - if (decode_hex(p, hex)) - return p; - else { - free(p); - return NULL; - } -} - -int -main (int argc, char *argv[]) -{ - do - if (strcmp (argv[argc - 1], "-v") == 0 || - strcmp (argv[argc - 1], "--verbose") == 0) - debug = 1; - else if (strcmp (argv[argc - 1], "-b") == 0 || - strcmp (argv[argc - 1], "--break-on-error") == 0) - break_on_error = 1; - else if (strcmp (argv[argc - 1], "-h") == 0 || - strcmp (argv[argc - 1], "-?") == 0 || - strcmp (argv[argc - 1], "--help") == 0) { - printf ("Usage: %s [-vbh?] [--verbose] [--break-on-error] [--help]\n", - argv[0]); - return 1; - } - - while (argc-- > 1); - - doit (); - - if (debug || error_count > 0) - printf ("Self test `%s' finished with %d errors\n", argv[0], error_count); - - return error_count ? 1 : 0; -} diff --git a/openair3/TEST/test_util.h b/openair3/TEST/test_util.h deleted file mode 100644 index 541f41e1e0..0000000000 --- a/openair3/TEST/test_util.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2004-2012 Free Software Foundation, Inc. - * - * Author: Simon Josefsson - * - * This file is part of GnuTLS. - * - * GnuTLS is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * GnuTLS is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GnuTLS; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef TEST_UTIL_H -#define TEST_UTIL_H - -#include -#include - -#ifndef __attribute__ -#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) -#define __attribute__(Spec) /* empty */ -#endif -#endif - -extern int debug; -extern int error_count; -extern int break_on_error; - -extern void fail (const char *format, ...) -__attribute__ ((format (printf, 1, 2))); -extern void success (const char *format, ...) -__attribute__ ((format (printf, 1, 2))); - -extern void escapeprint (const char *str, size_t len); -extern void hexprint (const void *str, size_t len); -extern void binprint (const void *str, size_t len); - -extern uint8_t * decode_hex_dup(const char *hex); -extern int decode_hex(uint8_t *dst, const char *h); -extern unsigned decode_hex_length(const char *h); - -#define H(x) decode_hex_dup(x) -#define HL(x) decode_hex_dup(x), decode_hex_length(x) - -extern int -compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, - const uint8_t *pattern, const uint32_t length_pattern); - -/* This must be implemented elsewhere. */ -extern void doit (void); - -#endif /* TEST_UTIL_H_ */ diff --git a/openair3/UDP/COPYING b/openair3/UDP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/UDP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/SCRIPTS/PROFILING/gprof2dot.py b/targets/SCRIPTS/PROFILING/gprof2dot.py deleted file mode 100755 index 62b22762fb..0000000000 --- a/targets/SCRIPTS/PROFILING/gprof2dot.py +++ /dev/null @@ -1,2780 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2008-2009 Jose Fonseca -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -# - -"""Generate a dot graph from the output of several profilers.""" - -__author__ = "Jose Fonseca" - -__version__ = "1.0" - - -import sys -import math -import os.path -import re -import textwrap -import optparse -import xml.parsers.expat - - -try: - # Debugging helper module - import debug -except ImportError: - pass - - -def times(x): - return u"%u\xd7" % (x,) - -def percentage(p): - return "%.02f%%" % (p*100.0,) - -def add(a, b): - return a + b - -def equal(a, b): - if a == b: - return a - else: - return None - -def fail(a, b): - assert False - - -tol = 2 ** -23 - -def ratio(numerator, denominator): - try: - ratio = float(numerator)/float(denominator) - except ZeroDivisionError: - # 0/0 is undefined, but 1.0 yields more useful results - return 1.0 - if ratio < 0.0: - if ratio < -tol: - sys.stderr.write('warning: negative ratio (%s/%s)\n' % (numerator, denominator)) - return 0.0 - if ratio > 1.0: - if ratio > 1.0 + tol: - sys.stderr.write('warning: ratio greater than one (%s/%s)\n' % (numerator, denominator)) - return 1.0 - return ratio - - -class UndefinedEvent(Exception): - """Raised when attempting to get an event which is undefined.""" - - def __init__(self, event): - Exception.__init__(self) - self.event = event - - def __str__(self): - return 'unspecified event %s' % self.event.name - - -class Event(object): - """Describe a kind of event, and its basic operations.""" - - def __init__(self, name, null, aggregator, formatter = str): - self.name = name - self._null = null - self._aggregator = aggregator - self._formatter = formatter - - def __eq__(self, other): - return self is other - - def __hash__(self): - return id(self) - - def null(self): - return self._null - - def aggregate(self, val1, val2): - """Aggregate two event values.""" - assert val1 is not None - assert val2 is not None - return self._aggregator(val1, val2) - - def format(self, val): - """Format an event value.""" - assert val is not None - return self._formatter(val) - - -CALLS = Event("Calls", 0, add, times) -SAMPLES = Event("Samples", 0, add) -SAMPLES2 = Event("Samples", 0, add) - -TIME = Event("Time", 0.0, add, lambda x: '(' + str(x) + ')') -TIME_RATIO = Event("Time ratio", 0.0, add, lambda x: '(' + percentage(x) + ')') -TOTAL_TIME = Event("Total time", 0.0, fail) -TOTAL_TIME_RATIO = Event("Total time ratio", 0.0, fail, percentage) - - -class Object(object): - """Base class for all objects in profile which can store events.""" - - def __init__(self, events=None): - if events is None: - self.events = {} - else: - self.events = events - - def __hash__(self): - return id(self) - - def __eq__(self, other): - return self is other - - def __contains__(self, event): - return event in self.events - - def __getitem__(self, event): - try: - return self.events[event] - except KeyError: - raise UndefinedEvent(event) - - def __setitem__(self, event, value): - if value is None: - if event in self.events: - del self.events[event] - else: - self.events[event] = value - - -class Call(Object): - """A call between functions. - - There should be at most one call object for every pair of functions. - """ - - def __init__(self, callee_id): - Object.__init__(self) - self.callee_id = callee_id - self.ratio = None - self.weight = None - - -class Function(Object): - """A function.""" - - def __init__(self, id, name): - Object.__init__(self) - self.id = id - self.name = name - self.module = None - self.process = None - self.calls = {} - self.called = None - self.weight = None - self.cycle = None - - def add_call(self, call): - if call.callee_id in self.calls: - sys.stderr.write('warning: overwriting call from function %s to %s\n' % (str(self.id), str(call.callee_id))) - self.calls[call.callee_id] = call - - def get_call(self, callee_id): - if not callee_id in self.calls: - call = Call(callee_id) - call[SAMPLES] = 0 - call[SAMPLES2] = 0 - call[CALLS] = 0 - self.calls[callee_id] = call - return self.calls[callee_id] - - # TODO: write utility functions - - def __repr__(self): - return self.name - - -class Cycle(Object): - """A cycle made from recursive function calls.""" - - def __init__(self): - Object.__init__(self) - # XXX: Do cycles need an id? - self.functions = set() - - def add_function(self, function): - assert function not in self.functions - self.functions.add(function) - # XXX: Aggregate events? - if function.cycle is not None: - for other in function.cycle.functions: - if function not in self.functions: - self.add_function(other) - function.cycle = self - - -class Profile(Object): - """The whole profile.""" - - def __init__(self): - Object.__init__(self) - self.functions = {} - self.cycles = [] - - def add_function(self, function): - if function.id in self.functions: - sys.stderr.write('warning: overwriting function %s (id %s)\n' % (function.name, str(function.id))) - self.functions[function.id] = function - - def add_cycle(self, cycle): - self.cycles.append(cycle) - - def validate(self): - """Validate the edges.""" - - for function in self.functions.itervalues(): - for callee_id in function.calls.keys(): - assert function.calls[callee_id].callee_id == callee_id - if callee_id not in self.functions: - sys.stderr.write('warning: call to undefined function %s from function %s\n' % (str(callee_id), function.name)) - del function.calls[callee_id] - - def find_cycles(self): - """Find cycles using Tarjan's strongly connected components algorithm.""" - - # Apply the Tarjan's algorithm successively until all functions are visited - visited = set() - for function in self.functions.itervalues(): - if function not in visited: - self._tarjan(function, 0, [], {}, {}, visited) - cycles = [] - for function in self.functions.itervalues(): - if function.cycle is not None and function.cycle not in cycles: - cycles.append(function.cycle) - self.cycles = cycles - if 0: - for cycle in cycles: - sys.stderr.write("Cycle:\n") - for member in cycle.functions: - sys.stderr.write("\tFunction %s\n" % member.name) - - def _tarjan(self, function, order, stack, orders, lowlinks, visited): - """Tarjan's strongly connected components algorithm. - - See also: - - http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm - """ - - visited.add(function) - orders[function] = order - lowlinks[function] = order - order += 1 - pos = len(stack) - stack.append(function) - for call in function.calls.itervalues(): - callee = self.functions[call.callee_id] - # TODO: use a set to optimize lookup - if callee not in orders: - order = self._tarjan(callee, order, stack, orders, lowlinks, visited) - lowlinks[function] = min(lowlinks[function], lowlinks[callee]) - elif callee in stack: - lowlinks[function] = min(lowlinks[function], orders[callee]) - if lowlinks[function] == orders[function]: - # Strongly connected component found - members = stack[pos:] - del stack[pos:] - if len(members) > 1: - cycle = Cycle() - for member in members: - cycle.add_function(member) - return order - - def call_ratios(self, event): - # Aggregate for incoming calls - cycle_totals = {} - for cycle in self.cycles: - cycle_totals[cycle] = 0.0 - function_totals = {} - for function in self.functions.itervalues(): - function_totals[function] = 0.0 - for function in self.functions.itervalues(): - for call in function.calls.itervalues(): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - function_totals[callee] += call[event] - if callee.cycle is not None and callee.cycle is not function.cycle: - cycle_totals[callee.cycle] += call[event] - - # Compute the ratios - for function in self.functions.itervalues(): - for call in function.calls.itervalues(): - assert call.ratio is None - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is not None and callee.cycle is not function.cycle: - total = cycle_totals[callee.cycle] - else: - total = function_totals[callee] - call.ratio = ratio(call[event], total) - - def integrate(self, outevent, inevent): - """Propagate function time ratio allong the function calls. - - Must be called after finding the cycles. - - See also: - - http://citeseer.ist.psu.edu/graham82gprof.html - """ - - # Sanity checking - assert outevent not in self - for function in self.functions.itervalues(): - assert outevent not in function - assert inevent in function - for call in function.calls.itervalues(): - assert outevent not in call - if call.callee_id != function.id: - assert call.ratio is not None - - # Aggregate the input for each cycle - for cycle in self.cycles: - total = inevent.null() - for function in self.functions.itervalues(): - total = inevent.aggregate(total, function[inevent]) - self[inevent] = total - - # Integrate along the edges - total = inevent.null() - for function in self.functions.itervalues(): - total = inevent.aggregate(total, function[inevent]) - self._integrate_function(function, outevent, inevent) - self[outevent] = total - - def _integrate_function(self, function, outevent, inevent): - if function.cycle is not None: - return self._integrate_cycle(function.cycle, outevent, inevent) - else: - if outevent not in function: - total = function[inevent] - for call in function.calls.itervalues(): - if call.callee_id != function.id: - total += self._integrate_call(call, outevent, inevent) - function[outevent] = total - return function[outevent] - - def _integrate_call(self, call, outevent, inevent): - assert outevent not in call - assert call.ratio is not None - callee = self.functions[call.callee_id] - subtotal = call.ratio *self._integrate_function(callee, outevent, inevent) - call[outevent] = subtotal - return subtotal - - def _integrate_cycle(self, cycle, outevent, inevent): - if outevent not in cycle: - - # Compute the outevent for the whole cycle - total = inevent.null() - for member in cycle.functions: - subtotal = member[inevent] - for call in member.calls.itervalues(): - callee = self.functions[call.callee_id] - if callee.cycle is not cycle: - subtotal += self._integrate_call(call, outevent, inevent) - total += subtotal - cycle[outevent] = total - - # Compute the time propagated to callers of this cycle - callees = {} - for function in self.functions.itervalues(): - if function.cycle is not cycle: - for call in function.calls.itervalues(): - callee = self.functions[call.callee_id] - if callee.cycle is cycle: - try: - callees[callee] += call.ratio - except KeyError: - callees[callee] = call.ratio - - for member in cycle.functions: - member[outevent] = outevent.null() - - for callee, call_ratio in callees.iteritems(): - ranks = {} - call_ratios = {} - partials = {} - self._rank_cycle_function(cycle, callee, 0, ranks) - self._call_ratios_cycle(cycle, callee, ranks, call_ratios, set()) - partial = self._integrate_cycle_function(cycle, callee, call_ratio, partials, ranks, call_ratios, outevent, inevent) - assert partial == max(partials.values()) - assert not total or abs(1.0 - partial/(call_ratio*total)) <= 0.001 - - return cycle[outevent] - - def _rank_cycle_function(self, cycle, function, rank, ranks): - if function not in ranks or ranks[function] > rank: - ranks[function] = rank - for call in function.calls.itervalues(): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is cycle: - self._rank_cycle_function(cycle, callee, rank + 1, ranks) - - def _call_ratios_cycle(self, cycle, function, ranks, call_ratios, visited): - if function not in visited: - visited.add(function) - for call in function.calls.itervalues(): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is cycle: - if ranks[callee] > ranks[function]: - call_ratios[callee] = call_ratios.get(callee, 0.0) + call.ratio - self._call_ratios_cycle(cycle, callee, ranks, call_ratios, visited) - - def _integrate_cycle_function(self, cycle, function, partial_ratio, partials, ranks, call_ratios, outevent, inevent): - if function not in partials: - partial = partial_ratio*function[inevent] - for call in function.calls.itervalues(): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is not cycle: - assert outevent in call - partial += partial_ratio*call[outevent] - else: - if ranks[callee] > ranks[function]: - callee_partial = self._integrate_cycle_function(cycle, callee, partial_ratio, partials, ranks, call_ratios, outevent, inevent) - call_ratio = ratio(call.ratio, call_ratios[callee]) - call_partial = call_ratio*callee_partial - try: - call[outevent] += call_partial - except UndefinedEvent: - call[outevent] = call_partial - partial += call_partial - partials[function] = partial - try: - function[outevent] += partial - except UndefinedEvent: - function[outevent] = partial - return partials[function] - - def aggregate(self, event): - """Aggregate an event for the whole profile.""" - - total = event.null() - for function in self.functions.itervalues(): - try: - total = event.aggregate(total, function[event]) - except UndefinedEvent: - return - self[event] = total - - def ratio(self, outevent, inevent): - assert outevent not in self - assert inevent in self - for function in self.functions.itervalues(): - assert outevent not in function - assert inevent in function - function[outevent] = ratio(function[inevent], self[inevent]) - for call in function.calls.itervalues(): - assert outevent not in call - if inevent in call: - call[outevent] = ratio(call[inevent], self[inevent]) - self[outevent] = 1.0 - - def prune(self, node_thres, edge_thres): - """Prune the profile""" - - # compute the prune ratios - for function in self.functions.itervalues(): - try: - function.weight = function[TOTAL_TIME_RATIO] - except UndefinedEvent: - pass - - for call in function.calls.itervalues(): - callee = self.functions[call.callee_id] - - if TOTAL_TIME_RATIO in call: - # handle exact cases first - call.weight = call[TOTAL_TIME_RATIO] - else: - try: - # make a safe estimate - call.weight = min(function[TOTAL_TIME_RATIO], callee[TOTAL_TIME_RATIO]) - except UndefinedEvent: - pass - - # prune the nodes - for function_id in self.functions.keys(): - function = self.functions[function_id] - if function.weight is not None: - if function.weight < node_thres: - del self.functions[function_id] - - # prune the egdes - for function in self.functions.itervalues(): - for callee_id in function.calls.keys(): - call = function.calls[callee_id] - if callee_id not in self.functions or call.weight is not None and call.weight < edge_thres: - del function.calls[callee_id] - - def dump(self): - for function in self.functions.itervalues(): - sys.stderr.write('Function %s:\n' % (function.name,)) - self._dump_events(function.events) - for call in function.calls.itervalues(): - callee = self.functions[call.callee_id] - sys.stderr.write(' Call %s:\n' % (callee.name,)) - self._dump_events(call.events) - for cycle in self.cycles: - sys.stderr.write('Cycle:\n') - self._dump_events(cycle.events) - for function in cycle.functions: - sys.stderr.write(' Function %s\n' % (function.name,)) - - def _dump_events(self, events): - for event, value in events.iteritems(): - sys.stderr.write(' %s: %s\n' % (event.name, event.format(value))) - - -class Struct: - """Masquerade a dictionary with a structure-like behavior.""" - - def __init__(self, attrs = None): - if attrs is None: - attrs = {} - self.__dict__['_attrs'] = attrs - - def __getattr__(self, name): - try: - return self._attrs[name] - except KeyError: - raise AttributeError(name) - - def __setattr__(self, name, value): - self._attrs[name] = value - - def __str__(self): - return str(self._attrs) - - def __repr__(self): - return repr(self._attrs) - - -class ParseError(Exception): - """Raised when parsing to signal mismatches.""" - - def __init__(self, msg, line): - self.msg = msg - # TODO: store more source line information - self.line = line - - def __str__(self): - return '%s: %r' % (self.msg, self.line) - - -class Parser: - """Parser interface.""" - - def __init__(self): - pass - - def parse(self): - raise NotImplementedError - - -class LineParser(Parser): - """Base class for parsers that read line-based formats.""" - - def __init__(self, file): - Parser.__init__(self) - self._file = file - self.__line = None - self.__eof = False - self.line_no = 0 - - def readline(self): - line = self._file.readline() - if not line: - self.__line = '' - self.__eof = True - else: - self.line_no += 1 - self.__line = line.rstrip('\r\n') - - def lookahead(self): - assert self.__line is not None - return self.__line - - def consume(self): - assert self.__line is not None - line = self.__line - self.readline() - return line - - def eof(self): - assert self.__line is not None - return self.__eof - - -XML_ELEMENT_START, XML_ELEMENT_END, XML_CHARACTER_DATA, XML_EOF = range(4) - - -class XmlToken: - - def __init__(self, type, name_or_data, attrs = None, line = None, column = None): - assert type in (XML_ELEMENT_START, XML_ELEMENT_END, XML_CHARACTER_DATA, XML_EOF) - self.type = type - self.name_or_data = name_or_data - self.attrs = attrs - self.line = line - self.column = column - - def __str__(self): - if self.type == XML_ELEMENT_START: - return '<' + self.name_or_data + ' ...>' - if self.type == XML_ELEMENT_END: - return '' - if self.type == XML_CHARACTER_DATA: - return self.name_or_data - if self.type == XML_EOF: - return 'end of file' - assert 0 - - -class XmlTokenizer: - """Expat based XML tokenizer.""" - - def __init__(self, fp, skip_ws = True): - self.fp = fp - self.tokens = [] - self.index = 0 - self.final = False - self.skip_ws = skip_ws - - self.character_pos = 0, 0 - self.character_data = '' - - self.parser = xml.parsers.expat.ParserCreate() - self.parser.StartElementHandler = self.handle_element_start - self.parser.EndElementHandler = self.handle_element_end - self.parser.CharacterDataHandler = self.handle_character_data - - def handle_element_start(self, name, attributes): - self.finish_character_data() - line, column = self.pos() - token = XmlToken(XML_ELEMENT_START, name, attributes, line, column) - self.tokens.append(token) - - def handle_element_end(self, name): - self.finish_character_data() - line, column = self.pos() - token = XmlToken(XML_ELEMENT_END, name, None, line, column) - self.tokens.append(token) - - def handle_character_data(self, data): - if not self.character_data: - self.character_pos = self.pos() - self.character_data += data - - def finish_character_data(self): - if self.character_data: - if not self.skip_ws or not self.character_data.isspace(): - line, column = self.character_pos - token = XmlToken(XML_CHARACTER_DATA, self.character_data, None, line, column) - self.tokens.append(token) - self.character_data = '' - - def next(self): - size = 16*1024 - while self.index >= len(self.tokens) and not self.final: - self.tokens = [] - self.index = 0 - data = self.fp.read(size) - self.final = len(data) < size - try: - self.parser.Parse(data, self.final) - except xml.parsers.expat.ExpatError, e: - #if e.code == xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS: - if e.code == 3: - pass - else: - raise e - if self.index >= len(self.tokens): - line, column = self.pos() - token = XmlToken(XML_EOF, None, None, line, column) - else: - token = self.tokens[self.index] - self.index += 1 - return token - - def pos(self): - return self.parser.CurrentLineNumber, self.parser.CurrentColumnNumber - - -class XmlTokenMismatch(Exception): - - def __init__(self, expected, found): - self.expected = expected - self.found = found - - def __str__(self): - return '%u:%u: %s expected, %s found' % (self.found.line, self.found.column, str(self.expected), str(self.found)) - - -class XmlParser(Parser): - """Base XML document parser.""" - - def __init__(self, fp): - Parser.__init__(self) - self.tokenizer = XmlTokenizer(fp) - self.consume() - - def consume(self): - self.token = self.tokenizer.next() - - def match_element_start(self, name): - return self.token.type == XML_ELEMENT_START and self.token.name_or_data == name - - def match_element_end(self, name): - return self.token.type == XML_ELEMENT_END and self.token.name_or_data == name - - def element_start(self, name): - while self.token.type == XML_CHARACTER_DATA: - self.consume() - if self.token.type != XML_ELEMENT_START: - raise XmlTokenMismatch(XmlToken(XML_ELEMENT_START, name), self.token) - if self.token.name_or_data != name: - raise XmlTokenMismatch(XmlToken(XML_ELEMENT_START, name), self.token) - attrs = self.token.attrs - self.consume() - return attrs - - def element_end(self, name): - while self.token.type == XML_CHARACTER_DATA: - self.consume() - if self.token.type != XML_ELEMENT_END: - raise XmlTokenMismatch(XmlToken(XML_ELEMENT_END, name), self.token) - if self.token.name_or_data != name: - raise XmlTokenMismatch(XmlToken(XML_ELEMENT_END, name), self.token) - self.consume() - - def character_data(self, strip = True): - data = '' - while self.token.type == XML_CHARACTER_DATA: - data += self.token.name_or_data - self.consume() - if strip: - data = data.strip() - return data - - -class GprofParser(Parser): - """Parser for GNU gprof output. - - See also: - - Chapter "Interpreting gprof's Output" from the GNU gprof manual - http://sourceware.org/binutils/docs-2.18/gprof/Call-Graph.html#Call-Graph - - File "cg_print.c" from the GNU gprof source code - http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/src/gprof/cg_print.c?rev=1.12&cvsroot=src - """ - - def __init__(self, fp): - Parser.__init__(self) - self.fp = fp - self.functions = {} - self.cycles = {} - - def readline(self): - line = self.fp.readline() - if not line: - sys.stderr.write('error: unexpected end of file\n') - sys.exit(1) - line = line.rstrip('\r\n') - return line - - _int_re = re.compile(r'^\d+$') - _float_re = re.compile(r'^\d+\.\d+$') - - def translate(self, mo): - """Extract a structure from a match object, while translating the types in the process.""" - attrs = {} - groupdict = mo.groupdict() - for name, value in groupdict.iteritems(): - if value is None: - value = None - elif self._int_re.match(value): - value = int(value) - elif self._float_re.match(value): - value = float(value) - attrs[name] = (value) - return Struct(attrs) - - _cg_header_re = re.compile( - # original gprof header - r'^\s+called/total\s+parents\s*$|' + - r'^index\s+%time\s+self\s+descendents\s+called\+self\s+name\s+index\s*$|' + - r'^\s+called/total\s+children\s*$|' + - # GNU gprof header - r'^index\s+%\s+time\s+self\s+children\s+called\s+name\s*$' - ) - - _cg_ignore_re = re.compile( - # spontaneous - r'^\s+\s*$|' - # internal calls (such as "mcount") - r'^.*\((\d+)\)$' - ) - - _cg_primary_re = re.compile( - r'^\[(?P\d+)\]?' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?:(?P\d+)(?:\+(?P\d+))?)?' + - r'\s+(?P\S.*?)' + - r'(?:\s+\d+)>)?' + - r'\s\[(\d+)\]$' - ) - - _cg_parent_re = re.compile( - r'^\s+(?P\d+\.\d+)?' + - r'\s+(?P\d+\.\d+)?' + - r'\s+(?P\d+)(?:/(?P\d+))?' + - r'\s+(?P\S.*?)' + - r'(?:\s+\d+)>)?' + - r'\s\[(?P\d+)\]$' - ) - - _cg_child_re = _cg_parent_re - - _cg_cycle_header_re = re.compile( - r'^\[(?P\d+)\]?' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?:(?P\d+)(?:\+(?P\d+))?)?' + - r'\s+\d+)\sas\sa\swhole>' + - r'\s\[(\d+)\]$' - ) - - _cg_cycle_member_re = re.compile( - r'^\s+(?P\d+\.\d+)?' + - r'\s+(?P\d+\.\d+)?' + - r'\s+(?P\d+)(?:\+(?P\d+))?' + - r'\s+(?P\S.*?)' + - r'(?:\s+\d+)>)?' + - r'\s\[(?P\d+)\]$' - ) - - _cg_sep_re = re.compile(r'^--+$') - - def parse_function_entry(self, lines): - parents = [] - children = [] - - while True: - if not lines: - sys.stderr.write('warning: unexpected end of entry\n') - line = lines.pop(0) - if line.startswith('['): - break - - # read function parent line - mo = self._cg_parent_re.match(line) - if not mo: - if self._cg_ignore_re.match(line): - continue - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - else: - parent = self.translate(mo) - parents.append(parent) - - # read primary line - mo = self._cg_primary_re.match(line) - if not mo: - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - return - else: - function = self.translate(mo) - - while lines: - line = lines.pop(0) - - # read function subroutine line - mo = self._cg_child_re.match(line) - if not mo: - if self._cg_ignore_re.match(line): - continue - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - else: - child = self.translate(mo) - children.append(child) - - function.parents = parents - function.children = children - - self.functions[function.index] = function - - def parse_cycle_entry(self, lines): - - # read cycle header line - line = lines[0] - mo = self._cg_cycle_header_re.match(line) - if not mo: - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - return - cycle = self.translate(mo) - - # read cycle member lines - cycle.functions = [] - for line in lines[1:]: - mo = self._cg_cycle_member_re.match(line) - if not mo: - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - continue - call = self.translate(mo) - cycle.functions.append(call) - - self.cycles[cycle.cycle] = cycle - - def parse_cg_entry(self, lines): - if lines[0].startswith("["): - self.parse_cycle_entry(lines) - else: - self.parse_function_entry(lines) - - def parse_cg(self): - """Parse the call graph.""" - - # skip call graph header - while not self._cg_header_re.match(self.readline()): - pass - line = self.readline() - while self._cg_header_re.match(line): - line = self.readline() - - # process call graph entries - entry_lines = [] - while line != '\014': # form feed - if line and not line.isspace(): - if self._cg_sep_re.match(line): - self.parse_cg_entry(entry_lines) - entry_lines = [] - else: - entry_lines.append(line) - line = self.readline() - - def parse(self): - self.parse_cg() - self.fp.close() - - profile = Profile() - profile[TIME] = 0.0 - - cycles = {} - for index in self.cycles.iterkeys(): - cycles[index] = Cycle() - - for entry in self.functions.itervalues(): - # populate the function - function = Function(entry.index, entry.name) - function[TIME] = entry.self - if entry.called is not None: - function.called = entry.called - if entry.called_self is not None: - call = Call(entry.index) - call[CALLS] = entry.called_self - function.called += entry.called_self - - # populate the function calls - for child in entry.children: - call = Call(child.index) - - assert child.called is not None - call[CALLS] = child.called - - if child.index not in self.functions: - # NOTE: functions that were never called but were discovered by gprof's - # static call graph analysis dont have a call graph entry so we need - # to add them here - missing = Function(child.index, child.name) - function[TIME] = 0.0 - function.called = 0 - profile.add_function(missing) - - function.add_call(call) - - profile.add_function(function) - - if entry.cycle is not None: - try: - cycle = cycles[entry.cycle] - except KeyError: - sys.stderr.write('warning: entry missing\n' % entry.cycle) - cycle = Cycle() - cycles[entry.cycle] = cycle - cycle.add_function(function) - - profile[TIME] = profile[TIME] + function[TIME] - - for cycle in cycles.itervalues(): - profile.add_cycle(cycle) - - # Compute derived events - profile.validate() - profile.ratio(TIME_RATIO, TIME) - profile.call_ratios(CALLS) - profile.integrate(TOTAL_TIME, TIME) - profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME) - - return profile - - -class CallgrindParser(LineParser): - """Parser for valgrind's callgrind tool. - - See also: - - http://valgrind.org/docs/manual/cl-format.html - """ - - _call_re = re.compile('^calls=\s*(\d+)\s+((\d+|\+\d+|-\d+|\*)\s+)+$') - - def __init__(self, infile): - LineParser.__init__(self, infile) - - # Textual positions - self.position_ids = {} - self.positions = {} - - # Numeric positions - self.num_positions = 1 - self.cost_positions = ['line'] - self.last_positions = [0] - - # Events - self.num_events = 0 - self.cost_events = [] - - self.profile = Profile() - self.profile[SAMPLES] = 0 - - def parse(self): - # read lookahead - self.readline() - - self.parse_key('version') - self.parse_key('creator') - while self.parse_part(): - pass - if not self.eof(): - sys.stderr.write('warning: line %u: unexpected line\n' % self.line_no) - sys.stderr.write('%s\n' % self.lookahead()) - - # compute derived data - self.profile.validate() - self.profile.find_cycles() - self.profile.ratio(TIME_RATIO, SAMPLES) - self.profile.call_ratios(CALLS) - self.profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return self.profile - - def parse_part(self): - if not self.parse_header_line(): - return False - while self.parse_header_line(): - pass - if not self.parse_body_line(): - return False - while self.parse_body_line(): - pass - return True - - def parse_header_line(self): - return \ - self.parse_empty() or \ - self.parse_comment() or \ - self.parse_part_detail() or \ - self.parse_description() or \ - self.parse_event_specification() or \ - self.parse_cost_line_def() or \ - self.parse_cost_summary() - - _detail_keys = set(('cmd', 'pid', 'thread', 'part')) - - def parse_part_detail(self): - return self.parse_keys(self._detail_keys) - - def parse_description(self): - return self.parse_key('desc') is not None - - def parse_event_specification(self): - event = self.parse_key('event') - if event is None: - return False - return True - - def parse_cost_line_def(self): - pair = self.parse_keys(('events', 'positions')) - if pair is None: - return False - key, value = pair - items = value.split() - if key == 'events': - self.num_events = len(items) - self.cost_events = items - if key == 'positions': - self.num_positions = len(items) - self.cost_positions = items - self.last_positions = [0]*self.num_positions - return True - - def parse_cost_summary(self): - pair = self.parse_keys(('summary', 'totals')) - if pair is None: - return False - return True - - def parse_body_line(self): - return \ - self.parse_empty() or \ - self.parse_comment() or \ - self.parse_cost_line() or \ - self.parse_position_spec() or \ - self.parse_association_spec() - - __subpos_re = r'(0x[0-9a-fA-F]+|\d+|\+\d+|-\d+|\*)' - _cost_re = re.compile(r'^' + - __subpos_re + r'( +' + __subpos_re + r')*' + - r'( +\d+)*' + - '$') - - def parse_cost_line(self, calls=None): - line = self.lookahead().rstrip() - mo = self._cost_re.match(line) - if not mo: - return False - - function = self.get_function() - - values = line.split() - assert len(values) <= self.num_positions + self.num_events - - positions = values[0 : self.num_positions] - events = values[self.num_positions : ] - events += ['0']*(self.num_events - len(events)) - - for i in range(self.num_positions): - position = positions[i] - if position == '*': - position = self.last_positions[i] - elif position[0] in '-+': - position = self.last_positions[i] + int(position) - elif position.startswith('0x'): - position = int(position, 16) - else: - position = int(position) - self.last_positions[i] = position - - events = map(float, events) - - if calls is None: - function[SAMPLES] += events[0] - self.profile[SAMPLES] += events[0] - else: - callee = self.get_callee() - callee.called += calls - - try: - call = function.calls[callee.id] - except KeyError: - call = Call(callee.id) - call[CALLS] = calls - call[SAMPLES] = events[0] - function.add_call(call) - else: - call[CALLS] += calls - call[SAMPLES] += events[0] - - self.consume() - return True - - def parse_association_spec(self): - line = self.lookahead() - if not line.startswith('calls='): - return False - - _, values = line.split('=', 1) - values = values.strip().split() - calls = int(values[0]) - call_position = values[1:] - self.consume() - - self.parse_cost_line(calls) - - return True - - _position_re = re.compile('^(?P[cj]?(?:ob|fl|fi|fe|fn))=\s*(?:\((?P\d+)\))?(?:\s*(?P.+))?') - - _position_table_map = { - 'ob': 'ob', - 'fl': 'fl', - 'fi': 'fl', - 'fe': 'fl', - 'fn': 'fn', - 'cob': 'ob', - 'cfl': 'fl', - 'cfi': 'fl', - 'cfe': 'fl', - 'cfn': 'fn', - 'jfi': 'fl', - } - - _position_map = { - 'ob': 'ob', - 'fl': 'fl', - 'fi': 'fl', - 'fe': 'fl', - 'fn': 'fn', - 'cob': 'cob', - 'cfl': 'cfl', - 'cfi': 'cfl', - 'cfe': 'cfl', - 'cfn': 'cfn', - 'jfi': 'jfi', - } - - def parse_position_spec(self): - line = self.lookahead() - - if line.startswith('jump=') or line.startswith('jcnd='): - self.consume() - return True - - mo = self._position_re.match(line) - if not mo: - return False - - position, id, name = mo.groups() - if id: - table = self._position_table_map[position] - if name: - self.position_ids[(table, id)] = name - else: - name = self.position_ids.get((table, id), '') - self.positions[self._position_map[position]] = name - - self.consume() - return True - - def parse_empty(self): - if self.eof(): - return False - line = self.lookahead() - if line.strip(): - return False - self.consume() - return True - - def parse_comment(self): - line = self.lookahead() - if not line.startswith('#'): - return False - self.consume() - return True - - _key_re = re.compile(r'^(\w+):') - - def parse_key(self, key): - pair = self.parse_keys((key,)) - if not pair: - return None - key, value = pair - return value - line = self.lookahead() - mo = self._key_re.match(line) - if not mo: - return None - key, value = line.split(':', 1) - if key not in keys: - return None - value = value.strip() - self.consume() - return key, value - - def parse_keys(self, keys): - line = self.lookahead() - mo = self._key_re.match(line) - if not mo: - return None - key, value = line.split(':', 1) - if key not in keys: - return None - value = value.strip() - self.consume() - return key, value - - def make_function(self, module, filename, name): - # FIXME: module and filename are not being tracked reliably - #id = '|'.join((module, filename, name)) - id = name - try: - function = self.profile.functions[id] - except KeyError: - function = Function(id, name) - if module: - function.module = os.path.basename(module) - function[SAMPLES] = 0 - function.called = 0 - self.profile.add_function(function) - return function - - def get_function(self): - module = self.positions.get('ob', '') - filename = self.positions.get('fl', '') - function = self.positions.get('fn', '') - return self.make_function(module, filename, function) - - def get_callee(self): - module = self.positions.get('cob', '') - filename = self.positions.get('cfi', '') - function = self.positions.get('cfn', '') - return self.make_function(module, filename, function) - - -class OprofileParser(LineParser): - """Parser for oprofile callgraph output. - - See also: - - http://oprofile.sourceforge.net/doc/opreport.html#opreport-callgraph - """ - - _fields_re = { - 'samples': r'(\d+)', - '%': r'(\S+)', - 'linenr info': r'(?P\(no location information\)|\S+:\d+)', - 'image name': r'(?P\S+(?:\s\(tgid:[^)]*\))?)', - 'app name': r'(?P\S+)', - 'symbol name': r'(?P\(no symbols\)|.+?)', - } - - def __init__(self, infile): - LineParser.__init__(self, infile) - self.entries = {} - self.entry_re = None - - def add_entry(self, callers, function, callees): - try: - entry = self.entries[function.id] - except KeyError: - self.entries[function.id] = (callers, function, callees) - else: - callers_total, function_total, callees_total = entry - self.update_subentries_dict(callers_total, callers) - function_total.samples += function.samples - self.update_subentries_dict(callees_total, callees) - - def update_subentries_dict(self, totals, partials): - for partial in partials.itervalues(): - try: - total = totals[partial.id] - except KeyError: - totals[partial.id] = partial - else: - total.samples += partial.samples - - def parse(self): - # read lookahead - self.readline() - - self.parse_header() - while self.lookahead(): - self.parse_entry() - - profile = Profile() - - reverse_call_samples = {} - - # populate the profile - profile[SAMPLES] = 0 - for _callers, _function, _callees in self.entries.itervalues(): - function = Function(_function.id, _function.name) - function[SAMPLES] = _function.samples - profile.add_function(function) - profile[SAMPLES] += _function.samples - - if _function.application: - function.process = os.path.basename(_function.application) - if _function.image: - function.module = os.path.basename(_function.image) - - total_callee_samples = 0 - for _callee in _callees.itervalues(): - total_callee_samples += _callee.samples - - for _callee in _callees.itervalues(): - if not _callee.self: - call = Call(_callee.id) - call[SAMPLES2] = _callee.samples - function.add_call(call) - - # compute derived data - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES2) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - def parse_header(self): - while not self.match_header(): - self.consume() - line = self.lookahead() - fields = re.split(r'\s\s+', line) - entry_re = r'^\s*' + r'\s+'.join([self._fields_re[field] for field in fields]) + r'(?P\s+\[self\])?$' - self.entry_re = re.compile(entry_re) - self.skip_separator() - - def parse_entry(self): - callers = self.parse_subentries() - if self.match_primary(): - function = self.parse_subentry() - if function is not None: - callees = self.parse_subentries() - self.add_entry(callers, function, callees) - self.skip_separator() - - def parse_subentries(self): - subentries = {} - while self.match_secondary(): - subentry = self.parse_subentry() - subentries[subentry.id] = subentry - return subentries - - def parse_subentry(self): - entry = Struct() - line = self.consume() - mo = self.entry_re.match(line) - if not mo: - raise ParseError('failed to parse', line) - fields = mo.groupdict() - entry.samples = int(mo.group(1)) - if 'source' in fields and fields['source'] != '(no location information)': - source = fields['source'] - filename, lineno = source.split(':') - entry.filename = filename - entry.lineno = int(lineno) - else: - source = '' - entry.filename = None - entry.lineno = None - entry.image = fields.get('image', '') - entry.application = fields.get('application', '') - if 'symbol' in fields and fields['symbol'] != '(no symbols)': - entry.symbol = fields['symbol'] - else: - entry.symbol = '' - if entry.symbol.startswith('"') and entry.symbol.endswith('"'): - entry.symbol = entry.symbol[1:-1] - entry.id = ':'.join((entry.application, entry.image, source, entry.symbol)) - entry.self = fields.get('self', None) != None - if entry.self: - entry.id += ':self' - if entry.symbol: - entry.name = entry.symbol - else: - entry.name = entry.image - return entry - - def skip_separator(self): - while not self.match_separator(): - self.consume() - self.consume() - - def match_header(self): - line = self.lookahead() - return line.startswith('samples') - - def match_separator(self): - line = self.lookahead() - return line == '-'*len(line) - - def match_primary(self): - line = self.lookahead() - return not line[:1].isspace() - - def match_secondary(self): - line = self.lookahead() - return line[:1].isspace() - - -class HProfParser(LineParser): - """Parser for java hprof output - - See also: - - http://java.sun.com/developer/technicalArticles/Programming/HPROF.html - """ - - trace_re = re.compile(r'\t(.*)\((.*):(.*)\)') - trace_id_re = re.compile(r'^TRACE (\d+):$') - - def __init__(self, infile): - LineParser.__init__(self, infile) - self.traces = {} - self.samples = {} - - def parse(self): - # read lookahead - self.readline() - - while not self.lookahead().startswith('------'): self.consume() - while not self.lookahead().startswith('TRACE '): self.consume() - - self.parse_traces() - - while not self.lookahead().startswith('CPU'): - self.consume() - - self.parse_samples() - - # populate the profile - profile = Profile() - profile[SAMPLES] = 0 - - functions = {} - - # build up callgraph - for id, trace in self.traces.iteritems(): - if not id in self.samples: continue - mtime = self.samples[id][0] - last = None - - for func, file, line in trace: - if not func in functions: - function = Function(func, func) - function[SAMPLES] = 0 - profile.add_function(function) - functions[func] = function - - function = functions[func] - # allocate time to the deepest method in the trace - if not last: - function[SAMPLES] += mtime - profile[SAMPLES] += mtime - else: - c = function.get_call(last) - c[SAMPLES2] += mtime - - last = func - - # compute derived data - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES2) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - def parse_traces(self): - while self.lookahead().startswith('TRACE '): - self.parse_trace() - - def parse_trace(self): - l = self.consume() - mo = self.trace_id_re.match(l) - tid = mo.group(1) - last = None - trace = [] - - while self.lookahead().startswith('\t'): - l = self.consume() - match = self.trace_re.search(l) - if not match: - #sys.stderr.write('Invalid line: %s\n' % l) - break - else: - function_name, file, line = match.groups() - trace += [(function_name, file, line)] - - self.traces[int(tid)] = trace - - def parse_samples(self): - self.consume() - self.consume() - - while not self.lookahead().startswith('CPU'): - rank, percent_self, percent_accum, count, traceid, method = self.lookahead().split() - self.samples[int(traceid)] = (int(count), method) - self.consume() - - -class SysprofParser(XmlParser): - - def __init__(self, stream): - XmlParser.__init__(self, stream) - - def parse(self): - objects = {} - nodes = {} - - self.element_start('profile') - while self.token.type == XML_ELEMENT_START: - if self.token.name_or_data == 'objects': - assert not objects - objects = self.parse_items('objects') - elif self.token.name_or_data == 'nodes': - assert not nodes - nodes = self.parse_items('nodes') - else: - self.parse_value(self.token.name_or_data) - self.element_end('profile') - - return self.build_profile(objects, nodes) - - def parse_items(self, name): - assert name[-1] == 's' - items = {} - self.element_start(name) - while self.token.type == XML_ELEMENT_START: - id, values = self.parse_item(name[:-1]) - assert id not in items - items[id] = values - self.element_end(name) - return items - - def parse_item(self, name): - attrs = self.element_start(name) - id = int(attrs['id']) - values = self.parse_values() - self.element_end(name) - return id, values - - def parse_values(self): - values = {} - while self.token.type == XML_ELEMENT_START: - name = self.token.name_or_data - value = self.parse_value(name) - assert name not in values - values[name] = value - return values - - def parse_value(self, tag): - self.element_start(tag) - value = self.character_data() - self.element_end(tag) - if value.isdigit(): - return int(value) - if value.startswith('"') and value.endswith('"'): - return value[1:-1] - return value - - def build_profile(self, objects, nodes): - profile = Profile() - - profile[SAMPLES] = 0 - for id, object in objects.iteritems(): - # Ignore fake objects (process names, modules, "Everything", "kernel", etc.) - if object['self'] == 0: - continue - - function = Function(id, object['name']) - function[SAMPLES] = object['self'] - profile.add_function(function) - profile[SAMPLES] += function[SAMPLES] - - for id, node in nodes.iteritems(): - # Ignore fake calls - if node['self'] == 0: - continue - - # Find a non-ignored parent - parent_id = node['parent'] - while parent_id != 0: - parent = nodes[parent_id] - caller_id = parent['object'] - if objects[caller_id]['self'] != 0: - break - parent_id = parent['parent'] - if parent_id == 0: - continue - - callee_id = node['object'] - - assert objects[caller_id]['self'] - assert objects[callee_id]['self'] - - function = profile.functions[caller_id] - - samples = node['self'] - try: - call = function.calls[callee_id] - except KeyError: - call = Call(callee_id) - call[SAMPLES2] = samples - function.add_call(call) - else: - call[SAMPLES2] += samples - - # Compute derived events - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES2) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - -class SharkParser(LineParser): - """Parser for MacOSX Shark output. - - Author: tom@dbservice.com - """ - - def __init__(self, infile): - LineParser.__init__(self, infile) - self.stack = [] - self.entries = {} - - def add_entry(self, function): - try: - entry = self.entries[function.id] - except KeyError: - self.entries[function.id] = (function, { }) - else: - function_total, callees_total = entry - function_total.samples += function.samples - - def add_callee(self, function, callee): - func, callees = self.entries[function.id] - try: - entry = callees[callee.id] - except KeyError: - callees[callee.id] = callee - else: - entry.samples += callee.samples - - def parse(self): - self.readline() - self.readline() - self.readline() - self.readline() - - match = re.compile(r'(?P[|+ ]*)(?P\d+), (?P[^,]+), (?P.*)') - - while self.lookahead(): - line = self.consume() - mo = match.match(line) - if not mo: - raise ParseError('failed to parse', line) - - fields = mo.groupdict() - prefix = len(fields.get('prefix', 0)) / 2 - 1 - - symbol = str(fields.get('symbol', 0)) - image = str(fields.get('image', 0)) - - entry = Struct() - entry.id = ':'.join([symbol, image]) - entry.samples = int(fields.get('samples', 0)) - - entry.name = symbol - entry.image = image - - # adjust the callstack - if prefix < len(self.stack): - del self.stack[prefix:] - - if prefix == len(self.stack): - self.stack.append(entry) - - # if the callstack has had an entry, it's this functions caller - if prefix > 0: - self.add_callee(self.stack[prefix - 1], entry) - - self.add_entry(entry) - - profile = Profile() - profile[SAMPLES] = 0 - for _function, _callees in self.entries.itervalues(): - function = Function(_function.id, _function.name) - function[SAMPLES] = _function.samples - profile.add_function(function) - profile[SAMPLES] += _function.samples - - if _function.image: - function.module = os.path.basename(_function.image) - - for _callee in _callees.itervalues(): - call = Call(_callee.id) - call[SAMPLES] = _callee.samples - function.add_call(call) - - # compute derived data - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - -class XPerfParser(Parser): - """Parser for CSVs generted by XPerf, from Microsoft Windows Performance Tools. - """ - - def __init__(self, stream): - Parser.__init__(self) - self.stream = stream - self.profile = Profile() - self.profile[SAMPLES] = 0 - self.column = {} - - def parse(self): - import csv - reader = csv.reader( - self.stream, - delimiter = ',', - quotechar = None, - escapechar = None, - doublequote = False, - skipinitialspace = True, - lineterminator = '\r\n', - quoting = csv.QUOTE_NONE) - it = iter(reader) - row = reader.next() - self.parse_header(row) - for row in it: - self.parse_row(row) - - # compute derived data - self.profile.validate() - self.profile.find_cycles() - self.profile.ratio(TIME_RATIO, SAMPLES) - self.profile.call_ratios(SAMPLES2) - self.profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return self.profile - - def parse_header(self, row): - for column in range(len(row)): - name = row[column] - assert name not in self.column - self.column[name] = column - - def parse_row(self, row): - fields = {} - for name, column in self.column.iteritems(): - value = row[column] - for factory in int, float: - try: - value = factory(value) - except ValueError: - pass - else: - break - fields[name] = value - - process = fields['Process Name'] - symbol = fields['Module'] + '!' + fields['Function'] - weight = fields['Weight'] - count = fields['Count'] - - function = self.get_function(process, symbol) - function[SAMPLES] += weight * count - self.profile[SAMPLES] += weight * count - - stack = fields['Stack'] - if stack != '?': - stack = stack.split('/') - assert stack[0] == '[Root]' - if stack[-1] != symbol: - # XXX: some cases the sampled function does not appear in the stack - stack.append(symbol) - caller = None - for symbol in stack[1:]: - callee = self.get_function(process, symbol) - if caller is not None: - try: - call = caller.calls[callee.id] - except KeyError: - call = Call(callee.id) - call[SAMPLES2] = count - caller.add_call(call) - else: - call[SAMPLES2] += count - caller = callee - - def get_function(self, process, symbol): - function_id = process + '!' + symbol - - try: - function = self.profile.functions[function_id] - except KeyError: - module, name = symbol.split('!', 1) - function = Function(function_id, name) - function.process = process - function.module = module - function[SAMPLES] = 0 - self.profile.add_function(function) - - return function - - -class SleepyParser(Parser): - """Parser for GNU gprof output. - - See also: - - http://www.codersnotes.com/sleepy/ - - http://sleepygraph.sourceforge.net/ - """ - - def __init__(self, filename): - Parser.__init__(self) - - from zipfile import ZipFile - - self.database = ZipFile(filename) - - self.version_0_7 = 'Version 0.7 required' in self.database.namelist() - - self.symbols = {} - self.calls = {} - - self.profile = Profile() - - _symbol_re = re.compile( - r'^(?P\w+)' + - r'\s+"(?P[^"]*)"' + - r'\s+"(?P[^"]*)"' + - r'\s+"(?P[^"]*)"' + - r'\s+(?P\d+)$' - ) - - def parse_symbols(self): - if self.version_0_7: - symbols_txt = 'Symbols.txt' - else: - symbols_txt = 'symbols.txt' - lines = self.database.read(symbols_txt).splitlines() - for line in lines: - mo = self._symbol_re.match(line) - if mo: - symbol_id, module, procname, sourcefile, sourceline = mo.groups() - - function_id = ':'.join([module, procname]) - - try: - function = self.profile.functions[function_id] - except KeyError: - function = Function(function_id, procname) - function.module = module - function[SAMPLES] = 0 - self.profile.add_function(function) - - self.symbols[symbol_id] = function - - def parse_callstacks(self): - if self.version_0_7: - callstacks_txt = 'Callstacks.txt' - else: - callstacks_txt = 'callstacks.txt' - lines = self.database.read(callstacks_txt).splitlines() - for line in lines: - fields = line.split() - samples = float(fields[0]) - callstack = fields[1:] - - callstack = [self.symbols[symbol_id] for symbol_id in callstack] - - callee = callstack[0] - - callee[SAMPLES] += samples - self.profile[SAMPLES] += samples - - for caller in callstack[1:]: - try: - call = caller.calls[callee.id] - except KeyError: - call = Call(callee.id) - call[SAMPLES2] = samples - caller.add_call(call) - else: - call[SAMPLES2] += samples - - callee = caller - - def parse(self): - profile = self.profile - profile[SAMPLES] = 0 - - self.parse_symbols() - self.parse_callstacks() - - # Compute derived events - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES2) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - -class AQtimeTable: - - def __init__(self, name, fields): - self.name = name - - self.fields = fields - self.field_column = {} - for column in range(len(fields)): - self.field_column[fields[column]] = column - self.rows = [] - - def __len__(self): - return len(self.rows) - - def __iter__(self): - for values, children in self.rows: - fields = {} - for name, value in zip(self.fields, values): - fields[name] = value - children = dict([(child.name, child) for child in children]) - yield fields, children - raise StopIteration - - def add_row(self, values, children=()): - self.rows.append((values, children)) - - -class AQtimeParser(XmlParser): - - def __init__(self, stream): - XmlParser.__init__(self, stream) - self.tables = {} - - def parse(self): - self.element_start('AQtime_Results') - self.parse_headers() - results = self.parse_results() - self.element_end('AQtime_Results') - return self.build_profile(results) - - def parse_headers(self): - self.element_start('HEADERS') - while self.token.type == XML_ELEMENT_START: - self.parse_table_header() - self.element_end('HEADERS') - - def parse_table_header(self): - attrs = self.element_start('TABLE_HEADER') - name = attrs['NAME'] - id = int(attrs['ID']) - field_types = [] - field_names = [] - while self.token.type == XML_ELEMENT_START: - field_type, field_name = self.parse_table_field() - field_types.append(field_type) - field_names.append(field_name) - self.element_end('TABLE_HEADER') - self.tables[id] = name, field_types, field_names - - def parse_table_field(self): - attrs = self.element_start('TABLE_FIELD') - type = attrs['TYPE'] - name = self.character_data() - self.element_end('TABLE_FIELD') - return type, name - - def parse_results(self): - self.element_start('RESULTS') - table = self.parse_data() - self.element_end('RESULTS') - return table - - def parse_data(self): - rows = [] - attrs = self.element_start('DATA') - table_id = int(attrs['TABLE_ID']) - table_name, field_types, field_names = self.tables[table_id] - table = AQtimeTable(table_name, field_names) - while self.token.type == XML_ELEMENT_START: - row, children = self.parse_row(field_types) - table.add_row(row, children) - self.element_end('DATA') - return table - - def parse_row(self, field_types): - row = [None]*len(field_types) - children = [] - self.element_start('ROW') - while self.token.type == XML_ELEMENT_START: - if self.token.name_or_data == 'FIELD': - field_id, field_value = self.parse_field(field_types) - row[field_id] = field_value - elif self.token.name_or_data == 'CHILDREN': - children = self.parse_children() - else: - raise XmlTokenMismatch(" or ", self.token) - self.element_end('ROW') - return row, children - - def parse_field(self, field_types): - attrs = self.element_start('FIELD') - id = int(attrs['ID']) - type = field_types[id] - value = self.character_data() - if type == 'Integer': - value = int(value) - elif type == 'Float': - value = float(value) - elif type == 'Address': - value = int(value) - elif type == 'String': - pass - else: - assert False - self.element_end('FIELD') - return id, value - - def parse_children(self): - children = [] - self.element_start('CHILDREN') - while self.token.type == XML_ELEMENT_START: - table = self.parse_data() - assert table.name not in children - children.append(table) - self.element_end('CHILDREN') - return children - - def build_profile(self, results): - assert results.name == 'Routines' - profile = Profile() - profile[TIME] = 0.0 - for fields, tables in results: - function = self.build_function(fields) - children = tables['Children'] - for fields, _ in children: - call = self.build_call(fields) - function.add_call(call) - profile.add_function(function) - profile[TIME] = profile[TIME] + function[TIME] - profile[TOTAL_TIME] = profile[TIME] - profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME) - return profile - - def build_function(self, fields): - function = Function(self.build_id(fields), self.build_name(fields)) - function[TIME] = fields['Time'] - function[TOTAL_TIME] = fields['Time with Children'] - #function[TIME_RATIO] = fields['% Time']/100.0 - #function[TOTAL_TIME_RATIO] = fields['% with Children']/100.0 - return function - - def build_call(self, fields): - call = Call(self.build_id(fields)) - call[TIME] = fields['Time'] - call[TOTAL_TIME] = fields['Time with Children'] - #call[TIME_RATIO] = fields['% Time']/100.0 - #call[TOTAL_TIME_RATIO] = fields['% with Children']/100.0 - return call - - def build_id(self, fields): - return ':'.join([fields['Module Name'], fields['Unit Name'], fields['Routine Name']]) - - def build_name(self, fields): - # TODO: use more fields - return fields['Routine Name'] - - -class PstatsParser: - """Parser python profiling statistics saved with te pstats module.""" - - def __init__(self, *filename): - import pstats - try: - self.stats = pstats.Stats(*filename) - except ValueError: - import hotshot.stats - self.stats = hotshot.stats.load(filename[0]) - self.profile = Profile() - self.function_ids = {} - - def get_function_name(self, (filename, line, name)): - module = os.path.splitext(filename)[0] - module = os.path.basename(module) - return "%s:%d:%s" % (module, line, name) - - def get_function(self, key): - try: - id = self.function_ids[key] - except KeyError: - id = len(self.function_ids) - name = self.get_function_name(key) - function = Function(id, name) - self.profile.functions[id] = function - self.function_ids[key] = id - else: - function = self.profile.functions[id] - return function - - def parse(self): - self.profile[TIME] = 0.0 - self.profile[TOTAL_TIME] = self.stats.total_tt - for fn, (cc, nc, tt, ct, callers) in self.stats.stats.iteritems(): - callee = self.get_function(fn) - callee.called = nc - callee[TOTAL_TIME] = ct - callee[TIME] = tt - self.profile[TIME] += tt - self.profile[TOTAL_TIME] = max(self.profile[TOTAL_TIME], ct) - for fn, value in callers.iteritems(): - caller = self.get_function(fn) - call = Call(callee.id) - if isinstance(value, tuple): - for i in xrange(0, len(value), 4): - nc, cc, tt, ct = value[i:i+4] - if CALLS in call: - call[CALLS] += cc - else: - call[CALLS] = cc - - if TOTAL_TIME in call: - call[TOTAL_TIME] += ct - else: - call[TOTAL_TIME] = ct - - else: - call[CALLS] = value - call[TOTAL_TIME] = ratio(value, nc)*ct - - caller.add_call(call) - #self.stats.print_stats() - #self.stats.print_callees() - - # Compute derived events - self.profile.validate() - self.profile.ratio(TIME_RATIO, TIME) - self.profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME) - - return self.profile - - -class Theme: - - def __init__(self, - bgcolor = (0.0, 0.0, 1.0), - mincolor = (0.0, 0.0, 0.0), - maxcolor = (0.0, 0.0, 1.0), - fontname = "Arial", - minfontsize = 10.0, - maxfontsize = 10.0, - minpenwidth = 0.5, - maxpenwidth = 4.0, - gamma = 2.2, - skew = 1.0): - self.bgcolor = bgcolor - self.mincolor = mincolor - self.maxcolor = maxcolor - self.fontname = fontname - self.minfontsize = minfontsize - self.maxfontsize = maxfontsize - self.minpenwidth = minpenwidth - self.maxpenwidth = maxpenwidth - self.gamma = gamma - self.skew = skew - - def graph_bgcolor(self): - return self.hsl_to_rgb(*self.bgcolor) - - def graph_fontname(self): - return self.fontname - - def graph_fontsize(self): - return self.minfontsize - - def node_bgcolor(self, weight): - return self.color(weight) - - def node_fgcolor(self, weight): - return self.graph_bgcolor() - - def node_fontsize(self, weight): - return self.fontsize(weight) - - def edge_color(self, weight): - return self.color(weight) - - def edge_fontsize(self, weight): - return self.fontsize(weight) - - def edge_penwidth(self, weight): - return max(weight*self.maxpenwidth, self.minpenwidth) - - def edge_arrowsize(self, weight): - return 0.5 * math.sqrt(self.edge_penwidth(weight)) - - def fontsize(self, weight): - return max(weight**2 * self.maxfontsize, self.minfontsize) - - def color(self, weight): - weight = min(max(weight, 0.0), 1.0) - - hmin, smin, lmin = self.mincolor - hmax, smax, lmax = self.maxcolor - - if self.skew < 0: - raise ValueError("Skew must be greater than 0") - elif self.skew == 1.0: - h = hmin + weight*(hmax - hmin) - s = smin + weight*(smax - smin) - l = lmin + weight*(lmax - lmin) - else: - base = self.skew - h = hmin + ((hmax-hmin)*(-1.0 + (base ** weight)) / (base - 1.0)) - s = smin + ((smax-smin)*(-1.0 + (base ** weight)) / (base - 1.0)) - l = lmin + ((lmax-lmin)*(-1.0 + (base ** weight)) / (base - 1.0)) - - return self.hsl_to_rgb(h, s, l) - - def hsl_to_rgb(self, h, s, l): - """Convert a color from HSL color-model to RGB. - - See also: - - http://www.w3.org/TR/css3-color/#hsl-color - """ - - h = h % 1.0 - s = min(max(s, 0.0), 1.0) - l = min(max(l, 0.0), 1.0) - - if l <= 0.5: - m2 = l*(s + 1.0) - else: - m2 = l + s - l*s - m1 = l*2.0 - m2 - r = self._hue_to_rgb(m1, m2, h + 1.0/3.0) - g = self._hue_to_rgb(m1, m2, h) - b = self._hue_to_rgb(m1, m2, h - 1.0/3.0) - - # Apply gamma correction - r **= self.gamma - g **= self.gamma - b **= self.gamma - - return (r, g, b) - - def _hue_to_rgb(self, m1, m2, h): - if h < 0.0: - h += 1.0 - elif h > 1.0: - h -= 1.0 - if h*6 < 1.0: - return m1 + (m2 - m1)*h*6.0 - elif h*2 < 1.0: - return m2 - elif h*3 < 2.0: - return m1 + (m2 - m1)*(2.0/3.0 - h)*6.0 - else: - return m1 - - -TEMPERATURE_COLORMAP = Theme( - mincolor = (2.0/3.0, 0.80, 0.25), # dark blue - maxcolor = (0.0, 1.0, 0.5), # satured red - gamma = 1.0 -) - -PINK_COLORMAP = Theme( - mincolor = (0.0, 1.0, 0.90), # pink - maxcolor = (0.0, 1.0, 0.5), # satured red -) - -GRAY_COLORMAP = Theme( - mincolor = (0.0, 0.0, 0.85), # light gray - maxcolor = (0.0, 0.0, 0.0), # black -) - -BW_COLORMAP = Theme( - minfontsize = 8.0, - maxfontsize = 24.0, - mincolor = (0.0, 0.0, 0.0), # black - maxcolor = (0.0, 0.0, 0.0), # black - minpenwidth = 0.1, - maxpenwidth = 8.0, -) - - -class DotWriter: - """Writer for the DOT language. - - See also: - - "The DOT Language" specification - http://www.graphviz.org/doc/info/lang.html - """ - - def __init__(self, fp): - self.fp = fp - - def graph(self, profile, theme): - self.begin_graph() - - fontname = theme.graph_fontname() - - self.attr('graph', fontname=fontname, ranksep=0.25, nodesep=0.125) - self.attr('node', fontname=fontname, shape="box", style="filled", fontcolor="white", width=0, height=0) - self.attr('edge', fontname=fontname) - - for function in profile.functions.itervalues(): - labels = [] - if function.process is not None: - labels.append(function.process) - if function.module is not None: - labels.append(function.module) - labels.append(function.name) - for event in TOTAL_TIME_RATIO, TIME_RATIO: - if event in function.events: - label = event.format(function[event]) - labels.append(label) - if function.called is not None: - labels.append(u"%u\xd7" % (function.called,)) - - if function.weight is not None: - weight = function.weight - else: - weight = 0.0 - - label = '\n'.join(labels) - self.node(function.id, - label = label, - color = self.color(theme.node_bgcolor(weight)), - fontcolor = self.color(theme.node_fgcolor(weight)), - fontsize = "%.2f" % theme.node_fontsize(weight), - ) - - for call in function.calls.itervalues(): - callee = profile.functions[call.callee_id] - - labels = [] - for event in TOTAL_TIME_RATIO, CALLS: - if event in call.events: - label = event.format(call[event]) - labels.append(label) - - if call.weight is not None: - weight = call.weight - elif callee.weight is not None: - weight = callee.weight - else: - weight = 0.0 - - label = '\n'.join(labels) - - self.edge(function.id, call.callee_id, - label = label, - color = self.color(theme.edge_color(weight)), - fontcolor = self.color(theme.edge_color(weight)), - fontsize = "%.2f" % theme.edge_fontsize(weight), - penwidth = "%.2f" % theme.edge_penwidth(weight), - labeldistance = "%.2f" % theme.edge_penwidth(weight), - arrowsize = "%.2f" % theme.edge_arrowsize(weight), - ) - - self.end_graph() - - def begin_graph(self): - self.write('digraph {\n') - - def end_graph(self): - self.write('}\n') - - def attr(self, what, **attrs): - self.write("\t") - self.write(what) - self.attr_list(attrs) - self.write(";\n") - - def node(self, node, **attrs): - self.write("\t") - self.id(node) - self.attr_list(attrs) - self.write(";\n") - - def edge(self, src, dst, **attrs): - self.write("\t") - self.id(src) - self.write(" -> ") - self.id(dst) - self.attr_list(attrs) - self.write(";\n") - - def attr_list(self, attrs): - if not attrs: - return - self.write(' [') - first = True - for name, value in attrs.iteritems(): - if first: - first = False - else: - self.write(", ") - self.id(name) - self.write('=') - self.id(value) - self.write(']') - - def id(self, id): - if isinstance(id, (int, float)): - s = str(id) - elif isinstance(id, basestring): - if id.isalnum() and not id.startswith('0x'): - s = id - else: - s = self.escape(id) - else: - raise TypeError - self.write(s) - - def color(self, (r, g, b)): - - def float2int(f): - if f <= 0.0: - return 0 - if f >= 1.0: - return 255 - return int(255.0*f + 0.5) - - return "#" + "".join(["%02x" % float2int(c) for c in (r, g, b)]) - - def escape(self, s): - s = s.encode('utf-8') - s = s.replace('\\', r'\\') - s = s.replace('\n', r'\n') - s = s.replace('\t', r'\t') - s = s.replace('"', r'\"') - return '"' + s + '"' - - def write(self, s): - self.fp.write(s) - - -class Main: - """Main program.""" - - themes = { - "color": TEMPERATURE_COLORMAP, - "pink": PINK_COLORMAP, - "gray": GRAY_COLORMAP, - "bw": BW_COLORMAP, - } - - def main(self): - """Main program.""" - - parser = optparse.OptionParser( - usage="\n\t%prog [options] [file] ...", - version="%%prog %s" % __version__) - parser.add_option( - '-o', '--output', metavar='FILE', - type="string", dest="output", - help="output filename [stdout]") - parser.add_option( - '-n', '--node-thres', metavar='PERCENTAGE', - type="float", dest="node_thres", default=0.5, - help="eliminate nodes below this threshold [default: %default]") - parser.add_option( - '-e', '--edge-thres', metavar='PERCENTAGE', - type="float", dest="edge_thres", default=0.1, - help="eliminate edges below this threshold [default: %default]") - parser.add_option( - '-f', '--format', - type="choice", choices=('prof', 'callgrind', 'oprofile', 'hprof', 'sysprof', 'pstats', 'shark', 'sleepy', 'aqtime', 'xperf'), - dest="format", default="prof", - help="profile format: prof, callgrind, oprofile, hprof, sysprof, shark, sleepy, aqtime, pstats, or xperf [default: %default]") - parser.add_option( - '-c', '--colormap', - type="choice", choices=('color', 'pink', 'gray', 'bw'), - dest="theme", default="color", - help="color map: color, pink, gray, or bw [default: %default]") - parser.add_option( - '-s', '--strip', - action="store_true", - dest="strip", default=False, - help="strip function parameters, template parameters, and const modifiers from demangled C++ function names") - parser.add_option( - '-w', '--wrap', - action="store_true", - dest="wrap", default=False, - help="wrap function names") - # add a new option to control skew of the colorization curve - parser.add_option( - '--skew', - type="float", dest="theme_skew", default=1.0, - help="skew the colorization curve. Values < 1.0 give more variety to lower percentages. Value > 1.0 give less variety to lower percentages") - (self.options, self.args) = parser.parse_args(sys.argv[1:]) - - if len(self.args) > 1 and self.options.format != 'pstats': - parser.error('incorrect number of arguments') - - try: - self.theme = self.themes[self.options.theme] - except KeyError: - parser.error('invalid colormap \'%s\'' % self.options.theme) - - # set skew on the theme now that it has been picked. - if self.options.theme_skew: - self.theme.skew = self.options.theme_skew - - if self.options.format == 'prof': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = GprofParser(fp) - elif self.options.format == 'callgrind': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = CallgrindParser(fp) - elif self.options.format == 'oprofile': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = OprofileParser(fp) - elif self.options.format == 'sysprof': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = SysprofParser(fp) - elif self.options.format == 'hprof': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = HProfParser(fp) - elif self.options.format == 'pstats': - if not self.args: - parser.error('at least a file must be specified for pstats input') - parser = PstatsParser(*self.args) - elif self.options.format == 'xperf': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = XPerfParser(fp) - elif self.options.format == 'shark': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = SharkParser(fp) - elif self.options.format == 'sleepy': - if len(self.args) != 1: - parser.error('exactly one file must be specified for sleepy input') - parser = SleepyParser(self.args[0]) - elif self.options.format == 'aqtime': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = AQtimeParser(fp) - else: - parser.error('invalid format \'%s\'' % self.options.format) - - self.profile = parser.parse() - - if self.options.output is None: - self.output = sys.stdout - else: - self.output = open(self.options.output, 'wt') - - self.write_graph() - - _parenthesis_re = re.compile(r'\([^()]*\)') - _angles_re = re.compile(r'<[^<>]*>') - _const_re = re.compile(r'\s+const$') - - def strip_function_name(self, name): - """Remove extraneous information from C++ demangled function names.""" - - # Strip function parameters from name by recursively removing paired parenthesis - while True: - name, n = self._parenthesis_re.subn('', name) - if not n: - break - - # Strip const qualifier - name = self._const_re.sub('', name) - - # Strip template parameters from name by recursively removing paired angles - while True: - name, n = self._angles_re.subn('', name) - if not n: - break - - return name - - def wrap_function_name(self, name): - """Split the function name on multiple lines.""" - - if len(name) > 32: - ratio = 2.0/3.0 - height = max(int(len(name)/(1.0 - ratio) + 0.5), 1) - width = max(len(name)/height, 32) - # TODO: break lines in symbols - name = textwrap.fill(name, width, break_long_words=False) - - # Take away spaces - name = name.replace(", ", ",") - name = name.replace("> >", ">>") - name = name.replace("> >", ">>") # catch consecutive - - return name - - def compress_function_name(self, name): - """Compress function name according to the user preferences.""" - - if self.options.strip: - name = self.strip_function_name(name) - - if self.options.wrap: - name = self.wrap_function_name(name) - - # TODO: merge functions with same resulting name - - return name - - def write_graph(self): - dot = DotWriter(self.output) - profile = self.profile - profile.prune(self.options.node_thres/100.0, self.options.edge_thres/100.0) - - for function in profile.functions.itervalues(): - function.name = self.compress_function_name(function.name) - - dot.graph(profile, self.theme) - - -if __name__ == '__main__': - Main().main() diff --git a/targets/SCRIPTS/PROFILING/profoai.sh b/targets/SCRIPTS/PROFILING/profoai.sh deleted file mode 100755 index aeee839b7a..0000000000 --- a/targets/SCRIPTS/PROFILING/profoai.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -echo "----README------" -echo "" -echo "make sure that you have compiled the code with GPROF=1 and installed gprof and graphviz" - -echo "set up params" - -n_frames=4000 -abstraction=1 -traffic_load=2 -ue="1" -#ping="64 128 256 512 1024 1400" - -if [ $abstraction = 1 ]; then - option1="-a" -else - option1="-A AWGN -s 15" -fi; - -if [ $traffic_load = 1 ]; then - option2="-T1" -fi; -if [ $traffic_load = 2 ]; then - option2="-c8" -fi; -if [ $traffic_load = 3 ]; then - option2="-T3" -fi; - -echo "start oai profiling" -for i in $ue -do - rm gmon.out gmon.txt - echo "$OPENAIR_TARGETS/SIMU/USER/oaisim $option1 $option2 -n $n_frames -u $i > /dev/null" -$OPENAIR_TARGETS/SIMU/USER/oaisim $option1 $option2 -n $n_frames -u $i > /dev/null - - #mv $OPENAIR_TARGETS/SIMU/USER/gmon. . - gprof $OPENAIR_TARGETS/SIMU/USER/oaisim > gmon.txt - echo "$OPENAIR_TARGETS/SCRIPTS/gprof2dot.py gmon.txt > profoai.ue$ue.dot" - $OPENAIR_TARGETS/SCRIPTS/PROFILING/gprof2dot.py gmon.txt > profoai.a$abstraction.n$n_frames.ue$i.dot - dot -Tpng profoai.a$abstraction.n$n_frames.ue$i.dot > profoai.a$abstraction.n$n_frames.ue$i.png - echo "oai profiling with $i ue is done" - -done - -echo "end oai profiling" From 310a87ea90977bcbeddbe5db9875e036324c574e Mon Sep 17 00:00:00 2001 From: fnabet Date: Fri, 7 Oct 2016 18:30:55 +0200 Subject: [PATCH 304/340] [OAI-UE] issue#136 attach fixes: - pusch/pucch power control - pucch encoding call - srb/drb add with default value --- openair1/PHY/LTE_TRANSPORT/dci.c | 1 + openair1/PHY/LTE_TRANSPORT/pucch.c | 8 ++++++++ openair1/SCHED/defs.h | 2 +- openair1/SCHED/phy_procedures_lte_ue.c | 16 +++++++++------- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 16 ++++++++++++++++ openair2/LAYER2/RLC/rlc_rrc.c | 22 ++++++++++++++++++++++ targets/RT/USER/lte-softmodem.c | 13 ++++++++++--- 7 files changed, 67 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 6facde1743..ac081f840b 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -2865,6 +2865,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, } } + LOG_D(PHY,"DCI decoding CRNTI [format_c: %d, nCCE[subframe: %d]: %d ]\n",format_c, subframe, pdcch_vars[eNB_id]->nCCE[subframe]); // memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes); diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 7787ddfcf3..2cc65e9c48 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -154,6 +154,9 @@ void generate_pucch1x(int32_t **txdataF, uint8_t Ncs1 = frame_parms->pucch_config_common.nCS_AN; uint8_t Ncs1_div_deltaPUCCH_Shift = Ncs1/deltaPUCCH_Shift; + LOG_D(PHY,"generate_pucch Start [deltaPUCCH_Shift %d, NRB2 %d, Ncs1_div_deltaPUCCH_Shift %d, n1_pucch %d]\n", deltaPUCCH_Shift, NRB2, Ncs1_div_deltaPUCCH_Shift,n1_pucch); + + uint32_t u0 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30; uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30; uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; @@ -178,6 +181,11 @@ void generate_pucch1x(int32_t **txdataF, printf("[PHY] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); #endif + LOG_D(PHY,"[PHY] PUCCH: n1_pucch %d, thres %d Ncs1_div_deltaPUCCH_Shift %d (12/deltaPUCCH_Shift) %d Nprime_div_deltaPUCCH_Shift %d \n", + n1_pucch, thres, Ncs1_div_deltaPUCCH_Shift, (int)(12/deltaPUCCH_Shift), Nprime_div_deltaPUCCH_Shift); + LOG_D(PHY,"[PHY] PUCCH: deltaPUCCH_Shift %d, Nprime %d\n",deltaPUCCH_Shift,Nprime); + + N_UL_symb = (frame_parms->Ncp==0) ? 7 : 6; if (n1_pucch < thres) diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index df8652e3dc..f9ebd3b3b0 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -433,7 +433,7 @@ UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index); @param pucch_fmt Format of PUCCH that is being transmitted @returns Transmit power */ -int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt); +int8_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt); /*! \brief This function implements the power control mechanism for PUCCH from 36.213. @param phy_vars_ue PHY variables diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index bfd53fba86..5fa9f9f2f5 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -335,7 +335,7 @@ void process_timing_advance_rar(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint16_t ti #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,proc->frame_rx, ue->timing_advance); + LOG_I(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance); #endif } @@ -747,11 +747,12 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; } - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", ue->Mod_id, frame_tx, subframe_tx, ue->prach_resources[eNB_id]->ra_PreambleIndex, + ue->tx_power_dBm[subframe_tx], ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, ue->prach_resources[eNB_id]->ra_TDD_map_index, ue->prach_resources[eNB_id]->ra_RNTI); @@ -1049,7 +1050,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB ue->tx_total_RE[subframe_tx] = nb_rb*12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(ue->tx_power_dBm, + tx_amp = get_tx_amp(ue->tx_power_dBm[subframe_tx], ue->tx_power_max_dBm, ue->frame_parms.N_RB_UL, nb_rb); @@ -1156,7 +1157,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin SR_payload); if (ue->mac_enabled == 1) { - Po_PUCCH = pucch_power_cntl(ue,proc,eNB_id,format); + Po_PUCCH = pucch_power_cntl(ue,proc,subframe_tx,eNB_id,format); } else { Po_PUCCH = ue->tx_power_max_dBm; @@ -1219,7 +1220,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC if (ue->mac_enabled == 1) { - Po_PUCCH = pucch_power_cntl(ue,proc,eNB_id,pucch_format1); + Po_PUCCH = pucch_power_cntl(ue,proc,subframe_tx,eNB_id,pucch_format1); } else { Po_PUCCH = ue->tx_power_max_dBm; @@ -1306,8 +1307,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui } if (ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b - - + ue_pucch_procedures(ue,proc,eNB_id,abstraction_flag); } // UE_mode==PUSCH @@ -1372,7 +1372,9 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui if (abstraction_flag == 0) { if (ue->generate_ul_signal[eNB_id] == 1 ) + { ulsch_common_procedures(ue,proc); + } else { // no uplink so clear signal buffer instead #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 3779adbbc9..662160e50b 100755 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -1167,6 +1167,22 @@ rrc_pdcp_config_asn1_req ( break; case SRB_ToAddMod__rlc_Config_PR_defaultValue: + pdcp_config_req_asn1 ( + ctxt_pP, + pdcp_p, + SRB_FLAG_YES, + rlc_type, + action, + lc_id, + mch_id, + srb_id, + srb_sn, + 0, // drb_report + 0, // header compression + security_modeP, + kRRCenc_pP, + kRRCint_pP, + kUPenc_pP); // already the default values break; diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index 9919cc0f70..92bb7ce982 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -202,6 +202,27 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP case SRB_ToAddMod__rlc_Config_PR_defaultValue: //#warning TO DO SRB_ToAddMod__rlc_Config_PR_defaultValue + LOG_I(RRC, "RLC SRB1 is default value !!\n"); + struct RLC_Config__am * config_am_pP = &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.am; + config_am_pP->dl_AM_RLC.t_Reordering = T_Reordering_ms35; + config_am_pP->dl_AM_RLC.t_StatusProhibit = T_StatusProhibit_ms0; + config_am_pP->ul_AM_RLC.t_PollRetransmit = T_PollRetransmit_ms45; + config_am_pP->ul_AM_RLC.pollPDU = PollPDU_pInfinity; + config_am_pP->ul_AM_RLC.pollByte = PollByte_kBinfinity; + config_am_pP->ul_AM_RLC.maxRetxThreshold = UL_AM_RLC__maxRetxThreshold_t4; + + if (rrc_rlc_add_rlc (ctxt_pP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_AM) != NULL) { + config_req_rlc_am_asn1 ( + ctxt_pP, + SRB_FLAG_YES, + &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.am, + rb_id); + } else { + LOG_E(RLC, PROTOCOL_CTXT_FMT" ERROR IN ALLOCATING SRB %d \n", + PROTOCOL_CTXT_ARGS(ctxt_pP), + rb_id); + } +/* if (rrc_rlc_add_rlc (ctxt_pP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_UM) != NULL) { config_req_rlc_um_asn1( ctxt_pP, @@ -217,6 +238,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP PROTOCOL_CTXT_ARGS(ctxt_pP), rb_id); } + */ break; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 96645f886a..6a42ababdf 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -200,7 +200,7 @@ double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0},{20,0,0,0}}; double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,0,0}}; #endif - +double rx_gain_off = 0.0; double sample_rate=30.72e6; double bw = 10.0e6; @@ -380,6 +380,7 @@ void help (void) { printf(" --calib-prach-tx run normal prach with maximum power, but don't continue random-access\n"); printf(" --no-L2-connect bypass L2 and upper layers\n"); printf(" --ue-rxgain set UE RX gain\n"); + printf(" --ue-rxgain-off external UE amplifier offset\n"); printf(" --ue-txgain set UE TX gain\n"); printf(" --ue-scan_carrier set UE to scan around carrier\n"); printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); @@ -684,6 +685,7 @@ static void get_options (int argc, char **argv) LONG_OPTION_NO_L2_CONNECT, LONG_OPTION_CALIB_PRACH_TX, LONG_OPTION_RXGAIN, + LONG_OPTION_RXGAINOFF, LONG_OPTION_TXGAIN, LONG_OPTION_SCANCARRIER, LONG_OPTION_MAXPOWER, @@ -709,6 +711,7 @@ static void get_options (int argc, char **argv) {"no-L2-connect", no_argument, NULL, LONG_OPTION_NO_L2_CONNECT}, {"calib-prach-tx", no_argument, NULL, LONG_OPTION_CALIB_PRACH_TX}, {"ue-rxgain", required_argument, NULL, LONG_OPTION_RXGAIN}, + {"ue-rxgain-off", required_argument, NULL, LONG_OPTION_RXGAINOFF}, {"ue-txgain", required_argument, NULL, LONG_OPTION_TXGAIN}, {"ue-scan-carrier", no_argument, NULL, LONG_OPTION_SCANCARRIER}, {"ue-max-power", required_argument, NULL, LONG_OPTION_MAXPOWER}, @@ -785,6 +788,10 @@ static void get_options (int argc, char **argv) break; + case LONG_OPTION_RXGAINOFF: + rx_gain_off = atof(optarg); + break; + case LONG_OPTION_TXGAIN: for (i=0; i<4; i++) tx_gain[0][i] = atof(optarg); @@ -1352,7 +1359,7 @@ void init_openair0() { openair0_cfg[card].rx_gain[i] = PHY_vars_eNB_g[0][0]->rx_total_gain_dB; } else { - openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB; + openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB - rx_gain_off; } @@ -1586,7 +1593,7 @@ int main( int argc, char **argv ) else UE[CC_id]->pdcch_vars[0]->crnti = 0x1235; - UE[CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0]; + UE[CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0] + rx_gain_off; UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id]; UE[CC_id]->N_TA_offset = 0; From 263ad2aff81dee99e256d2eac238339c32bd1272 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 7 Oct 2016 06:49:20 -0700 Subject: [PATCH 305/340] bugfix in dlsim/ulsim for channel model --- openair1/SIMULATION/LTE_PHY/dlsim.c | 16 ++++++++-------- openair1/SIMULATION/LTE_PHY/ulsim.c | 7 ++++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 4fd04dcbd4..9ce1de2770 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -130,7 +130,7 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_ } void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,double SNR, int tx_lev,int hold_channel,int abstx, int num_rounds, int trials, int round, channel_desc_t *eNB2UE[4], - double s_re[2][30720*2],double s_im[2][30720*2],double r_re[2][30720*2],double r_im[2][30720*2],FILE *csv_fd) { + double *s_re[2],double *s_im[2],double *r_re[2],double *r_im[2],FILE *csv_fd) { int i,u; int aa,aarx,aatx; @@ -1267,7 +1267,12 @@ int main(int argc, char **argv) double snr_step=1,input_snr_step=1, snr_int=30; LTE_DL_FRAME_PARMS *frame_parms; - double s_re[2][30720*2],s_im[2][30720*2],r_re[2][30720*2],r_im[2][30720*2]; + double s_re0[30720*2],s_im0[30720*2],r_re0[30720*2],r_im0[30720*2]; + double s_re1[30720*2],s_im1[30720*2],r_re1[30720*2],r_im1[30720*2]; + double *s_re[2]={s_re0,s_re1}; + double *s_im[2]={s_im0,s_im1}; + double *r_re[2]={r_re0,r_re1}; + double *r_im[2]={r_im0,r_im1}; double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel @@ -1380,7 +1385,6 @@ int main(int argc, char **argv) FILE *csv_fd=NULL; char csv_fname[32]; int dci_flag=1; - int llr8_flag=1; int two_thread_flag=0; int DLSCH_RB_ALLOC; @@ -1413,7 +1417,7 @@ int main(int argc, char **argv) // num_layers = 1; perfect_ce = 0; - while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:WXY")) != -1) { + while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:Pl:WXY")) != -1) { switch (c) { case 'a': awgn_flag = 1; @@ -1477,10 +1481,6 @@ int main(int argc, char **argv) input_trch_file=1; break; - case 'L': - llr8_flag=1; - break; - case 'W': two_thread_flag = 1; break; diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 744e7b483d..47b6390bfa 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -188,7 +188,12 @@ int main(int argc, char **argv) int **txdata; LTE_DL_FRAME_PARMS *frame_parms; - double s_re[2][30720],s_im[2][30720],r_re[2][30720],r_im[2][30720]; + double s_re0[30720],s_im0[30720],r_re0[30720],r_im0[30720]; + double s_re1[30720],s_im1[30720],r_re1[30720],r_im1[30720]; + double *s_re[2]={s_re0,s_re1}; + double *s_im[2]={s_im0,s_im1}; + double *r_re[2]={r_re0,r_re1}; + double *r_im[2]={r_im0,r_im1}; double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel double iqim=0.0; uint8_t extended_prefix_flag=0; From e958d7be870234a367655842f273c7012c884a0c Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 7 Oct 2016 10:31:17 -0700 Subject: [PATCH 306/340] update for mbmssim for new data structures --- openair1/SIMULATION/LTE_PHY/mbmssim.c | 226 +++++++++++--------------- 1 file changed, 96 insertions(+), 130 deletions(-) diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 539a292874..858886e256 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -51,15 +51,16 @@ #include "OCG_vars.h" +#include "unitary_defs.h" -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2]; #define UL_RB_ALLOC 0x1ff; -#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->frame_parms.N_RB_UL,0,2) +#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) int main(int argc, char **argv) { @@ -70,10 +71,11 @@ int main(int argc, char **argv) uint8_t snr1set=0; double snr_step=1,input_snr_step=1; int **txdata; - double **s_re,**s_im,**r_re,**r_im; + double s_re0[2*30720],s_im0[2*30720],s_re1[2*30720],s_im1[2*30720]; + double r_re0[2*30720],r_im0[2*30720],r_re1[2*30720],r_im1[2*30720]; + double *s_re[2]={s_re0,s_re1},*s_im[2]={s_im0,s_im1},*r_re[2]={r_re0,r_re1},*r_im[2]={r_im0,r_im1}; double iqim = 0.0; int subframe=1; - int sched_subframe; char fname[40];//, vname[40]; uint8_t transmission_mode = 1,n_tx=1,n_rx=2; uint16_t Nid_cell=0; @@ -125,17 +127,7 @@ int main(int argc, char **argv) logInit(); number_of_cards = 1; - //openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ while ((c = getopt (argc, argv, "ahA:Cp:n:s:S:t:x:y:z:N:F:R:O:dm:i:Y")) != -1) { switch (c) { case 'a': @@ -235,7 +227,6 @@ int main(int argc, char **argv) } - sched_subframe = (subframe+9)%10; if (awgn_flag == 1) channel_model = AWGN; @@ -253,9 +244,17 @@ int main(int argc, char **argv) if (transmission_mode==2) n_tx=2; - lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,tdd_config,N_RB_DL,0,osf,perfect_ce); - - + lte_param_init(n_tx, + n_rx, + transmission_mode, + extended_prefix_flag, + frame_type, + Nid_cell, + tdd_config, + N_RB_DL, + 0, + osf, + perfect_ce); if (snr1set==0) { if (n_frames==1) @@ -266,7 +265,7 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->frame_parms; + frame_parms = &eNB->frame_parms; if (awgn_flag == 0) sprintf(fname,"embms_%d_%d.m",mcs,N_RB_DL); @@ -292,72 +291,56 @@ int main(int argc, char **argv) fflush(fd); - txdata = PHY_vars_eNB->common_vars.txdata[0]; + txdata = eNB->common_vars.txdata[0]; - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); nsymb = 12; printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, AWGN %d\n",NUMBER_OF_OFDM_CARRIERS, frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,awgn_flag); - for (i=0; i<2; i++) { - - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - } - - eNB2UE = new_channel_desc_scm(PHY_vars_eNB->frame_parms.nb_antennas_tx, - PHY_vars_UE->frame_parms.nb_antennas_rx, + eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, 0); // Create transport channel structures for 2 transport blocks (MIMO) - PHY_vars_eNB->dlsch_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0); + eNB->dlsch_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0); - if (!PHY_vars_eNB->dlsch_MCH) { + if (!eNB->dlsch_MCH) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - PHY_vars_UE->dlsch_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); + UE->dlsch_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); - PHY_vars_eNB->frame_parms.num_MBSFN_config = 1; - PHY_vars_eNB->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; - PHY_vars_eNB->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; - PHY_vars_eNB->frame_parms.MBSFN_config[0].fourFrames_flag = 0; - PHY_vars_eNB->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes - PHY_vars_UE->frame_parms.num_MBSFN_config = 1; - PHY_vars_UE->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; - PHY_vars_UE->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; - PHY_vars_UE->frame_parms.MBSFN_config[0].fourFrames_flag = 0; - PHY_vars_UE->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes + eNB->frame_parms.num_MBSFN_config = 1; + eNB->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; + eNB->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; + eNB->frame_parms.MBSFN_config[0].fourFrames_flag = 0; + eNB->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes + UE->frame_parms.num_MBSFN_config = 1; + UE->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; + UE->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; + UE->frame_parms.MBSFN_config[0].fourFrames_flag = 0; + UE->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes - fill_eNB_dlsch_MCH(PHY_vars_eNB,mcs,1,0,0); - fill_UE_dlsch_MCH(PHY_vars_UE,mcs,1,0,0); + fill_eNB_dlsch_MCH(eNB,mcs,1,0); + fill_UE_dlsch_MCH(UE,mcs,1,0,0); - if (is_pmch_subframe(0,subframe,&PHY_vars_eNB->frame_parms)==0) { + if (is_pmch_subframe(0,subframe,&eNB->frame_parms)==0) { printf("eNB is not configured for MBSFN in subframe %d\n",subframe); exit(-1); - } else if (is_pmch_subframe(0,subframe,&PHY_vars_UE->frame_parms)==0) { + } else if (is_pmch_subframe(0,subframe,&UE->frame_parms)==0) { printf("UE is not configured for MBSFN in subframe %d\n",subframe); exit(-1); } - input_buffer_length = PHY_vars_eNB->dlsch_MCH->harq_processes[0]->TBS/8; + input_buffer_length = eNB->dlsch_MCH->harq_processes[0]->TBS/8; input_buffer = (unsigned char *)malloc(input_buffer_length+4); memset(input_buffer,0,input_buffer_length+4); @@ -369,9 +352,9 @@ int main(int argc, char **argv) snr_step = input_snr_step; for (SNR=snr0; SNRframe_tx=0; - PHY_vars_eNB->proc[sched_subframe].frame_tx=0; - PHY_vars_eNB->proc[sched_subframe].subframe_tx=subframe; + UE->proc.proc_rxtx[0].frame_tx=0; + eNB->proc.proc_rxtx[0].frame_tx=0; + eNB->proc.proc_rxtx[0].subframe_tx=subframe; errs[0]=0; errs[1]=0; @@ -392,12 +375,11 @@ int main(int argc, char **argv) //if (trials%100==0) //eNB2UE[0]->first_run = 1; eNB2UE->first_run = 1; - memset(&PHY_vars_eNB->common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); - - generate_mch(PHY_vars_eNB,sched_subframe,input_buffer,0); + memset(&eNB->common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + generate_mch(eNB,&eNB->proc.proc_rxtx[0],input_buffer); - PHY_ofdm_mod(PHY_vars_eNB->common_vars.txdataF[0][0], // input, + PHY_ofdm_mod(eNB->common_vars.txdataF[0][0], // input, txdata[0], // output frame_parms->ofdm_symbol_size, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols @@ -405,33 +387,34 @@ int main(int argc, char **argv) CYCLIC_PREFIX); if (n_frames==1) { - write_output("txsigF0.m","txsF0", &PHY_vars_eNB->common_vars.txdataF[0][0][subframe*nsymb*PHY_vars_eNB->frame_parms.ofdm_symbol_size], - nsymb*PHY_vars_eNB->frame_parms.ofdm_symbol_size,1,1); - //if (PHY_vars_eNB->frame_parms.nb_antennas_tx>1) - //write_output("txsigF1.m","txsF1", &PHY_vars_eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->frame_parms.ofdm_symbol_size],nsymb*PHY_vars_eNB->frame_parms.ofdm_symbol_size,1,1); + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[0][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + //if (eNB->frame_parms.nb_antennas_tx>1) + //write_output("txsigF1.m","txsF1", &eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); } tx_lev = 0; - for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { - tx_lev += signal_energy(&PHY_vars_eNB->common_vars.txdata[eNB_id][aa] - [subframe*PHY_vars_eNB->frame_parms.samples_per_tti], - PHY_vars_eNB->frame_parms.samples_per_tti); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa] + [subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.samples_per_tti); } tx_lev_dB = (unsigned int) dB_fixed(tx_lev); if (n_frames==1) { printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); - // write_output("txsig0.m","txs0", &PHY_vars_eNB->common_vars.txdata[0][0][subframe* PHY_vars_eNB->frame_parms.samples_per_tti], + // write_output("txsig0.m","txs0", &eNB->common_vars.txdata[0][0][subframe* eNB->frame_parms.samples_per_tti], - // PHY_vars_eNB->frame_parms.samples_per_tti,1,1); + // eNB->frame_parms.samples_per_tti,1,1); } + for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { - s_re[aa][i] = ((double)(((short *)PHY_vars_eNB->common_vars.txdata[0][aa]))[(2*subframe*PHY_vars_UE->frame_parms.samples_per_tti) + (i<<1)]); - s_im[aa][i] = ((double)(((short *)PHY_vars_eNB->common_vars.txdata[0][aa]))[(2*subframe*PHY_vars_UE->frame_parms.samples_per_tti) +(i<<1)+1]); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); } } @@ -440,39 +423,38 @@ int main(int argc, char **argv) 2*frame_parms->samples_per_tti,hold_channel); //AWGN - sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->frame_parms.ofdm_symbol_size/(NB_RB*12)) - SNR; + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(NB_RB*12)) - SNR; sigma2 = pow(10,sigma2_dB/10); if (n_frames==1) printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB); for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->frame_parms.samples_per_tti)+2*i] = + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] = (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->frame_parms.samples_per_tti)+2*i+1] = + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] = (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); } } for (l=2; l<12; l++) { - slot_fep_mbsfn(PHY_vars_UE, + slot_fep_mbsfn(UE, l, subframe%10, 0, 0); - - if (PHY_vars_UE->perfect_ce==1) { + if (UE->perfect_ce==1) { // fill in perfect channel estimates - freq_channel(eNB2UE,PHY_vars_UE->frame_parms.N_RB_DL,12*PHY_vars_UE->frame_parms.N_RB_DL + 1); + freq_channel(eNB2UE,UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); for(k=0; knb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); + ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); + ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } } } @@ -481,52 +463,52 @@ int main(int argc, char **argv) if (l==6) for (l2=2;l2<7;l2++) - rx_pmch(PHY_vars_UE, + rx_pmch(UE, 0, subframe%10, l2); if (l==6) for (l2=2;l2<7;l2++) - rx_pmch(PHY_vars_UE, + rx_pmch(UE, 0, subframe%10, l2); if (l==11) for (l2=7;l2<12;l2++) - rx_pmch(PHY_vars_UE, + rx_pmch(UE, 0, subframe%10, l2); } - PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->G = get_G(&PHY_vars_UE->frame_parms, - PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->nb_rb, - PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, - get_Qm(PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->mcs), + UE->dlsch_MCH[0]->harq_processes[0]->G = get_G(&UE->frame_parms, + UE->dlsch_MCH[0]->harq_processes[0]->nb_rb, + UE->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, + get_Qm(UE->dlsch_MCH[0]->harq_processes[0]->mcs), 1,2, - PHY_vars_UE->frame_tx,subframe); - PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->Qm = get_Qm(PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->mcs); + UE->proc.proc_rxtx[0].frame_tx,subframe); + UE->dlsch_MCH[0]->harq_processes[0]->Qm = get_Qm(UE->dlsch_MCH[0]->harq_processes[0]->mcs); - dlsch_unscrambling(&PHY_vars_UE->frame_parms,1,PHY_vars_UE->dlsch_MCH[0], - PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->G, - PHY_vars_UE->lte_ue_pdsch_vars_MCH[0]->llr[0],0,subframe<<1); + dlsch_unscrambling(&UE->frame_parms,1,UE->dlsch_MCH[0], + UE->dlsch_MCH[0]->harq_processes[0]->G, + UE->pdsch_vars_MCH[0]->llr[0],0,subframe<<1); - ret = dlsch_decoding(PHY_vars_UE, - PHY_vars_UE->lte_ue_pdsch_vars_MCH[0]->llr[0], - &PHY_vars_UE->frame_parms, - PHY_vars_UE->dlsch_MCH[0], - PHY_vars_UE->dlsch_MCH[0]->harq_processes[0], + ret = dlsch_decoding(UE, + UE->pdsch_vars_MCH[0]->llr[0], + &UE->frame_parms, + UE->dlsch_MCH[0], + UE->dlsch_MCH[0]->harq_processes[0], subframe, 0,0,0); if (n_frames==1) printf("MCH decoding returns %d\n",ret); - if (ret == (1+PHY_vars_UE->dlsch_MCH[0]->max_turbo_iterations)) + if (ret == (1+UE->dlsch_MCH[0]->max_turbo_iterations)) errs[0]++; - PHY_vars_UE->frame_tx++; - PHY_vars_eNB->proc[sched_subframe].frame_tx++; + UE->proc.proc_rxtx[0].frame_tx++; + eNB->proc.proc_rxtx[0].frame_tx++; } printf("errors %d/%d (Pe %e)\n",errs[round],trials,(double)errs[round]/trials); @@ -550,34 +532,18 @@ int main(int argc, char **argv) if (n_frames==1) { - printf("Dumping PMCH files ( G %d)\n",PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->G); - dump_mch(PHY_vars_UE,0, - PHY_vars_UE->dlsch_MCH[0]->harq_processes[0]->G, + printf("Dumping PMCH files ( G %d)\n",UE->dlsch_MCH[0]->harq_processes[0]->G); + dump_mch(UE,0, + UE->dlsch_MCH[0]->harq_processes[0]->G, subframe); } printf("Freeing dlsch structures\n"); - free_eNB_dlsch(PHY_vars_eNB->dlsch_MCH); - free_ue_dlsch(PHY_vars_UE->dlsch_MCH[0]); + free_eNB_dlsch(eNB->dlsch_MCH); + free_ue_dlsch(UE->dlsch_MCH[0]); fclose(fd); - printf("Freeing channel I/O\n"); - - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - - // lte_sync_time_free(); - return(0); } From 26f454aa9a002ba8644931b0e1aad7c2811cf8a9 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 7 Oct 2016 10:49:58 -0700 Subject: [PATCH 307/340] bugfix in slot_fep_mbsfn.c --- openair1/PHY/MODULATION/slot_fep_mbsfn.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index f2d2421496..88a478a087 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -38,7 +38,7 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue, int sample_offset, int no_prefix) { - + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; LTE_UE_COMMON *common_vars = &ue->common_vars; uint8_t eNB_id = 0;//ue_common_vars->eNb_id; @@ -115,10 +115,8 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue, sample_offset); #endif - for (aa=0; aanb_antennas_rx; aa++) { - memset(&common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*l],0,2*frame_parms->ofdm_symbol_size*sizeof(int)); - + memset(&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],0,frame_parms->ofdm_symbol_size*sizeof(int)); if (l==0) { start_meas(&ue->rx_dft_stats); dft((int16_t *)&common_vars->rxdata[aa][(sample_offset + @@ -146,9 +144,10 @@ int slot_fep_mbsfn(PHY_VARS_UE *ue, (int16_t *)&common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); stop_meas(&ue->rx_dft_stats); } - } + + //if ((l==0) || (l==(4-frame_parms->Ncp))) { // changed to invoke MBSFN channel estimation in symbols 2,6,10 if ((l==2)||(l==6)||(l==10)) { From 0dc55ec8c89eed618f7e2a8d0697630061a4704f Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 7 Oct 2016 23:13:09 -0700 Subject: [PATCH 308/340] small bugfix for compute_beta8 in turbo-decoder. --- openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index 9d9ba961c2..d2c7ac6966 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -517,9 +517,11 @@ void compute_beta8(llr_t* alpha,llr_t* beta,llr_t *m_11,llr_t* m_10,unsigned sho beta_ptr[6] = alpha128[6+(frame_length>>1)]; beta_ptr[7] = alpha128[7+(frame_length>>1)]; + int overlap = (frame_length>>4)> L ? (frame_length>>4)-L : 0 ; + for (rerun_flag=0, loopval=0; rerun_flag<2 ; - loopval=(frame_length>>4)-L,rerun_flag++) { + loopval=overlap,rerun_flag++) { if (offset8_flag==0) { // FIXME! beta0-beta7 are used uninitialized. FIXME! From 81ae8fb2ff752f3f3c63fc05d660bb7b39810afd Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Fri, 7 Oct 2016 23:41:51 -0700 Subject: [PATCH 309/340] cleaned up formatting of CCE table trace in eNB_scheduler_primitives.c --- openair2/LAYER2/MAC/eNB_scheduler_primitives.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 605ff93f1f..6198768b51 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -1010,10 +1010,11 @@ void dump_CCE_table(int *CCE_table,const int nCCE,const unsigned short rnti,cons int nb_candidates = 0,i; unsigned int Yk; + printf("CCE 0: "); for (i=0;i Date: Sat, 8 Oct 2016 10:40:36 -0700 Subject: [PATCH 310/340] added rcc gtkw files. --- targets/RT/USER/rcc_if4.gtkw | 161 +++++++++++++++++++++++++++++++++++ targets/RT/USER/rcc_if5.gtkw | 154 +++++++++++++++++++++++++++++++++ 2 files changed, 315 insertions(+) create mode 100644 targets/RT/USER/rcc_if4.gtkw create mode 100644 targets/RT/USER/rcc_if5.gtkw diff --git a/targets/RT/USER/rcc_if4.gtkw b/targets/RT/USER/rcc_if4.gtkw new file mode 100644 index 0000000000..e099e466c1 --- /dev/null +++ b/targets/RT/USER/rcc_if4.gtkw @@ -0,0 +1,161 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sat Aug 6 15:00:27 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sat Aug 6 14:59:21 2016" +[dumpfile_size] 991809002 +[savefile] "/home/fourmi/openairinterface5g/targets/RT/USER/rcc_if4.gtkw" +[timestart] 0 +[size] 1301 716 +[pos] 309 0 +*-19.793451 7382528436 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.recv_if4 +functions.send_if4 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.phy_procedures_eNb_tx0 +functions.phy_procedures_eNb_rx_common0 +functions.phy_procedures_eNb_rx_uespec0 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@29 +functions.phy_procedures_eNb_tx1 +@28 +functions.phy_procedures_eNb_rx_common1 +functions.phy_procedures_eNb_rx_uespec1 +functions.phy_enb_sfgen +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +@24 +variables.dci_info[63:0] +variables.ue0_BO[63:0] +@420 +variables.ue0_BSR[63:0] +variables.ue0_timing_advance[63:0] +@28 +functions.macxface_initiate_ra_proc +functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 +functions.macxface_SR_indication +@420 +variables.ue0_SR_ENERGY[63:0] +variables.ue0_SR_THRES[63:0] +@28 +functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] +@420 +variables.ue0_rssi0[63:0] +variables.ue0_MCS0[63:0] +variables.ue0_RB0[63:0] +@24 +variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] +@28 +functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] +@420 +variables.ue0_rssi1[63:0] +variables.ue0_MCS1[63:0] +variables.ue0_RB1[63:0] +@24 +variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] +@28 +functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] +@420 +variables.ue0_rssi2[63:0] +variables.ue0_MCS2[63:0] +variables.ue0_RB2[63:0] +@24 +variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] +@28 +functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] +@420 +variables.ue0_rssi3[63:0] +variables.ue0_MCS3[63:0] +variables.ue0_RB3[63:0] +@24 +variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] +@28 +functions.phy_enb_ulsch_decoding4 +@420 +variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 +variables.ue0_MCS4[63:0] +variables.ue0_RB4[63:0] +@24 +variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] +@28 +functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] +@420 +variables.ue0_rssi5[63:0] +variables.ue0_MCS5[63:0] +variables.ue0_RB5[63:0] +@24 +variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] +@28 +functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] +@420 +variables.ue0_rssi6[63:0] +variables.ue0_MCS6[63:0] +variables.ue0_RB6[63:0] +@24 +variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] +@28 +functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] +@420 +variables.ue0_rssi7[63:0] +variables.ue0_MCS7[63:0] +variables.ue0_RB7[63:0] +@24 +variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] +@28 +functions.phy_enb_prach_rx +functions.phy_eNB_dlsch_encoding +functions.phy_eNB_dlsch_modulation +functions.phy_eNB_dlsch_scrambling +functions.phy_enb_pdcch_tx +functions.phy_enb_rs_tx +functions.rrc_mac_config_req +functions.rlc_data_req +functions.udp_enb_task +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rcc_if5.gtkw b/targets/RT/USER/rcc_if5.gtkw new file mode 100644 index 0000000000..d64a9ca0fb --- /dev/null +++ b/targets/RT/USER/rcc_if5.gtkw @@ -0,0 +1,154 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sun Jul 31 13:30:42 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sun Jul 31 13:21:59 2016" +[dumpfile_size] 18273240 +[savefile] "/home/fourmi/openairinterface5g/targets/RT/USER/rcc_if5.gtkw" +[timestart] 24070893000 +[size] 1301 716 +[pos] 309 0 +*-19.793451 29026062100 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.send_if5 +functions.recv_if5 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@28 +functions.phy_enb_sfgen +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +@24 +variables.dci_info[63:0] +variables.ue0_BO[63:0] +@420 +variables.ue0_BSR[63:0] +variables.ue0_timing_advance[63:0] +@28 +functions.macxface_initiate_ra_proc +functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 +functions.macxface_SR_indication +@420 +variables.ue0_SR_ENERGY[63:0] +variables.ue0_SR_THRES[63:0] +@28 +functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] +@420 +variables.ue0_rssi0[63:0] +variables.ue0_MCS0[63:0] +variables.ue0_RB0[63:0] +@24 +variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] +@28 +functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] +@420 +variables.ue0_rssi1[63:0] +variables.ue0_MCS1[63:0] +variables.ue0_RB1[63:0] +@24 +variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] +@28 +functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] +@420 +variables.ue0_rssi2[63:0] +variables.ue0_MCS2[63:0] +variables.ue0_RB2[63:0] +@24 +variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] +@28 +functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] +@420 +variables.ue0_rssi3[63:0] +variables.ue0_MCS3[63:0] +variables.ue0_RB3[63:0] +@24 +variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] +@28 +functions.phy_enb_ulsch_decoding4 +@420 +variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 +variables.ue0_MCS4[63:0] +variables.ue0_RB4[63:0] +@24 +variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] +@28 +functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] +@420 +variables.ue0_rssi5[63:0] +variables.ue0_MCS5[63:0] +variables.ue0_RB5[63:0] +@24 +variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] +@28 +functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] +@420 +variables.ue0_rssi6[63:0] +variables.ue0_MCS6[63:0] +variables.ue0_RB6[63:0] +@24 +variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] +@28 +functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] +@420 +variables.ue0_rssi7[63:0] +variables.ue0_MCS7[63:0] +variables.ue0_RB7[63:0] +@24 +variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] +@28 +functions.phy_enb_prach_rx +functions.phy_eNB_dlsch_encoding +functions.phy_eNB_dlsch_modulation +functions.phy_eNB_dlsch_scrambling +functions.phy_enb_pdcch_tx +functions.phy_enb_rs_tx +functions.rrc_mac_config_req +functions.rlc_data_req +functions.udp_enb_task +[pattern_trace] 1 +[pattern_trace] 0 From b64f3419628df4b9f76c62aa8d127efb7d3e0d8a Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 9 Oct 2016 00:45:03 -0700 Subject: [PATCH 311/340] correction of scrambling sequence initialization in phich.c (generate_phich) --- openair1/PHY/LTE_TRANSPORT/phich.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index b3b4545350..ac37af2b56 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -435,9 +435,10 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, if (HI>0) HI=1; + // c = (1-(2*HI))*SSS_AMP; // x1 is set in lte_gold_generic - x2 = (((subframe+1)*(frame_parms->Nid_cell+1))<<9) + frame_parms->Nid_cell; + x2 = (((subframe+1)*((frame_parms->Nid_cell<<1)+1))<<9) + frame_parms->Nid_cell; s = lte_gold_generic(&x1, &x2, reset); From a67f12e7cc0c9785c306f8f01c43ce27b6041a46 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Sun, 9 Oct 2016 00:47:12 -0700 Subject: [PATCH 312/340] correction of scrambling sequence initialization in phich.c (rx_phich) --- openair1/PHY/LTE_TRANSPORT/phich.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index ac37af2b56..e53ef31ec9 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1120,7 +1120,7 @@ void rx_phich(PHY_VARS_UE *ue, phich_d_ptr = phich_d; // x1 is set in lte_gold_generic - x2 = (((subframe+1)*(frame_parms->Nid_cell+1))<<9) + frame_parms->Nid_cell; + x2 = (((subframe+1)*((frame_parms->Nid_cell<<1)+1))<<9) + frame_parms->Nid_cell; s = lte_gold_generic(&x1, &x2, reset); From 6277038d7f080fd5be9d2b4c5de2c32f4d46a45b Mon Sep 17 00:00:00 2001 From: Navid Nikaein Date: Mon, 10 Oct 2016 13:32:16 +0200 Subject: [PATCH 313/340] remove the OMG SUMO related files and update te top-level OMG and cmakefiles --- cmake_targets/CMakeLists.txt | 15 +- openair2/UTIL/OMG/SUMO/README.TXT | 48 - .../UTIL/OMG/SUMO/SCENARIOS/scen.sumo.cfg | 7 - .../UTIL/OMG/SUMO/SCENARIOS/sumo_commands.txt | 5 - .../OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg | 17 - .../OMG/SUMO/SCENARIOS/traci_ex_Map.net.xml | 2531 ----------------- .../OMG/SUMO/SCENARIOS/traci_ex_ROU.rou.xml | 333 --- openair2/UTIL/OMG/TraCIConstants.h | 52 - openair2/UTIL/OMG/client_traci_OMG.c | 446 --- openair2/UTIL/OMG/client_traci_OMG.h | 133 - openair2/UTIL/OMG/id_manager.c | 228 -- openair2/UTIL/OMG/id_manager.h | 144 - openair2/UTIL/OMG/omg.c | 22 +- openair2/UTIL/OMG/socket_traci_OMG.c | 203 -- openair2/UTIL/OMG/socket_traci_OMG.h | 85 - openair2/UTIL/OMG/storage_traci_OMG.c | 519 ---- openair2/UTIL/OMG/storage_traci_OMG.h | 111 - openair2/UTIL/OMG/sumo.c | 495 ---- openair2/UTIL/OMG/sumo.h | 123 - 19 files changed, 21 insertions(+), 5496 deletions(-) delete mode 100644 openair2/UTIL/OMG/SUMO/README.TXT delete mode 100644 openair2/UTIL/OMG/SUMO/SCENARIOS/scen.sumo.cfg delete mode 100644 openair2/UTIL/OMG/SUMO/SCENARIOS/sumo_commands.txt delete mode 100644 openair2/UTIL/OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg delete mode 100644 openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_Map.net.xml delete mode 100644 openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_ROU.rou.xml delete mode 100644 openair2/UTIL/OMG/TraCIConstants.h delete mode 100644 openair2/UTIL/OMG/client_traci_OMG.c delete mode 100644 openair2/UTIL/OMG/client_traci_OMG.h delete mode 100644 openair2/UTIL/OMG/id_manager.c delete mode 100644 openair2/UTIL/OMG/id_manager.h delete mode 100644 openair2/UTIL/OMG/socket_traci_OMG.c delete mode 100644 openair2/UTIL/OMG/socket_traci_OMG.h delete mode 100644 openair2/UTIL/OMG/storage_traci_OMG.c delete mode 100644 openair2/UTIL/OMG/storage_traci_OMG.h delete mode 100644 openair2/UTIL/OMG/sumo.c delete mode 100644 openair2/UTIL/OMG/sumo.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 9223a1786d..99c555dcf0 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -870,21 +870,16 @@ set(UTIL_SRC ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c - ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c ${OPENAIR2_DIR}/UTIL/OMG/common.c ${OPENAIR2_DIR}/UTIL/OMG/grid.c - ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c ${OPENAIR2_DIR}/UTIL/OMG/job.c ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c ${OPENAIR2_DIR}/UTIL/OMG/omg.c ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c ${OPENAIR2_DIR}/UTIL/OMG/rwp.c - ${OPENAIR2_DIR}/UTIL/OMG/sumo.c - ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c ${OPENAIR2_DIR}/UTIL/OMG/static.c ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c - ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c ${OPENAIR2_DIR}/UTIL/OMG/trace.c ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c ${OPENAIR2_DIR}/UTIL/OPT/probe.c @@ -897,6 +892,15 @@ set(UTIL_SRC ) add_library(UTIL ${UTIL_SRC}) +#set(OMG_SUMO_SRC +# ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c +# ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c +# ${OPENAIR2_DIR}/UTIL/OMG/sumo.c +# ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c +# ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c +# ) +#add_library(OMG_SUMO ${OMG_SUMO_SRC}) + set(SECU_OSA_SRC ${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c @@ -1752,7 +1756,6 @@ add_executable(oaisim ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR2_DIR}/UTIL/OMG/sumo.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c ${GTPU_need_ITTI} ${OPENAIR_TARGETS}/COMMON/create_tasks.c diff --git a/openair2/UTIL/OMG/SUMO/README.TXT b/openair2/UTIL/OMG/SUMO/README.TXT deleted file mode 100644 index 822799bd5f..0000000000 --- a/openair2/UTIL/OMG/SUMO/README.TXT +++ /dev/null @@ -1,48 +0,0 @@ ----------------------------------------------------------------------------------- -OpenAir Mobility Generator (OMG) - Mobility provided by the SUMO simulator ----------------------------------------------------------------------------------- - -Notes: - - - The Simulation of Urban Mobility (SUMO) needs to be downloaded, configured and compiled. Please download the sources from this address - - http://sumo.sourceforge.net/ - - or alternatively chechout from the following SUMO svn - - svn co https://sumo.svn.sourceforge.net/svnroot/sumo/trunk/sumo sumo - - (among the other required packages for SUMO, you also need the following tools for SUMO compilation. Please use the following command to install: - sudo apt-get install build-essential autoconf buildtool) - - and follow the installation instructions at http://sumo.sourceforge.net/doc/current/docs/userdoc/Installing.html - - - OMG will look for the SUMO and SUMO-GUI exectuable from this SUMO folder. - - - SUMO/SCENARIOS is the default folder for SUMO scenarios. Please add all required scenario on that folder. - - - OMG will launch SUMO with one single SUMO config file. Please regoup all your SUMO XML files (network, route et others) in one .cfg file. More details on the SUMO website. - - - SUMO will be lauched using the following command - - sumo -c scen.sumo.cfg -b 0 -e 1000 -v - - or, if you want to enable TraCI server (here as example listening on port 8883). Please bear in mind that this launch will be blocking upon a TraCI client - - sumo -c scen.sumo.cfg -b 0 -e 1000 -remote-port 8883 -v - - or, if you prefer the SUMO GUI and select manually the scenario file on the GUI window - - sumo-gui - - - - Once installation completed, please check that SUMO is working properly by following the STANDALONE scenario - - GUI: lauch: sumo-gui - load: scen.sumo.cfg - - - CommandLine: sumo -c scen.sumo.cfg -b 0 -e 1000 -v - ----------------------------------------------------------------------------------- -The OpenAirInterface Team -openair_tech@eurecom.fr ----------------------------------------------------------------------------------- diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/scen.sumo.cfg b/openair2/UTIL/OMG/SUMO/SCENARIOS/scen.sumo.cfg deleted file mode 100644 index bff19e767d..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/scen.sumo.cfg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/sumo_commands.txt b/openair2/UTIL/OMG/SUMO/SCENARIOS/sumo_commands.txt deleted file mode 100644 index b49f8095b5..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/sumo_commands.txt +++ /dev/null @@ -1,5 +0,0 @@ - -Sumo version used 0.12.3: -to start sumo with the existing route and network files below command was used. - -sumo -n traci_ex_Map.net.xml -r traci_ex_ROU.rou.xml -b 0 -e 1000 --remote-port 8883 -v \ No newline at end of file diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg b/openair2/UTIL/OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg deleted file mode 100644 index a1b39f1667..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - 0 - 200 - - - - 8890 - - - diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_Map.net.xml b/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_Map.net.xml deleted file mode 100644 index 3397a73dde..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_Map.net.xml +++ /dev/null @@ -1,2531 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_ROU.rou.xml b/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_ROU.rou.xml deleted file mode 100644 index 6c46d94a85..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_ROU.rou.xml +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openair2/UTIL/OMG/TraCIConstants.h b/openair2/UTIL/OMG/TraCIConstants.h deleted file mode 100644 index 6a123bb5d5..0000000000 --- a/openair2/UTIL/OMG/TraCIConstants.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef TRACICONSTANTS_H -#define TRACICONSTANTS_H - -// command: subscribe simulation variable -#define CMD_SUBSCRIBE_SIM_VARIABLE 0xdb - -// departed vehicle ids (get: simulation) -#define VAR_DEPARTED_VEHICLES_IDS 0x74 - -// command: simulation step (new version) -#define CMD_SIMSTEP2 0x02 - -// command: close sumo -#define CMD_CLOSE 0x7F - -// command: get vehicle variable -#define CMD_GET_VEHICLE_VARIABLE 0xa4 - -// command: Scenario -#define CMD_SCENARIO 0x73 - -// max count of vehicles -#define DOMVAR_MAXCOUNT 0x0A - -// 32 bit integer -#define TYPE_INTEGER 0x09 - -// speed of a node -#define DOMVAR_SPEED 0x04 - -// position of a domain object -#define DOMVAR_POSITION 0x02 - -// position (2D) (get: vehicle, poi, set: poi) -#define VAR_POSITION 0x42 - -// speed (get: vehicle) -#define VAR_SPEED 0x40 - -// position of a domain object -#define DOMVAR_POSITION 0x02 - -// ids of arrived vehicles (get: simulation) -#define VAR_ARRIVED_VEHICLES_IDS 0x7a - -// **************************************** -// RESULT TYPES -// **************************************** -// result type: Ok -#define RTYPE_OK 0x00 - -#endif \ No newline at end of file diff --git a/openair2/UTIL/OMG/client_traci_OMG.c b/openair2/UTIL/OMG/client_traci_OMG.c deleted file mode 100644 index c0ccf31dc6..0000000000 --- a/openair2/UTIL/OMG/client_traci_OMG.c +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file client_traci_OMG.c -* \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces. -* \author S. Uppoor, J. Harri -* \date 2012 -* \version 0.1 -* \company INRIA, Eurecom -* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr -* \note -* \warning -*/ - -#include -#include -#include -#include -#include - -#include "client_traci_OMG.h" -#include "TraCIConstants.h" - -#define UNUSED_VARIABLE(vARIABLE) (void)(vARIABLE) - -int handshake(char *hoststr,int portno) -{ - - check_endianness(); // check endianness - int i; - - for(i = 0; i< 10; i++) { - if ( connection_(hoststr,portno) <0 ) { -#ifdef STANDALONE - printf("connection error...trying again in 3 seconds\n"); -#else - LOG_E(OMG, " Could not connect to TraCIServer - sleeping before trying again...\n"); -#endif - sleep(5); - } else { -#ifdef STANDALONE - printf(" SUMO now connected to OMG on host address\n"); -#else - LOG_N(OMG, " SUMO now connected to OMG on host address %s and port %i .\n", hoststr, portno); -#endif - return 0; - } - } - -#ifdef STANDALONE - printf(" SUMO unreachable...giving up...\n"); -#else - LOG_E(OMG, " SUMO unreachable...giving up...\n"); -#endif - return -1; -} - -void init(int max_sim_time) -{ - -#ifdef STANDALONE - printf(" Initializing TraCI...\n"); -#else - LOG_N(OMG, " Initializing TraCI...\n"); -#endif - char *objID = " "; - // size_t size = strlen(objID); - - int noSubscribedVars = 2; - writeUnsignedByte(0); - writeInt(1 + 4 + 1 + 4 + 4 + 4 + (int) strlen(objID) + 1 + noSubscribedVars); - writeUnsignedByte(CMD_SUBSCRIBE_SIM_VARIABLE); // command id - writeInt(0); // begin time - writeInt(max_sim_time*1000); // end time - writeString(objID); // object id - writeUnsignedByte(noSubscribedVars); // variable number - writeUnsignedByte(VAR_DEPARTED_VEHICLES_IDS); - writeUnsignedByte(VAR_ARRIVED_VEHICLES_IDS); - - // send request message - sendExact(storageLength(storageStart)); - extractCommandStatus(receiveExact(), CMD_SUBSCRIBE_SIM_VARIABLE, description); - - if (departed == NULL) { - departed = (string_list*) malloc(sizeof(string_list)); // departed MUST point to HEAD - departed->string = NULL; - departed->next = NULL; - } - - if (arrived == NULL) { - arrived = (string_list*) malloc(sizeof(string_list)); // arrived MUST point to HEAD - arrived->string = NULL; - arrived->next = NULL; - } - - processSubscriptions(); - - reset(); -} - -void processSubscriptions() -{ - int noSubscriptions = readInt(); - - string_list* tmp_departed = departed; - string_list* tmp_arrived = arrived; - int s; - - for (s = 0; s0xef) { // only responses to subscription to supported types (vehicles, TLC, polygones...) are accepted - //LOG_W(OMG, " Invalide Subscription response: %d\n",cmdId); - //printf(" Invalide Subscription response: %d\n",cmdId); - return; - } - - char *objID = readString(); - int varNo = readUnsignedByte(); - - UNUSED_VARIABLE(objID); - UNUSED_VARIABLE(respStart); - - int i; - - for (i=0; istring = NULL; - departed->next = NULL; - } - - if (arrived == NULL) { - arrived = (string_list*) malloc(sizeof(string_list)); // arrived MUST point to HEAD - arrived->string = NULL; - arrived->next = NULL; - } - - /* if (departed == NULL) - departed = (String_list)malloc(sizeof(String_list)); // departed MUST point to HEAD - - if (arrived == NULL) - arrived = (String_list)malloc(sizeof(String_list)); // departed MUST point to HEAD - */ - - processSubscriptions(); - -} - -void commandClose() -{ - reset(); - // command length - writeUnsignedByte(0x02); - // command id - writeUnsignedByte(CMD_CLOSE); - - // send request message -#ifdef STANDALONE - printf("closing the socket... \n"); -#else - LOG_N(OMG,"closing the socket... \n"); -#endif - sendExact(storageLength(storageStart)); - extractCommandStatus(receiveExact(), CMD_CLOSE, description); - -} - - -void commandGetVehicleVariable(char *vehID, int varID)// malloc for vehID and varID depends on speed or position -{ - reset(); - int domID = CMD_GET_VEHICLE_VARIABLE;//0xa4 specific for get vehicle variable command - - // command length - writeUnsignedByte(1 + 1 + 1 + 4 + (int)strlen(vehID)); - // command id - writeUnsignedByte(CMD_GET_VEHICLE_VARIABLE); - // variable id - writeUnsignedByte(varID); - // object id - writeString(vehID); - - // send request message - sendExact(storageLength(storageStart)); - - // receive answer message - //receiveExact(); - if (extractCommandStatus(receiveExact(), CMD_GET_VEHICLE_VARIABLE, description)) { //<---RESPONSE_GET_VEHICLE_VARIABLE - - // validate result state - if(tracker == NULL) { - // LOG_E(OMG, " client_traci_OMG::commandGetVehicleVariable(): Tracker is NULL \n"); - //printf(" client_traci_OMG::commandGetVehicleVariable(): Tracker is NULL \n"); - return; - } - - int length = readUnsignedByte(); - - if(length ==0) - length = readInt(); - - int cmdId =readUnsignedByte(); - - if (cmdId != (CMD_GET_VEHICLE_VARIABLE+0x10)) { - //LOG_E(OMG, " Wrong response recieved\n"); - //printf(" Wrong response recieved\n"); - return; - } - - int VariableID = readUnsignedByte(); - char* rs = readString(); - - int valueDataType = readUnsignedByte(); - UNUSED_VARIABLE(VariableID); - UNUSED_VARIABLE(rs); - UNUSED_VARIABLE(valueDataType); - UNUSED_VARIABLE(domID); - - free( rs ); - } -} - -// TODO not working for now..need to find a way to get the same info without using CMD_SCENARIO (as not implemented by SUMO) -int commandGetMaxSUMONodesVariable() -{ - reset(); - - int max_car = 0; - - // command length - writeUnsignedByte(1 + 1 + 1 + 1 + 4 + 1 + 1 + 4); - // command id - writeUnsignedByte(CMD_SCENARIO); - // flag - writeUnsignedByte(0x00); // GET command for the generic environment-related values - // command id - //writeUnsignedByte(CMD_SCENARIO); - // domain id - writeUnsignedByte(0x01); // vehicle - - writeInt(0); // first vehicular domain - - // variable id - writeUnsignedByte(DOMVAR_MAXCOUNT); // get maximum number of vehicles - - writeUnsignedByte(TYPE_INTEGER); // get maximum number of vehicles - writeInt(max_car); // get maximum number of vehicles - - // send request message - sendExact(storageLength(storageStart)); - - // receive answer message - if (extractCommandStatus(receiveExact(), CMD_SCENARIO, description)) { //<---RESPONSE_GET_VEHICLE_VARIABLE - - // validate result state - - if(tracker == NULL) { - //LOG_E(OMG, " client_traci_OMG::commandGetMaxSUMONodesVariable(): Tracker is NULL \n"); - return -1; - } - - int res = readUnsignedByte(); - int Length = readUnsignedByte(); // to check with Int - int cmdId =readUnsignedByte(); - - if (cmdId != (CMD_SCENARIO)) { - //LOG_E(OMG, " Wrong response recieved \n"); - return -1; - } - - int flag = readUnsignedByte(); - int dom = readUnsignedByte(); // domain - int domID = readInt(); // domain ID - int VariableID = readUnsignedByte(); - - int valueDataType = readUnsignedByte(); - - if (valueDataType == TYPE_INTEGER) { - max_car = readInt(); - //LOG_N(OMG, " max Number SUMO nodes is: %f \n", max_car); - } else { - //LOG_W(OMG, " No Matching Data Type Value \n"); - } - - UNUSED_VARIABLE(res); - UNUSED_VARIABLE(Length); - UNUSED_VARIABLE(flag); - UNUSED_VARIABLE(dom); - UNUSED_VARIABLE(domID); - UNUSED_VARIABLE(VariableID); - } - - return max_car; -} - - - - -void GetSpeed(node_struct* node, char * sumo_id) -{ - commandGetVehicleVariable(sumo_id, VAR_SPEED); - double speed_double = readDouble(); - node->mob->speed = speed_double; -} - -void GetPosition(node_struct* node, char * sumo_id) -{ - commandGetVehicleVariable(sumo_id, VAR_POSITION); - double x_double = readDouble(); - - if (x_double < 0.0) - x_double = 0.0; - - double y_double = readDouble(); - - if (y_double < 0.0) - y_double = 0.0; - - node->x_pos = x_double; - node->y_pos = y_double; -} diff --git a/openair2/UTIL/OMG/client_traci_OMG.h b/openair2/UTIL/OMG/client_traci_OMG.h deleted file mode 100644 index 9aec52110a..0000000000 --- a/openair2/UTIL/OMG/client_traci_OMG.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file client_traci_OMG.h -* \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces. -* \author S. Uppoor, J. Harri -* \date 2012 -* \version 0.1 -* \company INRIA, Eurecom -* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr -* \note -* \warning -*/ - -#ifndef TRACICLIENT_OMG_H -#define TRACICLIENT_OMG_H - -#include -#include -#include -#include "omg.h" - -//#include "TraCIConstants.h" -#include "storage_traci_OMG.h" -#include "socket_traci_OMG.h" - -#define MAX_ATTEMPTS 5; // number of connection attemps to SUMO - -int targetTime; - -char *description; - -string_list* departed; // string list of all vehicles appearing in SUMO at the current time step -string_list* arrived; // string list of all vehicles leaving SUMO at the current time step - -/** - * Global parameters defined in storage_traci_OMG.h - */ -extern storage *head; -extern storage *storageStart; -extern storage *tracker; -extern int descLen; - -/** - * \fn handshake(char *,int) - * \brief Talks to SUMO by establishing connection - * \param Accepts host name and port number - */ -int handshake(char *,int); - -/** - * \fn extractCommandStatus(storage *, unsigned char , char *) - * \brief Validates the RESPONSE recieved by SUMO - * \param Accepts storage pointer where data is read and stored, command ID for which response is recieved, description - */ -int extractCommandStatus(storage *, unsigned char , char *); - -/** - * \fn commandSimulationStep(double) - * \brief Advances the SUMO Simulation - * \param Accepts number of steps or seconds SUMO should Simulate - */ -void commandSimulationStep(double); - -/** - * \fn commandClose(void); - * \brief Send termination command to SUMO - */ -void commandClose(void); - -/** - * \fn commandGetVehicleVariable(char *vehID, int varID) - * \brief Gets the position position and speed info - * \param Accepts vehicle ID and variable ID, here variable ID is the comaand type - */ -void commandGetVehicleVariable(char *vehID, int varID); - - -/** - * \fn get_num_sumo_nodes(void) - * \brief Return the total number of nodes to be simulated in SUMO - */ -int commandGetMaxSUMONodesVariable(void); - -/** - * \fn init(int max_sim_time) - * \brief Initialize SUMO and set the periodic subscriptions - */ -void init(int max_sim_time); - -/** - * \fn void processSubscriptions(String_list departed, String_list arrived) - * \brief process the subscription values sent by SUMO at each SUMO time step - */ -void processSubscriptions(void); - -/** - * \fn void GetSpeed(NodePtr node, char * sumo_id); - * \brief ask SUMO to return the speed for the indicated vehicle ID - * \param NodePtr node the pointer to the OAISim node - * \param char *sumo_id the SUMO ID of the target node - */ -void GetSpeed(node_struct* node, char * sumo_id); - -/** - * \fn void Position(NodePtr node, char * sumo_id); - * \brief ask SUMO to return the position (X,Y) for the indicated vehicle ID - * \param NodePtr node the pointer to the OAISim node - * \param char *sumo_id the SUMO ID of the target node - */ -void GetPosition(node_struct* node, char * sumo_id); - - -#endif - diff --git a/openair2/UTIL/OMG/id_manager.c b/openair2/UTIL/OMG/id_manager.c deleted file mode 100644 index db56cbbaac..0000000000 --- a/openair2/UTIL/OMG/id_manager.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file id_manager.c -* \brief Main function containing the OMG ID Manager -* \author J. Harri -* \date 2012 -* \version 0.1 -* \company Eurecom -* \email: -* \note -* \warning -*/ - -#include "id_manager.h" -#include "assertions.h" -#include -#include - -MapPtr create_map(void) -{ - MapPtr ptr; - ptr = malloc(sizeof(map_struct)); - return ptr; -} - -IDManagerPtr create_IDManager(void) -{ - IDManagerPtr ptr; - ptr = malloc(sizeof(id_manager_struct)); - ptr->map_oai2sumo = NULL; - ptr->map_sumo2oai = NULL; - return ptr; -} - -Map_list add_map_entry(MapPtr map, Map_list Map_Vector) -{ - Map_list entry = malloc(sizeof(map_list_struct)); - entry->map = map; - entry->next = NULL; - - if (Map_Vector == NULL) { - //printf("Map-vector is NULL, assigning a new entry\n"); - return entry; - } else { - Map_list tmp = Map_Vector; - - while (tmp->next != NULL) { - //printf("getting the tail...\n"); - tmp = tmp->next; - } - - //printf("got it...adding entry...\n"); - tmp->next = entry; - - return Map_Vector; - } -} - -Map_list remove_entry(MapPtr map, Map_list Map_Vector) -{ - Map_list entry = malloc(sizeof(map_list_struct)); - entry->map = map; - entry->next = NULL; - - if (Map_Vector == NULL) { - return entry; - } else { - Map_list tmp = Map_Vector; - - while (tmp->next != NULL) { - tmp = tmp->next; - } - - tmp->next = entry; - - return Map_Vector; - } -} - -char* get_SumoID_by_OAI(int oai_id, IDManagerPtr ID_manager) -{ - if(ID_manager->map_oai2sumo == NULL) - return NULL; - - else { - return get_sumo_entry(oai_id, ID_manager->map_oai2sumo); - } -} - -int get_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager) -{ - if(ID_manager->map_sumo2oai == NULL) { - //printf("ID_Manager: get_oaiID_by_SUMO: uninitialized map\n"); - return -1; - } - - else { - //printf("ID_Manager: get_oaiID_by_SUMO: OAI_entry is: %d \n", get_oai_entry(sumo_id, ID_manager->map_sumo2oai)); - return get_oai_entry(sumo_id, ID_manager->map_sumo2oai); - } -} - -void remove_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager) -{ - if(ID_manager->map_sumo2oai == NULL) { - printf("ID_Manager: remove_oaiID_by_SUMO: uninitialized map\n"); - return; - } else { - ID_manager->map_sumo2oai = remove_oai_entry(sumo_id, ID_manager->map_sumo2oai); - - if(ID_manager->map_oai2sumo !=NULL) { - ID_manager->map_oai2sumo = remove_oai_entry(sumo_id, ID_manager->map_oai2sumo); // need to remove in the other list as well - } - - //return ID_manager->map_sumo2oai; - - } -} - -char* get_sumo_entry(int oai_id, Map_list Map_Vector) -{ - Map_list tmp = Map_Vector; - - AssertFatal( Map_Vector, "bug here..should not be NULL" ); - AssertFatal( Map_Vector->map, "bug here..map should have been initialized" ); - - if (tmp->map->oai_id == oai_id) { - //printf("got it...at the head and value is %s \n",tmp->map->sumo_id); - return tmp->map->sumo_id; - } else { - //printf("here...\n"); - while (tmp->next != NULL) { - tmp = tmp->next; - - if (tmp->map->oai_id == oai_id) { - //printf("got it...in main value is %s \n",tmp->map->sumo_id); - return tmp->map->sumo_id; - } - } - } - - return NULL; -} - -int get_oai_entry(char *sumo_id, Map_list Map_Vector) -{ - Map_list tmp = Map_Vector; - - if (strcmp(tmp->map->sumo_id, sumo_id) == 0) { - //printf("found it %s \n",tmp->map->sumo_id); - return tmp->map->oai_id; - } else { - while (tmp->next != NULL) { - tmp = tmp->next; - - if (strcmp(tmp->map->sumo_id, sumo_id) == 0) { - return tmp->map->oai_id; - } - } - } - - return -1; -} - -Map_list remove_oai_entry(char *sumo_id, Map_list Map_Vector) -{ - Map_list tmp = Map_Vector; - - // Map_list entry; - //printf("removing entry %s \n",sumo_id); - if (strcmp(tmp->map->sumo_id, sumo_id) == 0) { - //printf("1: found it %s \n",tmp->map->sumo_id); - // int id = tmp->map->oai_id; - // free(tmp); - if(tmp->next == NULL) - return NULL; - - else { - return tmp->next; - } - - //if(strcmp(tmp->map->sumo_id, "0") == 0) { - //printf("OAI ID is %d \n",id); - //exit(-1); - //} - //return id; - } else { - //printf("removing entry %s \n",sumo_id); - while (tmp->next != NULL) { - if (strcmp(tmp->next->map->sumo_id, sumo_id) == 0) { - //printf("2: found it %s \n",tmp->next->map->sumo_id); - // int id = tmp->next->map->oai_id; - // entry = tmp->next; // save the entry to remove - tmp->next = tmp->next->next; // jump over the entry to be removed - // free(entry); // freeing the entry - //if(strcmp(tmp->next->map->sumo_id, "0") == 0) - // exit(-1); - - //return id; - } - - tmp = tmp->next; - } - } - - return Map_Vector; -} - - diff --git a/openair2/UTIL/OMG/id_manager.h b/openair2/UTIL/OMG/id_manager.h deleted file mode 100644 index 92df104133..0000000000 --- a/openair2/UTIL/OMG/id_manager.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file id_manager.h -* \brief Prototypes of the OMG ID Manager to handle the mapping between OAI ID and SUMO ID -* \author J. Harri -* \date 2012 -* \version 0.1 -* \company Eurecom -* \email: -* \note -* \warning -*/ - -#ifndef __IDMANAGER_H_ -#define __IDMANAGER_H_ - -#include - -/*!A sructure that represents a mapping (OAI_ID, SUMO_ID), i.e the node ID given by OAI and the node ID given by SUMO */ -typedef struct map_struct { - int oai_id; /*!< the oai ID as an integer */ - char *sumo_id; /*!< SUMO gives IDs as strings */ -} map_struct; - -typedef struct map_struct* MapPtr; /*!< The typedef that reflects a #map_struct*/ - -/*!A sructure that gathers all the existing ID Maping */ -struct map_list_struct { - map_struct *map; /*!< Avariable of type #MapPtr. It represents a node */ - struct map_list_struct *next; /*!< A pointer to the next element */ -} map_list_struct; - -typedef struct map_list_struct* Map_list; /*!< The typedef that reflects a #map_list_struct*/ - -/*!A sructure that includes all characteristics of an ID management Unit */ -typedef struct id_manager_struct { - struct map_list_struct *map_oai2sumo; /*!< Avariable of type #MapPtr. It represents the mapping from OAI ID to SUMO ID for one noe */ - struct map_list_struct *map_sumo2oai; /*!< Avariable of type #MapPtr. It represents the mapping from SUMO ID to OAI ID for one noe */ - -} id_manager_struct; - -typedef struct id_manager_struct* IDManagerPtr; /*!< The typedef that reflects a #id_manager_struct*/ - - -/** - * \fn MapPtr create_map(void) - * \brief Create and allocate memory for a map object (OAI ID / SUMO ID). - * \return a pointer to the newly created Map - */ -MapPtr create_map(void); - -/** - * \fn IDManangerPtr create_IDManager(void) - * \brief Create and allocate memory for a the ID Manager. - * \return a pointer to the ID Manager - */ -IDManagerPtr create_IDManager(void); - -/** - * \fn Map_list add_entry(MapPtr map, Map_list Map_Vector) - * \brief Add a mapping entry to the MapList - * \param map the pointer to the map to be added to the Map_list - * \param Map_Vector the reference to the Map_list (pointing to the HEAD if not NULL) - * \retun the pointer to the updated/created map list (pointing to the HEAD) - */ -Map_list add_map_entry(MapPtr map, Map_list Map_Vector); - -/** - * \fn char* get_SumoID_by_OAI(int oai_id, IDManagerPtr ID_manager) - * \brief map a SUMO ID from a OAI ID; return NULL if the mapping does not exist - * \param oai_id the OAI ID to be mapped to the SUMO ID - * \param ID_manager the reference to the ID Manager - * \return the SUMO ID in string format - */ -char* get_sumoID_by_OAI(int oai_id, IDManagerPtr ID_manager); - -/** - * \fn int get_OaiID_by_SUMO(char* sumo_id, IDManagerPtr ID_manager) - * \brief map a OAI ID from a SUMO ID; return -1 if the mapping does not exist - * \param sumo_id the SUMO ID to be mapped to the OAI ID - * \param ID_manager the reference to the ID Manager - * \return the OAI ID in int format - */ -int get_oaiID_by_SUMO(char* sumo_id, IDManagerPtr ID_manager); - -/** - * \fn int remove_OaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager); - * \brief remove an OAI-SUMO mapping from a SUMO ID, and return the ID; return -1 if the mapping does not exist - * \param sumo_id the SUMO ID used to remove the mapping - * \param ID_manager the reference to the ID Manager - * \return the updated pointer to the Map_list -*/ -void remove_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager); - -/** - * \fn char* get_sumo_entry(int oai_id, Map_list Map_Vector) - * \brief retrieve the SUMO ID from a OAI ID from the OAI_SUMO map; return NULL if not found - * \param oai_id the OAI ID to retrive the corresponding SUMO ID - * \param Map_Vector the reference to the OAI_2_SUMO Map list - * \return the SUMO ID in string format - */ -char* get_sumo_entry(int oai_id, Map_list Map_Vector); - -/** - * \fn get_oai_entry(char* sumo_id, Map_list Map_Vector) - * \brief retrieve the OAI ID from a SUMO ID from the SUMO_OAI map; returns -1 if not found - * \param sumo_id the SUMO ID to retrieve the corresponding OAI ID - * \param Map_Vector the reference to the SUMO_2_OAI Map list - * \return the OAI ID in int format - */ -int get_oai_entry(char*, Map_list); - - -/** - * \fn int remove_oai_entry(char *sumo_id, Map_list Map_Vector); - * \brief remove the SUMO-OAI mapping, from a SUMO ID; returns the found OAI ID; returns -1 if the mapping does not exist. - * \param sumo_id the SUMO ID used to remove the mapping. - * \param Map_Vector the reference to the SUMO_2_OAI Map list - * \return the updated pointer to the Map_list - */ -Map_list remove_oai_entry(char *sumo_id, Map_list Map_Vector); - - - -#endif /* __IDMANAGER_H_ */ diff --git a/openair2/UTIL/OMG/omg.c b/openair2/UTIL/OMG/omg.c index eae794187a..a6d4b74d17 100644 --- a/openair2/UTIL/OMG/omg.c +++ b/openair2/UTIL/OMG/omg.c @@ -45,7 +45,9 @@ #include "trace.h" #include "grid.h" #include "steadystaterwp.h" +#ifdef SUMO_IF #include "sumo.h" +#endif #include "../OMV/structures.h" //#define STANDALONE @@ -109,11 +111,11 @@ init_mobility_generator (omg_global_param omg_param_list[]) case TRACE: start_trace_generator (omg_param_list[node_t]); break; - +#ifdef SUMO_IF case SUMO: start_sumo_generator (omg_param_list[node_t]); break; - +#endif case STEADY_RWP: start_steadystaterwp_generator (omg_param_list[node_t]); break; @@ -152,12 +154,12 @@ stop_mobility_generator (omg_global_param * omg_param_list) case STEADY_RWP: break; - +#ifdef SUMO_IF case SUMO: stop_sumo_generator (); //LOG_D(OMG," --------OMG will interface with SUMO for mobility generation-------- \n"); break; - +#endif default: LOG_N (OMG, "Unsupported generator\n"); } @@ -198,12 +200,12 @@ update_node_vector (int mobility_type, double cur_time) case TRACE: update_trace_nodes (cur_time); break; - +#ifdef SUMO_IF case SUMO: // printf("in SUMO case \n"); update_sumo_nodes (cur_time); break; - +#endif case STEADY_RWP: update_steadystaterwp_nodes (cur_time); break; @@ -248,12 +250,12 @@ get_nodes_positions (int mobility_type, double cur_time) case TRACE: get_trace_positions_updated (cur_time); break; - +#ifdef SUMO_IF case SUMO: LOG_I (OMG, "getting positions from SUMO\n"); get_sumo_positions_updated (cur_time); break; - +#endif case STEADY_RWP: get_steadystaterwp_positions_updated (cur_time); break; @@ -371,11 +373,11 @@ set_new_mob_type (int id, int node_t, int mob_t, double cur_time) move_steadystaterwp_node (pair, cur_time); break; - +#ifdef SUMO_IF case SUMO: LOG_E (OMG, "not possible to change mobility type to sumo \n"); break; - +#endif case TRACE: LOG_E (OMG, "not possible to change mobility type to trace \n"); break; diff --git a/openair2/UTIL/OMG/socket_traci_OMG.c b/openair2/UTIL/OMG/socket_traci_OMG.c deleted file mode 100644 index fa40d8fe1e..0000000000 --- a/openair2/UTIL/OMG/socket_traci_OMG.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file socket_traci_OMG.c -* \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) -* \author S. Uppoor -* \date 2012 -* \version 0.1 -* \company INRIA -* \email: sandesh.uppor@inria.fr -* \note -* \warning -*/ - -#include -#include -#include -#include -#include -#include -#include -#include "socket_traci_OMG.h" -#include "storage_traci_OMG.h" - - -int connection_(char *hoststr,int portno) -{ - host = gethostbyname(hoststr); - - printf("trying to connect to %s at the port %i \n",hoststr, portno); - - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { -#ifdef STANDALONE - printf(" Socket Error\n"); -#else - LOG_D(OMG, " Socket Error\n"); -#endif - } - - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(portno); - server_addr.sin_addr = *((struct in_addr *)host->h_addr); - bzero(&(server_addr.sin_zero),8); - - if (connect(sock, (struct sockaddr *)&server_addr, - sizeof(struct sockaddr)) < 0) { -#ifdef STANDALONE - printf("Connection Failed\n"); -#else - LOG_E(OMG, " Connection Error\n"); -#endif - - return -1; - - } - - return 1; -} - - -void sendExact(int cmdLength) -{ - - msgLength = cmdLength + 4; - writeInt(msgLength); - - rearange(); - unsigned char *buf = (unsigned char *)malloc(sizeof(unsigned char) * (msgLength)); - storage *cur_ptr = storageStart; - size_t i = 0; - size_t numbytes = msgLength; - - while (cur_ptr->next != NULL) { - buf[i]= cur_ptr->item; - cur_ptr = cur_ptr->next; - i++; - } - - buf[i]= cur_ptr->item; - - while (numbytes > 0) { - int n = send(sock, buf, (int)numbytes, 0);//<----- need to check - - if (numbytes == n) - break; - - if (n<0) { -#ifdef STANDALONE - printf(" ERROR writing to socket\n"); -#else - LOG_E(OMG, " ERROR writing to socket\n"); -#endif - - } - - numbytes -= n; - buf +=n; - } - - freeStorage(storageStart); - free(buf); -} - - - -storage * receiveExact() -{ - - unsigned char* bufLength = (unsigned char *)malloc(sizeof(unsigned char) * (4)); - int bytesRead = 0; - int readThisTime = 0; - - //Get the length of the entire message by reading the 1st field - while (bytesRead<4) { - readThisTime = recv( sock, (char*)(bufLength + bytesRead), 4-bytesRead, 0 ); - - if( readThisTime <= 0 ) { -#ifdef STANDALONE - printf(" tcpip::Socket::receive() @ recv\n"); -#else - LOG_E(OMG, " tcpip::Socket::receive() @ recv\n"); -#endif - } - - bytesRead += readThisTime; - } - - // create storage to access the content - tracker = writePacket(bufLength, 4); - - free( bufLength ); - bufLength = 0; - - // store pointer to free the space later - // storage *freeTracker = tracker; - int s= readInt(); - int NN = s - 4; - printf("debug \n"); - printf("value of s is %d \n",s); - printf("end debug \n"); - //Free space after use - //freeStorage(freeTracker); // JHNOte: will be done by calling reset() in storage_traci_omg - - int mySize = 0; - mySize = sizeof(unsigned char) * (NN); - printf("debug \n"); - printf("value of mySize is %d \n",mySize); - printf("end debug \n"); - // receive actual message content - //unsigned char* buf = (unsigned char *)malloc(sizeof(unsigned char) * (NN)); - unsigned char* buf = (unsigned char *)malloc(mySize); - - bytesRead = 0; - readThisTime = 0; - - while (bytesRead -#include -#include -#include -#include - -#include "omg.h" -#include "storage_traci_OMG.h" - -int sock, portno, msgLength; -struct hostent *host; -struct sockaddr_in server_addr; - -/** - * Global parameters defined in storage_traci_OMG.h - */ -extern storage *tracker; -extern storage *head; -extern storage *storageStart; - - -/** - * \fn connection_(char *,int) - * \brief Talks to SUMO by establishing connection - * \param Accepts host name and port number - */ -int connection_(char *, int); - -/** - * \fn sendExact(int); - * \brief Pack the data from storage to buf and write to socket - * \param Accepts command length - */ -void sendExact(int); - -/** - * \fn recieveExact(void); - * \brief Pack the data to storage from buf after reading from socket - * Returns storage pointer - */ -storage* receiveExact(void); - - -/** - * \fn close_connection(void); - * \brief close socket connection - */ -void close_connection(void); - -#endif diff --git a/openair2/UTIL/OMG/storage_traci_OMG.c b/openair2/UTIL/OMG/storage_traci_OMG.c deleted file mode 100644 index 7bd3ae4155..0000000000 --- a/openair2/UTIL/OMG/storage_traci_OMG.c +++ /dev/null @@ -1,519 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file storage_traci_OMG.c -* \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) -* \author S. Uppoor -* \date 2012 -* \version 0.2 -* \company INRIA -* \email: sandesh.uppor@inria.fr -* \note 0.1 -> 0.2: (J. Harri) added reader and writer to String_list -* \warning -*/ - - -#include -#include "storage_traci_OMG.h" - -//using namespace std -bool bigEndian; - - -void reset() -{ - tracker = NULL; - head = NULL; - descLen = 0; - freeStorage(storageStart); // freeing the storage object - storageStart=NULL; - -} - -void check_endianness() -{ - - //checking endianness - un.s = 0x0102; - - if (sizeof(short) == 2) { - if (un.c[0] == 1 && un.c[1] == 2) - bigEndian = true; - } -} - - -int storageLength(storage *cur_ptr) -{ - - int count=0; - - while(cur_ptr != NULL) { - cur_ptr=cur_ptr->next; - count++; - } - - return(count); -} - -void rearange() -{ - //Since linked list is used, all data is appended to the last pointer, - // we face problem in sendExact(int cmdLength) in socket_traci_OMG.c - // since total length of the entire message is appended last - // storage = command + length(4 bytes) is changed to storage = length(4 bytes) + command - int pos = msgLength - 4; - int count =0; - - storage *cur_ptr = NULL; - storage *temp_ptr = NULL; - storage *temp_pptr = NULL; - - cur_ptr = storageStart; - - while (count != pos && cur_ptr->next != NULL) { - temp_pptr = cur_ptr; - cur_ptr = cur_ptr->next; - - count++; - } - - temp_ptr = cur_ptr; - - while(cur_ptr->next != NULL) { - cur_ptr = cur_ptr-> next; - } - - cur_ptr->next = storageStart; - storageStart = temp_ptr; - temp_pptr->next = NULL; - -} - -unsigned char readChar() -{ - // if (tracker!=NULL) - // { - unsigned char hd = tracker->item; - //printf("OMG char: %d \n",(int)hd); - tracker = tracker->next; - return hd; - //}else - // { - // LOG_E(OMG, " Storage::readChar(): Tracker is NULL \n"); - // unsigned char *error = NULL; - // return error; // - // } - - -} - -void writeChar(unsigned char value) -{ - storage *temp; - temp = (storage *)malloc(sizeof(storage)); - - if (head == NULL) { - head = temp; - head->next = NULL; - head->item = value; - storageStart = temp; //points to start of actual message - } else { - head->next = temp; - temp->next = NULL; - temp->item = value; - head = temp; - } -} - -int readByte() -{ - int i = (int)(readChar()); - - if (i < 128) return i; - else return (i - 256); - -} - -void writeByte(int value) -{ - if (value < -128 || value > 127) { - LOG_E(OMG, " Storage::writeByte(): Invalid value, not in [-128, 127]\n"); - } - - writeChar( (unsigned char)( (value+256) % 256 ) ); -} - -int readUnsignedByte() -{ - - return (int)(readChar()); - -} - - -void writeUnsignedByte(int value) -{ - if (value < 0 || value > 255) { - LOG_E(OMG, " Storage::writeUnsignedByte(): Invalid value, not in [0, 255]\n"); - } - - writeChar( ((unsigned char)value)); -} - -// JNNOTE: had to change the behavior here, as tmp was always pointing at the end of the String and not at the beginning: accordingly, all strings where always '0' -char * readString() -{ - - int i=0; - int len = readInt(); - - descLen = len; - char *tmp = (char *)malloc(sizeof(char) * (len)); - char *ret = tmp; // JHNOTE: added a pointer pointing at the head of the String - - //printf("OMG ready to readString of length %d \n",len); - for (; i < len; i++) { - *tmp++ = (char) readChar(); - } - - *tmp++ = '\0'; // makes sure it's NUL terminated - - //printf("OMG readString - %s \n",ret); - //printf("OMG readString - %s \n",tmp); - return ret; // the head is returned - -} - - -void writeString(char *s) -{ - int count=0; - char* s_copy=s; - - for(; *s!='\0'; s++) - count++; - - writeInt(count); - - for(; *s_copy!='\0'; s_copy++) - writeChar(*s_copy); - -} - -string_list* readStringList(string_list* vector) -{ - - int i=0; - int len = readInt(); - descLen = len; - string_list* entry = NULL; - - for (; i < len; i++) { - if (vector->string == NULL) { - char *tmp = readString(); - //printf("OMG - 1 SUMO ID: %s \n",tmp); - vector->string = tmp;//readString(); - } else { - entry = (string_list*) malloc(sizeof(string_list)); - char *tmp = readString(); - //printf("OMG - SUMO ID: %s \n",tmp); - entry->string = tmp;//readString(); - entry->next = NULL; - - if(vector !=NULL) { - string_list* tmp = vector; - - while (tmp->next != NULL) { - tmp = tmp->next; - } - - tmp->next = entry; - } - } - } - - return vector; - -} - - -void writeStringList(string_list* vector) -{ - - - int count=0; - string_list* tmp = vector; - - // JHNote: a better solution would be to save the pointer to the reference of this Int and replace the value with count at the end.... - if (tmp->string !=NULL) - count++; - - while (tmp->next != NULL) { - tmp = tmp->next; - count++; - } - - writeInt(count); - - tmp = vector; - - if (tmp->string !=NULL) { - writeString(tmp->string); - } - - while (tmp->next != NULL) { - tmp = tmp->next; - writeString(tmp->string); - } - -} - - -int readShort() -{ - LOG_W(OMG, " readShort not implented \n"); - return -1; -} - -void writeShort(int value) -{ - LOG_W(OMG, " writeShort not implented \n"); - return; -} - - -int readInt() -{ - int value = 0; - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - p_value[0] = readChar(); - p_value[1] = readChar(); - p_value[2] = readChar(); - p_value[3] = readChar(); - } else { - // network is little endian - p_value[3] = readChar(); - p_value[2] = readChar(); - p_value[1] = readChar(); - p_value[0] = readChar(); - } - - return value; - -} - - -void writeInt(int value) -{ - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - writeChar(p_value[0]); - writeChar(p_value[1]); - writeChar(p_value[2]); - writeChar(p_value[3]); - - } else { - // network is little endian - - writeChar(p_value[3]); - writeChar(p_value[2]); - writeChar(p_value[1]); - writeChar(p_value[0]); - } -} - -float readFloat() -{ - - float value = 0; - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - p_value[0] = readChar(); - p_value[1] = readChar(); - p_value[2] = readChar(); - p_value[3] = readChar(); - } else { - // network is big endian - p_value[3] = readChar(); - p_value[2] = readChar(); - p_value[1] = readChar(); - p_value[0] = readChar(); - } - - return value; - -} - - -void writeFloat(float value) -{ - - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - writeChar(p_value[0]); - writeChar(p_value[1]); - writeChar(p_value[2]); - writeChar(p_value[3]); - } else { - // network is big endian - writeChar(p_value[3]); - writeChar(p_value[2]); - writeChar(p_value[1]); - writeChar(p_value[0]); - } -} - - -double readDouble() -{ - - double value = 0; - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - int i = 0; - - for (; i<8; ++i) { - p_value[i] = readChar(); - } - } else { - int i=7; - - // network is big endian - for (; i>=0; --i) { - p_value[i] = readChar(); - } - } - - return value; - -} - -void writeDouble(double value) -{ - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - int i=0; - - // network is big endian - for (; i<8; ++i) { - writeChar(p_value[i]); - } - } else { - int i=7; - - // network is big endian - for (; i>=0; --i) { - writeChar(p_value[i]); - } - } - -} - - - -storage* writePacket (unsigned char* packet, int length) -{ - - //printf("required length is %d \n",length); - - storage *recvpacket = NULL; - storage *recvpacketStart= NULL; - storage *temp_ = NULL; - - int localSize = sizeof(storage); - printf("size of storage is %d bytes \n",localSize); - - int i = 0; - - for(; i < length; i++) { - - printf("in %d round \n",i); - //storage *temp_ = (storage *)malloc(sizeof(storage)); - temp_ = (storage *)malloc(sizeof(storage)); - - - if (recvpacket == NULL) { - recvpacket = temp_; - recvpacketStart = recvpacket; - recvpacket->next = NULL; - recvpacket->item = packet[i]; - } else { - temp_->next =NULL; - temp_-> item = packet[i]; - recvpacket-> next = temp_; - recvpacket =temp_; - } - } - - return recvpacketStart; - -} - - -/*void writeStorage(){ - LOG_W(OMG, " writeStorage not implented \n"); - return; - -}*/ - -void freeStorage(storage * freePtr) -{ - - storage *node,*temp; - node = freePtr; // start at the head. - - while (node != NULL) { // traverse entire list. - temp = node ; // save node pointer. - node = node->next; // advance to next. - free(temp); - } // free the saved one. - - freePtr = NULL; // finally, mark as empty list. -} - -void reset_String_list(string_list* vector) -{ - string_list* entry = vector; - string_list* tmp; - - while (entry->next != NULL) { - tmp = entry; - entry = entry->next; - free(tmp); - } - - vector = NULL; -} - - diff --git a/openair2/UTIL/OMG/storage_traci_OMG.h b/openair2/UTIL/OMG/storage_traci_OMG.h deleted file mode 100644 index 143d24a629..0000000000 --- a/openair2/UTIL/OMG/storage_traci_OMG.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file storage_traci_OMG.h -* \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) -* \author S. Uppoor -* \date 2012 -* \version 0.1 -* \company INRIA -* \email: sandesh.uppor@inria.fr -* \note -* \warning -*/ - -#ifndef STORAGE_TRACI_OMG_H -#define STORAGE_TRACI_OMG_H - -#include -#include -#include -#include -#include -#include "omg.h" - -// sortation of bytes forwards or backwards?------------------ - -extern bool bigEndian; - -union n { - short s; - char c[sizeof(short)]; -} un ; - - -void check_endianness(void); - -//----------------STORAGE------------------------------------ -struct Storage { - - unsigned char item; - struct Storage *next; - -} ; -typedef struct Storage storage; -// pointer which always points to next entry to be read -// updated in readChar function in storage_traci_OMG - -storage *tracker; -storage *head; -storage *storageStart; -int descLen; - -extern int msgLength; - -void reset(void); -int storageLength(storage *); - -void rearange(void); -unsigned char readChar(void); -void writeChar(unsigned char); - -int readByte(void) ; -void writeByte(int) ; - - -int readUnsignedByte(void); -void writeUnsignedByte(int); - -char * readString(void) ; -void writeString(char *); - -string_list* readStringList(string_list*) ; -void writeStringList(string_list*); - -int readShort(void) ; -void writeShort(int); - -int readInt(void) ; -void writeInt(int); - -float readFloat(void) ; -void writeFloat( float ); - -double readDouble(void) ; -void writeDouble( double ); - -storage* writePacket(unsigned char*, int); - -//void writeStorage(storage & ); -void freeStorage(storage *); - -#endif - diff --git a/openair2/UTIL/OMG/sumo.c b/openair2/UTIL/OMG/sumo.c deleted file mode 100644 index cc1d1e8ccd..0000000000 --- a/openair2/UTIL/OMG/sumo.c +++ /dev/null @@ -1,495 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file sumo.c -* \brief The OMG interface to SUMO (Simulation of Urban Mobility) -* \author S. Uppoor, J. Harri -* \date 2012 -* \version 0.1 -* \company INRIA, Eurecom -* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr -* \note -* \warning -*/ - -#include -#include -#include - -#include -#include -#include -#include - -#include "sumo.h" - -#include "client_traci_OMG.h" -#include "assertions.h" - - -int -start_sumo_generator (omg_global_param omg_param_list) -{ - - char sumo_line[300]; - int n_id; - static int id = 0; - - // sprintf(sumo_line, "%s -c %s -b %d -e %d --remote-port %d --step-length %d -v ",omg_param_list.sumo_command, omg_param_list.sumo_config, omg_param_list.sumo_start, omg_param_list.sumo_end, omg_param_list.sumo_port, omg_param_list.sumo_step); - - sprintf (sumo_line, "%s -c %s ", omg_param_list.sumo_command, - omg_param_list.sumo_config); - - printf ("%s\n", sumo_line); - - if ((pid = fork ()) == 0) { - // Start SUMO in the child process - if (system (sumo_line)) ; /* this if for no gcc warnings */ - //childs addresss space - } - - //still in the parent process - - // Talk to SUMO - - targetTime = 1; - - departed = NULL; - arrived = NULL; - - // switch on error to return to OAI - handshake (omg_param_list.sumo_host, omg_param_list.sumo_port); - - init (omg_param_list.sumo_end - omg_param_list.sumo_start); - - int max_node_SUMO = 100; //commandGetMaxSUMONodesVariable(); TODO method not implemented in TraCI server..must find another solution - - // printf("received Number of nodes %d\n", max_node_SUMO); - - // create the OAI/SUMO ID manager - id_manager = create_IDManager (); - - node_struct *node = NULL; - mobility_struct *mobility = NULL; - - active_nodes = NULL; // container to return a subset of only ACTIVE OAI nodes in SUMO - - last_update_time = 0.0; - - // just check for faulty values - if (omg_param_list.nodes <= 0) { -#ifdef STANDALONE - printf ("Number of nodes has not been set\n"); -#else - LOG_W (OMG, "Number of nodes has not been set\n"); -#endif - return (-1); - } - -#ifdef STANDALONE - printf ("Number of OAI-equipped nodes in SUMO has been set to %d\n", - omg_param_list.nodes); - printf ("Number of SUMO simulated nodes has been set to %d\n", - max_node_SUMO); -#else - LOG_I (OMG, "Number of OAI-equipped nodes in SUMO has been set to %d\n", - omg_param_list.nodes); - LOG_I (OMG, "Number of SUMO simulated nodes has been set to %d\n", - max_node_SUMO); -#endif - - // check and match number of nodes in mobility file provided - if (omg_param_list.nodes > max_node_SUMO) { -#ifdef STANDALONE - printf ("Not all OAI nodes will be moving according to SUMO.\n"); -#else - LOG_I (OMG, "Not all OAI nodes will be moving according to SUMO.\n"); -#endif - } else { -#ifdef STANDALONE - printf ("OAI nodes will be mapped to a subset of SUMO nodes\n"); -#else - LOG_I (OMG, "OAI nodes will be mapped to a subset of SUMO nodes\n"); -#endif - } - - if (omg_param_list.nodes_type == eNB) { -#ifdef STANDALONE - printf ("Node type has been set to eNB\n"); -#else - LOG_I (OMG, "Node type has been set to eNB\n"); -#endif - } else if (omg_param_list.nodes_type == UE) { - -#ifdef STANDALONE - printf ("Node type has been set to UE\n"); -#else - LOG_I (OMG, "Node type has been set to UE\n"); -#endif - } - - for (n_id = id; n_id < omg_param_list.nodes + id; n_id++) { - - node = create_node (); - mobility = create_mobility (); - node->mobile = 0; // 0 means inactive in SUMO; 1 means active in SUMO; as long as a mapping between OAI-SUMO has not been created, nodes are inactive and do not move - node->id = n_id; // this is OAI ID, not SUMO - node->type = omg_param_list.nodes_type; // UE eNB... - node->generator = SUMO; // SUMO - node->mob = mobility; - - // FIXME! wrong use of node_vector and node_vector_end - // FIXME node_vector_end is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types - // FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types - - node_vector_end[SUMO] = - (node_list *) add_entry (node, node_vector_end[SUMO]); - - if (node_vector[SUMO] == NULL) - node_vector[SUMO] = node_vector_end[SUMO]; - } - - id += omg_param_list.nodes; - - update_IDs (); // update the mapping between departed and arrived nodes in SUMO. - - return (0); -} - -void -update_IDs (void) -{ -#ifdef STANDALONE - printf ("Updating the ID mapping between SUMO and OAI\n"); -#else - LOG_D (OMG, "Updating the ID mapping between SUMO and OAI\n"); -#endif - string_list *tmp_arrived, *tmp_departed; - - if (arrived == NULL) { - printf ("arrived vehicles is NULL \n"); - return; - } - - tmp_arrived = arrived; - tmp_departed = departed; - - if (departed == NULL) { - printf ("departed vehicles is NULL \n"); - return; - } - - if (tmp_departed->string != NULL) { - // char *tmp_string = malloc (sizeof (strlen (tmp_departed->string))); - char *tmp_string = malloc( strlen(tmp_departed->string) + 1 ); - strcpy (tmp_string, tmp_departed->string); - //printf("OMG - 2 head is not null and value is: %s\n",tmp_string); - int OAI_ID = get_oaiID_by_SUMO (tmp_string, id_manager); - - if (OAI_ID == -1) { - if (!activate_and_map (tmp_string)) { - // printf("Reached the Maximum of OAI nodes to be mapped to SUMO\n"); - // LOG_I(OMG, "Reached the Maximum of OAI nodes to be mapped to SUMO\n"); - free( tmp_string ); - return; // stopping mapping as the maximum of OAI nodes has been reached; - } - - } - - free( tmp_string ); - } - - while (tmp_departed->next != NULL) { - // printf("OMG - 2 main is not null \n"); - //char tmp_string [strlen(tmp_departed->string)]; - //char *tmp_string = malloc (sizeof (strlen (tmp_departed->string))); - char *tmp_string = malloc( strlen(tmp_departed->string) + 1 ); - strcpy (tmp_string, tmp_departed->string); - //char *tmp_string = tmp_departed->string; - int OAI_ID = get_oaiID_by_SUMO (tmp_string, id_manager); - - if (OAI_ID == -1) { - if (!activate_and_map (tmp_string)) { - //printf("Reached the Maximum of OAI nodes to be mapped to SUMO\n"); - //LOG_I(OMG, "Reached the Maximum of OAI nodes to be mapped to SUMO\n"); - free( tmp_string ); - return; // stopping mapping as the maximum of OAI nodes has been reached; - } - } - - free( tmp_string ); - tmp_departed = tmp_departed->next; - } - - departed = clear_string_list (departed); - - if (tmp_arrived->string != NULL) { - char *tmp_string = tmp_arrived->string; - //printf("OMG - 3 head is not null and value is: %s\n",tmp_arrived->string); - - if (!desactivate_and_unmap (tmp_string)) { - printf ("Could not locate the OAI node ID %s \n", tmp_string); - //LOG_I(OMG, "Could not locate the OAI node ID %s \n", tmp_string); - } - - } - - while (tmp_arrived->next != NULL) { - char *tmp_string = tmp_arrived->string; - - if (!desactivate_and_unmap (tmp_string)) { - printf ("Could not locate the OAI node\n"); - // LOG_I(OMG, "Could not locate the OAI node\n"); - } - - tmp_arrived = tmp_arrived->next; - } - - arrived = clear_string_list (arrived); - -} - -bool -desactivate_and_unmap (char *sumo_id) -{ -#ifdef STANDALONE - printf ("desactivating node %s \n", sumo_id); -#else - LOG_I (OMG, "desactivating node %s \n", sumo_id); -#endif - int OAI_ID = get_oaiID_by_SUMO (sumo_id, id_manager); - remove_oaiID_by_SUMO (sumo_id, id_manager); - - if (OAI_ID != -1) { - //TODO generalize to UE and eNB (must change the method) - - // FIXME! wrong use of node_vector - // FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types - node_struct *node = find_node (node_vector[SUMO], OAI_ID, UE); - - if (node == NULL) - node = find_node (node_vector[SUMO], OAI_ID, eNB); - - if (node != NULL) { - node->mobile = 0; // this node is now inactive; - active_nodes = remove_node_entry (node, active_nodes); - return true; - } - - } - -#ifdef STANDALONE - printf - ("Could not desactive an OAI node, as the SUMO-OAI mapping could not be found for the SUMO node ID %s \n", - sumo_id); -#else - LOG_I (OMG, - "Could not desactive an OAI node, as the SUMO-OAI mapping could not be found for the SUMO node ID %s \n", - sumo_id); -#endif - - return false; -} - - -bool -activate_and_map (char *sumo_id) -{ - MapPtr map = create_map (); -#ifdef STANDALONE - printf ("activating node %s \n", sumo_id); -#else - LOG_I (OMG, "activating node %s \n", sumo_id); -#endif - // TODO: So far, only UE can be SUMO mobile, but could change - AssertFatal( false, "node_vector array has only MAX_NUM_NODE_TYPES (=3) elements, but indexing here with SUMO (=4)"); - node_struct *active_node = get_first_inactive_OAI_node (node_vector[SUMO], UE); - - if (active_node != NULL) { - // found an inactive OAI node; will be mapped to SUMO - active_node->mobile = 1; // now node is active in SUMO - - active_nodes = add_entry (active_node, active_nodes); - - map->oai_id = active_node->id; - // map->sumo_id = malloc (sizeof ((int) strlen (sumo_id))); - map->sumo_id = malloc( strlen(sumo_id) + 1 ); - strcpy (map->sumo_id, sumo_id); - -#ifdef STANDALONE - printf ("added a mapping between oai ID: %d and SUMO ID: %s \n", - map->oai_id, map->sumo_id); -#else - LOG_I (OMG, "added a mapping between oai ID: %d and SUMO ID: %s \n", - map->oai_id, map->sumo_id); -#endif - - // TODO fusion the two lists...leads to data inconsistency - // FIXME adding the same memory region to two lists => crash at free() time - id_manager->map_sumo2oai = - add_map_entry (map, id_manager->map_sumo2oai); - - id_manager->map_oai2sumo = add_map_entry (map, id_manager->map_oai2sumo); //map_sumo2oai - - return true; - - } - - else { -#ifdef STANDALONE - printf - ("All OAI Nodes are already active in SUMO; cannot control this SUMO node in OAI\n"); -#else - LOG_I (OMG, - "All OAI Nodes are already active in SUMO; cannot control this SUMO node in OAI\n"); -#endif - return false; - } -} - - -void -update_sumo_nodes (double cur_time) -{ - if ((cur_time - last_update_time) < MIN_SUMO_STEP) { - // the min time interval for SUMO must be 100ms or more - printf ("--------Update Step too small--------\n"); - return; - } - - last_update_time = cur_time; // keeps track of the last update time to get the update interval - - // commandSimulationStep(1.0);// Advance the SUMO simulation by cur_time units - - - commandSimulationStep (cur_time); // Advance the SUMO simulation by cur_time units - - LOG_I (OMG, "--------Updated SUMO positions by %f [ms]--------\n", - cur_time); - update_IDs (); // both are in the traCI client - - -} - -void -update_sumo_positions (node_struct * node) -{ - - - -#ifdef STANDALONE - printf ("--------GET SUMO Mobility for a single node--------\n"); -#else - LOG_D (OMG, "--------GET SUMO Mobility for a single node--------\n"); -#endif - - Map_list tmp = id_manager->map_oai2sumo; - char *sumo_id = get_sumo_entry (node->id, tmp); - - if (sumo_id != NULL) { - //printf(" OAI ID is: %d and SUMO ID is %s \n",node->ID, sumo_id); - GetPosition (node, sumo_id); - GetSpeed (node, sumo_id); - } -} - -node_list * -get_sumo_positions_updated (double cur_time) -{ - - -#ifdef STANDALONE - printf - ("--------GET SUMO Mobility for a group of ACTIVE OAI nodes--------\n"); -#else - LOG_I (OMG, - "--------GET SUMO Mobility for a group of ACTIVE OAI nodes--------\n"); -#endif - - // FIXME! wrong use of node_vector - // FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types - if (node_vector[SUMO] != NULL) { - node_list *tmp = node_vector[SUMO]; - - while (tmp != NULL) { - if ((tmp->node->generator == SUMO) && (tmp->node->mobile == 1)) { - // OAI node MUST be active - LOG_I (OMG, "found an active node with id %d \n", - tmp->node->id); - LOG_I (OMG, "Old Positions \n"); - //printf("Old Positions \n"); - display_node_position (tmp->node->id, tmp->node->generator, - tmp->node->type, tmp->node->mobile, - tmp->node->x_pos, tmp->node->y_pos); - - update_sumo_positions (tmp->node); - - //printf("New Positions \n"); - LOG_I (OMG, "New Positions \n"); - display_node_position (tmp->node->id, tmp->node->generator, - tmp->node->type, tmp->node->mobile, - tmp->node->x_pos, tmp->node->y_pos); - } - - tmp = tmp->next; - } - } - - return active_nodes; -} - -node_struct * -get_first_inactive_OAI_node (node_list * list, int node_type) -{ - node_list *current; - - if (list != NULL) { - //start search - current = list; - - while (current->next != NULL) { - if ((current->node->mobile == 0) - && (current->node->type == node_type)) { - return current->node; - } - - current = current->next; - } - } - - return NULL; // all nodes are active already..reached the maximum number of OAI nodes -} - -bool -stop_sumo_generator (void) -{ -#ifdef STANDALONE - printf - (" --------Destructor for SUMO: closing the TraCI socket and killing SUMO ---- \n"); -#else - LOG_I (OMG, - " --------Destructor for SUMO: closing the TraCI socket and killing SUMO ---- \n"); -#endif - commandClose (); // closing the connection with SUMO via TraCI - close_connection (); // closing the socket connection - kill (pid, SIGKILL); // killing SUMO in case it could not close by itself - return true; -} diff --git a/openair2/UTIL/OMG/sumo.h b/openair2/UTIL/OMG/sumo.h deleted file mode 100644 index defe67f528..0000000000 --- a/openair2/UTIL/OMG/sumo.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file sumo.h -* \brief The OMG interface to SUMO (Simulation of Urban Mobility) -* \author S. Uppoor, J. Harri -* \date 2012 -* \version 0.1 -* \company INRIA, Eurecom -* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr -* \note -* \warning -*/ - -#ifndef SUMO_H_ -#define SUMO_H_ - -#include "omg.h" -#include "id_manager.h" -#include - -#define MIN_SUMO_STEP 100 // 100ms is the smallest allowed SUMO update step - -/*! A global variable used to store the SUMO process ID to later kill it smoothly when OAI askes OMG to stop SUMO*/ -pid_t pid; - -/*! A sumo global variable representing the OMG-SUMO ID manager. It is created at the start_sumo_generator(void) and keep a mapping between SUMO and OAI IDs. */ -IDManagerPtr id_manager; - -/*! A Node_list intended to contain the list of OAI 'active' nodes in SUMO. replaces the return of the full Node_Vector when OAI requests the new positions of its nodes. The list is reset at each use, but the pointer to the respective nodes is just set to NULL*/ -node_list* active_nodes; - -/*! A global variable keeping track of the last update time of SUMO, to be used to get the update interval when update_sumo_nodes(cur_time) is called */ -double last_update_time; - -/** - * \fn void start_sumo_generator(omg_global_param omg_param_list) - * \brief Start SUMO by setting the initial positions of each node then letting it sleep till it departs to its destination and add this job to the Job_Vector - * \param omg_param_list a structure that contains the main parameters needed to establish the random positions distribution - */ -int start_sumo_generator(omg_global_param omg_param_list) ; - -/** - * \fn void update_sumo(double cur_time) - * \brief Update SUMO simulation time by x timesteps. After advancing the SUMO for the next timestep, SUMO will automatically update all nodes positions. - * Note that the SUMO positions are kept by SUMO. One need to specifically query SUMO to get them. - * \param cur_time a variable of type double that represents the current time - */ -void update_sumo_nodes(double cur_time) ; - -/** - * \fn void get_sumo_positions(NodePtr node) - * \brief Get the current position and speed of a node from SUMO. Invokes TraCI - * \param node the pointer to a node we want to synch with SUMO. - */ -void update_sumo_positions(node_struct* node); - -/** - * \fn Node_list get_sumo_positions_updated(double cur_time); - * \brief Get the current position and speed of a list of nodes. First, OMG retrieves the list of ACTIVE nodes, and second it updates their position from SUMO. Invokes TraCI - * \param cur_time a variable of type double that represents the current time - * \return the list of ACTIVE OAI nodes, which positions have been updated by SUMO - */ -node_list* get_sumo_positions_updated(double cur_time); - -/** - * \fn NodePtr get_first_inactive_OAI_node(Node_list list, int node_type) - * \brief Get the first inactive OAI node to map it to a new SUMO node. An inactive OAI node has its mobility flag set to '0'. - * \param node the pointer to the Node_Vector containing all OAI nodes - * \param node_type the type of node we would like to locate (here: SUMO) - * \return the reference to the first inactive OAI node; returns NULL is none could be found (all OAI nodes are currently active) - */ -node_struct* get_first_inactive_OAI_node(node_list* list, int node_type); - -/** - * \fn void update_IDs(String_list *departed, String_list *arrived) - * \brief Updates the mapping between SUMO and OAI nodes; Once a node departs in SUMO, it is mapped to a inactive OAI node. If none are found, the SUMO node will not have any mapping. Once a node arrives, the mapping is removed and the OAI node becomes inactive again. When an OAI node is inactive, it mobility parameters are invalid and MUST NOT be used/requested by OAI. - */ -void update_IDs(void); - -/** - * \fn bool desactive_and_unmap(char *sumo_id) - * \brief desactivates an OAI node as it is no longer in SUMO; will be recycled by a new SUMO node in the future; - * \param sumo_id the string representing the SUMO ID of the OAI node; - * \return true in case of success; false otherwise; - */ -bool desactivate_and_unmap(char *sumo_id); - -/** - * \fn bool activate_and_map(void) - * \brief activated an OAI node as a SUMO node entered in SUMO; Conceptually, this represents adding a communication device (OAI) to a SUMO node; - * It will find the first inactive OAI node, activates it and add the sumo mapping; - * \param sumo_id the string representing the SUMO ID of the OAI node; - * \return true in case of success; false if the maximum of OAI node has been reached - */ -bool activate_and_map(char *sumo_id); - -/** - * \fn int stop_sumo_generator(void) - * \brief stops SUMO, stop the socket and kills SUMO process in the child domain. - * \return true in case of success; false otherwise - */ -bool stop_sumo_generator(void); - -#endif /* SUMO_H_ */ From b0887a1b85ed4c23c5ff5809abde80446dd0b7bb Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 10 Oct 2016 16:33:12 +0200 Subject: [PATCH 314/340] issue 137 - correct computation of G G was wrongly computed in some places, not taking into account CQI and RI bits. This commit saves the correct value computed in ulsch_decoding so we can reuse it in ulsch_decoding_data (and the like). Only the file openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c has been checked. If the computation is done somewhere else the problem might still exist. --- openair1/PHY/LTE_TRANSPORT/defs.h | 2 ++ openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 26e2d40460..0cd98f98a9 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -374,6 +374,8 @@ typedef struct { uint32_t TBS; /// The payload + CRC size in bits uint32_t B; + /// Number of soft channel bits + uint32_t G; /// CQI CRC status uint8_t cqi_crc_status; /// Pointer to CQI data diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index afcce70b7f..45117a64c2 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -236,7 +236,7 @@ int ulsch_decoding_data_2thread0(td_params* tdp) { LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; int Q_m = get_Qm_ul(ulsch_harq->mcs); - int G = ulsch_harq->nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch; + int G = ulsch_harq->G; uint32_t E; uint32_t Gp,GpmodC,Nl=1; uint32_t C = ulsch_harq->C; @@ -458,7 +458,7 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; int Q_m = get_Qm_ul(ulsch_harq->mcs); - int G = ulsch_harq->nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch; + int G = ulsch_harq->G; unsigned int E; int Cby2; @@ -666,7 +666,7 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag) LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; int Q_m = get_Qm_ul(ulsch_harq->mcs); - int G = ulsch_harq->nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch; + int G = ulsch_harq->G; unsigned int E; uint8_t (*tc)(int16_t *y, @@ -1044,6 +1044,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, #endif G = G - Q_RI - Q_CQI; + ulsch_harq->G = G; if ((int)G < 0) { LOG_E(PHY,"FATAL: ulsch_decoding.c G < 0 (%d) : Q_RI %d, Q_CQI %d\n",G,Q_RI,Q_CQI); From 190fc96af4fb5663134e7318a47e1893d4f1184c Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 10 Oct 2016 16:36:52 +0200 Subject: [PATCH 315/340] issue 137 - fix RI bits decoding RI bits are present only in some transmission modes. For aperiodic reporting (the mode we do as of today), 36.213 7.2.1 (release 10) says: "RI is only reported for transmission modes 3 and 4, as well as transmission modes 8 and 9 with PMI/RI reporting" This commit activates decoding of RI bits only for transmission modes 3 and 4. 8 and 9 are not done today (as far as I know). --- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 2f578d9cc1..8f4bc4d45f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -7213,7 +7213,17 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, if (cqi_req == 1) { - ulsch->harq_processes[harq_pid]->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table + /* 36.213 7.2.1 (release 10) says: + * "RI is only reported for transmission modes 3 and 4, + * as well as transmission modes 8 and 9 with PMI/RI reporting" + * This is for aperiodic reporting. + * TODO: deal with TM 8&9 correctly when they are implemented. + * TODO: deal with periodic reporting if we implement it. + */ + if (transmission_mode == 3 || transmission_mode == 4) + ulsch->harq_processes[harq_pid]->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table + else + ulsch->harq_processes[harq_pid]->O_RI = 0; switch(transmission_mode) { // The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling From 5894f3e6c213cf71b90bb18f9964f8dccf67ecb4 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Mon, 10 Oct 2016 16:40:42 +0200 Subject: [PATCH 316/340] issue 137 - remove hack: MCS reduction in case of CQI reporting This hack was probably put in place in an attempt to circumvent problems solved by previous commits. As far as I checked (with my knowledge of the day) we can't exhaust uplink physical bits with ULSCH data bits when there is CQI reporting at the same time. To be refined if this idea is proved wrong. --- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index aa3b5554e2..b6395fe191 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -838,9 +838,6 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul; mcs = UE_template->pre_assigned_mcs_ul;//cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS - if ((cqi_req==1) && (mcs>19)) { - mcs=19; - } if (UE_template->pre_allocated_rb_table_index_ul >=0) { rb_table_index=UE_template->pre_allocated_rb_table_index_ul; } else { From ef67b3a0a97079397260504f2e233b15006f8fc3 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 11 Oct 2016 12:29:15 +0200 Subject: [PATCH 317/340] hotfix: reserve RBs in Random Access Response case The RBs were not marked as used. A later UE downlink scheduling could use those RBs, messing up everything. Not sure this is the right place to mark them used. Maybe better to do it in the "if (!CCE_allocation_infeasible" test. --- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 64c5bc12b5..36940acd0f 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -114,7 +114,11 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un RA_template->RA_dci_fmt1, RA_template->RA_dci_size_bits1); - + first_rb = 0; + vrb_map[first_rb] = 1; + vrb_map[first_rb+1] = 1; + vrb_map[first_rb+2] = 1; + vrb_map[first_rb+3] = 1; if (PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.frame_type == TDD) { switch(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL) { From 4c100a291b404a796f9135589a6c3656f8a98dd3 Mon Sep 17 00:00:00 2001 From: Rohit Gupta Date: Tue, 11 Oct 2016 14:10:40 +0200 Subject: [PATCH 318/340] add license to autotest framework + delete files not used in project --- .../autotests/run_compilation_autotests.bash | 22 + .../configure_cots_sony_experia_m4_ue.py | 22 + cmake_targets/autotests/tools/git-retry.sh | 22 + cmake_targets/autotests/tools/run_gdb | 23 + cmake_targets/tools/stop_exmimo2 | 22 + openair2/RRM_4_RRC_LITE/ChangeLog | 0 openair2/RRM_4_RRC_LITE/Makefile | 169 - .../Makefile.Defines.linux-x86-32 | 25 - .../Makefile.Defines.linux-x86-64 | 27 - openair2/RRM_4_RRC_LITE/Makefile.am | 8 - openair2/RRM_4_RRC_LITE/Makefile.cvs | 9 - openair2/RRM_4_RRC_LITE/Makefile.objs | 547 - openair2/RRM_4_RRC_LITE/NEWS | 0 openair2/RRM_4_RRC_LITE/README | 15 - openair2/RRM_4_RRC_LITE/configure.ac | 147 - openair2/RRM_4_RRC_LITE/src/com/Message.cpp | 662 - openair2/RRM_4_RRC_LITE/src/com/Message.h | 129 - .../src/com/asn1/Makefile.am.sample | 870 - .../RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn | 194 - ...2RRMMessageAddRadioAccessBearerConfirm.cpp | 93 - ...RC2RRMMessageAddRadioAccessBearerConfirm.h | 63 - ...2RRMMessageAddRadioAccessBearerRequest.cpp | 117 - ...RC2RRMMessageAddRadioAccessBearerRequest.h | 94 - .../com/rrc/RRC2RRMMessageAddUserConfirm.cpp | 109 - .../com/rrc/RRC2RRMMessageAddUserConfirm.h | 56 - .../com/rrc/RRC2RRMMessageAddUserRequest.cpp | 111 - .../com/rrc/RRC2RRMMessageAddUserRequest.h | 55 - .../rrc/RRC2RRMMessageConnectionRequest.cpp | 108 - .../com/rrc/RRC2RRMMessageConnectionRequest.h | 49 - ...MMessageRemoveRadioAccessBearerRequest.cpp | 97 - ...RRMMessageRemoveRadioAccessBearerRequest.h | 72 - .../rrc/RRC2RRMMessageRemoveUserRequest.cpp | 93 - .../com/rrc/RRC2RRMMessageRemoveUserRequest.h | 60 - ...2RRMMessageUserReconfigurationComplete.cpp | 120 - ...RC2RRMMessageUserReconfigurationComplete.h | 58 - .../src/com/rrc/RRCMessageHandler.cpp | 143 - .../src/com/rrc/RRCMessageHandler.h | 57 - .../src/com/rrc/RRCUdpSocket.cpp | 37 - .../RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h | 37 - ...RRCMessageAddRadioAccessBearerResponse.cpp | 128 - ...M2RRCMessageAddRadioAccessBearerResponse.h | 84 - .../com/rrc/RRM2RRCMessageAddUserResponse.cpp | 122 - .../com/rrc/RRM2RRCMessageAddUserResponse.h | 67 - .../rrc/RRM2RRCMessageConnectionResponse.cpp | 122 - .../rrc/RRM2RRCMessageConnectionResponse.h | 62 - ...MessageRemoveRadioAccessBearerResponse.cpp | 128 - ...RCMessageRemoveRadioAccessBearerResponse.h | 84 - .../rrc/RRM2RRCMessageRemoveUserResponse.cpp | 123 - .../rrc/RRM2RRCMessageRemoveUserResponse.h | 82 - .../rrc/RRM2RRCMessageUserReconfiguration.cpp | 129 - .../rrc/RRM2RRCMessageUserReconfiguration.h | 67 - .../src/com/rrm/RRMMessageHandler.cpp | 136 - .../src/com/rrm/RRMMessageHandler.h | 57 - .../src/com/rrm/RRMUdpSocket.cpp | 38 - .../RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h | 37 - .../ASN1_files/36331-860.txt | 7503 - .../ASN1_files/EUTRA-InterNodeDefinitions.asn | 121 - .../ASN1_files/EUTRA-RRC-Definitions.asn | 2638 - .../ASN1_files/EUTRA-UE-Variables.asn | 47 - .../generated_c_asn1_rrc/Makefile.am.sample | 816 - .../src/foreign/sql/Makefile.am | 3 - .../RRM_4_RRC_LITE/src/foreign/sql/sqlite3.c | 134854 --------------- .../RRM_4_RRC_LITE/src/foreign/sql/sqlite3.h | 6329 - .../src/foreign/tcpip/Makefile.am | 4 - .../src/foreign/tcpip/socket.cpp | 638 - .../RRM_4_RRC_LITE/src/foreign/tcpip/socket.h | 149 - .../src/foreign/tcpip/socketUnitTests.cpp | 145 - .../src/foreign/tcpip/storage.cpp | 416 - .../src/foreign/tcpip/storage.h | 136 - .../src/foreign/tcpip/tcpipUnitTests.cpp | 350 - openair2/RRM_4_RRC_LITE/src/platform.h | 30 - .../RRM_4_RRC_LITE/src/platform_constants.h | 33 - .../RRM_4_RRC_LITE/src/platform_defines.h | 80 - openair2/RRM_4_RRC_LITE/src/platform_dim.h | 37 - .../src/radio_resources/Asn1Utils.cpp | 179 - .../src/radio_resources/Asn1Utils.h | 46 - .../src/radio_resources/Command.cpp | 183 - .../src/radio_resources/Command.h | 79 - .../src/radio_resources/DataRadioBearer.cpp | 22 - .../src/radio_resources/DataRadioBearer.h | 60 - .../src/radio_resources/ENodeB.cpp | 664 - .../src/radio_resources/ENodeB.h | 123 - .../src/radio_resources/Exceptions.h | 51 - .../src/radio_resources/LogicalChannel.cpp | 39 - .../src/radio_resources/LogicalChannel.h | 85 - .../src/radio_resources/Mobile.cpp | 337 - .../src/radio_resources/Mobile.h | 118 - .../src/radio_resources/RadioBearer.cpp | 187 - .../src/radio_resources/RadioBearer.h | 136 - .../src/radio_resources/RadioResources.cpp | 306 - .../src/radio_resources/RadioResources.h | 85 - .../radio_resources/SignallingRadioBearer.cpp | 22 - .../radio_resources/SignallingRadioBearer.h | 60 - .../src/radio_resources/Transaction.cpp | 110 - .../src/radio_resources/Transaction.h | 69 - .../src/radio_resources/Transactions.cpp | 92 - .../src/radio_resources/Transactions.h | 50 - openair2/RRM_4_RRC_LITE/src/rrm.cpp | 50 - .../RRM_4_RRC_LITE/src/test/TestScenario.cpp | 299 - .../RRM_4_RRC_LITE/src/test/TestScenario.h | 44 - openair2/RRM_4_RRC_LITE/src/test/test.cpp | 55 - openair2/RRM_4_RRC_LITE/src/version.h | 22 - 102 files changed, 111 insertions(+), 163799 deletions(-) delete mode 100755 openair2/RRM_4_RRC_LITE/ChangeLog delete mode 100755 openair2/RRM_4_RRC_LITE/Makefile delete mode 100755 openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-32 delete mode 100755 openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-64 delete mode 100755 openair2/RRM_4_RRC_LITE/Makefile.am delete mode 100755 openair2/RRM_4_RRC_LITE/Makefile.cvs delete mode 100755 openair2/RRM_4_RRC_LITE/Makefile.objs delete mode 100755 openair2/RRM_4_RRC_LITE/NEWS delete mode 100755 openair2/RRM_4_RRC_LITE/README delete mode 100755 openair2/RRM_4_RRC_LITE/configure.ac delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/Message.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/Message.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/com/asn1/Makefile.am.sample delete mode 100755 openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/36331-860.txt delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-InterNodeDefinitions.asn delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-UE-Variables.asn delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/Makefile.am.sample delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sql/Makefile.am delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sql/sqlite3.c delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/sql/sqlite3.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/tcpip/Makefile.am delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/tcpip/socket.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/tcpip/socket.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/tcpip/socketUnitTests.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/tcpip/storage.cpp delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/tcpip/storage.h delete mode 100755 openair2/RRM_4_RRC_LITE/src/foreign/tcpip/tcpipUnitTests.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/platform.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/platform_constants.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/platform_defines.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/platform_dim.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Asn1Utils.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Command.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Command.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/DataRadioBearer.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/ENodeB.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Exceptions.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/LogicalChannel.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Mobile.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/RadioBearer.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/RadioResources.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/SignallingRadioBearer.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Transaction.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/radio_resources/Transactions.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/rrm.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/test/TestScenario.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/test/TestScenario.h delete mode 100644 openair2/RRM_4_RRC_LITE/src/test/test.cpp delete mode 100644 openair2/RRM_4_RRC_LITE/src/version.h diff --git a/cmake_targets/autotests/run_compilation_autotests.bash b/cmake_targets/autotests/run_compilation_autotests.bash index a7b056dc81..a6a861cb60 100755 --- a/cmake_targets/autotests/run_compilation_autotests.bash +++ b/cmake_targets/autotests/run_compilation_autotests.bash @@ -1,4 +1,26 @@ #!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta if [ -s $OPENAIR_DIR/cmake_targets/tools/build_helper ] ; then source $OPENAIR_DIR/cmake_targets/tools/build_helper diff --git a/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py b/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py index 46ee33e97a..42ed5fdeba 100755 --- a/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py +++ b/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py @@ -1,4 +1,26 @@ #!/usr/bin/python +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta import time import serial diff --git a/cmake_targets/autotests/tools/git-retry.sh b/cmake_targets/autotests/tools/git-retry.sh index b897ba379d..9f4d96af8d 100755 --- a/cmake_targets/autotests/tools/git-retry.sh +++ b/cmake_targets/autotests/tools/git-retry.sh @@ -1,4 +1,26 @@ #!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta #Simple script to retry git clone in case of failure diff --git a/cmake_targets/autotests/tools/run_gdb b/cmake_targets/autotests/tools/run_gdb index a12d6ce21d..9dea2d350c 100755 --- a/cmake_targets/autotests/tools/run_gdb +++ b/cmake_targets/autotests/tools/run_gdb @@ -1,4 +1,27 @@ #!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta + #arg0 -> Name of executable #args[1...N] -> arguments to be passed to executable diff --git a/cmake_targets/tools/stop_exmimo2 b/cmake_targets/tools/stop_exmimo2 index 102c9e0680..85d9bec309 100755 --- a/cmake_targets/tools/stop_exmimo2 +++ b/cmake_targets/tools/stop_exmimo2 @@ -1,4 +1,26 @@ #!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.0 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta echo "This script stops exmimo2 as it might be transmitting signal by itself if lte-softmodem terminates incorrectly" diff --git a/openair2/RRM_4_RRC_LITE/ChangeLog b/openair2/RRM_4_RRC_LITE/ChangeLog deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/openair2/RRM_4_RRC_LITE/Makefile b/openair2/RRM_4_RRC_LITE/Makefile deleted file mode 100755 index 91a204cb73..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile +++ /dev/null @@ -1,169 +0,0 @@ -PLATFORM = linux-x86-32 -NUM_PROC = $(shell echo `cat /proc/cpuinfo | grep processor | wc -l`) -NUM_PROC = 1 - -LIBS = -L/usr/local/lib -Llib -lSockets -lasn1rrc -lpthread -lssl -lcrypto -lssl -lxml2 - -#------------------------------------------------ -# DIRS -#------------------------------------------------ -UPDIR := $(shell /bin/pwd) -BIN_DIR = bin -SRC_DIR = $(UPDIR)/src -COM_DIR = $(SRC_DIR)/com -FOREIGN_DIR = $(SRC_DIR)/foreign -SOCKETS_DIR = $(FOREIGN_DIR)/sockets-2.3.9.4 -TCPIP_DIR = $(FOREIGN_DIR)/tcpip -SQL_DIR = $(FOREIGN_DIR)/sql -ASN1_RRC_SPEC_DIR = $(FOREIGN_DIR)/generated_c_asn1_rrc/ASN1_files -RRC_RRM_ASN1_DIR = $(COM_DIR)/asn1 -RADIO_RESOURCES_DIR = $(SRC_DIR)/radio_resources -RRC_DIR = ../RRC/LITE -TEST_DIR = $(SRC_DIR)/test - - -#------------------------------------------------ -# INCLUDES -#------------------------------------------------ -include Makefile.objs -include Makefile.Defines.$(PLATFORM) -INCLUDE = -I$(SRC_DIR) -I$(SOCKETS_DIR) -I$(SQL_DIR) -I$(COM_DIR) -I$(COM_DIR)/rrc -I$(COM_DIR)/rrm \ --I$(TCPIP_DIR) -I$(RADIO_RESOURCES_DIR) -I$(RRC_RRM_ASN1_DIR) -I$(TEST_DIR) - - -#------------------------------------------------ -# CFLAGS -#------------------------------------------------ - -CPPFLAGS = $(CFLAGS) -#CPPFLAGS += -fpermissive -std=gnu++98 - -#------------------------------------------------ -# LIBS -#------------------------------------------------ -libasn1rrc: libasn1rrc.a - mv libasn1rrc.a lib - -libsqlite: libsqlite.a - mv libsqlite.a lib - - -libSockets: libSockets.a - mv libSockets.a lib - - -libasn1rrc.a: $(ASN1RRC_OBJS) - ar cru $@ $^ - ranlib $@ - -libSockets.a: $(SOCKETS_OBJS) - ar cru $@ $^ - ranlib $@ - -libsqlite.a: $(SQLITE_OBJS) - ar cru $@ $^ - ranlib $@ - -LDFLAGS += -rdynamic - -#------------------------------------------------ -# PROGS -#------------------------------------------------ -PROGS = rrm_exe test_exe - -gen-c-from-asn1: - #-fbless-SIZE - # Allow SIZE() constraint for INTEGER, ENUMERATED, and other types - # for which this constraint is normally prohibited by the stan- - # dard. This is a violation of ASN.1 standard, and the compiler - # may fail to produce a meaningful code. - - #-fcompound-names - # Using this option prevents name collisions in the target source - # code by using complex names for target language structures. - # (Name collisions may occur if the ASN.1 module reuses the same - # identifiers in multiple contexts). - - #-findirect-choice - # When generating code for a CHOICE type, compile the CHOICE mem- - # bers as indirect pointers instead of declaring them inline. Con- - # sider using this option together with -fno-include-deps to pre- - # vent circular references. - - #-fknown-extern-type= - # Pretend the specified type is known. The compiler will assume - # the target language source files for the given type have been - # provided manually. - - #-fno-constraints - # Do not generate ASN.1 subtype constraint checking code. This may - # make a shorter executable. - - #-fno-include-deps - # Do not generate courtesy #include lines for non-critical type - # dependencies. Helps prevent namespace collisions. - - #-funnamed-unions - # Enable unnamed unions in the definitions of target language's - # structures. - #cd $(RRC_RRM_ASN1_DIR);asn1c -gen-PER -fcompound-names -fnative-types -fskeletons-copy $(ASN1_RRC_SPEC_DIR)/EUTRA-RRC-Definitions.asn $(RRC_RRM_ASN1_DIR)/rrc-rrm.asn; cd - - cd $(RRC_RRM_ASN1_DIR);asn1c -gen-PER -fno-include-deps -fcompound-names -fnative-types -fskeletons-copy $(ASN1_RRC_SPEC_DIR)/EUTRA-RRC-Definitions.asn $(RRC_RRM_ASN1_DIR)/rrc-rrm.asn; cd - - - -libs: - make -j$(NUM_PROC) libasn1rrc libsqlite libSockets - - -all: libs - make -j$(NUM_PROC) $(PROGS) - - -rrm: $(RRM_OBJS) lib/libSockets.a lib/libasn1rrc.a - g++ -o $@ $^ $(LIBS) - mv rrm $(BIN_DIR) - -rrm_exe: clean_test_objs - make -j$(NUM_PROC) rrm - - - -clean_test_objs: - find $(COM_DIR)/rrc/ -name '*Response.o' -delete -print; - find $(COM_DIR)/rrc/ -name '*Reconfiguration.o' -delete -print; - -dummy_rrc: CFLAGS += -DTEST_SCENARIO=1 - -dummy_rrc: $(TEST_OBJS) lib/libSockets.a lib/libasn1rrc.a - g++ -o $@ $^ $(LIBS) - mv dummy_rrc $(BIN_DIR) - -test_exe: clean_test_objs - make -j$(NUM_PROC) dummy_rrc - - - - - - -clean: - find -name '*.o' -delete -print; \ - find -name '*.bak' -delete -print; \ - find -name '*.d' -delete -print; \ - find -name '*~' -delete -print; \ - rm -f bin/*; \ - rm -f lib/* - -cleanrrm: - find src/com/rrc -name '*.o' -delete -print; \ - find src/com/rrm -name '*.o' -delete -print; \ - find src/com -name 'Message.o' -delete -print; \ - find src/radio_resources -name '*.o' -delete -print; \ - find src/com -name '*.bak' -delete -print; \ - find src/radio_resources -name '*.bak' -delete -print; \ - find src/com -name '*.d' -delete -print; \ - find src/radio_resources -name '*.d' -delete -print; \ - find src/com -name '*~' -delete -print; \ - find src/radio_resources -name '*~' -delete -print; \ - rm -f bin/*; \ - --include *.d diff --git a/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-32 b/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-32 deleted file mode 100755 index de2b2c4566..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-32 +++ /dev/null @@ -1,25 +0,0 @@ -CXX = g++-4.3 - -CFLAGS += -Wall -g $(INCLUDE) -MD -D_VERSION='"$(VERSION)"' - -# turn off optimization if compiling with gcc 2.9.x: -#CFLAGS += -O0 -#CFLAGS += -O2 - - -CFLAGS += -DLINUX - -#LG TEST REMOVECFLAGS += -fPIC - -LIBS += \ - -lssl -lcrypto \ - -lpthread - -LDFLAGSSO = -shared \ - -Wl,-lssl \ - -Wl,-lcrypto \ - -Wl,-lxml2 \ - -Wl,-lpthread \ - -Wl,-h$(SONAME) \ - -Wl,-call_shared - diff --git a/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-64 b/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-64 deleted file mode 100755 index 09b22075cc..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-64 +++ /dev/null @@ -1,27 +0,0 @@ -CXX = g++ - -CFLAGS += -Wall -g $(INCLUDE) -MD -D_VERSION='"$(VERSION)"' - -# turn off optimization if compiling with gcc 2.9.x: -#CFLAGS += -O0 -CFLAGS += -O2 - - -CFLAGS += -DLINUX -m64 - -CFLAGS += -fPIC - -LIBS += \ - -lssl -lcrypto \ - -lpthread - -OBJS += Semaphore.o - -LDFLAGSSO = -shared \ - -Wl,-lssl \ - -Wl,-lcrypto \ - -Wl,-lxml2 \ - -Wl,-lpthread \ - -Wl,-h$(SONAME) \ - -Wl,-call_shared - diff --git a/openair2/RRM_4_RRC_LITE/Makefile.am b/openair2/RRM_4_RRC_LITE/Makefile.am deleted file mode 100755 index 396720a90d..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -SUBDIRS = src - -EXTRA_DIST = README ChangeLog AUTHORS COPYING INSTALL NEWS - - - -rrm$(EXEEXT): - $(MAKE) -C src $@ diff --git a/openair2/RRM_4_RRC_LITE/Makefile.cvs b/openair2/RRM_4_RRC_LITE/Makefile.cvs deleted file mode 100755 index 8b9e1ebd3b..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.cvs +++ /dev/null @@ -1,9 +0,0 @@ -default: all - -all: - autoreconf -i - -clean: - rm -r aclocal.m4 autom4te.cache/ config.* configure depcomp install-sh missing src/config.h.in ltmain.sh INSTALL ; \ - find . -name Makefile.in -exec rm '{}' ';' - diff --git a/openair2/RRM_4_RRC_LITE/Makefile.objs b/openair2/RRM_4_RRC_LITE/Makefile.objs deleted file mode 100755 index d4dade4986..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.objs +++ /dev/null @@ -1,547 +0,0 @@ -ASN1RRC_OBJS= $(RRC_RRM_ASN1_DIR)/AC-BarringConfig.o \ - $(RRC_RRM_ASN1_DIR)/AccessStratumRelease.o \ - $(RRC_RRM_ASN1_DIR)/AdditionalSpectrumEmission.o \ - $(RRC_RRM_ASN1_DIR)/AllowedMeasBandwidth.o \ - $(RRC_RRM_ASN1_DIR)/AntennaInfoCommon.o \ - $(RRC_RRM_ASN1_DIR)/AntennaInfoDedicated.o \ - $(RRC_RRM_ASN1_DIR)/ARFCN-ValueCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/ARFCN-ValueEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/ARFCN-ValueGERAN.o \ - $(RRC_RRM_ASN1_DIR)/ARFCN-ValueUTRA.o \ - $(RRC_RRM_ASN1_DIR)/asn_codecs_prim.o \ - $(RRC_RRM_ASN1_DIR)/asn_SEQUENCE_OF.o \ - $(RRC_RRM_ASN1_DIR)/asn_SET_OF.o \ - $(RRC_RRM_ASN1_DIR)/BandclassCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/BandClassInfoCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/BandClassListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/BandClassPriority1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/BandClassPriorityHRPD.o \ - $(RRC_RRM_ASN1_DIR)/BandClassPriorityList1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/BandClassPriorityListHRPD.o \ - $(RRC_RRM_ASN1_DIR)/BandIndicatorGERAN.o \ - $(RRC_RRM_ASN1_DIR)/BandInfoEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/BandListEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-BCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-BCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-Config.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-DL-SCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-DL-SCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/ber_decoder.o \ - $(RRC_RRM_ASN1_DIR)/ber_tlv_length.o \ - $(RRC_RRM_ASN1_DIR)/ber_tlv_tag.o \ - $(RRC_RRM_ASN1_DIR)/BIT_STRING.o \ - $(RRC_RRM_ASN1_DIR)/BlackCellsToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/BlackCellsToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/BOOLEAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierBandwidthEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqListUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqListUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqsGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqsInfoGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqsInfoListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/CDMA2000-Type.o \ - $(RRC_RRM_ASN1_DIR)/CellChangeOrder.o \ - $(RRC_RRM_ASN1_DIR)/CellGlobalIdCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CellGlobalIdEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/CellGlobalIdGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CellGlobalIdUTRA.o \ - $(RRC_RRM_ASN1_DIR)/CellIdentity.o \ - $(RRC_RRM_ASN1_DIR)/CellIndexList.o \ - $(RRC_RRM_ASN1_DIR)/CellIndex.o \ - $(RRC_RRM_ASN1_DIR)/CellReselectionParametersCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CellReselectionPriority.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModListUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModListUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/constraints.o \ - $(RRC_RRM_ASN1_DIR)/constr_CHOICE.o \ - $(RRC_RRM_ASN1_DIR)/constr_SEQUENCE.o \ - $(RRC_RRM_ASN1_DIR)/constr_SEQUENCE_OF.o \ - $(RRC_RRM_ASN1_DIR)/constr_SET_OF.o \ - $(RRC_RRM_ASN1_DIR)/constr_TYPE.o \ - $(RRC_RRM_ASN1_DIR)/CounterCheck.o \ - $(RRC_RRM_ASN1_DIR)/CounterCheck-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/CounterCheckResponse.o \ - $(RRC_RRM_ASN1_DIR)/CounterCheckResponse-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/CQI-ReportConfig.o \ - $(RRC_RRM_ASN1_DIR)/CQI-ReportPeriodic.o \ - $(RRC_RRM_ASN1_DIR)/C-RNTI.o \ - $(RRC_RRM_ASN1_DIR)/CSFBParametersRequestCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CSFBParametersRequestCDMA2000-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/CSFBParametersResponseCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CSFBParametersResponseCDMA2000-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/CSFB-RegistrationParam1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/DedicatedInfoCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/DedicatedInfoNAS.o \ - $(RRC_RRM_ASN1_DIR)/DeltaFList-PUCCH.o \ - $(RRC_RRM_ASN1_DIR)/der_encoder.o \ - $(RRC_RRM_ASN1_DIR)/DL-AM-RLC.o \ - $(RRC_RRM_ASN1_DIR)/DL-CCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/DL-CCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/DL-DCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/DL-DCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/DLInformationTransfer.o \ - $(RRC_RRM_ASN1_DIR)/DLInformationTransfer-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/DL-UM-RLC.o \ - $(RRC_RRM_ASN1_DIR)/DRB-CountInfoList.o \ - $(RRC_RRM_ASN1_DIR)/DRB-CountInfo.o \ - $(RRC_RRM_ASN1_DIR)/DRB-CountMSB-InfoList.o \ - $(RRC_RRM_ASN1_DIR)/DRB-CountMSB-Info.o \ - $(RRC_RRM_ASN1_DIR)/DRB-Identity.o \ - $(RRC_RRM_ASN1_DIR)/DRB-ToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/DRB-ToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/DRB-ToReleaseList.o \ - $(RRC_RRM_ASN1_DIR)/DRX-Config.o \ - $(RRC_RRM_ASN1_DIR)/EstablishmentCause.o \ - $(RRC_RRM_ASN1_DIR)/ExplicitListOfARFCNs.o \ - $(RRC_RRM_ASN1_DIR)/FilterCoefficient.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityListEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityListUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityListUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/FreqsPriorityGERAN.o \ - $(RRC_RRM_ASN1_DIR)/FreqsPriorityListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/HandoverFromEUTRAPreparationRequest.o \ - $(RRC_RRM_ASN1_DIR)/HandoverFromEUTRAPreparationRequest-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/Handover.o \ - $(RRC_RRM_ASN1_DIR)/Hysteresis.o \ - $(RRC_RRM_ASN1_DIR)/IdleModeMobilityControlInfo.o \ - $(RRC_RRM_ASN1_DIR)/IMSI-Digit.o \ - $(RRC_RRM_ASN1_DIR)/IMSI.o \ - $(RRC_RRM_ASN1_DIR)/InitialUE-Identity.o \ - $(RRC_RRM_ASN1_DIR)/INTEGER.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqBandInfo.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqBandList.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqBlackCellList.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqCarrierFreqInfo.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqCarrierFreqList.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqNeighCellInfo.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqNeighCellList.o \ - $(RRC_RRM_ASN1_DIR)/InterRAT-BandInfo.o \ - $(RRC_RRM_ASN1_DIR)/InterRAT-BandList.o \ - $(RRC_RRM_ASN1_DIR)/IntraFreqBlackCellList.o \ - $(RRC_RRM_ASN1_DIR)/IntraFreqNeighCellInfo.o \ - $(RRC_RRM_ASN1_DIR)/IntraFreqNeighCellList.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersCDMA2000-1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersCDMA2000-HRPD.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersGERAN.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersUTRA-TDD128.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersUTRA-TDD384.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersUTRA-TDD768.o \ - $(RRC_RRM_ASN1_DIR)/LogicalChannelConfig.o \ - $(RRC_RRM_ASN1_DIR)/MAC-MainConfig.o \ - $(RRC_RRM_ASN1_DIR)/MasterInformationBlock.o \ - $(RRC_RRM_ASN1_DIR)/MBSFN-SubframeConfigList.o \ - $(RRC_RRM_ASN1_DIR)/MBSFN-SubframeConfig.o \ - $(RRC_RRM_ASN1_DIR)/MCC-MNC-Digit.o \ - $(RRC_RRM_ASN1_DIR)/MCC.o \ - $(RRC_RRM_ASN1_DIR)/MeasConfig.o \ - $(RRC_RRM_ASN1_DIR)/MeasGapConfig.o \ - $(RRC_RRM_ASN1_DIR)/MeasId.o \ - $(RRC_RRM_ASN1_DIR)/MeasIdToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/MeasIdToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/MeasIdToRemoveList.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectGERAN.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectId.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectToRemoveList.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasParameters.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultGERAN.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultListEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultListUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultsCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MeasResults.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasurementReport.o \ - $(RRC_RRM_ASN1_DIR)/MeasurementReport-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/MMEC.o \ - $(RRC_RRM_ASN1_DIR)/MNC.o \ - $(RRC_RRM_ASN1_DIR)/MobilityControlInfo.o \ - $(RRC_RRM_ASN1_DIR)/MobilityFromEUTRACommand.o \ - $(RRC_RRM_ASN1_DIR)/MobilityFromEUTRACommand-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/MobilityParametersCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MobilityStateParameters.o \ - $(RRC_RRM_ASN1_DIR)/N1-PUCCH-AN-PersistentList.o \ - $(RRC_RRM_ASN1_DIR)/NativeEnumerated.o \ - $(RRC_RRM_ASN1_DIR)/NativeInteger.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellConfig.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellsPerBandclassCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellsPerBandclassListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/NextHopChainingCount.o \ - $(RRC_RRM_ASN1_DIR)/NULL.o \ - $(RRC_RRM_ASN1_DIR)/OCTET_STRING.o \ - $(RRC_RRM_ASN1_DIR)/Paging.o \ - $(RRC_RRM_ASN1_DIR)/PagingRecordList.o \ - $(RRC_RRM_ASN1_DIR)/PagingRecord.o \ - $(RRC_RRM_ASN1_DIR)/PagingUE-Identity.o \ - $(RRC_RRM_ASN1_DIR)/PCCH-Config.o \ - $(RRC_RRM_ASN1_DIR)/PCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/PCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/PDCP-Config.o \ - $(RRC_RRM_ASN1_DIR)/PDCP-Parameters.o \ - $(RRC_RRM_ASN1_DIR)/PDSCH-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/PDSCH-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/per_decoder.o \ - $(RRC_RRM_ASN1_DIR)/per_encoder.o \ - $(RRC_RRM_ASN1_DIR)/per_opentype.o \ - $(RRC_RRM_ASN1_DIR)/per_support.o \ - $(RRC_RRM_ASN1_DIR)/PHICH-Config.o \ - $(RRC_RRM_ASN1_DIR)/PhyLayerParameters.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdGERAN.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellId.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdRange.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/PhysicalConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/PLMN-IdentityInfo.o \ - $(RRC_RRM_ASN1_DIR)/PLMN-IdentityList2.o \ - $(RRC_RRM_ASN1_DIR)/PLMN-IdentityList.o \ - $(RRC_RRM_ASN1_DIR)/PLMN-Identity.o \ - $(RRC_RRM_ASN1_DIR)/P-Max.o \ - $(RRC_RRM_ASN1_DIR)/PollByte.o \ - $(RRC_RRM_ASN1_DIR)/PollPDU.o \ - $(RRC_RRM_ASN1_DIR)/PRACH-ConfigInfo.o \ - $(RRC_RRM_ASN1_DIR)/PRACH-Config.o \ - $(RRC_RRM_ASN1_DIR)/PRACH-ConfigSIB.o \ - $(RRC_RRM_ASN1_DIR)/PreRegistrationInfoHRPD.o \ - $(RRC_RRM_ASN1_DIR)/PreRegistrationZoneIdHRPD.o \ - $(RRC_RRM_ASN1_DIR)/PresenceAntennaPort1.o \ - $(RRC_RRM_ASN1_DIR)/PUCCH-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/PUCCH-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/PUSCH-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/PUSCH-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/Q-OffsetRangeInterRAT.o \ - $(RRC_RRM_ASN1_DIR)/Q-OffsetRange.o \ - $(RRC_RRM_ASN1_DIR)/Q-RxLevMin.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfigCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfigEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfigGERAN.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfig.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfigUTRA.o \ - $(RRC_RRM_ASN1_DIR)/RACH-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/RACH-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/RadioResourceConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/RadioResourceConfigCommonSIB.o \ - $(RRC_RRM_ASN1_DIR)/RadioResourceConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/RAND-CDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/RAT-Type.o \ - $(RRC_RRM_ASN1_DIR)/RedirectedCarrierInfo.o \ - $(RRC_RRM_ASN1_DIR)/ReestablishmentCause.o \ - $(RRC_RRM_ASN1_DIR)/ReestabUE-Identity.o \ - $(RRC_RRM_ASN1_DIR)/RegisteredMME.o \ - $(RRC_RRM_ASN1_DIR)/ReleaseCause.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigId.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigInterRAT.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigToRemoveList.o \ - $(RRC_RRM_ASN1_DIR)/ReportInterval.o \ - $(RRC_RRM_ASN1_DIR)/ReselectionThreshold.o \ - $(RRC_RRM_ASN1_DIR)/RF-Parameters.o \ - $(RRC_RRM_ASN1_DIR)/RLC-Config.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReconfigurationComplete.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReconfigurationComplete-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReconfiguration.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReconfiguration-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentComplete.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentComplete-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishment.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishment-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentReject.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentReject-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentRequest-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReject.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReject-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRelease.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRelease-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRequest-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionSetupComplete.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionSetupComplete-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionSetup.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionSetup-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRC-TransactionIdentifier.o \ - $(RRC_RRM_ASN1_DIR)/RSRP-Range.o \ - $(RRC_RRM_ASN1_DIR)/RSRQ-Range.o \ - $(RRC_RRM_ASN1_DIR)/SchedulingInfoList.o \ - $(RRC_RRM_ASN1_DIR)/SchedulingInfo.o \ - $(RRC_RRM_ASN1_DIR)/SchedulingRequestConfig.o \ - $(RRC_RRM_ASN1_DIR)/SecondaryPreRegistrationZoneIdListHRPD.o \ - $(RRC_RRM_ASN1_DIR)/SecurityAlgorithmConfig.o \ - $(RRC_RRM_ASN1_DIR)/SecurityConfigHO.o \ - $(RRC_RRM_ASN1_DIR)/SecurityConfigSMC.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeCommand.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeCommand-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeComplete.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeComplete-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeFailure.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeFailure-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/ShortMAC-I.o \ - $(RRC_RRM_ASN1_DIR)/SIB-MappingInfo.o \ - $(RRC_RRM_ASN1_DIR)/SIB-Type.o \ - $(RRC_RRM_ASN1_DIR)/SI-OrPSI-GERAN.o \ - $(RRC_RRM_ASN1_DIR)/SN-FieldLength.o \ - $(RRC_RRM_ASN1_DIR)/SoundingRS-UL-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/SoundingRS-UL-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/SpeedStateScaleFactors.o \ - $(RRC_RRM_ASN1_DIR)/SPS-ConfigDL.o \ - $(RRC_RRM_ASN1_DIR)/SPS-Config.o \ - $(RRC_RRM_ASN1_DIR)/SPS-ConfigUL.o \ - $(RRC_RRM_ASN1_DIR)/SRB-ToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/SRB-ToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/S-TMSI.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandGERAN.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandList1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListHRPD.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListUTRA-TDD128.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListUTRA-TDD384.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListUTRA-TDD768.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandUTRA-TDD128.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandUTRA-TDD384.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandUTRA-TDD768.o \ - $(RRC_RRM_ASN1_DIR)/SystemInfoListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType10.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType11.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType1.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType2.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType3.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType4.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType5.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType6.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType7.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType8.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType9.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformation.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformation-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/SystemTimeInfoCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/TDD-Config.o \ - $(RRC_RRM_ASN1_DIR)/ThresholdCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/ThresholdEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/ThresholdGERAN.o \ - $(RRC_RRM_ASN1_DIR)/ThresholdUTRA.o \ - $(RRC_RRM_ASN1_DIR)/TimeAlignmentTimer.o \ - $(RRC_RRM_ASN1_DIR)/TimeToTrigger.o \ - $(RRC_RRM_ASN1_DIR)/TPC-Index.o \ - $(RRC_RRM_ASN1_DIR)/TPC-PDCCH-Config.o \ - $(RRC_RRM_ASN1_DIR)/T-PollRetransmit.o \ - $(RRC_RRM_ASN1_DIR)/TrackingAreaCode.o \ - $(RRC_RRM_ASN1_DIR)/T-Reordering.o \ - $(RRC_RRM_ASN1_DIR)/T-Reselection.o \ - $(RRC_RRM_ASN1_DIR)/T-StatusProhibit.o \ - $(RRC_RRM_ASN1_DIR)/UECapabilityEnquiry.o \ - $(RRC_RRM_ASN1_DIR)/UECapabilityEnquiry-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/UECapabilityInformation.o \ - $(RRC_RRM_ASN1_DIR)/UECapabilityInformation-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/UE-CapabilityRAT-ContainerList.o \ - $(RRC_RRM_ASN1_DIR)/UE-CapabilityRAT-Container.o \ - $(RRC_RRM_ASN1_DIR)/UE-CapabilityRequest.o \ - $(RRC_RRM_ASN1_DIR)/UE-EUTRA-Capability.o \ - $(RRC_RRM_ASN1_DIR)/UE-TimersAndConstants.o \ - $(RRC_RRM_ASN1_DIR)/UL-AM-RLC.o \ - $(RRC_RRM_ASN1_DIR)/UL-CCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/UL-CCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/UL-CyclicPrefixLength.o \ - $(RRC_RRM_ASN1_DIR)/UL-DCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/UL-DCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/ULHandoverPreparationTransfer.o \ - $(RRC_RRM_ASN1_DIR)/ULHandoverPreparationTransfer-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/ULInformationTransfer.o \ - $(RRC_RRM_ASN1_DIR)/ULInformationTransfer-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/UL-ReferenceSignalsPUSCH.o \ - $(RRC_RRM_ASN1_DIR)/UL-UM-RLC.o \ - $(RRC_RRM_ASN1_DIR)/UplinkPowerControlCommon.o \ - $(RRC_RRM_ASN1_DIR)/UplinkPowerControlDedicated.o \ - $(RRC_RRM_ASN1_DIR)/xer_decoder.o \ - $(RRC_RRM_ASN1_DIR)/xer_encoder.o \ - $(RRC_RRM_ASN1_DIR)/xer_support.o \ - $(RRC_RRM_ASN1_DIR)/E-NodeB-Identity.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-Application-TrafficClass.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-Application-ms-PacketDelay.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-ApplicationKBitRate.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-C-RNTI.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-RRM-Response-Status.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-RRM-Response-Reason.o \ - $(RRC_RRM_ASN1_DIR)/TransactionId.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddDataRadioBearerConfirm.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddDataRadioBearerRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddDataRadioBearerResponse.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveDataRadioBearerConfirm.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddUserConfirm.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveDataRadioBearerRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddUserRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveDataRadioBearerResponse.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddUserResponse.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveUserRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveUserResponse.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRelease.o \ - $(RRC_RRM_ASN1_DIR)/RRCUserReconfiguration.o \ - $(RRC_RRM_ASN1_DIR)/RRCUserReconfigurationComplete.o \ - $(RRC_RRM_ASN1_DIR)/RRM-RRC-Message.o \ - $(RRC_RRM_ASN1_DIR)/RRM-RRC-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/RRC-RRM-Message.o \ - $(RRC_RRM_ASN1_DIR)/RRC-RRM-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/RRCSystemConfigurationRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCSystemConfigurationResponse.o - - - -SQLITE_OBJS= $(SQL_DIR)/sqlite3.o - - -# Sockets -SOCKETS_OBJS = \ - $(SOCKETS_DIR)/Ajp13Socket.o \ - $(SOCKETS_DIR)/AjpBaseSocket.o \ - $(SOCKETS_DIR)/Base64.o \ - $(SOCKETS_DIR)/Debug.o \ - $(SOCKETS_DIR)/Event.o \ - $(SOCKETS_DIR)/EventHandler.o \ - $(SOCKETS_DIR)/EventTime.o \ - $(SOCKETS_DIR)/Exception.o \ - $(SOCKETS_DIR)/File.o \ - $(SOCKETS_DIR)/FileStream.o \ - $(SOCKETS_DIR)/HTTPSocket.o \ - $(SOCKETS_DIR)/HttpBaseSocket.o \ - $(SOCKETS_DIR)/HttpClientSocket.o \ - $(SOCKETS_DIR)/HttpDebugSocket.o \ - $(SOCKETS_DIR)/HttpGetSocket.o \ - $(SOCKETS_DIR)/HttpPostSocket.o \ - $(SOCKETS_DIR)/HttpPutSocket.o \ - $(SOCKETS_DIR)/HttpRequest.o \ - $(SOCKETS_DIR)/HttpResponse.o \ - $(SOCKETS_DIR)/HttpTransaction.o \ - $(SOCKETS_DIR)/HttpdCookies.o \ - $(SOCKETS_DIR)/HttpdForm.o \ - $(SOCKETS_DIR)/HttpdSocket.o \ - $(SOCKETS_DIR)/IEventOwner.o \ - $(SOCKETS_DIR)/Ipv4Address.o \ - $(SOCKETS_DIR)/Ipv6Address.o \ - $(SOCKETS_DIR)/Json.o \ - $(SOCKETS_DIR)/Lock.o \ - $(SOCKETS_DIR)/MemFile.o \ - $(SOCKETS_DIR)/Mutex.o \ - $(SOCKETS_DIR)/Parse.o \ - $(SOCKETS_DIR)/ResolvServer.o \ - $(SOCKETS_DIR)/ResolvSocket.o \ - $(SOCKETS_DIR)/SSLInitializer.o \ - $(SOCKETS_DIR)/SctpSocket.o \ - $(SOCKETS_DIR)/Semaphore.o \ - $(SOCKETS_DIR)/SmtpdSocket.o \ - $(SOCKETS_DIR)/Socket.o \ - $(SOCKETS_DIR)/SocketHandler.o \ - $(SOCKETS_DIR)/SocketHandlerEp.o \ - $(SOCKETS_DIR)/SocketHandlerThread.o \ - $(SOCKETS_DIR)/SocketStream.o \ - $(SOCKETS_DIR)/SocketThread.o \ - $(SOCKETS_DIR)/StdoutLog.o \ - $(SOCKETS_DIR)/StreamSocket.o \ - $(SOCKETS_DIR)/StreamWriter.o \ - $(SOCKETS_DIR)/TcpSocket.o \ - $(SOCKETS_DIR)/Thread.o \ - $(SOCKETS_DIR)/UdpSocket.o \ - $(SOCKETS_DIR)/Utility.o \ - $(SOCKETS_DIR)/XmlDocument.o \ - $(SOCKETS_DIR)/XmlNode.o \ - $(SOCKETS_DIR)/XmlException.o - - -# RRM -RRM_OBJS = \ - $(SRC_DIR)/rrm.o \ - $(COM_DIR)/Message.o \ - $(COM_DIR)/rrc/RRCMessageHandler.o \ - $(COM_DIR)/rrc/RRC2RRMMessageConnectionRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageConnectionResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddUserRequest.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddUserConfirm.o \ - $(COM_DIR)/rrc/RRM2RRCMessageAddUserResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageRemoveUserRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageRemoveUserResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.o \ - $(COM_DIR)/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.o \ - $(COM_DIR)/rrc/RRM2RRCMessageUserReconfiguration.o \ - $(COM_DIR)/rrc/RRC2RRMMessageUserReconfigurationComplete.o \ - $(COM_DIR)/rrc/RRCUdpSocket.o \ - $(TCPIP_DIR)/storage.o \ - $(RADIO_RESOURCES_DIR)/Asn1Utils.o \ - $(RADIO_RESOURCES_DIR)/ENodeB.o \ - $(RADIO_RESOURCES_DIR)/Mobile.o \ - $(RADIO_RESOURCES_DIR)/RadioBearer.o \ - $(RADIO_RESOURCES_DIR)/DataRadioBearer.o \ - $(RADIO_RESOURCES_DIR)/SignallingRadioBearer.o \ - $(RADIO_RESOURCES_DIR)/LogicalChannel.o \ - $(RADIO_RESOURCES_DIR)/Command.o \ - $(RADIO_RESOURCES_DIR)/RadioResources.o \ - $(RADIO_RESOURCES_DIR)/Transaction.o \ - $(RADIO_RESOURCES_DIR)/Transactions.o - - -# RRM -TEST_OBJS = \ - $(SRC_DIR)/test/test.o \ - $(SRC_DIR)/test/TestScenario.o \ - $(COM_DIR)/Message.o \ - $(COM_DIR)/rrm/RRMMessageHandler.o \ - $(COM_DIR)/rrc/RRCMessageHandler.o \ - $(COM_DIR)/rrc/RRC2RRMMessageConnectionRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageConnectionResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddUserRequest.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddUserConfirm.o \ - $(COM_DIR)/rrc/RRM2RRCMessageAddUserResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageRemoveUserRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageRemoveUserResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.o \ - $(COM_DIR)/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.o \ - $(COM_DIR)/rrc/RRM2RRCMessageUserReconfiguration.o \ - $(COM_DIR)/rrc/RRC2RRMMessageUserReconfigurationComplete.o \ - $(COM_DIR)/rrc/RRCUdpSocket.o \ - $(COM_DIR)/rrm/RRMUdpSocket.o \ - $(TCPIP_DIR)/storage.o \ - $(RADIO_RESOURCES_DIR)/Asn1Utils.o \ - $(RADIO_RESOURCES_DIR)/ENodeB.o \ - $(RADIO_RESOURCES_DIR)/Mobile.o \ - $(RADIO_RESOURCES_DIR)/RadioBearer.o \ - $(RADIO_RESOURCES_DIR)/LogicalChannel.o \ - $(RADIO_RESOURCES_DIR)/Transaction.o \ - $(RADIO_RESOURCES_DIR)/Transactions.o \ - $(RADIO_RESOURCES_DIR)/Command.o \ - $(RADIO_RESOURCES_DIR)/RadioResources.o - diff --git a/openair2/RRM_4_RRC_LITE/NEWS b/openair2/RRM_4_RRC_LITE/NEWS deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/openair2/RRM_4_RRC_LITE/README b/openair2/RRM_4_RRC_LITE/README deleted file mode 100755 index 547fc8d031..0000000000 --- a/openair2/RRM_4_RRC_LITE/README +++ /dev/null @@ -1,15 +0,0 @@ -################################### -To compile rrm -################################### -cd in this directory -make libs -make rrm_exe -rrm executable is in ./bin -################################### -To compile dummy_rrc -################################### -cd in this directory -make libs -make test_exe -dummy_rrc executable is in ./bin - diff --git a/openair2/RRM_4_RRC_LITE/configure.ac b/openair2/RRM_4_RRC_LITE/configure.ac deleted file mode 100755 index 5cd70d3610..0000000000 --- a/openair2/RRM_4_RRC_LITE/configure.ac +++ /dev/null @@ -1,147 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(Radio Resource Manager, 0.1.0) -AC_CONFIG_SRCDIR(src/rrm.cpp) -AC_CANONICAL_SYSTEM - -dnl create an config-header -AC_CONFIG_HEADER(src/config.h) - -dnl enable automake-support -AM_INIT_AUTOMAKE([gnu dist-zip tar-ustar dist-bzip2]) - - - -AC_DEFINE([OUTPUT_ACCURACY], [2], [defines the number of digits after the comma in output]) - - -dnl Checks for programs. -AC_PROG_CC -AC_PROG_CPP -AC_PROG_CXX -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET - -dnl enable libtool-support -dnl gives a deprecated warning for RANLIB with newer libtools -AC_PROG_RANLIB -AM_PROG_LIBTOOL - - -dnl Check for enable-features that shall go into config.h - - -dnl ... for xerces 3.0 -PKG_CHECK_MODULES([XERCES], [xerces-c >= 3.0], - [AC_DEFINE([XERCES3_SIZE_t],[XMLSize_t],[Define length for Xerces 3.])], - [AC_DEFINE([XERCES3_SIZE_t],[unsigned int],[Define length for Xerces 2.])]) - - - -AM_CONDITIONAL([WITH_VERSION_H], test -f .svn/entries) -if test -f .svn/entries; then - AC_DEFINE([HAVE_VERSION_H], [1], [Define if auto-generated version.h should be used.]) -else - AC_DEFINE_UNQUOTED(VERSION_STRING, "$PACKAGE_VERSION", [Defined if auto-generated version.h is unavailable.]) -fi - -dnl --------------------------------------------- -dnl check for libraries... -dnl - - - - - - - - - - - - - - - - - - - - - - - - -dnl ... for xerces -AC_ARG_WITH([xerces], [AS_HELP_STRING([--with-xerces=DIR],[where Xerces-C is installed (libraries in DIR/lib, headers in DIR/include).])]) -if test x"$with_xerces" != x; then - if test x"$with_xerces_libraries" = x; then - with_xerces_libraries=$with_xerces/lib - fi - if test x"$with_xerces_includes" = x; then - with_xerces_includes=$with_xerces/include - fi -fi - -dnl ... for libs -LIB_XERCES="xerces-c" -AC_ARG_WITH([xerces-libraries], [AS_HELP_STRING([--with-xerces-libraries=DIR],[where the Xerces-C library is installed.])]) -if test x"$with_xerces_libraries" = x; then - AC_CHECK_LIB([$LIB_XERCES], [main], [true], - [AC_MSG_ERROR([xerces-lib not found. Specify path with option --with-xerces-libraries=DIR.])]) -else - save_ldflags=$LDFLAGS - LDFLAGS="-L$with_xerces_libraries" - export LDFLAGS - AC_CHECK_LIB([$LIB_XERCES], [main], [XERCES_LDFLAGS=$LDFLAGS], - [AC_MSG_ERROR([xerces-lib not found in "$with_xerces_libraries".])]) - LDFLAGS=$save_ldflags - AC_SUBST(XERCES_LDFLAGS) -fi -AC_SUBST(LIB_XERCES) - - -dnl ... for includes -AC_ARG_WITH([xerces-includes], [AS_HELP_STRING([--with-xerces-includes=DIR],[where the Xerces-C includes are.])]) -save_cppflags=$CPPFLAGS -if test x"$with_xerces_includes" = x; then - CPPFLAGS="$CPPFLAGS -I/usr/local/include -I/usr/include" - export CPPFLAGS - AC_CHECK_HEADER([xercesc/util/XercesVersion.hpp], [AM_CPPFLAGS="$CPPFLAGS $AM_CPPFLAGS"], - [AC_MSG_ERROR([xerces-includes not found. Specify path with option --with-xerces-includes=DIR.])]) -else - CPPFLAGS="-I$with_xerces_includes" - export CPPFLAGS - AC_CHECK_HEADER([xercesc/util/XercesVersion.hpp], [AM_CPPFLAGS="$CPPFLAGS $AM_CPPFLAGS"], - [AC_MSG_ERROR([xerces-includes not found in "$with_xerces_includes".])]) -fi -CPPFLAGS=$save_cppflags - - - - -AM_CPPFLAGS="-I$PWD/$srcdir/src $AM_CPPFLAGS" -AC_SUBST(AM_CPPFLAGS) -AC_SUBST(AM_CXXFLAGS) - - -dnl --------------------------------------------- -dnl Checks proposed by autoscan. -dnl Checks for header files. -AC_FUNC_ALLOCA -AC_HEADER_STDC -AC_CHECK_HEADERS([float.h limits.h malloc.h math.h stddef.h stdlib.h string.h sys/time.h unistd.h wchar.h]) - -dnl Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_C_INLINE -AC_TYPE_SIZE_T -AC_HEADER_TIME -AC_STRUCT_TM -AC_C_VOLATILE - -dnl Checks for library functions. -AC_FUNC_ERROR_AT_LINE -AC_FUNC_MALLOC -AC_FUNC_SELECT_ARGTYPES -AC_TYPE_SIGNAL -AC_FUNC_STAT -AC_CHECK_FUNCS([floor getcwd gettimeofday memset pow select socket sqrt]) - - -dnl --------------------------------------------- -dnl add here all your Makefiles. These will be created by configure -AC_CONFIG_FILES([ -src/Makefile -src/com/Makefile -src/foreign/Makefile -src/foreign/sockets-2.3.9.4/Makefile -src/foreign/sql/Makefile -src/foreign/tcpip/Makefile -src/utils/Makefile -src/utils/options/Makefile -Makefile]) -AC_OUTPUT - -dnl --------------------------------------------- -dnl Summary - -AC_MSG_RESULT() diff --git a/openair2/RRM_4_RRC_LITE/src/com/Message.cpp b/openair2/RRM_4_RRC_LITE/src/com/Message.cpp deleted file mode 100644 index a41b321e00..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/Message.cpp +++ /dev/null @@ -1,662 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -#include -#include -//----------------------------------------------------------------- -#include "Message.h" -#include "RRC-RRM-Message.h" -#include "RRM-RRC-Message.h" -#include "Utility.h" -#include "RRC2RRMMessageConnectionRequest.h" -#include "RRC2RRMMessageAddUserRequest.h" -#include "RRC2RRMMessageAddUserConfirm.h" -#include "RRC2RRMMessageAddRadioAccessBearerRequest.h" -#include "RRC2RRMMessageRemoveRadioAccessBearerRequest.h" -#include "RRC2RRMMessageRemoveUserRequest.h" -#include "RRC2RRMMessageAddRadioAccessBearerConfirm.h" -#include "RRM2RRCMessageConnectionResponse.h" -#include "RRM2RRCMessageAddUserResponse.h" -#include "RRM2RRCMessageAddRadioAccessBearerResponse.h" -#include "RRM2RRCMessageRemoveRadioAccessBearerResponse.h" -#include "RRM2RRCMessageRemoveUserResponse.h" -#include "RRM2RRCMessageUserReconfiguration.h" -#include "RRC2RRMMessageUserReconfigurationComplete.h" -#include "storage.h" -uint8_t Message::s_buffer[MESSAGE_DESERIALIZE_BUFFER_SIZE]; - -//----------------------------------------------------------------- -#define TRACE_RRM_MESSAGES -#define LOOP_TEST -//----------------------------------------------------------------- -using namespace std; -using namespace tcpip; -//----------------------------------------------------------------- -Message::Message() -//----------------------------------------------------------------- -{ - m_message_buffer = NULL; - m_ip_char_src = new char(INET6_ADDRSTRLEN); -} -//----------------------------------------------------------------- -Message::Message(tcpip::Storage& in_messageP): m_message_storage(in_messageP) -//----------------------------------------------------------------- -{ - m_message_buffer = NULL; - m_ip_char_src = new char(INET6_ADDRSTRLEN); -} -//----------------------------------------------------------------- -Message* Message::DeserializeRRCMessage(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//----------------------------------------------------------------- -{ - Message* message = NULL; - asn_dec_rval_t rval; - asn_codec_ctx_t *opt_codec_ctx = 0; - RRC_RRM_Message_t *asn1_message = 0; -#ifdef LOOP_TEST - for (int i=0; i<10000; i++) { - message = NULL; - opt_codec_ctx = 0; - asn1_message = 0; - - rval = uper_decode(opt_codec_ctx, - &asn_DEF_RRC_RRM_Message,/* Type to decode */ - (void **)&asn1_message, /* Pointer to a target structure's pointer */ - in_bufferP, /* Data to be decoded */ - size_dataP, /* Size of data buffer */ - 0, /* Number of unused leading bits, 0..7 */ - 0); /* Number of unused tailing bits, 0..7 */ - ASN_STRUCT_FREE(asn_DEF_RRC_RRM_Message, asn1_message); - } - cout << "Message::DeserializeRRCMessage(): LOOP TEST END" << endl; - opt_codec_ctx = 0; - asn1_message = 0; -#endif - - rval = uper_decode(opt_codec_ctx, - &asn_DEF_RRC_RRM_Message,/* Type to decode */ - (void **)&asn1_message, /* Pointer to a target structure's pointer */ - in_bufferP, /* Data to be decoded */ - size_dataP, /* Size of data buffer */ - 0, /* Number of unused leading bits, 0..7 */ - 0); /* Number of unused tailing bits, 0..7 */ - - xer_fprint(stdout, &asn_DEF_RRC_RRM_Message, (void*)asn1_message); - if (rval.code != RC_OK) { - cerr << " DeserializeRRCMessage ERROR IN ASN1 DECODING" << endl; - return NULL; - } - if (asn1_message->message.present == RRC_RRM_MessageType_PR_c1) { - switch (asn1_message->message.choice.c1.present) { - //------------------------------- - case RRC_RRM_MessageType__c1_PR_NOTHING: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_NOTHING" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcSystemConfigurationRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_SYSTEM_CONFIGURATION_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageConnectionRequest(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcAddUserRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_USER_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageAddUserRequest(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcAddUserConfirm: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_USER_CONFIRM" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageAddUserConfirm(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcUserReconfigurationComplete: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_USER_RECONFIGURATION_COMPLETE" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageUserReconfigurationComplete(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcAddDataRadioBearerRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_DATA_RADIO_BEARER_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcAddDataRadioBearerConfirm: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_DATA_RADIO_BEARER_CONFIRM" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcRemoveUserRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_USER_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcRemoveDataRadioBearerRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_DATA_RADIO_BEARER_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcRemoveDataRadioBearerConfirm: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_DATA_RADIO_BEARER_CONFIRM" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - } - } else { - cerr << " DeserializeRRMMessage ERROR IN message.present field" << endl; - return NULL; - } - return message; -} -//----------------------------------------------------------------- -Message* Message::DeserializeRRMMessage(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//----------------------------------------------------------------- -{ - Message* message = NULL; - asn_dec_rval_t rval; - asn_codec_ctx_t *opt_codec_ctx = 0; - RRM_RRC_Message_t *asn1_message = 0; -#ifdef LOOP_TEST - for (int i=0; i<10000; i++) { - message = NULL; - opt_codec_ctx = 0; - asn1_message = 0; - - rval = uper_decode(opt_codec_ctx, - &asn_DEF_RRM_RRC_Message,/* Type to decode */ - (void **)&asn1_message, /* Pointer to a target structure's pointer */ - in_bufferP, /* Data to be decoded */ - size_dataP, /* Size of data buffer */ - 0, /* Number of unused leading bits, 0..7 */ - 0); /* Number of unused tailing bits, 0..7 */ - ASN_STRUCT_FREE(asn_DEF_RRM_RRC_Message, asn1_message); - } - cout << "Message::DeserializeRRMMessage(): LOOP TEST END" << endl; - opt_codec_ctx = 0; - asn1_message = 0; -#endif - rval = uper_decode(opt_codec_ctx, - &asn_DEF_RRM_RRC_Message,/* Type to decode */ - (void **)&asn1_message, /* Pointer to a target structure's pointer */ - in_bufferP, /* Data to be decoded */ - size_dataP, /* Size of data buffer */ - 0, /* Number of unused leading bits, 0..7 */ - 0); /* Number of unused tailing bits, 0..7 */ - - xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)asn1_message); - if (rval.code != RC_OK) { - cerr << " DeserializeRRMMessage ERROR IN ASN1 DECODING" << endl; - return NULL; - } - if (asn1_message->message.present == RRM_RRC_MessageType_PR_c1) { - switch (asn1_message->message.choice.c1.present) { - //------------------------------- - case RRM_RRC_MessageType__c1_PR_NOTHING: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_NOTHING" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcSystemConfigurationResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_SYSTEM_CONFIGURATION_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageConnectionResponse(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcAddUserResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_USER_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageAddUserResponse(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcUserReconfiguration: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_USER_RECONFIGURATION" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageUserReconfiguration(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcAddDataRadioBearerResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_DATA_RADIO_BEARER_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionResponse(asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcRemoveUserResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_USER_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionResponse(asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcRemoveDataRadioBearerResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_DATA_RADIO_BEARER_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionResponse(asn1_message); - break; - - } - } else { - cerr << " DeserializeRRMMessage ERROR IN message.present field" << endl; - return NULL; - } - return message; -} -//----------------------------------------------------------------- -Message* Message::Deserialize(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//----------------------------------------------------------------- -{ - - msg_type_t msg_type; - msg_length_t msg_length; - frame_t msg_frame; - - Storage in_message(const_cast(reinterpret_cast(in_bufferP)), size_dataP); - msg_type = in_message.readChar(); - msg_length = in_message.readShort(); - //msg_frame = in_message.readInt(); - assert(msg_length == size_dataP); - - msg_length = msg_length - 1 - 2; - - Message* message = NULL; - switch (msg_type) { - //------------------------------- - case MESSAGE_CONNECTION_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_CONNECTION_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_CONNECTION_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_CONNECTION_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRM2RRCMessageConnectionResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_USER_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_USER_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageAddUserRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_USER_CONFIRM: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_USER_CONFIRM" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageAddUserConfirm(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_USER_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_USER_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRM2RRCMessageAddUserResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_RADIO_ACCESS_BEARER_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_RADIO_ACCESS_BEARER_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageAddRadioAccessBearerRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_RADIO_ACCESS_BEARER_CONFIRM: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_RADIO_ACCESS_BEARER_CONFIRM" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageAddRadioAccessBearerConfirm(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_RADIO_ACCESS_BEARER_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_RADIO_ACCESS_BEARER_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageAddRadioAccessBearerResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_REMOVE_RADIO_ACCESS_BEARER_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_REMOVE_RADIO_ACCESS_BEARER_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageRemoveRadioAccessBearerRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_REMOVE_RADIO_ACCESS_BEARER_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_REMOVE_RADIO_ACCESS_BEARER_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageRemoveRadioAccessBearerResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_REMOVE_USER_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_REMOVE_USER_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageRemoveUserRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_REMOVE_USER_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_REMOVE_USER_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageRemoveUserResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - default: - //------------------------------- - #ifdef TRACE_RRM_UMTS_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type NOT HANDLED : 0x" << static_cast(msg_type) << endl; - cout << dec; - #endif - ; - } - return message; -} -//----------------------------------------------------------------- -void Message::ParseIpParameters(struct sockaddr *sa_fromP,socklen_t sa_lenP) -//----------------------------------------------------------------- -{ - - if (sa_lenP == sizeof(struct sockaddr_in6)) { - m_is_ipv6 = true; - memcpy(&m_sockaddr_in6_src,sa_fromP,sa_lenP); - Utility::l2ip(m_sockaddr_in6_src.sin6_addr, m_ip_str_src,0); - //const char* result = inet_ntop(AF_INET6, &m_sockaddr_in6_src, m_ip_char_src, sa_lenP); - //cout << "inet_ntop returned" << result << endl; - m_port_src = ntohs(m_sockaddr_in6_src.sin6_port); - cout << "Message::ParseIpParameters: m_ip_str_src6 = " << m_ip_str_src << endl; - cout << "Message::ParseIpParameters: m_port_src6 = " << m_port_src << endl; - } else if (sa_lenP == sizeof(struct sockaddr_in)) { - m_is_ipv6 = false; - memcpy(&m_sockaddr_in4_src,sa_fromP,sa_lenP); - ipaddr_t a; - memcpy(&a,&m_sockaddr_in4_src.sin_addr,4); - Utility::l2ip(a,m_ip_str_src); - m_port_src = ntohs(m_sockaddr_in4_src.sin_port); - cout << "Message::ParseIpParameters: m_ip_str_src = " << m_ip_str_src << endl; - cout << "Message::ParseIpParameters: m_port_src = " << m_port_src << endl; - } -} -//---------------------------------------------------------------------------- -msg_length_t Message::GetSerializedMessageSize() -//---------------------------------------------------------------------------- -{ - return m_msg_length; -} -//---------------------------------------------------------------------------- -const char* Message::GetSerializedMessageBuffer() -//---------------------------------------------------------------------------- -{ - return const_cast(reinterpret_cast(m_message_serialize_buffer)); -} -//---------------------------------------------------------------------------- -std::string Message::StatusToString(msg_response_status_t statusP) -//---------------------------------------------------------------------------- -{ - stringstream result; - switch (statusP) { - //------------------------------- - case STATUS_CONNECTION_ACCEPTED: - //------------------------------- - result << "CONNECTION_ACCEPTED"; return result.str(); - break; - //------------------------------- - case STATUS_CONNECTION_FAILED: - //------------------------------- - result << "CONNECTION_FAILED"; return result.str(); - break; - //------------------------------- - case STATUS_ADD_USER_SUCCESSFULL: - //------------------------------- - result << "ADD_USER_SUCCESSFULL"; return result.str(); - break; - //------------------------------- - case STATUS_ADD_USER_FAILED: - //------------------------------- - result << "ADD_USER_FAILED"; return result.str(); - break; - //------------------------------- - case STATUS_REMOVE_USER_SUCCESSFULL: - //------------------------------- - result << "REMOVE_USER_SUCCESSFULL"; return result.str(); - break; - //------------------------------- - case STATUS_REMOVE_USER_FAILED: - //------------------------------- - result << "REMOVE_USER_FAILED"; return result.str(); - break; - //------------------------------- - case STATUS_ADD_RADIO_ACCESS_BEARER_SUCCESSFULL: - //------------------------------- - result << "ADD_RADIO_ACCESS_BEARER_SUCCESSFULL"; return result.str(); - break; - //------------------------------- - case STATUS_ADD_RADIO_ACCESS_BEARER_FAILED: - //------------------------------- - result << "ADD_RADIO_ACCESS_BEARER_FAILED"; return result.str(); - break; - //------------------------------- - case STATUS_REMOVE_RADIO_ACCESS_BEARER_SUCCESSFULL: - //------------------------------- - result << "REMOVE_RADIO_ACCESS_BEARER_SUCCESSFULL"; return result.str(); - break; - //------------------------------- - case STATUS_REMOVE_RADIO_ACCESS_BEARER_FAILED: - //------------------------------- - result << "REMOVE_RADIO_ACCESS_BEARER_FAILED"; return result.str(); - break; - default: - result << "UNKNOWN STATUS " << statusP; return result.str(); - } - return result.str(); -} -//---------------------------------------------------------------------------- -std::string Message::ReasonToString(msg_response_reason_t reasonP) -//---------------------------------------------------------------------------- -{ - stringstream result; - switch (reasonP) { - //------------------------------- - case MSG_RESP_OK: - //------------------------------- - result << "RESP_OK"; return result.str(); - break; - //------------------------------- - case MSG_RESP_PROTOCOL_ERROR: - //------------------------------- - result << "RESP_PROTOCOL_ERROR"; return result.str(); - break; - //------------------------------- - case MSG_RESP_RESSOURCES_UNAVAILABLE: - //------------------------------- - result << "RESP_RESSOURCES_UNAVAILABLE"; return result.str(); - break; - //------------------------------- - case MSG_RESP_UNKNOWN_MESSAGE: - //------------------------------- - result << "RESP_UNKNOWN_MESSAGE"; return result.str(); - break; - //------------------------------- - case MSG_RESP_INTERNAL_ERROR: - //------------------------------- - result << "RESP_INTERNAL_ERROR"; return result.str(); - break; - default: - result << "UNKNOWN REASON " << reasonP; return result.str(); - } - return result.str(); -} -//----------------------------------------------------------------- -Message::~Message() -//----------------------------------------------------------------- -{ - if (m_message_buffer != NULL) { - delete [] m_message_buffer; - } - if (m_ip_char_src != NULL) { - delete [] m_ip_char_src; - } - m_message_storage.reset(); -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/Message.h b/openair2/RRM_4_RRC_LITE/src/com/Message.h deleted file mode 100644 index 0c5b65cb0a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/Message.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _MESSAGE_H_ -# define _MESSAGE_H_ - -# include -# include - -# include "socket_include.h" -# include "storage.h" -# include "platform.h" - -#define MESSAGE_DESERIALIZE_BUFFER_SIZE 2048 -#define MESSAGE_SERIALIZE_BUFFER_SIZE 2048 -class Message -{ -public: - - - typedef std::pair e_nodeb_internet_address_id_t; - - //============ STATUS ====================== - static const msg_response_status_t STATUS_CONNECTION_ACCEPTED = 1; - static const msg_response_status_t STATUS_CONNECTION_FAILED = -1; - static const msg_response_status_t STATUS_ADD_USER_SUCCESSFULL = 2; - static const msg_response_status_t STATUS_ADD_USER_FAILED = -2; - static const msg_response_status_t STATUS_REMOVE_USER_SUCCESSFULL = 3; - static const msg_response_status_t STATUS_REMOVE_USER_FAILED = -3; - static const msg_response_status_t STATUS_ADD_RADIO_ACCESS_BEARER_SUCCESSFULL = 4; - static const msg_response_status_t STATUS_ADD_RADIO_ACCESS_BEARER_FAILED = -4; - static const msg_response_status_t STATUS_REMOVE_RADIO_ACCESS_BEARER_SUCCESSFULL = 5; - static const msg_response_status_t STATUS_REMOVE_RADIO_ACCESS_BEARER_FAILED = -5; - //============ MESSAGES ====================== - static const msg_type_t MESSAGE_CONNECTION_REQUEST = 0; - static const msg_type_t MESSAGE_CONNECTION_RESPONSE = 1; - static const msg_type_t MESSAGE_CONNECTION_CLOSE = 2; - static const msg_type_t MESSAGE_CONNECTION_CLOSE_ACK = 3; - static const msg_type_t MESSAGE_ADD_USER_REQUEST = 4; - static const msg_type_t MESSAGE_ADD_USER_RESPONSE = 5; - static const msg_type_t MESSAGE_ADD_USER_CONFIRM = 6; - static const msg_type_t MESSAGE_REMOVE_USER_REQUEST = 7; - static const msg_type_t MESSAGE_REMOVE_USER_RESPONSE = 8; - static const msg_type_t MESSAGE_ADD_RADIO_ACCESS_BEARER_REQUEST = 9; - static const msg_type_t MESSAGE_ADD_RADIO_ACCESS_BEARER_RESPONSE = 10; - static const msg_type_t MESSAGE_ADD_RADIO_ACCESS_BEARER_CONFIRM = 11; - static const msg_type_t MESSAGE_REMOVE_RADIO_ACCESS_BEARER_REQUEST = 12; - static const msg_type_t MESSAGE_REMOVE_RADIO_ACCESS_BEARER_RESPONSE = 13; - static const msg_type_t MESSAGE_MEASUREMENT_REQUEST = 14; - static const msg_type_t MESSAGE_L1_MEASUREMENT_RG_INTERNAL_REPORT = 15; - static const msg_type_t MESSAGE_L1_MEASUREMENT_RG_QUALITY_REPORT = 16; - static const msg_type_t MESSAGE_L1_MEASUREMENT_RG_TRAFFIC_VOLUME_REPORT = 17; - static const msg_type_t MESSAGE_L1_MEASUREMENT_RG_PHYSICAL_CHANNEL_DATA_AMP_REPORT = 18; - static const msg_type_t MESSAGE_L1_MEASUREMENT_MT_INTERNAL_REPORT = 19; - static const msg_type_t MESSAGE_L1_MEASUREMENT_MT_QUALITY_REPORT = 20; - static const msg_type_t MESSAGE_L1_MEASUREMENT_MT_TRAFFIC_VOLUME_REPORT = 21; - static const msg_type_t MESSAGE_L1_MEASUREMENT_MT_INTRA_FREQUENCY_REPORT = 22; - static const msg_type_t MESSAGE_UPLINK_PHYSICAL_CHANNEL_CONTROL = 23; - static const msg_type_t MESSAGE_CONFIG_REQUEST = 24; - static const msg_type_t MESSAGE_ACK = 25; - static const msg_type_t MESSAGE_UPDATE_DSCH = 26; - //============ REASONS ====================== - static const msg_response_reason_t MSG_RESP_OK = 0; - static const msg_response_reason_t MSG_RESP_PROTOCOL_ERROR = 1; - static const msg_response_reason_t MSG_RESP_RESSOURCES_UNAVAILABLE = 2; - static const msg_response_reason_t MSG_RESP_UNKNOWN_MESSAGE = 128; - static const msg_response_reason_t MSG_RESP_INTERNAL_ERROR = 255; - - static uint8_t s_buffer[MESSAGE_DESERIALIZE_BUFFER_SIZE]; - - Message (); - Message(tcpip::Storage&); - virtual void Serialize () {}; - virtual void Forward () {}; - virtual void Serialize (char *out_bufferP, size_t* size_dataP) {}; - - static Message *DeserializeRRCMessage(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - static Message *DeserializeRRMMessage(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - static Message *Deserialize (const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - void ParseIpParameters(struct sockaddr *sa_fromP,socklen_t sa_lenP); - msg_length_t GetSerializedMessageSize(); - const char* GetSerializedMessageBuffer(); - const int GetSrcPort() { - return m_port_src; - }; - const char* GetSrcAddress() { - return m_ip_char_src; - }; - virtual ~ Message (); - - static std::string StatusToString(msg_response_status_t); - static std::string ReasonToString(msg_response_reason_t); - - -protected: - msg_type_t m_type; - bool m_is_ipv6; - struct sockaddr_in m_sockaddr_in4_src; - struct sockaddr_in6 m_sockaddr_in6_src; - std::string m_ip_str_src; - char* m_ip_char_src; - int m_port_src; - tcpip::Storage m_message_storage; - unsigned char* m_message_buffer; - - msg_length_t m_msg_length; - uint8_t m_message_serialize_buffer[MESSAGE_SERIALIZE_BUFFER_SIZE]; - //uint8_t m_message_serialize_buffer[MESSAGE_DESERIALIZE_BUFFER_SIZE]; -}; - -# endif \ No newline at end of file diff --git a/openair2/RRM_4_RRC_LITE/src/com/asn1/Makefile.am.sample b/openair2/RRM_4_RRC_LITE/src/com/asn1/Makefile.am.sample deleted file mode 100755 index 4ca04ff4c3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/asn1/Makefile.am.sample +++ /dev/null @@ -1,870 +0,0 @@ -ASN_MODULE_SOURCES= \ - BCCH-BCH-Message.c \ - BCCH-BCH-MessageType.c \ - BCCH-DL-SCH-Message.c \ - BCCH-DL-SCH-MessageType.c \ - PCCH-Message.c \ - PCCH-MessageType.c \ - DL-CCCH-Message.c \ - DL-CCCH-MessageType.c \ - DL-DCCH-Message.c \ - DL-DCCH-MessageType.c \ - UL-CCCH-Message.c \ - UL-CCCH-MessageType.c \ - UL-DCCH-Message.c \ - UL-DCCH-MessageType.c \ - CounterCheck.c \ - CounterCheck-r8-IEs.c \ - DRB-CountMSB-InfoList.c \ - DRB-CountMSB-Info.c \ - CounterCheckResponse.c \ - CounterCheckResponse-r8-IEs.c \ - DRB-CountInfoList.c \ - DRB-CountInfo.c \ - CSFBParametersRequestCDMA2000.c \ - CSFBParametersRequestCDMA2000-r8-IEs.c \ - CSFBParametersResponseCDMA2000.c \ - CSFBParametersResponseCDMA2000-r8-IEs.c \ - DLInformationTransfer.c \ - DLInformationTransfer-r8-IEs.c \ - HandoverFromEUTRAPreparationRequest.c \ - HandoverFromEUTRAPreparationRequest-r8-IEs.c \ - MasterInformationBlock.c \ - MeasurementReport.c \ - MeasurementReport-r8-IEs.c \ - MobilityFromEUTRACommand.c \ - MobilityFromEUTRACommand-r8-IEs.c \ - Handover.c \ - CellChangeOrder.c \ - SI-OrPSI-GERAN.c \ - SystemInfoListGERAN.c \ - Paging.c \ - PagingRecordList.c \ - PagingRecord.c \ - PagingUE-Identity.c \ - IMSI.c \ - IMSI-Digit.c \ - RRCConnectionReconfiguration.c \ - RRCConnectionReconfiguration-r8-IEs.c \ - SecurityConfigHO.c \ - RRCConnectionReconfigurationComplete.c \ - RRCConnectionReconfigurationComplete-r8-IEs.c \ - RRCConnectionReestablishment.c \ - RRCConnectionReestablishment-r8-IEs.c \ - RRCConnectionReestablishmentComplete.c \ - RRCConnectionReestablishmentComplete-r8-IEs.c \ - RRCConnectionReestablishmentReject.c \ - RRCConnectionReestablishmentReject-r8-IEs.c \ - RRCConnectionReestablishmentRequest.c \ - RRCConnectionReestablishmentRequest-r8-IEs.c \ - ReestabUE-Identity.c \ - ReestablishmentCause.c \ - RRCConnectionReject.c \ - RRCConnectionReject-r8-IEs.c \ - RRCConnectionRelease.c \ - RRCConnectionRelease-r8-IEs.c \ - ReleaseCause.c \ - RedirectedCarrierInfo.c \ - IdleModeMobilityControlInfo.c \ - FreqPriorityListEUTRA.c \ - FreqPriorityEUTRA.c \ - FreqsPriorityListGERAN.c \ - FreqsPriorityGERAN.c \ - FreqPriorityListUTRA-FDD.c \ - FreqPriorityUTRA-FDD.c \ - FreqPriorityListUTRA-TDD.c \ - FreqPriorityUTRA-TDD.c \ - BandClassPriorityListHRPD.c \ - BandClassPriorityHRPD.c \ - BandClassPriorityList1XRTT.c \ - BandClassPriority1XRTT.c \ - RRCConnectionRequest.c \ - RRCConnectionRequest-r8-IEs.c \ - InitialUE-Identity.c \ - EstablishmentCause.c \ - RRCConnectionSetup.c \ - RRCConnectionSetup-r8-IEs.c \ - RRCConnectionSetupComplete.c \ - RRCConnectionSetupComplete-r8-IEs.c \ - RegisteredMME.c \ - SecurityModeCommand.c \ - SecurityModeCommand-r8-IEs.c \ - SecurityConfigSMC.c \ - SecurityModeComplete.c \ - SecurityModeComplete-r8-IEs.c \ - SecurityModeFailure.c \ - SecurityModeFailure-r8-IEs.c \ - SystemInformation.c \ - SystemInformation-r8-IEs.c \ - SystemInformationBlockType1.c \ - PLMN-IdentityList.c \ - PLMN-IdentityInfo.c \ - SchedulingInfoList.c \ - SchedulingInfo.c \ - SIB-MappingInfo.c \ - SIB-Type.c \ - UECapabilityEnquiry.c \ - UECapabilityEnquiry-r8-IEs.c \ - UE-CapabilityRequest.c \ - UECapabilityInformation.c \ - UECapabilityInformation-r8-IEs.c \ - ULHandoverPreparationTransfer.c \ - ULHandoverPreparationTransfer-r8-IEs.c \ - ULInformationTransfer.c \ - ULInformationTransfer-r8-IEs.c \ - SystemInformationBlockType2.c \ - AC-BarringConfig.c \ - MBSFN-SubframeConfigList.c \ - MBSFN-SubframeConfig.c \ - SystemInformationBlockType3.c \ - SystemInformationBlockType4.c \ - IntraFreqNeighCellList.c \ - IntraFreqNeighCellInfo.c \ - IntraFreqBlackCellList.c \ - SystemInformationBlockType5.c \ - InterFreqCarrierFreqList.c \ - InterFreqCarrierFreqInfo.c \ - InterFreqNeighCellList.c \ - InterFreqNeighCellInfo.c \ - InterFreqBlackCellList.c \ - SystemInformationBlockType6.c \ - CarrierFreqListUTRA-FDD.c \ - CarrierFreqUTRA-FDD.c \ - CarrierFreqListUTRA-TDD.c \ - CarrierFreqUTRA-TDD.c \ - SystemInformationBlockType7.c \ - CarrierFreqsInfoListGERAN.c \ - CarrierFreqsInfoGERAN.c \ - SystemInformationBlockType8.c \ - CellReselectionParametersCDMA2000.c \ - NeighCellListCDMA2000.c \ - NeighCellCDMA2000.c \ - NeighCellsPerBandclassListCDMA2000.c \ - NeighCellsPerBandclassCDMA2000.c \ - PhysCellIdListCDMA2000.c \ - BandClassListCDMA2000.c \ - BandClassInfoCDMA2000.c \ - SystemInformationBlockType9.c \ - SystemInformationBlockType10.c \ - SystemInformationBlockType11.c \ - AntennaInfoCommon.c \ - AntennaInfoDedicated.c \ - CQI-ReportConfig.c \ - CQI-ReportPeriodic.c \ - DRB-Identity.c \ - LogicalChannelConfig.c \ - MAC-MainConfig.c \ - DRX-Config.c \ - PDCP-Config.c \ - PDSCH-ConfigCommon.c \ - PDSCH-ConfigDedicated.c \ - PHICH-Config.c \ - PhysicalConfigDedicated.c \ - P-Max.c \ - PRACH-ConfigSIB.c \ - PRACH-Config.c \ - PRACH-ConfigInfo.c \ - PresenceAntennaPort1.c \ - PUCCH-ConfigCommon.c \ - PUCCH-ConfigDedicated.c \ - PUSCH-ConfigCommon.c \ - PUSCH-ConfigDedicated.c \ - UL-ReferenceSignalsPUSCH.c \ - RACH-ConfigCommon.c \ - RACH-ConfigDedicated.c \ - RadioResourceConfigCommonSIB.c \ - RadioResourceConfigCommon.c \ - BCCH-Config.c \ - PCCH-Config.c \ - UL-CyclicPrefixLength.c \ - RadioResourceConfigDedicated.c \ - SRB-ToAddModList.c \ - SRB-ToAddMod.c \ - DRB-ToAddModList.c \ - DRB-ToAddMod.c \ - DRB-ToReleaseList.c \ - RLC-Config.c \ - UL-AM-RLC.c \ - DL-AM-RLC.c \ - UL-UM-RLC.c \ - DL-UM-RLC.c \ - SN-FieldLength.c \ - T-PollRetransmit.c \ - PollPDU.c \ - PollByte.c \ - T-Reordering.c \ - T-StatusProhibit.c \ - SchedulingRequestConfig.c \ - SoundingRS-UL-ConfigCommon.c \ - SoundingRS-UL-ConfigDedicated.c \ - SPS-Config.c \ - SPS-ConfigDL.c \ - SPS-ConfigUL.c \ - N1-PUCCH-AN-PersistentList.c \ - TDD-Config.c \ - TimeAlignmentTimer.c \ - TPC-PDCCH-Config.c \ - TPC-Index.c \ - UplinkPowerControlCommon.c \ - UplinkPowerControlDedicated.c \ - DeltaFList-PUCCH.c \ - NextHopChainingCount.c \ - SecurityAlgorithmConfig.c \ - ShortMAC-I.c \ - AdditionalSpectrumEmission.c \ - ARFCN-ValueCDMA2000.c \ - ARFCN-ValueEUTRA.c \ - ARFCN-ValueGERAN.c \ - ARFCN-ValueUTRA.c \ - BandclassCDMA2000.c \ - BandIndicatorGERAN.c \ - CarrierFreqCDMA2000.c \ - CarrierFreqGERAN.c \ - CarrierFreqsGERAN.c \ - ExplicitListOfARFCNs.c \ - CDMA2000-Type.c \ - CellIdentity.c \ - CellIndexList.c \ - CellIndex.c \ - CellReselectionPriority.c \ - CSFB-RegistrationParam1XRTT.c \ - CellGlobalIdEUTRA.c \ - CellGlobalIdUTRA.c \ - CellGlobalIdGERAN.c \ - CellGlobalIdCDMA2000.c \ - MobilityControlInfo.c \ - CarrierBandwidthEUTRA.c \ - CarrierFreqEUTRA.c \ - MobilityParametersCDMA2000.c \ - MobilityStateParameters.c \ - PhysCellId.c \ - PhysCellIdRange.c \ - PhysCellIdCDMA2000.c \ - PhysCellIdGERAN.c \ - PhysCellIdUTRA-FDD.c \ - PhysCellIdUTRA-TDD.c \ - PLMN-Identity.c \ - MCC.c \ - MNC.c \ - MCC-MNC-Digit.c \ - PreRegistrationInfoHRPD.c \ - SecondaryPreRegistrationZoneIdListHRPD.c \ - PreRegistrationZoneIdHRPD.c \ - Q-RxLevMin.c \ - Q-OffsetRange.c \ - Q-OffsetRangeInterRAT.c \ - ReselectionThreshold.c \ - SpeedStateScaleFactors.c \ - SystemTimeInfoCDMA2000.c \ - TrackingAreaCode.c \ - T-Reselection.c \ - AllowedMeasBandwidth.c \ - Hysteresis.c \ - MeasConfig.c \ - MeasIdToRemoveList.c \ - MeasObjectToRemoveList.c \ - ReportConfigToRemoveList.c \ - MeasGapConfig.c \ - MeasId.c \ - MeasIdToAddModList.c \ - MeasIdToAddMod.c \ - MeasObjectCDMA2000.c \ - CellsToAddModListCDMA2000.c \ - CellsToAddModCDMA2000.c \ - MeasObjectEUTRA.c \ - CellsToAddModList.c \ - CellsToAddMod.c \ - BlackCellsToAddModList.c \ - BlackCellsToAddMod.c \ - MeasObjectGERAN.c \ - MeasObjectId.c \ - MeasObjectToAddModList.c \ - MeasObjectToAddMod.c \ - MeasObjectUTRA.c \ - CellsToAddModListUTRA-FDD.c \ - CellsToAddModUTRA-FDD.c \ - CellsToAddModListUTRA-TDD.c \ - CellsToAddModUTRA-TDD.c \ - MeasResults.c \ - MeasResultListEUTRA.c \ - MeasResultEUTRA.c \ - MeasResultListUTRA.c \ - MeasResultUTRA.c \ - MeasResultListGERAN.c \ - MeasResultGERAN.c \ - MeasResultsCDMA2000.c \ - MeasResultListCDMA2000.c \ - MeasResultCDMA2000.c \ - PLMN-IdentityList2.c \ - QuantityConfig.c \ - QuantityConfigEUTRA.c \ - QuantityConfigUTRA.c \ - QuantityConfigGERAN.c \ - QuantityConfigCDMA2000.c \ - ReportConfigEUTRA.c \ - ThresholdEUTRA.c \ - ReportConfigId.c \ - ReportConfigInterRAT.c \ - ThresholdUTRA.c \ - ThresholdGERAN.c \ - ThresholdCDMA2000.c \ - ReportConfigToAddModList.c \ - ReportConfigToAddMod.c \ - ReportInterval.c \ - RSRP-Range.c \ - RSRQ-Range.c \ - TimeToTrigger.c \ - C-RNTI.c \ - DedicatedInfoCDMA2000.c \ - DedicatedInfoNAS.c \ - FilterCoefficient.c \ - MMEC.c \ - NeighCellConfig.c \ - RAND-CDMA2000.c \ - RAT-Type.c \ - RRC-TransactionIdentifier.c \ - S-TMSI.c \ - UE-CapabilityRAT-ContainerList.c \ - UE-CapabilityRAT-Container.c \ - UE-EUTRA-Capability.c \ - AccessStratumRelease.c \ - PDCP-Parameters.c \ - PhyLayerParameters.c \ - RF-Parameters.c \ - SupportedBandListEUTRA.c \ - SupportedBandEUTRA.c \ - MeasParameters.c \ - BandListEUTRA.c \ - BandInfoEUTRA.c \ - InterFreqBandList.c \ - InterFreqBandInfo.c \ - InterRAT-BandList.c \ - InterRAT-BandInfo.c \ - IRAT-ParametersUTRA-FDD.c \ - SupportedBandListUTRA-FDD.c \ - SupportedBandUTRA-FDD.c \ - IRAT-ParametersUTRA-TDD128.c \ - SupportedBandListUTRA-TDD128.c \ - SupportedBandUTRA-TDD128.c \ - IRAT-ParametersUTRA-TDD384.c \ - SupportedBandListUTRA-TDD384.c \ - SupportedBandUTRA-TDD384.c \ - IRAT-ParametersUTRA-TDD768.c \ - SupportedBandListUTRA-TDD768.c \ - SupportedBandUTRA-TDD768.c \ - IRAT-ParametersGERAN.c \ - SupportedBandListGERAN.c \ - SupportedBandGERAN.c \ - IRAT-ParametersCDMA2000-HRPD.c \ - SupportedBandListHRPD.c \ - IRAT-ParametersCDMA2000-1XRTT.c \ - SupportedBandList1XRTT.c \ - UE-TimersAndConstants.c \ - RRC-RRM-Message.c \ - RRC-RRM-MessageType.c \ - RRCSystemConfigurationRequest.c \ - RRCAddUserRequest.c \ - RRCAddUserConfirm.c \ - RRCAddDataRadioBearerRequest.c \ - RRCAddDataRadioBearerConfirm.c \ - RRCRemoveUserRequest.c \ - RRCRemoveDataRadioBearerRequest.c \ - RRCRemoveDataRadioBearerConfirm.c \ - RRCUserReconfigurationComplete.c \ - RRM-RRC-Message.c \ - RRM-RRC-MessageType.c \ - RRCSystemConfigurationResponse.c \ - RRCAddUserResponse.c \ - RRCAddDataRadioBearerResponse.c \ - RRCRemoveUserResponse.c \ - RRCRemoveDataRadioBearerResponse.c \ - RRCUserReconfiguration.c \ - E-NodeB-Identity.c \ - TransactionId.c \ - OpenAir-C-RNTI.c \ - OpenAir-ApplicationKBitRate.c \ - OpenAir-Application-ms-PacketDelay.c \ - OpenAir-Application-TrafficClass.c \ - OpenAir-RRM-Response-Reason.c \ - OpenAir-RRM-Response-Status.c - -ASN_MODULE_HEADERS= \ - BCCH-BCH-Message.h \ - BCCH-BCH-MessageType.h \ - BCCH-DL-SCH-Message.h \ - BCCH-DL-SCH-MessageType.h \ - PCCH-Message.h \ - PCCH-MessageType.h \ - DL-CCCH-Message.h \ - DL-CCCH-MessageType.h \ - DL-DCCH-Message.h \ - DL-DCCH-MessageType.h \ - UL-CCCH-Message.h \ - UL-CCCH-MessageType.h \ - UL-DCCH-Message.h \ - UL-DCCH-MessageType.h \ - CounterCheck.h \ - CounterCheck-r8-IEs.h \ - DRB-CountMSB-InfoList.h \ - DRB-CountMSB-Info.h \ - CounterCheckResponse.h \ - CounterCheckResponse-r8-IEs.h \ - DRB-CountInfoList.h \ - DRB-CountInfo.h \ - CSFBParametersRequestCDMA2000.h \ - CSFBParametersRequestCDMA2000-r8-IEs.h \ - CSFBParametersResponseCDMA2000.h \ - CSFBParametersResponseCDMA2000-r8-IEs.h \ - DLInformationTransfer.h \ - DLInformationTransfer-r8-IEs.h \ - HandoverFromEUTRAPreparationRequest.h \ - HandoverFromEUTRAPreparationRequest-r8-IEs.h \ - MasterInformationBlock.h \ - MeasurementReport.h \ - MeasurementReport-r8-IEs.h \ - MobilityFromEUTRACommand.h \ - MobilityFromEUTRACommand-r8-IEs.h \ - Handover.h \ - CellChangeOrder.h \ - SI-OrPSI-GERAN.h \ - SystemInfoListGERAN.h \ - Paging.h \ - PagingRecordList.h \ - PagingRecord.h \ - PagingUE-Identity.h \ - IMSI.h \ - IMSI-Digit.h \ - RRCConnectionReconfiguration.h \ - RRCConnectionReconfiguration-r8-IEs.h \ - SecurityConfigHO.h \ - RRCConnectionReconfigurationComplete.h \ - RRCConnectionReconfigurationComplete-r8-IEs.h \ - RRCConnectionReestablishment.h \ - RRCConnectionReestablishment-r8-IEs.h \ - RRCConnectionReestablishmentComplete.h \ - RRCConnectionReestablishmentComplete-r8-IEs.h \ - RRCConnectionReestablishmentReject.h \ - RRCConnectionReestablishmentReject-r8-IEs.h \ - RRCConnectionReestablishmentRequest.h \ - RRCConnectionReestablishmentRequest-r8-IEs.h \ - ReestabUE-Identity.h \ - ReestablishmentCause.h \ - RRCConnectionReject.h \ - RRCConnectionReject-r8-IEs.h \ - RRCConnectionRelease.h \ - RRCConnectionRelease-r8-IEs.h \ - ReleaseCause.h \ - RedirectedCarrierInfo.h \ - IdleModeMobilityControlInfo.h \ - FreqPriorityListEUTRA.h \ - FreqPriorityEUTRA.h \ - FreqsPriorityListGERAN.h \ - FreqsPriorityGERAN.h \ - FreqPriorityListUTRA-FDD.h \ - FreqPriorityUTRA-FDD.h \ - FreqPriorityListUTRA-TDD.h \ - FreqPriorityUTRA-TDD.h \ - BandClassPriorityListHRPD.h \ - BandClassPriorityHRPD.h \ - BandClassPriorityList1XRTT.h \ - BandClassPriority1XRTT.h \ - RRCConnectionRequest.h \ - RRCConnectionRequest-r8-IEs.h \ - InitialUE-Identity.h \ - EstablishmentCause.h \ - RRCConnectionSetup.h \ - RRCConnectionSetup-r8-IEs.h \ - RRCConnectionSetupComplete.h \ - RRCConnectionSetupComplete-r8-IEs.h \ - RegisteredMME.h \ - SecurityModeCommand.h \ - SecurityModeCommand-r8-IEs.h \ - SecurityConfigSMC.h \ - SecurityModeComplete.h \ - SecurityModeComplete-r8-IEs.h \ - SecurityModeFailure.h \ - SecurityModeFailure-r8-IEs.h \ - SystemInformation.h \ - SystemInformation-r8-IEs.h \ - SystemInformationBlockType1.h \ - PLMN-IdentityList.h \ - PLMN-IdentityInfo.h \ - SchedulingInfoList.h \ - SchedulingInfo.h \ - SIB-MappingInfo.h \ - SIB-Type.h \ - UECapabilityEnquiry.h \ - UECapabilityEnquiry-r8-IEs.h \ - UE-CapabilityRequest.h \ - UECapabilityInformation.h \ - UECapabilityInformation-r8-IEs.h \ - ULHandoverPreparationTransfer.h \ - ULHandoverPreparationTransfer-r8-IEs.h \ - ULInformationTransfer.h \ - ULInformationTransfer-r8-IEs.h \ - SystemInformationBlockType2.h \ - AC-BarringConfig.h \ - MBSFN-SubframeConfigList.h \ - MBSFN-SubframeConfig.h \ - SystemInformationBlockType3.h \ - SystemInformationBlockType4.h \ - IntraFreqNeighCellList.h \ - IntraFreqNeighCellInfo.h \ - IntraFreqBlackCellList.h \ - SystemInformationBlockType5.h \ - InterFreqCarrierFreqList.h \ - InterFreqCarrierFreqInfo.h \ - InterFreqNeighCellList.h \ - InterFreqNeighCellInfo.h \ - InterFreqBlackCellList.h \ - SystemInformationBlockType6.h \ - CarrierFreqListUTRA-FDD.h \ - CarrierFreqUTRA-FDD.h \ - CarrierFreqListUTRA-TDD.h \ - CarrierFreqUTRA-TDD.h \ - SystemInformationBlockType7.h \ - CarrierFreqsInfoListGERAN.h \ - CarrierFreqsInfoGERAN.h \ - SystemInformationBlockType8.h \ - CellReselectionParametersCDMA2000.h \ - NeighCellListCDMA2000.h \ - NeighCellCDMA2000.h \ - NeighCellsPerBandclassListCDMA2000.h \ - NeighCellsPerBandclassCDMA2000.h \ - PhysCellIdListCDMA2000.h \ - BandClassListCDMA2000.h \ - BandClassInfoCDMA2000.h \ - SystemInformationBlockType9.h \ - SystemInformationBlockType10.h \ - SystemInformationBlockType11.h \ - AntennaInfoCommon.h \ - AntennaInfoDedicated.h \ - CQI-ReportConfig.h \ - CQI-ReportPeriodic.h \ - DRB-Identity.h \ - LogicalChannelConfig.h \ - MAC-MainConfig.h \ - DRX-Config.h \ - PDCP-Config.h \ - PDSCH-ConfigCommon.h \ - PDSCH-ConfigDedicated.h \ - PHICH-Config.h \ - PhysicalConfigDedicated.h \ - P-Max.h \ - PRACH-ConfigSIB.h \ - PRACH-Config.h \ - PRACH-ConfigInfo.h \ - PresenceAntennaPort1.h \ - PUCCH-ConfigCommon.h \ - PUCCH-ConfigDedicated.h \ - PUSCH-ConfigCommon.h \ - PUSCH-ConfigDedicated.h \ - UL-ReferenceSignalsPUSCH.h \ - RACH-ConfigCommon.h \ - RACH-ConfigDedicated.h \ - RadioResourceConfigCommonSIB.h \ - RadioResourceConfigCommon.h \ - BCCH-Config.h \ - PCCH-Config.h \ - UL-CyclicPrefixLength.h \ - RadioResourceConfigDedicated.h \ - SRB-ToAddModList.h \ - SRB-ToAddMod.h \ - DRB-ToAddModList.h \ - DRB-ToAddMod.h \ - DRB-ToReleaseList.h \ - RLC-Config.h \ - UL-AM-RLC.h \ - DL-AM-RLC.h \ - UL-UM-RLC.h \ - DL-UM-RLC.h \ - SN-FieldLength.h \ - T-PollRetransmit.h \ - PollPDU.h \ - PollByte.h \ - T-Reordering.h \ - T-StatusProhibit.h \ - SchedulingRequestConfig.h \ - SoundingRS-UL-ConfigCommon.h \ - SoundingRS-UL-ConfigDedicated.h \ - SPS-Config.h \ - SPS-ConfigDL.h \ - SPS-ConfigUL.h \ - N1-PUCCH-AN-PersistentList.h \ - TDD-Config.h \ - TimeAlignmentTimer.h \ - TPC-PDCCH-Config.h \ - TPC-Index.h \ - UplinkPowerControlCommon.h \ - UplinkPowerControlDedicated.h \ - DeltaFList-PUCCH.h \ - NextHopChainingCount.h \ - SecurityAlgorithmConfig.h \ - ShortMAC-I.h \ - AdditionalSpectrumEmission.h \ - ARFCN-ValueCDMA2000.h \ - ARFCN-ValueEUTRA.h \ - ARFCN-ValueGERAN.h \ - ARFCN-ValueUTRA.h \ - BandclassCDMA2000.h \ - BandIndicatorGERAN.h \ - CarrierFreqCDMA2000.h \ - CarrierFreqGERAN.h \ - CarrierFreqsGERAN.h \ - ExplicitListOfARFCNs.h \ - CDMA2000-Type.h \ - CellIdentity.h \ - CellIndexList.h \ - CellIndex.h \ - CellReselectionPriority.h \ - CSFB-RegistrationParam1XRTT.h \ - CellGlobalIdEUTRA.h \ - CellGlobalIdUTRA.h \ - CellGlobalIdGERAN.h \ - CellGlobalIdCDMA2000.h \ - MobilityControlInfo.h \ - CarrierBandwidthEUTRA.h \ - CarrierFreqEUTRA.h \ - MobilityParametersCDMA2000.h \ - MobilityStateParameters.h \ - PhysCellId.h \ - PhysCellIdRange.h \ - PhysCellIdCDMA2000.h \ - PhysCellIdGERAN.h \ - PhysCellIdUTRA-FDD.h \ - PhysCellIdUTRA-TDD.h \ - PLMN-Identity.h \ - MCC.h \ - MNC.h \ - MCC-MNC-Digit.h \ - PreRegistrationInfoHRPD.h \ - SecondaryPreRegistrationZoneIdListHRPD.h \ - PreRegistrationZoneIdHRPD.h \ - Q-RxLevMin.h \ - Q-OffsetRange.h \ - Q-OffsetRangeInterRAT.h \ - ReselectionThreshold.h \ - SpeedStateScaleFactors.h \ - SystemTimeInfoCDMA2000.h \ - TrackingAreaCode.h \ - T-Reselection.h \ - AllowedMeasBandwidth.h \ - Hysteresis.h \ - MeasConfig.h \ - MeasIdToRemoveList.h \ - MeasObjectToRemoveList.h \ - ReportConfigToRemoveList.h \ - MeasGapConfig.h \ - MeasId.h \ - MeasIdToAddModList.h \ - MeasIdToAddMod.h \ - MeasObjectCDMA2000.h \ - CellsToAddModListCDMA2000.h \ - CellsToAddModCDMA2000.h \ - MeasObjectEUTRA.h \ - CellsToAddModList.h \ - CellsToAddMod.h \ - BlackCellsToAddModList.h \ - BlackCellsToAddMod.h \ - MeasObjectGERAN.h \ - MeasObjectId.h \ - MeasObjectToAddModList.h \ - MeasObjectToAddMod.h \ - MeasObjectUTRA.h \ - CellsToAddModListUTRA-FDD.h \ - CellsToAddModUTRA-FDD.h \ - CellsToAddModListUTRA-TDD.h \ - CellsToAddModUTRA-TDD.h \ - MeasResults.h \ - MeasResultListEUTRA.h \ - MeasResultEUTRA.h \ - MeasResultListUTRA.h \ - MeasResultUTRA.h \ - MeasResultListGERAN.h \ - MeasResultGERAN.h \ - MeasResultsCDMA2000.h \ - MeasResultListCDMA2000.h \ - MeasResultCDMA2000.h \ - PLMN-IdentityList2.h \ - QuantityConfig.h \ - QuantityConfigEUTRA.h \ - QuantityConfigUTRA.h \ - QuantityConfigGERAN.h \ - QuantityConfigCDMA2000.h \ - ReportConfigEUTRA.h \ - ThresholdEUTRA.h \ - ReportConfigId.h \ - ReportConfigInterRAT.h \ - ThresholdUTRA.h \ - ThresholdGERAN.h \ - ThresholdCDMA2000.h \ - ReportConfigToAddModList.h \ - ReportConfigToAddMod.h \ - ReportInterval.h \ - RSRP-Range.h \ - RSRQ-Range.h \ - TimeToTrigger.h \ - C-RNTI.h \ - DedicatedInfoCDMA2000.h \ - DedicatedInfoNAS.h \ - FilterCoefficient.h \ - MMEC.h \ - NeighCellConfig.h \ - RAND-CDMA2000.h \ - RAT-Type.h \ - RRC-TransactionIdentifier.h \ - S-TMSI.h \ - UE-CapabilityRAT-ContainerList.h \ - UE-CapabilityRAT-Container.h \ - UE-EUTRA-Capability.h \ - AccessStratumRelease.h \ - PDCP-Parameters.h \ - PhyLayerParameters.h \ - RF-Parameters.h \ - SupportedBandListEUTRA.h \ - SupportedBandEUTRA.h \ - MeasParameters.h \ - BandListEUTRA.h \ - BandInfoEUTRA.h \ - InterFreqBandList.h \ - InterFreqBandInfo.h \ - InterRAT-BandList.h \ - InterRAT-BandInfo.h \ - IRAT-ParametersUTRA-FDD.h \ - SupportedBandListUTRA-FDD.h \ - SupportedBandUTRA-FDD.h \ - IRAT-ParametersUTRA-TDD128.h \ - SupportedBandListUTRA-TDD128.h \ - SupportedBandUTRA-TDD128.h \ - IRAT-ParametersUTRA-TDD384.h \ - SupportedBandListUTRA-TDD384.h \ - SupportedBandUTRA-TDD384.h \ - IRAT-ParametersUTRA-TDD768.h \ - SupportedBandListUTRA-TDD768.h \ - SupportedBandUTRA-TDD768.h \ - IRAT-ParametersGERAN.h \ - SupportedBandListGERAN.h \ - SupportedBandGERAN.h \ - IRAT-ParametersCDMA2000-HRPD.h \ - SupportedBandListHRPD.h \ - IRAT-ParametersCDMA2000-1XRTT.h \ - SupportedBandList1XRTT.h \ - UE-TimersAndConstants.h \ - RRC-RRM-Message.h \ - RRC-RRM-MessageType.h \ - RRCSystemConfigurationRequest.h \ - RRCAddUserRequest.h \ - RRCAddUserConfirm.h \ - RRCAddDataRadioBearerRequest.h \ - RRCAddDataRadioBearerConfirm.h \ - RRCRemoveUserRequest.h \ - RRCRemoveDataRadioBearerRequest.h \ - RRCRemoveDataRadioBearerConfirm.h \ - RRCUserReconfigurationComplete.h \ - RRM-RRC-Message.h \ - RRM-RRC-MessageType.h \ - RRCSystemConfigurationResponse.h \ - RRCAddUserResponse.h \ - RRCAddDataRadioBearerResponse.h \ - RRCRemoveUserResponse.h \ - RRCRemoveDataRadioBearerResponse.h \ - RRCUserReconfiguration.h \ - E-NodeB-Identity.h \ - TransactionId.h \ - OpenAir-C-RNTI.h \ - OpenAir-ApplicationKBitRate.h \ - OpenAir-Application-ms-PacketDelay.h \ - OpenAir-Application-TrafficClass.h \ - OpenAir-RRM-Response-Reason.h \ - OpenAir-RRM-Response-Status.h - -ASN_MODULE_HEADERS+=BOOLEAN.h -ASN_MODULE_SOURCES+=BOOLEAN.c -ASN_MODULE_HEADERS+=INTEGER.h -ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=NULL.h -ASN_MODULE_SOURCES+=NULL.c -ASN_MODULE_SOURCES+=NativeEnumerated.c -ASN_MODULE_HEADERS+=NativeInteger.h -ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=asn_SET_OF.h -ASN_MODULE_SOURCES+=asn_SET_OF.c -ASN_MODULE_HEADERS+=constr_CHOICE.h -ASN_MODULE_SOURCES+=constr_CHOICE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE.h -ASN_MODULE_SOURCES+=constr_SEQUENCE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=constr_SET_OF.h -ASN_MODULE_SOURCES+=constr_SET_OF.c -ASN_MODULE_HEADERS+=asn_application.h -ASN_MODULE_HEADERS+=asn_system.h -ASN_MODULE_HEADERS+=asn_codecs.h -ASN_MODULE_HEADERS+=asn_internal.h -ASN_MODULE_HEADERS+=OCTET_STRING.h -ASN_MODULE_SOURCES+=OCTET_STRING.c -ASN_MODULE_HEADERS+=BIT_STRING.h -ASN_MODULE_SOURCES+=BIT_STRING.c -ASN_MODULE_SOURCES+=asn_codecs_prim.c -ASN_MODULE_HEADERS+=asn_codecs_prim.h -ASN_MODULE_HEADERS+=ber_tlv_length.h -ASN_MODULE_SOURCES+=ber_tlv_length.c -ASN_MODULE_HEADERS+=ber_tlv_tag.h -ASN_MODULE_SOURCES+=ber_tlv_tag.c -ASN_MODULE_HEADERS+=ber_decoder.h -ASN_MODULE_SOURCES+=ber_decoder.c -ASN_MODULE_HEADERS+=der_encoder.h -ASN_MODULE_SOURCES+=der_encoder.c -ASN_MODULE_HEADERS+=constr_TYPE.h -ASN_MODULE_SOURCES+=constr_TYPE.c -ASN_MODULE_HEADERS+=constraints.h -ASN_MODULE_SOURCES+=constraints.c -ASN_MODULE_HEADERS+=xer_support.h -ASN_MODULE_SOURCES+=xer_support.c -ASN_MODULE_HEADERS+=xer_decoder.h -ASN_MODULE_SOURCES+=xer_decoder.c -ASN_MODULE_HEADERS+=xer_encoder.h -ASN_MODULE_SOURCES+=xer_encoder.c -ASN_MODULE_HEADERS+=per_support.h -ASN_MODULE_SOURCES+=per_support.c -ASN_MODULE_HEADERS+=per_decoder.h -ASN_MODULE_SOURCES+=per_decoder.c -ASN_MODULE_HEADERS+=per_encoder.h -ASN_MODULE_SOURCES+=per_encoder.c -ASN_MODULE_HEADERS+=per_opentype.h -ASN_MODULE_SOURCES+=per_opentype.c -ASN_CONVERTER_SOURCES+=converter-sample.c - - -lib_LTLIBRARIES=libsomething.la -libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) - -# This file may be used as an input for make(3) -# Remove the lines below to convert it into a pure .am file -TARGET = progname -CFLAGS += -I. -OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} - -all: $(TARGET) - -$(TARGET): ${OBJS} - $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) - -.SUFFIXES: -.SUFFIXES: .c .o - -.c.o: - $(CC) $(CFLAGS) -o $@ -c $< - -clean: - rm -f $(TARGET) - rm -f $(OBJS) - -regen: regenerate-from-asn1-source - -regenerate-from-asn1-source: - asn1c -gen-PER -fno-include-deps -fcompound-names -fnative-types -fskeletons-copy /homes/gauthier/PROJETS/trunk/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn /homes/gauthier/PROJETS/trunk/openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn - diff --git a/openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn b/openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn deleted file mode 100755 index 7dcb9962c4..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn +++ /dev/null @@ -1,194 +0,0 @@ -RRM-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - -IMPORTS - DRB-Identity, - PhysCellId, - RadioResourceConfigDedicated, - RRCConnectionReconfiguration-r8-IEs, - RRCConnectionReconfigurationComplete-r8-IEs, - SystemInformation, - SystemInformationBlockType1, - SystemInformationBlockType2 FROM EUTRA-RRC-Definitions; - -RRC-RRM-Message ::= SEQUENCE { - message RRC-RRM-MessageType -} - -RRC-RRM-MessageType ::= CHOICE { - c1 CHOICE { - rrcSystemConfigurationRequest RRCSystemConfigurationRequest, - rrcAddUserRequest RRCAddUserRequest, - rrcAddUserConfirm RRCAddUserConfirm, - rrcAddDataRadioBearerRequest RRCAddDataRadioBearerRequest, - rrcAddDataRadioBearerConfirm RRCAddDataRadioBearerConfirm, - rrcRemoveUserRequest RRCRemoveUserRequest, - rrcRemoveDataRadioBearerRequest RRCRemoveDataRadioBearerRequest, - rrcRemoveDataRadioBearerConfirm RRCRemoveDataRadioBearerConfirm, - rrcUserReconfigurationComplete RRCUserReconfigurationComplete - - }, - messageClassExtension SEQUENCE {} -} - - - -RRCSystemConfigurationRequest ::= SEQUENCE { - transactionId TransactionId -} - -RRCAddUserRequest ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI -} - -RRCAddUserConfirm ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI -} - -RRCAddDataRadioBearerRequest ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - drb-Identity DRB-Identity, - applicationTrafficClass OpenAir-Application-TrafficClass, - applicationPacketDelay OpenAir-Application-ms-PacketDelay, - guaranted-bit-rate-uplink OpenAir-ApplicationKBitRate, - max-bit-rate-uplink OpenAir-ApplicationKBitRate, - guaranted-bit-rate-downlink OpenAir-ApplicationKBitRate, - max-bit-rate-downlink OpenAir-ApplicationKBitRate -} - -RRCAddDataRadioBearerConfirm ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - drb-Identity DRB-Identity -} - -RRCRemoveUserRequest ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI -} - - -RRCRemoveDataRadioBearerRequest ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - drb-Identity DRB-Identity -} - -RRCRemoveDataRadioBearerConfirm ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - drb-Identity DRB-Identity -} - -RRCUserReconfigurationComplete ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI -} - - -RRM-RRC-Message ::= SEQUENCE { - message RRM-RRC-MessageType -} - -RRM-RRC-MessageType ::= CHOICE { - c1 CHOICE { - rrcSystemConfigurationResponse RRCSystemConfigurationResponse, - rrcAddUserResponse RRCAddUserResponse, - rrcAddDataRadioBearerResponse RRCAddDataRadioBearerResponse, - rrcRemoveUserResponse RRCRemoveUserResponse, - rrcRemoveDataRadioBearerResponse RRCRemoveDataRadioBearerResponse, - rrcUserReconfiguration RRCUserReconfiguration - }, - messageClassExtension SEQUENCE {} -} - -RRCSystemConfigurationResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - systemInformationBlockType1 SystemInformationBlockType1 OPTIONAL, - systemInformation SystemInformation OPTIONAL -} - -RRCAddUserResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -RRCAddDataRadioBearerResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - -- MAY BE USELESS SINCE INCLUDED IN RadioResourceConfigDedicated drb-Identity DRB-Identity, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -RRCRemoveUserResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -RRCRemoveDataRadioBearerResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -RRCUserReconfiguration ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -E-NodeB-Identity ::= SEQUENCE { - physCellId PhysCellId -} - -TransactionId ::= INTEGER (0..255) -OpenAir-C-RNTI ::= INTEGER (0..255) -OpenAir-ApplicationKBitRate ::= INTEGER (0..100000) -OpenAir-Application-ms-PacketDelay ::= INTEGER (0..10000) -OpenAir-Application-TrafficClass ::= INTEGER (0..255) - -OpenAir-RRM-Response-Reason ::= ENUMERATED { - ok, protocolError, ressourcesUnavailable, malformedMessage, unknownMessage, internalError } - -OpenAir-RRM-Response-Status ::= ENUMERATED { - success, warning, failure } - - -END diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp deleted file mode 100644 index e9a2901ece..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include - -#include "RRC2RRMMessageAddRadioAccessBearerConfirm.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerConfirm::RRC2RRMMessageAddRadioAccessBearerConfirm(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerConfirm::RRC2RRMMessageAddRadioAccessBearerConfirm(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP): -Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); -/* if (m_is_ipv6) { - printf("[RRM][RRC2RRMMessageAddRadioAccessBearerConfirm] (IPv6) Received %d bytes from: %s:%d\n", msg_lengthP, m_ip_char_src, m_port_src); - } else { - printf("[RRM][RRC2RRMMessageAddRadioAccessBearerConfirm] (IPv4) Received %d bytes from: %s:%d\n", msg_lengthP, m_ip_char_src, m_port_src); - }*/ - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("RRC\t-------ADD DATA RADIO BEARER CONFIRM------->\tRRM\n"); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddRadioAccessBearerConfirm::Forward() -//---------------------------------------------------------------------------- -{ - try { - Transaction* tx = RadioResources::Instance()->Request(*this); - if (tx != NULL) { - delete tx; - } - } catch (std::exception const& e ) { - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddRadioAccessBearerConfirm::Serialize() -//---------------------------------------------------------------------------- -{ - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_ADD_RADIO_ACCESS_BEARER_CONFIRM); - m_message_storage.writeShort(7u); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeChar(m_transaction_id); -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerConfirm::~RRC2RRMMessageAddRadioAccessBearerConfirm() -//---------------------------------------------------------------------------- -{ -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h deleted file mode 100644 index 4c7bd2befb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRC2RRMMESSAGEADDRADIOACCESSBEARERCONFIRM_H -# define _RRC2RRMMESSAGEADDRADIOACCESSBEARERCONFIRM_H - -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageAddRadioAccessBearerConfirm: public Message -{ - -public: - RRC2RRMMessageAddRadioAccessBearerConfirm(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP); - RRC2RRMMessageAddRadioAccessBearerConfirm (tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - ~RRC2RRMMessageAddRadioAccessBearerConfirm (); - - void Serialize (); - void Forward(); - const unsigned int GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } - -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - rb_id_t m_radio_bearer_id; - transaction_id_t m_transaction_id; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp deleted file mode 100644 index 3463c745de..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include - -#include "RRC2RRMMessageAddRadioAccessBearerRequest.h" -#include "RRM2RRCMessageAddRadioAccessBearerResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerRequest::RRC2RRMMessageAddRadioAccessBearerRequest(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - unsigned short traffic_classP, - unsigned short delayP, - unsigned int guaranted_bit_rate_uplinkP, - unsigned int max_bit_rate_uplinkP, - unsigned int guaranted_bit_rate_downlinkP, - unsigned int max_bit_rate_downlinkP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_traffic_class = traffic_classP; - m_delay = delayP; - m_guaranted_bit_rate_uplink = guaranted_bit_rate_uplinkP; - m_max_bit_rate_uplink = max_bit_rate_uplinkP; - m_guaranted_bit_rate_downlink = guaranted_bit_rate_downlinkP; - m_max_bit_rate_downlink = max_bit_rate_downlinkP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerRequest::RRC2RRMMessageAddRadioAccessBearerRequest(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP): -Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id = m_message_storage.readChar(); - m_traffic_class = m_message_storage.readShort(); - m_delay = m_message_storage.readShort(); - m_guaranted_bit_rate_uplink = m_message_storage.readInt(); - m_max_bit_rate_uplink = m_message_storage.readInt(); - m_guaranted_bit_rate_downlink = m_message_storage.readInt(); - m_max_bit_rate_downlink = m_message_storage.readInt(); - m_transaction_id = m_message_storage.readChar(); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("RRC\t-------ADD DATA RADIO BEARER REQUEST------->\tRRM\n"); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddRadioAccessBearerRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - Transaction* tx = RadioResources::Instance()->Request(*this); - RRM2RRCMessageAddRadioAccessBearerResponse response(Message::STATUS_ADD_RADIO_ACCESS_BEARER_SUCCESSFULL, Message::MSG_RESP_OK, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id, tx); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (mobile_already_connected_error & x ) { - RRM2RRCMessageAddRadioAccessBearerResponse response(Message::STATUS_ADD_RADIO_ACCESS_BEARER_FAILED, Message::MSG_RESP_PROTOCOL_ERROR, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageAddRadioAccessBearerResponse response(Message::STATUS_ADD_RADIO_ACCESS_BEARER_FAILED, Message::MSG_RESP_INTERNAL_ERROR, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddRadioAccessBearerRequest::Serialize() -//---------------------------------------------------------------------------- -{ - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_ADD_RADIO_ACCESS_BEARER_REQUEST); - m_message_storage.writeShort(27u); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeShort(m_traffic_class); - m_message_storage.writeShort(m_delay); - m_message_storage.writeInt(m_guaranted_bit_rate_uplink); - m_message_storage.writeInt(m_max_bit_rate_uplink); - m_message_storage.writeInt(m_guaranted_bit_rate_downlink); - m_message_storage.writeInt( m_max_bit_rate_downlink); - m_message_storage.writeChar(m_transaction_id); -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerRequest::~RRC2RRMMessageAddRadioAccessBearerRequest() -//---------------------------------------------------------------------------- -{ -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h deleted file mode 100644 index cbad1b34d2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRC2RRMMESSAGEADDRADIOACCESSBEARERREQUEST_H -# define _RRC2RRMMESSAGEADDRADIOACCESSBEARERREQUEST_H - -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageAddRadioAccessBearerRequest: public Message -{ - -public: - RRC2RRMMessageAddRadioAccessBearerRequest(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - unsigned short traffic_classP, - unsigned short delayP, - unsigned int guaranted_bit_rate_uplinkP, - unsigned int max_bit_rate_uplinkP, - unsigned int guaranted_bit_rate_downlinkP, - unsigned int max_bit_rate_downlinkP, - transaction_id_t transaction_idP); - RRC2RRMMessageAddRadioAccessBearerRequest (tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - ~RRC2RRMMessageAddRadioAccessBearerRequest (); - - void Serialize (); - void Forward(); - const unsigned int GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } - - const unsigned short GetTrafficClass() { - return m_traffic_class; - } - const unsigned short GetDelay() { - return m_delay; - } - const unsigned int GetGuarantedBitRateUplink() { - return m_guaranted_bit_rate_uplink; - } - const unsigned int GetMaxBitRateUplink() { - return m_max_bit_rate_uplink; - } - const unsigned int GetGuarantedBitRateDownlink() { - return m_guaranted_bit_rate_downlink; - } - const unsigned int GetMaxBitRateDownlink() { - return m_max_bit_rate_downlink; - } - -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - rb_id_t m_radio_bearer_id; - unsigned short m_traffic_class; - unsigned short m_delay; - unsigned int m_guaranted_bit_rate_uplink; - unsigned int m_max_bit_rate_uplink; - unsigned int m_guaranted_bit_rate_downlink; - unsigned int m_max_bit_rate_downlink; - transaction_id_t m_transaction_id; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp deleted file mode 100644 index a76be030a1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageAddUserConfirm.h" -#include "RRM2RRCMessageUserReconfiguration.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserConfirm::RRC2RRMMessageAddUserConfirm(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - m_asn1_message = asn1_messageP; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.c_RNTI; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserConfirm::RRC2RRMMessageAddUserConfirm(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_asn1_message = static_cast(CALLOC(1,sizeof(RRC_RRM_Message_t))); - memset(m_asn1_message, 0, sizeof(RRC_RRM_Message_t)); - m_asn1_message->message.present = RRC_RRM_MessageType_PR_c1; - m_asn1_message->message.choice.c1.present = RRC_RRM_MessageType__c1_PR_rrcAddUserConfirm; - m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.e_NodeB_Identity.physCellId = cell_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.c_RNTI = mobile_idP; - - - m_transaction_id = transaction_idP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_msg_length = 0; - Serialize(); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddUserConfirm::Forward() -//---------------------------------------------------------------------------- -{ - try { - RRM2RRCMessageUserReconfiguration* user_reconfiguration = RadioResources::Instance()->Request(*this); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, user_reconfiguration->GetSerializedMessageBuffer(), user_reconfiguration->GetSerializedMessageSize()); - delete user_reconfiguration; - } catch (std::exception const& e ) { - RRM2RRCMessageUserReconfiguration response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_internalError, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddUserConfirm::Serialize () -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRC_RRM_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - cout << "[RRM][RRC2RRMMessageAddUserConfirm] asn_DEF_RRC_RRM_Message Encoded " << enc_rval.encoded << " bits (" << (enc_rval.encoded+7)/8 << " bytes)" << endl; - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - cerr << "[RRM][RRC2RRMMessageAddUserConfirm] ASN1 : asn_DEF_RRC_RRM_Message encoding FAILED, EXITING" << endl; - throw asn1_encoding_error(); - } - } -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserConfirm::~RRC2RRMMessageAddUserConfirm() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - cout << "[RRM][RRC2RRMMessageAddUserConfirm::~RRC2RRMMessageAddUserConfirm()] free asn1_message start" << endl; - ASN_STRUCT_FREE( asn_DEF_RRC_RRM_Message, m_asn1_message); - cout << "[RRM][RRC2RRMMessageAddUserConfirm::~RRC2RRMMessageAddUserConfirm()] free asn1_message end" << endl; - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h deleted file mode 100644 index 7ea78437d8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRC2RRMMESSAGEADDUSERCONFIRM_H -# define _RRC2RRMMESSAGEADDUSERCONFIRM_H - -# include "RRC-RRM-Message.h" -# include "Message.h" -# include "platform.h" - - -class RRC2RRMMessageAddUserConfirm: public Message -{ - -public: - RRC2RRMMessageAddUserConfirm(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP); - RRC2RRMMessageAddUserConfirm(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRC2RRMMessageAddUserConfirm (); - - void Serialize (); - void Forward(); - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - RRC_RRM_Message_t *m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp deleted file mode 100644 index 8b0bae465f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageAddUserRequest.h" -#include "RRM2RRCMessageAddUserResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserRequest::RRC2RRMMessageAddUserRequest(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - m_asn1_message = asn1_messageP; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.c_RNTI; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserRequest::RRC2RRMMessageAddUserRequest(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_asn1_message = static_cast(CALLOC(1,sizeof(RRC_RRM_Message_t))); - memset(m_asn1_message, 0, sizeof(RRC_RRM_Message_t)); - m_asn1_message->message.present = RRC_RRM_MessageType_PR_c1; - m_asn1_message->message.choice.c1.present = RRC_RRM_MessageType__c1_PR_rrcAddUserRequest; - m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.e_NodeB_Identity.physCellId = cell_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.c_RNTI = mobile_idP; - - - m_transaction_id = transaction_idP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_msg_length = 0; - Serialize(); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddUserRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - RRM2RRCMessageAddUserResponse* add_user_response = RadioResources::Instance()->Request(*this); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, add_user_response->GetSerializedMessageBuffer(), add_user_response->GetSerializedMessageSize()); - delete add_user_response; - } catch (mobile_already_connected_error & x ) { - RRM2RRCMessageAddUserResponse response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_protocolError, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageAddUserResponse response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_internalError, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddUserRequest::Serialize () -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRC_RRM_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRC2RRMMessageConnectionRequest] asn_DEF_RRC_RRM_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - printf("[RRM][RRC2RRMMessageConnectionRequest] ASN1 : asn_DEF_RRC_RRM_Message encoding FAILED, EXITING\n"); - throw asn1_encoding_error(); - } - } -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserRequest::~RRC2RRMMessageAddUserRequest() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - ASN_STRUCT_FREE( asn_DEF_RRC_RRM_Message, m_asn1_message); - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h deleted file mode 100644 index 24c0dc5c4f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRC2RRMMESSAGEADDUSERREQUEST_H -# define _RRC2RRMMESSAGEADDUSERREQUEST_H - -# include "RRC-RRM-Message.h" -# include "Message.h" -# include "platform.h" - -class RRC2RRMMessageAddUserRequest: public Message -{ - -public: - RRC2RRMMessageAddUserRequest(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP); - RRC2RRMMessageAddUserRequest(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRC2RRMMessageAddUserRequest (); - - void Serialize (); - void Forward(); - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - RRC_RRM_Message_t *m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp deleted file mode 100644 index 6bb3ffc403..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include - -#include "RRC2RRMMessageConnectionRequest.h" -#include "RRM2RRCMessageConnectionResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "Utility.h" - -using namespace std; - -//---------------------------------------------------------------------------- -RRC2RRMMessageConnectionRequest::RRC2RRMMessageConnectionRequest(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRC2RRMMessageConnectionRequest(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationRequest.transactionId; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageConnectionRequest::RRC2RRMMessageConnectionRequest(std::string ip_dest_strP, int port_destP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_asn1_message = static_cast(CALLOC(1,sizeof(RRC_RRM_Message_t))); - m_asn1_message->message.present = RRC_RRM_MessageType_PR_c1; - m_asn1_message->message.choice.c1.present = RRC_RRM_MessageType__c1_PR_rrcSystemConfigurationRequest; - m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationRequest.transactionId = transaction_idP; - - m_transaction_id = transaction_idP; - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_msg_length = 0; - Serialize(); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageConnectionRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - - RRM2RRCMessageConnectionResponse* connection_response = RadioResources::Instance()->Request(*this); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, connection_response->GetSerializedMessageBuffer(), connection_response->GetSerializedMessageSize()); - delete connection_response; - } catch (enodeb_already_connected_error & x ) { - RRM2RRCMessageConnectionResponse connection_response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_protocolError); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, connection_response.GetSerializedMessageBuffer(), connection_response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageConnectionResponse connection_response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_internalError); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, connection_response.GetSerializedMessageBuffer(), connection_response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageConnectionRequest::Serialize() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRC_RRM_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRC2RRMMessageConnectionRequest] asn_DEF_RRM_RRC_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - printf("[RRM][RRC2RRMMessageConnectionRequest] ASN1 : asn_DEF_RRC_RRM_Message encoding FAILED, EXITING\n"); - throw asn1_encoding_error(); - } - } -} -//---------------------------------------------------------------------------- -RRC2RRMMessageConnectionRequest::~RRC2RRMMessageConnectionRequest() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - ASN_STRUCT_FREE( asn_DEF_RRC_RRM_Message, m_asn1_message); - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h deleted file mode 100644 index 986d2206cb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRC2RRMMESSAGECONNECTIONREQUEST_H -# define _RRC2RRMMESSAGECONNECTIONREQUEST_H - -# include "RRC-RRM-Message.h" -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageConnectionRequest: public Message -{ - -public: - RRC2RRMMessageConnectionRequest(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP); - RRC2RRMMessageConnectionRequest (std::string ip_dest_strP, int port_destP, transaction_id_t transaction_idP); - ~RRC2RRMMessageConnectionRequest (); - - void Serialize (); - void Forward(); - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } -private: - //cell_id_t m_cell_id; - transaction_id_t m_transaction_id; - RRC_RRM_Message_t *m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp deleted file mode 100644 index f968bba5e3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageRemoveRadioAccessBearerRequest.h" -#include "RRM2RRCMessageRemoveRadioAccessBearerResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveRadioAccessBearerRequest::RRC2RRMMessageRemoveRadioAccessBearerRequest(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveRadioAccessBearerRequest::RRC2RRMMessageRemoveRadioAccessBearerRequest(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP): -Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("RRC\t-------REMOVE DATA RADIO BEARER REQUEST------->\tRRM\n"); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageRemoveRadioAccessBearerRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - Transaction* tx = RadioResources::Instance()->Request(*this); - RRM2RRCMessageRemoveRadioAccessBearerResponse response(Message::STATUS_REMOVE_RADIO_ACCESS_BEARER_SUCCESSFULL, Message::MSG_RESP_OK, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id, tx); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (mobile_already_connected_error & x ) { - RRM2RRCMessageRemoveRadioAccessBearerResponse response(Message::STATUS_REMOVE_RADIO_ACCESS_BEARER_FAILED, Message::MSG_RESP_PROTOCOL_ERROR, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageRemoveRadioAccessBearerResponse response(Message::STATUS_REMOVE_RADIO_ACCESS_BEARER_FAILED, Message::MSG_RESP_INTERNAL_ERROR, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageRemoveRadioAccessBearerRequest::Serialize() -//---------------------------------------------------------------------------- -{ - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_REMOVE_RADIO_ACCESS_BEARER_REQUEST); - m_message_storage.writeShort(7u); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeChar(m_transaction_id); -} -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveRadioAccessBearerRequest::~RRC2RRMMessageRemoveRadioAccessBearerRequest() -//---------------------------------------------------------------------------- -{ -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h deleted file mode 100644 index 7ee183c7d0..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRC2RRMMESSAGEREMOVERADIOACCESSBEARERREQUEST_H -# define _RRC2RRMMESSAGEREMOVERADIOACCESSBEARERREQUEST_H - -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageRemoveRadioAccessBearerRequest: public Message -{ - -public: - RRC2RRMMessageRemoveRadioAccessBearerRequest(std::string ip_dest_strP, - int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP); - - RRC2RRMMessageRemoveRadioAccessBearerRequest (tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - ~RRC2RRMMessageRemoveRadioAccessBearerRequest (); - - void Serialize (); - void Forward(); - - const unsigned int GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - - transaction_id_t m_transaction_id; - rb_id_t m_radio_bearer_id; - unsigned short m_traffic_class; - unsigned short m_delay; - unsigned int m_guaranted_bit_rate_uplink; - unsigned int m_max_bit_rate_uplink; - unsigned int m_guaranted_bit_rate_downlink; - unsigned int m_max_bit_rate_downlink; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp deleted file mode 100644 index 0e3aaf9ef3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageRemoveUserRequest.h" -#include "RRM2RRCMessageRemoveUserResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveUserRequest::RRC2RRMMessageRemoveUserRequest(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveUserRequest::RRC2RRMMessageRemoveUserRequest(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP): -Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("RRC\t-------REMOVE USER REQUEST------->\tRRM\n"); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("cell id = %d mobile id = %d transaction id = %d \n", m_cell_id, m_mobile_id, m_transaction_id); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageRemoveUserRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - Transaction* tx = RadioResources::Instance()->Request(*this); - RRM2RRCMessageRemoveUserResponse response(Message::STATUS_REMOVE_USER_SUCCESSFULL, Message::MSG_RESP_OK, m_cell_id, m_mobile_id, m_transaction_id, tx); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (mobile_already_connected_error & x ) { - RRM2RRCMessageRemoveUserResponse response(Message::STATUS_REMOVE_USER_FAILED, Message::MSG_RESP_PROTOCOL_ERROR, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageRemoveUserResponse response(Message::STATUS_REMOVE_USER_FAILED, Message::MSG_RESP_INTERNAL_ERROR, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageRemoveUserRequest::Serialize() -//---------------------------------------------------------------------------- -{ - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_REMOVE_USER_REQUEST); - m_message_storage.writeShort(6u); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_transaction_id); -} -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveUserRequest::~RRC2RRMMessageRemoveUserRequest() -//---------------------------------------------------------------------------- -{ -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h deleted file mode 100644 index ab81140ac5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRC2RRMMESSAGEREMOVEUSERREQUEST_H -# define _RRC2RRMMESSAGEREMOVEUSERREQUEST_H - -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageRemoveUserRequest: public Message -{ - -public: - RRC2RRMMessageRemoveUserRequest(std::string ip_dest_strP, int port_destP, - cell_id_t , - mobile_id_t , - transaction_id_t ); - - RRC2RRMMessageRemoveUserRequest (tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - - ~RRC2RRMMessageRemoveUserRequest (); - - void Serialize (); - void Forward(); - const unsigned int GetENodeBId() { - return 1u; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } - -protected: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp deleted file mode 100644 index 88019a5615..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageUserReconfigurationComplete.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "Utility.h" -//---------------------------------------------------------------------------- -RRC2RRMMessageUserReconfigurationComplete::RRC2RRMMessageUserReconfigurationComplete(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRC2RRMMessageUserReconfigurationComplete(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.c_RNTI; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageUserReconfigurationComplete::RRC2RRMMessageUserReconfigurationComplete(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_asn1_message = static_cast(CALLOC(1,sizeof(RRC_RRM_Message_t))); - memset(m_asn1_message, 0, sizeof(RRC_RRM_Message_t)); - m_asn1_message->message.present = RRC_RRM_MessageType_PR_c1; - m_asn1_message->message.choice.c1.present = RRC_RRM_MessageType__c1_PR_rrcUserReconfigurationComplete; - m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.e_NodeB_Identity.physCellId = cell_idP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.c_RNTI = mobile_idP; - - - m_transaction_id = transaction_idP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_msg_length = 0; - Serialize(); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageUserReconfigurationComplete::Forward() -//---------------------------------------------------------------------------- -{ - try { - RadioResources::Instance()->Request(*this); - } catch (std::exception const& e ) { - - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageUserReconfigurationComplete::Serialize() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - //xer_fprint(stdout, &asn_DEF_RRC_RRM_Message, (void*)m_asn1_message); - char errbuf[256]; - size_t errlen = sizeof(errbuf); - int ret = asn_check_constraints(&asn_DEF_RRC_RRM_Message, m_asn1_message, errbuf, &errlen); - if (ret) { - fprintf(stderr, "CONSTRAINT VALIDATION FAILED FOR RRM-RRC Message: %s\n", errbuf); - exit (-1); - } - - - - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRC_RRM_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRC2RRMMessageUserReconfigurationComplete] asn_DEF_RRC_RRM_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - cerr << "[RRM][RRC2RRMMessageUserReconfigurationComplete] ASN1 : asn_DEF_RRC_RRM_Message encoding FAILED, EXITING" << endl; - cerr << "[RRM][RRC2RRMMessageUserReconfigurationComplete] Cannot encode "<< enc_rval.failed_type->name <<" " << strerror(errno) << endl; - throw asn1_encoding_error(); - } - //xer_fprint(stdout, &asn_DEF_RRC_RRM_Message, (void*)m_asn1_message); - } -} -//---------------------------------------------------------------------------- -RRC2RRMMessageUserReconfigurationComplete::~RRC2RRMMessageUserReconfigurationComplete() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - cout << "[RRM][RRC2RRMMessageUserReconfigurationComplete::~RRC2RRMMessageUserReconfigurationComplete()] free asn1_message start" << endl; - ASN_STRUCT_FREE( asn_DEF_RRC_RRM_Message, m_asn1_message); - m_asn1_message = NULL; - cout << "[RRM][RRC2RRMMessageUserReconfigurationComplete::~RRC2RRMMessageUserReconfigurationComplete()] free asn1_message end " << endl; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h deleted file mode 100644 index 9592790c70..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRC2RRMMESSAGEUSERRECONFIGURATIONCOMPLETE_H -# define _RRC2RRMMESSAGEUSERRECONFIGURATIONCOMPLETE_H - -# include "RRC-RRM-Message.h" -# include "Message.h" -# include "platform.h" - -class RRC2RRMMessageUserReconfigurationComplete: public Message -{ - -public: - RRC2RRMMessageUserReconfigurationComplete(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP); - RRC2RRMMessageUserReconfigurationComplete(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRC2RRMMessageUserReconfigurationComplete (); - - void Serialize (); - void Forward(); - - const cell_id_t GetENodeBId() { - return m_cell_id; - } - mobile_id_t GetMobileId() { - return m_mobile_id; - }; - transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - - RRC_RRM_Message_t* m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp deleted file mode 100644 index 5915955308..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include "RRCMessageHandler.h" - - -RRCMessageHandler* RRCMessageHandler::s_instance = 0; - -//---------------------------------------------------------------------------- -void* RRCMessageHandlerThreadLoop(void *arg) -//---------------------------------------------------------------------------- -{ - - return RRCMessageHandler::Instance()->ThreadLoop(arg); -} -//----------------------------------------------------------------- -RRCMessageHandler* RRCMessageHandler::Instance() -//----------------------------------------------------------------- -{ - if (RRCMessageHandler::s_instance == 0) { - RRCMessageHandler::s_instance = new RRCMessageHandler; - } - return s_instance; -} -//----------------------------------------------------------------- -RRCMessageHandler::RRCMessageHandler() -//----------------------------------------------------------------- -{ - m_socket_handler = new SocketHandler(); - m_log = new StdoutLog() ; - m_socket_handler->RegStdLog(m_log); - - m_socket = new RRCUdpSocket(*m_socket_handler, 16384, true); - port_t port = 33333; - Ipv6Address ad("0::1", port); - if (m_socket->Bind(ad, 1) == -1) { - printf("Exiting...\n"); - exit(-1); - } else { - printf("Ready to receive on port %d\n",port); - } - m_socket_handler->Add(m_socket); - - if (pthread_create(&m_thread, NULL, RRCMessageHandlerThreadLoop, (void *) NULL) != 0) { - fprintf(stderr, "\nRRCMessageHandler::RRCMessageHandler() ERROR pthread_create...\n"); - } else { - pthread_setname_np( m_thread, "RRCMsgHandler" ); - } -} -//---------------------------------------------------------------------------- -void* RRCMessageHandler::ThreadLoop(void *arg) -//---------------------------------------------------------------------------- -{ - - m_socket_handler->Select(1,0); - - while (m_socket_handler->GetCount() && !*m_quit) { - m_socket_handler->Select(1,0); - } - fprintf(stderr, "\nRRCMessageHandler::ThreadLoop Exiting...\n"); - return NULL; -} -//---------------------------------------------------------------------------- -void RRCMessageHandler::Join(bool *quitP) -//---------------------------------------------------------------------------- -{ - m_quit = quitP; - - pthread_join(m_thread, NULL); - fprintf(stderr, "\nRRCMessageHandler::Join Done\n"); -} - -//---------------------------------------------------------------------------- -void RRCMessageHandler::NotifyRxData(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//---------------------------------------------------------------------------- -{ - Message* message; - do { - //message = Message::Deserialize(in_bufferP, size_dataP, sa_fromP, sa_lenP); - message = Message::DeserializeRRCMessage(in_bufferP, size_dataP, sa_fromP, sa_lenP); - if (message != NULL) { - //fprintf(stderr, "RRCMessageHandler::notifyRxData GOT MESSAGE\n"); - message->Forward(); - delete message; - message = NULL; - } else { - // TO DO - } - } while (message != NULL); -} -//----------------------------------------------------------------- -void RRCMessageHandler::Send2Peer(Message* messageP) -//----------------------------------------------------------------- -{ - Send2Peer(messageP->GetSrcAddress(), messageP->GetSrcPort(), messageP->GetSerializedMessageBuffer(), messageP->GetSerializedMessageSize()); - delete messageP; -} -//----------------------------------------------------------------- -void RRCMessageHandler::Send2Peer(std::string ip_dest_strP, int port_destP, const char *in_bufferP, msg_length_t size_dataP) -//----------------------------------------------------------------- -{ - std::string lo_bad_address("1"); - std::string lo_good_address("0::1"); - if (ip_dest_strP.compare(lo_bad_address) != 0) { - m_socket->SendToBuf(ip_dest_strP, port_destP, in_bufferP, size_dataP, 0); - } else { - m_socket->SendToBuf(lo_good_address, port_destP, in_bufferP, size_dataP, 0); - } -} -//----------------------------------------------------------------- -RRCMessageHandler::~RRCMessageHandler() -//----------------------------------------------------------------- -{ - if (m_socket_handler != 0) - { - delete m_socket_handler; - } - if (m_log != 0) - { - delete m_log; - } - // m_socket should be closed and deleted by m_socket_handler -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h deleted file mode 100644 index a652c0dd47..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -# ifndef _RRCMESSAGEHANDLER_H -# define _RRCMESSAGEHANDLER_H - -# include - -# include "StdoutLog.h" -# include "SocketHandlerEp.h" -# include "RRCUdpSocket.h" -# include "ListenSocket.h" -# include "Message.h" -# include "platform.h" - - -class RRCMessageHandler -{ -public: - static RRCMessageHandler *Instance (); - void NotifyRxData (const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - void Send2Peer (Message *); - void Send2Peer(std::string ip_dest_strP, int port_destP, const char *in_bufferP, msg_length_t size_dataP); - void* ThreadLoop(void *arg); - void Join(bool *quitP); - ~RRCMessageHandler (); - -private: - RRCMessageHandler (); - - SocketHandler *m_socket_handler; - RRCUdpSocket *m_socket; - StdoutLog *m_log; - pthread_t m_thread; - bool *m_quit; - static RRCMessageHandler *s_instance; -}; -# endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp deleted file mode 100644 index 150b07bd67..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include - -#include "RRCUdpSocket.h" -#include "RRCMessageHandler.h" - - -RRCUdpSocket::RRCUdpSocket(ISocketHandler& h,int ibufsz, bool ipv6) -:UdpSocket(h, ibufsz, ipv6) -{ -} - - -void RRCUdpSocket::OnRawData(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -{ - RRCMessageHandler::Instance()->NotifyRxData(in_bufferP, size_dataP, sa_fromP, sa_lenP); -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h deleted file mode 100644 index ea6d6a1148..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRCUDPSOCKET_H -#define _RRCUDPSOCKET_H - -#include "UdpSocket.h" - - -class RRCUdpSocket : public UdpSocket -{ -public: - RRCUdpSocket(ISocketHandler&,int ibufsz, bool ipv6); - - void OnRawData(const char *,size_t,struct sockaddr *,socklen_t); -}; - - -#endif // _RRCUDPSOCKET_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp deleted file mode 100644 index e0ba3538ee..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageAddRadioAccessBearerResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageAddRadioAccessBearerResponse::RRM2RRCMessageAddRadioAccessBearerResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP):Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_status = m_message_storage.readChar(); - m_reason = m_message_storage.readChar(); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id= m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - m_transaction_result = NULL; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "RRC\t<-------ADD DATA RADIO BEARER RESPONSE-------\tRRM STATUS: "<< Message::StatusToString(m_status).c_str() << " REASON: "<< Message::ReasonToString(m_reason).c_str() << endl; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "cell id = " << m_cell_id << " mobile id = " << m_mobile_id << " radio bearer id = "<< m_radio_bearer_id << " transaction id = "<< m_transaction_id << endl; - if ((msg_lengthP - 6) > 0 ) { - m_transaction_result = new Transaction(m_transaction_id, m_message_storage, msg_lengthP - 6); - cout << m_transaction_result->ToString().c_str() << endl; - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddRadioAccessBearerResponse::RRM2RRCMessageAddRadioAccessBearerResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddRadioAccessBearerResponse::RRM2RRCMessageAddRadioAccessBearerResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP, - Transaction* transactionP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; - m_transaction_result = transactionP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageAddRadioAccessBearerResponse::Serialize () -//---------------------------------------------------------------------------- -{ - //printf("[RRM][RRM2RRCMessageAddRadioAccessBearerResponse] Serialize () status = %d reason = %d cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_status, m_reason, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - int tx_packet_size = 0; - if (m_transaction_result != NULL) { - tx_packet_size = m_transaction_result->Size(); - } - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_ADD_RADIO_ACCESS_BEARER_RESPONSE); - m_message_storage.writeShort(9u+tx_packet_size); - m_message_storage.writeChar(m_status); - m_message_storage.writeChar(m_reason); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeChar(m_transaction_id); - if (m_transaction_result != NULL) { - unsigned char packet[tx_packet_size]; - m_transaction_result->Serialize(&packet[0]); - m_message_storage.writePacket(&packet[0], tx_packet_size); - } -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageAddRadioAccessBearerResponse::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddRadioAccessBearerResponse::~RRM2RRCMessageAddRadioAccessBearerResponse() -//---------------------------------------------------------------------------- -{ - if (m_transaction_result != NULL) { - delete m_transaction_result; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h deleted file mode 100644 index c7bca70de1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRM2RRCMESSAGEADDRADIOACCESSBEARERRESPONSE_H -# define _RRM2RRCMESSAGEADDRADIOACCESSBEARERRESPONSE_H - -# include "Message.h" -# include "platform.h" -# include "Transaction.h" - -class RRM2RRCMessageAddRadioAccessBearerResponse: public Message -{ - -public: - RRM2RRCMessageAddRadioAccessBearerResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - RRM2RRCMessageAddRadioAccessBearerResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - rb_id_t , - transaction_id_t ); - - RRM2RRCMessageAddRadioAccessBearerResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - rb_id_t , - transaction_id_t , - Transaction*); - - ~RRM2RRCMessageAddRadioAccessBearerResponse (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - cell_id_t GetENodeBId() { - return m_cell_id; - }; - mobile_id_t GetMobileId() { - return m_mobile_id; - }; - rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - }; - transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - rb_id_t m_radio_bearer_id; - transaction_id_t m_transaction_id; - Transaction* m_transaction_result; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp deleted file mode 100644 index fdba64f60b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageAddUserResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageAddUserResponse::RRM2RRCMessageAddUserResponse(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRM2RRCMessageAddUserResponse(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_status = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.rrm_Response_Status; - m_reason = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.rrm_Response_Reason; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.c_RNTI; -} - -//---------------------------------------------------------------------------- -RRM2RRCMessageAddUserResponse::RRM2RRCMessageAddUserResponse(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_transaction_id = transaction_idP; - - m_asn1_message = asn1_messageP; - m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.rrm_Response_Status = statusP; - m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.rrm_Response_Reason = reasonP; - - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.c_RNTI; - Serialize(); -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddUserResponse::RRM2RRCMessageAddUserResponse(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageAddUserResponse::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageAddUserResponse::Serialize() -//---------------------------------------------------------------------------- -{ - - if (m_asn1_message != NULL) { - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - char errbuf[128]; - size_t errlen = sizeof(errbuf); - int ret = asn_check_constraints(&asn_DEF_RRM_RRC_Message, m_asn1_message, errbuf, &errlen); - if (ret) { - fprintf(stderr, "CONSTRAINT VALIDATION FAILED FOR RRM-RRC Message: %s\n", errbuf); - exit (-1); - } - - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRM_RRC_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRM2RRCMessageAddUserResponse] asn_DEF_RRM_RRC_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - printf("[RRM][RRM2RRCMessageAddUserResponse] ASN1 : asn_DEF_RRM_RRC_Message encoding FAILED, EXITING\n"); - throw asn1_encoding_error(); - } - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddUserResponse::~RRM2RRCMessageAddUserResponse() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - ASN_STRUCT_FREE( asn_DEF_RRM_RRC_Message, m_asn1_message); - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h deleted file mode 100644 index 3f5396099e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRM2RRCMESSAGEADDUSERRESPONSE_H -# define _RRM2RRCMESSAGEADDUSERRESPONSE_H - -# include "RRM-RRC-Message.h" -# include "Message.h" -# include "platform.h" - -class RRM2RRCMessageAddUserResponse: public Message -{ - -public: - RRM2RRCMessageAddUserResponse(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageAddUserResponse(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageAddUserResponse(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRM2RRCMessageAddUserResponse (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - }; - const transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - - RRM_RRC_Message_t* m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp deleted file mode 100644 index e0cde8d9f8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageConnectionResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageConnectionResponse::RRM2RRCMessageConnectionResponse(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRM2RRCMessageConnectionResponse(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_status = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.rrm_Response_Status; - m_reason = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.rrm_Response_Reason; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.e_NodeB_Identity.physCellId; -} - -//---------------------------------------------------------------------------- -RRM2RRCMessageConnectionResponse::RRM2RRCMessageConnectionResponse(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_transaction_id = transaction_idP; - - m_asn1_message = asn1_messageP; - m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.rrm_Response_Status = statusP; - m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.rrm_Response_Reason = reasonP; - - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.e_NodeB_Identity.physCellId; - Serialize(); -} -//---------------------------------------------------------------------------- -RRM2RRCMessageConnectionResponse::RRM2RRCMessageConnectionResponse(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageConnectionResponse::Forward() -//---------------------------------------------------------------------------- -{ - cout << "[RRM][RRM2RRCMessageConnectionResponse] status = " << m_status << " reason = " << m_reason << " cell id = " << m_cell_id << endl; -#ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); -#endif -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageConnectionResponse::Serialize() -//---------------------------------------------------------------------------- -{ - - if (m_asn1_message != NULL) { - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - char errbuf[128]; - size_t errlen = sizeof(errbuf); - int ret = asn_check_constraints(&asn_DEF_RRM_RRC_Message, m_asn1_message, errbuf, &errlen); - if (ret) { - cerr << "[RRM][RRM2RRCMessageConnectionResponse] CONSTRAINT VALIDATION FAILED FOR RRM-RRC Message: " << errbuf << endl; - exit (-1); - } - - - - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRM_RRC_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - cout << "[RRM][RRM2RRCMessageConnectionResponse] asn_DEF_RRM_RRC_Message Encoded " << enc_rval.encoded << " bits (" << (enc_rval.encoded+7)/8 << " bytes)" << endl; - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - cout << "[RRM][RRM2RRCMessageConnectionResponse] ASN1 : asn_DEF_RRM_RRC_Message encoding FAILED, EXITING" << endl; - throw asn1_encoding_error(); - } - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageConnectionResponse::~RRM2RRCMessageConnectionResponse() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - ASN_STRUCT_FREE( asn_DEF_RRM_RRC_Message, m_asn1_message); - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h deleted file mode 100644 index b2928124ac..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRM2RRCMESSAGECONNECTIONRESPONSE_H -# define _RRM2RRCMESSAGECONNECTIONRESPONSE_H - -# include "RRM-RRC-Message.h" -# include "Message.h" -# include "platform.h" - -class RRM2RRCMessageConnectionResponse: public Message -{ - -public: - RRM2RRCMessageConnectionResponse(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageConnectionResponse(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageConnectionResponse (msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP=-1); - ~RRM2RRCMessageConnectionResponse (); - - void Serialize (); - void Forward(); - const msg_response_status_t GetStatus() { - return m_status; - }; - const msg_response_reason_t GetReason() { - return m_reason; - }; - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - cell_id_t m_cell_id; - transaction_id_t m_transaction_id; - - RRM_RRC_Message_t* m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp deleted file mode 100644 index 683433125b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageRemoveRadioAccessBearerResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveRadioAccessBearerResponse::RRM2RRCMessageRemoveRadioAccessBearerResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP):Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_status = m_message_storage.readChar(); - m_reason = m_message_storage.readChar(); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - m_transaction_result = NULL; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "RRC\t<-------REMOVE DATA RADIO BEARER RESPONSE-------\tRRM STATUS: "<< Message::StatusToString(m_status).c_str() << " REASON: "<< Message::ReasonToString(m_reason).c_str() << endl; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "cell id = " << m_cell_id << " mobile id = " << m_mobile_id << " radio bearer id = "<< m_radio_bearer_id << " transaction id = "<< m_transaction_id << endl; - if ((msg_lengthP - 6) > 0 ) { - m_transaction_result = new Transaction(m_transaction_id, m_message_storage, msg_lengthP - 6); - cout << m_transaction_result->ToString().c_str() << endl; - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveRadioAccessBearerResponse::RRM2RRCMessageRemoveRadioAccessBearerResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveRadioAccessBearerResponse::RRM2RRCMessageRemoveRadioAccessBearerResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP, - Transaction* transactionP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; - m_transaction_result = transactionP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageRemoveRadioAccessBearerResponse::Serialize () -//---------------------------------------------------------------------------- -{ -// printf("[RRM][RRM2RRCMessageRemoveRadioAccessBearerResponse] Serialize () status = %d reason = %d cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_status, m_reason, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - int tx_packet_size = 0; - if (m_transaction_result != NULL) { - tx_packet_size = m_transaction_result->Size(); - } - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_REMOVE_RADIO_ACCESS_BEARER_RESPONSE); - m_message_storage.writeShort(9u+tx_packet_size); - m_message_storage.writeChar(m_status); - m_message_storage.writeChar(m_reason); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeChar(m_transaction_id); - if (m_transaction_result != NULL) { - unsigned char packet[tx_packet_size]; - m_transaction_result->Serialize(&packet[0]); - m_message_storage.writePacket(&packet[0], tx_packet_size); - } -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageRemoveRadioAccessBearerResponse::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveRadioAccessBearerResponse::~RRM2RRCMessageRemoveRadioAccessBearerResponse() -//---------------------------------------------------------------------------- -{ - if (m_transaction_result != NULL) { - delete m_transaction_result; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h deleted file mode 100644 index dd187f216e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRM2RRCMESSAGEREMOVERADIOACCESSBEARERRESPONSE_H -# define _RRM2RRCMESSAGEREMOVERADIOACCESSBEARERRESPONSE_H - -# include "Message.h" -# include "platform.h" -# include "Transaction.h" - -class RRM2RRCMessageRemoveRadioAccessBearerResponse: public Message -{ - -public: - RRM2RRCMessageRemoveRadioAccessBearerResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - RRM2RRCMessageRemoveRadioAccessBearerResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - rb_id_t , - transaction_id_t ); - RRM2RRCMessageRemoveRadioAccessBearerResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - rb_id_t , - transaction_id_t , - Transaction* ); - - - ~RRM2RRCMessageRemoveRadioAccessBearerResponse (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - cell_id_t GetENodeBId() { - return m_cell_id; - }; - mobile_id_t GetMobileId() { - return m_mobile_id; - }; - rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - }; - transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - rb_id_t m_radio_bearer_id; - transaction_id_t m_transaction_id; - Transaction* m_transaction_result; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp deleted file mode 100644 index e13bcb65c6..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageRemoveUserResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveUserResponse::RRM2RRCMessageRemoveUserResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP):Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_status = m_message_storage.readChar(); - m_reason = m_message_storage.readChar(); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - m_transaction_result = NULL; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "RRC\t<-------REMOVE USER RESPONSE-------\tRRM STATUS: " << Message::StatusToString(m_status).c_str() << " REASON: " << Message::ReasonToString(m_reason).c_str() << endl; - cout << "----------------------------------------------------------------------------------------------------------"<< endl; - cout << "cell id = "<< m_cell_id << " mobile id = " << m_mobile_id << " transaction id = " << m_transaction_id << endl; - if ((msg_lengthP - 5) > 0 ) { - m_transaction_result = new Transaction(m_transaction_id, m_message_storage, msg_lengthP - 5); - printf("%s\n",m_transaction_result->ToString().c_str()); - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveUserResponse::RRM2RRCMessageRemoveUserResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveUserResponse::RRM2RRCMessageRemoveUserResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - transaction_id_t transaction_idP, - Transaction* transactionP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; - m_transaction_result = transactionP; -} - -//---------------------------------------------------------------------------- -void RRM2RRCMessageRemoveUserResponse::Serialize () -//---------------------------------------------------------------------------- -{ -// printf("[RRM][RRM2RRCMessageRemoveUserResponse] Serialize () status = %d reason = %d cell id = %d mobile id = %d transaction id = %d \n", m_status, m_reason, m_cell_id, m_mobile_id, m_transaction_id); - int tx_packet_size = 0; - if (m_transaction_result != NULL) { - tx_packet_size = m_transaction_result->Size(); - } - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_REMOVE_USER_RESPONSE); - m_message_storage.writeShort(8u+tx_packet_size); - m_message_storage.writeChar(m_status); - m_message_storage.writeChar(m_reason); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_transaction_id); - if (m_transaction_result != NULL) { - unsigned char packet[tx_packet_size]; - m_transaction_result->Serialize(&packet[0]); - m_message_storage.writePacket(&packet[0], tx_packet_size); - } -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageRemoveUserResponse::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveUserResponse::~RRM2RRCMessageRemoveUserResponse() -//---------------------------------------------------------------------------- -{ - if (m_transaction_result != NULL) { - delete m_transaction_result; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h deleted file mode 100644 index e7b1e293c2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRM2RRCMESSAGEREMOVEUSERRESPONSE_H -# define _RRM2RRCMESSAGEREMOVEUSERRESPONSE_H - -# include "Message.h" -# include "platform.h" -# include "Transaction.h" - -class RRM2RRCMessageRemoveUserResponse: public Message -{ - -public: - RRM2RRCMessageRemoveUserResponse(tcpip::Storage& in_messageP, - msg_length_t msg_lengthP, - frame_t msg_frameP, - struct sockaddr *sa_fromP, - socklen_t sa_lenP); - - RRM2RRCMessageRemoveUserResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - transaction_id_t ); - - RRM2RRCMessageRemoveUserResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - transaction_id_t , - Transaction* ); - - ~RRM2RRCMessageRemoveUserResponse (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - cell_id_t GetENodeBId() { - return m_cell_id; - }; - mobile_id_t GetMobileId() { - return m_mobile_id; - }; - transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -private: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - Transaction* m_transaction_result; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp deleted file mode 100644 index 5fe9a3500e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageUserReconfiguration.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageUserReconfiguration::RRM2RRCMessageUserReconfiguration(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRM2RRCMessageUserReconfiguration(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_status = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.rrm_Response_Status; - m_reason = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.rrm_Response_Reason; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.c_RNTI; -} - -//---------------------------------------------------------------------------- -RRM2RRCMessageUserReconfiguration::RRM2RRCMessageUserReconfiguration(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_transaction_id = transaction_idP; - - m_asn1_message = asn1_messageP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.rrm_Response_Status = statusP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.rrm_Response_Reason = reasonP; - - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.c_RNTI; - Serialize(); -} -//---------------------------------------------------------------------------- -RRM2RRCMessageUserReconfiguration::RRM2RRCMessageUserReconfiguration(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageUserReconfiguration::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageUserReconfiguration::Serialize() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - char errbuf[256]; - size_t errlen = sizeof(errbuf); - int ret = asn_check_constraints(&asn_DEF_RRM_RRC_Message, m_asn1_message, errbuf, &errlen); - if (ret) { - fprintf(stderr, "CONSTRAINT VALIDATION FAILED FOR RRM-RRC Message: %s\n", errbuf); - exit (-1); - } - - - - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRM_RRC_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRM2RRCMessageUserReconfiguration] asn_DEF_RRM_RRC_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - cerr << "[RRM][RRM2RRCMessageUserReconfiguration] ASN1 : asn_DEF_RRM_RRC_Message encoding FAILED, EXITING" << endl; - cerr << "[RRM][RRM2RRCMessageUserReconfiguration] Cannot encode "<< enc_rval.failed_type->name <<" " << strerror(errno) << endl; - throw asn1_encoding_error(); - } - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageUserReconfiguration::~RRM2RRCMessageUserReconfiguration() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - cout << "[RRM][RRM2RRCMessageUserReconfiguration::~RRM2RRCMessageUserReconfiguration()] free asn1_message start" << endl; - ASN_STRUCT_FREE( asn_DEF_RRM_RRC_Message, m_asn1_message); - m_asn1_message = NULL; - cout << "[RRM][RRM2RRCMessageUserReconfiguration::~RRM2RRCMessageUserReconfiguration()] free asn1_message end " << endl; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h deleted file mode 100644 index d0016cbc9a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRM2RRCMESSAGEUSERRECONFIGURATION_H -# define _RRM2RRCMESSAGEUSERRECONFIGURATION_H - -# include "RRM-RRC-Message.h" -# include "Message.h" -# include "platform.h" - -class RRM2RRCMessageUserReconfiguration: public Message -{ - -public: - RRM2RRCMessageUserReconfiguration(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageUserReconfiguration(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageUserReconfiguration(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRM2RRCMessageUserReconfiguration (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - }; - const transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - - RRM_RRC_Message_t* m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp deleted file mode 100644 index 5a4e284841..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include "RRMMessageHandler.h" - - -RRMMessageHandler* RRMMessageHandler::s_instance = 0; - -//---------------------------------------------------------------------------- -void* RRMMessageHandlerThreadLoop(void *arg) -//---------------------------------------------------------------------------- -{ - - return RRMMessageHandler::Instance()->ThreadLoop(arg); -} -//----------------------------------------------------------------- -RRMMessageHandler* RRMMessageHandler::Instance() -//----------------------------------------------------------------- -{ - if (RRMMessageHandler::s_instance == 0) { - RRMMessageHandler::s_instance = new RRMMessageHandler; - } - return s_instance; -} -//----------------------------------------------------------------- -RRMMessageHandler::RRMMessageHandler() -//----------------------------------------------------------------- -{ - m_socket_handler = new SocketHandler(); - m_log = new StdoutLog() ; - m_socket_handler->RegStdLog(m_log); - - m_socket = new RRMUdpSocket(*m_socket_handler, 16384, true); - port_t port = 33334; - Ipv6Address ad("0::1",port); - if (m_socket->Bind(ad, 1) == -1) { - printf("Exiting...\n"); - exit(-1); - } else { - printf("Ready to receive on port %d\n",port); - } - m_socket_handler->Add(m_socket); - - if (pthread_create(&m_thread, NULL, RRMMessageHandlerThreadLoop, (void *) NULL) != 0) { - fprintf(stderr, "\nRRMMessageHandler::RRMMessageHandler() ERROR pthread_create...\n"); - } else { - pthread_setname_np( m_thread, "RRMMsgHandler" ); - } -} -//---------------------------------------------------------------------------- -void* RRMMessageHandler::ThreadLoop(void *arg) -//---------------------------------------------------------------------------- -{ - - m_socket_handler->Select(1,0); - - while (m_socket_handler->GetCount() && !*m_quit) { - m_socket_handler->Select(1,0); - } - fprintf(stderr, "\nRRMMessageHandler::ThreadLoop Exiting...\n"); - return NULL; -} -//---------------------------------------------------------------------------- -void RRMMessageHandler::Join(bool *quitP) -//---------------------------------------------------------------------------- -{ - m_quit = quitP; - - pthread_join(m_thread, NULL); - fprintf(stderr, "\nRRMMessageHandler::Join Done\n"); -} - -//---------------------------------------------------------------------------- -void RRMMessageHandler::NotifyRxData(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//---------------------------------------------------------------------------- -{ - Message* message; - do { - fprintf(stderr, "RRMMessageHandler::notifyRxData GOT MESSAGE %d bytes\n", size_dataP); - message = Message::DeserializeRRMMessage(in_bufferP, size_dataP, sa_fromP, sa_lenP); - if (message != NULL) { - message->Forward(); - delete message; - message = NULL; - } else { - // TO DO - } - } while (message != NULL); -} -//----------------------------------------------------------------- -void RRMMessageHandler::Send2Peer(Message* messageP) -//----------------------------------------------------------------- -{ - Send2Peer(messageP->GetSrcAddress(), messageP->GetSrcPort(), messageP->GetSerializedMessageBuffer(), messageP->GetSerializedMessageSize()); - delete messageP; -} -//----------------------------------------------------------------- -void RRMMessageHandler::Send2Peer(std::string ip_dest_strP, int port_destP, const char *in_bufferP, size_t size_dataP) -//----------------------------------------------------------------- -{ - m_socket->SendToBuf(ip_dest_strP, port_destP, in_bufferP, size_dataP, 0); -} -//----------------------------------------------------------------- -RRMMessageHandler::~RRMMessageHandler() -//----------------------------------------------------------------- -{ - if (m_socket_handler != 0) - { - delete m_socket_handler; - } - if (m_log != 0) - { - delete m_log; - } - // m_socket should be closed and deleted by m_socket_handler -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h deleted file mode 100644 index c1a14d0642..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRMMESSAGEHANDLER_H -# define _RRMMESSAGEHANDLER_H - -# include - -# include "StdoutLog.h" -# include "SocketHandlerEp.h" -# include "RRMUdpSocket.h" -# include "ListenSocket.h" -# include "Message.h" -# include "platform.h" - - -class RRMMessageHandler -{ -public: - static RRMMessageHandler *Instance (); - void NotifyRxData (const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - void Send2Peer (Message *); - void Send2Peer(std::string ip_dest_strP, int port_destP, const char *in_bufferP, size_t size_dataP); - void* ThreadLoop(void *arg); - void Join(bool *quitP); - ~RRMMessageHandler (); - -private: - RRMMessageHandler (); - - SocketHandler *m_socket_handler; - RRMUdpSocket *m_socket; - StdoutLog *m_log; - pthread_t m_thread; - bool *m_quit; - static RRMMessageHandler *s_instance; -}; -# endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp deleted file mode 100644 index 33802f1818..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -//---------------------------------------------------------------------------- -#include "RRMUdpSocket.h" -#include "RRMMessageHandler.h" - - -//---------------------------------------------------------------------------- -RRMUdpSocket::RRMUdpSocket(ISocketHandler& h,int ibufsz, bool ipv6):UdpSocket(h, ibufsz, ipv6) -//---------------------------------------------------------------------------- -{ -} -//---------------------------------------------------------------------------- -void RRMUdpSocket::OnRawData(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//---------------------------------------------------------------------------- -{ - RRMMessageHandler::Instance()->NotifyRxData(in_bufferP, size_dataP, sa_fromP, sa_lenP); -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h deleted file mode 100644 index 2c079af94c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.0 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _RRMUDPSOCKET_H -# define _RRMUDPSOCKET_H - -# include "UdpSocket.h" - - -class RRMUdpSocket : public UdpSocket -{ -public: - RRMUdpSocket(ISocketHandler&,int ibufsz, bool ipv6); - - void OnRawData(const char *,size_t,struct sockaddr *,socklen_t); -}; - - -#endif // _RRMUDPSOCKET_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/36331-860.txt b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/36331-860.txt deleted file mode 100755 index c399a2529a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/36331-860.txt +++ /dev/null @@ -1,7503 +0,0 @@ -3GPP TS 36.331 V8.6.0 (2009-06) -Technical Specification -3rd Generation Partnership Project; -Technical Specification Group Radio Access Network; -Evolved Universal Terrestrial Radio Access (E-UTRA) -Radio Resource Control (RRC); -Protocol specification -(Release 8) - - -The present document has been developed within the 3rd Generation Partnership Project (3GPP TM) and may be further elaborated for the purposes of 3GPP. -The present document has not been subject to any approval process by the 3GPP Organizational Partners and shall not be implemented. -This Specification is provided for future development work within 3GPP only. The Organizational Partners accept no liability for any use of this Specification. -Specifications and reports for implementation of the 3GPP TM system should be obtained via the 3GPP Organizational Partners' Publications Offices. - - - - -Keywords -UMTS, radio - -3GPP -Postal address - -3GPP support office address -650 Route des Lucioles - Sophia Antipolis -Valbonne - FRANCE -Tel.: +33 4 92 94 42 00 Fax: +33 4 93 65 47 16 -Internet -http://www.3gpp.org - -Copyright Notification -No part may be reproduced except as authorized by written permission. -The copyright and the foregoing restriction extend to reproduction in all media. - -© 2009, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC). -All rights reserved. - -UMTS™ is a Trade Mark of ETSI registered for the benefit of its members -3GPP™ is a Trade Mark of ETSI registered for the benefit of its Members and of the 3GPP Organizational Partners -LTE™ is a Trade Mark of ETSI currently being registered for the benefit of its Members and of the 3GPP Organizational Partners -GSM® and the GSM logo are registered and owned by the GSM Association - - -Contents -Foreword 11 -1 Scope 12 -2 References 12 -3 Definitions, symbols and abbreviations 14 -3.1 Definitions 14 -3.2 Abbreviations 14 -4 General 16 -4.1 Introduction 16 -4.2 Architecture 16 -4.2.1 UE states and state transitions including inter RAT 16 -4.2.2 Signalling radio bearers 18 -4.3 Services 18 -4.3.1 Services provided to upper layers 18 -4.3.2 Services expected from lower layers 19 -4.4 Functions 19 -5 Procedures 20 -5.1 General 20 -5.1.1 Introduction 20 -5.1.2 General requirements 20 -5.2 System information 20 -5.2.1 Introduction 20 -5.2.1.1 General 20 -5.2.1.2 Scheduling 21 -5.2.1.3 System information validity and notification of changes 21 -5.2.1.4 Indication of ETWS notification 22 -5.2.2 System information acquisition 22 -5.2.2.1 General 22 -5.2.2.2 Initiation 23 -5.2.2.3 System information required by the UE 23 -5.2.2.4 System information acquisition by the UE 23 -5.2.2.5 Essential system information missing 24 -5.2.2.6 Actions upon reception of the MasterInformationBlock message 24 -5.2.2.7 Actions upon reception of the SystemInformationBlockType1 message 24 -5.2.2.8 Actions upon reception of SystemInformation messages 25 -5.2.2.9 Actions upon reception of SystemInformationBlockType2 25 -5.2.2.10 Actions upon reception of SystemInformationBlockType3 25 -5.2.2.11 Actions upon reception of SystemInformationBlockType4 25 -5.2.2.12 Actions upon reception of SystemInformationBlockType5 25 -5.2.2.13 Actions upon reception of SystemInformationBlockType6 25 -5.2.2.14 Actions upon reception of SystemInformationBlockType7 25 -5.2.2.15 Actions upon reception of SystemInformationBlockType8 25 -5.2.2.16 Actions upon reception of SystemInformationBlockType9 26 -5.2.2.17 Actions upon reception of SystemInformationBlockType10 26 -5.2.2.18 Actions upon reception of SystemInformationBlockType11 27 -5.2.3 Acquisition of an SI message 28 -5.3 Connection control 28 -5.3.1 Introduction 28 -5.3.1.1 RRC connection control 28 -5.3.1.2 Security 29 -5.3.1.3 Connected mode mobility 30 -5.3.2 Paging 30 -5.3.2.1 General 30 -5.3.2.2 Initiation 31 -5.3.2.3 Reception of the Paging message by the UE 31 -5.3.3 RRC connection establishment 31 -5.3.3.1 General 31 -5.3.3.2 Initiation 32 -5.3.3.3 Actions related to transmission of RRCConnectionRequest message 34 -5.3.3.4 Reception of the RRCConnectionSetup by the UE 35 -5.3.3.5 Cell re-selection while T300, T302, T303 or T305 is running 35 -5.3.3.6 T300 expiry 36 -5.3.3.7 T302, T303 or T305 expiry or stop 36 -5.3.3.8 Reception of the RRCConnectionReject by the UE 36 -5.3.3.9 Abortion of RRC connection establishment 37 -5.3.4 Initial security activation 37 -5.3.4.1 General 37 -5.3.4.2 Initiation 37 -5.3.4.3 Reception of the SecurityModeCommand by the UE 37 -5.3.5 RRC connection reconfiguration 38 -5.3.5.1 General 38 -5.3.5.2 Initiation 39 -5.3.5.3 Reception of an RRCConnectionReconfiguration not including the mobilityControlInfo by the UE 39 -5.3.5.4 Reception of an RRCConnectionReconfiguration including the mobilityControlInfo by the UE (handover) 39 -5.3.5.5 Reconfiguration failure 41 -5.3.5.6 T304 expiry (handover failure) 41 -5.3.6 Counter check 42 -5.3.6.1 General 42 -5.3.6.2 Initiation 42 -5.3.6.3 Reception of the CounterCheck message by the UE 42 -5.3.7 RRC connection re-establishment 43 -5.3.7.1 General 43 -5.3.7.2 Initiation 43 -5.3.7.3 Actions following cell selection while T311 is running 44 -5.3.7.4 Actions related to transmission of RRCConnectionReestablishmentRequest message 44 -5.3.7.5 Reception of the RRCConnectionReestablishment by the UE 45 -5.3.7.6 T311 expiry 45 -5.3.7.7 T301 expiry or selected cell no longer suitable 46 -5.3.7.8 Reception of RRCConnectionReestablishmentReject by the UE 46 -5.3.8 RRC connection release 46 -5.3.8.1 General 46 -5.3.8.2 Initiation 46 -5.3.8.3 Reception of the RRCConnectionRelease by the UE 46 -5.3.8.4 T320 expiry 47 -5.3.9 RRC connection release requested by upper layers 47 -5.3.9.1 General 47 -5.3.9.2 Initiation 47 -5.3.10 Radio resource configuration 47 -5.3.10.0 General 47 -5.3.10.1 SRB addition/ modification 48 -5.3.10.2 DRB release 48 -5.3.10.3 DRB addition/ modification 48 -5.3.10.4 MAC main reconfiguration 49 -5.3.10.5 Semi-persistent scheduling reconfiguration 49 -5.3.10.6 Physical channel reconfiguration 49 -5.3.11 Radio link failure related actions 49 -5.3.11.1 Detection of physical layer problems in RRC_CONNECTED 49 -5.3.11.2 Recovery of physical layer problems 49 -5.3.11.3 Detection of radio link failure 50 -5.3.12 UE actions upon leaving RRC_CONNECTED 50 -5.3.13 UE actions upon PUCCH/ SRS release request 50 -5.4 Inter-RAT mobility 50 -5.4.1 Introduction 50 -5.4.2 Handover to E-UTRA 51 -5.4.2.1 General 51 -5.4.2.2 Initiation 51 -5.4.2.3 Reception of the RRCConnectionReconfiguration by the UE 51 -5.4.2.4 Reconfiguration failure 52 -5.4.2.5 T304 expiry (handover to E-UTRA failure) 52 -5.4.3 Mobility from E-UTRA 53 -5.4.3.1 General 53 -5.4.3.2 Initiation 53 -5.4.3.3 Reception of the MobilityFromEUTRACommand by the UE 53 -5.4.3.4 Successful completion of the mobility from E-UTRA 54 -5.4.3.5 Mobility from E-UTRA failure 54 -5.4.4 Handover from E-UTRA preparation request (CDMA2000) 55 -5.4.4.1 General 55 -5.4.4.2 Initiation 55 -5.4.4.3 Reception of the HandoverFromEUTRAPreparationRequest by the UE 55 -5.4.5 UL handover preparation transfer (CDMA2000) 55 -5.4.5.1 General 55 -5.4.5.2 Initiation 56 -5.4.5.3 Actions related to transmission of the ULHandoverPreparationTransfer message 56 -5.4.5.4 Failure to deliver the ULHandoverPreparationTransfer message 56 -5.4.6 Inter-RAT cell change order to E-UTRAN 56 -5.4.6.1 General 56 -5.4.6.2 Initiation 56 -5.4.6.3 UE fails to complete an inter-RAT cell change order 56 -5.5 Measurements 57 -5.5.1 Introduction 57 -5.5.2 Measurement configuration 58 -5.5.2.1 General 58 -5.5.2.2 Measurement identity removal 59 -5.5.2.3 Measurement identity addition/ modification 59 -5.5.2.4 Measurement object removal 60 -5.5.2.5 Measurement object addition/ modification 60 -5.5.2.6 Reporting configuration removal 61 -5.5.2.7 Reporting configuration addition/ modification 61 -5.5.2.8 Quantity configuration 62 -5.5.2.9 Measurement gap configuration 62 -5.5.3 Performing measurements 62 -5.5.3.1 General 62 -5.5.3.2 Layer 3 filtering 63 -5.5.4 Measurement report triggering 64 -5.5.4.1 General 64 -5.5.4.2 Event A1 (Serving becomes better than threshold) 66 -5.5.4.3 Event A2 (Serving becomes worse than threshold) 66 -5.5.4.4 Event A3 (Neighbour becomes offset better than serving) 66 -5.5.4.5 Event A4 (Neighbour becomes better than threshold) 67 -5.5.4.6 Event A5 (Serving becomes worse than threshold1 and neighbour becomes better than threshold2) 68 -5.5.4.7 Event B1 (Inter RAT neighbour becomes better than threshold) 68 -5.5.4.8 Event B2 (Serving becomes worse than threshold1 and inter RAT neighbour becomes better than threshold2) 69 -5.5.5 Measurement reporting 70 -5.5.6 Measurement related actions 71 -5.5.6.1 Actions upon handover and re-establishment 71 -5.5.6.2 Speed dependant scaling of measurement related parameters 72 -5.6 Other 73 -5.6.1 DL information transfer 73 -5.6.1.1 General 73 -5.6.1.2 Initiation 73 -5.6.1.3 Reception of the DLInformationTransfer by the UE 73 -5.6.2 UL information transfer 73 -5.6.2.1 General 73 -5.6.2.2 Initiation 73 -5.6.2.3 Actions related to transmission of ULInformationTransfer message 74 -5.6.2.4 Failure to deliver ULInformationTransfer message 74 -5.6.3 UE capability transfer 74 -5.6.3.1 General 74 -5.6.3.2 Initiation 75 -5.6.3.3 Reception of the UECapabilityEnquiry by the UE 75 -5.6.4 CSFB to 1x Parameter transfer 75 -5.6.4.1 General 75 -5.6.4.2 Initiation 76 -5.6.4.3 Actions related to transmission of CSFBParametersRequestCDMA2000 message 76 -5.6.4.4 Reception of the CSFBParametersResponseCDMA2000 message 76 -5.7 Generic error handling 76 -5.7.1 General 76 -5.7.2 ASN.1 violation or encoding error 76 -5.7.3 Field set to a not comprehended value 76 -5.7.4 Mandatory field missing 77 -5.7.5 Not comprehended field 77 -6 Protocol data units, formats and parameters (tabular & ASN.1) 77 -6.1 General 77 -6.2 RRC messages 78 -6.2.1 General message structure 78 -– EUTRA-RRC-Definitions 78 -– BCCH-BCH-Message 78 -– BCCH-DL-SCH-Message 79 -– PCCH-Message 79 -– DL-CCCH-Message 79 -– DL-DCCH-Message 80 -– UL-CCCH-Message 80 -– UL-DCCH-Message 80 -6.2.2 Message definitions 81 -– CounterCheck 81 -– CounterCheckResponse 82 -– CSFBParametersRequestCDMA2000 82 -– CSFBParametersResponseCDMA2000 83 -– DLInformationTransfer 83 -– HandoverFromEUTRAPreparationRequest (CDMA2000) 84 -– MasterInformationBlock 84 -– MeasurementReport 85 -– MobilityFromEUTRACommand 86 -– Paging 87 -– RRCConnectionReconfiguration 88 -– RRCConnectionReconfigurationComplete 90 -– RRCConnectionReestablishment 90 -– RRCConnectionReestablishmentComplete 91 -– RRCConnectionReestablishmentReject 91 -– RRCConnectionReestablishmentRequest 92 -– RRCConnectionReject 92 -– RRCConnectionRelease 93 -– RRCConnectionRequest 95 -– RRCConnectionSetup 96 -– RRCConnectionSetupComplete 96 -– SecurityModeCommand 97 -– SecurityModeComplete 98 -– SecurityModeFailure 98 -– SystemInformation 98 -– SystemInformationBlockType1 99 -– UECapabilityEnquiry 101 -– UECapabilityInformation 101 -– ULHandoverPreparationTransfer (CDMA2000) 102 -– ULInformationTransfer 102 -6.3 RRC information elements 103 -6.3.1 System information blocks 103 -– SystemInformationBlockType2 103 -– SystemInformationBlockType3 105 -– SystemInformationBlockType4 106 -– SystemInformationBlockType5 107 -– SystemInformationBlockType6 108 -– SystemInformationBlockType7 109 -– SystemInformationBlockType8 110 -– SystemInformationBlockType9 112 -– SystemInformationBlockType10 112 -– SystemInformationBlockType11 113 -6.3.2 Radio resource control information elements 114 -– AntennaInfo 114 -– CQI-ReportConfig 114 -– DRB-Identity 115 -– LogicalChannelConfig 115 -– MAC-MainConfig 116 -– PDCP-Config 118 -– PDSCH-Config 119 -– PHICH-Config 120 -– PhysicalConfigDedicated 120 -– P-Max 121 -– PRACH-Config 121 -– PresenceAntennaPort1 122 -– PUCCH-Config 122 -– PUSCH-Config 123 -– RACH-ConfigCommon 124 -– RACH-ConfigDedicated 125 -– RadioResourceConfigCommon 126 -– RadioResourceConfigDedicated 127 -– RLC-Config 128 -– SchedulingRequestConfig 130 -– SoundingRS-UL-Config 130 -– SPS-Config 131 -– TDD-Config 133 -– TimeAlignmentTimer 133 -– TPC-PDCCH-Config 133 -– UplinkPowerControl 134 -6.3.3 Security control information elements 135 -– NextHopChainingCount 135 -– SecurityAlgorithmConfig 135 -– ShortMAC-I 136 -6.3.4 Mobility control information elements 136 -– AdditionalSpectrumEmission 136 -– ARFCN-ValueCDMA2000 136 -– ARFCN-ValueEUTRA 136 -– ARFCN-ValueGERAN 137 -– ARFCN-ValueUTRA 137 -– BandclassCDMA2000 137 -– BandIndicatorGERAN 137 -– CarrierFreqCDMA2000 138 -– CarrierFreqGERAN 138 -– CarrierFreqsGERAN 138 -– CDMA2000-Type 139 -– CellIdentity 139 -– CellIndexList 139 -– CellReselectionPriority 140 -– CSFB-RegistrationParam1XRTT 140 -– CellGlobalIdEUTRA 141 -– CellGlobalIdUTRA 141 -– CellGlobalIdGERAN 142 -– CellGlobalIdCDMA2000 142 -– MobilityControlInfo 142 -– MobilityParametersCDMA2000 (1xRTT) 143 -– MobilityStateParameters 144 -– PhysCellId 144 -– PhysCellIdRange 144 -– PhysCellIdCDMA2000 145 -– PhysCellIdGERAN 145 -– PhysCellIdentityUTRA-FDD 145 -– PhysCellIdUTRA-TDD 145 -– PLMN-Identity 146 -– PreRegistrationInfoHRPD 146 -– Q-RxLevMin 147 -– Q-OffsetRange 147 -– Q-OffsetRangeInterRAT 147 -– ReselectionThreshold 148 -– SpeedStateScaleFactors 148 -– SystemTimeInfoCDMA2000 148 -– TrackingAreaCode 149 -– T-Reselection 149 -6.3.5 Measurement information elements 149 -– AllowedMeasBandwidth 149 -– Hysteresis 149 -– MeasConfig 150 -– MeasGapConfig 151 -– MeasId 151 -– MeasIdToAddModList 152 -– MeasObjectCDMA2000 152 -– MeasObjectEUTRA 153 -– MeasObjectGERAN 154 -– MeasObjectId 154 -– MeasObjectToAddModList 154 -– MeasObjectUTRA 154 -– MeasResults 155 -– QuantityConfig 157 -– ReportConfigEUTRA 158 -– ReportConfigId 160 -– ReportConfigInterRAT 160 -– ReportConfigToAddModList 161 -– ReportInterval 162 -– RSRP-Range 162 -– RSRQ-Range 162 -– TimeToTrigger 163 -6.3.6 Other information elements 163 -– C-RNTI 163 -– DedicatedInfoCDMA2000 163 -– DedicatedInfoNAS 163 -– FilterCoefficient 163 -– MMEC 164 -– NeighCellConfig 164 -– RAND-CDMA2000 (1xRTT) 164 -– RAT-Type 165 -– RRC-TransactionIdentifier 165 -– S-TMSI 165 -– UE-CapabilityRAT-ContainerList 165 -– UE-EUTRA-Capability 166 -– UE-TimersAndConstants 169 -6.4 RRC multiplicity and type constraint values 170 -– Multiplicity and type constraint definitions 170 -– End of EUTRA-RRC-Definitions 170 -7 Variables and constants 171 -7.1 UE variables 171 -– EUTRA-UE-Variables 171 -– VarMeasConfig 171 -– VarMeasReportList 172 -– VarShortMAC-Input 172 -– Multiplicity and type constraint definitions 172 -– End of EUTRA-UE-Variables 172 -7.2 Counters 173 -7.3 Timers (Informative) 174 -7.4 Constants 175 -8 Protocol data unit abstract syntax 175 -8.1 General 175 -8.2 Structure of encoded RRC messages 175 -8.3 Basic production 175 -8.4 Extension 175 -8.5 Padding 176 -9 Specified and default radio configurations 176 -9.1 Specified configurations 176 -9.1.1 Logical channel configurations 176 -9.1.1.1 BCCH configuration 176 -9.1.1.2 CCCH configuration 177 -9.1.1.3 PCCH configuration 177 -9.1.2 SRB configurations 177 -9.1.2.1 SRB1 177 -9.1.2.2 SRB2 177 -9.2 Default radio configurations 177 -9.2.1 SRB configurations 177 -9.2.1.1 SRB1 177 -9.2.1.2 SRB2 178 -9.2.2 Default MAC main configuration 178 -9.2.3 Default semi-persistent scheduling configuration 178 -9.2.4 Default physical channel configuration 178 -9.2.5 Default values timers and constants 179 -10 Radio information related interactions between network nodes 179 -10.1 General 179 -10.2 Inter-node RRC messages 179 -10.2.1 General 179 -– EUTRA-InterNodeDefinitions 180 -10.2.2 Message definitions 180 -– HandoverCommand 180 -– HandoverPreparationInformation 181 -– UERadioAccessCapabilityInformation 181 -10.3 Inter-node RRC information element definitions 182 -– AS-Config 182 -– AS-Context 183 -– ReestablishmentInfo 183 -– RRM-Config 184 -10.4 Inter-node RRC multiplicity and type constraint values 185 -– Multiplicity and type constraints definitions 185 -– End of EUTRA-InterNodeDefinitions 185 -10.5 Mandatory information in AS-Config 185 -11 UE capability related constraints and performance requirements 187 -11.1 UE capability related constraints 187 -11.2 Processing delay requirements for RRC procedures 187 -Annex A (informative): Guidelines, mainly on use of ASN.1 189 -A.1 Introduction 189 -A.2 Procedural specification 190 -A.2.1 General principles 190 -A.2.2 More detailed aspects 190 -A.3 PDU specification 190 -A.3.1 General principles 190 -A.3.1.1 ASN.1 sections 190 -A.3.1.2 ASN.1 identifier naming conventions 191 -A.3.1.3 Text references using ASN.1 identifiers 192 -A.3.2 High-level message structure 192 -A.3.3 Message definition 193 -A.3.4 Information elements 194 -A.3.5 Fields with optional presence 195 -A.3.6 Fields with conditional presence 196 -A.3.7 Guidelines on use of lists with elements of SEQUENCE type 196 -A.4 Extension of the PDU specifications 197 -A.4.1 General principles to ensure compatibility 197 -A.4.2 Critical extension of messages 197 -A.4.3 Non-critical extension of messages 197 -A.5 Guidelines regarding inclusion of transaction identifiers in RRC messages 198 -A.6 Protection of RRC messages (informative) 198 -A.7 Miscellaneous 199 -Annex B (normative): Release 8 AS feature handling 200 -B.1 Feature group indicators 200 -B.2 CSG support 203 -Annex C (informative): Change history 204 - - -Foreword -This Technical Specification has been produced by the 3rd Generation Partnership Project (3GPP). -The contents of the present document are subject to continuing work within the TSG and may change following formal TSG approval. Should the TSG modify the contents of the present document, it will be re-released by the TSG with an identifying change of release date and an increase in version number as follows: -Version x.y.z -where: -x the first digit: -1 presented to TSG for information; -2 presented to TSG for approval; -3 or greater indicates TSG approved document under change control. -y the second digit is incremented for all changes of substance, i.e. technical enhancements, corrections, updates, etc. -z the third digit is incremented when editorial only changes have been incorporated in the document. - -1 Scope -The present document specifies the Radio Resource Control protocol for the UE-E-UTRAN radio interface. -The scope of the present document also includes: -- the radio related information transported in a transparent container between source eNB and target eNB upon inter eNB handover; -- the radio related information transported in a transparent container between a source or target eNB and another system upon inter RAT handover. -2 References -The following documents contain provisions which, through reference in this text, constitute provisions of the present document. -* References are either specific (identified by date of publication, edition number, version number, etc.) or nonspecific. -* For a specific reference, subsequent revisions do not apply. -* For a non-specific reference, the latest version applies. In the case of a reference to a 3GPP document (including a GSM document), a non-specific reference implicitly refers to the latest version of that document in the same Release as the present document. -[1] 3GPP TR 21.905: "Vocabulary for 3GPP Specifications". -[2] 3GPP TS nn.nnn: "Radio Interface Protocol Architecture". -Editor's note: Document not yet available. -[3] 3GPP TS 36.302: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Services provided by the physical layer ". -[4] 3GPP TS 36.304: "Evolved Universal Terrestrial Radio Access (E-UTRA); "UE Procedures in Idle Mode". -[5] 3GPP TS 36.306 "Evolved Universal Terrestrial Radio Access (E-UTRA); "UE Radio Access Capabilities". -[6] 3GPP TS 36.321: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Medium Access Control (MAC) protocol specification". -[7] 3GPP TS 36.322:"Evolved Universal Terrestrial Radio Access (E-UTRA); "Radio Link Control (RLC) protocol specification". -[8] 3GPP TS 36.323: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Packet Data Convergence Protocol (PDCP) Specification". -[9] 3GPP TS 36.300: "Evolved Universal Terrestrial Radio Access (E-UTRA) and Evolved Universal Terrestrial Radio Access (E-UTRAN); Overall description; Stage 2". -[10] 3GPP TS 22.011: "Service accessibility". -[11] 3GPP TS 23.122: "Non-Access-Stratum (NAS) functions related to Mobile Station (MS) in idle mode". -[12] 3GPP2 C.S0002-A: "Physical Layer Standard for cdma2000 Spread Spectrum Systems – Release A". -[13] ITU-T Recommendation X.680 (07/2002) "Information Technology - Abstract Syntax Notation One (ASN.1): Specification of basic notation" (Same as the ISO/IEC International Standard 8824-1). -[14] ITU-T Recommendation X.681 (07/2002) "Information Technology - Abstract Syntax Notation One (ASN.1): Information object specification" (Same as the ISO/IEC International Standard 8824-2). -[15] ITU-T Recommendation X.691 (07/2002) "Information technology - ASN.1 encoding rules: Specification of Packed Encoding Rules (PER)" (Same as the ISO/IEC International Standard 8825-2). -[16] 3GPP TS 36.133: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Requirements for support of radio resource management". -[17] 3GPP TS 25.101: "Universal Terrestrial Radio Access (UTRA); "User Equipment (UE) radio transmission and reception (FDD)". -[18] 3GPP TS 25.102: "Universal Terrestrial Radio Access (UTRA); "User Equipment (UE) radio transmission and reception (TDD)". -[19] 3GPP TS 25.331:"Universal Terrestrial Radio Access (UTRA); "Radio Resource Control (RRC); Protocol specification". -[20] 3GPP TS 45.005: "Radio transmission and reception". -[21] 3GPP TS 36.211: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Multiplexing and channel coding". -[22] 3GPP TS 36.212: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Multiplexing and channel coding". -[23] 3GPP TS 36.213: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Physical layer procedures". -[24] 3GPP2 C.S0057-B: "Band Class Specification for cdma2000 Spread Spectrum Systems". -[25] 3GPP2 C.S0005-A: "Upper Layer (Layer 3) Signaling Standard for cdma2000 Spread Spectrum Systems – Release A, Addendum 2". -[26] 3GPP2 C.S0024-A: "cdma2000 High Rate Packet Data Air Interface Specification". -[27] 3GPP TS 23.003: "Numbering, addressing and identification". -[28] 3GPP TS 45.008: "Radio subsystem link control". -[29] 3GPP TS 25.133: "Requirements for Support of Radio Resource Management (FDD)". -[30] 3GPP TS 25.123: "Requirements for Support of Radio Resource Management (TDD)". -[31] 3GPP TS 36.401: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Architecture description". -[32] 3GPP TS 33.401: "3GPP System Architecture Evolution (SAE); “Security architecture". -[33] 3GPP2 A.S0008-C: “Interoperability Specification (IOS) for High Rate Packet Data (HRPD) Radio Access Network Interfaces with Session Control in the Access Network” -[34] 3GPP2 C.S0004-A: “Signaling Link Access Control (LAC) Standard for cdma2000 Spread Spectrum Systems – Addendum 2” -[35] 3GPP TS 24.301: "Non-Access-Stratum (NAS) protocol for Evolved Packet System (EPS); Stage 3". -[36] 3GPP TS 44.060: "General Packet Radio Service (GPRS); Mobile Station (MS) - Base Station System (BSS) interface; Radio Link Control/Medium Access Control (RLC/MAC) protocol". -[37] 3GPP TS 23.041: "Technical realization of Cell Broadcast Service (CBS)". -[38] 3GPP TS 23.038: "Alphabets and Language". -[39] 3GPP TS 36.413: "Evolved Universal Terrestrial Radio Access (E-UTRAN); S1 Application Protocol (S1 AP)". -[40] 3GPP TS 25.304: "Universal Terrestrial Radio Access (UTRAN); User Equipment (UE) procedures in idle mode and procedures for cell reselection in connected mode". -[41] 3GPP TS 23.401: "General Packet Radio Service (GPRS) enhancements for Evolved Universal Terrestrial Radio Access Network (E-UTRAN) access". -[42] 3GPP TS 36.101: "Evolved Universal Terrestrial Radio Access (E-UTRA); "User Equipment (UE) radio transmission and reception". -[43] 3GPP TS 44.005: "Data Link (DL) Layer General Aspects". -[44] 3GPP2 C.S0087-0: “E-UTRAN - cdma2000 Connectivity and Interworking Air Interface Specification” -[45] 3GPP TS 44.018: "Mobile radio interface layer 3 specification; Radio Resource Control (RRC) protocol". -[46] 3GPP TS 25.223: "Spreading and modulation (TDD)". -[47] 3GPP TS 36.104: "Evolved Universal Terrestrial Radio Access (E-UTRA); Base Station (BS) radio transmission and reception". -[48] 3GPP TS 36.214: "Evolved Universal Terrestrial Radio Access (E-UTRA); Physical layer - Measurements". -[49] 3GPP TS 24.008: "Mobile radio interface layer 3 specification; Core network protocols; Stage 3". -3 Definitions, symbols and abbreviations -3.1 Definitions -For the purposes of the present document, the terms and definitions given in TR 21.905 [1] and the following apply. A term defined in the present document takes precedence over the definition of the same term, if any, in TR 21.905 [1]. -Information element: A structural element containing a single or multiple fields is referred as information element. -Field: The individual contents of an information element are referred as fields. -3.2 Abbreviations -For the purposes of the present document, the abbreviations given in TR 21.905 [1] and the following apply. An abbreviation defined in the present document takes precedence over the definition of the same abbreviation, if any, in TR 21.905 [1]. -1xRTT CDMA2000 1x Radio Transmission Technology -AM Acknowledged Mode -ASN.1 Abstract Syntax Notation.1 -ARQ Automatic Repeat Request -AS Access Stratum -BCCH Broadcast Control Channel -BCH Broadcast Channel -CCCH Common Control Channel -CCO Cell Change Order -CP Control Plane -C-RNTI Cell RNTI -CSG Closed Subscriber Group -DCCH Dedicated Control Channel -DRB (user) Data Radio Bearer -DRX Discontinuous Reception -DTCH Dedicated Traffic Channel -DL Downlink -DL-SCH Downlink Shared Channel -ETWS Earthquake and Tsunami Warning System -E-UTRA Evolved Universal Terrestrial Radio Access -E-UTRAN Evolved Universal Terrestrial Radio Access Network -ENB Evolved Node B -EPC Enhanced Packet Core -EPS Enhanced Packet System -FLOOR Mathematical function used to ‘round down’ i.e. to the nearest integer having a lower value -FDD Frequency Division Duplex -FFS For Further Study -GERAN GSM/EDGE Radio Access Network -GSM Global System for Mobile Communications -HARQ Hybrid Automatic Repeat Request -HRPD CDMA2000 High Rate Packet Data -IE Information element -IMEI International Mobile Equipment Identity -IMSI International Mobile Subscriber Identity -kB Kilobyte (1000 bytes) -L1 Layer 1 -L2 Layer 2 -L3 Layer 3 -MAC Medium Access Control -MBMS Multimedia Broadcast Multicast Service -MBSFN Multimedia Broadcast multicast service Single Frequency Network -MIB Master Information Block -N/A Not Applicable -NACC Network Assisted Cell Change -NAS Non Access Stratum -PCCH Paging Control Channel -PDU Protocol Data Unit -PDCP Packet Data Convergence Protocol -PLMN Public Land Mobile Network -QoS Quality of Service -RACH Random Access CHannel -RAT Radio Access Technology -RB Radio Bearer -RLC Radio Link Control -RNTI Radio Network Temporary Identifier -RRC Radio Resource Control -RSCP Received Signal Code Power -RSRP Reference Signal Received Power -RSSI Received Signal Strength Indicator -SAE System Architecture Evolution -SAP Service Access Point -SFN System Frame Number -SI System Information -SIB System Information Block -SI-RNTI System Information RNTI -SPS Semi-Persistent Scheduling -SRB Signalling Radio Bearer -S-TMSI SAE Temporary Mobile Station Identifier -TA Tracking Area -TDD Time Division Duplex -TM Transparent Mode -TPC-RNTI Transmit Power Control RNTI -UE User Equipment -UICC Universal Integrated Circuit Card -UL Uplink -UM Unacknowledged Mode -UL-SCH Uplink Shared Channel -UP User Plane -UTRAN Universal Terrestrial Radio Access Network -In the ASN.1, lower case may be used for some (parts) of the above abbreviations e.g. c-RNTI -4 General -4.1 Introduction -This specification is organised as follows: -- sub-clause 4.2 describes the RRC protocol model; -- sub-clause 4.3 specifies the services provided to upper layers as well as the services expected from lower layers; -- sub-clause 4.4 lists the RRC functions; -- clause 5 specifies RRC procedures, including UE state transitions; -- clause 6 specifies the RRC message in a mixed format (i.e. tabular & ASN.1 together); -- clause 7 specifies the variables (including protocol timers and constants) and counters to be used by the UE; -- clause 8 specifies the encoding of the RRC messages; -- clause 9 specifies the specified and default radio configurations; -- clause 10 specifies the RRC messages transferred across network nodes; -- clause 11 specifies the UE capability related constraints and performance requirements. -4.2 Architecture -4.2.1 UE states and state transitions including inter RAT -A UE is in RRC_CONNECTED when an RRC connection has been established. If this is not the case, i.e. no RRC connection is established, the UE is in RRC_IDLE state. The RRC states can further be characterised as follows: -- RRC_IDLE: -- A UE specific DRX may be configured by upper layers. -- UE controlled mobility; -- The UE: -- Monitors a Paging channel to detect incoming calls, system information change, and for ETWS capable UEs, ETWS notification; -- Performs neighbouring cell measurements and cell (re-)selection; -- Acquires system information. -- RRC_CONNECTED: -- Transfer of unicast data to/from UE. -- At lower layers, the UE may be configured with a UE specific DRX. -- Network controlled mobility, i.e. handover and cell change order with optional network assistance (NACC) to GERAN; -- The UE: -- Monitors a Paging channel and/ or System Information Block Type 1 contents to detect system information change, and for ETWS capable UEs, ETWS notification; -Monitors control channels associated with the shared data channel to determine if data is scheduled for it; -- Provides channel quality and feedback information; -- Performs neighbouring cell measurements and measurement reporting; -- Acquires system information. -The following figure not only provides an overview of the RRC states in E-UTRA, but also illustrates the mobility support between E-UTRAN, UTRAN and GERAN. - -Figure 4.2.1-1: E-UTRA states and inter RAT mobility procedures, 3GPP -The following figure illustrates the mobility support between E-UTRAN, CDMA2000 1xRTT and CDMA2000 HRPD. The details of the CDMA2000 state models are out of the scope of this specification. - -Figure 4.2.1-2: Mobility procedures between E-UTRA and CDMA2000 -The inter-RAT handover procedure(s) supports the case of signalling, conversational services, non-conversational services and combinations of these. The mobility between E-UTRA and non-3GPP systems other than CDMA2000 is FFS. -In addition to the state transitions shown in Figure 4.2.1-1 and Figure 4.2.1-2, there is support for connection release with redirection information from E-UTRA RRC_CONNECTED to GERAN, UTRAN and CDMA2000 (HRPD Idle/ 1xRTT Dormant mode). -4.2.2 Signalling radio bearers -"Signalling Radio Bearers" (SRBs) are defined as Radio Bearers (RB) that are used only for the transmission of RRC and NAS messages. More specifically, the following three SRBs are defined: -- SRB0 is for RRC messages using the CCCH logical channel; -- SRB1 is for RRC messages (which may include a piggybacked NAS message) as well as for NAS messages prior to the establishment of SRB2, all using DCCH logical channel; -- SRB2 is for NAS messages, using DCCH logical channel. SRB2 has a lower-priority than SRB1 and is always configured by E-UTRAN after security activation. -In downlink piggybacking of NAS messages is used only for one dependant (i.e. with joint success/ failure) procedure: bearer establishment/ modification/ release. In uplink NAS message piggybacking is used only for transferring the initial NAS message during connection setup. -NOTE: The NAS messages transferred via SRB2 are also contained in RRC messages, which however do not include any RRC protocol control information. -Once security is activated, all RRC messages on SRB1 and SRB2, including those containing NAS or non-3GPP messages, are integrity protected and ciphered by PDCP. NAS independently applies integrity protection and ciphering to the NAS messages. -4.3 Services -4.3.1 Services provided to upper layers -The RRC protocol offers the following services to upper layers: -- Broadcast of common control information; -- Notification of UEs in RRC_IDLE, e.g. about a terminating call, for ETWS; -- Transfer of dedicated control information, i.e. information for one specific UE. -4.3.2 Services expected from lower layers -In brief, the following are the main services that RRC expects from lower layers: -- PDCP: integrity protection and ciphering; -- RLC: reliable and in-sequence transfer of information, without introducing duplicates and with support for segmentation and concatenation. -Further details about the services provided by Packet Data Convergence Protocol layer (e.g. integrity and ciphering) are provided in TS 36.323 [8]. The services provided by Radio Link Control layer (e.g. the RLC modes) are specified in TS 36.322 [7]. Further details about the services provided by Medium Access Control layer (e.g. the logical channels) are provided in TS 36.321 [6]. The services provided by physical layer (e.g. the transport channels) are specified in TS 36.302 [3]. -4.4 Functions -The RRC protocol includes the following main functions: -- Broadcast of system information: -- Including NAS common information; -- Information applicable for UEs in RRC_IDLE, e.g. cell (re-)selection parameters, neighbouring cell information and information (also) applicable for UEs in RRC_CONNECTED, e.g. common channel configuration information. -- Including ETWS notification; -- RRC connection control: -- Paging; -- Establishment/ modification/ release of RRC connection, including e.g. assignment/ modification of UE identity (C-RNTI), establishment/ modification/ release of SRB1 and SRB2, access class barring; -- Initial security activation, i.e. initial configuration of AS integrity protection (SRBs) and AS ciphering (SRBs, DRBs); -- RRC connection mobility including e.g. intra-frequency and inter-frequency handover, associated security handling, i.e. key/ algorithm change, specification of RRC context information transferred between network nodes; -- Establishment/ modification/ release of RBs carrying user data (DRBs); -- Radio configuration control including e.g. assignment/ modification of ARQ configuration, HARQ configuration, DRX configuration; -- QoS control including assignment/ modification of semi-persistent scheduling (SPS) configuration information for DL and UL, assignment/ modification of parameters for UL rate control in the UE, i.e. allocation of a priority and a prioritised bit rate (PBR) for each RB; -- Recovery from radio link failure; -- Inter-RAT mobility including e.g. security activation, transfer of RRC context information; -- Measurement configuration and reporting: -- Establishment/ modification/ release of measurements (e.g. intra-frequency, inter-frequency and inter- RAT measurements); -- Setup and release of measurement gaps; -- Measurement reporting; -- Other functions including e.g. transfer of dedicated NAS information and non-3GPP dedicated information, transfer of UE radio access capability information, support for E-UTRAN sharing (multiple PLMN identities); -- Generic protocol error handling; -- Support of self-configuration and self-optimisation; -NOTE: Random access is specified entirely in the MAC’ including initial transmission power estimation. -5 Procedures -5.1 General -5.1.1 Introduction -The procedural requirements are structured according to the main functional areas: system information (5.2), connection control (5.3), inter-RAT mobility (5.4) and measurements (5.5). In addition there is a sub-clause other (5.6) that covers e.g. NAS dedicated information transfer, UE capability transfer. Finally, sub-clause 5.7 specifies the generic error handling. -5.1.2 General requirements -The UE shall: -1> process the received messages in order of reception by RRC, i.e. the processing of a message shall be completed before starting the processing of a subsequent message; -NOTE 1: E-UTRAN may initiate a subsequent procedure prior to receiving the UE's response of a previously initiated procedure. -1> within a sub-clause execute the steps according to the order specified in the procedural description; -1> set the rrc-TransactionIdentifier in the response message, if included, to the same value as included in the message received from E-UTRAN that triggered the response message; -1> upon receiving a choice value set to ‘setup’: -2> apply the corresponding received configuration and start using the associated resources, unless explicitly specified otherwise; -1> upon receiving a choice value set to ‘release’: -2> clear the corresponding configuration and stop using the associated resources; -NOTE 2: At each point in time, the UE keeps a single value for each field except for during handover when the UE temporarily stores the previous configuration so it can revert back upon handover failure. In other words: when the UE reconfigures a field, the existing value is released except for during handover. -5.2 System information -5.2.1 Introduction -5.2.1.1 General -System information is divided into the MasterInformationBlock (MIB) and a number of SystemInformationBlocks (SIBs). The MIB includes a limited number of most essential and most frequently transmitted parameters that are needed to acquire other information from the cell, and is transmitted on BCH. SIBs other than SystemInformationBlockType1 are carried in SystemInformation (SI) messages and mapping of SIBs to SI messages is flexibly configurable by schedulingInfoList included in SystemInformationBlockType1, with restrictions that: each SIB is contained only in a single SI message, only SIBs having the same scheduling requirement (periodicity) can be mapped to the same SI message, and SystemInformationBlockType2 is always mapped to the SI message that corresponds to the first entry in the list of SI messages in schedulingInfoList. There may be multiple SI messages transmitted with the same periodicity. SystemInformationBlockType1 and all SI messages are transmitted on DL-SCH. -5.2.1.2 Scheduling -The MIB uses a fixed schedule with a periodicity of 40 ms and repetitions made within 40 ms. The first transmission of the MIB is scheduled in subframe #0 of radio frames for which the SFN mod 4 = 0, and repetitions are scheduled in subframe #0 of all other radio frames. -The SystemInformationBlockType1 uses a fixed schedule with a periodicity of 80 ms and repetitions made within 80 ms. The first transmission of SystemInformationBlockType1 is scheduled in subframe #5 of radio frames for which the SFN mod 8 = 0, and repetitions are scheduled in subframe #5 of all other radio frames for which SFN mod 2 = 0. -The SI messages are transmitted within periodically occurring time domain windows (referred to as SI-windows) using dynamic scheduling. Each SI message is associated with a SI-window and the SI-windows of different SI messages do not overlap. That is, within one SI-window only the corresponding SI is transmitted. The length of the SI-window is common for all SI messages, and is configurable. Within the SI-window, the corresponding SI message can be transmitted a number of times in any subframe other than MBSFN subframes, uplink subframes in TDD, and subframe #5 of radio frames for which SFN mod 2 = 0. The UE acquires the detailed time-domain scheduling (and other information, e.g. frequency-domain scheduling, used transport format) from decoding SI-RNTI on PDCCH (see TS 36.321 [6]). -A single SI-RNTI is used to address SystemInformationBlockType1 as well as all SI messages. -SystemInformationBlockType1 configures the SI-window length and the transmission periodicity for the SI messages. -5.2.1.3 System information validity and notification of changes -Change of system information (other than for ETWS) only occurs at specific radio frames, i.e. the concept of a modification period is used. System information may be transmitted a number of times with the same content within a modification period, as defined by its scheduling. The modification period boundaries are defined by SFN values for which SFN mod m= 0, where m is the number of radio frames comprising the modification period. The modification period is configured by system information. -When the network changes (some of the) system information, it first notifies the UEs about this change, i.e. this may be done throughout a modification period. In the next modification period, the network transmits the updated system information. These general principles are illustrated in figure 5.2.1.3-1, in which different colours indicate different system information. Upon receiving a change notification, the UE acquires the new system information immediately from the start of the next modification period. The UE applies the previously acquired system information until the UE acquires the new system information. - -Figure 5.2.1.3-1: Change of system Information -The Paging message is used to inform UEs in RRC_IDLE and UEs in RRC_CONNECTED about a system information change. If the UE receives a Paging message including the systemInfoModification, it knows that the system information will change at the next modification period boundary. Although the UE may be informed about changes in system information, no further details are provided e.g. regarding which system information will change. -SystemInformationBlockType1 includes a value tag, systemInfoValueTag, that indicates if a change has occurred in the SI messages. UEs may use systemInfoValueTag, e.g. upon return from out of coverage, to verify if the previously stored SI messages are still valid. Additionally, the UE considers stored system information to be invalid after 3 hours from the moment it was successfully confirmed as valid, unless specified otherwise. -E-UTRAN may not update systemInfoValueTag upon change of some system information e.g. ETWS information, regularly changing parameters like CDMA2000 system time (see 6.3). Similarly, E-UTRAN may not include the systemInfoModification within the Paging message upon change of some system information. -The UE verifies that stored system information remains valid by either checking systemInfoValueTag in SystemInformationBlockType1 after the modification period boundary, or attempting to find the systemInfoModification indication at least modificationPeriodCoeff times during the modification period in case no paging is received, in every modification period. If no paging message is received by the UE during a modification period, the UE may assume that no change of system information will occur at the next modification period boundary. If UE in RRC_CONNECTED, during a modification period, receives one paging message, it may deduce from the presence/ absence of systemInfoModification whether a change of system information other than ETWS information will occur in the next modification period or not. -ETWS capable UEs in RRC_CONNECTED shall attempt to read paging at least once every defaultPagingCycle to check whether ETWS notification is present or not. -5.2.1.4 Indication of ETWS notification -ETWS primary notification and/ or ETWS secondary notification can occur at any point in time. The Paging message is used to inform ETWS capable UEs in RRC_IDLE and UEs in RRC_CONNECTED about presence of an ETWS primary notification and/ or ETWS secondary notification. If the UE receives a Paging message including the etws-Indication, it shall start receiving the ETWS primary notification and/ or ETWS secondary notification according to schedulingInfoList contained in SystemInformationBlockType1. -ETWS primary notification is contained in SystemInformationBlockType10 and ETWS secondary notification is contained in SystemInformationBlockType11. Segmentation can be applied for the delivery of a secondary notification. The segmentation is fixed for transmission of a given secondary notification within a cell (i.e. the same segment size for a given segment with the same messageIdentifier, serialNumber and warningMessageSegmentNumber). -5.2.2 System information acquisition -5.2.2.1 General - -Figure 5.2.2.1-1: System information acquisition, normal -The UE applies the system information acquisition procedure to acquire the AS- and NAS- system information that is broadcasted by the E-UTRAN. The procedure applies to UEs in RRC_IDLE and UEs in RRC_CONNECTED. -5.2.2.2 Initiation -The UE shall apply the system information acquisition procedure upon selecting (e.g. upon power on) and upon re-selecting a cell, after handover completion, after entering E-UTRA from another RAT, upon return from out of coverage, upon receiving a notification that the system information has changed, upon receiving an indication about the presence of an ETWS notification, upon receiving a request from CDMA2000 upper layers and upon exceeding the maximum validity duration. Unless explicitly stated otherwise in the procedural specification, the system information acquisition procedure overwrites any stored system information, i.e. delta configuration is not applicable for system information and the UE discontinues using a field if it is absent in system information unless explicitly specified otherwise. -5.2.2.3 System information required by the UE -The UE shall: -1> ensure having a valid version, as defined below, of (at least) the following system information, also referred to as the ‘required’ system information: -2> if in RRC_IDLE: -3> the MasterInformationBlock and SystemInformationBlockType1 as well as SystemInformationBlockType2 through SystemInformationBlockType8, depending on support of the concerned RATs; -2> if in RRC_CONNECTED: -3> the MasterInformationBlock, SystemInformationBlockType1 and SystemInformationBlockType2 as well as SystemInformationBlockType8, depending on support of CDMA2000; -1> delete any stored system information after 3 hours from the moment it was confirmed to be valid as defined in 5.2.1.3, unless specified otherwise; -1> consider any stored system information except SystemInformationBlockType10 and SystemInformationBlockType11 to be invalid if systemInfoValueTag included in the SystemInformationBlockType1 is different from the one of the stored system information; -5.2.2.4 System information acquisition by the UE -The UE shall: -1> apply the specified BCCH configuration defined in 9.1.1.1; -1> if the procedure is triggered by a system information change notification: -2> start acquiring the required system information, as defined in 5.2.2.3, from the beginning of the modification period following the one in which the change notification was received; -NOTE 1: The UE continues using the previously received system information until the new system information has been acquired. -1> if the UE is in RRC_IDLE and enters a cell for which the UE does not have stored a valid version of the system information required in RRC_IDLE, as defined in 5.2.2.3: -2> acquire, using the system information acquisition procedure as defined in 5.2.3, the system information required in RRC_IDLE, as defined in 5.2.2.3; -1> following successful handover completion to a cell for which the UE does not have stored a valid version of the system information required in RRC_CONNECTED, as defined in 5.2.2.3: -2> acquire, using the system information acquisition procedure as defined in 5.2.3, the system information required in RRC_CONNECTED, as defined in 5.2.2.3; -2> upon acquiring the concerned system information: -3> discard the corresponding radio resource configuration information included in the radioResourceConfigCommon previously received in a dedicated message, if any; -1> following a request from CDMA2000 upper layers: -2> acquire SystemInformationBlockType8, as defined in 5.2.3; -1> neither initiate the RRC connection establishment procedure nor initiate transmission of the RRCConnectionReestablishmentRequest message until the UE has a valid version of the MasterInformationBlock and SystemInformationBlockType1 messages as well as SystemInformationBlockType2 ; -1> if the UE is ETWS capable: -2> upon entering a cell during RRC_IDLE, following successful handover or upon connection re-establishment: -3> discard any previously buffered warningMessageSegment; -3> clear, if any, the current values of messageIdentifier and serialNumber for SystemInformationBlockType11; -2> when the UE acquires SystemInformationBlockType1 following ETWS indication, upon entering a cell during RRC_IDLE, following successful handover and upon connection re-establishment: -3> if schedulingInfoList indicates that SystemInformationBlockType10 is present: -4> start acquiring SystemInformationBlockType10 immediately; -3> if schedulingInfoList indicates that SystemInformationBlockType11 is present: -4> start acquiring SystemInformationBlockType11 immediately; -NOTE 2: UEs shall start acquiring SystemInformationBlockType10 and SystemInformationBlockType11 as described above even when systemInfoValueTag in SystemInformationBlockType1 has not changed. -The UE may apply the received SIBs immediately, i.e. the UE does not need to delay using a SIB until all SI messages have been received. The UE may delay applying the received SIBs until completing lower layer procedures associated with a received or a UE originated RRC message, e.g. an ongoing random access procedure. -NOTE 3: While attempting to acquire a particular SIB, if the UE detects from schedulingInfoList that it is no longer present, the UE should stop trying to acquire the particular SIB. -5.2.2.5 Essential system information missing -The UE shall -1> if in RRC_IDLE or in RRC_CONNECTED while T311 is running; and -1> the UE is unable to acquire the MasterInformationBlock, the SystemInformationBlockType1 or the SystemInformationBlockType2: -2> treat the cell as barred in accordance with TS 36.304 [4]; -5.2.2.6 Actions upon reception of the MasterInformationBlock message -Upon receiving the MasterInformationBlock message the UE shall: -1> apply the radio resource configuration included in the phich-Config; -1> if the UE is in RRC_IDLE or if the UE is in RRC_CONNECTED while T311 is running: -2> if the UE has no valid system information stored according to 5.2.2.3 for the concerned cell: -3> apply the received value of dl-Bandwidth to the ul-Bandwidth until SystemInformationBlockType2 is received; -5.2.2.7 Actions upon reception of the SystemInformationBlockType1 message -Upon receiving the SystemInformationBlockType1 message the UE shall: -1> forward the cellIdentity to upper layers; -1> forward the trackingAreaCode to upper layers; -5.2.2.8 Actions upon reception of SystemInformation messages -No UE requirements related to the contents of the SystemInformation messages apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.9 Actions upon reception of SystemInformationBlockType2 -Upon receiving SystemInformationBlockType2, the UE shall: -1> if upper layers indicate that a (UE specific) paging cycle is configured: -2> Apply the shortest of the (UE specific) paging cycle and the defaultPagingCycle included in the radioResourceConfigCommon; -1> else: -2> Apply the defaultPagingCycle included in the radioResourceConfigCommon; -1> if the mbsfn-SubframeConfigList is included: -2> consider that no other DL assignments occur in the MBSFN subframes indicated in the IE mbsfn-SubframeConfigList: -1> apply the configuration included in the radioResourceConfigCommon; -1> apply the specified PCCH configuration defined in 9.1.1.3; -1> not apply the timeAlignmentTimerCommon; -5.2.2.10 Actions upon reception of SystemInformationBlockType3 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.11 Actions upon reception of SystemInformationBlockType4 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.12 Actions upon reception of SystemInformationBlockType5 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.13 Actions upon reception of SystemInformationBlockType6 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.14 Actions upon reception of SystemInformationBlockType7 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.15 Actions upon reception of SystemInformationBlockType8 -Upon receiving SystemInformationBlockType8, the UE shall: -1> if the systemTimeInfo is included: -2> forward the systemTimeInfo to CDMA2000 upper layers; -1> if the UE is in RRC_IDLE and if searchWindowSize is included: -2> forward the searchWindowSize to CDMA2000 upper layers; -1> if parametersHRPD is included; -2> forward the preRegistrationInfoHRPD to CDMA2000 upper layers only if the UE has not received the preRegistrationInfoHRPD within an RRCConnectionReconfiguration message after entering this cell; -2> if the cellReselectionParametersHRPD is included: -3> forward the neighCellListHRPD to the CDMA2000 upper layers; -1> if the parameters1XRTT is included: -2> if the csfb-RegistrationParam1XRTT is included: -3> forward the csfb-RegistrationParam1XRTT to the CDMA2000 upper layers which will use this information to determine if a CS registration/re-registration towards CDMA2000 1xRTT in the EUTRA cell is required; -2> else: -3> indicate to CDMA2000 upper layers that CSFB Registration to CDMA2000 1xRTT is not allowed; -2> if the longCodeState1XRTT is included: -3> forward the longCodeState1XRTT to CDMA2000 upper layers; -2> if the cellReselectionParameters1XRTT is included: -3> forward the neighCellList1XRTT to the CDMA2000 upper layers; -5.2.2.16 Actions upon reception of SystemInformationBlockType9 -Upon receiving SystemInformationBlockType9, the UE shall: -1> if hnb-Name is included, forward the hnb-Name to upper layers; -5.2.2.17 Actions upon reception of SystemInformationBlockType10 -Upon receiving SystemInformationBlockType10, the UE shall: -1> if the received values of messageIdentifier and serialNumber are not the same (each value is the same as the corresponding parameter of a stored pair) as any of the up to two value pairs (messageIdentifier and serialNumber for SystemInformationBlockType10) stored for this PLMN; or there are no value pairs stored for this PLMN: -2> store, for this PLMN, the received values of messageIdentifier and serialNumber for SystemInformationBlockType10 as a pair, if necessary, replacing the oldest value pair (messageIdentifier and serialNumber for SystemInformationBlockType10) stored for this PLMN; -2> forward the received warningType, warningSecurityInfo (if present), messageIdentifier and serialNumber to upper layers; -1> else: -2> update the storage time of the messageIdentifier and serialNumber for SystemInformationBlockType10 pair that are equal to the values in the received SystemInformationBlockType10; -2> discard the received SystemInformationBlockType10 contents; -The UE shall store the values of messageIdentifier and serialNumber for SystemInformationBlockType10, as a pair, for the last two times that it forwarded warningType to upper layers. It shall store values separately for each PLMN for which it holds values. The UE should remove from storage values of messageIdentifier and serialNumber for SystemInformationBlockType10 when 3 hours have elapsed since they were last stored. -5.2.2.18 Actions upon reception of SystemInformationBlockType11 -Upon receiving SystemInformationBlockType11, the UE shall: -1> if the received values of messageIdentifier and serialNumber are the same (each value is the same as the corresponding parameter of a stored pair) as one of the, up to two, value pairs (messageIdentifier and serialNumber) for which a complete warningMessage has been passed to upper layers, stored for this PLMN: -2> update the storage time of the messageIdentifier and serialNumber for SystemInformationBlockType11 pair that are equal to the values in the received SystemInformationBlockType11; -2> discard the received SystemInformationBlockType11 contents; -2> stop reception of SystemInformationBlockType11; -1> else: -2> if there is no current value for messageIdentifier and serialNumber for SystemInformationBlockType11; or -2> if either the received value of messageIdentifier or of serialNumber or of both are different from the current values of messageIdentifier and serialNumber for SystemInformationBlockType11: -3> use the received values of messageIdentifer and serialNumber for SystemInformationBlockType11 as the current values of messageIdentifier and serialNumber for SystemInformationBlockType11; -3> discard any previously buffered warningMessageSegment; -3> if all segments of a warning message have been received: -4> assemble the warningMessage from the received warningMessageSegment; -4> forward the received warningMessage, messageIdentifier, serialNumber and dataCodingScheme to upper layers; -4> stop reception of SystemInformationBlockType11; -4> store the current values of messageIdentifier and serialNumber for SystemInformationBlockType11 as a messageIdentifier and serialNumber for SystemInformationBlockType11 pair for which a complete warningMessage has been passed to upper layers for this PLMN, replacing the oldest stored value pair if necessary; -4> discard the current values of messageIdentifier and serialNumber for SystemInformationBlockType11; -3> else: -4> store the received warningMessageSegment; -4> continue reception of SystemInformationBlockType11; -2> else if all segments of a warning message have been received: -3> assemble the warningMessage from the received warningMessageSegment; -3> forward the received complete warningMessage, messageIdentifier, serialNumber and dataCodingScheme to upper layers; -3> stop reception of SystemInformationBlockType11; -3> store the current values of messageIdentifier and serialNumber for SystemInformationBlockType11 as a messageIdentifier and serialNumber for SystemInformationBlockType11 pair for which a complete warningMessage has been passed to upper layers for this PLMN, replacing the oldest stored value pair if necessary; -3> discard the current values of messageIdentifier and serialNumber for SystemInformationBlockType11; -2> else: -3> continue reception of SystemInformationBlockType11; -The UE shall store the values of messageIdentifier and serialNumber for SystemInformationBlockType11 associated with the last two times that it forwarded a complete warningMessage to upper layers. It shall store values separately for each PLMN for which it holds values. The UE should remove from storage values of messageIdentifier and serialNumber for SystemInformationBlockType11 when 3 hours have elapsed since they were last stored. -The UE should discard the current values of messageIdentifier and serialNumber for SystemInformationBlockType11 if they have remained unchanged for a period of 3 hours from the time that they were first used or if it detects that SystemInformationBlockType11 is no longer scheduled in SystemInformationBlockType1. If the UE discards the current values of messageIdentifier and serialNumber for SystemInformationBlockType11 it shall also discard any stored warningMessageSegments. -5.2.3 Acquisition of an SI message -When acquiring an SI message, the UE shall: -1> determine the start of the SI-window for the concerned SI message as follows: -2> for the concerned SI message, determine the number n which corresponds to the order of entry in the list of SI messages configured by schedulingInfoList in SystemInformationBlockType1; -2> determine the integer value x = (n – 1)*w, where w is the si-WindowLength; -2> the SI-window starts at the subframe #a, where a = x mod 10, in the radio frame for which SFN mod T = FLOOR(x/10), where T is the si-Periodicity of the concerned SI message; -NOTE: E-UTRAN should configure an SI-window of 1 ms only if all SIs are scheduled before subframe #5 in radio frames for which SFN mod 2 = 0. -1> receive DL-SCH using the SI-RNTI from the start of the SI-window and continue until the end of the SI-window whose absolute length in time is given by si-WindowLength, or until the SI message was received, excluding the following subframes: -2> subframe #5 in radio frames for which SFN mod 2 = 0; -2> any MBSFN subframes; -2> any uplink subframes in TDD; -1> if the SI message was not received by the end of the SI-window, repeat reception at the next SI-window occasion for the concerned SI message; -5.3 Connection control -5.3.1 Introduction -5.3.1.1 RRC connection control -RRC connection establishment involves the establishment of SRB1. E-UTRAN completes RRC connection establishment prior to completing the establishment of the S1 connection, i.e. prior to receiving the UE context information from the EPC. Consequently, AS security is not activated during the initial phase of the RRC connection. During this initial phase of the RRC connection, the E-UTRAN may configure the UE to perform measurement reporting. However, the UE only accepts a handover message when security has been activated. -Upon receiving the UE context from the EPC, E-UTRAN activates security (both ciphering and integrity protection) using the initial security activation procedure. The RRC messages to activate security (command and successful response) are integrity protected, while ciphering is started only after completion of the procedure. That is, the response to the message used to activate security is not ciphered, while the subsequent messages (e.g. used to establish SRB2 and DRBs) are both integrity protected and ciphered. -After having initiated the initial security activation procedure, E-UTRAN initiates the establishment of SRB2 and DRBs, i.e. E-UTRAN may do this prior to receiving the confirmation of the initial security activation from the UE. In any case, E-UTRAN will apply both ciphering and integrity protection for the RRC connection reconfiguration messages used to establish SRB2 and DRBs. E-UTRAN should release the RRC connection if the initial security activation and/ or the radio bearer establishment fails (i.e. security activation and DRB establishment are triggered by a joint S1-procedure, which does not support partial success). -For SRB2 and DRBs, security is always activated from the start, i.e. the E-UTRAN does not establish these bearers prior to activating security. -The release of the RRC connection is initiated by E-UTRAN. The procedure may be used to re-direct the UE to another frequency or RAT. In exceptional cases the UE may abort the RRC connection, i.e. move to RRC_IDLE without notifying E-UTRAN. -5.3.1.2 Security -AS security comprises of the integrity protection of RRC signalling (SRBs) as well as the ciphering of RRC signalling (SRBs) and user data (DRBs). -RRC handles the configuration of the security parameters which are part of the AS configuration: the integrity protection algorithm, the ciphering algorithm and two parameters, namely the keyChangeIndicator and the nextHopChainingCount, which are used by the UE to determine the AS security keys upon handover and/ or connection re-establishment. -The integrity protection algorithm is common for signalling radio bearers SRB1 and SRB2. The ciphering algorithm is common for all radio bearers (i.e. SRB1, SRB2 and DRBs). Neither integrity protection nor ciphering applies for SRB0. -RRC integrity and ciphering are always activated together, i.e. in one message/ procedure. RRC integrity and ciphering are never de-activated. However, it is possible to switch to a ‘NULL’ ciphering algorithm (eea0). -NOTE 1: UICC-less emergency calls are not supported in this release of the specification. -NOTE 2: Lower layers discard RRC messages for which the integrity check has failed and indicate the integrity verification check failure to RRC. -The AS applies three different security keys: one for the integrity protection of RRC signalling (KRRCint), one for the ciphering of RRC signalling (KRRCenc) and one for the ciphering of user data (KUPenc). All three AS keys are derived from the KeNB key. The KeNB is based on the KASME key, which is handled by upper layers. -Upon connection establishment new AS keys are derived. No AS-parameters are exchanged to serve as inputs for the derivation of the new AS keys at connection establishment. -The integrity and ciphering of the RRC message used to perform handover is based on the security configuration used prior to the handover and is performed by the source eNB. -The integrity and ciphering algorithms can only be changed upon handover. The four AS keys (KeNB, KRRCint, KRRCenc and KUPenc) change upon every handover and connection re-establishment. The keyChangeIndicator is used upon handover and indicates whether the UE should use the keys associated with the latest available KASME key. The nextHopChainingCount parameter is used upon handover and connection re-establishment by the UE when deriving the new KeNB that is used to generate KRRCint, KRRCenc and KUPenc (see TS 33.401 [32]). An intra cell handover procedure may be used to change the keys in RRC_CONNECTED. -For each radio bearer an independent counter (COUNT, as specified in TS 36.323 [8]) is maintained for each direction. For each DRB, the COUNT is used as input for ciphering. For each SRB, the COUNT is used as input for both ciphering and integrity protection. It is not allowed to use the same COUNT value more than once for a given security key. In order to limit the signalling overhead, individual messages/ packets include a short sequence number (PDCP SN, as specified in TS 36.323 [8]). In addition, an overflow counter mechanism is used: the hyper frame number (TX_HFN and RX_HFN, as specified in TS 36.323 [8]). The HFN needs to be synchronized between the UE and the eNB. The eNB is responsible for avoiding reuse of the COUNT with the same RB identity and with the same KeNB, e.g. due to the transfer of large volumes of data, release and establishment of new RBs. In order to avoid such re-use, the eNB may e.g. use different RB identities for successive RB establishments, trigger an intra cell handover or an RRC_CONNECTED to RRC_IDLE to RRC_CONNECTED transition. -For each SRB, the value provided by RRC to lower layers to derive the 5-bit BEARER parameter used as input for ciphering and for integrity protection is the value of the corresponding srb-Identity with the MSBs padded with zeroes. -5.3.1.3 Connected mode mobility -In RRC_CONNECTED, the network controls UE mobility, i.e. the network decides when the UE shall move to which cell (which may be on another frequency or RAT). For network controlled mobility in RRC_CONNECTED, handover is the only procedure that is defined. The network triggers the handover procedure e.g. based on radio conditions, load. To facilitate this, the network may configure the UE to perform measurement reporting (possibly including the configuration of measurement gaps). The network may also initiate handover blindly, i.e. without having received measurement reports from the UE. -Before sending the handover message to the UE, the source eNB prepares one or more target cells. The target eNB generates the message used to perform the handover, i.e. the message including the AS-configuration to be used in the target cell. The source eNB transparently (i.e. does not alter values/ content) forwards the handover message/ information received from the target to the UE. When appropriate, the source eNB may initiate data forwarding for (a subset of) the DRBs. -After receiving the handover message, the UE attempts to access the target cell at the first available RACH occasion according to Random Access resource selection defined in TS 36.321 [6], i.e. the handover is asynchronous. Consequently, when allocating a dedicated preamble for the random access in the target cell, E-UTRA shall ensure it is available from the first RACH occasion the UE may use. Upon successful completion of the handover, the UE sends a message used to confirm the handover. -After the successful completion of handover, PDCP SDUs may be re-transmitted in the target cell. This only applies for DRBs using RLC-AM mode. The further details are specified in TS 36.323 [8]. After the successful completion of handover, the SN and the HFN are reset except for the DRBs using RLC-AM mode (for which both SN and HFN continue). The further details are specified in TS 36.323 [8]. -One UE behaviour to be performed upon handover is specified, i.e. this is regardless of the handover procedures used within the network (e.g. whether the handover includes X2 or S1 signalling procedures). -The source eNB should, for some time, maintain a context to enable the UE to return in case of handover failure. After having detected handover failure, the UE attempts to resume the RRC connection either in the source or in another cell using the RRC re-establishment procedure. This connection resumption succeeds only if the accessed cell is prepared, i.e. concerns a cell of the source eNB or of another eNB towards which handover preparation has been performed. -5.3.2 Paging -5.3.2.1 General - -Figure 5.3.2.1-1: Paging -The purpose of this procedure is to transmit paging information to a UE in RRC_IDLE and/ or to inform UEs in RRC_IDLE and UEs in RRC_CONNECTED about a system information change and/ or about an ETWS primary notification and/ or ETWS secondary notification. The paging information is provided to upper layers, which in response may initiate RRC connection establishment, e.g. to receive an incoming call. -5.3.2.2 Initiation -E-UTRAN initiates the paging procedure by transmitting the Paging message at the UE’s paging occasion as specified in TS 36.304 [4]. E-UTRAN may address multiple UEs within a Paging message by including one PagingRecord for each UE. E-UTRAN may also indicate a change of system information and/ or provide an ETWS notification in the Paging message. -5.3.2.3 Reception of the Paging message by the UE -Upon receiving the Paging message, the UE shall: -1> if in RRC_IDLE, for each of the PagingRecord, if any, included in the Paging message: -2> if the ue-Identity included in the PagingRecord matches one of the UE identities allocated by upper layers: -3> forward the ue-Identity and the cn-Domain to the upper layers; -1> if the systemInfoModification is included: -2> re-acquire the required system information using the system information acquisition procedure as specified in 5.2.2. -1> if the etws-Indication is included and the UE is ETWS capable: -2> re-acquire SystemInformationBlockType1 immediately, i.e., without waiting until the next system information modification period boundary; -2> if the schedulingInfoList indicates that SystemInformationBlockType10 is present: -3> acquire SystemInformationBlockType10; -2> if the schedulingInfoList indicates that SystemInformationBlockType11 is present: -3> acquire SystemInformationBlockType11; -5.3.3 RRC connection establishment -5.3.3.1 General - -Figure 5.3.3.1-1: RRC connection establishment, successful - -Figure 5.3.3.1-2: RRC connection establishment, network reject -The purpose of this procedure is to establish an RRC connection. RRC connection establishment involves SRB1 establishment. The procedure is also used to transfer the initial NAS dedicated information/ message from the UE to E-UTRAN. -E-UTRAN applies the procedure as follows: -- to establish SRB1 only. -5.3.3.2 Initiation -The UE initiates the procedure when upper layers request establishment of an RRC connection while the UE is in RRC_IDLE. -Upon initiation of the procedure, the UE shall: -1> if the UE is establishing the RRC connection for mobile terminating calls: -2> if timer T302 is running: -3> consider access to the cell as barred; -2> else: -3> consider access to the cell as not barred; -1> else if the UE is establishing the RRC connection for emergency calls: -2> if SystemInformationBlockType2 includes the ac-BarringInfo: -3> if the ac-BarringForEmergency is set to FALSE: -4> consider access to the cell as not barred; -3> else if the UE has one or more Access Classes, as stored on the USIM, with a value in the range 11..15, which is valid for the UE to use according to TS 22.011 [10] and TS 23.122 [11]: -NOTE 1: ACs 12, 13, 14 are only valid for use in the home country and ACs 11, 15 are only valid for use in the HPLMN/ EHPLMN. -4> if the ac-BarringInfo includes ac-BarringForMO-Data, and for all of the valid Access Classes for the UE, the corresponding bit in the ac-BarringForSpecialAC contained in ac-BarringForMO-Data is set to one: -5> consider access to the cell as barred; -4> else: -5> consider access to the cell as not barred; -3> else: -4> consider access to the cell as barred; -2> else: -3> consider access to the cell as not barred; -1> else if the UE is establishing the RRC connection for mobile originating calls: -2> if timer T302 or T303 is running: -3> consider access to the cell as barred; -2> else if SystemInformationBlockType2 includes the ac-BarringInfo and the ac-BarringForMO-Data is present: -3> if the UE has one or more Access Classes, as stored on the USIM, with a value in the range 11..15, which is valid for the UE to use according to TS 22.011 [10] and TS 23.122 [11], and -3> for at least one of these Access Classes the corresponding bit in the ac-BarringForSpecialAC contained in ac-BarringForMO-Data is set to zero: -4> consider access to the cell as not barred; -3> else: -4> draw a random number ‘rand’ uniformly distributed in the range: 0 ? rand < 1; -4> if ‘rand’ is lower than the value indicated by ac-BarringFactor included in ac-BarringForMO-Data: -5> consider access to the cell as not barred; -4> else: -5> consider access to the cell as barred; -2> else: -3> consider access to the cell as not barred; -1> else (the UE is establishing the RRC connection for mobile originating signalling): -2> if timer T302 or T305 is running: -3> consider access to the cell as barred; -2> else if SystemInformationBlockType2 includes the ac-BarringInfo and the ac-BarringForMO-Signalling is present: -3> if the UE has one or more Access Classes, as stored on the USIM, with a value in the range 11..15, which is valid for the UE to use according to TS 22.011 [10] and TS 23.122 [11], and -3> for at least one of these Access Classes the corresponding bit in the ac-BarringForSpecialAC contained in ac-BarringForMO-Signalling is set to zero: -4> consider access to the cell as not barred; -3> else: -4> draw a random number ‘rand’ uniformly distributed in the range: 0 ? rand < 1; -4> if ‘rand’ is lower than the value indicated by ac-BarringFactor included in ac-BarringForMO-Signalling: -5> consider access to the cell as not barred; -4> else: -5> consider access to the cell as barred; -2> else: -3> consider access to the cell as not barred; -1> if access to the cell, as specified above, is not barred: -2> apply the default physical channel configuration as specified in 9.2.4; -2> apply the default semi-persistent scheduling configuration as specified in 9.2.3; -2> apply the default MAC main configuration as specified in 9.2.2; -2> apply the CCCH configuration as specified in 9.1.1.2; -2> apply the timeAlignmentTimerCommon included in SystemInformationBlockType2; -2> start timer T300; -2> initiate transmission of the RRCConnectionRequest message in accordance with 5.3.3.3; -NOTE 2: Upon initiating the connection establishment procedure, the UE is not required to ensure it maintains up to date system information applicable only for UEs in RRC_IDLE state. However, the UE needs to perform system information acquisition upon cell re-selection. -1> else: -2> if the UE is establishing the RRC connection for mobile originating calls and if both timers T302 and T303 are not running: -3> draw a random number ‘rand’ that is uniformly distributed in the range 0 ? rand < 1; -3> start timer T303 with the timer value calculated as follows, using the ac-BarringTime included in ac-BarringForMO-Data: -T303= (0.7+ 0.6 * rand) * ac-BarringTime -3> inform upper layers about the failure to establish the RRC connection and that access barring for mobile originating calls is applicable, upon which the procedure ends; -2> else if the UE is establishing the RRC connection for mobile originating signalling and if both timers T302 and T305 are not running: -3> draw a random number ‘rand’ that is uniformly distributed in the range 0 ? rand < 1; -3> start timer T305 with the timer value calculated as follows, using the ac-BarringTime included in ac-BarringForMO-Signalling: -T305= (0.7+ 0.6 * rand) * ac-BarringTime -3> inform upper layers about the failure to establish the RRC connection and that access barring for mobile originating signalling is applicable, upon which the procedure ends; -2> else if the UE is establishing the RRC connection for emergency calls: -3> inform upper layers about the failure to establish the RRC connection and that access barring for emergency calls is applicable, upon which the procedure ends; -2> else: -3> inform upper layers about the failure to establish the RRC connection, upon which the procedure ends; -5.3.3.3 Actions related to transmission of RRCConnectionRequest message -The UE shall set the contents of RRCConnectionRequest message as follows: -1> set the ue-Identity as follows: -2> if upper layers provide an S-TMSI: -3> set the ue-Identity to the value received from upper layers; -2> else: -3> draw a random value in the range 0 .. 240-1 and set the ue-Identity to this value; -NOTE 1: Upper layers provide the S-TMSI if the UE is registered in the TA of the current cell. -1> set the establishmentCause in accordance with the information received from upper layers; -The UE shall submit the RRCConnectionRequest message to lower layers for transmission. -The UE shall continue cell re-selection related measurements as well as cell re-selection evaluation. If the conditions for cell re-selection are fulfilled, the UE shall perform cell re-selection as specified in 5.3.3.5. -5.3.3.4 Reception of the RRCConnectionSetup by the UE -NOTE: Prior to this, lower layer signalling is used to allocate a C-RNTI. For further details see TS 36.321 [6]; -The UE shall: -1> perform the radio resource configuration procedure in accordance with the received radioResourceConfigDedicated and as specified in 5.3.10; -1> if stored, discard the cell reselection priority information provided by the idleModeMobilityControlInfo or inherited from another RAT; -1> stop timer T300; -1> stop timer T302, if running; -1> stop timer T303, if running; -1> stop timer T305, if running; -1> perform the actions as specified in 5.3.3.7; -1> stop timer T320, if running; -1> enter RRC_CONNECTED; -1> stop the cell re-selection procedure; -1> set the content of RRCConnectionSetupComplete message as follows: -2> set the selectedPLMN-Identity to the PLMN selected by upper layers (see TS 23.122 [11], TS 24.301 [35]) from the PLMN(s) included in the plmn-IdentityList in SystemInformationBlockType1; -2> if upper layers provide the ‘Registered MME’, include and set the registeredMME as follows: -3> if the PLMN identity of the ‘Registered MME’ is different from the PLMN selected by the upper layers: -4> include the plmnIdentity in the registeredMME and set it to the value of the PLMN identity in the ‘Registered MME’ received from upper layers; -3> set the mmegi and the mmec to the value received from upper layers; -2> set the dedicatedInfoNAS to include the information received from upper layers; -2> submit the RRCConnectionSetupComplete message to lower layers for transmission, upon which the procedure ends; -5.3.3.5 Cell re-selection while T300, T302, T303 or T305 is running -The UE shall: -1> if cell reselection occurs while T300, T302, T303 or T305 is running: -2> if timer T302, T303 and/ or T305 is running: -3> stop timer T302, T303 and T305, whichever ones were running; -3> perform the actions as specified in 5.3.3.7; -2> if timer T300 is running: -3> stop timer T300; -3> reset MAC, release the MAC configuration and re-establish RLC for all RBs that are established; -3> inform upper layers about the failure to establish the RRC connection, upon which the procedure ends; -5.3.3.6 T300 expiry -The UE shall: -1> if timer T300 expires: -2> reset MAC, release the MAC configuration and re-establish RLC for all RBs that are established; -2> inform upper layers about the failure to establish the RRC connection, upon which the procedure ends; -5.3.3.7 T302, T303 or T305 expiry or stop -The UE shall: -1> if timer T302 expires or is stopped: -2> inform upper layers about barring alleviation for mobile terminating access; -2> if timer T303 is not running: -3> inform upper layers about barring alleviation for mobile originating calls; -2> if timer T305 is not running: -3> inform upper layers about barring alleviation for mobile originating signalling; -1> if timer T303 expires or is stopped: -2> if timer T302 is not running: -3> inform upper layers about barring alleviation for mobile originating calls; -1> if timer T305 expires or is stopped: -2> if timer T302 is not running: -3> inform upper layers about barring alleviation for mobile originating signalling; -5.3.3.8 Reception of the RRCConnectionReject by the UE -The UE shall: -1> stop timer T300; -1> reset MAC and release the MAC configuration; -1> start timer T302, with the timer value set to the waitTime; -1> inform upper layers about the failure to establish the RRC connection and that access barring for mobile originating calls, mobile originating signalling and mobile terminating access is applicable, upon which the procedure ends; -5.3.3.9 Abortion of RRC connection establishment -If upper layers abort the RRC connection establishment procedure while the UE has not yet entered RRC_CONNECTED, the UE shall: -1> stop timer T300, if running; -1> reset MAC, release the MAC configuration and re-establish RLC for all RBs that are established; -5.3.4 Initial security activation -5.3.4.1 General - -Figure 5.3.4.1-1: Security mode command, successful - -Figure 5.3.4.1-2: Security mode command, failure -The purpose of this procedure is to activate AS security upon RRC connection establishment. -5.3.4.2 Initiation -E-UTRAN initiates the security mode command procedure to a UE in RRC_CONNECTED. Moreover, E-UTRAN applies the procedure as follows: -- when only SRB1 is established, i.e. prior to establishment of SRB2 and/ or DRBs. -5.3.4.3 Reception of the SecurityModeCommand by the UE -The UE shall: -1> derive the KeNB key, as specified in TS 33.401 [32]; -1> derive the KRRCint key associated with the integrityProtAlgorithm indicated in the SecurityModeCommand message, as specified in TS 33.401 [32]; -1> request lower layers to verify the integrity protection of the SecurityModeCommand message, using the algorithm indicated by the integrityProtAlgorithm as included in the SecurityModeCommand message and the KRRCint key; -1> if the SecurityModeCommand message passes the integrity protection check: -2> derive the KRRCenc key and the KUPenc key associated with the cipheringAlgorithm indicated in the SecurityModeCommand message, as specified in TS 33.401 [32]; -2> configure lower layers to apply integrity protection using the indicated algorithm and the KRRCint key immediately, i.e. integrity protection shall be applied to all subsequent messages received and sent by the UE, including the SecurityModeComplete message; -2> configure lower layers to apply ciphering using the indicated algorithm, the KRRCenc key and the KUPenc key after completing the procedure, i.e. ciphering shall be applied to all subsequent messages received and sent by the UE, except for the SecurityModeComplete message which is sent unciphered; -2> consider AS security to be activated; -2> submit the SecurityModeComplete message to lower layers for transmission, upon which the procedure ends; -1> else: -2> continue using the configuration used prior to the reception of the SecurityModeCommand message, i.e. neither apply integrity protection nor ciphering. -2> submit the SecurityModeFailure message to lower layers for transmission, upon which the procedure ends; -5.3.5 RRC connection reconfiguration -5.3.5.1 General - -Figure 5.3.5.1-1: RRC connection reconfiguration, successful - -Figure 5.3.5.1-2: RRC connection reconfiguration, failure -The purpose of this procedure is to modify an RRC connection, e.g. to establish/ modify/ release RBs, to perform handover, to setup/ modify/ release measurements. As part of the procedure, NAS dedicated information may be transferred from E-UTRAN to the UE. -5.3.5.2 Initiation -E-UTRAN may initiate the RRC connection reconfiguration procedure to a UE in RRC_CONNECTED. E-UTRAN applies the procedure as follows: -- the mobilityControlInfo is included only when AS-security has been activated, and SRB2 with at least one DRB are setup and not suspended; -- the establishment of RBs (other than SRB1, that is established during RRC connection establishment) is included only when AS security has been activated; -5.3.5.3 Reception of an RRCConnectionReconfiguration not including the mobilityControlInfo by the UE -If the RRCConnectionReconfiguration message does not include the mobilityControlInfo and the UE is able to comply with the configuration included in this message, the UE shall: -1> if this is the first RRCConnectionReconfiguration message after successful completion of the RRC Connection Re-establishment procedure: -2> re-establish PDCP for SRB2 and for all DRBs that are established, if any; -2> re-establish RLC for SRB2 and for all DRBs that are established, if any; -2> if the RRCConnectionReconfiguration message includes the radioResourceConfigDedicated: -3> perform the radio resource configuration procedure as specified in 5.3.10; -2> resume SRB2 and all DRBs that are suspended, if any; -NOTE 1: The handling of the radio bearers after the successful completion of the PDCP re-establishment, e.g. the re-transmission of unacknowledged PDCP SDUs (as well as the associated status reporting), the handling of the SN and the HFN, is specified in TS 36.323 [8]. -1> else: -2> if the RRCConnectionReconfiguration message includes the radioResourceConfigDedicated: -3> perform the radio resource configuration procedure as specified in 5.3.10; -NOTE 2: If the RRCConnectionReconfiguration message includes the establishment of radio bearers other than SRB1, the UE may start using these radio bearers immediately, i.e. there is no need to wait for an outstanding acknowledgment of the SecurityModeComplete message. -1> if the RRCConnectionReconfiguration message includes the dedicatedInfoNASList: -2> forward each element of the dedicatedInfoNASList to upper layers; -1> if the RRCConnectionReconfiguration message includes the measConfig: -2> perform the measurement configuration procedure as specified in 5.5.2; -1> submit the RRCConnectionReconfigurationComplete message to lower layers for transmission using the new configuration, upon which the procedure ends; -5.3.5.4 Reception of an RRCConnectionReconfiguration including the mobilityControlInfo by the UE (handover) -If the RRCConnectionReconfiguration message includes the mobilityControlInfo and the UE is able to comply with the configuration included in this message, the UE shall: -1> stop timer T310, if running; -1> start timer T304 with the timer value set to t304, as included in the mobilityControlInfo; -1> if the carrierFreq is included: -2> consider the target cell to be one on the frequency indicated by the carrierFreq with a physical cell identity indicated by the targetPhysCellId; -1> else: -2> consider the target cell to be one on the current frequency with a physical cell identity indicated by the targetPhysCellId; -1> start synchronising to the DL of the target cell; -NOTE 1: The UE should perform the handover as soon as possible following the reception of the RRC message triggering the handover, which could be before confirming successful reception (HARQ and ARQ) of this message. -1> reset MAC; -1> re-establish PDCP for all RBs that are established; -NOTE 2: The handling of the radio bearers after the successful completion of the PDCP re-establishment, e.g. the re-transmission of unacknowledged PDCP SDUs (as well as the associated status reporting), the handling of the SN and the HFN, is specified in TS 36.323 [8]. -1> re-establish RLC for all RBs that are established; -1> apply the value of the newUE-Identity as the C-RNTI; -1> configure lower layers in accordance with the received radioResourceConfigCommon; -1> if the RRCConnectionReconfiguration message includes the radioResourceConfigDedicated: -2> perform the radio resource configuration procedure as specified in 5.3.10; -1> if the keyChangeIndicator received in the securityConfigHO is set to TRUE: -2> update the KeNB key based on the fresh KASME key taken into use with the previous successful NAS SMC procedure, as specified in TS 33.401 [32]; -1> else: -2> update the KeNB key based on the current KeNB or the NH, using the nextHopChainingCount value indicated in the securityConfigHO, as specified in TS 33.401 [32]; -1> store the nextHopChainingCount value; -1> if the securityAlgorithmConfig is included in the securityConfigHO: -2> derive the KRRCint key associated with the integrityProtAlgorithm, as specified in TS 33.401 [32]; -2> derive the KRRCenc key and the KUPenc key associated with the cipheringAlgorithm, as specified in TS 33.401 [32]; -1> else: -2> derive the KRRCint key associated with the current integrity algorithm, as specified in TS 33.401 [32]; -2> derive the KRRCenc key and the KUPenc key associated with the current ciphering algorithm, as specified in TS 33.401 [32]; -1> configure lower layers to apply the integrity protection algorithm and the KRRCint key, i.e. the integrity protection configuration shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> configure lower layers to apply the ciphering algorithm, the KRRCenc key and the KUPenc key, i.e. the ciphering configuration shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> perform the measurement related actions as specified in 5.5.6.1; -1> if the RRCConnectionReconfiguration message includes the measConfig: -2> perform the measurement configuration procedure as specified in 5.5.2; -1> submit the RRCConnectionReconfigurationComplete message to lower layers for transmission; -1> if MAC successfully completes the random access procedure: -2> stop timer T304; -2> apply the parts of the configuration that do not require the UE to know the SFN of the target cell; -2> apply the parts of the measurement and the radio resource configuration that require the UE to know the SFN of the target cell (e.g. measurement gaps, periodic CQI reporting, scheduling request configuration, sounding RS configuration), if any, upon acquiring the SFN of the target cell; -2> the procedure ends; -NOTE 3: The UE is not required to determine the SFN of the target cell by acquiring system information from that cell before performing RACH access in the target cell. -5.3.5.5 Reconfiguration failure -The UE shall: -1> if the UE is unable to comply with (part of) the configuration included in the RRCConnectionReconfiguration message: -2> continue using the configuration used prior to the reception of RRCConnectionReconfiguration message; -2> if security has not been activated: -3> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -2> else: -3> initiate the connection re-establishment procedure as specified in 5.3.7, upon which the connection reconfiguration procedure ends; -NOTE 1: The UE may apply above failure handling also in case the RRCConnectionReconfiguration message causes a protocol error for which the generic error handling as defined in 5.7 specifies that the UE shall ignore the message. -NOTE 2: If the UE is unable to comply with part of the configuration, it does not apply any part of the configuration, i.e. there is no partial success/ failure. -5.3.5.6 T304 expiry (handover failure) -The UE shall: -1> if T304 expires (handover failure): -NOTE: Following T304 expiry any dedicated preamble, if provided within the rach-ConfigDedicated, is not available for use by the UE anymore. -2> revert back to the configuration used in the source cell, excluding the configuration configured by the physicalConfigDedicated, the mac-MainConfig and the sps-Config; -2> initiate the connection re-establishment procedure as specified in 5.3.7, upon which the RRC connection reconfiguration procedure ends; -5.3.6 Counter check -5.3.6.1 General - -Figure 5.3.6.1-1: Counter check procedure -The counter check procedure is used by E-UTRAN to request the UE to verify the amount of data sent/ received on each DRB. More specifically, the UE is requested to check if, for each DRB, the most significant bits of the COUNT match with the values indicated by E-UTRAN. -NOTE: The procedure enables E-UTRAN to detect packet insertion by an intruder (a ‘man in the middle’). -5.3.6.2 Initiation -E-UTRAN initiates the procedure by sending a CounterCheck message. -NOTE: E-UTRAN may initiate the procedure when any of the COUNT values reaches a specific value. -5.3.6.3 Reception of the CounterCheck message by the UE -Upon receiving the CounterCheck message, the UE shall: -1> for each DRB that is established: -2> if no COUNT exists for a given direction (uplink or downlink) because it is a uni-directional bearer configured only for the other direction: -3> assume the COUNT value to be ‘0’ for the unused direction; -2> if the drb-Identity is not included in the drb-CountMSB-InfoList: -3> include the DRB in the drb-CountInfoList in the CounterCheckResponse message by including the drb-Identity, the count-Uplink and the count-Downlink set to the value of the corresponding COUNT; -2> else if, for at least one direction, the most significant bits of the COUNT are different from the value indicated in the drb-CountMSB-InfoList: -3> include the DRB in the drb-CountInfoList in the CounterCheckResponse message by including the drb-Identity, the count-Uplink and the count-Downlink set to the value of the corresponding COUNT; -1> for each DRB that is included in the drb-CountMSB-InfoList in the CounterCheck message that is not established: -2> include the DRB in the drb-CountInfoList in the CounterCheckResponse message by including the drb-Identity, the count-Uplink and the count-Downlink with the most significant bits set identical to the corresponding values in the drb-CountMSB-InfoList and the least significant bits set to zero; -1> submit the CounterCheckResponse message to lower layers for transmission upon which the procedure ends; -5.3.7 RRC connection re-establishment -5.3.7.1 General - -Figure 5.3.7.1-1: RRC connection re-establishment, successful - -Figure 5.3.7.1-2: RRC connection re-establishment, failure -The purpose of this procedure is to re-establish the RRC connection, which involves the resumption of SRB1 operation and the re-activation of security. -A UE in RRC_CONNECTED, for which security has been activated, may initiate the procedure in order to continue the RRC connection. The connection re-establishment succeeds only if the concerned cell is prepared i.e. has a valid UE context. In case E-UTRAN accepts the re-establishment, SRB1 operation resumes while the operation of other radio bearers remains suspended. If AS security has not been activated, the UE does not initiate the procedure but instead moves to RRC_IDLE directly. -E-UTRAN applies the procedure as follows: -- to reconfigure SRB1 and to resume data transfer only for this RB; -- to re-activate AS security without changing algorithms. -5.3.7.2 Initiation -The UE shall only initiate the procedure when AS security has been activated. The UE initiates the procedure when one of the following conditions is met: -1> upon detecting radio link failure, in accordance with 5.3.11; or -1> upon handover failure, in accordance with 5.3.5.6; or -1> upon mobility from E-UTRA failure, in accordance with 5.4.3.5; or -1> upon integrity check failure indication from lower layers; or -1> upon an RRC connection reconfiguration failure, in accordance with 5.3.5.5; -Upon initiation of the procedure, the UE shall: -1> stop timer T310, if running; -1> start timer T311; -1> suspend all RBs except SRB0; -1> reset MAC; -1> apply the default physical channel configuration as specified in 9.2.4; -1> apply the default semi-persistent scheduling configuration as specified in 9.2.3; -1> apply the default MAC main configuration as specified in 9.2.2; -1> perform cell selection in accordance with the cell selection process as specified in TS 36.304 [4]; -5.3.7.3 Actions following cell selection while T311 is running -Upon selecting a suitable E-UTRA cell, the UE shall: -1> stop timer T311; -1> start timer T301; -1> apply the timeAlignmentTimerCommon included in SystemInformationBlockType2; -1> initiate transmission of the RRCConnectionReestablishmentRequest message in accordance with 5.3.7.4; -NOTE: This procedure applies also if the UE returns to the source cell. -Upon selecting an inter-RAT cell, the UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘RRC connection failure’; -5.3.7.4 Actions related to transmission of RRCConnectionReestablishmentRequest message -The UE shall set the contents of RRCConnectionReestablishmentRequest message as follows: -1> set the ue-Identity as follows: -2> set the c-RNTI to the C-RNTI used in the source cell (handover and mobility from E-UTRA failure) or used in the cell in which the trigger for the re-establishment occurred (other cases); -2> set the physCellId to the physical cell identity of the source cell (handover and mobility from E-UTRA failure) or of the cell in which the trigger for the re-establishment occurred (other cases); -2> set the shortMAC-I to the 16 least significant bits of the MAC-I calculated: -3> over the ASN.1 encoded as per section 8 (i.e., a multiple of 8 bits) VarShortMAC-Input; -3> with the KRRCint key and integrity protection algorithm that was used in the source cell (handover and mobility from E-UTRA failure) or of the cell in which the trigger for the re-establishment occurred (other cases); and -3> with all input bits for COUNT, BEARER and DIRECTION set to binary ones; -1> set the reestablishmentCause as follows: -2> if the re-establishment procedure was initiated due to reconfiguration failure as specified in 5.3.5.5 (the UE is unable to comply with the reconfiguration): -3> set the reestablishmentCause to the value ‘reconfigurationFailure’; -2> else if the re-establishment procedure was initiated due to handover failure as specified in 5.3.5.6 (intra-LTE handover failure) or 5.4.3.5 (inter-RAT mobility from EUTRA failure): -3> set the reestablishmentCause to the value ‘handoverFailure’; -2> else: -3> set the reestablishmentCause to the value ‘otherFailure’; -The UE shall submit the RRCConnectionReestablishmentRequest message to lower layers for transmission. -5.3.7.5 Reception of the RRCConnectionReestablishment by the UE -NOTE: Prior to this, lower layer signalling is used to allocate a C-RNTI. For further details see TS 36.321 [6]; -The UE shall: -1> stop timer T301; -1> re-establish PDCP for SRB1; -1> re-establish RLC for SRB1; -1> perform the radio resource configuration procedure in accordance with the received radioResourceConfigDedicated and as specified in 5.3.10; -1> resume SRB1; -1> update the KeNB key based on the KASME key to which the current KeNB is associated, using the nextHopChainingCount value indicated in the RRCConnectionReestablishment message, as specified in TS 33.401 [32]; -1> store the nextHopChainingCount value; -1> derive the KRRCint key associated with the previously configured integrity algorithm, as specified in TS 33.401 [32]; -1> derive the KRRCenc key and the KUPenc key associated with the previously configured ciphering algorithm, as specified in TS 33.401 [32]; -1> configure lower layers to activate integrity protection using the previously configured algorithm and the KRRCint key immediately, i.e., integrity protection shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> configure lower layers to apply ciphering using the previously configured algorithm, the KRRCenc key and the KUPenc key immediately, i.e., ciphering shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> perform the measurement related actions as specified in 5.5.6.1; -1> submit the RRCConnectionReestablishmentComplete message to lower layers for transmission, upon which the procedure ends; -5.3.7.6 T311 expiry -Upon T311 expiry, the UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘RRC connection failure’; -5.3.7.7 T301 expiry or selected cell no longer suitable -The UE shall: -1> if timer T301 expires; or -1> if the selected cell becomes no longer suitable according to the cell selection criteria as specified in TS 36.304 [4]: -2> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘RRC connection failure’; -5.3.7.8 Reception of RRCConnectionReestablishmentReject by the UE -Upon receiving the RRCConnectionReestablishmentReject message, the UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘RRC connection failure’; -5.3.8 RRC connection release -5.3.8.1 General - -Figure 5.3.8.1-1: RRC connection release, successful -The purpose of this procedure is to release the RRC connection, which includes the release of the established radio bearers as well as all radio resources. -5.3.8.2 Initiation -E-UTRAN initiates the RRC connection release procedure to a UE in RRC_CONNECTED. -5.3.8.3 Reception of the RRCConnectionRelease by the UE -The UE shall: -1> delay the following actions defined in this sub-clause 60 ms from the moment the RRCConnectionRelease message was received or optionally when lower layers indicate that the receipt of the RRCConnectionRelease message has been successfully acknowledged, whichever is earlier; -1> if the RRCConnectionRelease message includes the idleModeMobilityControlInfo: -2> store the cell reselection priority information provided by the idleModeMobilityControlInfo; -2> if the t320 is included: -3> start timer T320, with the timer value set according to the value of t320; -1> else: -2> apply the cell reselection priority information broadcast in the system information; -1> if the releaseCause received in the RRCConnectionRelease message indicates ‘loadBalancingTAURequired’: -2> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘load balancing TAU required’; -1> else: -2> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -5.3.8.4 T320 expiry -The UE shall: -1> if T320 expires: -2> if stored, discard the cell reselection priority information provided by the idleModeMobilityControlInfo or inherited from another RAT; -2> apply the cell reselection priority information broadcast in the system information; -5.3.9 RRC connection release requested by upper layers -5.3.9.1 General -The purpose of this procedure is to release the RRC connection. Access to the current cell may be barred as a result of this procedure. -NOTE: Upper layers invoke the procedure, e.g. upon determining that the network has failed an authentication check, see TS 24.301 [35]. -5.3.9.2 Initiation -The UE initiates the procedure when upper layers request the release of the RRC connection. -The UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -1> if the upper layers indicate barring of the serving cell: -2> treat the cell used prior to entering RRC_IDLE as barred according to TS 36.304 [4]; -5.3.10 Radio resource configuration -5.3.10.0 General -The UE shall: -1> if the received radioResourceConfigDedicated includes the srb-ToAddModList: -2> perform the SRB addition or reconfiguration as specified in 5.3.10.1; -1> if the received radioResourceConfigDedicated includes the drb-ToReleaseList: -2> perform DRB release as specified in 5.3.10.2; -1> if the received radioResourceConfigDedicated includes the drb-ToAddModList: -2> perform DRB addition or reconfiguration as specified in 5.3.10.3; -1> if the received radioResourceConfigDedicated includes the mac-MainConfig: -2> perform MAC main reconfiguration as specified in 5.3.10.4; -1> if the received radioResourceConfigDedicated includes sps-Config: -2> perform SPS reconfiguration according to 5.3.10.5; -1> if the received radioResourceConfigDedicated includes the physicalConfigDedicated: -2> reconfigure the physical channel configuration as specified in 5.3.10. 6. -5.3.10.1 SRB addition/ modification -The UE shall: -1> for each srb-Identity value included in the srb-ToAddModList that is not part of the current UE configuration (SRB establishment): -2> apply the specified configuration defined in 9.1.2 for the corresponding SRB; -2> establish a PDCP entity and configure it with the current security configuration, if applicable; -2> establish an RLC entity in accordance with the received rlc-Config; -2> establish a DCCH logical channel in accordance with the received logicalChannelConfig and with the logical channel identity set in accordance with 9.1.2; -1> for each srb-Identity value included in the srb-ToAddModList that is part of the current UE configuration (SRB reconfiguration): -2> reconfigure the RLC entity in accordance with the received rlc-Config; -2> reconfigure the DCCH logical channel in accordance with the received logicalChannelConfig; -5.3.10.2 DRB release -The UE shall: -1> for each drb-Identity value included in the drb-ToReleaseList that is part of the current UE configuration (DRB release): -2> release the PDCP entity; -2> release the RLC entity or entities; -2> release the DTCH logical channel; -1> indicate the release of the DRB(s) and the eps-BearerIdentity of the released DRB(s) to upper layers; -NOTE: The UE does not consider the message as erroneous if the drb-ToReleaseList includes any drb-Identity value that is not part of the current UE configuration. -5.3.10.3 DRB addition/ modification -The UE shall: -1> for each drb-Identity value included in the drb-ToAddModList that is not part of the current UE configuration (DRB establishment): -2> establish a PDCP entity and configure it with the current security configuration and in accordance with the received pdcp-Config; -2> establish an RLC entity or entities in accordance with the received rlc-Config; -2> establish a DTCH logical channel in accordance with the received logicalChannelIdentity and the received logicalChannelConfig; -1> indicate the establishment of the DRB(s) and the eps-BearerIdentity of the established DRB(s) to upper layers; -1> for each drb-Identity value included in the drb-ToAddModList that is part of the current UE configuration (DRB reconfiguration): -2> if the pdcp-Config is included: -3> reconfigure the PDCP entity in accordance with the received pdcp-Config; -2> if the rlc-Config is included: -3> reconfigure the RLC entity or entities in accordance with the received rlc-Config; -2> if the logicalChannelConfig is included: -3> reconfigure the DTCH logical channel in accordance with the received logicalChannelConfig; -NOTE: Removal and addition of the same drb-Identity in single radioResourceConfiguration is not supported. -5.3.10.4 MAC main reconfiguration -The UE shall: -1> reconfigure the MAC main configuration in accordance with the received mac-MainConfig; -5.3.10.5 Semi-persistent scheduling reconfiguration -The UE shall: -1> reconfigure the semi-persistent scheduling in accordance with the received sps-Config: -5.3.10.6 Physical channel reconfiguration -The UE shall: -1> reconfigure the physical channel configuration in accordance with the received physicalConfigDedicated; -1> if the antennaInfo is included and set to ‘explicitValue’: -2> if the configured transmissionMode is not ‘tm3’ or ‘tm4’ release ri-ConfigIndex in cqi-ReportPeriodic, if previously configured; -1> else if the antennaInfo is included and set to ‘defaultValue’: -2> release ri-ConfigIndex in cqi-ReportPeriodic, if previously configured; -5.3.11 Radio link failure related actions -5.3.11.1 Detection of physical layer problems in RRC_CONNECTED -The UE shall: -1> upon receiving N310 consecutive "out-of-sync" indications from lower layers while neither T300, T301, T304 nor T311 is running: -2> start timer T310; -5.3.11.2 Recovery of physical layer problems -Upon receiving N311 consecutive "in-sync" indications from lower layers while T310 is running, the UE shall: -1> stop timer T310; -NOTE 1: In this case, the UE resumes the RRC connection without explicit signalling, i.e. the UE resumes the entire radio resource configuration. -NOTE 2: Periods in time where neither "in-sync" nor "out-of-sync" is reported by layer 1 do not affect the evaluation of the number of consecutive "in-sync" or "out-of-sync" indications. -5.3.11.3 Detection of radio link failure -The UE shall: -1> upon T310 expiry; or -1> upon random access problem indication from MAC while neither T300, T301, T304 nor T311 is running; or -1> upon indication from RLC that the maximum number of retransmissions has been reached: -2> consider radio link failure to be detected; -2> if AS security has not been activated: -3> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -2> else: -3> initiate the connection re-establishment procedure as specified in 5.3.7; -5.3.12 UE actions upon leaving RRC_CONNECTED -Upon leaving RRC_CONNECTED, the UE shall: -1> reset MAC; -1> stop all timers that are running except T320; -1> release all radio resources, including release of the RLC entity, the MAC configuration and the associated PDCP entity for all established RBs; -1> indicate the release of the RRC connection to upper layers together with the release cause; -1> if leaving RRC_CONNECTED was not triggered by reception of the MobilityFromEUTRACommand message: -2> enter RRC_IDLE by performing cell selection in accordance with the cell selection process, defined for the case of leaving RRC_CONNECTED, as specified in TS 36.304 [4]; -5.3.13 UE actions upon PUCCH/ SRS release request -Upon receiving a PUCCH/ SRS release request from lower layers, the UE shall: -1> apply the default physical channel configuration for CQI-ReportConfig as specified in 9.2.4; -1> apply the default physical channel configuration for soundingRS-UL-ConfigDedicated as specified in 9.2.4; -1> apply the default physical channel configuration for schedulingRequestConfig as specified in 9.2.4; -5.4 Inter-RAT mobility -5.4.1 Introduction -The general principles of connected mode mobility are described in 5.3.1.3. The general principles of the security handling upon connected mode mobility are described in 5.3.1.2. -For the (network controlled) inter RAT mobility from E-UTRA for a UE in RRC_CONNECTED, a single procedure is defined that supports both handover and cell change order with optional network assistance (NACC). In case of mobility to CDMA2000, the eNB decides when to move to the other RAT while the target RAT determines to which cell the UE shall move. -5.4.2 Handover to E-UTRA -5.4.2.1 General - -Figure 5.4.2.1-1: Handover to E-UTRA, successful -The purpose of this procedure is to, under the control of the network, transfer a connection between the UE and another Radio Access Network (e.g. GERAN or UTRAN) to E-UTRAN. -The handover to E-UTRA procedure applies when SRBs, possibly in combination with DRBs, are established in another RAT. Handover from UTRAN to E-UTRAN applies only after integrity has been activated in UTRAN. -5.4.2.2 Initiation -The RAN using another RAT initiates the Handover to E-UTRA procedure, in accordance with the specifications applicable for the other RAT, by sending the RRCConnectionReconfiguration message via the radio access technology from which the inter-RAT handover is performed. -E-UTRAN applies the procedure as follows: -- to activate ciphering, possibly using NULL algorithm, if not yet activated in the other RAT; -- to establish SRB1, SRB2 and one or more DRBs, i.e. at least the DRB associated with the default EPS bearer is established; -5.4.2.3 Reception of the RRCConnectionReconfiguration by the UE -If the UE is able to comply with the configuration included in the RRCConnectionReconfiguration message, the UE shall: -1> apply the default physical channel configuration as specified in 9.2.4; -1> apply the default semi-persistent scheduling configuration as specified in 9.2.3; -1> apply the default MAC main configuration as specified in 9.2.2; -1> start timer T304 with the timer value set to t304, as included in the mobilityControlInfo; -1> consider the target cell to be one on the frequency indicated by the carrierFreq with a physical cell identity indicated by the targetPhysCellId; -1> start synchronising to the DL of the target cell; -1> set the C-RNTI to the value of the newUE-Identity; -1> for the target cell, apply the downlink bandwidth indicated by the dl-Bandwidth; -1> for the target cell, apply the uplink bandwidth indicated by (the absence or presence of) the ul-Bandwidth; -1> perform the radio resource configuration procedure as specified in 5.3.10; -1> forward the nas-SecurityParamToEUTRA to the upper layers; -1> derive the KeNB key, as specified in TS 33.401 [32]; -1> store the nextHopChainingCount value; -1> derive the KRRCint key associated with the integrityProtAlgorithm, as specified in TS 33.401 [32]; -1> derive the KRRCenc key and the KUPenc key associated with the cipheringAlgorithm, as specified in TS 33.401 [32]; -1> configure lower layers to apply the indicated integrity protection algorithm and the KRRCint key immediately, i.e. the indicated integrity protection configuration shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> configure lower layers to apply the indicated ciphering algorithm, the KRRCenc key and the KUPenc key immediately, i.e. the indicated ciphering configuration shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> if the RRCConnectionReconfiguration message includes the measConfig: -2> perform the measurement configuration procedure as specified in 5.5.2; -1> submit the RRCConnectionReconfigurationComplete message to lower layers for transmission using the new configuration; -1> use the default values specified in 9.2.5 for timer T310, T311 and constant N310, N311; -1> if MAC successfully completes the random access procedure: -2> stop timer T304; -2> apply the parts of the configuration that do not require the UE to know the SFN of the target cell; -2> apply the parts of the measurement and the radio resource configuration that require the UE to know the SFN of the target cell (e.g. measurement gaps, periodic CQI reporting, scheduling request configuration, sounding RS configuration), if any, upon acquiring the SFN of the target cell; -2> enter E-UTRA RRC_CONNECTED, upon which the procedure ends; -Editor's note: The handling of outstanding signalling/ data may need to be clarified. -5.4.2.4 Reconfiguration failure -The UE shall: -1> if the UE is unable to comply with (part of) the configuration included in the RRCConnectionReconfiguration message: -2> perform the actions defined for this failure case as defined in the specifications applicable for the other RAT; -NOTE 1: The UE may apply above failure handling also in case the RRCConnectionReconfiguration message causes a protocol error for which the generic error handling as defined in 5.7 specifies that the UE shall ignore the message. -NOTE 2: If the UE is unable to comply with part of the configuration, it does not apply any part of the configuration, i.e. there is no partial success/ failure. -5.4.2.5 T304 expiry (handover to E-UTRA failure) -The UE shall: -1> upon T304 expiry (handover to E-UTRA failure): -2> reset MAC; -2> perform the actions defined for this failure case as defined in the specifications applicable for the other RAT; -5.4.3 Mobility from E-UTRA -5.4.3.1 General - -Figure 5.4.3.1-1: Mobility from E-UTRA, successful - -Figure 5.4.3.1-2: Mobility from E-UTRA, failure -The purpose of this procedure is to move a UE in RRC_CONNECTED to a cell using another Radio Access Technology (RAT), e.g. GERAN, UTRA or CDMA2000 systems. The mobility from E-UTRA procedure covers both: -- handover, i.e. the MobilityFromEUTRACommand message includes radio resources that have been allocated for the UE in the target cell; and -- cell change order, i.e. the MobilityFromEUTRACommand message may include information facilitating access of and/ or connection establishment in the target cell, e.g. system information. Cell change order is applicable only to GERAN. -5.4.3.2 Initiation -E-UTRAN initiates the mobility from E-UTRA procedure to a UE in RRC_CONNECTED, possibly in response to a MeasurementReport message, by sending a MobilityFromEUTRACommand message. E-UTRAN applies the procedure as follows: -- the procedure is initiated only when AS-security has been activated, and SRB2 with at least one DRB are setup and not suspended; -5.4.3.3 Reception of the MobilityFromEUTRACommand by the UE -The UE shall be able to receive a MobilityFromEUTRACommand message and perform a cell change order to GERAN, even if no prior UE measurements have been performed on the target cell. -The UE shall: -1> stop timer T310, if running; -1> if the MobilityFromEUTRACommand message includes the purpose set to ‘handover’: -2> if the targetRAT-Type is set to ‘utra’ or ‘geran’: -3> consider inter-RAT mobility as initiated towards the RAT indicated by the targetRAT-Type included in the MobilityFromEUTRACommand message; -3> forward the nas-SecurityParamFromEUTRA to the upper layers; -3> access the target cell indicated in the inter-RAT message in accordance with the specifications of the target RAT; -3> if the targetRAT-Type is set to ‘geran’: -4> use the contents of systemInformation, if provided for PS Handover, as the system information to begin access on the target GERAN cell; -NOTE 1: If there are DRBs for which no radio bearers are established in the target RAT as indicated in the targetRAT-MessageContainer in the message, the E-UTRA RRC part of the UE does not indicate the release of the concerned DRBs to the upper layers. Upper layers may derive which bearers are not established from information received from the AS of the target RAT. -2> else if the targetRAT-Type is set to ‘cdma2000-1XRTT’ or ‘cdma2000-HRPD’: -3> forward the targetRAT-Type and the targetRAT-MessageContainer to the CDMA2000 upper layers for the UE to access the cell indicated in the inter-RAT message in accordance with the specifications of the CDMA2000 target-RAT; -1> else if the MobilityFromEUTRACommand message includes the purpose set to ‘cellChangeOrder’: -2> start timer T304 with the timer value set to t304, as included in the MobilityFromEUTRACommand message; -2> if the targetRAT-Type is set to ‘geran’: -3> if networkControlOrder is included in the MobilityFromEUTRACommand message: -4> apply the value as specified in TS 44.060 [36]; -3> else: -4> acquire networkControlOrder and apply the value as specified in TS 44.060 [36]; -3> use the contents of systemInformation, if provided, as the system information to begin access on the target GERAN cell; -NOTE 2: The systemInformation is constructed in the same way as in 2G to 2G NACC, i.e. the PSI messages are encoded as such, whereas the SI messages exclude 2 octets of headers, see TS 44.060[36]. -2> establish the connection to the target cell indicated in the CellChangeOrder; -NOTE 3: The criteria for success or failure of the cell change order to GERAN are specified in TS 44.060[36]. -5.4.3.4 Successful completion of the mobility from E-UTRA -Upon successfully completing the handover or the cell change order, the UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -1> stop timer T304, if running; -5.4.3.5 Mobility from E-UTRA failure -The UE shall: -1> if T304 expires (mobility from E-UTRA failure); or -1> if the UE does not succeed in establishing the connection to the target radio access technology; or -1> if the UE is unable to comply with (part of) the configuration included in the MobilityFromEUTRACommand message; or -1> if there is a protocol error in the inter RAT information included in the MobilityFromEUTRACommand message, causing the UE to fail the procedure according to the specifications applicable for the target RAT: -2> stop T304, if running; -2> if the cs-FallbackIndicator in the MobilityFromEUTRACommand message was set to ‘TRUE’: -3> indicate to upper layers that the CS Fallback procedure has failed; -2> revert back to the configuration used in the source cell, excluding the configuration configured by the physicalConfigDedicated, mac-MainConfig and sps-Config; -2> initiate the connection re-establishment procedure as specified in 5.3.7; -5.4.4 Handover from E-UTRA preparation request (CDMA2000) -5.4.4.1 General - -Figure 5.4.4.1-1: Handover from E-UTRA preparation request -The purpose of this procedure is to trigger the UE to prepare for handover to CDMA2000 by requesting a connection with this network. This procedure applies to CDMA2000 capable UEs only. -The handover from E-UTRA preparation request procedure applies when signalling radio bearers are established. -5.4.4.2 Initiation -E-UTRAN initiates the handover from E-UTRA preparation request procedure to a UE in RRC_CONNECTED, possibly in response to a MeasurementReport message, by sending a HandoverFromEUTRAPreparationRequest message. E-UTRA initiates the procedure only when AS security has been activated. -5.4.4.3 Reception of the HandoverFromEUTRAPreparationRequest by the UE -Upon reception of the HandoverFromEUTRAPreparationRequest message, the UE shall: -1> indicate the request to prepare handover and forward the cdma2000-Type to the CDMA2000 upper layers; -1> if cdma2000-Type is set to ‘type1XRTT’: -2> forward the rand and the mobilityParametersCDMA2000 to the CDMA2000 upper layers; -5.4.5 UL handover preparation transfer (CDMA2000) -5.4.5.1 General - -Figure 5.4.5.1-1: UL handover preparation transfer -The purpose of this procedure is to tunnel the handover related CDMA2000 dedicated information from UE to E-UTRAN when requested by the higher layers. The procedure is triggered by the higher layers on receipt of HandoverFromEUTRAPreparationRequest message. This procedure applies to CDMA2000 capable UEs only. -5.4.5.2 Initiation -A UE in RRC_CONNECTED initiates the UL Handover Preparation Transfer procedure whenever there is a need to transfer handover related non-3GPP dedicated information. The UE initiates the UL handover preparation transfer procedure by sending the ULHandoverPreparationTransfer message. -5.4.5.3 Actions related to transmission of the ULHandoverPreparationTransfer message -The UE shall set the contents of the ULHandoverPreparationTransfer message as follows: -1> include the cdma2000-Type and the dedicatedInfoCDMA2000; -1> if the cdma2000-Type is set to ‘type1XRTT’: -2> include the meid and set it to the value received from the CDMA2000 upper layers; -1> submit the ULHandoverPreparationTransfer message to lower layers for transmission, upon which the procedure ends; -5.4.5.4 Failure to deliver the ULHandoverPreparationTransfer message -The UE shall: -1> if the UE is unable to guarantee successful delivery of ULHandoverPreparationTransfer messages: -2> inform upper layers about the possible failure to deliver the information contained in the concerned ULHandoverPreparationTransfer message; -5.4.6 Inter-RAT cell change order to E-UTRAN -5.4.6.1 General -The purpose of the inter-RAT cell change order to E-UTRAN procedure is to transfer, under the control of the source radio access technology, a connection between the UE and another radio access technology (e.g. GSM/ GPRS) to E-UTRAN. -5.4.6.2 Initiation -The procedure is initiated when a radio access technology other than E-UTRAN, e.g. GSM/GPRS, using procedures specific for that RAT, orders the UE to change to an E-UTRAN cell. In response, upper layers request the establishment of an RRC connection as specified in subclause 5.3.3. -NOTE: Within the message used to order the UE to change to an E-UTRAN cell, the source RAT should specify the identity of the target E-UTRAN cell as specified in the specifications for that RAT. -The UE shall: -1> upon receiving an RRCConnectionSetup message: -2> consider the inter-RAT cell change order procedure to have completed succesfully; -5.4.6.3 UE fails to complete an inter-RAT cell change order -If the inter-RAT cell change order fails the UE shall return to the other radio access technology and proceed as specified in the appropriate specifications for that RAT. -The UE shall: -1> upon failure to establish the RRC connection as specified in subclause 5.3.3: -2> consider the inter-RAT cell change order procedure to have failed; -NOTE: The cell change was network ordered. Therefore, failure to change to the target cell should not cause the UE to move to UE-controlled cell selection. -5.5 Measurements -5.5.1 Introduction -The UE reports measurement information in accordance with the measurement configuration as provided by E-UTRAN. E-UTRAN provides the measurement configuration applicable for a UE in RRC_CONNECTED by means of dedicated signalling, i.e. using the RRCConnectionReconfiguration message. -The UE can be requested to perform the following types of measurements: -- Intra-frequency measurements: measurements at the downlink carrier frequency of the serving cell. -- Inter-frequency measurements: measurements at frequencies that differ from the downlink carrier frequency of the serving cell. -- Inter-RAT measurements of UTRA frequencies. -- Inter-RAT measurements of GERAN frequencies. -- Inter-RAT measurements of CDMA2000 HRPD or CDMA2000 1xRTT frequencies. -The measurement configuration includes the following parameters: -1. Measurement objects: The objects on which the UE shall perform the measurements. -- For intra-frequency and inter-frequency measurements a measurement object is a single E-UTRA carrier frequency. Associated with this carrier frequency, E-UTRAN can configure a list of cell specific offsets and a list of ‘blacklisted’ cells. Blacklisted cells are not considered in event evaluation or measurement reporting. -- For inter-RAT UTRA measurements a measurement object is a set of cells on a single UTRA carrier frequency. -- For inter-RAT GERAN measurements a measurement object is a set of GERAN carrier frequencies. -- For inter-RAT CDMA2000 measurements a measurement object is a set of cells on a single (HRPD or 1xRTT) carrier frequency. -2. Reporting configurations: A list of reporting configurations where each reporting configuration consists of the following: -- Reporting criterion: The criterion that triggers the UE to send a measurement report. This can either be periodical or a single event description. -- Reporting format: The quantities that the UE includes in the measurement report and associated information (e.g. number of cells to report). -3. Measurement identities: A list of measurement identities where each measurement identity links one measurement object with one reporting configuration. By configuring multiple measurement identities it is possible to link more than one measurement object to the same reporting configuration, as well as to link more than one reporting configuration to the same measurement object. The measurement identity is used as a reference number in the measurement report. -4. Quantity configurations: One quantity configuration is configured per RAT type. The quantity configuration defines the measurement quantities and associated filtering used for all event evaluation and related reporting of that measurement type. One filter can be configured per measurement quantity. -5. Measurement gaps: Periods that the UE may use to perform measurements, i.e. no (UL, DL) transmissions are scheduled. -E-UTRAN only configures a single measurement object for a given frequency, i.e. it is not possible to configure two or more measurement objects for the same frequency with different associated parameters, e.g. different offsets and/ or blacklists. E-UTRAN may configure multiple instances of the same event e.g. by configuring two reporting configurations with different thresholds. -The UE maintains a single measurement object list, a single reporting configuration list, and a single measurement identities list. The measurement object list includes measurement objects, that are specified per RAT type, possibly including an intra-frequency object (i.e. the object corresponding to the serving frequency), inter-frequency object(s) and inter-RAT objects. Similarly, the reporting configuration list includes E-UTRA and inter-RAT reporting configurations. Any measurement object can be linked to any reporting configuration of the same RAT type. Some reporting configurations may not be linked to a measurement object. Likewise, some measurement objects may not be linked to a reporting configuration. -The measurement procedures distinguish the following types of cells: -1. The serving cell. -2. Listed cells - these are cells listed within the measurement object(s). -3. Detected cells - these are cells that are not listed within the measurement object(s) but are detected by the UE on the carrier frequency(ies) indicated by the measurement object(s). -For E-UTRA, the UE measures and reports on the serving cell, listed cells and detected cells. For inter-RAT UTRA, the UE measures and reports on listed cells. For inter-RAT GERAN, the UE measures and reports on detected cells. For inter-RAT CDMA2000, the UE measures and reports on listed cells. -NOTE 1: For inter-RAT UTRA and CDMA2000, the UE measures and reports also on detected cells for the purpose of SON. -NOTE 2: This specification is based on the assumption that CSG cells of home deployment type are not indicated within the neighbour list. Furthermore, the assumption is that for non-home deployments, the physical cell identity is unique within the area of a large macro cell (i.e. as for UTRAN). -Whenever the procedural specification, other than contained in sub-clause 5.5.2, refers to a field it concerns a field included in the VarMeasConfig unless explictly stated otherwise i.e. only the measurement configuration procedure covers the direct UE action related to the received measConfig. -5.5.2 Measurement configuration -5.5.2.1 General -E-UTRAN applies the procedure as follows: -- to configure at most one measurement identity using a reporting configuration with the purpose set to ‘reportCGI’; -The UE shall: -1> if the received measConfig includes the measObjectToRemoveList: -2> perform the measurement object removal procedure as specified in 5.5.2.4; -1> if the received measConfig includes the measObjectToAddModList: -2> perform the measurement object addition/ modification procedure as specified in 5.5.2.5; -1> if the received measConfig includes the reportConfigToRemoveList: -2> perform the reporting configuration removal procedure as specified in 5.5.2.6; -1> if the received measConfig includes the reportConfigToAddModList: -2> perform the reporting configuration addition/ modification procedure as specified in 5.5.2.7; -1> if the received measConfig includes the quantityConfig: -2> perform the quantity configuration procedure as specified in 5.5.2.8; -1> if the received measConfig includes the measIdToRemoveList: -2> perform the measurement identity removal procedure as specified in 5.5.2.2; -1> if the received measConfig includes the measIdToAddModList: -2> perform the measurement identity addition/ modification procedure as specified in 5.5.2.3; -1> if the received measConfig includes the measGapConfig: -2> perform the measurement gap configuration procedure as specified in 5.5.2.9; -1> if the received measConfig includes the s-Measure: -2> set the parameter s-Measure within VarMeasConfig to the lowest value of the RSRP ranges indicated by the received value of s-Measure; -1> if the received measConfig includes the preRegistrationInfoHRPD: -2> forward the preRegistrationInfoHRPD to CDMA2000 upper layers; -1> if the received measConfig includes the speedStatePars: -2> set the parameter speedStatePars within VarMeasConfig to the received value of speedStatePars; -5.5.2.2 Measurement identity removal -The UE shall: -1> for each measId included in the received measIdToRemoveList that is part of the current UE configuration in varMeasConfig: -2> remove the entry with the matching measId from the measIdList within the VarMeasConfig; -2> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -2> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -NOTE: The UE does not consider the message as erroneous if the measIdToRemoveList includes any measId value that is not part of the current UE configuration. -5.5.2.3 Measurement identity addition/ modification -E-UTRAN applies the procedure as follows: -- configure a measId only if the corresponding measurement object, the corresponding reporting configuration and the corresponding quantity configuration, are configured; -The UE shall: -1> for each measId included in the received measIdToAddModList: -2> if an entry with the matching measId exists in the measIdList within the VarMeasConfig: -3> replace the entry with the value received for this measId; -2> else: -3> add a new entry for this measId within the VarMeasConfig ; -2> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -2> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -2> if the triggerType is set to ‘periodical’ and the purpose is set to ‘reportCGI’ in the reportConfig associated with this measId: -3> if the measObject associated with this measId concerns E-UTRA: -4> start timer T321 with the timer value set to 1 second for this measId; -3> else: -4> start timer T321 with the timer value set to 8 seconds for this measId; -5.5.2.4 Measurement object removal -The UE shall: -1> for each measObjectId included in the received measObjectToRemoveList that is part of the current UE configuration in varMeasConfig: -2> remove the entry with the matching measObjectId from the measObjectList within the VarMeasConfig; -2> remove all measId associated with this measObjectId from the measIdList within the VarMeasConfig, if any; -2> if a measId is removed from the measIdList: -3> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -3> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -NOTE: The UE does not consider the message as erroneous if the measObjectToRemoveList includes any measObjectId value that is not part of the current UE configuration. -5.5.2.5 Measurement object addition/ modification -The UE shall: -1> for each measObjectId included in the received measObjectToAddModList: -2> if an entry with the matching measObjectId exists in the measObjectList within the VarMeasConfig, for this entry: -3> replace the entry with the value received for this measObject, except for the fields cellsToAddModList, blackCellsToAddModList, cellsToRemoveList and blackCellsToRemoveList: -3> if the received measObject includes the cellsToRemoveList: -4> for each cellIndex included in the cellsToRemoveList: -5> remove the entry with the matching cellIndex from the cellsToAddModList; -3> if the received measObject includes the cellsToAddModList: -4> for each cellIndex value included in the cellsToAddModList: -5> if an entry with the matching cellIndex exists in the cellsToAddModList: -6> replace the entry with the value received for this cellIndex; -5> else: -6> add a new entry for the received cellIndex to the cellsToAddModList; -3> if the received measObject includes the blackCellsToRemoveList: -4> for each cellIndex included in the blackCellsToRemoveList: -5> remove the entry with the matching cellIndex from the blackCellsToAddModList; -3> if the received measObject includes the blackCellsToAddModList: -4> for each cellIndex included in the blackCellsToAddModList: -5> if an entry with the matching cellIndex is included in the blackCellsToAddModList: -6> replace the entry with the value received for this cellIndex; -5> else: -6> add a new entry for the received cellIndex to the blackCellsToAddModList; -3> for each measId associated with this measObjectId in the measIdList within the VarMeasConfig, if any: -4> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -4> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -2> else: -3> add a new entry for the received measObject to the measObjectList within VarMeasConfig; -5.5.2.6 Reporting configuration removal -The UE shall: -1> for each reportConfigId included in the received reportConfigToRemoveList that is part of the current UE configuration in varMeasConfig: -2> remove the entry with the matching reportConfigId from the reportConfigList within the VarMeasConfig; -2> remove all measId associated with the reportConfigId from the measIdList within the VarMeasConfig, if any; -2> if a measId is removed from the measIdList: -3> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -3> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -NOTE: The UE does not consider the message as erroneous if the reportConfigToRemoveList includes any reportConfigId value that is not part of the current UE configuration. -5.5.2.7 Reporting configuration addition/ modification -The UE shall: -1> for each reportConfigId included in the received reportConfigToAddModList: -2> if an entry with the matching reportConfigId exists in the reportConfigList within the VarMeasConfig, for this entry: -3> replace the entry with the value received for this reportConfig; -3> for each measId associated with this reportConfigId included in the measIdList within the VarMeasConfig, if any: -4> remove the measurement reporting entry for this measId from in VarMeasReportList, if included; -4> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -2> else: -3> add a new entry for the received reportConfig to the reportConfigList within the VarMeasConfig; -5.5.2.8 Quantity configuration -The UE shall: -1> set the parameter quantityConfig within VarMeasConfig to the received value of quantityConfig; -1> for each measId included in the measIdList within VarMeasConfig: -2> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -2> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -5.5.2.9 Measurement gap configuration -The UE shall: -1> if measGapConfig is set to ‘setup’: -2> if a measurement gap configuration is already setup, release the measurement gap configuration; -2> setup the measurement gap configuration indicated by the measGapConfig in accordance with the received gapOffset, i.e., each gap starts at an SFN and subframe meeting the following condition: -SFN mod T = FLOOR(gapOffset/10); -subframe = gapOffset mod 10; -with T = MGRP/10 as defined in TS 36.133 [16]; -1> else: -2> release the measurement gap configuration; -5.5.3 Performing measurements -5.5.3.1 General -The UE supports measurements using a reporting configuration with the purpose set to ‘reportCGI’, if the network provides sufficient idle periods. -The UE applies the layer 3 filtering as specified in 5.5.3.2, before using the measured results for evaluation of reporting criteria or for measurement reporting. -The UE shall: -1> for each measId included in the measIdList within VarMeasConfig: -2> if a measurement gap configuration is setup; or -2> the UE does not require measurement gaps to perform the concerned measurement: -3> if s-Measure is not configured; or -3> if s-Measure is configured and the serving cell RSRP, after layer 3 filtering, is lower than this value; or -3> if the purpose for the associated reportConfig is set to ‘reportCGI’: -4> perform the corresponding measurements of neighbouring cells on the frequencies and RATs indicated in the concerned measObject; -2> perform the evaluation of reporting criteria as specified in section 5.5.4; -1> if a measId is configuredfor which the purpose within the associated reportConfig is set to ‘reportCGI’: -2> try to acquire the global cell identity of the cell indicated by the cellForWhichToReportCGI in the associated measObject by acquiring the relevant system information from the concerned cell; -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is an E-UTRAN cell: -3> try to acquire the list of additional PLMN Identities, as included in the plmn-IdentityList, if multiple PLMN identities are broadcast in the concerned cell; -NOTE: The ‘primary’ PLMN is part of the global cell identity. -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is a UTRAN cell: -3> try to acquire the LAC, the RAC and the list of additional PLMN Identities, if multiple PLMN identities are broadcast in the concerned cell; -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is a GERAN cell: -3> try to acquire the RAC in the concerned cell; -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is a CDMA2000 cell and the cdma2000-Type included in the measObject is ‘typeHRPD’: -3> try to acquire the Sector ID in the concerned cell; -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is a CDMA2000 cell and the cdma2000-Type included in the measObject is ‘type1XRTT’: -3> try to acquire the BASE ID, SID and NID in the concerned cell; -5.5.3.2 Layer 3 filtering -The UE shall: -1> for each measurement quantity that the UE performs measurements according to 5.5.3.1: -2> filter the measured result, before using for evaluation of reporting criteria or for measurement reporting, by the following formula: - -where -Mn is the latest received measurement result from the physical layer; -Fn is the updated filtered measurement result, that is used for evaluation of reporting criteria or for measurement reporting; -Fn-1 is the old filtered measurement result, where F0 is set to M1 when the first measurement result from the physical layer is received; and -a = 1/2(k/4), where k is the filterCoefficent for the corresponding measurement quantity received by the quantityConfig; -2> adapt the filter such that the time characteristics of the filter are preserved at different input rates, observing that the filterCoefficent k assumes a sample rate equal to 200 ms; -NOTE 1: If k is set to 0, no layer 3 filtering is applicable. -NOTE 2: The filtering is performed in the same domain as used for evaluation of reporting criteria or for measurement reporting, i.e., logarithmic filtering for logarithmic measurements. -NOTE 3: The filter input rate is implementation dependent, to fulfil the performance requirements set in [16]. For further details about the physical layer measurements, see TS 36.133 [16]. -5.5.4 Measurement report triggering -5.5.4.1 General -The UE shall: -1> for each measId included in the measIdList within VarMeasConfig: -2> if the corresponding reportConfig includes a purpose set to ‘reportStrongestCellsForSON’: -3> consider any neighbouring cell detected on the associated frequency to be applicable; -2> else if the corresponding reportConfig includes a purpose set to ‘reportCGI’: -3> consider any neighbouring cell detected on the associated frequency/ set of frequencies (GERAN) which has a physical cell identity matching the value of the cellForWhichToReportCGI included in the corresponding measObject within the VarMeasConfig to be applicable; -2> else: -3> if the corresponding measObject concerns E-UTRA: -4> consider any neighbouring cell detected on the associated frequency to be applicable when the concerned cell is not included in the blackCellsToAddModList defined within the VarMeasConfig for this measId; -3> else if the corresponding measObject concerns UTRA or CDMA2000: -4> consider a neighbouring cell on the associated frequency to be applicable when the concerned cell is included in the cellsToAddModList defined within the VarMeasConfig for this measId (i.e. the cell is included in the white-list); -3> else if the corresponding measObject concerns GERAN: -4> consider a neighbouring cell on the associated set of frequencies to be applicable when the concerned cell matches the ncc-Permitted defined within the VarMeasConfig for this measId; -2> if the triggerType is set to ‘event’ and if the entry condition applicable for this event, i.e. the event corresponding with the eventId of the corresponding reportConfig within VarMeasConfig, is fulfilled for one or more applicable cells for all measurements after layer 3 filtering taken during timeToTrigger defined for this event within the VarMeasConfig, while the VarMeasReportList does not include an measurement reporting entry for this measId (a first cell triggers the event): -3> include a measurement reporting entry within the VarMeasReportList for this measId; -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> include the concerned cell(s) in the cellsTriggeredList defined within the VarMeasReportList for this measId; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -2> if the triggerType is set to ‘event’ and if the entry condition applicable for this event, i.e. the event corresponding with the eventId of the corresponding reportConfig within VarMeasConfig, is fulfilled for one or more applicable cells not included in the cellsTriggeredList for all measurements after layer 3 filtering taken during timeToTrigger defined for this event within the VarMeasConfig (a subsequent cell triggers the event): -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> include the concerned cell(s) in the cellsTriggeredList defined within the VarMeasReportList for this measId; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -2> if the triggerType is set to ‘event’ and if the leaving condition applicable for this event is fulfilled for one or more of the cells included in the cellsTriggeredList defined within the VarMeasReportList for this measId for all measurements after layer 3 filtering taken during timeToTrigger defined within the VarMeasConfig for this event: -3> remove the concerned cell(s) in the cellsTriggeredList defined within the VarMeasReportList for this measId; -3> if reportOnLeave is set to TRUE for the corresponding reporting configuration: -4> initiate the measurement reporting procedure, as specified in 5.5.5; -3> if the cellsTriggeredList defined within the VarMeasReportList for this measId is empty: -4> remove the measurement reporting entry within the VarMeasReportList for this measId; -4> stop the periodical reporting timer for this measId, if running; -2> if the purpose is included and set to ‘reportStrongestCells’ or to ‘reportStrongestCellsForSON’ and if a (first) measurement result is available for one or more applicable cells: -3> include a measurement reporting entry within the VarMeasReportList for this measId; -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -NOTE 1: If the purpose is set to ‘reportStrongestCells’, the UE initiates a first measurement report immediately after the quantity to be reported becomes available for at least either serving cell or one of the applicable cells. If the purpose is set to ‘reportStrongestCellsForSON’, the UE initiates a first measurement report when it has determined the strongest cells on the associated frequency. -2> upon expiry of the periodical reporting timer for this measId: -3> initiate the measurement reporting procedure, as specified in 5.5.5; -2> if the purpose is included and set to ‘reportCGI’ and if the UE acquired the information needed to set all fields of cellGlobalId for the requested cell: -3> include a measurement reporting entry within the VarMeasReportList for this measId; -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> stop timer T321; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -2> upon expiry of the T321 for this measId: -3> include a measurement reporting entry within the VarMeasReportList for this measId; -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -NOTE 2: The UE does not stop the periodical reporting with triggerType set to ‘event’ or to ‘periodical’ while the corresponding measurement is not performed due to the serving cell RSRP being equal to or better than s-Measure or due to the measurement gap not being setup. -NOTE 3: If the UE is configured with DRX, the UE may delay the measurement reporting for event triggered and periodical triggered measurements until the Active Time, which is defined in TS 36.321 [6]. -5.5.4.2 Event A1 (Serving becomes better than threshold) -The UE shall: -1> consider the entering condition for this event to be satisfied when condition A1-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A1-2, as specified below, is fulfilled; -Inequality A1-1 (Entering condition) - -Inequality A1-2 (Leaving condition) - -The variables in the formula are defined as follows: -Ms is the measurement result of the serving cell, not taking into account any offsets. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Thresh is the threshold parameter for this event (i.e. a1-Threshold as defined within reportConfigEUTRA for this event). -Ms is expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Hys is expressed in dB. -Thresh is expressed in the same unit as Ms. -5.5.4.3 Event A2 (Serving becomes worse than threshold) -The UE shall: -1> consider the entering condition for this event to be satisfied when condition A2-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A2-2, as specified below, is fulfilled; -Inequality A2-1 (Entering condition) - -Inequality A2-2 (Leaving condition) - -The variables in the formula are defined as follows: -Ms is the measurement result of the serving cell, not taking into account any offsets. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Thresh is the threshold parameter for this event (i.e. a2-Threshold as defined within reportConfigEUTRA for this event). -Ms is expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Hys is expressed in dB. -Thresh is expressed in the same unit as Ms. -5.5.4.4 Event A3 (Neighbour becomes offset better than serving) -The UE shall: -1> consider the entering condition for this event to be satisfied when condition A3-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A3-2, as specified below, is fulfilled; -Inequality A3-1 (Entering condition) - -Inequality A3-2 (Leaving condition) - -The variables in the formula are defined as follows: -Mn is the measurement result of the neighbouring cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the neighbour cell (i.e. offsetFreq as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell). -Ocn is the cell specific offset of the neighbour cell (i.e. cellIndividualOffset as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell), and set to zero if not configured for the neighbour cell. -Ms is the measurement result of the serving cell, not taking into account any offsets. -Ofs is the frequency specific offset of the serving frequency (i.e. offsetFreq as defined within measObjectEUTRA corresponding to the serving frequency). -Ocs is the cell specific offset of the serving cell (i.e. cellIndividualOffset as defined within measObjectEUTRA corresponding to the serving frequency), and is set to zero if not configured for the serving cell. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Off is the offset parameter for this event (i.e. a3-Offset as defined within reportConfigEUTRA for this event). -Mn, Ms are expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Ofn, Ocn, Ofs, Ocs, Hys, Off are expressed in dB. -5.5.4.5 Event A4 (Neighbour becomes better than threshold) -The UE shall: -1> consider the entering condition for this event to be satisfied when condition A4-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A4-2, as specified below, is fulfilled; -Inequality A4-1 (Entering condition) - -Inequality A4-2 (Leaving condition) - -The variables in the formula are defined as follows: -Mn is the measurement result of the neighbouring cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the neighbour cell (i.e. offsetFreq as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell). -Ocn is the cell specific offset of the neighbour cell (i.e. cellIndividualOffset as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell), and set to zero if not configured for the neighbour cell. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Thresh is the threshold parameter for this event (i.e. a4-Threshold as defined within reportConfigEUTRA for this event). -Mn is expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Ofn, Ocn, Hys are expressed in dB. -Thresh is expressed in the same unit as Ms. -5.5.4.6 Event A5 (Serving becomes worse than threshold1 and neighbour becomes better than threshold2) -The UE shall: -1> consider the entering condition for this event to be satisfied when both conditions A5-1 and condition A5-2, as specified below, are fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A5-3 or condition A5-4, i.e. at least one of the two, as specified below, is fulfilled; -Inequality A5-1 (Entering condition 1) - -Inequality A5-2 (Entering condition 2) - -Inequality A5-3 (Leaving condition 1) - -Inequality A5-4 (Leaving condition 2) - -The variables in the formula are defined as follows: -Ms is the measurement result of the serving cell, not taking into account any offsets. -Mn is the measurement result of the neighbouring cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the neighbour cell (i.e. offsetFreq as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell). -Ocn is the cell specific offset of the neighbour cell (i.e. cellIndividualOffset as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell), and set to zero if not configured for the neighbour cell. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Thresh1 is the threshold parameter for this event (i.e. a5-Threshold1 as defined within reportConfigEUTRA for this event). -Thresh2 is the threshold parameter for this event (i.e. a5-Threshold2 as defined within reportConfigEUTRA for this event). -Mn, Ms are expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Ofn, Ocn, Hys are expressed in dB. -Thresh1 is expressed in the same unit as Ms. -Thresh2 is expressed in the same unit as Mn. -5.5.4.7 Event B1 (Inter RAT neighbour becomes better than threshold) -The UE shall: -1> for UTRA and CDMA2000, only trigger the event for cells included in the corresponding measurement object; -1> consider the entering condition for this event to be satisfied when condition B1-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition B1-2, as specified below, is fulfilled; -Inequality B1-1 (Entering condition) - -Inequality B1-2 (Leaving condition) - -The variables in the formula are defined as follows: -Mn is the measurement result of the inter-RAT neighbour cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the inter-RAT neighbour cell (i.e. offsetFreq as defined within the measObject corresponding to the frequency of the neighbour inter-RAT cell). -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigInterRAT for this event). -Thresh is the threshold parameter for this event (i.e. b1-Threshold as defined within reportConfigInterRAT for this event). -Mn is expressed in dBm or in dB, depending on the measurement quantity of the inter-RAT neighbour cell. -Ofn, Hys are expressed in dB. -Thresh is expressed in the same unit as Mn. -5.5.4.8 Event B2 (Serving becomes worse than threshold1 and inter RAT neighbour becomes better than threshold2) -The UE shall: -1> for UTRA and CDMA2000, only trigger the event for cells included in the corresponding measurement object; -1> consider the entering condition for this event to be satisfied when both condition B2-1 and condition B2-2, as specified below, are fulfilled; -1> consider the leaving condition for this event to be satisfied when condition B2-3 or condition B2-4, i.e. at least one of the two, as specified below, is fulfilled; -Inequality B2-1 (Entering condition 1) - -Inequality B2-2 (Entering condition 2) - -Inequality B2-3 (Leaving condition 1) - -Inequality B2-4 (Leaving condition 2) - -The variables in the formula are defined as follows: -Ms is the measurement result of the serving cell, not taking into account any offsets. -Mn is the measurement result of the inter-RAT neighbour cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the inter-RAT neighbour cell (i.e. offsetFreq as defined within the measObject corresponding to the frequency of the inter-RAT neighbour cell). -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigInterRAT for this event). -Thresh1 is the threshold parameter for this event (i.e. b2-Threshold1 as defined within reportConfigInterRAT for this event). -Thresh2 is the threshold parameter for this event (i.e. b2-Threshold2 as defined within reportConfigInterRAT for this event). -Ms is expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Mn is expressed in dBm or dB, depending on the measurement quantity of the inter-RAT neighbour cell. -Ofn, Hys are expressed in dB. -Thresh1 is expressed in the same unit as Ms. -Thresh2 is expressed in the same unit as Mn. -5.5.5 Measurement reporting - -Figure 5.5.5-1: Measurement reporting -The purpose of this procedure is to transfer measurement results from the UE to E-UTRAN. -For the measId for which the measurement reporting procedure was triggered, the UE shall set the measResults within the MeasurementReport message as follows: -1> set the measId to the measurement identity that triggered the measurement reporting; -1> set the measResultServCell to include the quantities of serving cell; -1> if there is at least one applicable neighbouring cell to report: -2> set the measResultNeighCells to include the best neighbouring cells up to maxReportCells in accordance with the following: -3> if the triggerType is set to ‘event’: -4> include the cells included in the cellsTriggeredList as defined within the VarMeasReportList for this measId; -3> else: -4> include the applicable cells for which the new measurement results became available since the last periodical reporting or since the measurement was initiated or reset; -NOTE: The reliability of the report (i.e. the certainty it contains the strongest cells on the concerned frequency) depends on the measurement configuration i.e. the reportInterval. The related performance requirements are specified in TS 36.133 [16]. -3> for each cell that is included in the measResultNeighCells, include the physCellId; -3> if the triggerType is set to ‘event’; or the purpose is set to ‘reportStrongestCells’ or to ‘reportStrongestCellsForSON’: -4> for each included cell, include the layer 3 filtered measured results in accordance with the reportConfig for this measId, ordered as follows: -5> if the measObject associated with this measId concerns E-UTRA: -6> set the measResult to include the quantity(ies) indicated in the reportQuantity within the concerned reportConfig in order of decreasing triggerQuantity, i.e. the best cell is included first; -5> else: -6> set the measResult to the quantity as configured for the concerned RAT within the quantityConfig in order of decreasing quantity, i.e. the best cell is included first; -3> else if the purpose is set to ‘reportCGI’: -4> if the mandatory present fields of the cellGlobalId for the cell indicated by the cellForWhichToReportCGI in the associated measObject have been obtained: -5> include the cgi-Info containing all the fields that have been successfully acquired; -1> increment the numberOfReportsSent as defined within the VarMeasReportList for this measId by 1; -1> stop the periodical reporting timer, if running; -1> if the numberOfReportsSent as defined within the VarMeasReportList for this measId is less than the reportAmount as defined within the corresponding reportConfig for this measId: -2> start the periodical reporting timer with the value of reportInterval as defined within the corresponding reportConfig for this measId; -1> else: -2> if the triggerType is set to ‘periodical’: -3> remove the entry within the VarMeasReportList for this measId; -3> remove this measId from the measIdList within VarMeasConfig; -1> if the measured results are for CDMA2000 HRPD: -2> set the preRegistrationStatusHRPD to the UE’s CDMA2000 upper layer’s HRPD preRegistrationStatus; -1> if the measured results are for CDMA2000 1xRTT: -2> set the preRegistrationStatusHRPD to ‘FALSE’; -1> submit the MeasurementReport message to lower layers for transmission, upon which the procedure ends; -5.5.6 Measurement related actions -5.5.6.1 Actions upon handover and re-establishment -E-UTRAN applies the handover procedure as follows: -- when performing the handover procedure, as specified in 5.3.5.4, ensure that a measObjectId corresponding to the handover target carrier frequency is configured as a result of the procedures described in this sub-clause and in 5.3.5.4; -E-UTRAN applies the re-establishment procedure as follows: -- when performing the connection re-establishment procedure, as specified in 5.3.7, ensure that a measObjectId corresponding to the target carrier frequency is configured as a result of the procedure described in this sub-clause and the subsequent connection reconfiguration procedure immediately following the re-establishment procedure; -The UE shall: -1> for each measId included in the measIdList within VarMeasConfig: -2> if the triggerType is set to ‘periodical’: -3> remove this measId from the measIdList within VarMeasConfig: -1> if the procedure was triggered due to inter-frequency handover or successful re-establishment to an inter-frequency cell, update the measId values in the measIdList within VarMeasConfig as follows: -2> if a measObjectId value corresponding to the target carrier frequency exists in the measObjectList within VarMeasConfig: -3> for each measId value in the measIdList: -4> if the measId value is linked to the measObjectId value corresponding to the source carrier frequency: -5> link this measId value to the measObjectId value corresponding to the target carrier frequency; -4> else if the measId value is linked to the measObjectId value corresponding to the target carrier frequency: -5> link this measId value to the measObjectId value corresponding to the source carrier frequency; -2> else: -3> remove all measId values that are linked to the measObjectId value corresponding to the source carrier frequency; -1> remove all measurement reporting entries within VarMeasReportList; -1> reset the periodical reporting timer or timer T321, whichever one is running, as well as associated information (e.g. timeToTrigger) for all measId; -1> release the measurement gaps, if activated; -NOTE: If the UE requires measurement gaps to perform inter-frequency or inter-RAT measurements, the UE resumes the inter-frequency and inter-RAT measurements after the E-UTRAN has setup the measurement gaps. -5.5.6.2 Speed dependant scaling of measurement related parameters -The UE shall adjust the value of the following parameter configured by the E-UTRAN depending on the UE speed: timeToTrigger. The UE shall apply 3 different levels, which are selected as follows: -The UE shall: -1> perform mobility state detection using the mobility state detection as specified in TS 36.304 [4] with the following modifications: -2> counting handovers instead of cell reselections; -2> applying the parameter applicable for RRC_CONNECTED as included in speedStatePars within VarMeasConfig; -1> if high mobility state is detected: -2> use the timeToTrigger value multiplied by sf-High within VarMeasConfig; -1> else if medium mobility state is detected: -2> use the timeToTrigger value multiplied by sf-Medium within VarMeasConfig; - 1> else -2> no scaling is applied; -5.6 Other -5.6.1 DL information transfer -5.6.1.1 General - -Figure 5.6.1.1-1: DL information transfer -The purpose of this procedure is to transfer NAS or (tunnelled) non-3GPP dedicated information from E-UTRAN to a UE in RRC_CONNECTED. -5.6.1.2 Initiation -E-UTRAN initiates the DL information transfer procedure whenever there is a need to transfer NAS or non-3GPP dedicated information. E-UTRAN initiates the DL information transfer procedure by sending the DLInformationTransfer message. -5.6.1.3 Reception of the DLInformationTransfer by the UE -Upon receiving DLInformationTransfer message, the UE shall: -1> if the dedicatedInfoType is set to ‘dedicatedInfoNAS’: -2> forward the dedicatedInfoNAS to the NAS upper layers. -1> if the dedicatedInfoType is set to ‘dedicatedInfoCDMA2000-1XRTT’ or to ‘dedicatedInfoCDMA2000-HRPD: -2> forward the dedicatedInfoCDMA2000 to the CDMA2000 upper layers; -5.6.2 UL information transfer -5.6.2.1 General - -Figure 5.6.2.1-1: UL information transfer -The purpose of this procedure is to transfer NAS or (tunnelled) non-3GPP dedicated information from the UE to E-UTRAN. -5.6.2.2 Initiation -A UE in RRC_CONNECTED initiates the UL information transfer procedure whenever there is a need to transfer NAS or non-3GPP dedicated information, except at RRC connection establishment in which case the NAS information is piggybacked to the RRCConnectionSetupComplete message. The UE initiates the UL information transfer procedure by sending the ULInformationTransfer message. When CDMA2000 information has to be transferred, the UE shall initiate the procedure only if SRB2 is established. -5.6.2.3 Actions related to transmission of ULInformationTransfer message -The UE shall set the contents of the ULInformationTransfer message as follows: -1> if there is a need to transfer NAS information: -2> set the dedicatedInfoType to include the ‘dedicatedInfoNAS’; -1> if there is a need to transfer CDMA2000 1XRTT information: -2> set the dedicatedInfoType to include the ‘dedicatedInfoCDMA2000-1XRTT’; -1> if there is a need to transfer CDMA2000 HRPD information: -2> set the dedicatedInfoType to include the ‘dedicatedInfoCDMA2000-HRPD’; -1> submit the ULInformationTransfer message to lower layers for transmission, upon which the procedure ends; -5.6.2.4 Failure to deliver ULInformationTransfer message -The UE shall: -1> if mobility (i.e. handover, RRC connection re-establishment) occurs before the successful delivery of ULInformationTransfer messages has been confirmed by lower layers: -2> inform upper layers about the possible failure to deliver the information contained in the concerned ULInformationTransfer messages; -5.6.3 UE capability transfer -5.6.3.1 General - -Figure 5.6.3.1-1: UE capability transfer -The purpose of this procedure is to transfer UE radio access capability information from the UE to E-UTRAN. -If the UE has changed its E-UTRAN radio access capabilities, the UE shall request higher layers to initiate the necessary NAS procedures (see TS 23.401) that would result in the update of UE radio access capabilities using a new RRC connection. -NOTE: Change of the UE’s GERAN and/ or UTRAN UE radio capabilities in RRC_IDLE is supported by use of Tracking Area Update. -5.6.3.2 Initiation -E-UTRAN initiates the procedure to a UE in RRC_CONNECTED when it needs (additional) UE radio access capability information. -5.6.3.3 Reception of the UECapabilityEnquiry by the UE -The UE shall: -1> set the contents of UECapabilityInformation message as follows: -2> if the ue-CapabilityRequest includes ‘eutra’: -3> include the UE-EUTRA-Capability within a ue-CapabilityRAT-Container and with the rat-Type set to ‘eutra’; -2> if the ue-CapabilityRequest includes ‘geran-cs’ and if the UE supports GERAN CS domain: -3> include the UE radio access capabilities for GERAN CS within a ue-CapabilityRAT-Container and with the rat-Type set to ‘geran-cs’; -2> if the ue-CapabilityRequest includes ‘geran-ps’ and if the UE supports GERAN PS domain: -3> include the UE radio access capabilities for GERAN PS within a ue-CapabilityRAT-Container and with the rat-Type set to ‘geran-ps’; -2> if the ue-CapabilityRequest includes ‘utra’ and if the UE supports UTRA: -3> include the UE radio access capabilities for UTRA within a ue-CapabilityRAT-Container and with the rat-Type set to ‘utra’; -2> if the ue-CapabilityRequest includes ‘cdma2000-1XRTT’ and if the UE supports CDMA2000 1xRTT: -3> include the UE radio access capabilities for CDMA2000 within a ue-CapabilityRAT-Container and with the rat-Type set to ‘cdma2000-1XRTT’; -1> submit the UECapabilityInformation message to lower layers for transmission, upon which the procedure ends; -5.6.4 CSFB to 1x Parameter transfer -5.6.4.1 General - -Figure 5.6.4.1-1: CSFB to 1x Parameter transfer -The purpose of this procedure is to transfer the CDMA2000 1xRTT parameters required to register the UE in the CDMA2000 1xRTT network for CSFB support. -5.6.4.2 Initiation -A UE in RRC_CONNECTED initiates the CSFB to 1x Parameter transfer procedure upon request from the CDMA2000 upper layers. The UE initiates the CSFB to 1x Parameter transfer procedure by sending the CSFBParametersRequestCDMA2000 message. -5.6.4.3 Actions related to transmission of CSFBParametersRequestCDMA2000 message -The UE shall: -1> submit the CSFBParametersRequestCDMA2000 message to lower layers for transmission using the current configuration; -5.6.4.4 Reception of the CSFBParametersResponseCDMA2000 message -Upon reception of the CSFBParametersResponseCDMA2000 message, the UE shall: -1> forward the rand and the mobilityParameters to the CDMA2000 1xRTT upper layers; -5.7 Generic error handling -5.7.1 General -The generic error handling defined in the subsequent sub-clauses applies unless explicitly specified otherwise e.g. within the procedure specific error handling. -The UE shall consider a value as not comprehended when it is set: -- to an extended value that is not defined in the version of the transfer syntax supported by the UE. -- to a spare or reserved value unless the specification defines specific behaviour that the UE shall apply upon receiving the concerned spare/ reserved value. -The UE shall consider a field as not comprehended when it is defined: -- as spare or reserved unless the specification defines specific behaviour that the UE shall apply upon receiving the concerned spare/ reserved field. -5.7.2 ASN.1 violation or encoding error -The UE shall: -1> when receiving an RRC message on the BCCH, PCCH or CCCH for which the abstract syntax is invalid: -2> ignore the message; -NOTE This section applies in case one or more fields is set to a code point not defined in this version of the transfer syntax. In this case, it may not be possible to reliably detect which field is in the error hence the error handling is at the message level. -5.7.3 Field set to a not comprehended value -The UE shall, when receiving an RRC message on any logical channel: -1> if the message includes a field that has a value that the UE does not comprehend: -2> if a default value is defined for this field: -3> treat the message while using the default value defined for this field; -2> else if the concerned field is optional: -3> treat the message as if the field were absent and in accordance with the need code for absence of the concerned field; -2> else: -3> treat the message as if the field were absent and in accordance with sub-clause 5.7.4; -5.7.4 Mandatory field missing -The UE shall: -1> if the message includes a field that is mandatory to include in the message (e.g. because conditions for mandatory presence are fulfilled) and that field is absent or treated as absent: -2> if the RRC message was received on DCCH or CCCH: -3> ignore the message; -2> else: -3> if the field concerns a (sub-field of) an entry of a list (i.e. a SEQUENCE OF): -4> treat the list as if the entry including the missing or not comprehended field was not present; -3> else if the field concerns a sub-field of another field, referred to as the 'parent' field i.e. the field that is one nesting level up compared to the erroneous field: -4> consider the 'parent' field to be set to a not comprehended value; -4> apply the generic error handling to the subsequent 'parent' field(s), until reaching the top nesting level i.e. the message level; -3> else (field at message level): -4> ignore the message; -NOTE: The error handling defined in these sub-clauses implies that the UE ignores a message with the message type or version set to a not comprehended value. -5.7.5 Not comprehended field -The UE shall, when receiving an RRC message on any logical channel: -1> if the message includes a field that the UE does not comprehend: -2> treat the rest of the message as if the field was absent; -NOTE: This section does not apply to the case of an extension to the value range of a field. Such cases are addressed instead by the requirements in section 5.7.3. -6 Protocol data units, formats and parameters (tabular & ASN.1) -6.1 General -The contents of each RRC message is specified in sub-clause 6.2 using ASN.1 to specify the message syntax and using tables when needed to provide further detailed information about the information elements specified in the message syntax. The syntax of the information elements that are defined as stand-alone abstract types is further specified in a similar manner in sub-clause 6.3. -The need for information elements to be present in a message or an abstract type, i.e., the ASN.1 fields that are specified as OPTIONAL in the abstract notation (ASN.1), is specified by means of comment text tags attached to the OPTIONAL statement in the abstract syntax. All comment text tags are available for use in the downlink direction only. The meaning of each tag is specified in table 6.1-1. -Table 6.1-1: Meaning of abbreviations used to specify the need for information elements to be present -Abbreviation Meaning Cond conditionTag -(Used in downlink only) Conditionally present -An information element for which the need is specified by means of conditions. For each conditionTag, the need is specified in a tabular form following the ASN.1 segment. In case, according to the conditions, a field is not present, the UE takes no action and where applicable shall continue to use the existing value (and/ or the associated functionality) unless explicitly stated otherwise in the description of the field itself. Need OP -(Used in downlink only) Optionally present -An information element that is optional to signal. For downlink messages, the UE is not required to take any special action on absence of the IE beyond what is specified in the procedural text or the field description table following the ASN.1 segment. The UE behaviour on absence should be captured either in the procedural text or in the field description. Need ON -(Used in downlink only) Optionally present, No action -An information element that is optional to signal. If the message is received by the UE, and in case the information element is absent, the UE takes no action and where applicable shall continue to use the existing value (and/ or the associated functionality). Need OR -(Used in downlink only) Optionally present, Release -An information element that is optional to signal. If the message is received by the UE, and in case the information element is absent, the UE shall discontinue/ stop using/ delete any existing value (and/ or the associated functionality). -Any IE with Need ON in system information shall be interpreted as Need OR. -6.2 RRC messages -NOTE: The messages included in this section reflect the current status of the discussions. Additional messages may be included at a later stage. -6.2.1 General message structure -– EUTRA-RRC-Definitions -This ASN.1 segment is the start of the EUTRA RRC PDU definitions. --- ASN1START - -EUTRA-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - --- ASN1STOP - -– BCCH-BCH-Message -The BCCH-BCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE via BCH on the BCCH logical channel. --- ASN1START - -BCCH-BCH-Message ::= SEQUENCE { - message BCCH-BCH-MessageType -} - -BCCH-BCH-MessageType ::= MasterInformationBlock - --- ASN1STOP - -– BCCH-DL-SCH-Message -The BCCH-DL-SCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE via DLSCH on the BCCH logical channel. --- ASN1START - -BCCH-DL-SCH-Message ::= SEQUENCE { - message BCCH-DL-SCH-MessageType -} - -BCCH-DL-SCH-MessageType ::= CHOICE { - c1 CHOICE { - systemInformation SystemInformation, - systemInformationBlockType1 SystemInformationBlockType1 - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– PCCH-Message -The PCCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE on the PCCH logical channel. --- ASN1START - -PCCH-Message ::= SEQUENCE { - message PCCH-MessageType -} - -PCCH-MessageType ::= CHOICE { - c1 CHOICE { - paging Paging - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– DL-CCCH-Message -The DL-CCCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE on the downlink CCCH logical channel. --- ASN1START - -DL-CCCH-Message ::= SEQUENCE { - message DL-CCCH-MessageType -} - -DL-CCCH-MessageType ::= CHOICE { - c1 CHOICE { - rrcConnectionReestablishment RRCConnectionReestablishment, - rrcConnectionReestablishmentReject RRCConnectionReestablishmentReject, - rrcConnectionReject RRCConnectionReject, - rrcConnectionSetup RRCConnectionSetup - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– DL-DCCH-Message -The DL-DCCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE on the downlink DCCH logical channel. --- ASN1START - -DL-DCCH-Message ::= SEQUENCE { - message DL-DCCH-MessageType -} - -DL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - csfbParametersResponseCDMA2000 CSFBParametersResponseCDMA2000, - dlInformationTransfer DLInformationTransfer, - handoverFromEUTRAPreparationRequest HandoverFromEUTRAPreparationRequest, - mobilityFromEUTRACommand MobilityFromEUTRACommand, - rrcConnectionReconfiguration RRCConnectionReconfiguration, - rrcConnectionRelease RRCConnectionRelease, - securityModeCommand SecurityModeCommand, - ueCapabilityEnquiry UECapabilityEnquiry, - counterCheck CounterCheck, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– UL-CCCH-Message -The UL-CCCH-Message class is the set of RRC messages that may be sent from the UE to the EUTRAN on the uplink CCCH logical channel. --- ASN1START - -UL-CCCH-Message ::= SEQUENCE { - message UL-CCCH-MessageType -} - -UL-CCCH-MessageType ::= CHOICE { - c1 CHOICE { - rrcConnectionReestablishmentRequest RRCConnectionReestablishmentRequest, - rrcConnectionRequest RRCConnectionRequest - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– UL-DCCH-Message -The UL-DCCH-Message class is the set of RRC messages that may be sent from the UE to the EUTRAN on the uplink DCCH logical channel. --- ASN1START - -UL-DCCH-Message ::= SEQUENCE { - message UL-DCCH-MessageType -} - -UL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - csfbParametersRequestCDMA2000 CSFBParametersRequestCDMA2000, - measurementReport MeasurementReport, - rrcConnectionReconfigurationComplete RRCConnectionReconfigurationComplete, - rrcConnectionReestablishmentComplete RRCConnectionReestablishmentComplete, - rrcConnectionSetupComplete RRCConnectionSetupComplete, - securityModeComplete SecurityModeComplete, - securityModeFailure SecurityModeFailure, - ueCapabilityInformation UECapabilityInformation, - ulHandoverPreparationTransfer ULHandoverPreparationTransfer, - ulInformationTransfer ULInformationTransfer, - counterCheckResponse CounterCheckResponse, - spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -6.2.2 Message definitions -– CounterCheck -The CounterCheck message is used by the E-UTRAN to indicate the current COUNT MSB values associated to each DRB and to request the UE to compare these to its COUNT MSB values and to report the comparison results to E-UTRAN. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -CounterCheck message --- ASN1START - -CounterCheck ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - counterCheck-r8 CounterCheck-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -CounterCheck-r8-IEs ::= SEQUENCE { - drb-CountMSB-InfoList DRB-CountMSB-InfoList, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - -DRB-CountMSB-InfoList::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-CountMSB-Info - -DRB-CountMSB-Info ::= SEQUENCE { - drb-Identity DRB-Identity, - countMSB-Uplink INTEGER(0..33554431), - countMSB-Downlink INTEGER(0..33554431) -} - --- ASN1STOP - -CounterCheck field descriptions drb-CountMSB-InfoList -Indicates the MSBs of the COUNT values of the DRBs. count-MSB-Uplink -Indicates the value of 25 MSBs from uplink COUNT associated to this DRB. count-MSB-Downlink -Indicates the value of 25 MSBs from downlink COUNT associated to this DRB. -– CounterCheckResponse -The CounterCheckResponse message is used by the UE to respond to a CounterCheck message. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -CounterCheckResponse message --- ASN1START - -CounterCheckResponse ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - counterCheckResponse-r8 CounterCheckResponse-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CounterCheckResponse-r8-IEs ::= SEQUENCE { - drb-CountInfoList DRB-CountInfoList, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -DRB-CountInfoList ::= SEQUENCE (SIZE (0..maxDRB)) OF DRB-CountInfo - -DRB-CountInfo ::= SEQUENCE { - drb-Identity DRB-Identity, - count-Uplink INTEGER(0..4294967295), - count-Downlink INTEGER(0..4294967295) -} - --- ASN1STOP - -CounterCheckResponse field descriptions drb-CountInfoList -Indicates the COUNT values of the DRBs. count-Uplink -Indicates the value of uplink COUNT associated to this DRB. count-Downlink -Indicates the value of downlink COUNT associated to this DRB. -– CSFBParametersRequestCDMA2000 -The CSFBParametersRequestCDMA2000 message is used by the UE to obtain the CDMA2000 1xRTT Parameters from the network. The UE needs these parameters to generate the CDMA2000 1xRTT Registration message used to register with the CDMA2000 1xRTT Network which is required to support CSFB to CDMA2000 1xRTT. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -CSFBParametersRequestCDMA2000 message --- ASN1START - -CSFBParametersRequestCDMA2000 ::= SEQUENCE { - criticalExtensions CHOICE { - csfbParametersRequestCDMA2000-r8 CSFBParametersRequestCDMA2000-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CSFBParametersRequestCDMA2000-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} --- ASN1STOP - -– CSFBParametersResponseCDMA2000 -The CSFBParametersResponseCDMA2000 message is used to provide the CDMA2000 1xRTT Parameters to the UE so the UE can register with the CDMA2000 1xRTT Network to support CSFB to CDMA2000 1xRTT. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -CSFBParametersResponseCDMA2000 message --- ASN1START - -CSFBParametersResponseCDMA2000 ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - csfbParametersResponseCDMA2000-r8 CSFBParametersResponseCDMA2000-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CSFBParametersResponseCDMA2000-r8-IEs ::= SEQUENCE { - rand RAND-CDMA2000, - mobilityParameters MobilityParametersCDMA2000, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - --- ASN1STOP - -– DLInformationTransfer -The DLInformationTransfer message is used for the downlink transfer of dedicated NAS information. -Signalling radio bearer: SRB2 or SRB1 (only if SRB2 not established yet. If SRB2 is suspended, E-UTRAN does not send this message until SRB2 is resumed.) -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -DLInformationTransfer message --- ASN1START - -DLInformationTransfer ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - dlInformationTransfer-r8 DLInformationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -DLInformationTransfer-r8-IEs ::= SEQUENCE { - dedicatedInfoType CHOICE { - dedicatedInfoNAS DedicatedInfoNAS, - dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, - dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 - }, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - --- ASN1STOP - -– HandoverFromEUTRAPreparationRequest (CDMA2000) -The HandoverFromEUTRAPreparationRequest message is used to trigger the handover preparation procedure with a CDMA2000 RAT. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -HandoverFromEUTRAPreparationRequest message --- ASN1START - -HandoverFromEUTRAPreparationRequest ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - handoverFromEUTRAPreparationRequest-r8 - HandoverFromEUTRAPreparationRequest-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverFromEUTRAPreparationRequest-r8-IEs ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - rand RAND-CDMA2000 OPTIONAL, -- Cond cdma2000-Type - mobilityParameters MobilityParametersCDMA2000 OPTIONAL, -- Cond cdma2000-Type - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - - -Conditional presence Explanation cdma2000-Type The field is mandatory present if the cdma2000-Type = type1XRTT; otherwise it is not present. -– MasterInformationBlock -The MasterInformationBlock includes the system information transmitted on BCH. -Signalling radio bearer: N/A -RLC-SAP: TM -Logical channel: BCCH -Direction: EUTRAN to UE -MasterInformationBlock --- ASN1START - -MasterInformationBlock ::= SEQUENCE { - dl-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100}, - phich-Config PHICH-Config, - systemFrameNumber BIT STRING (SIZE (8)), - spare BIT STRING (SIZE (10)) -} - - --- ASN1STOP - -MasterInformationBlock field descriptions dl-Bandwidth -Parameter: transmission bandwidth configuration, NRB in downlink, see TS 36.101 [42, table 5.6-1]. n6 corresponds to 6 resource blocks, n15 to 15 resource blocks and so on. systemFrameNumber -Defines the 8 most significant bits of the SFN, see TS 36.211 [21, 6.6.1]. The 2 least significant bits of the SFN are acquired implicitly in the P-BCH decoding, i.e. timing of 40ms P-BCH TTI indicates 2 least significant bits (within 40ms P-BCH TTI, the first radio frame: 00, the second radio frame: 01, the third radio frame: 10, the last radio frame: 11). -– MeasurementReport -The MeasurementReport message is used for the indication of measurement results. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -MeasurementReport message --- ASN1START - -MeasurementReport ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - measurementReport-r8 MeasurementReport-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -MeasurementReport-r8-IEs ::= SEQUENCE { - measResults MeasResults, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– MobilityFromEUTRACommand -The MobilityFromEUTRACommand message is used to command handover or a cell change from EUTRA to another RAT (3GPP or non-3GPP). -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -MobilityFromEUTRACommand message --- ASN1START - -MobilityFromEUTRACommand ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - mobilityFromEUTRACommand-r8 MobilityFromEUTRACommand-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -MobilityFromEUTRACommand-r8-IEs ::= SEQUENCE { - cs-FallbackIndicator BOOLEAN, - purpose CHOICE{ - handover Handover, - cellChangeOrder CellChangeOrder - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -Handover ::= SEQUENCE { - targetRAT-Type ENUMERATED { - utra, geran, cdma2000-1XRTT, cdma2000-HRPD, - spare4, spare3, spare2, spare1, ...}, - targetRAT-MessageContainer OCTET STRING, - nas-SecurityParamFromEUTRA OCTET STRING (SIZE (1)) OPTIONAL, -- Cond UTRAGERAN - systemInformation SI-OrPSI-GERAN OPTIONAL -- Cond PSHO -} - -CellChangeOrder ::= SEQUENCE { - t304 ENUMERATED { - ms100, ms200, ms500, ms1000, - ms2000, ms4000, ms8000, spare1}, - targetRAT-Type CHOICE { - geran SEQUENCE { - physCellId PhysCellIdGERAN, - carrierFreq CarrierFreqGERAN, - networkControlOrder BIT STRING (SIZE (2)) OPTIONAL, -- Need OP - systemInformation SI-OrPSI-GERAN OPTIONAL -- Need OP - }, - ... - } -} - -SI-OrPSI-GERAN ::= CHOICE { - si SystemInfoListGERAN, - psi SystemInfoListGERAN -} - -SystemInfoListGERAN ::= SEQUENCE (SIZE (1..maxGERAN-SI)) OF - OCTET STRING (SIZE (1..23)) - --- ASN1STOP - -MobilityFromEUTRACommand field descriptions t304 -Timer T304 as described in section 7.3. Value ms100 corresponds with 100 ms, ms200 corresponds with 200 ms and so on. cs-FallbackIndicator -Indicates whether or not the CS Fallback procedure is triggered. E-UTRAN only applies value 'false' when targetRAT-Type is set to ‘cdma2000-1XRTT’ or to ‘cdma2000-HRPD’. targetRAT-Type -Indicates the target RAT type. targetRAT-MessageContainer -The field contains a message specified in another standard, as indicated by the targetRAT-Type, and carries information about the target cell identifier(s) and radio parameters relevant for the target radio access technology. The correspondence between the value of the targetRAT-Type, the standard to apply and the message contained within the targetRAT-MessageContainer is shown below - -A complete message is included, as specified in the other standard. nas-SecurityParamFromEUTRA -Used to deliver the key synchronisation and Key freshness for the E-UTRAN to UTRAN handovers as specified in TS 33.401. The content of the parameter is defined in TS24.301. carrierFreq -contains the carrier frequency of the target GERAN cell. networkControlOrder -Parameter NETWORK_CONTROL_ORDER in TS 44.060 [36]. SystemInfoListGERAN -Each OCTET STRING contains one complete System Information (SI) message as defined in TS 44.018 [45, table 9.1.1] or a complete Packet System Information (PSI) message as defined in TS 44.060 [36, table 11.2.1]. If purpose = 'CellChangeOrder' and if the field is not present, the UE has to acquire this from the GERAN cell. -Conditional presence Explanation UTRAGERAN The field is mandatory present if the targetRAT-Type is set to “utra” or “geran”; otherwise the field is not present PSHO The field is mandatory present in case of PS handover toward GERAN; otherwise the field is optionally present, but not used by the UE -– Paging -The Paging message is used for the notification of one or more UEs. -Signalling radio bearer: N/A -RLC-SAP: TM -Logical channel: PCCH -Direction: EUTRAN to UE -Paging message --- ASN1START - -Paging ::= SEQUENCE { - pagingRecordList PagingRecordList OPTIONAL, -- Need ON - systemInfoModification ENUMERATED {true} OPTIONAL, -- Need ON - etws-Indication ENUMERATED {true} OPTIONAL, -- Need ON - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -PagingRecordList ::= SEQUENCE (SIZE (1..maxPageRec)) OF PagingRecord - -PagingRecord ::= SEQUENCE { - ue-Identity PagingUE-Identity, - cn-Domain ENUMERATED {ps, cs}, - ... -} - -PagingUE-Identity ::= CHOICE { - s-TMSI S-TMSI, - imsi IMSI, - ... -} - -IMSI ::= SEQUENCE (SIZE (6..21)) OF IMSI-Digit - -IMSI-Digit::= INTEGER (0..9) - --- ASN1STOP - -Paging field descriptions cn-Domain -Indicates the origin of paging. ue-Identity -Provides the NAS identity of the UE that is being paged. systemInfoModification -If present: indication of a BCCH modification other than SIB10 and SIB11. etws-Indication -If present: indication of an ETWS primary notification and/ or ETWS secondary notification. imsi -The International Mobile Subscriber Identity, a globally unique permanent subscriber identity, see TS 23.003 [27]. The first element contains the first IMSI digit, the second element contains the second IMSI digit and so on. -– RRCConnectionReconfiguration -The RRCConnectionReconfiguration message is the command to modify an RRC connection. It may convey information for measurement configuration, mobility control, radio resource configuration (including RBs, MAC main configuration and physical channel configuration) including any associated dedicated NAS information and security configuration. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -RRCConnectionReconfiguration message --- ASN1START - -RRCConnectionReconfiguration ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReconfiguration-r8 RRCConnectionReconfiguration-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfiguration-r8-IEs ::= SEQUENCE { - measConfig MeasConfig OPTIONAL, -- Need ON - mobilityControlInfo MobilityControlInfo OPTIONAL, -- Cond HO - dedicatedInfoNASList SEQUENCE (SIZE(1..maxDRB)) OF - DedicatedInfoNAS OPTIONAL, -- Cond nonHO - radioResourceConfigDedicated RadioResourceConfigDedicated OPTIONAL, -- Cond HO-toEUTRA - securityConfigHO SecurityConfigHO OPTIONAL, -- Cond HO - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -SecurityConfigHO ::= SEQUENCE { - handoverType CHOICE { - intraLTE SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig OPTIONAL, -- Need OP - keyChangeIndicator BOOLEAN, - nextHopChainingCount NextHopChainingCount - }, - interRAT SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig, - nas-SecurityParamToEUTRA OCTET STRING (SIZE(6)) - } - }, - ... -} - --- ASN1STOP - -RRCConnectionReconfiguration field descriptions dedicatedInfoNASList -This field is used to transfer UE specific NAS layer information between the network and the UE. The RRC layer is transparent for each PDU in the list. nas-securityParamToEUTRA -This field is used to transfer UE specific NAS layer information between the network and the UE. The RRC layer is transparent for this field, although it affects activation of AS- security after inter-RAT handover to E-UTRA. The content is defined in TS 24.301. keyChangeIndicator -‘true’ is used only in an intra-cell handover when a KeNB key is derived from a native KASME key taken into use through the successful NAS SMC, as described in TS 33.401 [32] for KeNB re-keying. ’false’ is used in an intra-LTE handover when the new KeNB key is obtained from the current KeNB key or from the NH as described in TS 33.401 [32]. nextHopChainingCount -Parameter NCC: See TS 33.401 [32] -Conditional presence Explanation HO The field is mandatory present in case of handover within E-UTRA or to E-UTRA; otherwise the field is not present. nonHO The field is not present in case of handover within E-UTRA or to E-UTRA; otherwise it is optional present, need ON. HO-toEUTRA The field is mandatory present in case of handover to E-UTRA; otherwise the field is optionally present, need ON. -– RRCConnectionReconfigurationComplete -The RRCConnectionReconfigurationComplete message is used to confirm the successful completion of an RRC connection reconfiguration. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -RRCConnectionReconfigurationComplete message --- ASN1START - -RRCConnectionReconfigurationComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReconfigurationComplete-r8 - RRCConnectionReconfigurationComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfigurationComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– RRCConnectionReestablishment -The RRCConnectionReestablishment message is used to resolve contention and to re-establish SRB1. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: EUTRAN to UE -RRCConnectionReestablishment message --- ASN1START - -RRCConnectionReestablishment ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReestablishment-r8 RRCConnectionReestablishment-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishment-r8-IEs ::= SEQUENCE { - radioResourceConfigDedicated RadioResourceConfigDedicated, - nextHopChainingCount NextHopChainingCount, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -– RRCConnectionReestablishmentComplete -The RRCConnectionReestablishmentComplete message is used to confirm the successful completion of an RRC connection reestablishment. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -RRCConnectionReestablishmentComplete message --- ASN1START - -RRCConnectionReestablishmentComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReestablishmentComplete-r8 - RRCConnectionReestablishmentComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– RRCConnectionReestablishmentReject -The RRCConnectionReestablishmentReject message is used to indicate the rejection of an RRC connection reestablishment request. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: EUTRAN to UE -RRCConnectionReestablishmentReject message --- ASN1START - -RRCConnectionReestablishmentReject ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionReestablishmentReject-r8 - RRCConnectionReestablishmentReject-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentReject-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -– RRCConnectionReestablishmentRequest -The RRCConnectionReestablishmentRequest message is used to request the reestablishment of an RRC connection. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: UE to EUTRAN -RRCConnectionReestablishmentRequest message --- ASN1START - -RRCConnectionReestablishmentRequest ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionReestablishmentRequest-r8 - RRCConnectionReestablishmentRequest-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentRequest-r8-IEs ::= SEQUENCE { - ue-Identity ReestabUE-Identity, - reestablishmentCause ReestablishmentCause, - spare BIT STRING (SIZE (2)) -} - -ReestabUE-Identity ::= SEQUENCE { - c-RNTI C-RNTI, - physCellId PhysCellId, - shortMAC-I ShortMAC-I -} - -ReestablishmentCause ::= ENUMERATED { - reconfigurationFailure, handoverFailure, - otherFailure, spare1} - --- ASN1STOP - -RRCConnectionReestablishmentRequest field descriptions ue-Identity -UE identity included to retrieve UE context and to facilitate contention resolution by lower layers. reestablishmentCause -Indicates the failure cause that triggered the re-establishment procedure. physCellId -The Physical Cell Identity of the cell the UE was connected to prior to the failure. -– RRCConnectionReject -The RRCConnectionReject message is used to reject the RRC connection establishment. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: EUTRAN to UE -RRCConnectionReject message --- ASN1START - -RRCConnectionReject ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionReject-r8 RRCConnectionReject-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReject-r8-IEs ::= SEQUENCE { - waitTime INTEGER (1..16), - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -RRCConnectionReject field descriptions waitTime -Wait time value in seconds. -– RRCConnectionRelease -The RRCConnectionRelease message is used to command the release of an RRC connection. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -RRCConnectionRelease message --- ASN1START - -RRCConnectionRelease ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionRelease-r8 RRCConnectionRelease-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionRelease-r8-IEs ::= SEQUENCE { - releaseCause ReleaseCause, - redirectedCarrierInfo RedirectedCarrierInfo OPTIONAL, -- Need ON - idleModeMobilityControlInfo IdleModeMobilityControlInfo OPTIONAL, -- Need OP - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -ReleaseCause ::= ENUMERATED {loadBalancingTAUrequired, - other,spare2, spare1 } - -RedirectedCarrierInfo ::= CHOICE { - eutra ARFCN-ValueEUTRA, - geran CarrierFreqsGERAN, - utra-FDD ARFCN-ValueUTRA, - utra-TDD ARFCN-ValueUTRA, - cdma2000-HRPD CarrierFreqCDMA2000, - cdma2000-1xRTT CarrierFreqCDMA2000, - ... -} - -IdleModeMobilityControlInfo ::= SEQUENCE { - freqPriorityListEUTRA FreqPriorityListEUTRA OPTIONAL, -- Need ON - freqPriorityListGERAN FreqsPriorityListGERAN OPTIONAL, -- Need ON - freqPriorityListUTRA-FDD FreqPriorityListUTRA-FDD OPTIONAL, -- Need ON - freqPriorityListUTRA-TDD FreqPriorityListUTRA-TDD OPTIONAL, -- Need ON - bandClassPriorityListHRPD BandClassPriorityListHRPD OPTIONAL, -- Need ON - bandClassPriorityList1XRTT BandClassPriorityList1XRTT OPTIONAL, -- Need ON - t320 ENUMERATED { - min5, min10, min20, min30, min60, min120, min180, - spare1} OPTIONAL, -- Need OR - ... -} - -FreqPriorityListEUTRA ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA - -FreqPriorityEUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueEUTRA, - cellReselectionPriority CellReselectionPriority -} - -FreqsPriorityListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF FreqsPriorityGERAN - -FreqsPriorityGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - cellReselectionPriority CellReselectionPriority -} - -FreqPriorityListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF FreqPriorityUTRA-FDD - -FreqPriorityUTRA-FDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority -} - -FreqPriorityListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF FreqPriorityUTRA-TDD - -FreqPriorityUTRA-TDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority -} - -BandClassPriorityListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriorityHRPD - -BandClassPriorityHRPD ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority -} - -BandClassPriorityList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriority1XRTT - -BandClassPriority1XRTT ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority -} --- ASN1STOP - -RRCConnectionRelease field descriptions releaseCause -The releaseCause is used to indicate the reason for releasing the RRC Connection. redirectedCarrierInfo -The redirectedCarrierInfo indicates a carrier frequency (downlink for FDD) and is used to redirect the UE to another EUTRA or an inter-RAT carrier frequency, by means of the cell selection upon leaving RRC_CONNECTED as specified in TS 36.304 [4]. idleModeMobilityControlInfo -Provides dedicated cell reselection priorities. Used for cell reselection as specified in TS 36.304 [4]. freqPriorityListX -Provides a cell reselection priority for each frequency, by means of separate lists for each RAT (including E-UTRA). carrierFreq or bandClass -The carrier frequency (UTRA and E-UTRA) and band class (HRPD and 1xRTT) for which the associated cellReselectionPriority is applied. t320 -Timer T320 as described in section 7.3. Value minN corresponds to N minutes. carrierFreqs -The list of GERAN carrier frequencies organised into one group of GERAN carrier frequencies. -– RRCConnectionRequest -The RRCConnectionRequest message is used to request the establishment of an RRC connection. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: UE to EUTRAN -RRCConnectionRequest message --- ASN1START - -RRCConnectionRequest ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionRequest-r8 RRCConnectionRequest-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionRequest-r8-IEs ::= SEQUENCE { - ue-Identity InitialUE-Identity, - establishmentCause EstablishmentCause, - spare BIT STRING (SIZE (1)) -} - -InitialUE-Identity ::= CHOICE { - s-TMSI S-TMSI, - randomValue BIT STRING (SIZE (40)) -} - -EstablishmentCause ::= ENUMERATED { - emergency, highPriorityAccess, mt-Access, mo-Signalling, - mo-Data, spare3, spare2, spare1} - --- ASN1STOP - -RRCConnectionRequest field descriptions ue-Identity -UE identity included to facilitate contention resolution by lower layers. establishmentCause -Provides the establishment cause for the RRC connection request as provided by the upper layers. W.r.t. the cause value names: highPriorityAccess concerns AC11..AC15, ‘mt’ stands for ‘Mobile Terminating’ and ‘mo’ for ‘Mobile Originating. randomValue -Integer value in the range 0 to 240 ? 1. -– RRCConnectionSetup -The RRCConnectionSetup message is used to establish SRB1. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: EUTRAN to UE -RRCConnectionSetup message --- ASN1START - -RRCConnectionSetup ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionSetup-r8 RRCConnectionSetup-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionSetup-r8-IEs ::= SEQUENCE { - radioResourceConfigDedicated RadioResourceConfigDedicated, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -– RRCConnectionSetupComplete -The RRCConnectionSetupComplete message is used to confirm the successful completion of an RRC connection establishment. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -RRCConnectionSetupComplete message --- ASN1START - -RRCConnectionSetupComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionSetupComplete-r8 RRCConnectionSetupComplete-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionSetupComplete-r8-IEs ::= SEQUENCE { - selectedPLMN-Identity INTEGER (1..6), - registeredMME RegisteredMME OPTIONAL, - dedicatedInfoNAS DedicatedInfoNAS, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -RegisteredMME ::= SEQUENCE { - plmn-Identity PLMN-Identity OPTIONAL, - mmegi BIT STRING (SIZE (16)), - mmec MMEC -} - --- ASN1STOP - -RRCConnectionSetupComplete field descriptions selectedPLMN-Identity -Index of the PLMN selected by the UE from the plmn-IdentityList included in SIB1. 1 if the 1st PLMN is selected from the plmn-IdentityList included in SIB1, 2 if the 2nd PLMN is selected from the plmn-IdentityList included in SIB1 and so on. registeredMME -This field is used to transfer the GUMMEI of the MME where the UE is registered, as provided by upper layers. mmegi -Provides the Group Identity of the registered MME within the PLMN, as provided by upper layers, see TS 23.003 [27]. -– SecurityModeCommand -The SecurityModeCommand message is used to command the activation of AS security. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -SecurityModeCommand message --- ASN1START - -SecurityModeCommand ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - securityModeCommand-r8 SecurityModeCommand-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeCommand-r8-IEs ::= SEQUENCE { - securityConfigSMC SecurityConfigSMC, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -SecurityConfigSMC ::= SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig, - ... -} - --- ASN1STOP - -– SecurityModeComplete -The SecurityModeComplete message is used to confirm the successful completion of a security mode command. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -SecurityModeComplete message --- ASN1START - -SecurityModeComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - securityModeComplete-r8 SecurityModeComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– SecurityModeFailure -The SecurityModeFailure message is used to indicate an unsuccessful completion of a security mode command. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -SecurityModeFailure message --- ASN1START - -SecurityModeFailure ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - securityModeFailure-r8 SecurityModeFailure-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeFailure-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– SystemInformation -The SystemInformation message is used to convey one or more System Information Blocks. All the SIBs included are transmitted with the same periodicity. -Signalling radio bearer: N/A -RLC-SAP: TM -Logical channel: BCCH -Direction: EUTRAN to UE -SystemInformation message --- ASN1START - -SystemInformation ::= SEQUENCE { - criticalExtensions CHOICE { - systemInformation-r8 SystemInformation-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} -SystemInformation-r8-IEs ::= SEQUENCE { - sib-TypeAndInfo SEQUENCE (SIZE (1..maxSIB)) OF CHOICE { - sib2 SystemInformationBlockType2, - sib3 SystemInformationBlockType3, - sib4 SystemInformationBlockType4, - sib5 SystemInformationBlockType5, - sib6 SystemInformationBlockType6, - sib7 SystemInformationBlockType7, - sib8 SystemInformationBlockType8, - sib9 SystemInformationBlockType9, - sib10 SystemInformationBlockType10, - sib11 SystemInformationBlockType11, - ... - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -– SystemInformationBlockType1 -SystemInformationBlockType1 contains information relevant when evaluating if a UE is allowed to access a cell and defines the scheduling of other system information. -Signalling radio bearer: N/A -RLC-SAP: TM -Logical channel: BCCH -Direction: EUTRAN to UE -SystemInformationBlockType1 message --- ASN1START - -SystemInformationBlockType1 ::= SEQUENCE { - cellAccessRelatedInfo SEQUENCE { - plmn-IdentityList PLMN-IdentityList, - trackingAreaCode TrackingAreaCode, - cellIdentity CellIdentity, - cellBarred ENUMERATED {barred, notBarred}, - intraFreqReselection ENUMERATED {allowed, notAllowed}, - csg-Indication BOOLEAN, - csg-Identity BIT STRING (SIZE (27)) OPTIONAL -- Need OR - }, - cellSelectionInfo SEQUENCE { - q-RxLevMin Q-RxLevMin, - q-RxLevMinOffset INTEGER (1..8) OPTIONAL -- Need OP - }, - p-Max P-Max OPTIONAL, -- Need OP - freqBandIndicator INTEGER (1..64), - schedulingInfoList SchedulingInfoList, - tdd-Config TDD-Config OPTIONAL, -- Cond TDD - si-WindowLength ENUMERATED { - ms1, ms2, ms5, ms10, ms15, ms20, - ms40}, - systemInfoValueTag INTEGER (0..31), - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -PLMN-IdentityList ::= SEQUENCE (SIZE (1..6)) OF PLMN-IdentityInfo - -PLMN-IdentityInfo ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellReservedForOperatorUse ENUMERATED {reserved, notReserved} -} - -SchedulingInfoList ::= SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo - -SchedulingInfo ::= SEQUENCE { - si-Periodicity ENUMERATED { - rf8, rf16, rf32, rf64, rf128, rf256, rf512}, - sib-MappingInfo SIB-MappingInfo -} - -SIB-MappingInfo ::= SEQUENCE (SIZE (0..maxSIB-1)) OF SIB-Type - -SIB-Type ::= ENUMERATED { - sibType3, sibType4, sibType5, sibType6, - sibType7, sibType8, sibType9, sibType10, - sibType11, spare7, spare6, spare5, - spare4, spare3, spare2, spare1, ...} - --- ASN1STOP - -SystemInformationBlockType1 field descriptions plmn-IdentityList -List of PLMN identities. The first listed PLMN-Identity is the primary PLMN. cellReservedForOperatorUse -As defined in TS 36.304 [4]. trackingAreaCode -A trackingAreaCode that is common for all the PLMNs listed. cellBarred -‘barred’ means the cell is barred, as defined in TS 36.304 [4]. intraFreqReselection -Used to control cell reselection to intra-frequency cells when the highest ranked cell is barred, or treated as barred by the UE, as specified in TS 36.304 [4]. csg-Indication -If set to TRUE the UE is only allowed to access the cell if the CSG identity matches an entry in the allowed CSG list that the UE has stored. q-RxLevMinOffset -Parameter Qrxlevminoffset in 36.304 [4]. Actual value Qrxlevminoffset = IE value * 2 [dB]. If absent, apply the (default) value of 0 [dB] for Qrxlevminoffset. Affects the minimum required Rx level in the cell. p-Max -Value applicable for the cell. freqBandIndicator -Defined in TS 36.101 [42, table 5.5-1]. si-Periodicity -Periodicity of the SI-message in radio frames, such that rf8 denotes 8 radio frames, rf16 denotes 16 radio frames, and so on. sib-MappingInfo -List of the SIBs mapped to this SystemInformation message.There is no mapping information of SIB2; it is always present in the first SystemInformation message listed in the schedulingInfoList list. si-WindowLength -Common SI scheduling window for all SIs. Unit in milliseconds, where ms1 denotes 1 millisecond, ms2 denotes 2 milliseconds and so on. systemInfoValueTag -Common for all SIBs other than MIB, SIB1, SIB10 and SIB11. csg-Identity -Identity of the Closed Subscriber Group within the primary PLMN the cell belongs to. The IE is present in a CSG cell. -Conditional presence Explanation TDD This field is mandatory present for TDD; it is not present for FDD and the UE shall delete any existing value for this field. -– UECapabilityEnquiry -The UECapabilityEnquiry message is used to request the transfer of UE radio access capabilities for EUTRA as well as for other RATs. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -UECapabilityEnquiry message --- ASN1START - -UECapabilityEnquiry ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - ueCapabilityEnquiry-r8 UECapabilityEnquiry-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UECapabilityEnquiry-r8-IEs ::= SEQUENCE { - ue-CapabilityRequest UE-CapabilityRequest, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -UE-CapabilityRequest ::= SEQUENCE (SIZE (1..maxRAT-Capabilities)) OF RAT-Type - --- ASN1STOP - -UECapabilityEnquiry field descriptions ue-CapabilityRequest -List of the RATs for which the UE is requested to transfer the UE radio access capabilities i.e. E-UTRA, UTRA, GERAN-CS, GERAN-PS, CDMA2000. -– UECapabilityInformation -The UECapabilityInformation message is used to transfer of UE radio access capabilities requested by the EUTRAN. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -UECapabilityInformation message --- ASN1START - -UECapabilityInformation ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - ueCapabilityInformation-r8 UECapabilityInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UECapabilityInformation-r8-IEs ::= SEQUENCE { - ue-CapabilityRAT-ContainerList UE-CapabilityRAT-ContainerList, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– ULHandoverPreparationTransfer (CDMA2000) -The ULHandoverPreparationTransfer message is used for the uplink transfer of handover related CDMA2000 information when requested by the higher layers. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -ULHandoverPreparationTransfer message --- ASN1START - -ULHandoverPreparationTransfer ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - ulHandoverPreparationTransfer-r8 ULHandoverPreparationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -ULHandoverPreparationTransfer-r8-IEs ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - meid BIT STRING (SIZE (56)) OPTIONAL, - dedicatedInfo DedicatedInfoCDMA2000, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -ULHandoverPreparationTransfer field descriptions meid -The 56 bit mobile identification number provided by the CDMA2000 Upper layers. -– ULInformationTransfer -The ULInformationTransfer message is used for the uplink transfer of dedicated NAS information. -Signalling radio bearer: SRB2 or SRB1(only if SRB2 not established yet). If SRB2 is suspended, the UE does not send this message until SRB2 is resumed -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -ULInformationTransfer message --- ASN1START - -ULInformationTransfer ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - ulInformationTransfer-r8 ULInformationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -ULInformationTransfer-r8-IEs ::= SEQUENCE { - dedicatedInfoType CHOICE { - dedicatedInfoNAS DedicatedInfoNAS, - dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, - dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -6.3 RRC information elements -6.3.1 System information blocks -– SystemInformationBlockType2 -The IE SystemInformationBlockType2 contains radio resource configuration information that is common for all UEs. -NOTE: UE timers and constants related to functionality for which parameters are provided in another SIB are included in the corresponding SIB. -SystemInformationBlockType2 information element --- ASN1START - -SystemInformationBlockType2 ::= SEQUENCE { - ac-BarringInfo SEQUENCE { - ac-BarringForEmergency BOOLEAN, - ac-BarringForMO-Signalling AC-BarringConfig OPTIONAL, -- Need OP - ac-BarringForMO-Data AC-BarringConfig OPTIONAL -- Need OP - } OPTIONAL, -- Need OP - radioResourceConfigCommon RadioResourceConfigCommonSIB, - ue-TimersAndConstants UE-TimersAndConstants, - freqInfo SEQUENCE { - ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL, -- Need OP - ul-Bandwidth ENUMERATED {n6, n15, n25, n50, n75, n100} - OPTIONAL, -- Need OP - additionalSpectrumEmission AdditionalSpectrumEmission - }, - mbsfn-SubframeConfigList MBSFN-SubframeConfigList OPTIONAL, -- Need OR - timeAlignmentTimerCommon TimeAlignmentTimer, - ... -} - -AC-BarringConfig ::= SEQUENCE { - ac-BarringFactor ENUMERATED { - p00, p05, p10, p15, p20, p25, p30, p40, - p50, p60, p70, p75, p80, p85, p90, p95}, - ac-BarringTime ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512}, - ac-BarringForSpecialAC BIT STRING (SIZE(5)) -} - -MBSFN-SubframeConfigList ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF MBSFN-SubframeConfig - -MBSFN-SubframeConfig ::= SEQUENCE { - radioframeAllocationPeriod ENUMERATED {n1, n2, n4, n8, n16, n32}, - radioframeAllocationOffset INTEGER (0..7), - subframeAllocation CHOICE { - oneFrame BIT STRING (SIZE(6)), - fourFrames BIT STRING (SIZE(24)) - } -} --- ASN1STOP - -SystemInformationBlockType2 field descriptions ac-BarringForEmergency -Access class barring for AC 10. ac-BarringForMO-Signalling -Access class barring for mobile originating signalling. ac-BarringForMO-Data -Access class barring for mobile originating calls. ac-BarringFactor -If the random number drawn by the UE is lower than this value, access is allowed. Otherwise the access is barred. The values are interpreted in the range [0,1): p00 = 0, p05 = 0.05, p10 = 0.10,…,p95 = 0.95. ac-BarringTime -Mean access barring time value in seconds. ac-BarringForSpecialAC -Access class barring for AC 11-15. The first/ leftmost bit is for AC 11, the second bit is for AC 12, and so on. ul-CarrierFreq -For FDD: If absent, the (default) value determined from the default TX-RX frequency separation defined in TS 36.101 [42, table 5.7.3-1] applies. -For TDD: This parameter is absent and it is equal to the downlink frequency. ul-Bandwidth -Parameter: transmission bandwidth configuration, NRB, in uplink, see TS 36.101 [42, table 5.6-1]. Value n6 corresponds to 6 resource blocks, n15 to 15 resource blocks and so on. If for FDD this parameter is absent, the uplink bandwidth is equal to the downlink bandwidth. For TDD this parameter is absent and it is equal to the downlink bandwidth. mbsfn-SubframeConfigList -Defines the subframes that are reserved for MBSFN in downlink. radioFrameAllocationPeriod, radioFrameAllocationOffset -Radio-frames that contain MBSFN subframes occur when equation SFN mod radioFrameAllocationPeriod = radioFrameAllocationOffset is satisfied. Value n1 for radioframeAllocationPeriod denotes value 1, n2 denotes value 2, and so on. When fourFrames is used for subframeAllocation, the equation defines the first radio frame referred to in the description below. Values n1 and n2 are not applicable when fourFrames is used. subframeAllocation -Defines the subframes that are allocated for MBSFN within the radio frame allocation period defined by the radioFrameAllocationPeriod and the radioFrameAllocationOffset. oneFrame -“1” denotes that the corresponding subframe is allocated for MBSFN. The following mapping applies: -FDD: The first/leftmost bit defines the MBSFN allocation for subframe #1, the second bit for #2, third bit for #3 , fourth bit for #6, fifth bit for #7, sixth bit for #8. -TDD: The first/leftmost bit defines the allocation for subframe #3, the second bit for #4, third bit for #7, fourth bit for #8, fifth bit for #9. Uplink subframes are not allocated. The last bit is not used. fourFrames -A bit-map indicating MBSFN subframe allocation in four consecutive radio frames, “1” denotes that the corresponding subframe is allocated for MBSFN. The bitmap is interpreted as follows: -FDD: Starting from the first radioframe and from the first/leftmost bit in the bitmap, the allocation applies to subframes #1, #2, #3 , #6, #7, and #8 in the sequence of the four radio-frames. -TDD: Starting from the first radioframe and from the first/leftmost bit in the bitmap, the allocation applies to subframes #3, #4, #7, #8, and #9 in the sequence of the four radio-frames. The last four bits are not used. Uplink subframes are not allocated. -– SystemInformationBlockType3 -The IE SystemInformationBlockType3 contains cell re-selection information common for intra-frequency, inter-frequency and/ or inter-RAT cell re-selection (i.e. applicable for more than one type of cell re-selection but not necessarily all) as well as intra-frequency cell re-selection information other than neighbouring cell related. -SystemInformationBlockType3 information element --- ASN1START - -SystemInformationBlockType3 ::= SEQUENCE { - cellReselectionInfoCommon SEQUENCE { - q-Hyst ENUMERATED { - dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, - dB12, dB14, dB16, dB18, dB20, dB22, dB24}, - speedStateReselectionPars SEQUENCE { - mobilityStateParameters MobilityStateParameters, - q-HystSF SEQUENCE { - sf-Medium ENUMERATED { - dB-6, dB-4, dB-2, dB0}, - sf-High ENUMERATED { - dB-6, dB-4, dB-2, dB0} - } - } OPTIONAL -- Need OP - }, - cellReselectionServingFreqInfo SEQUENCE { - s-NonIntraSearch ReselectionThreshold OPTIONAL, -- Need OP - threshServingLow ReselectionThreshold, - cellReselectionPriority CellReselectionPriority - }, - intraFreqCellReselectionInfo SEQUENCE { - q-RxLevMin Q-RxLevMin, - p-Max P-Max OPTIONAL, -- Need OP - s-IntraSearch ReselectionThreshold OPTIONAL, -- Need OP - allowedMeasBandwidth AllowedMeasBandwidth OPTIONAL, -- Need OP - presenceAntennaPort1 PresenceAntennaPort1, - neighCellConfig NeighCellConfig, - t-ReselectionEUTRA T-Reselection, - t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL -- Need OP - }, - ... -} - --- ASN1STOP - -SystemInformationBlockType3 field descriptions cellReselectionInfoCommon -Cell re-selection information common for cells. q-Hyst -Parameter Qhyst in 36.304 [4], Value in dB. Value dB1 corresponds to 1 dB, dB2 corresponds to 2 dB and so on. speedStateReselectionPars -Speed dependent reselection parameters, see TS 36.304 [4]. If this field is absent, i.e, mobilityStateParameters is also not present, UE behaviour is specified in TS 36.304 [4]. q-HystSF -Parameter “Speed dependent ScalingFactor for Qhyst” in TS 36.304 [4]. The sf-Medium and sf-High concern the additional hysteresis to be applied, in Medium and High Mobility state respectively, to Qhyst as defined in TS 36.304 [4]. In dB. Value dB-6 corresponds to -6dB, dB-4 corresponds to -4dB and so on. t-ReselectionEUTRA -Parameter “TreselectionEUTRAN” in TS 36.304 [4]. t-ReselectionEUTRA-SF -Parameter “Speed dependent ScalingFactor for TreselectionEUTRAN” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. s-IntraSearch -Parameter Sintrasearch, see TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. cellReselectionServingFreqInfo -Information common for Cell re-selection to inter-frequency and inter-RAT cells. s-NonIntraSearch -Parameter Snonintrasearch, see TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. threshServingLow -Parameter Threshserving, low, see TS 36.304 [4]. intraFreqcellReselectionInfo -Cell re-selection information common for intra-frequency cells. p-Max -Value applicable for the intra-frequency neighbouring E-UTRA cells. allowedMeasBandwidth -If absent, the value corresponding to the downlink bandwidth indicated by the dl-Bandwidth included in MasterInformationBlock applies. -– SystemInformationBlockType4 -The IE SystemInformationBlockType4 contains neighbouring cell related information relevant only for intra-frequency cell re-selection. The IE includes cells with specific re-selection parameters as well as blacklisted cells. -SystemInformationBlockType4 information element --- ASN1START - -SystemInformationBlockType4 ::= SEQUENCE { - intraFreqNeighCellList IntraFreqNeighCellList OPTIONAL, -- Need OR - intraFreqBlackCellList IntraFreqBlackCellList OPTIONAL, -- Need OR - csg-PhysCellIdRange PhysCellIdRange OPTIONAL, -- Cond CSG - ... -} - -IntraFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo - -IntraFreqNeighCellInfo ::= SEQUENCE { - physCellId PhysCellId, - q-OffsetCell Q-OffsetRange, - ... -} - -IntraFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange - --- ASN1STOP - -SystemInformationBlockType4 field descriptions intraFreqNeighbCellList -List of intra-frequency neighbouring cells with specific cell re-selection parameters. q-OffsetCell -Parameter “Qoffsets,n” in TS 36.304 [4]. intraFreqBlackCellList -List of blacklisted intra-frequency neighbouring cells. csg-PhysCellIdRange -Set of physical cell identities reserved for CSG cells on the frequency on which this field was received. The received csg-PhysCellIdRange applies if less than 24 hours has elapsed since it was received and it was received in the same primary PLMN. The 3 hour validity restriction (section 5.2.1.3) does not apply to this field. -Conditional presence Explanation CSG This field is optional, need OP, for non-CSG cells, and mandatory for CSG cells. -– SystemInformationBlockType5 -The IE SystemInformationBlockType5 contains information relevant only for inter-frequency cell re-selection i.e. information about other EUTRA frequencies and inter-frequency neighbouring cells relevant for cell re-selection. The IE includes cell re-selection parameters common for a frequency as well as cell specific re-selection parameters. -SystemInformationBlockType5 information element --- ASN1START - -SystemInformationBlockType5 ::= SEQUENCE { - interFreqCarrierFreqList InterFreqCarrierFreqList, - ... -} - -InterFreqCarrierFreqList ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo - -InterFreqCarrierFreqInfo ::= SEQUENCE { - dl-CarrierFreq ARFCN-ValueEUTRA, - q-RxLevMin Q-RxLevMin, - p-Max P-Max OPTIONAL, -- Need OP - t-ReselectionEUTRA T-Reselection, - t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - allowedMeasBandwidth AllowedMeasBandwidth, - presenceAntennaPort1 PresenceAntennaPort1, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - neighCellConfig NeighCellConfig, - q-OffsetFreq Q-OffsetRange DEFAULT dB0, - interFreqNeighCellList InterFreqNeighCellList OPTIONAL, -- Need OR - interFreqBlackCellList InterFreqBlackCellList OPTIONAL, -- Need OR - ... -} - -InterFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo - -InterFreqNeighCellInfo ::= SEQUENCE { - physCellId PhysCellId, - q-OffsetCell Q-OffsetRange -} - -InterFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange - --- ASN1STOP - -SystemInformationBlockType5 field descriptions p-Max -Value applicable for the neighbouring E-UTRA cells on this carrier frequency. threshX-High -Parameter "Threshx,high", see TS 36.304 [4]. threshX-Low -Parameter "Threshx,low", see TS 36.304 [4]. t-ReselectionEUTRA -Parameter “TreselectionEUTRAN” in TS 36.304 [4]. t-ReselectionEUTRA-SF -Parameter “Speed dependent ScalingFactor for TreselectionEUTRAN” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. q-OffsetFreq -Parameter “Qoffsetfrequency” in TS 36.304 [4]. interFreqNeighCellList -List of inter-frequency neighbouring cells with specific cell re-selection parameters. q-OffsetCell -Parameter “Qoffsets,n” in TS 36.304 [4]. interFreqBlackCellList -List of blacklisted inter-frequency neighbouring cells. -– SystemInformationBlockType6 -The IE SystemInformationBlockType6 contains information relevant only for inter-RAT cell re-selection i.e. information about UTRA frequencies and UTRA neighbouring cells relevant for cell re-selection. The IE includes cell re-selection parameters common for a frequency. -SystemInformationBlockType6 information element --- ASN1START - -SystemInformationBlockType6 ::= SEQUENCE { - carrierFreqListUTRA-FDD CarrierFreqListUTRA-FDD OPTIONAL, -- Need OR - carrierFreqListUTRA-TDD CarrierFreqListUTRA-TDD OPTIONAL, -- Need OR - t-ReselectionUTRA T-Reselection, - t-ReselectionUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP - ... -} - -CarrierFreqListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF CarrierFreqUTRA-FDD - -CarrierFreqUTRA-FDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - q-RxLevMin INTEGER (-60..-13), - p-MaxUTRA INTEGER (-50..33), - q-QualMin INTEGER (-24..0), - ... -} - -CarrierFreqListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF CarrierFreqUTRA-TDD - -CarrierFreqUTRA-TDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - q-RxLevMin INTEGER (-60..-13), - p-MaxUTRA INTEGER (-50..33), - ... -} - --- ASN1STOP - -SystemInformationBlockType6 field descriptions t-ReselectionUTRA -Parameter “TreselectionUTRAN” in TS 36.304 [4]. t-ReselectionUTRA-SF -Parameter “Speed dependent ScalingFactor for TreselectionUTRA” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. carrierFreqListUTRA-FDD -List of carrier frequencies of UTRA FDD. carrierFreqListUTRA-TDD -List of carrier frequencies of UTRA TDD. threshX-High -Parameter "Threshx,high" in TS 36.304 [4]. threshX-Low - Parameter "Threshx,low" in TS 36.304 [4]. q-RxLevMin -Parameter Qrxlevmin, see TS 25.304 [40]. Actual value = IE value * 2+1. Specifies the minimum required Rx level in the cell expressedin dBm. p-MaxUTRA -The maximum allowed transmission power on the (uplink) carrier frequency, see TS 25.304 [40]. In dBm q-QualMin -Parameter “Qqualmin” in TS 25.304 [40]. In dB. -– SystemInformationBlockType7 -The IE SystemInformationBlockType7 contains information relevant only for inter-RAT cell re-selection i.e. information about GERAN frequencies relevant for cell re-selection. The IE includes cell re-selection parameters for each frequency. -SystemInformationBlockType7 information element --- ASN1START - -SystemInformationBlockType7 ::= SEQUENCE { - t-ReselectionGERAN T-Reselection, - t-ReselectionGERAN-SF SpeedStateScaleFactors OPTIONAL, -- Need OR - carrierFreqsInfoList CarrierFreqsInfoListGERAN OPTIONAL, -- Need OR - ... -} - -CarrierFreqsInfoListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF CarrierFreqsInfoGERAN - -CarrierFreqsInfoGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - commonInfo SEQUENCE { - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - ncc-Permitted BIT STRING (SIZE (8)), - q-RxLevMin INTEGER (0..45), - p-MaxGERAN INTEGER (0..39) OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold - }, - ... -} - --- ASN1STOP - -SystemInformationBlockType7 field descriptions carrierFreqsInfoList -Provides a list of neighbouring GERAN carrier frequencies, which may be monitored for neighbouring GERAN cells. The GERAN carrier frequencies are organised in groups and the cell reselection parameters are provided per group of GERAN carrier frequencies. carrierFreqs -The list of GERAN carrier frequencies organised into one group of GERAN carrier frequencies. commonInfo -Defines the set of cell reselection parameters for the group of GERAN carrier frequencies. t-ReselectionGERAN -Parameter “TreselectionGERAN” in TS 36.304 [4]. t-ReselectionGERAN-SF -Parameter “Speed dependent ScalingFactor for TreselectionGERAN” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. ncc-Permitted -Field encoded as a bit map, where bit N is set to "0" if a BCCH carrier with NCC = N-1 is not permitted for monitoring and set to "1" if the BCCH carrier with NCC = N-1 is permitted for monitoring; N = 1 to 8; bit 1 of the bitmap is the leading bit of the bit string. q-RxLevMin -Parameter “Qrxlevmin” in TS 45.008 [28]. The actual value of Qrxlevmin in dBm = (IE value * 2) ? 115. p-MaxGERAN -Maximum allowed transmission power for GERAN on an uplink carrier frequency, see TS 45.008 [28]. Value in dBm. Applicable for the neighbouring GERAN cells on this carrier frequency. If pmaxGERAN is absent, the maximum power according to the UE capability is used. threshX-High -Parameter "Threshx,high" in TS 36.304 [4]. threshX-Low -Parameter "Threshx,low" in TS 36.304 [4]. -– SystemInformationBlockType8 -The IE SystemInformationBlockType8 contains information relevant only for inter-RAT cell re-selection i.e. information about CDMA2000 frequencies and CDMA2000 neighbouring cells relevant for cell re-selection. The IE includes cell re-selection parameters common for a frequency as well as cell specific re-selection parameters. -SystemInformationBlockType8 information element --- ASN1START - -SystemInformationBlockType8 ::= SEQUENCE { - systemTimeInfo SystemTimeInfoCDMA2000 OPTIONAL, -- Need OR - searchWindowSize INTEGER (0..15) OPTIONAL, -- Need OR - parametersHRPD SEQUENCE { - preRegistrationInfoHRPD PreRegistrationInfoHRPD, - cellReselectionParametersHRPD CellReselectionParametersCDMA2000 OPTIONAL -- Need OR - } OPTIONAL, -- Need OR - parameters1XRTT SEQUENCE { - csfb-RegistrationParam1XRTT CSFB-RegistrationParam1XRTT OPTIONAL, -- Need OP - longCodeState1XRTT BIT STRING (SIZE (42)) OPTIONAL, -- Need OR - cellReselectionParameters1XRTT CellReselectionParametersCDMA2000 OPTIONAL -- Need OR - } OPTIONAL, -- Need OR - ... -} - -CellReselectionParametersCDMA2000 ::= SEQUENCE { - bandClassList BandClassListCDMA2000, - neighCellList NeighCellListCDMA2000, - t-ReselectionCDMA2000 T-Reselection, - t-ReselectionCDMA2000-SF SpeedStateScaleFactors OPTIONAL -- Need OP -} -NeighCellListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellCDMA2000 - -NeighCellCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - neighCellsPerFreqList NeighCellsPerBandclassListCDMA2000 -} - -NeighCellsPerBandclassListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellsPerBandclassCDMA2000 - -NeighCellsPerBandclassCDMA2000 ::= SEQUENCE { - arfcn ARFCN-ValueCDMA2000, - physCellIdList PhysCellIdListCDMA2000 -} - -PhysCellIdListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF PhysCellIdCDMA2000 - -BandClassListCDMA2000 ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassInfoCDMA2000 - -BandClassInfoCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High INTEGER (0..63), - threshX-Low INTEGER (0..63), - ... -} - --- ASN1STOP - -SystemInformationBlockType8 field descriptions systemTimeInfo -Information on CDMA2000 system time. This field is required for a UE with rx-ConfigHRPD= `single' and/ or rx-Config1XRTT= `single' to perform handover, cell re-selection and UE measurement based redirection from E-UTRAN to CDMA2000 according to this specification and TS 36.304 [4]. This field is excluded when estimating changes in system information, i.e. changes of systemTimeInfo should neither result in system information change notifications nor in a modification of systemInfoValueTag in SIB1. searchWindowSize -The search window size is a CDMA2000 parameter to be used to assist in searching for the neighbouring pilots. For values see C.S0005-A [25, Table 2.6.6.2.1-1] and C.S0024-A [26, Table 8.7.6.2-4]. This field is required for a UE with rx-ConfigHRPD= `single' and/ or rx-Config1XRTT= `single' to perform handover, cell re-selection and UE measurement based redirection from E-UTRAN to CDMA2000 according to this specification and TS 36.304 [4]. parametersHRPD -Parameters applicable only for interworking with CDMA2000 HRPD systems. preRegistrationInfoHRPD -The CDMA2000 HRPD Pre-Registration Information tells the UE if it should pre-register with the CDMA2000 HRPD network and identifies the Pre-registration zone to the UE. cellReselectionParametersHRPD -Cell reselection parameters applicable for cell reselection to CDMA2000 HRPD system bandClassList -List of CDMA2000 frequency bands. bandClass -Identifies the Frequency Band in which the Carrier can be found. Details can be found in C.S0057-B [24, Table 1.5]. threshX-High -Parameter "Threshx,high" in TS 36.304 [4]. This specifies the high threshold used in reselection towards this CDMA2000 band class expressed as an unsigned binary number equal to FLOOR (-2 x 10 x log10 Ec/Io) in units of 0.5 dB, as defined in C.S0005-A [25]. threshX-Low -Parameter "Threshx,low" in TS 36.304 [4]. This specifies the low threshold used in reselection towards this CDMA2000 band class expressed as an unsigned binary number equal to FLOOR (-2 x 10 x log10 Ec/Io) in units of 0.5 dB, as defined in C.S0005-A [25]. t-ReselectionCDMA2000 -Parameter “TreselectionCDMA_HRPD” or “TreselectionCDMA_1xRTT” in TS 36.304 [4]. t-ReselectionCDMA2000-SF -Parameter “Speed dependent ScalingFactor for TreselectionCDMA-HRPD” or TreselectionCDMA-1xRTT” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. neighCellList -List of CDMA2000 neighbouring cells. The total number of neighbouring cells is limited to 32. parameters1XRTT -Parameters applicable for interworking with CDMA2000 1XRTT system. csfb-RegistrationParam1XRTT -Contains the parameters the UE will use to determine if it should perform a CDMA2000 1xRTT Registration/Re-Registration. This field is included if CSFB to CDMA2000 1xRTT is supported. longCodeState1XRTT -The state of long code generation registers in CDMA2000 1XRTT system as defined in C.S0002-A [12, Section 1.3] at ms, where t equals to the cdma-SystemTime. This field is required for SRVCC handover to CDMA2000 1xRTT operation. Otherwise this IE is not needed. This field is excluded when estimating changes in system information, i.e. changes of longCodeState1XRTT should neither result in system information change notifications nor in a modification of systemInfoValueTag in SIB1. cellReselectionParameters1XRTT -Cell reselection parameters applicable only to CDMA2000 1xRTT system. NeighCellListCDMA2000 -List of CDMA2000 1xRTT or of CDMA2000 HRPD neighbouring cells. neighCellsPerFreqList -List of carrier frequencies and neighbour cell ids in each frequency within a CDMA2000 Band, see C.S0002-A [12]. physCellIdList -Identifies the list of CDMA2000 cells ids, see C.S0002-A [12]. -– SystemInformationBlockType9 -The IE SystemInformationBlockType9 contains a home eNB name (HNB Name). -SystemInformationBlockType9 information element --- ASN1START - -SystemInformationBlockType9 ::= SEQUENCE { - hnb-Name OCTET STRING (SIZE(1..48)) OPTIONAL, -- Need OR - ... -} - --- ASN1STOP - -SystemInformationBlockType9 field descriptions hnb-Name -Carries the name of the home eNB, coded in UTF-8 with variable number of bytes per character, see TS 22.011 [10]. -– SystemInformationBlockType10 -The IE SystemInformationBlockType10 contains an ETWS primary notification. -SystemInformationBlockType10 information element --- ASN1START - -SystemInformationBlockType10 ::= SEQUENCE { - messageIdentifier BIT STRING (SIZE (16)), - serialNumber BIT STRING (SIZE (16)), - warningType OCTET STRING (SIZE (2)), - warningSecurityInfo OCTET STRING (SIZE (50)) OPTIONAL, -- Need OP - ... -} - --- ASN1STOP - - -SystemInformationBlockType10 field descriptions messageIdentifier -Identifies the source and type of ETWS notification. The first bit contains bit 1 of the equivalent IE defined in TS 23.041 [37, 9.4.1.2.2], TS 36.413 [39, 9.2.1.44] and encoded according to TS 23.041 [37] and so on. serialNumber -Identifies variations of an ETWS notification. The first bit contains bit 1 of the equivalent IE defined in TS 23.041 [37, 9.4.1.2.1], TS 36.413 [39, 9.2.1.45] and encoded according to TS 23.041 [37] and so on. warningType -Identifies the warning type of the ETWS primary notification and provides information on emergency user alert and UE popup. The first octet contains octet 1 of the equivalent IE defined in TS 23.041 [37, 9.3.24], TS 36.413 [39, 9.2.1.50] and encoded according to TS 23.041 [37], and so on. warningSecurityInfo -Provides security information for the ETWS notification. The first octet contains octet 1 of the equivalent IE defined in TS 23.041 [37], TS 36.413 [39] and encoded according to TS 23.041 [37] and so on. -– SystemInformationBlockType11 -The IE SystemInformationBlockType11 contains an ETWS secondary notification. -SystemInformationBlockType11 information element --- ASN1START - -SystemInformationBlockType11 ::= SEQUENCE { - messageIdentifier BIT STRING (SIZE (16)), - serialNumber BIT STRING (SIZE (16)), - warningMessageSegmentType ENUMERATED {notLastSegment, lastSegment}, - warningMessageSegmentNumber INTEGER (0..63), - warningMessageSegment OCTET STRING, - dataCodingScheme OCTET STRING (SIZE (1)) OPTIONAL, -- Cond Segment1 - ... -} - --- ASN1STOP - -SystemInformationBlockType11 field descriptions messageIdentifier -Identifies the source and type of ETWS notification. The first bit contains bit 1 of the equivalent IE defined in TS 23.041 [37, 9.4.1.2.2], TS 36.413 [39, 9.2.1.44] and encoded according to TS 23.041 [37] and so on. serialNumber -Identifies variations of an ETWS notification. The first bit contains bit 1 of the equivalent IE defined in TS 23.041 [37, 9.4.1.2.1], TS 36.413 [39, 9.2.1.45] and encoded according to TS 23.041 [37] and so on. warningMessageSegmentType -Indicates whether the included ETWS warning message segment is the last segment or not. warningMessageSegmentNumber -Segment number of the ETWS warning message segment contained in the SIB. A segment number of zero corresponds to the first segment, one corresponds to the second segment, and so on. warningMessageSegment -Carries a segment of the Warning Message Contents IE defined in TS 36.413 [39]. The first octet of the Warning Message Contents IE is equivalent to the CB data IE defined in and encoded according to TS 23.041 [37] and so on. dataCodingScheme -Identifies the alphabet/coding and the language applied variations of an ETWS notification. The octet contains the octet of the equivalent IE defined in TS 23.041 [37], TS 36.413 [39] and encoded according to TS 23.038 [38]. -Conditional presence Explanation Segment1 The field is mandatory present in the first segment of SIB11, otherwise it is not present. -6.3.2 Radio resource control information elements -– AntennaInfo -The IE AntennaInfoCommon and the AntennaInfoDedicated are used to specify the common and the UE specific antenna configuration respectively. -AntennaInfo information elements --- ASN1START - -AntennaInfoCommon ::= SEQUENCE { - antennaPortsCount ENUMERATED {an1, an2, an4, spare1} -} - -AntennaInfoDedicated ::= SEQUENCE { - transmissionMode ENUMERATED { - tm1, tm2, tm3, tm4, tm5, tm6, - tm7, spare1}, - codebookSubsetRestriction CHOICE { - n2TxAntenna-tm3 BIT STRING (SIZE (2)), - n4TxAntenna-tm3 BIT STRING (SIZE (4)), - n2TxAntenna-tm4 BIT STRING (SIZE (6)), - n4TxAntenna-tm4 BIT STRING (SIZE (64)), - n2TxAntenna-tm5 BIT STRING (SIZE (4)), - n4TxAntenna-tm5 BIT STRING (SIZE (16)), - n2TxAntenna-tm6 BIT STRING (SIZE (4)), - n4TxAntenna-tm6 BIT STRING (SIZE (16)) - } OPTIONAL, -- Cond TM - ue-TransmitAntennaSelection CHOICE{ - release NULL, - setup ENUMERATED {closedLoop, openLoop} - } -} - --- ASN1STOP - -AntennaInfo field descriptions antennaPortsCount -Parameter represents the number of cell specific antenna ports where an1 corresponds to 1, an2 to 2 antenna ports etc. see TS 36.211, 6.2.1. transmissionMode -Points to one of Transmission modes defined in TS 36.213, 7.1 where tm1 refers to transmission mode 1, tm2 to transmission mode 2 etc. codebookSubsetRestriction -Parameter: codebookSubsetRestriction, see TS 36.213 [23, 7.2] and TS 36.211 [21, 6.3.4.2.3]. ue-TransmitAntennaSelection -For value setup the field indicates whether UE transmit antenna selection control is closed-loop or open-loop as described in TS 36.213 [23, 8.7]. -Conditional presence Explanation TM The field is mandatory present if the transmissionMode is set to tm3, tm4, tm5 or tm6. Otherwise the IE is not present and the UE shall delete any existing value for this field. -– CQI-ReportConfig -The IE CQI-ReportConfig is used to specify the CQI reporting configuration. -CQI-ReportConfig information elements --- ASN1START - -CQI-ReportConfig ::= SEQUENCE { - cqi-ReportModeAperiodic ENUMERATED { - rm12, rm20, rm22, rm30, rm31, - spare3, spare2, spare1} OPTIONAL, -- Need OR - nomPDSCH-RS-EPRE-Offset INTEGER (-1..6), - cqi-ReportPeriodic CQI-ReportPeriodic OPTIONAL -- Need ON -} - -CQI-ReportPeriodic ::= CHOICE { - release NULL, - setup SEQUENCE { - cqi-PUCCH-ResourceIndex INTEGER (0.. 1185), - cqi-pmi-ConfigIndex INTEGER (0..1023), - cqi-FormatIndicatorPeriodic CHOICE { - widebandCQI NULL, - subbandCQI SEQUENCE { - k INTEGER (1..4) - } - }, - ri-ConfigIndex INTEGER (0..1023) OPTIONAL, -- Need OR - simultaneousAckNackAndCQI BOOLEAN - } -} - --- ASN1STOP - -CQI-ReportConfig field descriptions cqi-PUCCH-ResourceIndex -Parameter , see TS 36.213 [23, 7.2]. cqi-pmi-ConfigIndex -Parameter: CQI/PMI Periodicity and Offset Configuration Index ICQI/PMI, see TS 36.213 [23, tables 7.2.2-1A and 7.2.2-1C]. ri-ConfigIndex -Parameter: RI Config Index IRI, see TS 36.213 [23, 7.2.2-1B]. K -Parameter: K, see TS 36.213 [23, 7.2.2]. cqi-FormatIndicatorPeriodic -Parameter: PUCCH CQI Feedback Type, see TS 36.213 [23, table 7.2.2-1]. Depending on transmissionMode, reporting mode is implicitly given from the table. simultaneousAckNackAndCQI -Parameter: Simultaneous-AN-and-CQI. see TS 36.213 [23, 10.1] TRUE indicates that simultaneous transmission of ACK/NACK and CQI is allowed. cqi-ReportModeAperiodic -Parameter: reporting mode. Value rm12 corresponds to Mode 1-2, rm20 corresponds to Mode 2-0, rm22 corresponds to Mode 2-2 etc. PUSCH reporting modes are described in TS 36.213 [23, 7.2.1]. nomPDSCH-RS-EPRE-Offset -Parameter: see TS 36.213 [23, 7.2.3]. Actual value = IE value * 2 [dB]. -– DRB-Identity -The IE DRB-Identity is used to identify a DRB used by a UE. -DRB-Identity information elements --- ASN1START - -DRB-Identity ::= INTEGER (1..32) - --- ASN1STOP - -– LogicalChannelConfig -The IE LogicalChannelConfig is used to configure the logical channel parameters. -LogicalChannelConfig information element --- ASN1START - -LogicalChannelConfig ::= SEQUENCE { - ul-SpecificParameters SEQUENCE { - priority INTEGER (1..16), - prioritisedBitRate ENUMERATED { - kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, - kBps256, infinity, spare8, spare7, spare6, - spare5, spare4, spare3, spare2, spare1}, - bucketSizeDuration ENUMERATED { - ms50, ms100, ms150, ms300, ms500, ms1000, spare2, - spare1}, - logicalChannelGroup INTEGER (0..3) OPTIONAL -- Need OR - } OPTIONAL, -- Cond UL - ... -} - --- ASN1STOP - -LogicalChannelConfig field descriptions priority -Logical channel priority in TS 36.321 [6]. Value is an integer. prioritisedBitRate -Prioritized Bit Rate for logical channel prioritization in TS 36.321 [6]. Value in kilobytes/second. Value kBps0 corresponds to 0 kB/second, kBps8 corresponds to 8 kB/second, kBps16 corresponds to 16 kB/second and so on. Infinity is the only applicable value for SRB1 and SRB2 bucketSizeDuration -Bucket Size Duration for logical channel prioritization in TS 36.321 [6]. Value in milliseconds. Value ms50 corresponds to 50 ms, ms100 corresponds to 100 ms and so on. logicalChannelGroup -Mapping of logical channel to logical channel group for BSR reporting in TS 36.321 [6]. -Conditional presence Explanation UL The field is mandatory present for UL logical channels; otherwise it is not present. -– MAC-MainConfig -The IE MAC-MainConfig is used to specify the MAC main configuration for signalling and data radio bearers. -MAC-MainConfig information element --- ASN1START - -MAC-MainConfig ::= SEQUENCE { - ul-SCH-Config SEQUENCE { - maxHARQ-Tx ENUMERATED { - n1, n2, n3, n4, n5, n6, n7, n8, - n10, n12, n16, n20, n24, n28, - spare2, spare1} OPTIONAL, -- Need ON - periodicBSR-Timer ENUMERATED { - sf5, sf10, sf16, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, sf1280, sf2560, - infinity, spare1} OPTIONAL, -- Need ON - retxBSR-Timer ENUMERATED { - sf320, sf640, sf1280, sf2560, sf5120, - sf10240, spare2, spare1}, - ttiBundling BOOLEAN - } OPTIONAL, -- Need ON - drx-Config DRX-Config OPTIONAL, -- Need ON - timeAlignmentTimerDedicated TimeAlignmentTimer, - phr-Config CHOICE { - release NULL, - setup SEQUENCE { - periodicPHR-Timer ENUMERATED {sf10, sf20, sf50, sf100, sf200, - sf500, sf1000, infinity}, - prohibitPHR-Timer ENUMERATED {sf0, sf10, sf20, sf50, sf100, - sf200, sf500, sf1000}, - dl-PathlossChange ENUMERATED {dB1, dB3, dB6, infinity} - } - } OPTIONAL, -- Need ON - ... -} - -DRX-Config ::= CHOICE { - release NULL, - setup SEQUENCE { - onDurationTimer ENUMERATED { - psf1, psf2, psf3, psf4, psf5, psf6, - psf8, psf10, psf20, psf30, psf40, - psf50, psf60, psf80, psf100, - psf200}, - drx-InactivityTimer ENUMERATED { - psf1, psf2, psf3, psf4, psf5, psf6, - psf8, psf10, psf20, psf30, psf40, - psf50, psf60, psf80, psf100, - psf200, psf300, psf500, psf750, - psf1280, psf1920, psf2560, spare10, - spare9, spare8, spare7, spare6, - spare5, spare4, spare3, spare2, - spare1}, - drx-RetransmissionTimer ENUMERATED { - psf1, psf2, psf4, psf6, psf8, psf16, - psf24, psf33}, - longDRX-CycleStartOffset CHOICE { - sf10 INTEGER(0..9), - sf20 INTEGER(0..19), - sf32 INTEGER(0..31), - sf40 INTEGER(0..39), - sf64 INTEGER(0..63), - sf80 INTEGER(0..79), - sf128 INTEGER(0..127), - sf160 INTEGER(0..159), - sf256 INTEGER(0..255), - sf320 INTEGER(0..319), - sf512 INTEGER(0..511), - sf640 INTEGER(0..639), - sf1024 INTEGER(0..1023), - sf1280 INTEGER(0..1279), - sf2048 INTEGER(0..2047), - sf2560 INTEGER(0..2559) - }, - shortDRX SEQUENCE { - shortDRX-Cycle ENUMERATED { - sf2, sf5, sf8, sf10, sf16, sf20, - sf32, sf40, sf64, sf80, sf128, sf160, - sf256, sf320, sf512, sf640}, - drxShortCycleTimer INTEGER (1..16) - } OPTIONAL -- Need OR - } -} - --- ASN1STOP - -MAC-MainConfig field descriptions maxHARQ-Tx -Maximum number of transmissions for UL HARQ in TS 36.321 [6]. periodicBSR-Timer -Timer for BSR reporting in TS 36.321 [6]. Value in number of sub-frames. Value sf10 corresponds to 10 sub-frames, sf20 corresponds to 20 sub-frames and so on. retxBSR-Timer -Timer for BSR reporting in TS 36.321 [6]. Value in number of sub-frames. Value sf640 corresponds to 640 sub-frames, sf1280 corresponds to 1280 sub-frames and so on. ttiBundling -TRUE indicates that TTI bundling TS 36.321 [6] is enabled while FALSE indicates that TTI bundling is disabled. TTI bundling can be enabled for FDD and for TDD only for configurations 0, 1 and 6. For TDD, E-UTRAN does not simultaneously enable TTI bundling and semi-persistent scheduling in this release of specification. longDRX-CycleStartOffset -longDRX-Cycle and drxStartOffset in TS 36.321 [6]. The value of longDRX-Cycle is in number of sub-frames. Value sf10 corresponds to 10 sub-frames, sf20 corresponds to 20 sub-frames and so on. If shortDRX-Cycle is configured, the value of longDRX-Cycle shall be a multiple of the shortDRX-Cycle value. The value of drxStartOffset value is in number of sub-frames. In TDD, this can point to a DL or UL sub-frame. onDurationTimer -Timer for DRX in TS 36.321 [6]. Value in number of PDCCH sub-frames. Value psf1 corresponds to 1 PDCCH sub-frame, psf2 corresponds to 2 PDCCH sub-frames and so on. drx-InactivityTimer -Timer for DRX in TS 36.321 [6]. Value in number of PDCCH sub-frames. Value psf1 corresponds to 1 PDCCH sub-frame, psf2 corresponds to 2 PDCCH sub-frames and so on. drx-RetransmissionTimer -Timer for DRX in TS 36.321 [6]. Value in number of PDCCH sub-frames. Value psf1 corresponds to 1 PDCCH sub-frame, psf2 corresponds to 2 PDCCH sub-frames and so on. shortDRX-Cycle -Short DRX cycle in TS 36.321 [6]. Value in number of sub-frames. Value sf2 corresponds to 2 sub-frames, sf5 corresponds to 5 subframes and so on. drxShortCycleTimer -Timer for DRX in TS 36.321 [6]. Value in multiples of shortDRX-Cycle. A value of 1 corresponds to shortDRX-Cycle, a value of 2 corresponds to 2 * shortDRX-Cycle and so on. periodicPHR-Timer -Timer for PHR reporting in TS 36.321 [6]. Value in number of sub-frames. Value sf10 corresponds to 10 subframes, sf20 corresponds to 20 subframes and so on. prohibitPHR-Timer -Timer for PHR reporting in TS 36.321 [6]. Value in number of sub-frames. Value sf0 corresponds to 0 subframes, sf100 corresponds to 100 subframes and so on. dl-PathlossChange -DL Pathloss Change for PHR reporting in TS 36.321 [6]. Value in dB. Value dB1 corresponds to 1 dB, dB3 corresponds to 3 dB and so on. -– PDCP-Config -The IE PDCP-Config is used to set the configurable PDCP parameters for data radio bearers. -PDCP-Config information element --- ASN1START - -PDCP-Config ::= SEQUENCE { - discardTimer ENUMERATED { - ms50, ms100, ms150, ms300, ms500, - ms750, ms1500, infinity - } OPTIONAL, -- Cond Setup - rlc-AM SEQUENCE { - statusReportRequired BOOLEAN - } OPTIONAL, -- Cond Rlc-AM - rlc-UM SEQUENCE { - pdcp-SN-Size ENUMERATED {len7bits, len12bits} - } OPTIONAL, -- Cond Rlc-UM - headerCompression CHOICE { - notUsed NULL, - rohc SEQUENCE { - maxCID INTEGER (1..16383) DEFAULT 15, - profiles SEQUENCE { - profile0x0001 BOOLEAN, - profile0x0002 BOOLEAN, - profile0x0003 BOOLEAN, - profile0x0004 BOOLEAN, - profile0x0006 BOOLEAN, - profile0x0101 BOOLEAN, - profile0x0102 BOOLEAN, - profile0x0103 BOOLEAN, - profile0x0104 BOOLEAN - }, - ... - } - }, - ... -} - --- ASN1STOP - -PDCP-Config field descriptions discardTimer -Indicates the discard timer value specified in TS 36.323 [8]. Value in milliseconds. Value ms50 means 50 ms, ms100 means 100 ms and so on. statusReportRequired -Indicates whether or not the UE shall send a PDCP Status Report upon re-establishment of the PDCP entity as specified in TS 36.323 [8]. pdcp-SN-Size -Indicates the PDCP Sequence Number length in bits. Value len7bits means that the 7-bit PDCP SN format is used and len12bits means that the 12-bit PDCP SN format is used, as specified in TS 36.323 [8]. maxCID -Indicates the value of the MAX_CID parameter as specified in TS 36.323 [8]. profiles -The profiles used by both compressor and decompressor in both UE and E-UTRAN. The field indicates which of the ROHC profiles specified in TS 36.323 [8] are supported, i.e. value 'true' indicates that the profile is supported. Profile 0x0000 shall always be supported when the use of ROHC is configured. If support of two ROHC profile identifiers with the same 8 LSB’s is signalled, only the profile corresponding to the highest value shall be applied. -Conditional presence Explanation Setup The field is mandatory present in case of radio bearer setup. Otherwise the field is not present. Rlc-AM The field is mandatory present upon setup of a PDCP entity for a radio bearer configured with RLC AM. The field is optional, need ON, in case of reconfiguration of a PDCP entity at handover for a radio bearer configured with RLC AM. Otherwise the field is not present. Rlc-UM The field is mandatory present upon setup of a PDCP entity for a radio bearer configured with RLC UM. Otherwise the field is not present. -– PDSCH-Config -The IE PDSCH-ConfigCommon and the IE PDSCH-ConfigDedicated are used to specify the common and the UE specific PDSCH configuration respectively. -PDSCH-Config information element --- ASN1START - -PDSCH-ConfigCommon::= SEQUENCE { - referenceSignalPower INTEGER (-60..50), - p-b INTEGER (0..3) -} - -PDSCH-ConfigDedicated::= SEQUENCE { - p-a ENUMERATED { - dB-6, dB-4dot77, dB-3, dB-1dot77, - dB0, dB1, dB2, dB3 } -} - --- ASN1STOP - -PDSCH-Config field descriptions referenceSignalPower -Parameter: Reference-signal power, which provides the downlink reference-signal EPRE, see TS 36.213 [23, 5.2]. The actual value in dBm. p-a -Parameter: , see TS 36.213 [23, 5.2]. Value dB-6 corresponds to -6 dB, dB-4dot77 corresponds to -4.77 dB etc. p-b -Parameter: , see TS 36.213 [23, Table 5.2-1]. -– PHICH-Config -The IE PHICH-Config is used to specify the PHICH configuration. -PHICH-Config information element --- ASN1START - -PHICH-Config ::= SEQUENCE { - phich-Duration ENUMERATED {normal, extended}, - phich-Resource ENUMERATED {oneSixth, half, one, two} -} - --- ASN1STOP - -PHICH-Config field descriptions phich-Duration -Parameter: PHICH-Duration, see TS 36.211 [21, Table 6.9.3-1]. phich-Resource -Parameter: Ng, see TS 36.211 [21, 6.9]. Value oneSixth corresponds to 1/6, half corresponds to 1/2 and so on. -– PhysicalConfigDedicated -The IE PhysicalConfigDedicated is used to specify the UE specific physical channel configuration. -PhysicalConfigDedicated information element --- ASN1START - -PhysicalConfigDedicated ::= SEQUENCE { - pdsch-ConfigDedicated PDSCH-ConfigDedicated OPTIONAL, -- Need ON - pucch-ConfigDedicated PUCCH-ConfigDedicated OPTIONAL, -- Need ON - pusch-ConfigDedicated PUSCH-ConfigDedicated OPTIONAL, -- Need ON - uplinkPowerControlDedicated UplinkPowerControlDedicated OPTIONAL, -- Need ON - tpc-PDCCH-ConfigPUCCH TPC-PDCCH-Config OPTIONAL, -- Need ON - tpc-PDCCH-ConfigPUSCH TPC-PDCCH-Config OPTIONAL, -- Need ON - cqi-ReportConfig CQI-ReportConfig OPTIONAL, -- Need ON - soundingRS-UL-ConfigDedicated SoundingRS-UL-ConfigDedicated OPTIONAL, -- Need ON - antennaInfo CHOICE { - explicitValue AntennaInfoDedicated, - defaultValue NULL - } OPTIONAL, -- Need ON - schedulingRequestConfig SchedulingRequestConfig OPTIONAL, -- Need ON - ... -} - --- ASN1STOP - -PhysicalConfigDedicated field descriptions antennaInfo -A choice is used to indicate whether the antennaInfo is signalled explicitly or set to the default antenna configuration as specified in section 9.2.4. tpc-PDCCH-ConfigPUCCH -PDCCH configuration for power control of PUCCH using format 3/3A, see TS 36.212 [22]. tpc-PDCCH-ConfigPUSCH -PDCCH configuration for power control of PUSCH using format 3/3A, see TS 36.212 [22]. -– P-Max -The IE P-Max is used to limit the UE’s uplink transmission power on a carrier frequency and is used to calculate the parameter Pcompensation defined in TS 36.304 [4]. Corresponds to parameter PEMAX in TS 36.101 [42]. The UE transmit power shall not exceed the minimum of this value (in dBm), if provided, and the maximum UE power for the UE power class, PUMAX, as specified in TS 36.101 [42, 6.2.5]. -P-Max information element --- ASN1START - -P-Max ::= INTEGER (-30..33) - --- ASN1STOP - -– PRACH-Config -The IE PRACH-ConfigSIB and IE PRACH-Config are used to specify the PRACH configuration in the system information and in the mobility control information, respectively. -PRACH-Config information elements --- ASN1START - -PRACH-ConfigSIB ::= SEQUENCE { - rootSequenceIndex INTEGER (0..837), - prach-ConfigInfo PRACH-ConfigInfo -} - -PRACH-Config ::= SEQUENCE { - rootSequenceIndex INTEGER (0..837), - prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON -} - -PRACH-ConfigInfo ::= SEQUENCE { - prach-ConfigIndex INTEGER (0..63), - highSpeedFlag BOOLEAN, - zeroCorrelationZoneConfig INTEGER (0..15), - prach-FreqOffset INTEGER (0..94) -} - --- ASN1STOP - -PRACH-Config field descriptions rootSequenceIndex -Parameter: RACH_ROOT_SEQUENCE, see TS 36.211 [21, 5.7.1]. prach-ConfigIndex -Parameter: prach-ConfigurationIndex, see TS 36.211 [21, 5.7.1]. highSpeedFlag -Parameter: High-speed-flag, see TS 36.211, [21, 5.7.2].TRUE corresponds to Restricted set and FALSE to Unrestricted set. zeroCorrelationZoneConfig -Parameter: NCS configuration, see TS 36.211, [21, 5.7.2: table 5.7.2-2] for preamble format 0..3 and TS 36.211, [21, 5.7.2: table 5.7.2-3] for preamble format 4. prach-FreqOffset -Parameter: prach-FrequencyOffset, see TS 36.211, [21, 5.7.1]. For TDD the value range is dependent on the value of prach-ConfigIndex. -– PresenceAntennaPort1 -The IE PresenceAntennaPort1 is used to indicate whether all the neighbouring cells use Antenna Port 1. When set to TRUE, the UE may assume that at least two cell-specific antenna ports are used in all neighbouring cells. -PresenceAntennaPort1 information element --- ASN1START - -PresenceAntennaPort1 ::= BOOLEAN - --- ASN1STOP - -– PUCCH-Config -The IE PUCCH-ConfigCommon and IE PUCCH-ConfigDedicated are used to specify the common and the UE specific PUCCH configuration respectively. -PUCCH-Config information elements --- ASN1START - -PUCCH-ConfigCommon ::= SEQUENCE { - deltaPUCCH-Shift ENUMERATED {ds1, ds2, ds3}, - nRB-CQI INTEGER (0..98), - nCS-AN INTEGER (0..7), - n1PUCCH-AN INTEGER (0..2047) -} - -PUCCH-ConfigDedicated ::= SEQUENCE { - ackNackRepetition CHOICE{ - release NULL, - setup SEQUENCE { - repetitionFactor ENUMERATED { n2, n4, n6, spare1}, - n1PUCCH-AN-Rep INTEGER (0..2047) - } - }, - tdd-AckNackFeedbackMode ENUMERATED {bundling, multiplexing} OPTIONAL -- Cond TDD -} - --- ASN1STOP - -PUCCH-Config field descriptions deltaPUCCH-Shift -Parameter: , see 36.211, 5.4.1, where ds1 corresponds to value 1 ds2 to 2 etc. nRB-CQI -Parameter: , see TS 36.211 [21, 5.4]. nCS-An -Parameter: see TS 36.211 [21, 5.4]. n1Pucch-AN -Parameter: see TS 36.213 [23, 10.1]. ackNackRepetition -Parameter indicates whether ACK/NACK repetition is configured, see TS 36.213 [23, 10.1]. repetitionFactor -Parameter see TS 36.213 [23, 10.1] where n2 corresponds to repetition factor 2, n4 to 4. n1Pucch-AN-Rep -Parameter: see TS 36.213 [23, 10.1]. tdd-AckNackFeedbackMode -Parameter indicates one of the two TDD ACK/NACK feedback modes used, see TS 36.213 [23, 7.3]. bundling corresponds to use of ACK/NACK bundling whereas, multiplexing corresponds to ACK/NACK multiplexing. -The same value applies to both ACK/NACK feedback modes on PUCCH as well as on PUSCH. For TDD configuration 5, E-UTRAN should always set this field to bundling. -Conditional presence Explanation TDD The field is mandatory present for TDD; it is not present for FDD and the UE shall delete any existing value for this field. -– PUSCH-Config -The IE PUSCH-ConfigCommon is used to specify the common PUSCH configuration and the reference signal configuration for PUSCH and PUCCH. The IE PUSCH-ConfigDedicated is used to specify the UE specific PUSCH configuration. -PUSCH-Config information element --- ASN1START - -PUSCH-ConfigCommon ::= SEQUENCE { - pusch-ConfigBasic SEQUENCE { - n-SB INTEGER (1..4), - hoppingMode ENUMERATED {interSubFrame, intraAndInterSubFrame}, - pusch-HoppingOffset INTEGER (0..98), - enable64QAM BOOLEAN - }, - ul-ReferenceSignalsPUSCH UL-ReferenceSignalsPUSCH -} - -PUSCH-ConfigDedicated ::= SEQUENCE { - betaOffset-ACK-Index INTEGER (0..15), - betaOffset-RI-Index INTEGER (0..15), - betaOffset-CQI-Index INTEGER (0..15) -} - -UL-ReferenceSignalsPUSCH ::= SEQUENCE { - groupHoppingEnabled BOOLEAN, - groupAssignmentPUSCH INTEGER (0..29), - sequenceHoppingEnabled BOOLEAN, - cyclicShift INTEGER (0..7) -} - --- ASN1STOP - -PUSCH-Config field descriptions n-SB -Parameter: Nsb see TS 36.211 [21, 5.3.4]. hoppingMode -Parameter: Hopping-mode, see TS 36.211 [21, 5.3.4]. pusch-hoppingOffset -Parameter: , see TS 36.211 [21, 5.3.4]. enable64QAM -See TS 36.213 [23, 8.6.1]. TRUE indicates that 64QAM is allowed while FALSE indicates that 64QAM is not allowed. betaOffset-ACK-Index -Parameter: , see TS 36.213 [23, Table 8.6.3-1]. betaOffset-RI-Index -Parameter: , see TS 36.213 [23, Table 8.6.3-2]. betaOffset-CQI-Index -Parameter: , see TS 36.213 [23, Table 8.6.3-3]. ul- ReferenceSignalsPUSCH -Used to specify parameters needed for the transmission on PUSCH (or PUCCH). groupHoppingEnabled -Parameter: Group-hopping-enabled, see TS 36.211 [21, 5.5.1.3]. groupAssignmentPUSCH -Parameter: ?SS See TS 36.211 [21, 5.5.1.3]. sequenceHoppingEnabled -Parameter: Sequence-hopping-enabled, see TS 36.211 [21, 5.5.1.4]. cyclicShift -Parameters: cyclicShift, see TS 36.211 [21, Table 5.5.2.1.1-2]. -– RACH-ConfigCommon -The IE RACH-ConfigCommon is used to specify the generic random access parameters. -RACH-ConfigCommon information element --- ASN1START - -RACH-ConfigCommon ::= SEQUENCE { - preambleInfo SEQUENCE { - numberOfRA-Preambles ENUMERATED { - n4, n8, n12, n16 ,n20, n24, n28, - n32, n36, n40, n44, n48, n52, n56, - n60, n64}, - preamblesGroupAConfig SEQUENCE { - sizeOfRA-PreamblesGroupA ENUMERATED { - n4, n8, n12, n16 ,n20, n24, n28, - n32, n36, n40, n44, n48, n52, n56, - n60}, - messageSizeGroupA ENUMERATED {b56, b144, b208, b256}, - messagePowerOffsetGroupB ENUMERATED { - minusinfinity, dB0, dB5, dB8, dB10, dB12, - dB15, dB18}, - ... - } OPTIONAL -- Need OP - }, - powerRampingParameters SEQUENCE { - powerRampingStep ENUMERATED {dB0, dB2,dB4, dB6}, - preambleInitialReceivedTargetPower ENUMERATED { - dBm-120, dBm-118, dBm-116, dBm-114, dBm-112, - dBm-110, dBm-108, dBm-106, dBm-104, dBm-102, - dBm-100, dBm-98, dBm-96, dBm-94, - dBm-92, dBm-90} - }, - ra-SupervisionInfo SEQUENCE { - preambleTransMax ENUMERATED { - n3, n4, n5, n6, n7, n8, n10, n20, n50, - n100, n200}, - ra-ResponseWindowSize ENUMERATED { - sf2, sf3, sf4, sf5, sf6, sf7, - sf8, sf10}, - mac-ContentionResolutionTimer ENUMERATED { - sf8, sf16, sf24, sf32, sf40, sf48, - sf56, sf64} - }, - maxHARQ-Msg3Tx INTEGER (1..8), - ... -} - --- ASN1STOP - -RACH-ConfigCommon field descriptions numberOfRA-Preambles -Number of non-dedicated random access preambles in TS 36.321 [6]. Value is an integer. Value n4 corresponds to 4, n8 corresponds to 8 and so on. preamblesGroupAConfig -Provides the configuration for preamble grouping in TS 36.321 [6]. If the field is not signalled, the size of the random access preambles group A [6] is equal to numberOfRA-Preambles. sizeOfRA-PreamblesGroupA -Size of the random access preambles group A in TS 36.321 [6]. Value is an integer. Value n4 corresponds to 4, n8 corresponds to 8 and so on. messageSizeGroupA -Threshold for preamble selection in TS 36.321 [6]. Value in bits. Value b56 corresponds to 56 bits, b144 corresponds to 144 bits and so on. messagePowerOffsetGroupB -Threshold for preamble selection in TS 36.321 [6]. Value in dB. Value minusinfinity corresponds to –infinity. Value dB0 corresponds to 0 dB, dB5 corresponds to 5 dB and so on. powerRampingStep -Power ramping factor in TS 36.321 [6]. Value in dB. Value dB0 corresponds to 0 dB, dB2 corresponds to 2 dB and so on. preambleInitialReceivedTargetPower -Initial preamble power in TS 36.321 [6]. Value in dBm. Value dBm-120 corresponds to -120 dBm, dBm-118 corresponds to -118 dBm and so on. preambleTransMax -Maximum number of preamble transmission in TS 36.321 [6]. Value is an integer. Value n3 corresponds to 3, n4 corresponds to 4 and so on. ra-ResponseWindowSize -Duration of the RA response window in TS 36.321 [6]. Value in subframes. Value sf2 corresponds to 2 subframes, sf3 corresponds to 3 subframes and so on. mac-ContentionResolutionTimer -Timer for contention resolution in TS 36.321 [6]. Value in subframes. Value sf8 corresponds to 8 subframes, sf16 corresponds to 16 subframes and so on. maxHARQ-Msg3Tx -Maximum number of Msg3 HARQ transmissions in TS 36.321 [6], used for contention based random access. Value is an integer. -– RACH-ConfigDedicated -The IE RACH-ConfigDedicated is used to specify the dedicated random access parameters. -RACH-ConfigDedicated information element --- ASN1START - -RACH-ConfigDedicated ::= SEQUENCE { - ra-PreambleIndex INTEGER (0..63), - ra-PRACH-MaskIndex INTEGER (0..15) -} - --- ASN1STOP - -RACH-ConfigDedicated field descriptions ra-PreambleIndex -Explicitly signalled Random Access Preamble for RA Resource selection in TS 36.321 [6]. ra-PRACH-MaskIndex -Explicitly signalled PRACH Mask Index for RA Resource selection in TS 36.321 [6]. -– RadioResourceConfigCommon -The IE RadioResourceConfigCommonSIB and IE RadioResourceConfigCommon are used to specify common radio resource configurations in the system information and in the mobility control information, respectively, e.g., the random access parameters and the static physical layer parameters. -RadioResourceConfigCommon information element --- ASN1START - -RadioResourceConfigCommonSIB ::= SEQUENCE { - rach-ConfigCommon RACH-ConfigCommon, - bcch-Config BCCH-Config, - pcch-Config PCCH-Config, - prach-Config PRACH-ConfigSIB, - pdsch-ConfigCommon PDSCH-ConfigCommon, - pusch-ConfigCommon PUSCH-ConfigCommon, - pucch-ConfigCommon PUCCH-ConfigCommon, - soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon, - uplinkPowerControlCommon UplinkPowerControlCommon, - ul-CyclicPrefixLength UL-CyclicPrefixLength, - ... -} - -RadioResourceConfigCommon ::= SEQUENCE { - rach-ConfigCommon RACH-ConfigCommon OPTIONAL, -- Need ON - prach-Config PRACH-Config, - pdsch-ConfigCommon PDSCH-ConfigCommon OPTIONAL, -- Need ON - pusch-ConfigCommon PUSCH-ConfigCommon, - phich-Config PHICH-Config OPTIONAL, -- Need ON - pucch-ConfigCommon PUCCH-ConfigCommon OPTIONAL, -- Need ON - soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon OPTIONAL, -- Need ON - uplinkPowerControlCommon UplinkPowerControlCommon OPTIONAL, -- Need ON - antennaInfoCommon AntennaInfoCommon OPTIONAL, -- Need ON - p-Max P-Max OPTIONAL, -- Need OP - tdd-Config TDD-Config OPTIONAL, -- Cond TDD - ul-CyclicPrefixLength UL-CyclicPrefixLength, - ... -} - -BCCH-Config ::= SEQUENCE { - modificationPeriodCoeff ENUMERATED {n2, n4, n8, n16} -} - -PCCH-Config ::= SEQUENCE { - defaultPagingCycle ENUMERATED { - rf32, rf64, rf128, rf256}, - nB ENUMERATED { - fourT, twoT, oneT, halfT, quarterT, oneEighthT, - oneSixteenthT, oneThirtySecondT} -} - -UL-CyclicPrefixLength ::= ENUMERATED {len1, len2} - --- ASN1STOP - -RadioResourceConfigCommon field descriptions p-Max -Pmax to be used in the target cell. If absent the UE applies the maximum power according to the UE capability. modificationPeriodCoeff -Actual modification period, expressed in number of radio frames= modificationPeriodCoeff * defaultPagingCycle. n2 corresponds to value 2, n4 corresponds to value 4, n8 corresponds to value 8 and n16 corresponds to value 16. defaultPagingCycle -Default paging cycle, used to derive ‘T’ in TS 36.304 [4]. Value rf32 corresponds to 32 radio frames, rf64 corresponds to 64 radio frames and so on. nB -Parameter: nB is used as one of parameters to derive the Paging Frame and Paging Occasion according to TS 36.304 [4]. Value in multiples of defaultPagingCycle ('T'). A value of fourT corresponds to 4 * defaultPagingCycle, a value of twoT corresponds to 2 * defaultPagingCycle and so on. UL-CyclicPrefixLength -Parameter: Uplink cyclic prefix length see 36.211 [21, 5.2.1] where len1 corresponds to normal cyclic prefix and len2 corresponds to extended cyclic prefix. -Conditional presence Explanation TDD The field is optional for TDD, Need ON; it is not present for FDD and the UE shall delete any existing value for this field. -– RadioResourceConfigDedicated -The IE RadioResourceConfigDedicated is used to setup/modify/release RBs, to modify the MAC main configuration, to modify the SPS configuration and to modify dedicated physical configuration. -RadioResourceConfigDedicated information element --- ASN1START - -RadioResourceConfigDedicated ::= SEQUENCE { - srb-ToAddModList SRB-ToAddModList OPTIONAL, -- Cond HO-Conn - drb-ToAddModList DRB-ToAddModList OPTIONAL, -- Cond HO-toEUTRA - drb-ToReleaseList DRB-ToReleaseList OPTIONAL, -- Need ON - mac-MainConfig CHOICE { - explicitValue MAC-MainConfig, - defaultValue NULL - } OPTIONAL, -- Cond HO-toEUTRA2 - sps-Config SPS-Config OPTIONAL, -- Need ON - physicalConfigDedicated PhysicalConfigDedicated OPTIONAL, -- Need ON - ... -} - -SRB-ToAddModList ::= SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod - -SRB-ToAddMod ::= SEQUENCE { - srb-Identity INTEGER (1..2), - rlc-Config CHOICE { - explicitValue RLC-Config, - defaultValue NULL - } OPTIONAL, -- Cond Setup - logicalChannelConfig CHOICE { - explicitValue LogicalChannelConfig, - defaultValue NULL - } OPTIONAL, -- Cond Setup - ... -} - -DRB-ToAddModList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddMod - -DRB-ToAddMod ::= SEQUENCE { - eps-BearerIdentity INTEGER (0..15) OPTIONAL, -- Cond DRB-Setup - drb-Identity DRB-Identity, - pdcp-Config PDCP-Config OPTIONAL, -- Cond PDCP - rlc-Config RLC-Config OPTIONAL, -- Cond Setup - logicalChannelIdentity INTEGER (3..10) OPTIONAL, -- Cond DRB-Setup - logicalChannelConfig LogicalChannelConfig OPTIONAL, -- Cond Setup - ... -} - -DRB-ToReleaseList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-Identity - --- ASN1STOP - -RadioResourceConfigDedicated field descriptions srb-Identity -Value 1 is applicable for SRB1 only. -Value 2 is applicable for SRB2 only. rlc-Config -For SRBs a choice is used to indicate whether the RLC configuration is signalled explicitly or set to the values defined in the default RLC configuration for SRB1 in 9.2.1.1 or for SRB2 in 9.2.1.2. RLC AM is the only applicable RLC mode for SRB1 and SRB2. E-UTRAN does not reconfigure the RLC mode of DRBs, and may reconfigure the UM RLC SN field size only upon handover within E-UTRA or upon the first reconfiguration after RRC connection re-establishment. mac-MainConfig -Although the ASN.1 includes a choice that is used to indicate whether the mac-MainConfig is signalled explictly or set to the default MAC main configuration as specified in 9.2.2, EUTRAN does not apply "defaultValue". sps-Config -The default SPS configuration is specified in 9.2.3. physicalConfigDedicated -The default dedicated physical configuration is specified in 9.2.4. logicalChannelConfig -For SRBs a choice is used to indicate whether the logical channel configuration is signalled explicitly or set to the default logical channel configuration for SRB1 as specified in 9.2.1.1 or for SRB2 as specified in 9.2.1.2. logicalChannelIdentity -The logical channel identity for both UL and DL. -Conditional presence Explanation DRB-Setup The field is mandatory present if the corresponding DRB is being set up (including bearer setup at handover to E-UTRA); otherwise it is not present. PDCP The field is mandatory present if the corresponding DRB is being setup; the field is optionally present, need ON, upon handover within E-UTRA and upon the first reconfiguration after re-establishment; otherwise it is not present. Setup The field is mandatory present if the corresponding SRB/DRB is being setup; otherwise the field is optionally present, need ON. HO-Conn The field is mandatory present in case of handover to E-UTRA and to only establish SRB1 in case of RRC connection establishment; otherwise the field is optionally present, need ON. HO-toEUTRA The field is mandatory present in case of handover to E-UTRA; In case of RRC connection establishment and RRC connection re-establishment the field is not present; otherwise the field is optionally present, need ON. HO-toEUTRA2 The field is mandatory present in case of handover to E-UTRA; otherwise the field is optionally present, need ON. -– RLC-Config -The IE RLC-Config is used to specify the RLC configuration of SRBs and DRBs. -RLC-Config information element --- ASN1START - -RLC-Config ::= CHOICE { - am SEQUENCE { - ul-AM-RLC UL-AM-RLC, - dl-AM-RLC DL-AM-RLC - }, - um-Bi-Directional SEQUENCE { - ul-UM-RLC UL-UM-RLC, - dl-UM-RLC DL-UM-RLC - }, - um-Uni-Directional-UL SEQUENCE { - ul-UM-RLC UL-UM-RLC - }, - um-Uni-Directional-DL SEQUENCE { - dl-UM-RLC DL-UM-RLC - }, - ... -} - -UL-AM-RLC ::= SEQUENCE { - t-PollRetransmit T-PollRetransmit, - pollPDU PollPDU, - pollByte PollByte, - maxRetxThreshold ENUMERATED { - t1, t2, t3, t4, t6, t8, t16, t32} -} - -DL-AM-RLC ::= SEQUENCE { - t-Reordering T-Reordering, - t-StatusProhibit T-StatusProhibit -} - -UL-UM-RLC ::= SEQUENCE { - sn-FieldLength SN-FieldLength -} - -DL-UM-RLC ::= SEQUENCE { - sn-FieldLength SN-FieldLength, - t-Reordering T-Reordering -} - -SN-FieldLength ::= ENUMERATED {size5, size10} - -T-PollRetransmit ::= ENUMERATED { - ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms105, - ms110, ms115, ms120, ms125, ms130, ms135, - ms140, ms145, ms150, ms155, ms160, ms165, - ms170, ms175, ms180, ms185, ms190, ms195, - ms200, ms205, ms210, ms215, ms220, ms225, - ms230, ms235, ms240, ms245, ms250, ms300, - ms350, ms400, ms450, ms500, spare9, spare8, - spare7, spare6, spare5, spare4, spare3, - spare2, spare1} - -PollPDU ::= ENUMERATED { - p4, p8, p16, p32, p64, p128, p256, pInfinity} - -PollByte ::= ENUMERATED { - kB25, kB50, kB75, kB100, kB125, kB250, kB375, - kB500, kB750, kB1000, kB1250, kB1500, kB2000, - kB3000, kBinfinity, spare1} - -T-Reordering ::= ENUMERATED { - ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms110, - ms120, ms130, ms140, ms150, ms160, ms170, - ms180, ms190, ms200, spare1} - -T-StatusProhibit ::= ENUMERATED { - ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms105, - ms110, ms115, ms120, ms125, ms130, ms135, - ms140, ms145, ms150, ms155, ms160, ms165, - ms170, ms175, ms180, ms185, ms190, ms195, - ms200, ms205, ms210, ms215, ms220, ms225, - ms230, ms235, ms240, ms245, ms250, ms300, - ms350, ms400, ms450, ms500, spare8, spare7, - spare6, spare5, spare4, spare3, spare2, - spare1} - --- ASN1STOP - -RLC-Config field descriptions sn-FieldLength -Indicates the UM RLC SN field size, see TS 36.322 [7], in bits. Value size5 means 5 bits, size10 means 10 bits. t-PollRetransmit -Timer for RLC AM in TS 36.322 [7], in milliseconds. Value ms5 means 5ms, ms10 means 10ms and so on. pollPDU -Parameter for RLC AM in TS 36.322 [7]. Value p4 corresponds to 4 PDUs, p8 to 8 PDUs and so on. pInfinity corresponds to an infinite number of PDUs. pollByte -Parameter for RLC AM in TS 36.322 [7]. Value kB25 corresponds to 25 kBytes, kB50 to 50 kBytes and so on. kBInfinity corresponds to an infinite amount of kBytes. maxRetxThreshold -Parameter for RLC AM in TS 36.322 [7]. Value t1 corresponds to 1 retransmission, t2 to 2 retransmissions and so on. t-Reordering -Timer for reordering in TS 36.322 [7], in milliseconds. Value ms0 means 0ms, ms5 means 5ms and so on. t-StatusProhibit -Timer for status reporting in TS 36.322 [7], in milliseconds. Value ms0 means 0ms, ms5 means 5ms and so on. -– SchedulingRequestConfig -The IE SchedulingRequestConfig is used to specify the Scheduling Request related parameters -SchedulingRequestConfig information element --- ASN1START - -SchedulingRequestConfig ::= CHOICE { - release NULL, - setup SEQUENCE { - sr-PUCCH-ResourceIndex INTEGER (0..2047), - sr-ConfigIndex INTEGER (0..155), - dsr-TransMax ENUMERATED { - n4, n8, n16, n32, n64, spare3, spare2, spare1} - } -} - --- ASN1STOP - -SchedulingRequestConfig field descriptions sr-PUCCH-ResourceIndex -Parameter: . see TS 36.213 [23, 10.1]. sr-ConfigIndex -Parameter. See TS 36.213 [23,10.1]. dsr-TransMax -Parameter for SR transmission in TS 36.321 [6, 5.4.4]. The value n4 corresponds to 4 transmissions, n8 corresponds to 8 transmissions and so on. -– SoundingRS-UL-Config -The IE SoundingRS-UL-Config is used to specify the uplink Sounding RS configuration. -SoundingRS-UL-Config information element --- ASN1START - -SoundingRS-UL-ConfigCommon ::= CHOICE { - release NULL, - setup SEQUENCE { - srs-BandwidthConfig ENUMERATED {bw0, bw1, bw2, bw3, bw4, bw5, bw6, bw7}, - srs-SubframeConfig ENUMERATED { - sc0, sc1, sc2, sc3, sc4, sc5, sc6, sc7, - sc8, sc9, sc10, sc11, sc12, sc13, sc14, sc15}, - ackNackSRS-SimultaneousTransmission BOOLEAN, - srs-MaxUpPts ENUMERATED {true} OPTIONAL -- Cond TDD - } -} - -SoundingRS-UL-ConfigDedicated ::= CHOICE{ - release NULL, - setup SEQUENCE { - srs-Bandwidth ENUMERATED {bw0, bw1, bw2, bw3}, - srs-HoppingBandwidth ENUMERATED {hbw0, hbw1, hbw2, hbw3}, - freqDomainPosition INTEGER (0..23), - duration BOOLEAN, - srs-ConfigIndex INTEGER (0..1023), - transmissionComb INTEGER (0..1), - cyclicShift ENUMERATED {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7} - } -} - - --- ASN1STOP - -SoundingRS-UL-Config field descriptions srs-BandwidthConfig -Parameter: SRS Bandwidth Configuration. See TS 36.211, [21, table 5.5.3.2-1, 5.5.3.2-2, 5.5.3.2-3 and 5.5.3.2– 4]. Actual configuration depends on UL bandwidth. bw0 corresponds to value 0, bw1 to value 1 and so on. srs-SubframeConfig -Parameter: SRS SubframeConfiguration. See TS 36.211, [21, table 5.5.3.3-1] applies for FDD whereas TS 36.211, [21, table 5.5.3.3-2] applies for TDD. sc0 corresponds to value 0, sc1 to value 1 and so on. ackNackSRS-SimultaneousTransmission -Parameter: Simultaneous-AN-and-SRS, see TS 36.213 [23, 8.2]. srs-Bandwidth -Parameter: b, see TS 36.211 [21, table 5.5.3.2-1]. freqDomainPosition -Parameter: , see TS 36.211 [21, 5.5.3.2]. srs-HoppingBandwidth -Parameter: SRS hopping bandwidth , see TS 36.211 [21, 5.5.3.2] where hbw0 corresponds to value 0, hbw1 to value 1 and so on. duration -Parameter: Duration. See TS 36.213 [21, 8.2]. FALSE corresponds to “single” and value TRUE to “indefinite”. srs-ConfigIndex -Parameter: ISRS. See TS 36.213 [23, table8.2-1]. transmissionComb -Parameter: , see TS 36.211 [21, 5.5.3.2]. cyclicShift -Parameter: n_SRS. See TS 36.211 [21, 5.5.3.1], where cs0 corresponds to 0 etc. srs-MaxUpPts -Parameter: srsMaxUpPts, see TS 36.211 [21, 5.5.3.2]. If this field is present, reconfiguration of applies for UpPts, otherwise reconfiguration does not apply. -Conditional presence Explanation TDD This field is optional present for TDD, need OR; it is not present for FDD and the UE shall delete any existing value for this field. -– SPS-Config -The IE SPS-Config is used to specify the semi-persistent scheduling configuration. -SPS-Config information element --- ASN1START - -SPS-Config ::= SEQUENCE { - semiPersistSchedC-RNTI C-RNTI OPTIONAL, -- Need OR - sps-ConfigDL SPS-ConfigDL OPTIONAL, -- Need ON - sps-ConfigUL SPS-ConfigUL OPTIONAL -- Need ON -} - -SPS-ConfigDL ::= CHOICE{ - release NULL, - setup SEQUENCE { - semiPersistSchedIntervalDL ENUMERATED { - sf10, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, spare6, - spare5, spare4, spare3, spare2, - spare1}, - numberOfConfSPS-Processes INTEGER (1..8), - n1-PUCCH-AN-PersistentList N1-PUCCH-AN-PersistentList, - ... - } -} - -SPS-ConfigUL ::= CHOICE { - release NULL, - setup SEQUENCE { - semiPersistSchedIntervalUL ENUMERATED { - sf10, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, spare6, - spare5, spare4, spare3, spare2, - spare1}, - implicitReleaseAfter ENUMERATED {e2, e3, e4, e8}, - p0-Persistent SEQUENCE { - p0-NominalPUSCH-Persistent INTEGER (-126..24), - p0-UE-PUSCH-Persistent INTEGER (-8..7) - } OPTIONAL, -- Need OP - twoIntervalsConfig ENUMERATED {true} OPTIONAL, -- Cond TDD - ... - } -} - -N1-PUCCH-AN-PersistentList ::= SEQUENCE (SIZE (1..4)) OF INTEGER (0..2047) - --- ASN1STOP - -SPS-Config field descriptions semiPersistSchedC-RNTI -Semi-persistent Scheduling C-RNTI, see TS 36.321 [6]. semiPersistSchedIntervalDL -Semi-persistent scheduling interval in downlink, see TS 36.321 [6]. Value in number of sub-frames. Value sf10 corresponds to 10 sub-frames, sf20 corresponds to 20 sub-frames and so on. For TDD, the UE shall round this parameter down to the nearest integer (of 10 sub-frames), e.g. sf10 corresponds to 10 sub-frames, sf32 corresponds to 30 sub-frames, sf128 corresponds to 120 sub-frames. numberOfConfSPS-Processes -Parameter: Number of Configured SPS Processes, see TS 36.321 [6]. n1-PUCCH-AN-PersistentList -List of parameter: see TS 36.213, [23, 10.1]. semiPersistSchedIntervalUL -Semi-persistent scheduling interval in uplink, see TS 36.321 [6]. Value in number of sub-frames. Value sf10 corresponds to 10 sub-frames, sf20 corresponds to 20 sub-frames and so on. For TDD, the UE shall round this parameter down to the nearest integer (of 10 sub-frames), e.g. sf10 corresponds to 10 sub-frames, sf32 corresponds to 30 sub-frames, sf128 corresponds to 120 sub-frames. implicitReleaseAfter -Number of empty transmissions before implicit release, see TS 36.321 [6, 5.10.2]. Value e2 corresponds to 2 transmissions, e3 corresponds to 3 transmissions and so on. p0-NominalPUSCH-Persistent -Parameter: . See TS 36.213 [23, 5.1.1.1], unit dBm step 1. This field is applicable for persistent scheduling, only. If choice ‘setup’ is used and p0-Persistent is absent, apply the value of p0-NominalPUSCH for p0-NominalPUSCH-Persistent. p0-UE-PUSCH-Persistent -Parameter: . See TS 36.213 [23, 5.1.1.1], unit dB. This field is applicable for persistent scheduling, only. If choice ‘setup’ is used and p0-Persistent is absent, apply the value of p0-UE-PUSCH for p0-UE-PUSCH-Persistent. twoIntervalsConfig -Trigger of two-intervals-Semi-Persistent Scheduling in uplink. See TS 36.321 [6, 5.10]. If this field is present, two-intervals-SPS is enabled for uplink. Otherwise, two-intervals-SPS is disabled. -Conditional presence Explanation TDD This field is optional present for TDD, need OR; it is not present for FDD and the UE shall delete any existing value for this field. -– TDD-Config -The IE TDD-Config is used to specify the TDD specific physical channel configuration. -TDD-Config information element --- ASN1START - -TDD-Config ::= SEQUENCE { - subframeAssignment ENUMERATED { - sa0, sa1, sa2, sa3, sa4, sa5, sa6}, - specialSubframePatterns ENUMERATED { - ssp0, ssp1, ssp2, ssp3, ssp4,ssp5, ssp6, ssp7, - ssp8} -} - --- ASN1STOP - -TDD-Config field descriptions subframeAssignment -Indicates DL/UL subframe configuration where sa0 point to Configuration 0, sa1 to Configuration 1 etc. as specified in TS 36.211 [21, table 4.2.2]. specialSubframePatterns -Indicates Configuration as in TS 36.211 [21, table 4.2.1] where ssp0 point to Configuration 0, ssp1 to Configuration 1 etc. -– TimeAlignmentTimer -The IE TimeAlignmentTimer is used to control how long the UE is considered uplink time aligned. Corresponds to the Timer for time alignment in TS 36.321 [6]. Value in number of sub-frames. Value sf500 corresponds to 500 sub-frames, sf750 corresponds to 750 sub-frames and so on. -TimeAlignmentTimer information element --- ASN1START - -TimeAlignmentTimer ::= ENUMERATED { - sf500, sf750, sf1280, sf1920, sf2560, sf5120, - sf10240, infinity} --- ASN1STOP - -– TPC-PDCCH-Config -The IE TPC-PDCCH-Config is used to specify the RNTIs and indexes for PUCCH and PUSCH power control according to TS 36.212 [22]. The power control function can either be setup or released with the IE. -TPC-PDCCH-Config information element --- ASN1START - -TPC-PDCCH-Config::= CHOICE { - release NULL, - setup SEQUENCE { - tpc-RNTI BIT STRING (SIZE (16)), - tpc-Index TPC-Index - } -} - -TPC-Index ::= CHOICE { - indexOfFormat3 INTEGER (1..15), - indexOfFormat3A INTEGER (1..31) -} - --- ASN1STOP - -TPC-PDCCH-Config field descriptions tpc-RNTI -RNTI for power control using DCI format 3/3A, see TS 36.212 [22]. tpc-Index -Index of N or M, see TS 36.212 [22, 5.3.3.1.6 and 5.3.3.1.7], where N or M is dependent on the used DCI format (i.e. format 3 or 3a). indexOfFormat3 -Index of N when DCI format 3 is used. See TS 36.212 [22, 5.3.3.1.6]. IndexOfFormat3A -Index of M when DCI format 3A is used. See TS 36.212 [22, 5.3.3.1.7]. -– UplinkPowerControl -The IE UplinkPowerControlCommon and IE UplinkPowerControlDedicated are used to specify parameters for uplink power control in the system information and in the dedicated signalling, respectively. -UplinkPowerControl information elements --- ASN1START - -UplinkPowerControlCommon ::= SEQUENCE { - p0-NominalPUSCH INTEGER (-126..24), - alpha ENUMERATED {al0, al04, al05, al06, al07, al08, al09, al1}, - p0-NominalPUCCH INTEGER (-127..-96), - deltaFList-PUCCH DeltaFList-PUCCH, - deltaPreambleMsg3 INTEGER (-1..6) -} - -UplinkPowerControlDedicated ::= SEQUENCE { - p0-UE-PUSCH INTEGER (-8..7), - deltaMCS-Enabled ENUMERATED {en0, en1}, - accumulationEnabled BOOLEAN, - p0-UE-PUCCH INTEGER (-8..7), - pSRS-Offset INTEGER (0..15), - filterCoefficient FilterCoefficient DEFAULT fc4 -} - -DeltaFList-PUCCH ::= SEQUENCE { - deltaF-PUCCH-Format1 ENUMERATED {deltaF-2, deltaF0, deltaF2}, - deltaF-PUCCH-Format1b ENUMERATED {deltaF1, deltaF3, deltaF5}, - deltaF-PUCCH-Format2 ENUMERATED {deltaF-2, deltaF0, deltaF1, deltaF2}, - deltaF-PUCCH-Format2a ENUMERATED {deltaF-2, deltaF0, deltaF2}, - deltaF-PUCCH-Format2b ENUMERATED {deltaF-2, deltaF0, deltaF2} -} - --- ASN1STOP - -UplinkPowerControl field descriptions p0-NominalPUSCH -Parameter: See TS 36.213, 5.1.1.1, unit dBm. This field is applicable for non-persistent scheduling, only. alpha -Parameter: ? See TS 36.213, 5.1.1.1 where al0 corresponds to 0, al04 corresponds to value 0.4, al05 to 0.5, al06 to 0.6, al07 to 0.7, al08 to 0.8, al09 to 0.9 and al1 corresponds to 1. p0-NominalPUCCH -Parameter: See TS 36.213, 5.1.2.1, unit dBm. deltaF-PUCCH-FormatX -Parameter: for the PUCCH formats 1, 1b, 2, 2a and 2b. See TS 36.213 [23, 5.1.2] where -deltaF-2 corresponds to -2 dB, deltaF0 corresponds to 0 dB and so on. p0-UE-PUSCH -Parameter: See TS 36.213 [23, 5.1.1.1], unit dB. This field is applicable for non-persistent scheduling, only. deltaPreambleMsg3 -Parameter: see TS 36.213 [23, 5.1.1.1]. Actual value = IE value * 2 [dB]. deltaMCS-Enabled -Parameter: Ks See TS 36.213 [23, 5.1.1.1]. en0 corresponds to value 0 corresponding to state “disabled”. en1 corresponds to value 1.25 corresponding to “enabled”. accumulationEnabled -Parameter: Accumulation-enabled, see TS 36.213 [23, 5.1.1.1]. TRUE corresponds to “enabled” whereas FALSE corresponds to “disabled”. p0-UE-PUCCH -Parameter: See TS 36.213 [23, 5.1.2.1]. Unit dB pSRS-Offset -Parameter: PSRS_OFFSET See TS 36.213 [23, 5.1.3.1]. For Ks=1.25, the actual parameter value is pSRS-Offset value – 3. For Ks=0, the actual parameter value is -10.5 + 1.5*pSRS-Offset value. filterCoefficient -Specifies the filtering coefficient for RSRP measurements used to calculate path loss, as specified in TS 36.213 [23, 5.1.1.1]. The same filtering mechanism applies as for quantityConfig described in 5.5.3.2. -6.3.3 Security control information elements -– NextHopChainingCount -The IE NextHopChainingCount is used to update the KeNB key and corresponds to parameter NCC: See TS 33.401 [32, 7.2.8.4]. -NextHopChainingCount information element --- ASN1START - -NextHopChainingCount ::= INTEGER (0..7) - --- ASN1STOP - -– SecurityAlgorithmConfig -The IE SecurityAlgorithmConfig is used to configure AS integrity protection algorithm (SRBs) and AS ciphering algorithm (SRBs and DRBs). -SecurityAlgorithmConfig information element --- ASN1START - -SecurityAlgorithmConfig ::= SEQUENCE { - cipheringAlgorithm ENUMERATED { - eea0, eea1, eea2, spare5, spare4, spare3, - spare2, spare1, ...}, - integrityProtAlgorithm ENUMERATED { - reserved, eia1, eia2, spare5, spare4, spare3, - spare2, spare1, ...} -} - --- ASN1STOP - -SecurityAlgorithmConfig field descriptions integrityProtAlgorithm -Indicates the integrity protection algorithm to be used for SRBs, as specified in TS 33.401 [32, 5.1.4.2]. The value ‘reserved’ is handled as a spare value in Rel-8. cipheringAlgorithm -Indicates the ciphering algorithm to be used for SRBs and DRBs, as specified in TS 33.401 [32, 5.1.3.2]. -– ShortMAC-I -The IE ShortMAC-I is used to identify and verify the UE at RRC connection re-establishment. The 16 least significant bits of the MAC-I calculated using the security configuration of the source cell, as specified in 5.3.7.4. -ShortMAC-I information element --- ASN1START - -ShortMAC-I ::= BIT STRING (SIZE (16)) - --- ASN1STOP - -6.3.4 Mobility control information elements -– AdditionalSpectrumEmission -The UE requirements related to IE AdditionalSpectrumEmission are defined in TS 36.101 [42, table 6.2.4-1]. -AdditionalSpectrumEmission information element --- ASN1START - -AdditionalSpectrumEmission ::= INTEGER (1..32) - --- ASN1STOP - -– ARFCN-ValueCDMA2000 -The IE ARFCN-ValueCDMA2000 used to indicate the CDMA2000 carrier frequency within a CDMA2000 band, see C.S0002-A [12]. -ARFCN-ValueCDMA2000 information element --- ASN1START - -ARFCN-ValueCDMA2000 ::= INTEGER (0..2047) - --- ASN1STOP - -– ARFCN-ValueEUTRA -The IE ARFCN-ValueEUTRA is used to indicate the ARFCN applicable for a downlink, uplink or bi-directional (TDD) E-UTRA carrier frequency, as defined in TS 36.101 [42]. -ARFCN-ValueEUTRA information element --- ASN1START - -ARFCN-ValueEUTRA ::= INTEGER (0..maxEARFCN) - --- ASN1STOP - -– ARFCN-ValueGERAN -The IE ARFCN-ValueGERAN is used to specify the ARFCN value applicable for a GERAN BCCH carrier frequency, see TS 45.005 [20]. -ARFCN-ValueGERAN information element --- ASN1START - -ARFCN-ValueGERAN ::= INTEGER (0..1023) - --- ASN1STOP - -– ARFCN-ValueUTRA -The IE ARFCN-ValueUTRA is used to indicate the ARFCN applicable for a downlink (Nd, FDD) or bi-directional (Nt, TDD) UTRA carrier frequency, as defined in TS 25.331 [19]. -ARFCN-ValueUTRA information element --- ASN1START - -ARFCN-ValueUTRA ::= INTEGER (0..16383) - --- ASN1STOP - -– BandclassCDMA2000 -The IE BandclassCDMA2000 is used to define the CDMA2000 band in which the CDMA2000 carrier frequency can be found, as defined in C.S0057-B [24, table 1.5-1]. -BandclassCDMA2000 information element --- ASN1START - -BandclassCDMA2000 ::= ENUMERATED { - bc0, bc1, bc2, bc3, bc4, bc5, bc6, bc7, bc8, - bc9, bc10, bc11, bc12, bc13, bc14, bc15, bc16, - bc17, spare14, spare13, spare12, spare11, spare10, - spare9, spare8, spare7, spare6, spare5, spare4, - spare3, spare2, spare1, ...} - --- ASN1STOP - -– BandIndicatorGERAN -The IE BandIndicatorGERAN indicates how to interpret an associated GERAN carrier ARFCN, see TS 45.005 [20]. More specifically, the IE indicates the GERAN frequency band in case the ARFCN value can concern either a DCS 1800 or a PCS 1900 carrier frequency. For ARFCN values not associated with one of these bands, the indicator has no meaning. -BandIndicatorGERAN information element --- ASN1START - -BandIndicatorGERAN ::= ENUMERATED {dcs1800, pcs1900} - --- ASN1STOP - -– CarrierFreqCDMA2000 -The IE CarrierFreqCDMA2000 used to provide the CDMA2000 carrier information. -CarrierFreqCDMA2000 information element --- ASN1START - -CarrierFreqCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - arfcn ARFCN-ValueCDMA2000 -} - --- ASN1STOP - -– CarrierFreqGERAN -The IE CarrierFreqGERAN is used to provide an unambiguous carrier frequency description of a GERAN cell. -CarrierFreqGERAN information element --- ASN1START - -CarrierFreqGERAN ::= SEQUENCE { - arfcn ARFCN-ValueGERAN, - bandIndicator BandIndicatorGERAN -} - --- ASN1STOP - -CarrierFreqGERAN field descriptions arfcn -GERAN ARFCN of BCCH carrier. bandIndicator -Indicates how to interpret the ARFCN of the BCCH carrier. -– CarrierFreqsGERAN -The IE CarrierFreqListGERAN is used to provide one or more GERAN ARFCN values, as defined in TS 44.005 [43], which represents a list of GERAN BCCH carrier frequencies. -CarrierFreqsGERAN information element --- ASN1START - -CarrierFreqsGERAN ::= SEQUENCE { - startingARFCN ARFCN-ValueGERAN, - bandIndicator BandIndicatorGERAN, - followingARFCNs CHOICE { - explicitListOfARFCNs ExplicitListOfARFCNs, - equallySpacedARFCNs SEQUENCE { - arfcn-Spacing INTEGER (1..8), - numberOfFollowingARFCNs INTEGER (0..31) - }, - variableBitMapOfARFCNs OCTET STRING (SIZE (1..16)) - } -} - -ExplicitListOfARFCNs ::= SEQUENCE (SIZE (0..31)) OF ARFCN-ValueGERAN - --- ASN1STOP - -CarrierFreqsGERAN field descriptions startingARFCN -The first ARFCN value, s, in the set. bandIndicator -Indicates how to interpret the ARFCN of the BCCH carrier. followingARFCNs -Field containing a representation of the remaining ARFCN values in the set. explicitListOfARFCNs -The remaining ARFCN values in the set are explicitly listed one by one. arfcn-Spacing -Space, d, between a set of equally spaced ARFCN values. numberOfFollowingARFCNs -The number, n, of the remaining equally spaced ARFCN values in the set. The complete set of (n+1) ARFCN values is defined as: {s, ((s + d) mod 1024), ((s + 2*d) mod 1024) ... ((s + n*d) mod 1024)}. variableBitMapOfARFCNs -Bitmap field representing the remaining ARFCN values in the set. The leading bit of the first octet in the bitmap corresponds to the ARFCN = ((s + 1) mod 1024), the next bit to the ARFCN = ((s + 2) mod 1024), and so on. If the bitmap consist of N octets, the trailing bit of octet N corresponds to ARFCN = ((s + 8*N) mod 1024). The complete set of ARFCN values consists of ARFCN = s and the ARFCN values, where the corresponding bit in the bitmap is set to "1". -– CDMA2000-Type -The IE CDMA2000-Type is used to describe the type of CDMA2000 network. -CDMA2000-Type information element --- ASN1START - -CDMA2000-Type ::= ENUMERATED {type1XRTT, typeHRPD} - --- ASN1STOP - -– CellIdentity -The IE CellIdentity is used to unambiguously identify a cell within a PLMN. -CellIdentity information element --- ASN1START - -CellIdentity ::= BIT STRING (SIZE (28)) - --- ASN1STOP - -– CellIndexList -The IE CellIndexList concerns a list of cell indices, which may be used for different purposes. -CellIndexList information element --- ASN1START - -CellIndexList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellIndex - -CellIndex ::= INTEGER (1..maxCellMeas) - --- ASN1STOP - -– CellReselectionPriority -The IE CellReselectionPriority concerns the absolute priority of the concerned carrier frequency/ set of frequencies (GERAN), as used by the cell reselection procedure. Corresponds with parameter “priority” in TS 36.304 [4]. Value 0 means: lowest priority. The UE behaviour for the case the field is absent, if applicable, is specified in TS 36.304 [4]. -CellReselectionPriority information element --- ASN1START - -CellReselectionPriority ::= INTEGER (0..7) - --- ASN1STOP - -– CSFB-RegistrationParam1XRTT -The IE CSFB-RegistrationParam1XRTT is used to indicate whether or not the UE shall perform an CDMA2000 1xRTT pre-registration if the UE does not have a valid / current pre-registration. --- ASN1START - -CSFB-RegistrationParam1XRTT ::= SEQUENCE { - sid BIT STRING (SIZE (15)), - nid BIT STRING (SIZE (16)), - multipleSID BOOLEAN, - multipleNID BOOLEAN, - homeReg BOOLEAN, - foreignSIDReg BOOLEAN, - foreignNIDReg BOOLEAN, - parameterReg BOOLEAN, - powerUpReg BOOLEAN, - registrationPeriod BIT STRING (SIZE (7)), - registrationZone BIT STRING (SIZE (12)), - totalZone BIT STRING (SIZE (3)), - zoneTimer BIT STRING (SIZE (3)) -} - --- ASN1STOP - - -CSFB-RegistrationParam1XRTT field descriptions sid -Used along with the oneXRTT-NetworkID as a pair to control when the UE should Re-Register with the CDMA2000 1xRTT network. nid -Used along with the oneXRTT-SystemID as a pair to control when the UE should Re-Register with the CDMA2000 1xRTT network. multipleSID -The CDMA2000 1xRTT Multiple SID storage indicator. multipleNID -The CDMA2000 1xRTT Multiple NID storage indicator. homeReg -The CDMA2000 1xRTT Home registration indicator. foreignSIDReg -The CDMA2000 1xRTT SID roamer registration indicator. foreignNIDReg -The CDMA2000 1xRTT NID roamer registration indicator. parameterReg -The CDMA2000 1xRTT Parameter-change registration indicator. powerUpReg -The CDMA2000 1xRTT Power-up registration indicator. registrationPeriod -The CDMA2000 1xRTT Registration period. registrationZone -The CDMA2000 1xRTT Registration zone. totalZone -The CDMA2000 1xRTT Number of registration zones to be retained. zoneTimer -The CDMA2000 1xRTT Zone timer length. -– CellGlobalIdEUTRA -The IE CellGlobalIdEUTRA specifies the Evolved Cell Global Identifier (ECGI), the globally unique identity of a cell in E-UTRA. -CellGlobalIdEUTRA information element --- ASN1START - -CellGlobalIdEUTRA ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellIdentity CellIdentity -} - --- ASN1STOP - -CellGlobalIdEUTRA field descriptions plmn-Identity -Identifies the PLMN of the cell as given by the first PLMN entry in the plmn-IdentityList in SystemInformationBlockType1. cellIdentity -Identity of the cell within the context of the PLMN. -– CellGlobalIdUTRA -The IE CellGlobalIdUTRA specifies the global UTRAN Cell Identifier, the globally unique identity of a cell in UTRA. -CellGlobalIdUTRA information element --- ASN1START - -CellGlobalIdUTRA ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellIdentity BIT STRING (SIZE (28)) -} - --- ASN1STOP - -CellGlobalIdUTRA field descriptions plmn-Identity -Identifies the PLMN of the cell as given by the common PLMN broadcast in the MIB. cellIdentity -UTRA Cell Identifier which is unique within the context of the identified PLMN as defined in TS 25.331 [19]. -– CellGlobalIdGERAN -The IE CellGlobalIdGERAN specifies the Cell Global Identification (CGI), the globally unique identity of a cell in GERAN. -CellGlobalIdGERAN information element --- ASN1START - -CellGlobalIdGERAN ::= SEQUENCE { - plmn-Identity PLMN-Identity, - locationAreaCode BIT STRING (SIZE (16)), - cellIdentity BIT STRING (SIZE (16)) -} - --- ASN1STOP - -CellGlobalIdGERAN field descriptions plmn-Identity -Identifies the PLMN of the cell. locationAreaCode -A fixed length code identifying the location area within a PLMN as defined in TS 23.003 [27]. cellIdentity -Cell Identifier which is unique within the context of the GERAN location area as defined in TS 23.003 [27]. -– CellGlobalIdCDMA2000 -The IE CellGlobalIdCDMA2000 specifies the Cell Global Identification (CGI), the globally unique identity of a cell in CDMA2000. -CellGlobalIdCDMA2000 information element --- ASN1START - -CellGlobalIdCDMA2000 ::= CHOICE { - cellGlobalId1XRTT BIT STRING (SIZE (47)), - cellGlobalIdHRPD BIT STRING (SIZE (128)) -} - --- ASN1STOP - -CellGlobalIdCDMA2000 field descriptions cellGlobalId1XRTT -Unique identifier for a CDMA2000 1xRTT cell, corresponds to BASEID, SID and NID parameters (in that order) defined in C.S0005-A [25]. cellGlobalIdHRPD -Unique identifier for a CDMA2000 HRPD cell, corresponds to SECTOR ID parameter defined in C.S0024-A [26, 14.9]. -– MobilityControlInfo -The IE MobilityControlInfo includes parameters relevant for network controlled mobility to/within EUTRA. -MobilityControlInfo information element --- ASN1START - -MobilityControlInfo ::= SEQUENCE { - targetPhysCellId PhysCellId, - carrierFreq CarrierFreqEUTRA OPTIONAL, -- Cond HO-toEUTRA - carrierBandwidth CarrierBandwidthEUTRA OPTIONAL, -- Cond HO-toEUTRA - additionalSpectrumEmission AdditionalSpectrumEmission OPTIONAL, -- Cond HO-toEUTRA - t304 ENUMERATED { - ms50, ms100, ms150, ms200, ms500, ms1000, - ms2000, spare1}, - newUE-Identity C-RNTI, - radioResourceConfigCommon RadioResourceConfigCommon, - rach-ConfigDedicated RACH-ConfigDedicated OPTIONAL, -- Need OP - ... -} - -CarrierBandwidthEUTRA ::= SEQUENCE { - dl-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100, spare10, - spare9, spare8, spare7, spare6, spare5, - spare4, spare3, spare2, spare1}, - ul-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100, spare10, - spare9, spare8, spare7, spare6, spare5, - spare4, spare3, spare2, spare1} OPTIONAL -- Need OP -} - -CarrierFreqEUTRA ::= SEQUENCE { - dl-CarrierFreq ARFCN-ValueEUTRA, - ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL -- Cond FDD -} - --- ASN1STOP - -MobilityControlInfo field descriptions t304 -Timer T304 as described in section 7.3. ms50 corresponds with 50 ms, ms100 corresponds with 100 ms and so on. dl-Bandwidth -Parameter: Downlink bandwidth, see TS 36.101 [42]. ul-Bandwidth -Parameter: Uplink bandwidth, see TS 36.101 [42, table 5.6-1]. For TDD, the parameter is absent and it is equal to downlink bandwidth. If absent for FDD, apply the same value as applies for the downlink bandwidth. rach-ConfigDedicated -The dedicated random access parameters. If absent the UE applies contention based random access as specified in TS 36.321 [6]. carrierBandwidth -Provides the parameters Downlink bandwidth, and Uplink bandwidth, see TS 36.101 [42]. -Conditional presence Explanation FDD The field is mandatory with default value (the default duplex distance defined for the concerned band, as specified in TS 36.101 [42]) in case of “FDD”; otherwise the field is not present. HO-toEUTRA The field is mandatory present in case of inter-RAT handover to E-UTRA; otherwise the field is optionally present, need ON. -– MobilityParametersCDMA2000 (1xRTT) -The MobilityParametersCDMA2000 contains the parameters provided to the UE for handover and CSFB support,as. defined in C.S0087 [44]. -MobilityParametersCDMA2000 information element --- ASN1START - -MobilityParametersCDMA2000 ::= OCTET STRING - --- ASN1STOP - -– MobilityStateParameters -The IE MobilityStateParameters contains parameters to determine UE mobility state. -MobilityStateParameters information element --- ASN1START - -MobilityStateParameters ::= SEQUENCE { - t-Evaluation ENUMERATED { - s30, s60, s120, s180, s240, spare3, spare2, spare1}, - t-HystNormal ENUMERATED { - s30, s60, s120, s180, s240, spare3, spare2, spare1}, - n-CellChangeMedium INTEGER (1..16), - n-CellChangeHigh INTEGER (1..16) -} - --- ASN1STOP - -MobilityStateParameters field descriptions t-Evaluation -The duration for evaluating criteria to enter mobility states. Corresponds to TCRmax in TS 36.304 [4]. Value in seconds, s30 corresponds to 30 s and so on. t-HystNormal -The additional duration for evaluating criteria to enter normal mobility state. Corresponds to TCRmaxHyst in TS 36.304 [4]. Value in seconds, s30 corresponds to 30 s and so on. n-CellChangeMedium -The number of cell changes to enter medium mobility state. Corresponds to NCR_M in TS 36.304 [4]. n-CellChangeHigh -The number of cell changes to enter high mobility state. Corresponds to NCR_H in TS 36.304 [4]. -– PhysCellId -The IE PhyslCellId is used to indicate the physical layer identity of the cell, as defined in TS 36.211 [21]. -PhysCellId information element --- ASN1START - -PhysCellId ::= INTEGER (0..503) - --- ASN1STOP - -– PhysCellIdRange -The IE PhysCellIdRange is used to encode either a single or a range of physical cell identities. The range is encoded by using a start value and by indicating the number of consecutive physical cell identities (including start) in the range. -PhysCellIdRange information element --- ASN1START - -PhysCellIdRange ::= SEQUENCE { - start PhysCellId, - range ENUMERATED { - n4, n8, n12, n16, n24, n32, n48, n64, n84, - n96, n128, n168, n252, n504, spare2, - spare1} OPTIONAL -- Need OP -} - --- ASN1STOP - -PhysCellIdRange field descriptions start -Indicates the lowest physical cell identity in the range. range -Indicates the number of physical cell identities in the range (including start). Value n4 corresponds with 4, n8 corresponds with 8 and so on. The UE shall apply value 1 in case the field is absent, in which case only the physical cell identity value indicated by start applies. -– PhysCellIdCDMA2000 -The IE PhysCellIdCDMA2000 identifies the PNOffset that represents the "Physical cell identity" in CDMA2000. -PhysCellIdCDMA2000 information element --- ASN1START - -PhysCellIdCDMA2000 ::= INTEGER (0..maxPNOffset) - --- ASN1STOP - -– PhysCellIdGERAN -The IE PhysCellIdGERAN contains the Base Station Identity Code (BSIC). -PhysCellIdGERAN information element --- ASN1START - -PhysCellIdGERAN ::= SEQUENCE { - networkColourCode BIT STRING (SIZE (3)), - baseStationColourCode BIT STRING (SIZE (3)) -} - --- ASN1STOP - -PhysCellIdGERAN field descriptions networkColourCode -Network Colour Code as defined in TS 23.003 [27]. baseStationColourCode -Base station Colour Code as defined in TS 23.003 [27]. -– PhysCellIdentityUTRA-FDD -The IE PhysCellIdUTRA-FDD is used to indicate the physical layer identity of the cell, i.e. the primary scrambling code, as defined in TS 25.331 [19]. -PhysCellIdUTRA-FDD information element --- ASN1START - -PhysCellIdUTRA-FDD ::= INTEGER (0..511) - --- ASN1STOP - -– PhysCellIdUTRA-TDD -The IE PhysCellIdUTRA-TDD is used to indicate the physical layer identity of the cell, i.e. the cell parameters ID (TDD), as specified in TS 25.331 [19]. Also corresponds to the Initial Cell Parameter Assignment in TS 25.223 [46]. -PhysCellIdUTRA-TDD information element --- ASN1START - -PhysCellIdUTRA-TDD ::= INTEGER (0..127) - --- ASN1STOP - -– PLMN-Identity -The IE PLMN-Identity identifies a Public Land Mobile Network. Further information regarding how to set the IE are specified in TS 23.003 [27]. -PLMN-Identity information element --- ASN1START - -PLMN-Identity ::= SEQUENCE { - mcc MCC OPTIONAL, -- Cond MCC - mnc MNC -} - -MCC ::= SEQUENCE (SIZE (3)) OF - MCC-MNC-Digit - -MNC ::= SEQUENCE (SIZE (2..3)) OF - MCC-MNC-Digit - -MCC-MNC-Digit ::= INTEGER (0..9) - - --- ASN1STOP - -PLMN-Identity field descriptions mcc -The first element contains the first MCC digit, the second element the second MCC digit and so on. If the field is absent, it takes the same value as the mcc of the immediately preceding IE PLMN-Identity. See TS 23.003 [27]. mnc -The first element contains the first MNC digit, the second element the second MNC digit and so on. See TS 23.003 [27]. -Conditional presence Explanation MCC This IE is mandatory when PLMN-Identity is included in CellGlobalIdEUTRA, in CellGlobalIdUTRA, in CellGlobalIdGERAN or in RegisteredMME. This IE is also mandatory in the first occurrence of the IE PLMN-Identity within the IE PLMN-IdentityList. Otherwise it is optional, need OP. -– PreRegistrationInfoHRPD --- ASN1START - -PreRegistrationInfoHRPD ::= SEQUENCE { - preRegistrationAllowed BOOLEAN, - preRegistrationZoneId PreRegistrationZoneIdHRPD OPTIONAL, -- cond PreRegAllowed - secondaryPreRegistrationZoneIdList SecondaryPreRegistrationZoneIdListHRPD OPTIONAL -- Need OR -} - -SecondaryPreRegistrationZoneIdListHRPD ::= SEQUENCE (SIZE (1..2)) OF PreRegistrationZoneIdHRPD - -PreRegistrationZoneIdHRPD ::= INTEGER (0..255) - --- ASN1STOP - -PreRegistrationInfoHRPD field descriptions preRegistrationAllowed -TRUE indicates that a UE shall perform a CDMA2000 HRPD pre-registration if the UE does not have a valid / current pre-registration. FALSE indicates that the UE is not allowed to perform CDMA2000 HRPD pre-registration in the current cell. preRegistrationZoneID -Used to control when the UE should re-register. secondaryPreRegistrationZoneIdList -Used to control when the UE should re-register. -Conditional presence Explanation PreRegAllowed The field is mandatory in case the preRegistrationAllowed is set to ‘true’. Otherwise the field is not present and the UE shall delete any existing value for this field. -– Q-RxLevMin -The IE Q-RxLevMin is used to indicate for cell re-selection the required minimum received RSRP level in the (E-UTRA) cell. Corresponds to parameter Qrxlevmin in 36.304 [4]. Actual value Qrxlevmin = IE value * 2 [dBm]. -Q-RxLevMin information element --- ASN1START - -Q-RxLevMin ::= INTEGER (-70..-22) - --- ASN1STOP - -– Q-OffsetRange -The IE Q-OffsetRange is used to indicate a cell or frequency specific offset to be applied when evaluating candidates for cell re-selection or when evaluating triggering conditions for measurement reporting. The value in dB. Value dB-24 corresponds to -24 dB, dB-22 corresponds to -22 dB and so on. -Q- OffsetRange information element --- ASN1START - -Q-OffsetRange ::= ENUMERATED { - dB-24, dB-22, dB-20, dB-18, dB-16, dB-14, - dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3, - dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5, - dB6, dB8, dB10, dB12, dB14, dB16, dB18, - dB20, dB22, dB24} - --- ASN1STOP - -– Q-OffsetRangeInterRAT -The IE Q-OffsetRangeInterRAT is used to indicate a frequency specific offset to be applied when evaluating triggering conditions for measurement reporting. The value in dB. -Q- OffsetRangeInterRAT information element --- ASN1START - -Q-OffsetRangeInterRAT ::= INTEGER (-15..15) - --- ASN1STOP - -– ReselectionThreshold -The IE ReselectionThreshold is used to indicate a threshold for cell reselection. Actual value of threshold in dB = IE value * 2. -ReselectionThreshold information element --- ASN1START - -ReselectionThreshold ::= INTEGER (0..31) - --- ASN1STOP - -– SpeedStateScaleFactors -The IE SpeedStateScaleFactors concerns factors, to be applied when the UE is in medium or high speed state, used for scaling a mobility control related parameter. -SpeedStateScaleFactors information element --- ASN1START - -SpeedStateScaleFactors ::= SEQUENCE { - sf-Medium ENUMERATED {oDot25, oDot5, oDot75, lDot0}, - sf-High ENUMERATED {oDot25, oDot5, oDot75, lDot0} -} --- ASN1STOP - -SpeedStateScaleFactors field descriptions sf-Medium -The concerned mobility control related parameter is multiplied with this factor if the UE is in Medium Mobility state as defined in TS 36.304 [4]. Value oDot25 corresponds to 0.25, oDot5 corresponds to 0.5 , oDot75 corresponds to 0.75 and so on. sf-High -The concerned mobility control related parameter is multiplied with this factor if the UE is in High Mobility state as defined in TS 36.304 [4]. Value oDot25 corresponds to 0.25, oDot5 corresponds to 0.5 , oDot75 corresponds to 0.75 and so on. -– SystemTimeInfoCDMA2000 -The IE SystemTimeInfoCDMA2000 informs the UE about the absolute time in the current cell. The UE uses this absolute time knowledge to derive the CDMA2000 Physical cell identity, expressed as PNOffset, of neighbour CDMA2000 cells. -NOTE: The UE needs the CDMA2000 system time with a certain level of accuracy for performing measurements as well as for communicating with the CDMA2000 network (HRPD or 1xRTT). -SystemTimeInfoCDMA2000 information element --- ASN1START - -SystemTimeInfoCDMA2000 ::= SEQUENCE { - cdma-EUTRA-Synchronisation BOOLEAN, - cdma-SystemTime CHOICE { - synchronousSystemTime BIT STRING (SIZE (39)), - asynchronousSystemTime BIT STRING (SIZE (49)) - } -} - --- ASN1STOP - -SystemTimeInfoCDMA2000 field descriptions cdma-EUTRA-Synchronisation -TRUE indicates that the networks are synchronised i.e. there is no drift in the timing between EUTRA and CDMA2000. FALSE indicates that the networks are not synchronised, i.e. the timing between E-UTRA and CDMA2000 can drift. synchronousSystemTime -CDMA2000 system time corresponding to the SFN boundary at or after the ending boundary of the SI-window in which SystemInformationBlockType8 is transmitted. If synchronized to CDMA2000 system time then the size is 39 bits and the unit is 10 ms based on a 1.2288 Mcps chip rate. asynchronousSystemTime -The CDMA2000 system time corresponding to the SFN boundary at or after the ending boundary of the SI-Window in which SystemInformationBlockType8 is transmitted. If not synchronized then the size is 49 bits and the unit is [8 CDMA2000 chips based on 1.2288 Mcps]. -– TrackingAreaCode -The IE TrackingAreaCode is used to identify a tracking area within the scope of a PLMN, see TS 24.301 [35]. -TrackingAreaCode information element --- ASN1START - -TrackingAreaCode ::= BIT STRING (SIZE (16)) - --- ASN1STOP - -– T-Reselection -The IE T-Reselection concerns the cell reselection timer TreselectionRAT for E-UTRA, UTRA, GERAN or CDMA2000. Value in seconds. -T-Reselection information element --- ASN1START - -T-Reselection ::= INTEGER (0..7) - --- ASN1STOP - - -6.3.5 Measurement information elements -– AllowedMeasBandwidth -The IE AllowedMeasBandwidth is used to indicate the maximum allowed measurement bandwidth on a carrier frequency as defined by the parameter Transmission Bandwidth Configuration "NRB" TS 36.104 [47]. The values mbw6, mbw15, mbw25, mbw50, mbw75, mbw100 indicate 6, 15, 25, 50, 75 and 100 resource blocks respectively. -AllowedMeasBandwidth information element --- ASN1START - -AllowedMeasBandwidth ::= ENUMERATED {mbw6, mbw15, mbw25, mbw50, mbw75, mbw100} - --- ASN1STOP - -– Hysteresis -The IE Hysteresis is a parameter used within the entry and leave condition of an event triggered reporting condition. The actual value is IE value * 0.5 dB. -Hysteresis information element --- ASN1START - -Hysteresis ::= INTEGER (0..30) - --- ASN1STOP - -– MeasConfig -The IE MeasConfig specifies measurements to be performed by the UE, and covers intra-frequency, inter-frequency and inter-RAT mobility as well as configuration of measurement gaps. -MeasConfig information element --- ASN1START - -MeasConfig ::= SEQUENCE { - -- Measurement objects - measObjectToRemoveList MeasObjectToRemoveList OPTIONAL, -- Need ON - measObjectToAddModList MeasObjectToAddModList OPTIONAL, -- Need ON - -- Reporting configurations - reportConfigToRemoveList ReportConfigToRemoveList OPTIONAL, -- Need ON - reportConfigToAddModList ReportConfigToAddModList OPTIONAL, -- Need ON - -- Measurement identities - measIdToRemoveList MeasIdToRemoveList OPTIONAL, -- Need ON - measIdToAddModList MeasIdToAddModList OPTIONAL, -- Need ON - -- Other parameters - quantityConfig QuantityConfig OPTIONAL, -- Need ON - measGapConfig MeasGapConfig OPTIONAL, -- Need ON - s-Measure RSRP-Range OPTIONAL, -- Need ON - preRegistrationInfoHRPD PreRegistrationInfoHRPD OPTIONAL, -- Need OP - speedStatePars CHOICE { - release NULL, - setup SEQUENCE { - mobilityStateParameters MobilityStateParameters, - timeToTrigger-SF SpeedStateScaleFactors - } - } OPTIONAL, -- Need ON - ... -} - -MeasIdToRemoveList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasId - -MeasObjectToRemoveList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectId - -ReportConfigToRemoveList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigId - --- ASN1STOP - -MeasConfig field descriptions measObjectToRemoveList -List of measurement objects to remove. measObjectId -Used to identify a measurement object configuration. measObject -Specifies measurement object configurations for EUTRA, UTRA, GERAN, or CDMA2000 measurements. reportConfigToRemoveList -List of measurement reporting configurations to remove. reportConfigId -Used to identify a measurement reporting configuration. reportConfig -Specifies measurement reporting configurations for EUTRA, UTRA, GERAN, or CDMA2000 measurements. measIdToRemoveList -List of measurement identities to remove. measGapConfig -Used to setup and release measurement gaps. s-Measure -Serving cell quality threshold controlling whether or not the UE is required to perform measurements of intra-frequency, inter-frequency and inter-RAT neighbouring cells. Value “0” indicates to disable s-Measure. PreRegistrationInfoHRPD -The CDMA2000 HRPD Pre-Registration Information tells the UE if it should pre-register with the CDMA2000 HRPD network and identifies the Pre-registration zone to the UE. timeToTrigger-SF -The timeToTrigger in ReportConfigEUTRA and in ReportConfigInterRAT are multiplied with the scaling factor applicable for the UE’s speed state. -– MeasGapConfig -The IE MeasGapConfig specifies the measurement gap configuration and controls setup/ release of measurement gaps. -MeasGapConfig information element --- ASN1START - -MeasGapConfig ::= CHOICE { - release NULL, - setup SEQUENCE { - gapOffset CHOICE { - gp0 INTEGER (0..39), - gp1 INTEGER (0..79), - ... - } - } -} - --- ASN1STOP - -MeasGapConfig field descriptions gapOffset -Value gapOffset of gp0 corresponds to gap offset of Gap Pattern Id “0” with MGRP = 40ms, gapOffset of gp1 corresponds to gap offset of Gap Pattern Id “1” with MGRP = 80ms. Also used to specify the measurement gap pattern to be applied, as defined in TS 36.133 [16]. -– MeasId -The IE MeasId is used to identify a measurement configuration, i.e., linking of a measurement object and a reporting configuration. -MeasId information element --- ASN1START - -MeasId ::= INTEGER (1..maxMeasId) - --- ASN1STOP - -– MeasIdToAddModList -The IE MeasIdToAddModList concerns a list of measurement identities to add or modify, with for each entry the measId, the associated measObjectId and the associated reportConfigId. -MeasIdToAddModList information element --- ASN1START - -MeasIdToAddModList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasIdToAddMod - -MeasIdToAddMod ::= SEQUENCE { - measId MeasId, - measObjectId MeasObjectId, - reportConfigId ReportConfigId -} - --- ASN1STOP - -– MeasObjectCDMA2000 -The IE MeasObjectCDMA2000 specifies information applicable for inter-RAT CDMA2000 neighbouring cells. -MeasObjectCDMA2000 information element --- ASN1START - -MeasObjectCDMA2000 ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - carrierFreq CarrierFreqCDMA2000, - searchWindowSize INTEGER (0..15) OPTIONAL, -- Need ON - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CellsToAddModListCDMA2000 OPTIONAL, -- Need ON - cellForWhichToReportCGI PhysCellIdCDMA2000 OPTIONAL, -- Need ON - ... -} - -CellsToAddModListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModCDMA2000 - -CellsToAddModCDMA2000 ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdCDMA2000 -} - --- ASN1STOP - -MeasObjectCDMA2000 field descriptions cdma2000-Type -The type of CDMA2000 network: CDMA2000 1xRTT or CDMA2000 HRPD. carrierInfo -Identifies CDMA2000 carrier frequency for which this configuration is valid. searchWindowSize -Provides the search window size to be used by the UE for the neighbouring pilot, see C.S0005-A [25]. cellsToRemoveList -List of cells to remove from the neighbouring cell list. cellsToAddModList -List of cells to add/ modify in the neighbouring cell list. cellIndex -Entry index in the neighbouring cell list. physCellId -CDMA2000 Physical cell identity of a cell in neighbouring cell list expressed as PNOffset. -– MeasObjectEUTRA -The IE MeasObjectEUTRA specifies information applicable for intra-frequency or inter-frequency EUTRA neighbouring cells. -MeasObjectEUTRA information element --- ASN1START - -MeasObjectEUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueEUTRA, - allowedMeasBandwidth AllowedMeasBandwidth, - presenceAntennaPort1 PresenceAntennaPort1, - neighCellConfig NeighCellConfig, - offsetFreq Q-OffsetRange DEFAULT dB0, - -- Neighbour cell list - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CellsToAddModList OPTIONAL, -- Need ON - -- Black list - blackCellsToRemoveList CellIndexList OPTIONAL, -- Need ON - blackCellsToAddModList BlackCellsToAddModList OPTIONAL, -- Need ON - cellForWhichToReportCGI PhysCellId OPTIONAL, -- Need ON - ... -} - -CellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddMod - -CellsToAddMod ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellId, - cellIndividualOffset Q-OffsetRange -} - -BlackCellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF BlackCellsToAddMod - -BlackCellsToAddMod ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellIdRange PhysCellIdRange -} - --- ASN1STOP - -MeasObjectEUTRA field descriptions carrierFreq -Identifies EUTRA carrier frequency for which this configuration is valid. offsetFreq -Offset value applicable to the carrier frequency. Value dB-24 corresponds to -24 dB, dB-22 corresponds to -22 dB and so on. cellsToRemoveList -List of cells to remove from the neighbouring cell list. cellsToAddModList -List of cells to add/ modify in the neighbouring cell list. cellIndex -Entry index in the neighbouring cell list. An entry may concern a range of cells, in which case this value applies to the entire range. physCellId -Physical cell identity of a cell in neighbouring cell list. cellIndividualOffset -Cell individual offset applicable to a specific neighbouring cell. Value dB-24 corresponds to -24 dB, dB-22 corresponds to -22 dB and so on. blackCellsToRemoveList -List of cells to remove from the black list of cells. blackCellsToAddMoList -List of cells to add/ modify in the black list of cells. physCellIdRange -Physical cell identity or a range of physical cell identities of cells in the black list. -– MeasObjectGERAN -The IE MeasObjectGERAN specifies information applicable for inter-RAT GERAN neighbouring frequencies. -MeasObjectGERAN information element --- ASN1START - -MeasObjectGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - ncc-Permitted BIT STRING(SIZE (8)) DEFAULT '11111111'B, - cellForWhichToReportCGI PhysCellIdGERAN OPTIONAL, -- Need ON - ... -} - --- ASN1STOP - -MeasObjectGERAN field descriptions ncc-Permitted -Field encoded as a bit map, where bit N is set to "0" if a BCCH carrier with NCC = N-1 is not permitted for monitoring and set to "1" if a BCCH carrier with NCC = N-1 is permitted for monitoring; N = 1 to 8; bit 1 of the bitmap is the leading bit of the bit string. -– MeasObjectId -The IE MeasObjectId used to identify a measurement object configuration. -MeasObjectId information element --- ASN1START - -MeasObjectId ::= INTEGER (1..maxObjectId) - --- ASN1STOP - -– MeasObjectToAddModList -The IE MeasObjectToAddModList concerns a list of measurement objects to add or modify -MeasObjectToAddModList information element --- ASN1START - -MeasObjectToAddModList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectToAddMod - -MeasObjectToAddMod ::= SEQUENCE { - measObjectId MeasObjectId, - measObject CHOICE { - measObjectEUTRA MeasObjectEUTRA, - measObjectUTRA MeasObjectUTRA, - measObjectGERAN MeasObjectGERAN, - measObjectCDMA2000 MeasObjectCDMA2000, - ... - } -} - --- ASN1STOP - -– MeasObjectUTRA -The IE MeasObjectUTRA specifies information applicable for inter-RAT UTRA neighbouring cells. -MeasObjectUTRA information element --- ASN1START - -MeasObjectUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CHOICE { - cellsToAddModListUTRA-FDD CellsToAddModListUTRA-FDD, - cellsToAddModListUTRA-TDD CellsToAddModListUTRA-TDD - } OPTIONAL, -- Need ON - cellForWhichToReportCGI CHOICE { - utra-FDD PhysCellIdUTRA-FDD, - utra-TDD PhysCellIdUTRA-TDD - } OPTIONAL, -- Need ON - ... -} - -CellsToAddModListUTRA-FDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-FDD - -CellsToAddModUTRA-FDD ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdUTRA-FDD -} - -CellsToAddModListUTRA-TDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-TDD - -CellsToAddModUTRA-TDD ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdUTRA-TDD -} - --- ASN1STOP - -MeasObjectUTRA field descriptions carrierFreq -Identifies UTRA carrier frequency for which this configuration is valid. cellsToRemoveList -List of cells to remove from the neighbouring cell list. cellsToAddModListUTRA-FDD -List of UTRA FDD cells to add/ modify in the neighbouring cell list. cellsToAddModListUTRA-TDD -List of UTRA TDD cells to add/modify in the neighbouring cell list. cellIndex -Entry index in the neighbouring cell list. -– MeasResults -The IE MeasResults covers measured results for intra-frequency, inter-frequency and inter- RAT mobility. -MeasResults information element --- ASN1START - -MeasResults ::= SEQUENCE { - measId MeasId, - measResultServCell SEQUENCE { - rsrpResult RSRP-Range, - rsrqResult RSRQ-Range - }, - measResultNeighCells CHOICE { - measResultListEUTRA MeasResultListEUTRA, - measResultListUTRA MeasResultListUTRA, - measResultListGERAN MeasResultListGERAN, - measResultsCDMA2000 MeasResultsCDMA2000, - ... - } OPTIONAL, - ... -} - -MeasResultListEUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultEUTRA - -MeasResultEUTRA ::= SEQUENCE { - physCellId PhysCellId, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdEUTRA, - trackingAreaCode TrackingAreaCode, - plmn-IdentityList PLMN-IdentityList2 OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - rsrpResult RSRP-Range OPTIONAL, - rsrqResult RSRQ-Range OPTIONAL, - ... - } -} - -MeasResultListUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultUTRA - -MeasResultUTRA ::= SEQUENCE { - physCellId CHOICE { - fdd PhysCellIdUTRA-FDD, - tdd PhysCellIdUTRA-TDD - }, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdUTRA, - locationAreaCode BIT STRING (SIZE (16)) OPTIONAL, - routingAreaCode BIT STRING (SIZE (8)) OPTIONAL, - plmn-IdentityList PLMN-IdentityList2 OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - utra-RSCP INTEGER (-5..91) OPTIONAL, - utra-EcN0 INTEGER (0..49) OPTIONAL, - ... - } -} - -MeasResultListGERAN ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultGERAN - -MeasResultGERAN ::= SEQUENCE { - carrierFreq CarrierFreqGERAN, - physCellId PhysCellIdGERAN, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdGERAN, - routingAreaCode BIT STRING (SIZE (8)) OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - rssi INTEGER (0..63), - ... - } -} - -MeasResultsCDMA2000 ::= SEQUENCE { - preRegistrationStatusHRPD BOOLEAN, - measResultListCDMA2000 MeasResultListCDMA2000 -} - -MeasResultListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultCDMA2000 - -MeasResultCDMA2000 ::= SEQUENCE { - physCellId PhysCellIdCDMA2000, - cgi-Info CellGlobalIdCDMA2000 OPTIONAL, - measResult SEQUENCE { - pilotPnPhase INTEGER (0..32767) OPTIONAL, - pilotStrength INTEGER (0..63), - ... - } -} - -PLMN-IdentityList2 ::= SEQUENCE (SIZE (1..5)) OF PLMN-Identity - --- ASN1STOP - -MeasResults field descriptions measId -Identifies the measurement identity for which the reporting is being performed. measResultServCell -Measured result of the serving cell. measResultListEUTRA -List of measured results for the maximum number of reported best cells for an EUTRA measurement identity. rsrpResult -Measured RSRP result of an EUTRA cell. -The rsrpResult is only reported if configured by the eNB. rsrqResult -Measured RSRQ result of an EUTRA cell. -The rsrqResult is only reported if configured by the eNB. measResultListUTRA -List of measured results for the maximum number of reported best cells for a UTRA measurement identity. measResultListGERAN -List of measured results for the maximum number of reported best cells or frequencies for a GERAN measurement identity. measResultsCDMA2000 -Contains the CDMA2000 HRPD pre-registration status and the list of CDMA2000 measurements. preRegistrationStatusHRPD -Set to TRUE if the UE is currently pre-registered with CDMA2000 HRPD. Otherwise set to FALSE. This can be ignored by the eNB for CDMA2000 1xRTT. measResultListCDMA2000 -List of measured results for the maximum number of reported best cells for a CDMA2000 measurement identity. measResult -Measured result of an EUTRA cell; -Measured result of a UTRA cell; -Measured result of a GERAN cell or frequency; or -Measured result of a CDMA2000 cell. utra-RSCP -According to CPICH_RSCP in TS 25.133 [29] for FDD and P-CCPCH_RSCP in TS 25.123 [30] for TDD. Thirty-one spare values. utra-EcN0 -According to CPICH_Ec/No in TS 25.133 [29] for FDD. Fourteen spare values. The field is not present for TDD. rssi -GERAN Carrier RSSI. RXLEV is mapped to a value between 0 and 63, TS 45.008 [28]. When mapping the RXLEV value to the RSSI bit string, the first/leftmost bit of the bit string contains the most significant bit. locationAreaCode -A fixed length code identifying the location area within a PLMN, as defined in TS 23.003 [27]. routingAreaCode -The RAC identity read from broadcast information, as defined in TS 23.003 [27]. plmn-IdentityList -The list of PLMN Identity read from broadcast information when the multiple PLMN Identities are broadcast. This field contains the list of identities starting from the second entry of PLMN Identities in the broadcast information. pilotPnPhase -Indicates the arrival time of a CDMA2000 pilot, measured relative to the UE’s time reference in units of PN chips, see C.S0005-A [25]. This information is used in SRVCC handover procedure to CDMA2000 1xRTT. pilotStrength -CDMA2000 Pilot Strength, the ratio of pilot power to total power in the signal bandwidth of a CDMA2000 Forward Channel. See C.S0005-A [25] for CDMA2000 1xRTT and C.S0024-A [26] for CDMA2000 HRPD. -– QuantityConfig -The IE QuantityConfig specifies the measurement quantities and layer 3 filtering coefficients for E-UTRA and inter-RAT measurements. -QuantityConfig information element --- ASN1START - -QuantityConfig ::= SEQUENCE { - quantityConfigEUTRA QuantityConfigEUTRA OPTIONAL, -- Need ON - quantityConfigUTRA QuantityConfigUTRA OPTIONAL, -- Need ON - quantityConfigGERAN QuantityConfigGERAN OPTIONAL, -- Need ON - quantityConfigCDMA2000 QuantityConfigCDMA2000 OPTIONAL, -- Need ON - ... -} - -QuantityConfigEUTRA ::= SEQUENCE { - filterCoefficientRSRP FilterCoefficient DEFAULT fc4, - filterCoefficientRSRQ FilterCoefficient DEFAULT fc4 -} - -QuantityConfigUTRA ::= SEQUENCE { - measQuantityUTRA-FDD ENUMERATED {cpich-RSCP, cpich-EcN0}, - measQuantityUTRA-TDD ENUMERATED {pccpch-RSCP}, - filterCoefficient FilterCoefficient DEFAULT fc4 -} - -QuantityConfigGERAN ::= SEQUENCE { - measQuantityGERAN ENUMERATED {rssi}, - filterCoefficient FilterCoefficient DEFAULT fc2 -} - -QuantityConfigCDMA2000 ::= SEQUENCE { - measQuantityCDMA2000 ENUMERATED {pilotStrength, pilotPnPhaseAndPilotStrength} -} - --- ASN1STOP - -QuantityConfig field descriptions quantityConfigEUTRA -Specifies filter configurations for EUTRA measurements. quantityConfigUTRA -Specifies quantity and filter configurations for UTRA measurements. measQuantityUTRA -Measurement quantity used for UTRA measurements. quantityConfigGERAN -Specifies quantity and filter configurations for GERAN measurements. measQuantityGERAN -Measurement quantity used for GERAN measurements. quantityConfigCDMA2000 -Specifies quantity configurations for CDMA2000 measurements. measQuantityCDMA2000 -Measurement quantity used for CDMA2000 measurements. pilotPnPhaseAndPilotStrength is only applicable for MeasObjectCDMA2000 of cdma2000-Type = type1XRTT. filterCoefficientRSRP -Specifies the filtering coefficient used for RSRP. filterCoefficientRSRQ -Specifies the filtering coefficient used for RSRQ. -– ReportConfigEUTRA -The IE ReportConfigEUTRA specifies criteria for triggering of an EUTRA measurement reporting event. The EUTRA measurement reporting events are labelled AN with N equal to 1, 2 and so on. -Event A1: Serving becomes better than absolute threshold; -Event A2: Serving becomes worse than absolute threshold; -Event A3: Neighbour becomes amount of offset better than serving; -Event A4: Neighbour becomes better than absolute threshold; -Event A5: Serving becomes worse than absolute threshold1 AND Neighbour becomes better than another absolute threshold2. -ReportConfigEUTRA information element --- ASN1START - -ReportConfigEUTRA ::= SEQUENCE { - triggerType CHOICE { - event SEQUENCE { - eventId CHOICE { - eventA1 SEQUENCE { - a1-Threshold ThresholdEUTRA - }, - eventA2 SEQUENCE { - a2-Threshold ThresholdEUTRA - }, - eventA3 SEQUENCE { - a3-Offset INTEGER (-30..30), - reportOnLeave BOOLEAN - }, - eventA4 SEQUENCE { - a4-Threshold ThresholdEUTRA - }, - eventA5 SEQUENCE { - a5-Threshold1 ThresholdEUTRA, - a5-Threshold2 ThresholdEUTRA - }, - ... - }, - hysteresis Hysteresis, - timeToTrigger TimeToTrigger - }, - periodical SEQUENCE { - purpose ENUMERATED { - reportStrongestCells, reportCGI} - } - }, - triggerQuantity ENUMERATED {rsrp, rsrq}, - reportQuantity ENUMERATED {sameAsTriggerQuantity, both}, - maxReportCells INTEGER (1..maxCellReport), - reportInterval ReportInterval, - reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, - ... -} - -ThresholdEUTRA ::= CHOICE{ - threshold-RSRP RSRP-Range, - threshold-RSRQ RSRQ-Range -} - --- ASN1STOP - -ReportConfigEUTRA field descriptions eventId -Choice of EUTRA event triggered reporting criteria. aN-ThresholdM -Threshold to be used in EUTRA measurement report triggering condition for event number aN. If multiple thresholds are defined for event number aN, the thresholds are differentiated by M. a3-Offset -Offset value to be used in EUTRA measurement report triggering condition for event a3. The actual value is IE value * 0.5 dB. reportOnLeave -Indicates whether or not the UE shall initiate the measurement reporting procedure when the leaving condition is met for a cell in cellsTriggeredList, as specified in 5.5.4.1. triggerQuantity -The quantities used to evaluate the triggering condition for the event. The values rsrp and rsrq correspond to Reference Signal Received Power (RSRP) and Reference Signal Received Quality (RSRQ), see TS 36.214 [48]. timeToTrigger -Time during which specific criteria for the event needs to be met in order to trigger a measurement report. reportQuantity -The quantities to be included in the measurement report. The value both means that both the rsrp and rsrq quantities are to be included in the measurement report. maxReportCells -Max number of cells, excluding the serving cell, to include in the measurement report. reportAmount -Number of measurement reports applicable for triggerType ‘event’ as well as for triggerType ‘periodical’. In case purpose is set to ‘reportCGI’ only value 1 applies. ThresholdEUTRA -For RSRP: RSRP based threshold for event evaluation. -For RSRQ: RSRQ based threshold for event evaluation. -– ReportConfigId -The IE ReportConfigId is used to identify a measurement reporting configuration. -ReportConfigId information element --- ASN1START - -ReportConfigId ::= INTEGER (1..maxReportConfigId) - --- ASN1STOP - -– ReportConfigInterRAT -The IE ReportConfigInterRAT specifies criteria for triggering of an inter-RAT measurement reporting event. The inter-RAT measurement reporting events are labelled BN with N equal to 1, 2 and so on. -Event B1: Neighbour becomes better than absolute threshold; -Event B2: Serving becomes worse than absolute threshold1 AND Neighbour becomes better than another absolute threshold2. -The b1 and b2 event thresholds for CDMA2000 are the CDMA2000 pilot detection thresholds are expressed as an unsigned binary number equal to [-2 x 10 log 10 Ec/Io] in units of 0.5dB, see C.S0005-A [25] for details. -ReportConfigInterRAT information element --- ASN1START - -ReportConfigInterRAT ::= SEQUENCE { - triggerType CHOICE { - event SEQUENCE { - eventId CHOICE { - eventB1 SEQUENCE { - b1-Threshold CHOICE { - b1-ThresholdUTRA ThresholdUTRA, - b1-ThresholdGERAN ThresholdGERAN, - b1-ThresholdCDMA2000 ThresholdCDMA2000 - } - }, - eventB2 SEQUENCE { - b2-Threshold1 ThresholdEUTRA, - b2-Threshold2 CHOICE { - b2-Threshold2UTRA ThresholdUTRA, - b2-Threshold2GERAN ThresholdGERAN, - b2-Threshold2CDMA2000 ThresholdCDMA2000 - } - }, - ... - }, - hysteresis Hysteresis, - timeToTrigger TimeToTrigger - }, - periodical SEQUENCE { - purpose ENUMERATED { - reportStrongestCells, - reportStrongestCellsForSON, - reportCGI} - } - }, - maxReportCells INTEGER (1..maxCellReport), - reportInterval ReportInterval, - reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, - ... -} - -ThresholdUTRA ::= CHOICE{ - utra-RSCP INTEGER (-5..91), - utra-EcN0 INTEGER (0..49) -} - -ThresholdGERAN ::= INTEGER (0..63) - -ThresholdCDMA2000 ::= INTEGER (0..63) - --- ASN1STOP - -ReportConfigInterRAT field descriptions eventId -Choice of inter-RAT event triggered reporting criteria. bN-ThresholdM -Threshold to be used in inter RAT measurement report triggering condition for event number bN. If multiple thresholds are defined for event number bN, the thresholds are differentiated by M. timeToTrigger -Time during which specific criteria for the event needs to be met in order to trigger a measurement report. Purpose -reportStrongestCellsForSON applies only in case reportConfig is linked to a measObject set to ‘measObjectUTRA’ or ‘measObjectCDMA2000’. maxReportCells -Max number of cells, excluding the serving cell, to include in the measurement report. In case purpose is set to ‘reportStrongestCellsForSON’ only value 1 applies. reportAmount -Number of measurement reports applicable for triggerType ‘event’ as well as for triggerType ‘periodical’. In case purpose is set to ‘reportCGI’ or ‘reportStrongestCellsForSON’ only value 1 applies. ThresholdUTRA -utra-RSCP corresponds to CPICH_RSCP in TS 25.133 [29] for FDD and P-CCPCH_RSCP in TS 25.123 [30] for TDD. utra-EcN0 corresponds to CPICH_Ec/No in TS 25.133 [29] for FDD, and is not applicable for TDD. -For utra-RSCP: The actual value is IE value – 115 dBm. Integer value according to mapping table in TS 25.133 [29] and TS 25.123 [30], for FDD and TDD, respectively. -For utra-EcN0: The actual value is (IE value – 49)/2 dB. Integer value according to mapping table in TS 25.133 [29]. ThresholdGERAN -The actual value is IE value – 110 dBm. . Integer value according to mapping table in TS 45.008 [28]. -– ReportConfigToAddModList -The IE ReportConfigToAddModList concerns a list of reporting configurations to add or modify -ReportConfigToAddModList information element --- ASN1START - -ReportConfigToAddModList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigToAddMod - -ReportConfigToAddMod ::= SEQUENCE { - reportConfigId ReportConfigId, - reportConfig CHOICE { - reportConfigEUTRA ReportConfigEUTRA, - reportConfigInterRAT ReportConfigInterRAT - } -} - - --- ASN1STOP - -– ReportInterval -The ReportInterval indicates the interval between periodical reports. The ReportInterval is applicable if the UE performs periodical reporting (i.e. when reportAmount exceeds 1), for triggerType ‘event’ as well as for triggerType ‘periodical’. Value ms120 corresponds with 120 ms, ms240 corresponds with 240 ms and so on, while value min1 corresponds with 1 min, min6 corresponds with 6 min and so on. -ReportInterval information element --- ASN1START - -ReportInterval ::= ENUMERATED { - ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, - min1, min6, min12, min30, min60, spare3, spare2, spare1} - --- ASN1STOP - -– RSRP-Range -The IE RSRP-Range specifies the value range used in RSRP measurements and thresholds. Integer value for RSRP according to mapping table in TS 36.133 [16]. -RSRP-Range information element --- ASN1START - -RSRP-Range ::= INTEGER(0..97) - --- ASN1STOP - -– RSRQ-Range -The IE RSRQ-Range specifies the value range used in RSRQ measurements and thresholds. Integer value for RSRQ according to mapping table in TS 36.133 [16]. -RSRQ-Range information element --- ASN1START - -RSRQ-Range ::= INTEGER(0..34) - --- ASN1STOP - -– TimeToTrigger -The IE TimeToTrigger specifies the value range used for time to trigger parameter, which concerns the time during which specific criteria for the event needs to be met in order to trigger a measurement report. Value ms0 corresponds to 0 ms, ms40 corresponds to 40 ms, and so on. -TimeToTrigger information element --- ASN1START - -TimeToTrigger ::= ENUMERATED { - ms0, ms40, ms64, ms80, ms100, ms128, ms160, ms256, - ms320, ms480, ms512, ms640, ms1024, ms1280, ms2560, - ms5120} - --- ASN1STOP - -6.3.6 Other information elements -– C-RNTI -The IE C-RNTI identifies a UE having a RRC connection within a cell. -C-RNTI information element --- ASN1START - -C-RNTI ::= BIT STRING (SIZE (16)) - --- ASN1STOP - -– DedicatedInfoCDMA2000 -The DedicatedInfoCDMA2000 is used to transfer UE specific CDMA2000 information between the network and the UE. The RRC layer is transparent for this information. -DedicatedInfoCDMA2000 information element --- ASN1START - -DedicatedInfoCDMA2000 ::= OCTET STRING - --- ASN1STOP - -– DedicatedInfoNAS -The IE DedicatedInfoNAS is used to transfer UE specific NAS layer information between the network and the UE. The RRC layer is transparent for this information. -DedicatedInfoNAS information element --- ASN1START - -DedicatedInfoNAS ::= OCTET STRING - --- ASN1STOP - -– FilterCoefficient -The IE FilterCoefficient specifies the measurement filtering coefficient. Value fc0 corresponds to k = 0, fc1 corresponds to k = 1, and so on. -FilterCoefficient information element --- ASN1START - -FilterCoefficient ::= ENUMERATED { - fc0, fc1, fc2, fc3, fc4, fc5, - fc6, fc7, fc8, fc9, fc11, fc13, - fc15, fc17, fc19, spare1, ...} - --- ASN1STOP - -– MMEC -The IE MMEC identifies an MME within the scope of an MME Group within a PLMN, see TS 23.003 [27]. -MMEC information element --- ASN1START - -MMEC ::= BIT STRING (SIZE (8)) - --- ASN1STOP - - -– NeighCellConfig -The IE NeighCellConfig is used to provide the information related to MBSFN and TDD UL/DL configuration of neighbour cells. -NeighCellConfig information element --- ASN1START - -NeighCellConfig ::= BIT STRING (SIZE (2)) - --- ASN1STOP - -NeighCellConfig field descriptions neighCellConfig -Provides information related to MBSFN and TDD UL/DL configuration of neighbour cells of this frequency -00: Not all neighbour cells have the same MBSFN subframe allocation as serving cell -10: The MBSFN subframe allocations of all neighbour cells are identical to or subsets of that in the serving cell -01: No MBSFN subframes are present in all neighbour cells -11: Different UL/DL allocation in neighbouring cells for TDD compared to the serving cell -For TDD, 00, 10 and 01 are only used for same UL/DL allocation in neighbouring cells compared to the serving cell. -– RAND-CDMA2000 (1xRTT) -The RAND-CDMA2000 concerns a random value, generated by the eNB, to be passed to the CDMA2000 upper layers. -RAND-CDMA2000 information element --- ASN1START - -RAND-CDMA2000 ::= BIT STRING (SIZE (32)) - --- ASN1STOP - -– RAT-Type -The IE RAT-Type is used to indicate the radio access technology (RAT), including EUTRA, of the requested/ transferred UE capabilities. -RAT-Type information element --- ASN1START - -RAT-Type ::= ENUMERATED { - eutra, utra, geran-cs, geran-ps, cdma2000-1XRTT, - spare3, spare2, spare1, ...} - --- ASN1STOP - -– RRC-TransactionIdentifier -The IE RRC-TransactionIdentifier is used, together with the message type, for the identification of an RRC procedure (transaction). -RRC-TransactionIdentifier information element --- ASN1START - -RRC-TransactionIdentifier ::= INTEGER (0..3) - --- ASN1STOP - -– S-TMSI -The IE S-TMSI contains an S-Temporary Mobile Subscriber Identity, a temporary UE identity provided by the EPC which uniquely identifies the UE within the tracking area, see TS 23.003 [27]. -S-TMSI information element --- ASN1START - -S-TMSI ::= SEQUENCE { - mmec MMEC, - m-TMSI BIT STRING (SIZE (32)) -} - --- ASN1STOP - -S-TMSI field descriptions m-TMSI -The first/leftmost bit of the bit string contains the most significant bit of the M-TMSI. -– UE-CapabilityRAT-ContainerList -The IE UE-CapabilityRAT-ContainerList contains list of containers, one for each RAT for which UE capabilities are transferred, if any. -UE-CapabilityRAT-ContainerList information element --- ASN1START - -UE-CapabilityRAT-ContainerList ::=SEQUENCE (SIZE (0..maxRAT-Capabilities)) OF UE-CapabilityRAT-Container - -UE-CapabilityRAT-Container ::= SEQUENCE { - rat-Type RAT-Type, - ueCapabilityRAT-Container OCTET STRING -} - --- ASN1STOP - -UECapabilityRAT-ContainerList field descriptions ueCapabilityRAT-Container -Container for the UE capabilities of the indicated RAT. The encoding is defined in the specification of each RAT: -For EUTRA: the encoding of UE capabilities is defined in IE UE-EUTRA-Capability. -For UTRA: the octet string contains the INTER RAT HANDOVER INFO message defined in TS 25.331 [19]. -For GERAN CS: the octet string contains the concatenated string of the Mobile Station Classmark 2 and Mobile Station Classmark 3. The first 5 octets correspond to Mobile Station Classmark 2 and the following octets correspond to Mobile Station Classmark 3. The Mobile Station Classmark 2 is formatted as 'TLV' and is coded in the same way as the Mobile Station Classmark 2 information element in TS 24.008 [49]. The first octet is the Mobile station classmark 2 IEI and its value shall be set to 33H. The second octet is the Length of mobile station classmark 2 and its value shall be set to 3. The octet 3 contains the first octet of the value part of the Mobile Station Classmark 2 information element, the octet 4 contains the second octet of the value part of the Mobile Station Classmark 2 information element and so on. For each of these octets, the first/ leftmost/ most significant bit of the octet contains b8 of the corresponding octet of the Mobile Station Classmark 2. The Mobile Station Classmark 3 is formatted as 'V' and is coded in the same way as the value part in the Mobile station classmark 3 information element in TS 24.008 [49]. The sixth octet of this octet string contains octet 1 of the value part of Mobile station classmark 3, the seventh of octet of this octet string contains octet 2 of the value part of Mobile station classmark 3 and so on. Note. -For GERAN PS: the encoding of UE capabilities is formatted as 'V' and is coded in the same way as the value part in the MS Radio Access Capability information element in TS 36.306 [5]. -For CDMA2000-1XRTT: the octet string contains the A21 Mobile Subscription Information and the encoding of this is defined in A.S0008 [33]. The A21 Mobile Subscription Information contains the supported CDMA2000 1xRTT band class and band sub-class information. NOTE: The value part is specified by means of CSN.1, which encoding results in a bit string, to which final padding may be appended up to the next octet boundary TS 24.008 [49]. The first/ leftmost bit of the CSN.1 bit string is placed in the first/ leftmost/ most significant bit of the first octet. This continues until the last bit of the CSN.1 bit string, which is placed in the last/ rightmost/ least significant bit of the last octet. -– UE-EUTRA-Capability -The IE UE-EUTRA-Capability is used to convey the E-UTRA UE Radio Access Capability Parameters, see TS 36.306 [5], to the network. The IE UE-EUTRA-Capability is transferred in E-UTRA or in another RAT. -UE-EUTRA-Capability information element --- ASN1START - -UE-EUTRA-Capability ::= SEQUENCE { - accessStratumRelease AccessStratumRelease, - ue-Category INTEGER (1..5), - pdcp-Parameters PDCP-Parameters, - phyLayerParameters PhyLayerParameters, - rf-Parameters RF-Parameters, - measParameters MeasParameters, - featureGroupIndicators BIT STRING (SIZE (32)) OPTIONAL, - interRAT-Parameters SEQUENCE { - utraFDD IRAT-ParametersUTRA-FDD OPTIONAL, - utraTDD128 IRAT-ParametersUTRA-TDD128 OPTIONAL, - utraTDD384 IRAT-ParametersUTRA-TDD384 OPTIONAL, - utraTDD768 IRAT-ParametersUTRA-TDD768 OPTIONAL, - geran IRAT-ParametersGERAN OPTIONAL, - cdma2000-HRPD IRAT-ParametersCDMA2000-HRPD OPTIONAL, - cdma2000-1xRTT IRAT-ParametersCDMA2000-1XRTT OPTIONAL - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -AccessStratumRelease ::= ENUMERATED { - rel8, spare7, spare6, spare5, spare4, spare3, - spare2, spare1, ...} - -PDCP-Parameters ::= SEQUENCE { - supportedROHC-Profiles SEQUENCE { - profile0x0001 BOOLEAN, - profile0x0002 BOOLEAN, - profile0x0003 BOOLEAN, - profile0x0004 BOOLEAN, - profile0x0006 BOOLEAN, - profile0x0101 BOOLEAN, - profile0x0102 BOOLEAN, - profile0x0103 BOOLEAN, - profile0x0104 BOOLEAN - }, - maxNumberROHC-ContextSessions ENUMERATED { - cs2, cs4, cs8, cs12, cs16, cs24, cs32, - cs48, cs64, cs128, cs256, cs512, cs1024, - cs16384, spare2, spare1} DEFAULT cs16, - ... -} - -PhyLayerParameters ::= SEQUENCE { - ue-TxAntennaSelectionSupported BOOLEAN, - ue-SpecificRefSigsSupported BOOLEAN -} - -RF-Parameters ::= SEQUENCE { - supportedBandListEUTRA SupportedBandListEUTRA -} - -SupportedBandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA - -SupportedBandEUTRA ::= SEQUENCE { - bandEUTRA INTEGER (1..64), - halfDuplex BOOLEAN -} - -MeasParameters ::= SEQUENCE { - bandListEUTRA BandListEUTRA -} - -BandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF BandInfoEUTRA - -BandInfoEUTRA ::= SEQUENCE { - interFreqBandList InterFreqBandList, - interRAT-BandList InterRAT-BandList OPTIONAL -} - -InterFreqBandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterFreqBandInfo - -InterFreqBandInfo ::= SEQUENCE { - interFreqNeedForGaps BOOLEAN -} - -InterRAT-BandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterRAT-BandInfo - -InterRAT-BandInfo ::= SEQUENCE { - interRAT-NeedForGaps BOOLEAN -} - -IRAT-ParametersUTRA-FDD ::= SEQUENCE { - supportedBandListUTRA-FDD SupportedBandListUTRA-FDD -} - -SupportedBandListUTRA-FDD ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-FDD - -SupportedBandUTRA-FDD ::= ENUMERATED { - bandI, bandII, bandIII, bandIV, bandV, bandVI, - bandVII, bandVIII, bandIX, bandX, bandXI, - bandXII, bandXIII, bandXIV, bandXV, bandXVI, ...} - -IRAT-ParametersUTRA-TDD128 ::= SEQUENCE { - supportedBandListUTRA-TDD128 SupportedBandListUTRA-TDD128 -} - -SupportedBandListUTRA-TDD128 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD128 - -SupportedBandUTRA-TDD128 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersUTRA-TDD384 ::= SEQUENCE { - supportedBandListUTRA-TDD384 SupportedBandListUTRA-TDD384 -} - -SupportedBandListUTRA-TDD384 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD384 - -SupportedBandUTRA-TDD384 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersUTRA-TDD768 ::= SEQUENCE { - supportedBandListUTRA-TDD768 SupportedBandListUTRA-TDD768 -} - -SupportedBandListUTRA-TDD768 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD768 - -SupportedBandUTRA-TDD768 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersGERAN ::= SEQUENCE { - supportedBandListGERAN SupportedBandListGERAN, - interRAT-PS-HO-ToGERAN BOOLEAN -} - -SupportedBandListGERAN ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandGERAN - -SupportedBandGERAN ::= ENUMERATED { - gsm450, gsm480, gsm710, gsm750, gsm810, gsm850, - gsm900P, gsm900E, gsm900R, gsm1800, gsm1900, - spare5, spare4, spare3, spare2, spare1, ...} - -IRAT-ParametersCDMA2000-HRPD ::= SEQUENCE { - supportedBandListHRPD SupportedBandListHRPD, - tx-ConfigHRPD ENUMERATED {single, dual}, - rx-ConfigHRPD ENUMERATED {single, dual} -} - -SupportedBandListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 - -IRAT-ParametersCDMA2000-1XRTT ::= SEQUENCE { - supportedBandList1XRTT SupportedBandList1XRTT, - tx-Config1XRTT ENUMERATED {single, dual}, - rx-Config1XRTT ENUMERATED {single, dual} -} - -SupportedBandList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 - --- ASN1STOP - -UE-EUTRA-Capability field descriptions accessStratumRelease -Set to rel8 in this version of the specification. maxNumberROHC-ContextSessions -Set to the maximum number of concurrently active ROHC contexts supported by the UE. cs2 corresponds with 2 (context sessions), cs4 corresponds with 4 and so on. ue-Category -UE category as defined in TS 36.306 [5]. Set to values 1 to 5 in this version of the specification. bandEUTRA -EUTRA band as defined in TS 36.101 [42]. ue-TxAntennaSelectionSupported -TRUE indicates that the UE is capable of supporting UE transmit antenna selection as described in TS 36.213 [23, 8.7]. halfDuplex -If halfDuplex is set to true, only half duplex operation is supported for the band, otherwise full duplex operation is supported. bandListEUTRA -One entry corresponding to each supported EUTRA band listed in the same order as in supportedBandListEUTRA. interFreqBandList -One entry corresponding to each supported EUTRA band listed in the same order as in supportedBandListEUTRA. interFreqNeedForGaps -Indicates need for measurement gaps when operating on the EUTRA band given by the entry in bandListEUTRA and measuring on the EUTRA band given by the entry in interFreqBandList. interRAT-BandList -One entry corresponding to each supported band of another RAT listed in the same order as in the interRAT-Parameters. interRATNeedForGaps -Indicates need for DL measurement gaps when operating on the EUTRA band given by the entry in bandListEUTRA and measuring on the inter-RAT band given by the entry in the interRAT-BandList. bandUTRA-FDD -UTRA band as defined in TS 25.101 [17]. bandUTRA-TDD128 -UTRA band as defined in TS 25.102 [18]. bandUTRA-TDD384 -UTRA band as defined in TS 25.102 [18]. bandUTRA-TDD768 -UTRA band as defined in TS 25.102 [18]. bandGERAN -GERAN band as defined in TS 45.005 [20]. bandHRPD -CDMA2000 HRPD band class. band1XRTT -CDMA2000 1xRTT band class. featureGroupIndicators -The definitions of the bits in the bit string are described in Annex B. -NOTE: The IE UE-EUTRA-Capability does not include AS security capability information, since these are the same as the security capabilities that are signalled by NAS. Consequently AS need not provide "man-in-the-middle" protection for the security capabilities. -– UE-TimersAndConstants -The IE UE-TimersAndConstants contains timers and constants used by the UE in either RRC_CONNECTED or RRC_IDLE. -UE-TimersAndConstants information element --- ASN1START - -UE-TimersAndConstants ::= SEQUENCE { - t300 ENUMERATED { - ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, - ms2000}, - t301 ENUMERATED { - ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, - ms2000}, - t310 ENUMERATED { - ms0, ms50, ms100, ms200, ms500, ms1000, ms2000}, - n310 ENUMERATED { - n1, n2, n3, n4, n6, n8, n10, n20}, - t311 ENUMERATED { - ms1000, ms3000, ms5000, ms10000, ms15000, - ms20000, ms30000}, - n311 ENUMERATED { - n1, n2, n3, n4, n5, n6, n8, n10}, - ... -} - --- ASN1STOP - -UE-TimersAndConstants field descriptions t3xy -Timers are described in section 7.3. Value ms0 corresponds with 0 ms, ms50 corresponds with 50 ms and so on. n3xy -Constants are described in section 7.4. n1 corresponds with 1, n2 corresponds with 2 and so on. -6.4 RRC multiplicity and type constraint values -– Multiplicity and type constraint definitions --- ASN1START - -maxBands INTEGER ::= 64 -- Maximum number of bands listed in EUTRA UE caps -maxCDMA-BandClass INTEGER ::= 32 -- Maximum value of the CDMA band classes -maxCellBlack INTEGER ::= 16 -- Maximum number of blacklisted cells - -- listed in SIB type 4 and 5 -maxCellInter INTEGER ::= 16 -- Maximum number of neighbouring inter-frequency - -- cells listed in SIB type 5 -maxCellIntra INTEGER ::= 16 -- Maximum number of neighbouring intra-frequency - -- cells listed in SIB type 4 -maxCellMeas INTEGER ::= 32 -- Maximum number of neighbouring cells within a - -- measurement object (incl blacklisted cells) -maxCellReport INTEGER ::= 8 -- Maximum number of reported cells -maxDRB INTEGER ::= 11 -- Maximum number of Data Radio Bearers -maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier fequency -maxFreq INTEGER ::= 8 -- Maximum number of EUTRA carrier frequencies -maxGERAN-SI INTEGER ::= 10 -- Maximum number of GERAN SI blocks that can be - -- provided as part of NACC information -maxGNFG INTEGER ::= 16 -- Maximum number of GERAN neighbour freq groups -maxMBSFN-Allocations INTEGER ::= 8 -- Maximum number of MBSFN frame allocations with - -- different offset -maxMCS-1 INTEGER ::= 16 -- Maximum number of PUCCH formats (MCS) -maxMeasId INTEGER ::= 32 -maxObjectId INTEGER ::= 32 -maxPageRec INTEGER ::= 16 -- -maxPNOffset INTEGER ::= 511 -- Maximum number of CDMA2000 PNOffsets -maxRAT-Capabilities INTEGER ::= 8 -- Maximum number of interworking RATs (incl EUTRA) -maxReportConfigId INTEGER ::= 32 -maxSIB INTEGER ::= 32 -- Maximum number of SIBs -maxSIB-1 INTEGER ::= 31 -maxSI-Message INTEGER ::= 32 -- Maximum number of SI messages -maxUTRA-FDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA FDD carrier frequencies -maxUTRA-TDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA TDD carrier frequencies - --- ASN1STOP -NOTE: The value of maxDRB align with SA2. -– End of EUTRA-RRC-Definitions --- ASN1START - -END - --- ASN1STOP - -7 Variables and constants -7.1 UE variables -NOTE: To facilitate the specification of the UE behavioural requirements, UE variables are represented using ASN.1. Unless explicitly specified otherwise, it is however up to UE implementation how to store the variables. The optionality of the IEs in ASN.1 is used only to indicate that the values may not always be available. -– EUTRA-UE-Variables -This ASN.1 segment is the start of the EUTRA UE variable definitions. --- ASN1START - -EUTRA-UE-Variables DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - -IMPORTS - CellIdentity, - SpeedStateScaleFactors, - C-RNTI, - MeasId, - MeasIdToAddModList, - MeasObjectToAddModList, - MobilityStateParameters, - NeighCellConfig, - PhysCellId, - QuantityConfig, - ReportConfigToAddModList, - RSRP-Range, - maxCellMeas, - maxMeasId -FROM EUTRA-RRC-Definitions; - --- ASN1STOP - -– VarMeasConfig -The UE variable VarMeasConfig includes the accumulated configuration of the measurements to be performed by the UE, covering intra-frequency, inter-frequency and inter-RAT mobility related measurements. -VarMeasConfig UE variable --- ASN1START - -VarMeasConfig ::= SEQUENCE { - -- Measurement identities - measIdList MeasIdToAddModList OPTIONAL, - -- Measurement objects - measObjectList MeasObjectToAddModList OPTIONAL, - -- Reporting configurations - reportConfigList ReportConfigToAddModList OPTIONAL, - -- Other parameters - quantityConfig QuantityConfig OPTIONAL, - s-Measure RSRP-Range OPTIONAL, - speedStatePars CHOICE { - release NULL, - setup SEQUENCE { - mobilityStateParameters MobilityStateParameters, - timeToTrigger-SF SpeedStateScaleFactors - } - } OPTIONAL -} - --- ASN1STOP - -– VarMeasReportList -The UE variable VarMeasReportList includes information about the measurements for which the triggering conditions have been met. -VarMeasReportList UE variable --- ASN1START - -VarMeasReportList ::= SEQUENCE (SIZE (1..maxMeasId)) OF VarMeasReport - -VarMeasReport ::= SEQUENCE { - -- List of measurement that have been triggered - measId MeasId, - cellsTriggeredList CellsTriggeredList OPTIONAL, - numberOfReportsSent INTEGER -} - -CellsTriggeredList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF PhysCellId - --- ASN1STOP - -– VarShortMAC-Input -The UE variable VarShortMAC-Input specifies the input used to generate the shortMAC-I. -VarShortMAC-Input UE variable --- ASN1START - -VarShortMAC-Input ::= SEQUENCE { - cellIdentity CellIdentity, - physCellId PhysCellId, - c-RNTI C-RNTI -} --- ASN1STOP - -VarShortMAC-Input field descriptions cellIdentity -Set to CellIdentity of the current cell. physCellId -Set to the physical cell identity of the cell the UE was connected to prior to the failure. c-RNTI -Set to C-RNTI that the UE had in the cell it was connected to prior to the failure. -– Multiplicity and type constraint definitions -This section includes multiplicity and type constraints applicable (only) for UE variables. --- ASN1START - - --- ASN1STOP - -– End of EUTRA-UE-Variables --- ASN1START - -END - --- ASN1STOP - -7.2 Counters -Counter Reset Incremented When reaching max value -7.3 Timers (Informative) -Timer Start Stop At expiry T300 - Transmission of RRCConnectionRequest Reception of RRCConnectionSetup or RRCConnectionReject message, cell re-selection and upon abortion of connection establishment by upper layers Perform the actions as specified in 5.3.3.6 T301 Transmission of RRCConnectionReestabilshmentRequest Reception of RRCConnectionReestablishment or RRCConnectionReestablishmentReject message as well as when the selected cell becomes unsuitable Go to RRC_IDLE T302 Reception of RRCConnectionReject while performing RRC connection establishment Upon entering RRC_CONNECTED and upon cell re-selection Inform upper layers about barring alleviation as specified in 5.3.3.7 T303 Access barred while performing RRC connection establishment for mobile originating calls Upon entering RRC_CONNECTED and upon cell re-selection Inform upper layers about barring alleviation as specified in 5.3.3.7 T304 Reception of RRCConnectionReconfiguration message including the MobilityControl Info or -reception of MobilityFromEUTRACommand message including CellChangeOrder Criterion for successful completion of handover to EUTRA or cell change order is met (the criterion is specified in the target RAT in case of inter-RAT) In case of cell change order from E-UTRA or intra E-UTRA handover, initiate the RRC connection re-establishment procedure; In case of handover to E-UTRA, perform the actions defined in the specifications applicable for the source RAT. T305 Access barred while performing RRC connection establishment for mobile originating signalling Upon entering RRC_CONNECTED and upon cell re-selection Inform upper layers about barring alleviation as specified in 5.3.3.7 T310 Upon detecting physical layer problems i.e. upon receiving N310 consecutive out-of-sync indications from lower layers Upon receiving N311 consecutive in-sync indications from lower layers, upon triggering the handover procedure and upon initiating the connection re-establishment procedure If security is not activated: go to RRC_IDLE else: initiate the connection re-establishment procedure T311 Upon initiating the RRC connection re-establishment procedure Selection of a suitable E-UTRA cell or a cell using another RAT. Enter RRC_IDLE T320 Upon receiving t320 or upon cell (re)selection to E-UTRA from another RAT with validity time configured for dedicated priorities (in which case the remaining validity time is applied). Upon entering RRC_CONNECTED, when PLMN selection is performed on request by NAS, or upon cell (re)selection to another RAT (in which case the timer is carried on to the other RAT). Discard the cell reselection priority information provided by dedicated signalling. T321 Upon receiving measConfig including a reportConfig with the purpose set to reportCGI Upon acquiring the information needed to set all fields of cellGlobalId for the requested cell, upon receiving measConfig that includes removal of the reportConfig with the purpose set to reportCGI Initiate the measurement reporting procedure, stop performing the related measurements and remove the corresponding measId -7.4 Constants -Constant Usage N310 Maximum number of consecutive "out-of-sync" indications received from lower layers N311 Maximum number of consecutive "in-sync" indications received from lower layers -8 Protocol data unit abstract syntax -8.1 General -The RRC PDU contents in clause 6 and clause 10 are described using abstract syntax notation one (ASN.1) as specified in ITU-T Rec. X.680 [13] and X.681 [14]. Transfer syntax for RRC PDUs is derived from their ASN.1 definitions by use of Packed Encoding Rules, unaligned as specified in ITU-T Rec. X.691 [15]. -The following encoding rules apply in addition to what has been specified in X.691: -- When a bit string value is placed in a bit-field as specified in 15.6 to 15.11 in X.691, the leading bit of the bit string value shall be placed in the leading bit of the bit-field, and the trailing bit of the bit string value shall be placed in the trailing bit of the bit-field. -NOTE: The terms 'leading bit' and 'trailing bit' are defined in ITU-T Rec. X.680. When using the 'bstring' notation, the leading bit of the bit string value is on the left, and the trailing bit of the bit string value is on the right. -8.2 Structure of encoded RRC messages -An RRC PDU, which is the bit string that is exchanged between peer entities/ across the radio interface contains the basic production as defined in X.691. -RRC PDUs shall be mapped to and from PDCP SDUs (in case of DCCH) or RLC SDUs (in case of PCCH, BCCH or CCCH) upon transmission and reception as follows: -- when delivering an RRC PDU as an PDCP SDU to the PDCP layer for transmission, the first bit of the RRC PDU shall be represented as the first bit in the PDCP SDU and onwards; and -- when delivering an RRC PDU as an RLC SDU to the RLC layer for transmission, the first bit of the RRC PDU shall be represented as the first bit in the RLC SDU and onwards; and -- upon reception of an PDCP SDU from the PDCP layer, the first bit of the PDCP SDU shall represent the first bit of the RRC PDU and onwards; and -- upon reception of an RLC SDU from the RLC layer, the first bit of the RLC SDU shall represent the first bit of the RRC PDU and onwards. -8.3 Basic production -The 'basic production' is obtained by applying UNALIGNED PER to the abstract syntax value (the ASN.1 description) as specified in X.691. It always contains a multiple of 8 bits. -8.4 Extension -The following rules apply with respect to the use of protocol extensions: -- A transmitter compliant with this version of the specification shall, unless explicitly indicated otherwise on a PDU type basis, set the extension part empty. Transmitters compliant with a later version may send non-empty extensions; -- A transmitter compliant with this version of the specification shall set spare bits to zero; -8.5 Padding -If the encoded RRC message does not fill a transport block, the RRC layer shall add padding bits. This applies to PCCH and BCCH. -Padding bits shall be set to 0 and the number of padding bits is a multiple of 8. - -Figure 8.5-1: RRC level padding -9 Specified and default radio configurations -Specified and default configurations are configurations of which the details are specified in the standard. Specified configurations are fixed while default configurations can be modified using dedicated signalling. -9.1 Specified configurations -9.1.1 Logical channel configurations -9.1.1.1 BCCH configuration -Parameters -Name Value Semantics description Ver PDCP configuration N/A RLC configuration TM MAC configuration TM -NOTE: RRC will perform padding, if required due to the granularity of the TF signalling, as defined in 8.5. -9.1.1.2 CCCH configuration -Parameters -Name Value Semantics description Ver PDCP configuration N/A RLC configuration TM MAC configuration Normal MAC headers are used Logical channel configuration priority 1 Highest priority prioritisedBitRate Infinity bucketSizeDuration N/A logicalChannelGroup 0 -9.1.1.3 PCCH configuration -Parameters -Name Value Semantics description Ver PDCP configuration N/A RLC configuration TM MAC configuration TM -NOTE: RRC will perform padding, if required due to the granularity of the TF signalling, as defined in 8.5. -9.1.2 SRB configurations -9.1.2.1 SRB1 -Parameters -Name Value Semantics description Ver RLC configuration logicalChannelIdentity 1 -9.1.2.2 SRB2 -Parameters -Name Value Semantics description Ver RLC configuration logicalChannelIdentity 2 -9.2 Default radio configurations -9.2.1 SRB configurations -9.2.1.1 SRB1 -Parameters -Name Value Semantics description Ver RLC configuration CHOICE am ul-RLC-Config ->t-PollRetransmit ->pollPDU ->pollByte ->maxRetxThreshold -45 -Infinity -Infinity -4 dl-RLC-Config ->t-Reordering ->t-StatusProhibit -35 -0 Logical channel configuration priority 1 Highest priority prioritisedBitRate Infinity bucketSizeDuration N/A logicalChannelGroup 0 -9.2.1.2 SRB2 -Parameters -Name Value Semantics description Ver RLC configuration CHOICE am ul-RLC-Config ->t-PollRetransmit ->pollPDU ->pollByte ->maxRetxThreshold -45 -Infinity -Infinity -4 dl-RLC-Config ->t-Reordering ->t-StatusProhibit -35 -0 Logical channel configuration priority 3 prioritisedBitRate Infinity bucketSizeDuration N/A logicalChannelGroup 0 -9.2.2 Default MAC main configuration -Parameters -Name Value Semantics description Ver MAC main configuration maxHARQ-tx 5 periodicBSR-Timer Infinity retxBSR-Timer sf2560 ttiBundling FALSE drx-Config release phr-Config release -9.2.3 Default semi-persistent scheduling configuration -SPS-Config ->sps-ConfigDL ->sps-ConfigUL -release -release -9.2.4 Default physical channel configuration -Parameters -Name Value Semantics description Ver PDSCH-ConfigDedicated ->p-a -dB0 PUCCH-ConfigDedicated -> tdd-AckNackFeedbackMode ->ackNackRepetition -bundling -release -Only valid for TDD mode PUSCH-ConfigDedicated ->betaOffset-ACK-Index ->betaOffset-RI-Index ->betaOffset-CQI-Index -10 -12 -15 UplinkPowerControlDedicated ->p0-UE-PUSCH ->deltaMCS-Enabled ->accumulationEnabled ->p0-UE-PUCCH ->pSRS-Offset -> filterCoefficient -0 -en0 (disabled) -TRUE -0 -7 -fc4 tpc-pdcch-ConfigPUCCH release tpc-pdcch-ConfigPUSCH release CQI-ReportConfig -> CQI-ReportPeriodic -release SoundingRS-UL-ConfigDedicated release AntennaInfoDedicated ->transmissionMode - - - ->codebookSubsetRestriction ->ue-TransmitAntennaSelection -tm1, tm2 - - - -N/A -release -If the number of PBCH antenna ports is one, tm1 is used as default; otherwise tm2 is used as default SchedulingRequestConfig release -9.2.5 Default values timers and constants -Parameters -Name Value Semantics description Ver t310 ms1000 n310 1 t311 ms1000 n311 1 -10 Radio information related interactions between network nodes -10.1 General -This section specifies RRC messages that are transferred between network nodes. These RRC messages may be transferred to or from the UE via another Radio Access Technology. Consequently, these messages have similar characteristics as the RRC messages that are transferred across the E-UTRA radio interface, i.e. the same transfer syntax and protocol extension mechanisms apply. -10.2 Inter-node RRC messages -10.2.1 General -This section specifies RRC messages that are sent either across the X2- or the S1-interface, either to or from the eNB, i.e. a single ‘logical channel’ is used for all RRC messages transferred across network nodes. The information could originate from or be destined for another RAT. -– EUTRA-InterNodeDefinitions -This ASN.1 segment is the start of the EUTRA inter-node PDU definitions. --- ASN1START - -EUTRA-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - -IMPORTS - AntennaInfoCommon, - CellIdentity, - C-RNTI, - DL-DCCH-Message, - ARFCN-ValueEUTRA, - MasterInformationBlock, - MeasConfig, - PhysCellId, - RadioResourceConfigDedicated, - SecurityAlgorithmConfig, - ShortMAC-I, - SystemInformationBlockType1, - SystemInformationBlockType2, - UECapabilityInformation, - UE-CapabilityRAT-ContainerList -FROM EUTRA-RRC-Definitions; - --- ASN1STOP - -10.2.2 Message definitions -– HandoverCommand -This message is used to transfer the handover command generated by the target eNB, which is transparently transferred by the source RAN to the UE. -Direction: target eNB to source eNB/ source RAN -HandoverCommand message --- ASN1START - -HandoverCommand ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - handoverCommand-r8 HandoverCommand-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverCommand-r8-IEs ::= SEQUENCE { - handoverCommandMessage OCTET STRING (CONTAINING DL-DCCH-Message), - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -HandoverCommand field descriptions handoverCommandMessage -Contains the entire DL-DCCH-Message including the RRCConnectionReconfiguration message used to perform handover to E-UTRAN, generated (entirely) by the target eNB. -– HandoverPreparationInformation -This message is used to transfer the E-UTRA RRC information used by the target eNB during handover preparation, including UE capability information. -Direction: source eNB/ source RAN to target eNB -HandoverPreparationInformation message --- ASN1START - -HandoverPreparationInformation ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - handoverPreparationInformation-r8 HandoverPreparationInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverPreparationInformation-r8-IEs ::= SEQUENCE { - ue-RadioAccessCapabilityInfo UE-CapabilityRAT-ContainerList, - as-Config AS-Config OPTIONAL, -- Cond HO - rrm-Config RRM-Config OPTIONAL, - as-Context AS-Context OPTIONAL, -- Cond HO - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -HandoverPreparationInformation field descriptions ue-RadioAccessCapabilityInfo -E-UTRA radio access capabilities are always included and in case of inter-RAT handover to E-UTRA, UTRA radio access capabilities may be included. (If UTRA radio access capabilities are received from the source RAN, they are ignored by target eNB.) In case of inter-RAT handover to E-UTRA and the source is GERAN, GERAN capabilities are always included. as-Config -The complete radio resource configuration. Applicable in case of intra-E-UTRA handover. rrm-Config -Local E-UTRAN context used depending on the target node’s implementation, which is mainly used for the RRM purpose. as-Context -Local E-UTRAN context required by the target eNB. -Conditional presence Explanation HO The field is mandatory present in case of handover within E-UTRA; otherwise the field is not present. -– UERadioAccessCapabilityInformation -This message is used to transfer UE radio access capability information, covering both upload to and download from the EPC. -Direction: eNB to/ from EPC -UERadioAccessCapabilityInformation message --- ASN1START - -UERadioAccessCapabilityInformation ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - ueRadioAccessCapabilityInformation-r8 - UERadioAccessCapabilityInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UERadioAccessCapabilityInformation-r8-IEs ::= SEQUENCE { - ue-RadioAccessCapabilityInfo OCTET STRING (CONTAINING UECapabilityInformation), - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -UERadioAccessCapabilityInformation field descriptions ue-RadioAccessCapabilityInfo -Including E-UTRA, GERAN, and CDMA2000-1xRTT Bandclass radio access capabilities (separated). UTRA radio access capabilities are not included. -10.3 Inter-node RRC information element definitions -– AS-Config -The AS-Config IE contains information about RRC configuration information in the source cell which can be utilized by target cell to determine the need to change the RRC configuration during the handover preparation phase. The information can also be used after the handover is successfully performed or during the RRC connection re-establishment. -AS-Config information element --- ASN1START - -AS-Config ::= SEQUENCE { - sourceMeasConfig MeasConfig, - sourceRadioResourceConfig RadioResourceConfigDedicated, - sourceSecurityAlgorithmConfig SecurityAlgorithmConfig, - sourceUE-Identity C-RNTI, - sourceMasterInformationBlock MasterInformationBlock, - sourceSystemInformationBlockType1 SystemInformationBlockType1, - sourceSystemInformationBlockType2 SystemInformationBlockType2, - antennaInfoCommon AntennaInfoCommon, - sourceDl-CarrierFreq ARFCN-ValueEUTRA, - ... -} - --- ASN1STOP -NOTE: The AS-Config re-uses information elements primarily created to cover the radio interface signalling requirements. Consequently, the information elements may include some parameters that are not relevant for the target eNB e.g. the SFN as included in the MasterInformationBlock. - -AS-Config field descriptions sourceMeasConfig -Measurement configuration in the source cell. The measurement configuration for all measurements existing in the source cell when handover is triggered shall be included. See 10.5. sourceRadioResourceConfig -Radio configuration in the source cell. The radio resource configuration for all radio bearers existing in the source cell when handover is triggered shall be included. See 10.5. sourceSecurityAlgorithmConfig -This field provides the AS integrity protection (SRBs) and AS ciphering (SRBs and DRBs) algorithm configuration used in the source cell. sourceMasterInformationBlock -MasterInformationBlock transmitted in the source cell. sourceSystemInformationBlockType1 -SystemInformationBlockType1 transmitted in the source cell. sourceSystemInformationBlockType2 -SystemInformationBlockType2 transmitted in the source cell. antennaInfoCommon -This field provides information about the number of antenna ports in the source cell. sourceDL-CarrierFreq -Provides the parameter Downlink EARFCN in the source cell, see TS 36.101 [42]. -– AS-Context -The IE AS-Context is used to transfer local E-UTRAN context required by the target eNB. - -AS-Context information element --- ASN1START - -AS-Context ::= SEQUENCE { - reestablishmentInfo ReestablishmentInfo OPTIONAL -- Cond HO -} - --- ASN1STOP - -AS-Context field descriptions reestablishmentInfo -Including information needed for the RRC connection re-establishment. -Conditional presence Explanation HO The field is mandatory present in case of handover within E-UTRA; otherwise the field is not present. -– ReestablishmentInfo -The ReestablishmentInfo IE contains information needed for the RRC connection re-establishment. -ReestablishmentInfo information element --- ASN1START - -ReestablishmentInfo ::= SEQUENCE { - sourcePhysCellId PhysCellId, - targetCellShortMAC-I ShortMAC-I, - additionalReestabInfoList AdditionalReestabInfoList OPTIONAL, - ... -} - -AdditionalReestabInfoList ::= SEQUENCE ( SIZE (1..maxReestabInfo) ) OF AdditionalReestabInfo - -AdditionalReestabInfo ::= SEQUENCE{ - cellIdentity CellIdentity, - key-eNodeB-Star Key-eNodeB-Star, - shortMAC-I ShortMAC-I -} - -Key-eNodeB-Star ::= BIT STRING (SIZE (256)) - --- ASN1STOP - -ReestablishmentInfo field descriptions sourcePhyCellId -The physical cell identity of the source cell, used to determine the UE context in the target eNB at re-establishment. targetCellShortMAC-I -The ShortMAC-I for the handover target cell, in order for potential re-establishment to succeed. additionalReestabInfoList -Contains a list of shortMAC-I and KeNB* for cells under control of the target eNB, required for potential re-establishment by the UE in these cells to succeed. Key-eNodeB-Star -Parameter KeNB*: See TS 33.401 [32, 7.2.8.4]. This parameter is only used for X2 handover, and for S1 handover, it shall be ignored by target eNB. -– RRM-Config -The RRM-Config IE contains information about UE specific RRM information before the handover which can be utilized by target eNB after the handover is successfully performed. -RRM-Config information element --- ASN1START - -RRM-Config ::= SEQUENCE { - ue-InactiveTime ENUMERATED { - s1, s2, s3, s5, s7, s10, s15, s20, - s25, s30, s40, s50, min1, min1s20c, min1s40, - min2, min2s30, min3, min3s30, min4, min5, min6, - min7, min8, min9, min10, min12, min14, min17, min20, - min24, min28, min33, min38, min44, min50, hr1, - hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6, - hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2, - day2hr12, day3, day4, day5, day7, day10, day14, day19, - day24, day30, dayMoreThan30} OPTIONAL, - ... -} - --- ASN1STOP - -RRM-Config field descriptions ue-InactiveTime -Duration while UE has not received or transmitted any user data. Thus the timer is still running in case e.g., UE measures the neighbour cells for the HO purpose. Value s1 corresponds to 1 second, s2 corresponds to 2 seconds and so on. Value min1 corresponds to 1 minute, value min1s20 corresponds to 1 minute and 20 seconds, value min1s40 corresponds to 1 minute and 40 seconds and so on. Value hr1 corresponds to 1 hour, hr1min30 corresponds to 1 hour and 30 minutes and so on. -10.4 Inter-node RRC multiplicity and type constraint values -– Multiplicity and type constraints definitions --- ASN1START - -maxReestabInfo INTEGER ::= 32 -- Maximum number of KeNB* and shortMAC-I forwarded - -- at handover for re-establishment preparation - --- ASN1STOP - -– End of EUTRA-InterNodeDefinitions --- ASN1START - -END - --- ASN1STOP - -10.5 Mandatory information in AS-Config -The AS-Config transferred between source eNB and target-eNB shall include all IEs necessary to describe the AS context. The conditional presence in section 6 is only applicable for eNB to UE communication. -The "need" or "cond" statements are not applied in case of sending the IEs from source eNB to target eNB. Some information elements shall be included regardless of the "need" or "cond" e.g. discardTimer. The AS-Config re-uses information elements primarily created to cover the radio interface signalling requirements. The information elements may include some parameters that are not relevant for the target eNB e.g. the SFN as included in the MasterInformationBlock. -Within the sourceRadioResourceConfig the source eNB shall include fields that are optional for eNB to UE communication, if the functionality is configured unless explictly specified otherwise in the following: -- in accordance with a condition that is explictly stated to be applicable; or -- a default value is defined for the concerned field; and the configured value is the same as the default value that is defined; or -- the need of the field is OP and the current UE configuration corresponds with the behaviour defined for absence of the field; - -Name Presence in clause 6 Comment RadioResourceConfigDedicated > srb-ToAddModList ->> rlc-Config ->> logicalChannelConfig ->>> ul-SpecificParameters ->>>> logicalChannelGroup OPTIONAL, -Cond HO-Conn -OPTIONAL, -Cond Setup -OPTIONAL, -Cond Setup -OPTIONAL, -Cond UL -OPTIONAL, -Need OR - -- -- -- The conditional presence applies -- >drb-ToAddModList ->> eps-BearerIdentity ->> pdcp-Config ->>> discardTimer ->>> rlc-AM ->>> rlc-UM ->> rlc-Config ->> logicalChannelIdentity ->> logicalChannelConfig ->>> ul-SpecificParameters ->>>> logicalChannelGroup OPTIONAL, -Cond HO-toEUTRA -OPTIONAL, -Cond DRB-Setup -OPTIONAL, -Cond PDCP -OPTIONAL, -Cond Setup -OPTIONAL, -Cond Rlc-AM -OPTIONAL, -Cond Rlc-UM -OPTIONAL, -Cond Setup -OPTIONAL, -Cond DRB-Setup -OPTIONAL, -Cond Setup -OPTIONAL, -Cond UL -OPTIONAL, -Need OR - -- -- -- -- The conditional presence applies -- The conditional presence applies -- -- -- -- The conditional presence applies -- > mac-MainConfig ->> ul-SCH-Config ->>> maxHARQ-Tx ->> periodicBSR-Timer ->> drx-Config ->>> shortDRX ->> phr-Config OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON - -- -- -- -- -- -- > sps-Config ->> sps-ConfigDL ->> sps-ConfigUL ->>> p0-Persistent ->>> twoIntervalsConfig OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need OP -OPTIONAL, -Cond TDD - -- -- -- -- The conditional presence applies > physicalConfigDedicated ->> pdsch-ConfigDedicated ->> pucch-ConfigDedicated ->>> tdd-AckNackFeedbackMode ->> pusch-ConfigDedicated ->> uplinkPowerControlDedicated ->> tpc-PDCCH-ConfigPUCCH ->> tpc-PDCCH-ConfigPUSCH ->> cqi-ReportConfig ->>> cqi-ReportingModeAperiodic ->>> cqi-ReportPeriodic ->> soundingRS-UL-ConfigDedicated ->> antennaInfo ->>> codebookSubsetRestriction ->> schedulingRequestConfig OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Cond TDD -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need OR -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Cond TM -OPTIONAL, -Need ON - -- -- -- The conditional presence applies -- -- -- -- -- -- -- -- -- -- The conditional presence applies -- -For the measurement configuration, a corresponding operation as 5.5.6.1 is executed by target eNB. -Within the sourceMeasConfig the source eNB shall include fields that are optional for eNB to UE communication, if the functionality is configured unless explictly specified otherwise in the following: -- in accordance with a condition that is explictly stated to be applicable; or -- a default value is defined for the concerned field; and the configured value is the same as the default value that is defined; or -- the need of the field is OP and the current UE configuration corresponds with the behaviour defined for absence of the field; -Name Presence in clause 6 Comment MeasConfig > measObjectToAddModList ->> measObject ->>> measObjectEUTRA ->>>> cellsToAddModList ->>>> blackCellsToAddModList ->>>> cellForWhichToReportCGI ->>> MeasObjectUTRA ->>>> cellsToAddModList ->>>> cellForWhichToReportCGI ->>> MeasObjectGERAN ->>>> cellForWhichToReportCGI ->>> MeasObjectCDMA2000 ->>>> searchWindowSize ->>>> cellsToAddModList ->>>> cellForWhichToReportCGI OPTIONAL, -Need ON -- -- -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -- -OPTIONAL, -Need ON -OPTIONAL, -Need ON -- -OPTIONAL, -Need ON -- -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON - -- -- -- -- -- -- -- -- -- -- -- -- -- -- > reportConfigToAddModList OPTIONAL, -Need ON - > measIdToAddModList OPTIONAL, -Need ON - > quantityConfig ->> quantityConfigEUTRA ->> quantityConfigUTRA ->> quantityConfigGERAN ->> quantityConfigCDMA2000 OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON - -- -- -- -- > s-Measure OPTIONAL, -Need ON - > preRegistrationInfoHRPD ->> preRegistrationZoneId ->> secondaryPreRegistrationZoneIdList OPTIONAL, -Need OP -OPTIONAL, -Cond PreRegAllowed -OPTIONAL, -Need OR -- The conditional presence applies -- > speedStatePars OPTIONAL, -Need ON - -11 UE capability related constraints and performance requirements -11.1 UE capability related constraints -The following table lists constraints regarding the UE capabilities that E-UTRAN is assumed to take into account. -Parameter Description Value #DRBs The number of DRBs that a UE of categories 1- 5 shall support 8 #RLC-AM The number of RLC AM entities that a UE of categories 1- 5 shall support 10 -11.2 Processing delay requirements for RRC procedures -The UE performance requirements for RRC procedures are specified in the following table, by means of a value N: -N = the number of 1ms subframes from the end of reception of the E-UTRAN -> UE message on the UE physical layer up to when the UE shall be ready for the reception of uplink grant for the UE -> E-UTRAN response message with no access delay other than the TTI-alignment (e.g. excluding delays caused by scheduling, the random access procedure or physical layer synchronisation). - -Figure 11.2-1: Illustration of RRC procedure delay - - - -Procedure title: E-UTRAN -> UE UE -> E-UTRAN N Notes RRC Connection Control Procedures RRC connection establishment - RRCConnectionSetup RRCConnectionSetupComplete 15 RRC connection release RRCConnectionSetupRelease NA - RRC connection re-configuration (radio resource configuration) - RRCConnectionReconfiguration RRCConnectionReconfigurationComplete 15 RRC connection re-configuration (measurement configuration) - RRCConnectionReconfiguration RRCConnectionReconfigurationComplete 15 RRC connection re-configuration (intra-LTE mobility) - RRCConnectionReconfiguration RRCConnectionReconfigurationComplete 15 RRC connection re-establishment - RRCConnectionReestablishment RRCConnectionReestablishmentComplete 15 Initial security activation SecurityModeCommand SecurityModeCommandComplete/SecurityModeCommandFailure 10 Initial security activation + RRC connection re-configuration (RB establishment) SecurityModeCommand, RRCConnectionReconfiguration RRCConnectionReconfigurationComplete 20 The two DL messages are transmitted in the same TTI Paging Paging NA Inter RAT mobilty Handover to E-UTRA RRCConnectionReconfiguration (sent by other RAT) RRCConnectionReconfigurationComplete NA Handover from E-UTRA MobilityFromEUTRACommand NA Handover from E-UTRA to CDMA2000 HandoverFromEUTRAPreparationRequest (CDMA2000) NA Used to trigger the handover preparation procedure with a CDMA2000 RAT. Measurement procedures Measurement Reporting MeasurementReport NA Other procedures UE capability transfer UECapabilityEnquiry UECapabilityInformation 10 -Annex A (informative): -Guidelines, mainly on use of ASN.1 -Editor’s note No agreements have been reached concerning the extension of RRC PDUs so far. Any statements in this section about the protocol extension mechanism should be considered as FFS. -A.1 Introduction -The following clauses contain guidelines for the specification of RRC protocol data units (PDUs) with ASN.1. -A.2 Procedural specification -A.2.1 General principles -The procedural specification provides an overall high level description regarding the UE behaviour in a particular scenario. -It should be noted that most of the UE behaviour associated with the reception of a particular field is covered by the applicable parts of the PDU specification. The procedural specification may also include specific details of the UE behaviour upon reception of a field, but typically this should be done only for cases that are not easy to capture in the PDU section e.g. general actions, more complicated actions depending on the value of multiple fields. -Likewise, the procedural specification need not specify the UE requirements regarding the setting of fields within the messages that are send to E-UTRAN i.e. this may also be covered by the PDU specification. -A.2.2 More detailed aspects -The following more detailed conventions should be used: -- Bullets: -- Capitals should be used in the same manner as in other parts of the procedural text i.e. in most cases no capital applies since the bullets are part of the sentence starting with 'The UE shall:' -- All bullets, including the last one in a sub-clause, should end with a semi-colon i.e. an ';' -- Conditions -- Whenever multiple conditions apply, a semi-colon should be used at the end of each conditions with the exception of the last one, i.e. as in 'if cond1; or cond2: -A.3 PDU specification -A.3.1 General principles -A.3.1.1 ASN.1 sections -The RRC PDU contents are formally and completely described using abstract syntax notation (ASN.1), see X.680 [13], X.681 (02/2002) [14]. -The complete ASN.1 code is divided into a number of ASN.1 sections in the specifications. In order to facilitate the extraction of the complete ASN.1 code from the specification, each ASN.1 section begins with a text paragraph consisting entirely of an ASN.1 start tag, which consists of a double hyphen followed by a single space and the text string "ASN1START" (in all upper case letters). Each ASN.1 section ends with a text paragraph consisting entirely of an ASN.1 stop tag, which consists of a double hyphen followed by a single space and the text "ASN1STOP" (in all upper case letters): --- ASN1START - --- ASN1STOP - -The text paragraphs containing the ASN.1 start and stop tags should not contain any ASN.1 code significant for the complete description of the RRC PDU contents. The complete ASN.1 code may be extracted by copying all the text paragraphs between an ASN.1 start tag and the following ASN.1 stop tag in the order they appear, throughout the specification. -NOTE: A typical procedure for extraction of the complete ASN.1 code consists of a first step where the entire RRC PDU contents description (ultimately the entire specification) is saved into a plain text (ASCII) file format, followed by a second step where the actual extraction takes place, based on the occurrence of the ASN.1 start and stop tags. -A.3.1.2 ASN.1 identifier naming conventions -The naming of identifiers (i.e., the ASN.1 field and type identifiers) should be based on the following guidelines: -- Message (PDU) identifiers should be ordinary mixed case without hyphenation. These identifiers, e.g., the RRCConnectionModificationCommand, should be used for reference in the procedure text. Abbreviated forms of these identifiers should not be used. -- Type identifiers other than PDU identifiers should be ordinary mixed case, with hyphenation used to set off acronyms only where an adjacent letter is a capital, e.g., EstablishmentCause, SelectedPLMN (not Selected-PLMN, since the “d” in “Selected” is lowercase), InitialUE-Identity and MeasSFN-SFN-TimeDifference. -- Field identifiers shall start with a lowercase letter and use mixed case thereafter, e.g., establishmentCause. If a field identifier begins with an acronym (which would normally be in upper case), the entire acronym is lowercase (plmn-Identity, not pLMN-Identity). The acronym is set off with a hyphen (ue-Identity, not ueIdentity), in order to facilitate a consistent search pattern with corresponding type identifiers. -- Identifiers that are likely to be keywords of some language, especially widely used languages, such as C++ or Java, should be avoided to the extent possible. -- Identifiers, other than PDU identifiers, longer than 25 characters should be avoided where possible. It is recommended to use abbreviations, which should be done in a consistent manner i.e. use 'Meas' instead of 'Measurement' for all occurrences. Examples of typical abbreviations are given in table A.3.1.2.1-1 below. -- For future extension: where versions of an ASN.1 field or type need to be distinguished by release, a suffix of the form "rX" is used, e.g., Foo-r9 for the Rel-9 version of the ASN.1 type Foo. If an ASN.1 field or type provides only the extension of a corresponding earlier field or type (see sub-clause A.4), a suffix of the form "vXYZext" is used, e.g., AnElement-v10b0ext for the extension of the ASN.1 type AnElement introduced in the version 10.11.0 of the specification. Digits 0...9, 10, 11, etc. are used to represent the first digit of the version number. Lower case letters a, b, c, etc. are used to represent the second (and third) digit of the version number if they are greater than 9. -- More generally, in case there is a need to distinguish different variants of an ASN.1 field or IE, a suffix should be added at the end of the identifiers e.g. MeasObjectUTRAN, ConfigCommon. When there is no particular need to distinguish the fields (e.g. because the field is included in different IEs), a common field identifier name may be used. This may be attractive e.g. in case the procedural specification is the same for the different variants. -Table A.3.1.2-1: Examples of typical abbreviations used in ASN.1 identifiers -Abbreviation Abbreviated word Conf Confirmation Config Configuration DL Downlink Freq Frequency Id Identity Ind Indication Info Information Meas Measurement Neigh Neighbour(ing) Param(s) Parameter(s) Persist Persistent Phys Physical Reestab Reestablishment Req Request Sched Scheduling Thresh Threshold Transm Transmission UL Uplink -NOTE: The table A.3.1.2.1-1 is not exhaustive. Additional abbreviations may be used in ASN.1 identifiers when needed. -A.3.1.3 Text references using ASN.1 identifiers -A text reference into the RRC PDU contents description from other parts of the specification is made using the ASN.1 field or type identifier of the referenced element. The ASN.1 field and type identifiers used in text references should be in the italic font style. The "do not check spelling and grammar" attribute in Word should be set. Quotation marks (i.e., " ") should not be used around the ASN.1 field or type identifier. -A reference to an RRC PDU type should be made using the corresponding ASN.1 type identifier followed by the word "message", e.g., a reference to the RRCConnectionRelease message. -A reference to a specific part of an RRC PDU, or to a specific part of any other ASN.1 type, should be made using the corresponding ASN.1 field identifier followed by the word "field", e.g., a reference to the prioritisedBitRate field in the example below. --- /example/ ASN1START - -LogicalChannelConfig ::= SEQUENCE { - ul-SpecificParameters SEQUENCE { - priority Priority, - prioritisedBitRate PrioritisedBitRate, - bucketSizeDuration BucketSizeDuration, - logicalChannelGroup INTEGER (0..3) - } OPTIONAL -} - --- ASN1STOP - -NOTE: All the ASN.1 start tags in the ASN.1 sections, used as examples in this annex to the specification, are deliberately distorted, in order not to include them when the ASN.1 description of the RRC PDU contents is extracted from the specification. -A reference to a specific type of information element should be made using the corresponding ASN.1 type identifier preceded by the acronym "IE", e.g., a reference to the IE LogicalChannelConfig in the example above. -References to a specific type of information element should only be used when those are generic, i.e., without regard to the particular context wherein the specific type of information element is used. If the reference is related to a particular context, e.g., an RRC PDU type (message) wherein the information element is used, the corresponding field identifier in that context should be used in the text reference. -A reference to a specific value of an ASN.1 field should be made using the corresponding ASN.1 value while using quotation marks (i.e., " ") around the ASN.1 value, e.g., 'if the status field is set to value "true"'. -A.3.2 High-level message structure -Within each logical channel type, the associated RRC PDU (message) types are alternatives within a CHOICE, as shown in the example below. --- /example/ ASN1START - -DL-DCCH-Message ::= SEQUENCE { - message DL-DCCH-MessageType -} - -DL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - dlInformationTransfer DLInformationTransfer, - handoverFromEUTRAPreparationRequest HandoverFromEUTRAPreparationRequest, - mobilityFromEUTRACommand MobilityFromEUTRACommand, - rrcConnectionReconfiguration RRCConnectionReconfiguration, - rrcConnectionRelease RRCConnectionRelease, - securityModeCommand SecurityModeCommand, - ueCapabilityEnquiry UECapabilityEnquiry, - spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -A nested two-level CHOICE structure is used, where the alternative PDU types are alternatives within the inner level c1 CHOICE. -Spare alternatives (i.e., spare1 in this case) may be included within the c1 CHOICE to facilitate future extension. The number of such spare alternatives should not extend the total number of alternatives beyond an integer-power-of-two number of alternatives (i.e., eight in this case). -Further extension of the number of alternative PDU types is facilitated using the messageClassExtension alternative in the outer level CHOICE. -A.3.3 Message definition -Each PDU (message) type is specified in an ASN.1 section similar to the one shown in the example below. --- /example/ ASN1START - -RRCConnectionReconfiguration ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReconfiguration-r8 RRCConnectionReconfiguration-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfiguration-r8-IEs ::= SEQUENCE { - -- Enter the IEs here. - ... -} - --- ASN1STOP - -Hooks for critical and non-critical extension should normally be included in the PDU type specification. How these hooks are used is further described in sub-clause A.4. -Critical extensions are characterised by a redefinition of the PDU contents and need to be governed by a mechanism for protocol version agreement between the encoder and the decoder of the PDU, such that the encoder is prevented from sending a critically extended version of the PDU type, which is not comprehended by the decoder. -Critical extension of a PDU type is facilitated by a two-level CHOICE structure, where the alternative PDU contents are alternatives within the inner level c1 CHOICE. Spare alternatives (i.e., spare3 down to spare1 in this case) may be included within the c1 CHOICE. The number of spare alternatives to be included in the original PDU specification should be decided case by case, based on the expected rate of critical extension in the future releases of the protocol. -Further critical extension, when the spare alternatives from the original specifications are used up, is facilitated using the criticalExtensionsFuture in the outer level CHOICE. -In PDU types where critical extension is not expected in the future releases of the protocol, the inner level c1 CHOICE and the spare alternatives may be excluded, as shown in the example below. --- /example/ ASN1START - -RRCConnectionReconfigurationComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReconfigurationComplete-r8 - RRCConnectionReconfigurationComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfigurationComplete-r8-IEs ::= SEQUENCE { - -- Enter the IEs here. -- -- Cond condTag - ... -} - --- ASN1STOP - -Non-critical extensions are characterised by the addition of new information to the original specification of the PDU type. If not comprehended, a non-critical extension may be skipped by the decoder, whilst the decoder is still able to complete the decoding of the comprehended parts of the PDU contents. -Non-critical extensions at locations other than the end of the message or other than at the end of a field contained in a BIT or OCTET STRING are facilitated by use of the ASN.1 extension marker "...". The original specification of a PDU type should normally include the extension marker at the end of the sequence of information elements contained. -Non-critical extensions at the end of the message or at the end of a field that is contained in a BIT or OCTET STRING are facilitated by use of an empty sequence e.g. as shown in the following example: --- /example/ ASN1START - -RRCMessage-r8-IEs ::= SEQUENCE { - field1 InformationElement1, - field2 InformationElement2, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -The ASN.1 section specifying the contents of a PDU type may be followed by a field description table where a further description of, e.g., the semantic properties of the fields may be included. The general format of this table is shown in the example below. The field description table is absent in case there are no fields for which further description needs to be provided e.g. because the PDU does not include any fields, or because an IE is defined for each field while there is nothing specific regarding the use of this IE that needs to be specified. -%PDU-TypeIdentifier% field descriptions %field identifier% -Field description. %field identifier% -Field description. -The field description table has one column. The header row shall contain the ASN.1 type identifier of the PDU type. -The following rows are used to provide field descriptions. Each row shall include a first paragraph with a field identifier (in bold and italic font style) referring to the part of the PDU to which it applies. The following paragraphs at the same row may include (in regular font style), e.g., semantic description, references to other specifications and/ or specification of value units, which are relevant for the particular part of the PDU. -The parts of the PDU contents that do not require a field description shall be omitted from the field description table. -A.3.4 Information elements -Each IE (information element) type is specified in an ASN.1 section similar to the one shown in the example below. --- /example/ ASN1START - -PRACH-ConfigSIB ::= SEQUENCE { - rootSequenceIndex INTEGER (0..1023), - prach-ConfigInfo PRACH-ConfigInfo -} - -PRACH-Config ::= SEQUENCE { - rootSequenceIndex INTEGER (0..1023), - prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON -} - -PRACH-ConfigInfo ::= SEQUENCE { - prach-ConfigIndex ENUMERATED {ffs}, - highSpeedFlag ENUMERATED {ffs}, - zeroCorrelationZoneConfig ENUMERATED {ffs} -} - --- ASN1STOP - -IEs should be introduced whenever there are multiple fields for which the same set of values apply. IEs may also be defined for other reasons e.g. to break down a ASN.1 definition in to smaller pieces. -A group of closely related IE type definitions, like the IEs PRACH-ConfigSIB and PRACH-Config in this example, are preferably placed together in a common ASN.1 section. The IE type identifiers should in this case have a common base, defined as the generic type identifier. It may be complemented by a suffix to distinguish the different variants. The "PRACH-Config" is the generic type identifier in this example, and the "SIB" suffix is added to distinguish the variant. The sub-clause heading and generic references to a group of closely related IEs defined in this way should use the generic type identifier. -The same principle should apply if a new version, or an extension version, of an existing IE is created for critical or non-critical extension of the protocol (see sub-clause A.4). The new version, or the extension version, of the IE is included in the same ASN.1 section defining the original. A suffix is added to the type identifier, using the naming conventions defined in sub-clause A.3.1.2, indicating the release or version of the where the new version, or extension version, was introduced. -Local IE type definitions, like the IE PRACH-ConfigInfo in the example above, may be included in the ASN.1 section and be referenced in the other IE types defined in the same ASN.1 section. The use of locally defined IE types should be encouraged, as a tool to break up large and complex IE type definitions. It can improve the readability of the code. There may also be a benefit for the software implementation of the protocol end-points, as these IE types are typically provided by the ASN.1 compiler as independent data elements, to be used in the software implementation. -An IE type defined in a local context, like the IE PRACH-ConfigInfo, should not be referenced directly from other ASN.1 sections in the RRC specification. An IE type which is referenced in more than one ASN.1 section should be defined in a separate sub-clause, with a separate heading and a separate ASN.1 section (possibly as one in a set of closely related IE types, like the IEs PRACH-ConfigSIB and PRACH-Config in the example above). Such IE types are also referred to as 'global IEs'. -NOTE: Referring to an IE type, that is defined as a local IE type in the context of another ASN.1 section, does not generate an ASN.1 compilation error. Nevertheless, using a locally defined IE type in that way makes the IE type definition difficult to find, as it would not be visible at an outline level of the specification. It should be avoided. -The ASN.1 section specifying the contents of one or more IE types, like in the example above, may be followed by a field description table, where a further description of, e.g., the semantic properties of the fields of the information elements may be included. This table may be absent, similar as indicated in sub-clause A.3.3 for the specification of the PDU type. The general format of the field description table is the same as shown in sub-clause A.3.3 for the specification of the PDU type. -A.3.5 Fields with optional presence -A field with optional presence may be declared with the keyword DEFAULT. It identifies a default value to be assumed, if the sender does not include a value for that field in the encoding: --- /example/ ASN1START - -PreambleInfo ::= SEQUENCE { - numberOfRA-Preambles INTEGER (1..64) DEFAULT 1, - ... -} - --- ASN1STOP - -Alternatively, a field with optional presence may be declared with the keyword OPTIONAL. It identifies a field for which a value can be omitted. The omission carries semantics, which is different from any normal value of the field: --- /example/ ASN1START - -PRACH-Config ::= SEQUENCE { - rootSequenceIndex INTEGER (0..1023), - prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON -} - --- ASN1STOP - -The semantics of an optionally present field, in the case it is omitted, should be indicated at the end of the paragraph including the keyword OPTIONAL, using a short comment text with a need statement. The need statement includes the keyword "Need", followed by one of the predefined semantics tags (OP, ON or OR) defined in sub-clause 6.1. If the semantics tag OP is used, the semantics of the absent field are further specified either in the field description table following the ASN.1 section, or in procedure text. -A.3.6 Fields with conditional presence -A field with conditional presence is declared with the keyword OPTIONAL. In addition, a short comment text shall be included at the end of the paragraph including the keyword OPTIONAL. The comment text includes the keyword "Cond", followed by a condition tag associated with the field ("UL" in this example): --- /example/ ASN1START - -LogicalChannelConfig ::= SEQUENCE { - ul-SpecificParameters SEQUENCE { - priority INTEGER (0), - ... - } OPTIONAL -- Cond UL -} - --- ASN1STOP - -When conditionally present fields are included in an ASN.1 section, the field description table after the ASN.1 section shall be followed by a conditional presence table. The conditional presence table specifies the conditions for including the fields with conditional presence in the particular ASN.1 section. -Conditional presence Explanation UL Specification of the conditions for including the field associated with the condition tag = "UL". Semantics in case of optional presence under certain conditions may also be specified. -The conditional presence table has two columns. The first column (heading: "Conditional presence") contains the condition tag (in italic font style), which links the fields with a condition tag in the ASN.1 section to an entry in the table. The second column (heading: "Explanation") contains a text specification of the conditions and requirements for the presence of the field. The second column may also include semantics, in case of an optional presence of the field, under certain conditions i.e. using the same predefined tags as defined for optional fields in A.3.5. -If the ASN.1 section does not include any fields with conditional presence, the conditional presence table shall not be included. -Whenever a field is only applicable in specific cases e.g. TDD, use of conditional presence should be considered. -A.3.7 Guidelines on use of lists with elements of SEQUENCE type -Where an information element has the form of a list (the SEQUENCE OF construct in ASN.1) with the type of the list elements being a SEQUENCE data type, an information element shall be defined for the list elements even if it would not otherwise be needed. -For example, a list of PLMN identities with reservation flags is defined as in the following example: --- /example/ ASN1START - -PLMN-IdentityList ::= SEQUENCE (SIZE (1..6)) OF PLMN-IdentityList - -PLMN-IdentityList ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellReservedForOperatorUse ENUMERATED {reserved, notReserved} -} - --- ASN1STOP -rather than as in the following (bad) example, which may cause generated code to contain types with unpredictable names: --- /bad example/ ASN1START - -PLMN-IdentityList ::= SEQUENCE (SIZE (1..6)) OF SEQUENCE { - plmn-Identity PLMN-Identity, - cellReservedForOperatorUse ENUMERATED {reserved, notReserved} -} - --- ASN1STOP -A.4 Extension of the PDU specifications -A.4.1 General principles to ensure compatibility -It is essential that extension of the protocol does not affect interoperability i.e. it is essential that implementations based on different versions of the RRC protocol are able to interoperate. In particular, this requirement applies for the following kind of protocol extensions: -- Introduction of new PDU types (i.e. these should not cause unexpected behaviour or damage). -- Introduction of additional fields in a PDUs (i.e. it should be possible to ignore uncomprehended extensions without affecting the handling of the other parts of the message). -- Introduction of additional values of a field of PDUs. If used, the behaviour upon reception of an uncomprehended value should be defined. -It should be noted that the PDU extension mechanism may depend on the logical channel used to transfer the message e.g. for some PDUs an implementation may be aware of the protocol version of the peer in which case selective ignoring of extensions may not be required. -A.4.2 Critical extension of messages -The mechanisms to critically extend a message are defined in A.3.3. There are both "outer branch" and "inner branch" mechanisms available. The "outer branch" consists of a CHOICE having the name criticalExtensions, with two values, c1 and criticalExtensionsFuture. The criticalExtensionsFuture branch consists of an empty SEQUENCE, while the c1 branch contains the "inner branch" mechanism. -The "inner branch" structure is a CHOICE with values of the form "MessageName-rX-IEs" (e.g., "RRCConnectionReconfiguration-r8-IEs") or "spareX", with the spare values having type NULL. The "-rX-IEs" structures contain the complete structure of the message IEs for the appropriate release; i.e., the critical extension branch for the Rel-10 version of a message includes all Rel-8 and Rel-9 fields (that are not obviated in the later version), rather than containing only the additional Rel-10 fields. -The following guidelines may be used when deciding which mechanism to introduce for a particular message, i.e. only an 'outer branch', or an 'outer branch' in combination with an 'inner branch' including a certain number of spares: -- For certain messages, e.g. initial uplink messages, messages transmitted on a broadcast channel, critical extension may not be applicable. -- An outer branch may be sufficient for messages not including any fields. -- The number of spares within inner branch should reflect the likelihood that the message will be critically extended in future releases (since each release with a critical extension for the message consumes one of the spare values). The estimation of the critical extension likelyhood may be based on the number, size and changeability of the fields included in the message. -- In messages where an inner branch extension mechanism is available, all spare values of the inner branch should be used before any critical extensions are added using the outer branch. -A.4.3 Non-critical extension of messages -The mechanisms to extend a message in a non-critical manner are defined in A.3.3. W.r.t. the use of extension markers, the following additional guidelines apply: -- The extension marker ("…") is the primary non-critical extension mechanism that is used unless a length determinant is not required. Examples of cases where a length determinant is not required: -- at the end of a message, -- at the end of a structure contained in a BIT STRING or OCTET STRING -- Extension markers within SEQUENCE -- Extension markers are primarily, but not exclusively, introduced at the higher nesting levels -- Extension markers are introduced for a SEQUENCE comprising several fields as well as for information elements which extension would result in complex structures without it (e.g. re-introducing another list) -- Extension markers are introduced to make it possible to maintain important information structures e.g. parameters relevant for one particular RAT -- Extension markers are also used for size critical messages (i.e. messages on BCCH, PCCH and CCCH), although introduced somewhat more carefully -- Extension markers within ENUMERATED -- Spare values are used until the number of values reaches the next power of 2, while the extension marker caters for extension beyond that limit -- Extension markers within CHOICE: -- Extension markers are introduced when extension is foreseen and when comprehension is not required by the receiver i.e. a behaviour is defined for the case where the receiver cannot comprehend the extended value (e.g. ignoring an optional CHOICE field) -There are no additional guidelines w.r.t. the use of non-critical extensions at the end of a message/ of a field contained in an OCTET or BIT STRING. -A.5 Guidelines regarding inclusion of transaction identifiers in RRC messages -The following rules provide guidance on which messages should include a Transaction identifier -1: DL messages on CCCH that move UE to RRC-Idle should not include the RRC transaction identifier. -2: All network initiated DL messages by default should include the RRC transaction identifier. -3: All UL messages that are direct response to a DL message with an RRC Transaction identifier should include the RRC Transaction identifier. -4: All UL messages that require a direct DL response message should include an RRC transaction identifier. -5: All UL messages that are not in response to a DL message nor require a corresponding response from the network should not include the RRC Transaction identifier. -A.6 Protection of RRC messages (informative) -The following list provides information which messages can be sent (unprotected) prior to security activation and which messages can be sent unprotected after security activation. -P…Messages that can be sent (unprotected) prior to security activation -A - I…Messages that can be sent without integrity protection after security activation -A - C…Messages that can be sent unciphered after security activation -NA… Message can never be sent after security activation -Message P A-I A-C Comment CSFBParametersRequestCDMA2000 + - - CSFBParametersResponseCDMA2000 + - - CounterCheck - - - CounterCheckResponse - - - DLInformationTransfer + - - HandoverFromEUTRAPreparationRequest (CDMA2000) - - - MasterInformationBlock + + + MeasurementReport + - - Justification for case “P”: RAN2 agreed that measurement configuration may be sent prior to security activation MobilityFromEUTRACommand - - - Paging + + + RRCConnectionReconfiguration + - - The message shall not be sent unprotected before security activation if it is used to perform handover or to establish SRB2 and DRBs RRCConnectionReconfigurationComplete + - - Unprotected, if sent as response to RRCConnectionReconfiguration which was sent before security activation RRCConnectionReestablishment - + + This message is not protected by PDCP operation. RRCConnectionReestablishmentComplete - - - RRCConnectionReestablishmentReject - + + One reason to send this may be that the security context has been lost, therefore sent as unprotected. RRCConnectionReestablishmentRequest - - + This message is not protected by PDCP operation. However a short MAC-I is included. RRCConnectionReject + NA NA RRCConnectionRelease + - - Jusitification for P: If the RRC connection only for signalling not requiring DRBs or ciphered messages, or the signalling connection has to be released prematurily, this message is sent as unprotected. RRCConnectionRequest + NA NA RRCConnectionSetup + NA NA RRCConnectionSetupComplete + NA NA SecurityModeCommand + NA NA Integrity protection applied, but no ciphering (integrity verification done after the message received by RRC) SecurityModeComplete - NA NA Integrity protection applied, but no ciphering. Ciphering is applied after completing the procedure. SecurityModeFailure + NA NA Neither integrity protection nor ciphering applied. SystemInformation + + + SystemInformationBlockType1 + + + UECapabilityEnquiry + - - UECapabilityInformation + - - ULHandoverPreparationTransfer (CDMA2000) - - - This message should follow HandoverFromEUTRAPreparationRequest ULInformationTransfer + - - -A.7 Miscellaneous -The following miscellaneous conventions should be used: -- References: Whenever another specification is referenced, the specification number and optionally the relevant subclause, table or figure, should be indicated in addition to the pointer to the References section e.g. as follows: 'see TS 36.212 [22, 5.3.3.1.6]'. -Annex B (normative): Release 8 AS feature handling -B.1 Feature group indicators -This annex contains the definitions of the bits in field featureGroupIndicators. -In this release of the protocol, the UE shall include the field featureGroupIndicators in the IE UE-EUTRA-Capability. For a specific indicator, if all functionalities for a feature group listed in Table B.1-1 have been implemented and tested, the UE shall set the indicator as one (1), else (i.e. if any one of the functionalities in a feature group listed in Table B.1-1, which have not been implemented or tested), the UE shall set the indicator as zero (0). -The UE shall set all indicators, which do not have a definition in the table B.1-1, as zero. -If the optional field featureGroupIndicators is not included by UE supporting future release, the network may assume that UE supports all features listed in Table B.1-1 and deployed in the network. -Table B.1-1: Defintions of feature group indicators -Index of indicator (bit number) Definition -(description of the supported functionality, if indicator set to one) Notes 1 (leftmost bit) - Intra-subframe frequency hopping for PUSCH scheduled by UL grant -- Extended cyclic prefix with ?f = 7.5kHz for DL resource block -- DCI format 3a (TPC commands for PUCCH and PUSCH with single bit power adjustments) -- Multi-user MIMO for PDSCH -- Aperiodic CQI/PMI/RI reporting on PUSCH: Mode 2-0 – UE selected subband CQI without PMI -- Aperiodic CQI/PMI/RI reporting on PUSCH: Mode 2-2 – UE selected subband CQI with multiple PMI 2 - Simultaneous CQI and ACK/NACK on PUCCH, i.e. PUCCH format 2a and 2b -- Absolute TPC command for PUSCH -- Resource allocation type 1 for PDSCH -- Periodic CQI/PMI/RI reporting on PUCCH: Mode 2-0 – UE selected subband CQI without PMI -- Periodic CQI/PMI/RI reporting on PUCCH: Mode 2-1 – UE selected subband CQI with single PMI 3 - Semi-persistent scheduling -- TTI bundling -- 5bit RLC UM SN -- 7bit PDCP SN - can only be set to 1 if the UE has set bit number 7 to 1. 4 - Short DRX cycle - can only be set to 1 if the UE has set bit number 5 to 1. 5 - Long DRX cycle -- DRX command MAC control element 6 - Prioritised bit rate 7 - RLC UM - can only be set to 0 if the UE does not support voice 8 - EUTRA RRC_CONNECTED to UTRA CELL_DCH PS handover - can only be set to 1 if the UE has set bit number 22 to 1 9 - EUTRA RRC_CONNECTED to GERAN GSM_Dedicated handover - related to SR-VCC -- can only be set to 1 if the UE has set bit number 23 to 1 10 - EUTRA RRC_CONNECTED to GERAN (Packet_) Idle by Cell Change Order -- EUTRA RRC_CONNECTED to GERAN (Packet_) Idle by Cell Change Order with NACC (Network Assisted Cell Change) 11 - EUTRA RRC_CONNECTED to CDMA2000 1xRTT CS Active handover - can only be set to 1 if the UE has sets bit number 24 to 1 12 - EUTRA RRC_CONNECTED to CDMA2000 HRPD Active handover - can only be set to 1 if the UE has set bit number 26 to 1 13 - Inter-frequency handover - can only be set to 1 if the UE has set bit number 25 to 1 14 - Measurement reporting event: Event A4 – Neighbour > threshold -- Measurement reporting event: Event A5 – Serving < threshold1 & Neighbour > threshold2 15 - Measurement reporting event: Event B1 – Neighbour > threshold - can only be set to 1 if the UE has set at least one of the bit number 22, 23, 24 or 26 to 1. 16 - Periodical measurement reporting for non-ANR related measurements 17 - Periodical measurement reporting for SON / ANR -- ANR related intra-frequency measurement reporting events - can only be set to 1 if the UE has set bit number 5 to 1. 18 - ANR related inter-frequency measurement reporting events - can only be set to 1 if the UE has set bit number 5 to 1. 19 - ANR related inter-RAT measurement reporting events - can only be set to 1 if the UE has set bit number 5 to 1. 20 If bit number 7 is set to ‘1’: -- RB combination 1: SRB1 and SRB2 for DCCH + 1x AM DRB -- RB combination 2: SRB1 and SRB2 for DCCH + 1x AM DRB + 1x UM DRB -- RB combination 3: SRB1 and SRB2 for DCCH + 2x AM DRB -- RB combination 4: SRB1 and SRB2 for DCCH + 2x AM DRB + 1x UM DRB -- RB combination 5: SRB1 and SRB2 for DCCH + 2x AM DRB + 2x UM DRB -- RB combination 6: SRB1 and SRB2 for DCCH + 3x AM DRB -- RB combination 7: SRB1 and SRB2 for DCCH + 3x AM DRB + 1x UM DRB -- RB combination 8: SRB1 and SRB2 for DCCH + 3x AM DRB + 2x UM DRB -- RB combination 9: SRB1 and SRB2 for DCCH + 4x AM DRB -- RB combination 10: SRB1 and SRB2 for DCCH + 4x AM DRB + 1x UM DRB -- RB combination 11: SRB1 and SRB2 for DCCH + 4x AM DRB + 2x UM DRB -- RB combination 12: SRB1 and SRB2 for DCCH + 5x AM DRB + 3x UM DRB -- RB combination 13: SRB1 and SRB2 for DCCH + 8x AM DRB -If bit number 7 is set to ‘0’ -- RB combinations 1, 3, 6, 9 and 13 - Regardless of what bit number 7 and bit number 20 is set to, UE shall support RB combinations 1, 3, 6 and 9 -- Regardless of what bit number 20 is set to, if bit number 7 is set to ‘1’, UE shall support RB combinations 1, 2, 3, 4, 6, 7, 9 and 10 - 21 - Predefined intra- and inter-subframe frequency hopping for PUSCH with N_sb > 1 -- Predefined inter-subframe frequency hopping for PUSCH with N_sb > 1 22 - UTRAN measurements, reporting and measurement reporting event B2 in E-UTRA connected mode 23 - GERAN measurements, reporting and measurement reporting event B2 in E-UTRA connected mode 24 - 1xRTT measurements, reporting and measurement reporting event B2 in E-UTRA connected mode 25 - Inter-frequency measurements and reporting in E-UTRA connected mode 26 - HRPD measurements, reporting and measurement reporting event B2 in E-UTRA connected mode 27 Undefined 28 Undefined 29 Undefined 30 Undefined 31 Undefined 32 Undefined -Clarification for mobility from EUTRAN and inter-frequency handover within EUTRAN -There are several feature groups related to mobility from E-UTRAN and inter-frequency handover within EUTRAN. The description of these features is based on the assumption that we have 5 main “functions” related to mobility from E-UTRAN: -A. Support of measurements and cell reselection procedure in idle mode -B. Support of RRC release with redirection procedure in connected mode -C. Support of Network Assisted Cell Change in connected mode -D. Support of measurements and reporting in connected mode -E. Support of handover procedure in connected mode -All functions can be applied for mobility to Inter-frequency to EUTRAN, GERAN, UTRAN, CDMA2000 HRPD and CDMA2000 1xRTT except for function C) which is only applicable for mobility to GERAN. Table B.1-2 below summarises the mobility functions that are supported based on the UE capability signaling (band support) and the setting of the feature group support indicators. -Table B.1-2: Mobility from E-UTRAN -Feature GERAN UTRAN HRPD 1xRTT EUTRAN A. Measurements and cell reselection procedure in E-UTRA idle mode Supported if GERAN band support is indicated Supported if UTRAN band support is indicated Supported if CDMA2000 HRPD band support is indicated Supported if CDMA2000 1xRTT band support is indicated Supported for supported bands B. RRC release with blind redirection procedure in E-UTRA connected mode Supported if GERAN band support is indicated Supported if UTRAN band support is indicated Supported if CDMA2000 HRPD band support is indicated Supported if CDMA2000 1xRTT band support is indicated Supported for supported bands C. Cell Change Order (with or without) Network Assisted Cell Change) in E-UTRA connected mode Group 10 N.A. N.A N.A N.A. D. Inter-frequency/RAT measurements, reporting and measurement reporting event B2 (for inter-RAT) in E-UTRA connected mode Group 23 Group 22 Group 26 Group 24 Group 25 E. Inter-frequency/RAT handover procedure in E-UTRA connected mode Group 9 (GSM_connected handover) -Separate UE capability bit defined in TS 36.306 for PS handover Group 8 (PS handover) Group 12 Group 11 Group 13 -Note that the measurements and reporting function (D) is distinct from the redirection (B), CCO (C) and handover (E) functions. In case measurements and reporting function is not supported, the network may still issue the mobility procedures in a blind fashion. -B.2 CSG support -In this release of the protocol, it is mandatory for the UE to support a minimum set of CSG functionality consisting of: -- Identifying whether a cell is CSG or not; -- Ignoring CSG cells in cell selection/reselection. -Additional CSG functionality in AS, i.e. the requirement to detect and camp on CSG cells when the "allowed CSG list" is available or when manual CSG selection is triggered by the user, are related to the corresponding NAS features. This additional AS functionality consists of: -- Manual CSG selection; -- Autonomous CSG search; -- Implicit priority handling for cell reselection with CSG cells. -It is possible that this additional CSG functionality in AS is not supported or tested in early UE implementations. -Note that since the above AS features relate to idle mode operations, the capability support is not signalled to the network. For these reasons, no “feature group indicator” is assigned to this feature to indicate early support in Rel-8. - - -Annex C (informative): -Change history - -Change history Date TSG # TSG Doc. CR Rev Subject/Comment Old New 12/2007 RP-38 RP-070920 - Approved at TSG-RAN #38 and placed under Change Control 1.0.0 8.0.0 03/2008 RP-39 RP-080163 0001 4 CR to 36.331 with Miscellaneous corrections 8.0.0 8.1.0 03/2008 RP-39 RP-080164 0002 2 CR to 36.331 to convert RRC to agreed ASN.1 format 8.0.0 8.1.0 05/2008 RP-40 RP-080361 0003 1 CR to 36.331 on Miscellaneous clarifications/ corrections 8.1.0 8.2.0 09/2008 RP-41 RP-080693 0005 - CR on Miscellaneous corrections and clarifications 8.2.0 8.3.0 12/2008 RP-42 RP-081021 0006 - Miscellaneous corrections and clarifications 8.3.0 8.4.0 03/2009 RP-43 RP-090131 0007 - Correction to the Counter Check procedure 8.4.0 8.5.0 RP-43 RP-090131 0008 - CR to 36.331-UE Actions on Receiving SIB11 8.4.0 8.5.0 RP-43 RP-090131 0009 1 Spare usage on BCCH 8.4.0 8.5.0 RP-43 RP-090131 0010 - Issues in handling optional IE upon absence in GERAN NCL 8.4.0 8.5.0 RP-43 RP-090131 0011 - CR to 36.331 on Removal of useless RLC re-establishment at RB release 8.4.0 8.5.0 RP-43 RP-090131 0012 1 Clarification to RRC level padding at PCCH and BCCH 8.4.0 8.5.0 RP-43 RP-090131 0013 - Removal of Inter-RAT message 8.4.0 8.5.0 RP-43 RP-090131 0014 - Padding of the SRB-ID for security input 8.4.0 8.5.0 RP-43 RP-090131 0015 - Validity of ETWS SIB 8.4.0 8.5.0 RP-43 RP-090131 0016 1 Configuration of the Two-Intervals-SPS 8.4.0 8.5.0 RP-43 RP-090131 0017 - Corrections on Scaling Factor Values of Qhyst 8.4.0 8.5.0 RP-43 RP-090131 0018 1 Optionality of srsMaxUppts 8.4.0 8.5.0 RP-43 RP-090131 0019 - CR for discussion on field name for common and dedicated IE 8.4.0 8.5.0 RP-43 RP-090131 0020 - Corrections to Connected mode mobility 8.4.0 8.5.0 RP-43 RP-090131 0021 - Clarification regarding the measurement reporting procedure 8.4.0 8.5.0 RP-43 RP-090131 0022 1 Corrections on s-Measure 8.4.0 8.5.0 RP-43 RP-090131 0023 1 R1 of CR0023 (R2-091029) on combination of SPS and TTI bundling for TDD 8.4.0 8.5.0 RP-43 RP-090131 0024 - L3 filtering for path loss measurements 8.4.0 8.5.0 RP-43 RP-090131 0025 1 S-measure handling for reportCGI 8.4.0 8.5.0 RP-43 RP-090131 0026 1 Measurement configuration clean up 8.4.0 8.5.0 RP-43 RP-090131 0027 - Alignment of measurement quantities for UTRA 8.4.0 8.5.0 RP-43 RP-090131 0028 - CR to 36.331 on L1 parameters ranges alignment 8.4.0 8.5.0 RP-43 RP-090131 0029 - Default configuration for transmissionMode 8.4.0 8.5.0 RP-43 RP-090131 0030 - CR to 36.331 on RRC Parameters for MAC, RLC and PDCP 8.4.0 8.5.0 RP-43 RP-090131 0031 1 CR to 36.331 - Clarification on Configured PRACH Freq Offset 8.4.0 8.5.0 RP-43 RP-090131 0032 - Clarification on TTI bundling configuration 8.4.0 8.5.0 RP-43 RP-090131 0033 1 Update of R2-091039 on Inter-RAT UE Capability 8.4.0 8.5.0 RP-43 RP-090133 0034 - Feature Group Support Indicators 8.4.0 8.5.0 RP-43 RP-090131 0036 - Corrections to RLF detection 8.4.0 8.5.0 RP-43 RP-090131 0037 - Indication of Dedicated Priority 8.4.0 8.5.0 RP-43 RP-090131 0038 2 Security Clean up 8.4.0 8.5.0 RP-43 RP-090131 0039 - Correction of TTT value range 8.4.0 8.5.0 RP-43 RP-090131 0040 - Correction on CDMA measurement result IE 8.4.0 8.5.0 RP-43 RP-090131 0041 1 Clarification of Measurement Reporting 8.4.0 8.5.0 RP-43 RP-090131 0042 - Spare values in DL and UL Bandwidth in MIB and SIB2 8.4.0 8.5.0 RP-43 RP-090131 0044 1 Clarifications to System Information Block Type 8 8.4.0 8.5.0 RP-43 RP-090131 0045 - Reception of ETWS secondary notification 8.4.0 8.5.0 RP-43 RP-090131 0046 1 Validity time for ETWS message Id and Sequence No 8.4.0 8.5.0 RP-43 RP-090131 0047 - CR for Timers and constants values used during handover to E-UTRA 8.4.0 8.5.0 RP-43 RP-090131 0048 - Inter-RAT Security Clarification 8.4.0 8.5.0 RP-43 RP-090131 0049 - CR to 36.331 on consistent naming of 1xRTT identifiers 8.4.0 8.5.0 RP-43 RP-090131 0050 - Capturing RRC behavior regarding NAS local release 8.4.0 8.5.0 RP-43 RP-090131 0051 - Report CGI before T321 expiry and UE null reporting 8.4.0 8.5.0 RP-43 RP-090131 0052 - System Information and 3 hour validity 8.4.0 8.5.0 RP-43 RP-090131 0053 1 Inter-Node AS Signalling 8.4.0 8.5.0 RP-43 RP-090131 0054 - Set of values for the parameter "messagePowerOffsetGroupB" 8.4.0 8.5.0 RP-43 RP-090131 0055 - CR to paging reception for ETWS capable UEs in RRC_CONNECTED 8.4.0 8.5.0 RP-43 RP-090131 0056 1 CR for CSG related items in 36.331 8.4.0 8.5.0 RP-43 RP-090131 0057 1 SRS common configuration 8.4.0 8.5.0 RP-43 RP-090131 0058 - RRC processing delay 8.4.0 8.5.0 RP-43 RP-090131 0059 - CR for HNB Name 8.4.0 8.5.0 RP-43 RP-090131 0060 3 Handover to EUTRA delta configuration 8.4.0 8.5.0 RP-43 RP-090131 0063 - Delivery of Message Identifier and Serial Number to upper layers for ETWS 8.4.0 8.5.0 RP-43 RP-090131 0066 - Clarification on the maximum size of cell lists 8.4.0 8.5.0 RP-43 RP-090131 0067 - Missing RRC messages in 'Protection of RRC messages' 8.4.0 8.5.0 RP-43 RP-090131 0069 1 Clarification on NAS Security Container 8.4.0 8.5.0 RP-43 RP-090131 0071 - Extension of range of CQI/PMI configuration index 8.4.0 8.5.0 RP-43 RP-090131 0072 1 Access barring alleviation in RRC connection establishment 8.4.0 8.5.0 RP-43 RP-090367 0077 6 Corrections to feature group support indicators 8.4.0 8.5.0 RP-43 RP-090131 0078 - CR from email discussion to capture DRX and TTT handling 8.4.0 8.5.0 RP-43 RP-090131 0079 1 Need Code handling on BCCH messages 8.4.0 8.5.0 RP-43 RP-090131 0080 - Unification of T300 and T301 and removal of miscallaneous FFSs 8.4.0 8.5.0 RP-43 RP-090131 0084 1 Proposed CR modifying the code-point definitions of neighbourCellConfiguration 8.4.0 8.5.0 RP-43 RP-090131 0087 2 Remove Redundant Optionality in SIB8 8.4.0 8.5.0 RP-43 RP-090131 0089 - Corrections to the generic error handling 8.4.0 8.5.0 RP-43 RP-090131 0090 - Configurability of T301 8.4.0 8.5.0 RP-43 RP-090131 0091 1 Correction related to TTT 8.4.0 8.5.0 RP-43 RP-090131 0095 - CR for 36.331 on SPS-config 8.4.0 8.5.0 RP-43 RP-090131 0096 2 CR for Deactivation of periodical measurement 8.4.0 8.5.0 RP-43 RP-090131 0099 2 SMC and reconfiguration 8.4.0 8.5.0 RP-43 RP-090131 0101 - TDD handover 8.4.0 8.5.0 RP-43 RP-090131 0102 - Corrections to system information acquisition 8.4.0 8.5.0 RP-43 RP-090131 0106 - Some Corrections and Clarifications to 36.331 8.4.0 8.5.0 RP-43 RP-090131 0109 - Clarification on the Maximum number of ROHC context sessions parameter 8.4.0 8.5.0 RP-43 RP-090131 0110 - Transmission of rrm-Config at Inter-RAT Handover 8.4.0 8.5.0 RP-43 RP-090131 0111 1 Use of SameRefSignalsInNeighbor parameter 8.4.0 8.5.0 RP-43 RP-090131 0112 - Default serving cell offset for measurement event A3 8.4.0 8.5.0 RP-43 RP-090131 0114 - dl-EARFCN missing in HandoverPreparationInformation 8.4.0 8.5.0 RP-43 RP-090131 0115 - Cleanup of references to 36.101 8.4.0 8.5.0 RP-43 RP-090131 0117 - Correction to the value range of UE-Categories 8.4.0 8.5.0 RP-43 RP-090131 0122 1 Correction on RRC connection re-establishment 8.4.0 8.5.0 RP-43 RP-090131 0124 - Performing Measurements to report CGI for CDMA2000 8.4.0 8.5.0 RP-43 RP-090131 0125 - CDMA2000-SystemTimeInfo in VarMeasurementConfiguration 8.4.0 8.5.0 RP-43 RP-090131 0126 - UE Capability Information for CDMA2000 1xRTT 8.4.0 8.5.0 RP-43 RP-090131 0127 - CDMA2000 related editorial changes 8.4.0 8.5.0 RP-43 RP-090131 0128 - Draft CR to 36.331 on State mismatch recovery at re-establishment 8.4.0 8.5.0 RP-43 RP-090131 0129 1 Draft CR to 36.331 on Renaming of AC barring related IEs 8.4.0 8.5.0 RP-43 RP-090131 0130 2 Draft CR to 36.331 on Inheriting of dedicated priorities at inter-RAT reselection 8.4.0 8.5.0 RP-43 RP-090131 0135 - Proposed CR to 36.331 Description alignment for paging parameter, nB 8.4.0 8.5.0 RP-43 RP-090131 0139 2 Miscellaneous corrections and clarifications resulting from ASN.1 review 8.4.0 8.5.0 RP-43 RP-090131 0141 1 Correction regarding Redirection Information fo GERAN 8.4.0 8.5.0 RP-43 RP-090131 0142 - Further ASN.1 review related issues 8.4.0 8.5.0 RP-43 RP-090131 0143 - Periodic measurements 8.4.0 8.5.0 RP-43 RP-090131 0144 1 Further analysis on code point "OFF" for ri-ConfigIndex 8.4.0 8.5.0 RP-43 RP-090131 0145 1 Adding and deleting same measurement or configuration in one message 8.4.0 8.5.0 RP-43 RP-090131 0147 - Corrections to IE dataCodingScheme in SIB11 8.4.0 8.5.0 RP-43 RP-090131 0148 - Clarification on Mobility from E-UTRA 8.4.0 8.5.0 RP-43 RP-090131 0149 - 36.331 CR related to “not applicable” 8.4.0 8.5.0 RP-43 RP-090131 0150 1 UE radio capability transfer 8.4.0 8.5.0 RP-43 RP-090131 0151 - CR to 36.331 on value of CDMA band classes 8.4.0 8.5.0 RP-43 RP-090131 0152 - Corrections to DRB modification 8.4.0 8.5.0 RP-43 RP-090131 0153 - Correction to presence condition for pdcp-config 8.4.0 8.5.0 RP-43 RP-090131 0155 - TDD HARQ-ACK feedback mode 8.4.0 8.5.0 RP-43 RP-090275 0157 - Corrections regarding use of carrierFreq for CDMA (SIB8) and GERAN (measObject) 8.4.0 8.5.0 RP-43 RP-090321 0156 1 Sending of GERAN SI/PSI information at Inter-RAT Handover 8.4.0 8.5.0 RP-43 RP-090339 0158 - Clarification of CSG support 8.4.0 8.5.0 06/2009 RP-44 RP-090516 0159 - Octet alignment of VarShortMAC-Input 8.5.0 8.6.0 RP-44 RP-090516 0160 3 Minor corrections to the feature grouping 8.5.0 8.6.0 RP-44 RP-090516 0161 - Security clarification 8.5.0 8.6.0 RP-44 RP-090516 0162 1 Sending of GERAN SI/PSI information at Inter-RAT Handover 8.5.0 8.6.0 RP-44 RP-090516 0163 1 Correction of UE measurement model 8.5.0 8.6.0 RP-44 RP-090516 0164 - Restricting the reconfiguration of UM RLC SN field size 8.5.0 8.6.0 RP-44 RP-090516 0165 1 36.331 CR on Clarification on cell change order from GERAN to E-UTRAN 8.5.0 8.6.0 RP-44 RP-090516 0166 - 36.331 CR - Handling of expired TAT and failed D-SR 8.5.0 8.6.0 RP-44 RP-090516 0167 1 Proposed CR to 36.331 Clarification on mandatory information in AS-Config 8.5.0 8.6.0 RP-44 RP-090516 0168 2 Miscellaneous small corrections 8.5.0 8.6.0 RP-44 RP-090516 0173 - Clarification on the basis of delta signalling 8.5.0 8.6.0 RP-44 RP-090516 0177 - CR on Alignment of CCCH and DCCH handling of missing mandatory field 8.5.0 8.6.0 RP-44 RP-090516 0180 2 Handling of Measurement Context During HO Preparation 8.5.0 8.6.0 RP-44 RP-090516 0181 - Clarification of key-eNodeB-Star in AdditionalReestabInfo 8.5.0 8.6.0 RP-44 RP-090516 0182 1 UE Capability Transfer 8.5.0 8.6.0 RP-44 RP-090516 0186 1 Clarification regarding mobility from E-UTRA in-between SMC and SRB2/DRB setup 8.5.0 8.6.0 RP-44 RP-090516 0188 1 Correction and completion of specification conventions 8.5.0 8.6.0 RP-44 RP-090516 0195 2 RB combination in feature group indicator 8.5.0 8.6.0 RP-44 RP-090516 0196 1 CR for need code for fields in mobilityControlInfo 8.5.0 8.6.0 RP-44 RP-090497 0197 - Alignment of pusch-HoppingOffset with 36.211 8.5.0 8.6.0 RP-44 RP-090570 0198 - Explicit srb-Identity values for SRB1 and SRB2 8.5.0 8.6.0 RP-44 RP-090516 0199 - Removing use of defaultValue for mac-MainConfig 8.5.0 8.6.0 -Page 1 - - -3GPP TS 36.331 V8.6.0 (2009-06) -2 -Release 8 - - -3GPP - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-InterNodeDefinitions.asn b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-InterNodeDefinitions.asn deleted file mode 100755 index 89d496601a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-InterNodeDefinitions.asn +++ /dev/null @@ -1,121 +0,0 @@ -EUTRA-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - - -HandoverCommand ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - handoverCommand-r8 HandoverCommand-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverCommand-r8-IEs ::= SEQUENCE { - handoverCommandMessage OCTET STRING (CONTAINING DL-DCCH-Message), - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -HandoverPreparationInformation ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - handoverPreparationInformation-r8 HandoverPreparationInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverPreparationInformation-r8-IEs ::= SEQUENCE { - ue-RadioAccessCapabilityInfo UE-CapabilityRAT-ContainerList, - as-Config AS-Config OPTIONAL, -- Cond HO - rrm-Config RRM-Config OPTIONAL, - as-Context AS-Context OPTIONAL, -- Cond HO - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -UERadioAccessCapabilityInformation ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - ueRadioAccessCapabilityInformation-r8 - UERadioAccessCapabilityInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UERadioAccessCapabilityInformation-r8-IEs ::= SEQUENCE { - ue-RadioAccessCapabilityInfo OCTET STRING (CONTAINING UECapabilityInformation), - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -AS-Config ::= SEQUENCE { - sourceMeasConfig MeasConfig, - sourceRadioResourceConfig RadioResourceConfigDedicated, - sourceSecurityAlgorithmConfig SecurityAlgorithmConfig, - sourceUE-Identity C-RNTI, - sourceMasterInformationBlock MasterInformationBlock, - sourceSystemInformationBlockType1 SystemInformationBlockType1, - sourceSystemInformationBlockType2 SystemInformationBlockType2, - antennaInfoCommon AntennaInfoCommon, - sourceDl-CarrierFreq ARFCN-ValueEUTRA, - ... -} - - -AS-Context ::= SEQUENCE { - reestablishmentInfo ReestablishmentInfo OPTIONAL -- Cond HO -} - - -ReestablishmentInfo ::= SEQUENCE { - sourcePhysCellId PhysCellId, - targetCellShortMAC-I ShortMAC-I, - additionalReestabInfoList AdditionalReestabInfoList OPTIONAL, - ... -} - -AdditionalReestabInfoList ::= SEQUENCE ( SIZE (1..maxReestabInfo) ) OF AdditionalReestabInfo - -AdditionalReestabInfo ::= SEQUENCE{ - cellIdentity CellIdentity, - key-eNodeB-Star Key-eNodeB-Star, - shortMAC-I ShortMAC-I -} - -Key-eNodeB-Star ::= BIT STRING (SIZE (256)) - - -RRM-Config ::= SEQUENCE { - ue-InactiveTime ENUMERATED { - s1, s2, s3, s5, s7, s10, s15, s20, - s25, s30, s40, s50, min1, min1s20c, min1s40, - min2, min2s30, min3, min3s30, min4, min5, min6, - min7, min8, min9, min10, min12, min14, min17, min20, - min24, min28, min33, min38, min44, min50, hr1, - hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6, - hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2, - day2hr12, day3, day4, day5, day7, day10, day14, day19, - day24, day30, dayMoreThan30} OPTIONAL, - ... -} - - -maxReestabInfo INTEGER ::= 32 -- Maximum number of KeNB* and shortMAC-I forwarded - -- at handover for re-establishment preparation - - -END - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn deleted file mode 100755 index 9fa19fa9bd..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn +++ /dev/null @@ -1,2638 +0,0 @@ -EUTRA-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - - -BCCH-BCH-Message ::= SEQUENCE { - message BCCH-BCH-MessageType -} - -BCCH-BCH-MessageType ::= MasterInformationBlock - - -BCCH-DL-SCH-Message ::= SEQUENCE { - message BCCH-DL-SCH-MessageType -} - -BCCH-DL-SCH-MessageType ::= CHOICE { - c1 CHOICE { - systemInformation SystemInformation, - systemInformationBlockType1 SystemInformationBlockType1 - }, - messageClassExtension SEQUENCE {} -} - - -PCCH-Message ::= SEQUENCE { - message PCCH-MessageType -} - -PCCH-MessageType ::= CHOICE { - c1 CHOICE { - paging Paging - }, - messageClassExtension SEQUENCE {} -} - - -DL-CCCH-Message ::= SEQUENCE { - message DL-CCCH-MessageType -} - -DL-CCCH-MessageType ::= CHOICE { - c1 CHOICE { - rrcConnectionReestablishment RRCConnectionReestablishment, - rrcConnectionReestablishmentReject RRCConnectionReestablishmentReject, - rrcConnectionReject RRCConnectionReject, - rrcConnectionSetup RRCConnectionSetup - }, - messageClassExtension SEQUENCE {} -} - - -DL-DCCH-Message ::= SEQUENCE { - message DL-DCCH-MessageType -} - -DL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - csfbParametersResponseCDMA2000 CSFBParametersResponseCDMA2000, - dlInformationTransfer DLInformationTransfer, - handoverFromEUTRAPreparationRequest HandoverFromEUTRAPreparationRequest, - mobilityFromEUTRACommand MobilityFromEUTRACommand, - rrcConnectionReconfiguration RRCConnectionReconfiguration, - rrcConnectionRelease RRCConnectionRelease, - securityModeCommand SecurityModeCommand, - ueCapabilityEnquiry UECapabilityEnquiry, - counterCheck CounterCheck, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - - -UL-CCCH-Message ::= SEQUENCE { - message UL-CCCH-MessageType -} - -UL-CCCH-MessageType ::= CHOICE { - c1 CHOICE { - rrcConnectionReestablishmentRequest RRCConnectionReestablishmentRequest, - rrcConnectionRequest RRCConnectionRequest - }, - messageClassExtension SEQUENCE {} -} - - -UL-DCCH-Message ::= SEQUENCE { - message UL-DCCH-MessageType -} - -UL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - csfbParametersRequestCDMA2000 CSFBParametersRequestCDMA2000, - measurementReport MeasurementReport, - rrcConnectionReconfigurationComplete RRCConnectionReconfigurationComplete, - rrcConnectionReestablishmentComplete RRCConnectionReestablishmentComplete, - rrcConnectionSetupComplete RRCConnectionSetupComplete, - securityModeComplete SecurityModeComplete, - securityModeFailure SecurityModeFailure, - ueCapabilityInformation UECapabilityInformation, - ulHandoverPreparationTransfer ULHandoverPreparationTransfer, - ulInformationTransfer ULInformationTransfer, - counterCheckResponse CounterCheckResponse, - spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - - -CounterCheck ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - counterCheck-r8 CounterCheck-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -CounterCheck-r8-IEs ::= SEQUENCE { - drb-CountMSB-InfoList DRB-CountMSB-InfoList, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - -DRB-CountMSB-InfoList::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-CountMSB-Info - -DRB-CountMSB-Info ::= SEQUENCE { - drb-Identity DRB-Identity, - countMSB-Uplink INTEGER(0..33554431), - countMSB-Downlink INTEGER(0..33554431) -} - - -CounterCheckResponse ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - counterCheckResponse-r8 CounterCheckResponse-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CounterCheckResponse-r8-IEs ::= SEQUENCE { - drb-CountInfoList DRB-CountInfoList, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -DRB-CountInfoList ::= SEQUENCE (SIZE (0..maxDRB)) OF DRB-CountInfo - -DRB-CountInfo ::= SEQUENCE { - drb-Identity DRB-Identity, - count-Uplink INTEGER(0..4294967295), - count-Downlink INTEGER(0..4294967295) -} - - -CSFBParametersRequestCDMA2000 ::= SEQUENCE { - criticalExtensions CHOICE { - csfbParametersRequestCDMA2000-r8 CSFBParametersRequestCDMA2000-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CSFBParametersRequestCDMA2000-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -CSFBParametersResponseCDMA2000 ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - csfbParametersResponseCDMA2000-r8 CSFBParametersResponseCDMA2000-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CSFBParametersResponseCDMA2000-r8-IEs ::= SEQUENCE { - rand RAND-CDMA2000, - mobilityParameters MobilityParametersCDMA2000, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - - -DLInformationTransfer ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - dlInformationTransfer-r8 DLInformationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -DLInformationTransfer-r8-IEs ::= SEQUENCE { - dedicatedInfoType CHOICE { - dedicatedInfoNAS DedicatedInfoNAS, - dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, - dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 - }, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - - -HandoverFromEUTRAPreparationRequest ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - handoverFromEUTRAPreparationRequest-r8 - HandoverFromEUTRAPreparationRequest-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverFromEUTRAPreparationRequest-r8-IEs ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - rand RAND-CDMA2000 OPTIONAL, -- Cond cdma2000-Type - mobilityParameters MobilityParametersCDMA2000 OPTIONAL, -- Cond cdma2000-Type - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -MasterInformationBlock ::= SEQUENCE { - dl-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100}, - phich-Config PHICH-Config, - systemFrameNumber BIT STRING (SIZE (8)), - spare BIT STRING (SIZE (10)) -} - - - -MeasurementReport ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - measurementReport-r8 MeasurementReport-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -MeasurementReport-r8-IEs ::= SEQUENCE { - measResults MeasResults, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -MobilityFromEUTRACommand ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - mobilityFromEUTRACommand-r8 MobilityFromEUTRACommand-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -MobilityFromEUTRACommand-r8-IEs ::= SEQUENCE { - cs-FallbackIndicator BOOLEAN, - purpose CHOICE{ - handover Handover, - cellChangeOrder CellChangeOrder - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -Handover ::= SEQUENCE { - targetRAT-Type ENUMERATED { - utra, geran, cdma2000-1XRTT, cdma2000-HRPD, - spare4, spare3, spare2, spare1, ...}, - targetRAT-MessageContainer OCTET STRING, - nas-SecurityParamFromEUTRA OCTET STRING (SIZE (1)) OPTIONAL, -- Cond UTRAGERAN - systemInformation SI-OrPSI-GERAN OPTIONAL -- Cond PSHO -} - -CellChangeOrder ::= SEQUENCE { - t304 ENUMERATED { - ms100, ms200, ms500, ms1000, - ms2000, ms4000, ms8000, spare1}, - targetRAT-Type CHOICE { - geran SEQUENCE { - physCellId PhysCellIdGERAN, - carrierFreq CarrierFreqGERAN, - networkControlOrder BIT STRING (SIZE (2)) OPTIONAL, -- Need OP - systemInformation SI-OrPSI-GERAN OPTIONAL -- Need OP - }, - ... - } -} - -SI-OrPSI-GERAN ::= CHOICE { - si SystemInfoListGERAN, - psi SystemInfoListGERAN -} - -SystemInfoListGERAN ::= SEQUENCE (SIZE (1..maxGERAN-SI)) OF - OCTET STRING (SIZE (1..23)) - - -Paging ::= SEQUENCE { - pagingRecordList PagingRecordList OPTIONAL, -- Need ON - systemInfoModification ENUMERATED {true} OPTIONAL, -- Need ON - etws-Indication ENUMERATED {true} OPTIONAL, -- Need ON - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -PagingRecordList ::= SEQUENCE (SIZE (1..maxPageRec)) OF PagingRecord - -PagingRecord ::= SEQUENCE { - ue-Identity PagingUE-Identity, - cn-Domain ENUMERATED {ps, cs}, - ... -} - -PagingUE-Identity ::= CHOICE { - s-TMSI S-TMSI, - imsi IMSI, - ... -} - -IMSI ::= SEQUENCE (SIZE (6..21)) OF IMSI-Digit - -IMSI-Digit::= INTEGER (0..9) - - -RRCConnectionReconfiguration ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReconfiguration-r8 RRCConnectionReconfiguration-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfiguration-r8-IEs ::= SEQUENCE { - measConfig MeasConfig OPTIONAL, -- Need ON - mobilityControlInfo MobilityControlInfo OPTIONAL, -- Cond HO - dedicatedInfoNASList SEQUENCE (SIZE(1..maxDRB)) OF - DedicatedInfoNAS OPTIONAL, -- Cond nonHO - radioResourceConfigDedicated RadioResourceConfigDedicated OPTIONAL, -- Cond HO-toEUTRA - securityConfigHO SecurityConfigHO OPTIONAL, -- Cond HO - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -SecurityConfigHO ::= SEQUENCE { - handoverType CHOICE { - intraLTE SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig OPTIONAL, -- Need OP - keyChangeIndicator BOOLEAN, - nextHopChainingCount NextHopChainingCount - }, - interRAT SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig, - nas-SecurityParamToEUTRA OCTET STRING (SIZE(6)) - } - }, - ... -} - - -RRCConnectionReconfigurationComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReconfigurationComplete-r8 - RRCConnectionReconfigurationComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfigurationComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -RRCConnectionReestablishment ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReestablishment-r8 RRCConnectionReestablishment-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishment-r8-IEs ::= SEQUENCE { - radioResourceConfigDedicated RadioResourceConfigDedicated, - nextHopChainingCount NextHopChainingCount, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -RRCConnectionReestablishmentComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReestablishmentComplete-r8 - RRCConnectionReestablishmentComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -RRCConnectionReestablishmentReject ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionReestablishmentReject-r8 - RRCConnectionReestablishmentReject-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentReject-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -RRCConnectionReestablishmentRequest ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionReestablishmentRequest-r8 - RRCConnectionReestablishmentRequest-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentRequest-r8-IEs ::= SEQUENCE { - ue-Identity ReestabUE-Identity, - reestablishmentCause ReestablishmentCause, - spare BIT STRING (SIZE (2)) -} - -ReestabUE-Identity ::= SEQUENCE { - c-RNTI C-RNTI, - physCellId PhysCellId, - shortMAC-I ShortMAC-I -} - -ReestablishmentCause ::= ENUMERATED { - reconfigurationFailure, handoverFailure, - otherFailure, spare1} - - -RRCConnectionReject ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionReject-r8 RRCConnectionReject-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReject-r8-IEs ::= SEQUENCE { - waitTime INTEGER (1..16), - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -RRCConnectionRelease ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionRelease-r8 RRCConnectionRelease-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionRelease-r8-IEs ::= SEQUENCE { - releaseCause ReleaseCause, - redirectedCarrierInfo RedirectedCarrierInfo OPTIONAL, -- Need ON - idleModeMobilityControlInfo IdleModeMobilityControlInfo OPTIONAL, -- Need OP - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -ReleaseCause ::= ENUMERATED {loadBalancingTAUrequired, - other,spare2, spare1 } - -RedirectedCarrierInfo ::= CHOICE { - eutra ARFCN-ValueEUTRA, - geran CarrierFreqsGERAN, - utra-FDD ARFCN-ValueUTRA, - utra-TDD ARFCN-ValueUTRA, - cdma2000-HRPD CarrierFreqCDMA2000, - cdma2000-1xRTT CarrierFreqCDMA2000, - ... -} - -IdleModeMobilityControlInfo ::= SEQUENCE { - freqPriorityListEUTRA FreqPriorityListEUTRA OPTIONAL, -- Need ON - freqPriorityListGERAN FreqsPriorityListGERAN OPTIONAL, -- Need ON - freqPriorityListUTRA-FDD FreqPriorityListUTRA-FDD OPTIONAL, -- Need ON - freqPriorityListUTRA-TDD FreqPriorityListUTRA-TDD OPTIONAL, -- Need ON - bandClassPriorityListHRPD BandClassPriorityListHRPD OPTIONAL, -- Need ON - bandClassPriorityList1XRTT BandClassPriorityList1XRTT OPTIONAL, -- Need ON - t320 ENUMERATED { - min5, min10, min20, min30, min60, min120, min180, - spare1} OPTIONAL, -- Need OR - ... -} - -FreqPriorityListEUTRA ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA - -FreqPriorityEUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueEUTRA, - cellReselectionPriority CellReselectionPriority -} - -FreqsPriorityListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF FreqsPriorityGERAN - -FreqsPriorityGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - cellReselectionPriority CellReselectionPriority -} - -FreqPriorityListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF FreqPriorityUTRA-FDD - -FreqPriorityUTRA-FDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority -} - -FreqPriorityListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF FreqPriorityUTRA-TDD - -FreqPriorityUTRA-TDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority -} - -BandClassPriorityListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriorityHRPD - -BandClassPriorityHRPD ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority -} - -BandClassPriorityList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriority1XRTT - -BandClassPriority1XRTT ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority -} - -RRCConnectionRequest ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionRequest-r8 RRCConnectionRequest-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionRequest-r8-IEs ::= SEQUENCE { - ue-Identity InitialUE-Identity, - establishmentCause EstablishmentCause, - spare BIT STRING (SIZE (1)) -} - -InitialUE-Identity ::= CHOICE { - s-TMSI S-TMSI, - randomValue BIT STRING (SIZE (40)) -} - -EstablishmentCause ::= ENUMERATED { - emergency, highPriorityAccess, mt-Access, mo-Signalling, - mo-Data, spare3, spare2, spare1} - - -RRCConnectionSetup ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionSetup-r8 RRCConnectionSetup-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionSetup-r8-IEs ::= SEQUENCE { - radioResourceConfigDedicated RadioResourceConfigDedicated, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -RRCConnectionSetupComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionSetupComplete-r8 RRCConnectionSetupComplete-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionSetupComplete-r8-IEs ::= SEQUENCE { - selectedPLMN-Identity INTEGER (1..6), - registeredMME RegisteredMME OPTIONAL, - dedicatedInfoNAS DedicatedInfoNAS, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -RegisteredMME ::= SEQUENCE { - plmn-Identity PLMN-Identity OPTIONAL, - mmegi BIT STRING (SIZE (16)), - mmec MMEC -} - - -SecurityModeCommand ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - securityModeCommand-r8 SecurityModeCommand-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeCommand-r8-IEs ::= SEQUENCE { - securityConfigSMC SecurityConfigSMC, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -SecurityConfigSMC ::= SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig, - ... -} - - -SecurityModeComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - securityModeComplete-r8 SecurityModeComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -SecurityModeFailure ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - securityModeFailure-r8 SecurityModeFailure-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeFailure-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -SystemInformation ::= SEQUENCE { - criticalExtensions CHOICE { - systemInformation-r8 SystemInformation-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} -SystemInformation-r8-IEs ::= SEQUENCE { - sib-TypeAndInfo SEQUENCE (SIZE (1..maxSIB)) OF CHOICE { - sib2 SystemInformationBlockType2, - sib3 SystemInformationBlockType3, - sib4 SystemInformationBlockType4, - sib5 SystemInformationBlockType5, - sib6 SystemInformationBlockType6, - sib7 SystemInformationBlockType7, - sib8 SystemInformationBlockType8, - sib9 SystemInformationBlockType9, - sib10 SystemInformationBlockType10, - sib11 SystemInformationBlockType11, - ... - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -SystemInformationBlockType1 ::= SEQUENCE { - cellAccessRelatedInfo SEQUENCE { - plmn-IdentityList PLMN-IdentityList, - trackingAreaCode TrackingAreaCode, - cellIdentity CellIdentity, - cellBarred ENUMERATED {barred, notBarred}, - intraFreqReselection ENUMERATED {allowed, notAllowed}, - csg-Indication BOOLEAN, - csg-Identity BIT STRING (SIZE (27)) OPTIONAL -- Need OR - }, - cellSelectionInfo SEQUENCE { - q-RxLevMin Q-RxLevMin, - q-RxLevMinOffset INTEGER (1..8) OPTIONAL -- Need OP - }, - p-Max P-Max OPTIONAL, -- Need OP - freqBandIndicator INTEGER (1..64), - schedulingInfoList SchedulingInfoList, - tdd-Config TDD-Config OPTIONAL, -- Cond TDD - si-WindowLength ENUMERATED { - ms1, ms2, ms5, ms10, ms15, ms20, - ms40}, - systemInfoValueTag INTEGER (0..31), - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -PLMN-IdentityList ::= SEQUENCE (SIZE (1..6)) OF PLMN-IdentityInfo - -PLMN-IdentityInfo ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellReservedForOperatorUse ENUMERATED {reserved, notReserved} -} - -SchedulingInfoList ::= SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo - -SchedulingInfo ::= SEQUENCE { - si-Periodicity ENUMERATED { - rf8, rf16, rf32, rf64, rf128, rf256, rf512}, - sib-MappingInfo SIB-MappingInfo -} - -SIB-MappingInfo ::= SEQUENCE (SIZE (0..maxSIB-1)) OF SIB-Type - -SIB-Type ::= ENUMERATED { - sibType3, sibType4, sibType5, sibType6, - sibType7, sibType8, sibType9, sibType10, - sibType11, spare7, spare6, spare5, - spare4, spare3, spare2, spare1, ...} - - -UECapabilityEnquiry ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - ueCapabilityEnquiry-r8 UECapabilityEnquiry-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UECapabilityEnquiry-r8-IEs ::= SEQUENCE { - ue-CapabilityRequest UE-CapabilityRequest, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -UE-CapabilityRequest ::= SEQUENCE (SIZE (1..maxRAT-Capabilities)) OF RAT-Type - - -UECapabilityInformation ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - ueCapabilityInformation-r8 UECapabilityInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UECapabilityInformation-r8-IEs ::= SEQUENCE { - ue-CapabilityRAT-ContainerList UE-CapabilityRAT-ContainerList, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -ULHandoverPreparationTransfer ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - ulHandoverPreparationTransfer-r8 ULHandoverPreparationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -ULHandoverPreparationTransfer-r8-IEs ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - meid BIT STRING (SIZE (56)) OPTIONAL, - dedicatedInfo DedicatedInfoCDMA2000, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -ULInformationTransfer ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - ulInformationTransfer-r8 ULInformationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -ULInformationTransfer-r8-IEs ::= SEQUENCE { - dedicatedInfoType CHOICE { - dedicatedInfoNAS DedicatedInfoNAS, - dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, - dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -SystemInformationBlockType2 ::= SEQUENCE { - ac-BarringInfo SEQUENCE { - ac-BarringForEmergency BOOLEAN, - ac-BarringForMO-Signalling AC-BarringConfig OPTIONAL, -- Need OP - ac-BarringForMO-Data AC-BarringConfig OPTIONAL -- Need OP - } OPTIONAL, -- Need OP - radioResourceConfigCommon RadioResourceConfigCommonSIB, - ue-TimersAndConstants UE-TimersAndConstants, - freqInfo SEQUENCE { - ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL, -- Need OP - ul-Bandwidth ENUMERATED {n6, n15, n25, n50, n75, n100} - OPTIONAL, -- Need OP - additionalSpectrumEmission AdditionalSpectrumEmission - }, - mbsfn-SubframeConfigList MBSFN-SubframeConfigList OPTIONAL, -- Need OR - timeAlignmentTimerCommon TimeAlignmentTimer, - ... -} - -AC-BarringConfig ::= SEQUENCE { - ac-BarringFactor ENUMERATED { - p00, p05, p10, p15, p20, p25, p30, p40, - p50, p60, p70, p75, p80, p85, p90, p95}, - ac-BarringTime ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512}, - ac-BarringForSpecialAC BIT STRING (SIZE(5)) -} - -MBSFN-SubframeConfigList ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF MBSFN-SubframeConfig - -MBSFN-SubframeConfig ::= SEQUENCE { - radioframeAllocationPeriod ENUMERATED {n1, n2, n4, n8, n16, n32}, - radioframeAllocationOffset INTEGER (0..7), - subframeAllocation CHOICE { - oneFrame BIT STRING (SIZE(6)), - fourFrames BIT STRING (SIZE(24)) - } -} - -SystemInformationBlockType3 ::= SEQUENCE { - cellReselectionInfoCommon SEQUENCE { - q-Hyst ENUMERATED { - dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, - dB12, dB14, dB16, dB18, dB20, dB22, dB24}, - speedStateReselectionPars SEQUENCE { - mobilityStateParameters MobilityStateParameters, - q-HystSF SEQUENCE { - sf-Medium ENUMERATED { - dB-6, dB-4, dB-2, dB0}, - sf-High ENUMERATED { - dB-6, dB-4, dB-2, dB0} - } - } OPTIONAL -- Need OP - }, - cellReselectionServingFreqInfo SEQUENCE { - s-NonIntraSearch ReselectionThreshold OPTIONAL, -- Need OP - threshServingLow ReselectionThreshold, - cellReselectionPriority CellReselectionPriority - }, - intraFreqCellReselectionInfo SEQUENCE { - q-RxLevMin Q-RxLevMin, - p-Max P-Max OPTIONAL, -- Need OP - s-IntraSearch ReselectionThreshold OPTIONAL, -- Need OP - allowedMeasBandwidth AllowedMeasBandwidth OPTIONAL, -- Need OP - presenceAntennaPort1 PresenceAntennaPort1, - neighCellConfig NeighCellConfig, - t-ReselectionEUTRA T-Reselection, - t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL -- Need OP - }, - ... -} - - -SystemInformationBlockType4 ::= SEQUENCE { - intraFreqNeighCellList IntraFreqNeighCellList OPTIONAL, -- Need OR - intraFreqBlackCellList IntraFreqBlackCellList OPTIONAL, -- Need OR - csg-PhysCellIdRange PhysCellIdRange OPTIONAL, -- Cond CSG - ... -} - -IntraFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo - -IntraFreqNeighCellInfo ::= SEQUENCE { - physCellId PhysCellId, - q-OffsetCell Q-OffsetRange, - ... -} - -IntraFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange - - -SystemInformationBlockType5 ::= SEQUENCE { - interFreqCarrierFreqList InterFreqCarrierFreqList, - ... -} - -InterFreqCarrierFreqList ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo - -InterFreqCarrierFreqInfo ::= SEQUENCE { - dl-CarrierFreq ARFCN-ValueEUTRA, - q-RxLevMin Q-RxLevMin, - p-Max P-Max OPTIONAL, -- Need OP - t-ReselectionEUTRA T-Reselection, - t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - allowedMeasBandwidth AllowedMeasBandwidth, - presenceAntennaPort1 PresenceAntennaPort1, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - neighCellConfig NeighCellConfig, - q-OffsetFreq Q-OffsetRange DEFAULT dB0, - interFreqNeighCellList InterFreqNeighCellList OPTIONAL, -- Need OR - interFreqBlackCellList InterFreqBlackCellList OPTIONAL, -- Need OR - ... -} - -InterFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo - -InterFreqNeighCellInfo ::= SEQUENCE { - physCellId PhysCellId, - q-OffsetCell Q-OffsetRange -} - -InterFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange - - -SystemInformationBlockType6 ::= SEQUENCE { - carrierFreqListUTRA-FDD CarrierFreqListUTRA-FDD OPTIONAL, -- Need OR - carrierFreqListUTRA-TDD CarrierFreqListUTRA-TDD OPTIONAL, -- Need OR - t-ReselectionUTRA T-Reselection, - t-ReselectionUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP - ... -} - -CarrierFreqListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF CarrierFreqUTRA-FDD - -CarrierFreqUTRA-FDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - q-RxLevMin INTEGER (-60..-13), - p-MaxUTRA INTEGER (-50..33), - q-QualMin INTEGER (-24..0), - ... -} - -CarrierFreqListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF CarrierFreqUTRA-TDD - -CarrierFreqUTRA-TDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - q-RxLevMin INTEGER (-60..-13), - p-MaxUTRA INTEGER (-50..33), - ... -} - - -SystemInformationBlockType7 ::= SEQUENCE { - t-ReselectionGERAN T-Reselection, - t-ReselectionGERAN-SF SpeedStateScaleFactors OPTIONAL, -- Need OR - carrierFreqsInfoList CarrierFreqsInfoListGERAN OPTIONAL, -- Need OR - ... -} - -CarrierFreqsInfoListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF CarrierFreqsInfoGERAN - -CarrierFreqsInfoGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - commonInfo SEQUENCE { - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - ncc-Permitted BIT STRING (SIZE (8)), - q-RxLevMin INTEGER (0..45), - p-MaxGERAN INTEGER (0..39) OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold - }, - ... -} - - -SystemInformationBlockType8 ::= SEQUENCE { - systemTimeInfo SystemTimeInfoCDMA2000 OPTIONAL, -- Need OR - searchWindowSize INTEGER (0..15) OPTIONAL, -- Need OR - parametersHRPD SEQUENCE { - preRegistrationInfoHRPD PreRegistrationInfoHRPD, - cellReselectionParametersHRPD CellReselectionParametersCDMA2000 OPTIONAL -- Need OR - } OPTIONAL, -- Need OR - parameters1XRTT SEQUENCE { - csfb-RegistrationParam1XRTT CSFB-RegistrationParam1XRTT OPTIONAL, -- Need OP - longCodeState1XRTT BIT STRING (SIZE (42)) OPTIONAL, -- Need OR - cellReselectionParameters1XRTT CellReselectionParametersCDMA2000 OPTIONAL -- Need OR - } OPTIONAL, -- Need OR - ... -} - -CellReselectionParametersCDMA2000 ::= SEQUENCE { - bandClassList BandClassListCDMA2000, - neighCellList NeighCellListCDMA2000, - t-ReselectionCDMA2000 T-Reselection, - t-ReselectionCDMA2000-SF SpeedStateScaleFactors OPTIONAL -- Need OP -} -NeighCellListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellCDMA2000 - -NeighCellCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - neighCellsPerFreqList NeighCellsPerBandclassListCDMA2000 -} - -NeighCellsPerBandclassListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellsPerBandclassCDMA2000 - -NeighCellsPerBandclassCDMA2000 ::= SEQUENCE { - arfcn ARFCN-ValueCDMA2000, - physCellIdList PhysCellIdListCDMA2000 -} - -PhysCellIdListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF PhysCellIdCDMA2000 - -BandClassListCDMA2000 ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassInfoCDMA2000 - -BandClassInfoCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High INTEGER (0..63), - threshX-Low INTEGER (0..63), - ... -} - - -SystemInformationBlockType9 ::= SEQUENCE { - hnb-Name OCTET STRING (SIZE(1..48)) OPTIONAL, -- Need OR - ... -} - - -SystemInformationBlockType10 ::= SEQUENCE { - messageIdentifier BIT STRING (SIZE (16)), - serialNumber BIT STRING (SIZE (16)), - warningType OCTET STRING (SIZE (2)), - warningSecurityInfo OCTET STRING (SIZE (50)) OPTIONAL, -- Need OP - ... -} - - -SystemInformationBlockType11 ::= SEQUENCE { - messageIdentifier BIT STRING (SIZE (16)), - serialNumber BIT STRING (SIZE (16)), - warningMessageSegmentType ENUMERATED {notLastSegment, lastSegment}, - warningMessageSegmentNumber INTEGER (0..63), - warningMessageSegment OCTET STRING, - dataCodingScheme OCTET STRING (SIZE (1)) OPTIONAL, -- Cond Segment1 - ... -} - - -AntennaInfoCommon ::= SEQUENCE { - antennaPortsCount ENUMERATED {an1, an2, an4, spare1} -} - -AntennaInfoDedicated ::= SEQUENCE { - transmissionMode ENUMERATED { - tm1, tm2, tm3, tm4, tm5, tm6, - tm7, spare1}, - codebookSubsetRestriction CHOICE { - n2TxAntenna-tm3 BIT STRING (SIZE (2)), - n4TxAntenna-tm3 BIT STRING (SIZE (4)), - n2TxAntenna-tm4 BIT STRING (SIZE (6)), - n4TxAntenna-tm4 BIT STRING (SIZE (64)), - n2TxAntenna-tm5 BIT STRING (SIZE (4)), - n4TxAntenna-tm5 BIT STRING (SIZE (16)), - n2TxAntenna-tm6 BIT STRING (SIZE (4)), - n4TxAntenna-tm6 BIT STRING (SIZE (16)) - } OPTIONAL, -- Cond TM - ue-TransmitAntennaSelection CHOICE{ - release NULL, - setup ENUMERATED {closedLoop, openLoop} - } -} - - -CQI-ReportConfig ::= SEQUENCE { - cqi-ReportModeAperiodic ENUMERATED { - rm12, rm20, rm22, rm30, rm31, - spare3, spare2, spare1} OPTIONAL, -- Need OR - nomPDSCH-RS-EPRE-Offset INTEGER (-1..6), - cqi-ReportPeriodic CQI-ReportPeriodic OPTIONAL -- Need ON -} - -CQI-ReportPeriodic ::= CHOICE { - release NULL, - setup SEQUENCE { - cqi-PUCCH-ResourceIndex INTEGER (0.. 1185), - cqi-pmi-ConfigIndex INTEGER (0..1023), - cqi-FormatIndicatorPeriodic CHOICE { - widebandCQI NULL, - subbandCQI SEQUENCE { - k INTEGER (1..4) - } - }, - ri-ConfigIndex INTEGER (0..1023) OPTIONAL, -- Need OR - simultaneousAckNackAndCQI BOOLEAN - } -} - - -DRB-Identity ::= INTEGER (1..32) - - -LogicalChannelConfig ::= SEQUENCE { - ul-SpecificParameters SEQUENCE { - priority INTEGER (1..16), - prioritisedBitRate ENUMERATED { - kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, - kBps256, infinity, spare8, spare7, spare6, - spare5, spare4, spare3, spare2, spare1}, - bucketSizeDuration ENUMERATED { - ms50, ms100, ms150, ms300, ms500, ms1000, spare2, - spare1}, - logicalChannelGroup INTEGER (0..3) OPTIONAL -- Need OR - } OPTIONAL, -- Cond UL - ... -} - - -MAC-MainConfig ::= SEQUENCE { - ul-SCH-Config SEQUENCE { - maxHARQ-Tx ENUMERATED { - n1, n2, n3, n4, n5, n6, n7, n8, - n10, n12, n16, n20, n24, n28, - spare2, spare1} OPTIONAL, -- Need ON - periodicBSR-Timer ENUMERATED { - sf5, sf10, sf16, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, sf1280, sf2560, - infinity, spare1} OPTIONAL, -- Need ON - retxBSR-Timer ENUMERATED { - sf320, sf640, sf1280, sf2560, sf5120, - sf10240, spare2, spare1}, - ttiBundling BOOLEAN - } OPTIONAL, -- Need ON - drx-Config DRX-Config OPTIONAL, -- Need ON - timeAlignmentTimerDedicated TimeAlignmentTimer, - phr-Config CHOICE { - release NULL, - setup SEQUENCE { - periodicPHR-Timer ENUMERATED {sf10, sf20, sf50, sf100, sf200, - sf500, sf1000, infinity}, - prohibitPHR-Timer ENUMERATED {sf0, sf10, sf20, sf50, sf100, - sf200, sf500, sf1000}, - dl-PathlossChange ENUMERATED {dB1, dB3, dB6, infinity} - } - } OPTIONAL, -- Need ON - ... -} - -DRX-Config ::= CHOICE { - release NULL, - setup SEQUENCE { - onDurationTimer ENUMERATED { - psf1, psf2, psf3, psf4, psf5, psf6, - psf8, psf10, psf20, psf30, psf40, - psf50, psf60, psf80, psf100, - psf200}, - drx-InactivityTimer ENUMERATED { - psf1, psf2, psf3, psf4, psf5, psf6, - psf8, psf10, psf20, psf30, psf40, - psf50, psf60, psf80, psf100, - psf200, psf300, psf500, psf750, - psf1280, psf1920, psf2560, spare10, - spare9, spare8, spare7, spare6, - spare5, spare4, spare3, spare2, - spare1}, - drx-RetransmissionTimer ENUMERATED { - psf1, psf2, psf4, psf6, psf8, psf16, - psf24, psf33}, - longDRX-CycleStartOffset CHOICE { - sf10 INTEGER(0..9), - sf20 INTEGER(0..19), - sf32 INTEGER(0..31), - sf40 INTEGER(0..39), - sf64 INTEGER(0..63), - sf80 INTEGER(0..79), - sf128 INTEGER(0..127), - sf160 INTEGER(0..159), - sf256 INTEGER(0..255), - sf320 INTEGER(0..319), - sf512 INTEGER(0..511), - sf640 INTEGER(0..639), - sf1024 INTEGER(0..1023), - sf1280 INTEGER(0..1279), - sf2048 INTEGER(0..2047), - sf2560 INTEGER(0..2559) - }, - shortDRX SEQUENCE { - shortDRX-Cycle ENUMERATED { - sf2, sf5, sf8, sf10, sf16, sf20, - sf32, sf40, sf64, sf80, sf128, sf160, - sf256, sf320, sf512, sf640}, - drxShortCycleTimer INTEGER (1..16) - } OPTIONAL -- Need OR - } -} - - -PDCP-Config ::= SEQUENCE { - discardTimer ENUMERATED { - ms50, ms100, ms150, ms300, ms500, - ms750, ms1500, infinity - } OPTIONAL, -- Cond Setup - rlc-AM SEQUENCE { - statusReportRequired BOOLEAN - } OPTIONAL, -- Cond Rlc-AM - rlc-UM SEQUENCE { - pdcp-SN-Size ENUMERATED {len7bits, len12bits} - } OPTIONAL, -- Cond Rlc-UM - headerCompression CHOICE { - notUsed NULL, - rohc SEQUENCE { - maxCID INTEGER (1..16383) DEFAULT 15, - profiles SEQUENCE { - profile0x0001 BOOLEAN, - profile0x0002 BOOLEAN, - profile0x0003 BOOLEAN, - profile0x0004 BOOLEAN, - profile0x0006 BOOLEAN, - profile0x0101 BOOLEAN, - profile0x0102 BOOLEAN, - profile0x0103 BOOLEAN, - profile0x0104 BOOLEAN - }, - ... - } - }, - ... -} - - -PDSCH-ConfigCommon::= SEQUENCE { - referenceSignalPower INTEGER (-60..50), - p-b INTEGER (0..3) -} - -PDSCH-ConfigDedicated::= SEQUENCE { - p-a ENUMERATED { - dB-6, dB-4dot77, dB-3, dB-1dot77, - dB0, dB1, dB2, dB3 } -} - - -PHICH-Config ::= SEQUENCE { - phich-Duration ENUMERATED {normal, extended}, - phich-Resource ENUMERATED {oneSixth, half, one, two} -} - - -PhysicalConfigDedicated ::= SEQUENCE { - pdsch-ConfigDedicated PDSCH-ConfigDedicated OPTIONAL, -- Need ON - pucch-ConfigDedicated PUCCH-ConfigDedicated OPTIONAL, -- Need ON - pusch-ConfigDedicated PUSCH-ConfigDedicated OPTIONAL, -- Need ON - uplinkPowerControlDedicated UplinkPowerControlDedicated OPTIONAL, -- Need ON - tpc-PDCCH-ConfigPUCCH TPC-PDCCH-Config OPTIONAL, -- Need ON - tpc-PDCCH-ConfigPUSCH TPC-PDCCH-Config OPTIONAL, -- Need ON - cqi-ReportConfig CQI-ReportConfig OPTIONAL, -- Need ON - soundingRS-UL-ConfigDedicated SoundingRS-UL-ConfigDedicated OPTIONAL, -- Need ON - antennaInfo CHOICE { - explicitValue AntennaInfoDedicated, - defaultValue NULL - } OPTIONAL, -- Need ON - schedulingRequestConfig SchedulingRequestConfig OPTIONAL, -- Need ON - ... -} - - -P-Max ::= INTEGER (-30..33) - - -PRACH-ConfigSIB ::= SEQUENCE { - rootSequenceIndex INTEGER (0..837), - prach-ConfigInfo PRACH-ConfigInfo -} - -PRACH-Config ::= SEQUENCE { - rootSequenceIndex INTEGER (0..837), - prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON -} - -PRACH-ConfigInfo ::= SEQUENCE { - prach-ConfigIndex INTEGER (0..63), - highSpeedFlag BOOLEAN, - zeroCorrelationZoneConfig INTEGER (0..15), - prach-FreqOffset INTEGER (0..94) -} - - -PresenceAntennaPort1 ::= BOOLEAN - - -PUCCH-ConfigCommon ::= SEQUENCE { - deltaPUCCH-Shift ENUMERATED {ds1, ds2, ds3}, - nRB-CQI INTEGER (0..98), - nCS-AN INTEGER (0..7), - n1PUCCH-AN INTEGER (0..2047) -} - -PUCCH-ConfigDedicated ::= SEQUENCE { - ackNackRepetition CHOICE{ - release NULL, - setup SEQUENCE { - repetitionFactor ENUMERATED { n2, n4, n6, spare1}, - n1PUCCH-AN-Rep INTEGER (0..2047) - } - }, - tdd-AckNackFeedbackMode ENUMERATED {bundling, multiplexing} OPTIONAL -- Cond TDD -} - - -PUSCH-ConfigCommon ::= SEQUENCE { - pusch-ConfigBasic SEQUENCE { - n-SB INTEGER (1..4), - hoppingMode ENUMERATED {interSubFrame, intraAndInterSubFrame}, - pusch-HoppingOffset INTEGER (0..98), - enable64QAM BOOLEAN - }, - ul-ReferenceSignalsPUSCH UL-ReferenceSignalsPUSCH -} - -PUSCH-ConfigDedicated ::= SEQUENCE { - betaOffset-ACK-Index INTEGER (0..15), - betaOffset-RI-Index INTEGER (0..15), - betaOffset-CQI-Index INTEGER (0..15) -} - -UL-ReferenceSignalsPUSCH ::= SEQUENCE { - groupHoppingEnabled BOOLEAN, - groupAssignmentPUSCH INTEGER (0..29), - sequenceHoppingEnabled BOOLEAN, - cyclicShift INTEGER (0..7) -} - - -RACH-ConfigCommon ::= SEQUENCE { - preambleInfo SEQUENCE { - numberOfRA-Preambles ENUMERATED { - n4, n8, n12, n16 ,n20, n24, n28, - n32, n36, n40, n44, n48, n52, n56, - n60, n64}, - preamblesGroupAConfig SEQUENCE { - sizeOfRA-PreamblesGroupA ENUMERATED { - n4, n8, n12, n16 ,n20, n24, n28, - n32, n36, n40, n44, n48, n52, n56, - n60}, - messageSizeGroupA ENUMERATED {b56, b144, b208, b256}, - messagePowerOffsetGroupB ENUMERATED { - minusinfinity, dB0, dB5, dB8, dB10, dB12, - dB15, dB18}, - ... - } OPTIONAL -- Need OP - }, - powerRampingParameters SEQUENCE { - powerRampingStep ENUMERATED {dB0, dB2,dB4, dB6}, - preambleInitialReceivedTargetPower ENUMERATED { - dBm-120, dBm-118, dBm-116, dBm-114, dBm-112, - dBm-110, dBm-108, dBm-106, dBm-104, dBm-102, - dBm-100, dBm-98, dBm-96, dBm-94, - dBm-92, dBm-90} - }, - ra-SupervisionInfo SEQUENCE { - preambleTransMax ENUMERATED { - n3, n4, n5, n6, n7, n8, n10, n20, n50, - n100, n200}, - ra-ResponseWindowSize ENUMERATED { - sf2, sf3, sf4, sf5, sf6, sf7, - sf8, sf10}, - mac-ContentionResolutionTimer ENUMERATED { - sf8, sf16, sf24, sf32, sf40, sf48, - sf56, sf64} - }, - maxHARQ-Msg3Tx INTEGER (1..8), - ... -} - - -RACH-ConfigDedicated ::= SEQUENCE { - ra-PreambleIndex INTEGER (0..63), - ra-PRACH-MaskIndex INTEGER (0..15) -} - - -RadioResourceConfigCommonSIB ::= SEQUENCE { - rach-ConfigCommon RACH-ConfigCommon, - bcch-Config BCCH-Config, - pcch-Config PCCH-Config, - prach-Config PRACH-ConfigSIB, - pdsch-ConfigCommon PDSCH-ConfigCommon, - pusch-ConfigCommon PUSCH-ConfigCommon, - pucch-ConfigCommon PUCCH-ConfigCommon, - soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon, - uplinkPowerControlCommon UplinkPowerControlCommon, - ul-CyclicPrefixLength UL-CyclicPrefixLength, - ... -} - -RadioResourceConfigCommon ::= SEQUENCE { - rach-ConfigCommon RACH-ConfigCommon OPTIONAL, -- Need ON - prach-Config PRACH-Config, - pdsch-ConfigCommon PDSCH-ConfigCommon OPTIONAL, -- Need ON - pusch-ConfigCommon PUSCH-ConfigCommon, - phich-Config PHICH-Config OPTIONAL, -- Need ON - pucch-ConfigCommon PUCCH-ConfigCommon OPTIONAL, -- Need ON - soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon OPTIONAL, -- Need ON - uplinkPowerControlCommon UplinkPowerControlCommon OPTIONAL, -- Need ON - antennaInfoCommon AntennaInfoCommon OPTIONAL, -- Need ON - p-Max P-Max OPTIONAL, -- Need OP - tdd-Config TDD-Config OPTIONAL, -- Cond TDD - ul-CyclicPrefixLength UL-CyclicPrefixLength, - ... -} - -BCCH-Config ::= SEQUENCE { - modificationPeriodCoeff ENUMERATED {n2, n4, n8, n16} -} - -PCCH-Config ::= SEQUENCE { - defaultPagingCycle ENUMERATED { - rf32, rf64, rf128, rf256}, - nB ENUMERATED { - fourT, twoT, oneT, halfT, quarterT, oneEighthT, - oneSixteenthT, oneThirtySecondT} -} - -UL-CyclicPrefixLength ::= ENUMERATED {len1, len2} - - -RadioResourceConfigDedicated ::= SEQUENCE { - srb-ToAddModList SRB-ToAddModList OPTIONAL, -- Cond HO-Conn - drb-ToAddModList DRB-ToAddModList OPTIONAL, -- Cond HO-toEUTRA - drb-ToReleaseList DRB-ToReleaseList OPTIONAL, -- Need ON - mac-MainConfig CHOICE { - explicitValue MAC-MainConfig, - defaultValue NULL - } OPTIONAL, -- Cond HO-toEUTRA2 - sps-Config SPS-Config OPTIONAL, -- Need ON - physicalConfigDedicated PhysicalConfigDedicated OPTIONAL, -- Need ON - ... -} - -SRB-ToAddModList ::= SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod - -SRB-ToAddMod ::= SEQUENCE { - srb-Identity INTEGER (1..2), - rlc-Config CHOICE { - explicitValue RLC-Config, - defaultValue NULL - } OPTIONAL, -- Cond Setup - logicalChannelConfig CHOICE { - explicitValue LogicalChannelConfig, - defaultValue NULL - } OPTIONAL, -- Cond Setup - ... -} - -DRB-ToAddModList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddMod - -DRB-ToAddMod ::= SEQUENCE { - eps-BearerIdentity INTEGER (0..15) OPTIONAL, -- Cond DRB-Setup - drb-Identity DRB-Identity, - pdcp-Config PDCP-Config OPTIONAL, -- Cond PDCP - rlc-Config RLC-Config OPTIONAL, -- Cond Setup - logicalChannelIdentity INTEGER (3..10) OPTIONAL, -- Cond DRB-Setup - logicalChannelConfig LogicalChannelConfig OPTIONAL, -- Cond Setup - ... -} - -DRB-ToReleaseList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-Identity - - -RLC-Config ::= CHOICE { - am SEQUENCE { - ul-AM-RLC UL-AM-RLC, - dl-AM-RLC DL-AM-RLC - }, - um-Bi-Directional SEQUENCE { - ul-UM-RLC UL-UM-RLC, - dl-UM-RLC DL-UM-RLC - }, - um-Uni-Directional-UL SEQUENCE { - ul-UM-RLC UL-UM-RLC - }, - um-Uni-Directional-DL SEQUENCE { - dl-UM-RLC DL-UM-RLC - }, - ... -} - -UL-AM-RLC ::= SEQUENCE { - t-PollRetransmit T-PollRetransmit, - pollPDU PollPDU, - pollByte PollByte, - maxRetxThreshold ENUMERATED { - t1, t2, t3, t4, t6, t8, t16, t32} -} - -DL-AM-RLC ::= SEQUENCE { - t-Reordering T-Reordering, - t-StatusProhibit T-StatusProhibit -} - -UL-UM-RLC ::= SEQUENCE { - sn-FieldLength SN-FieldLength -} - -DL-UM-RLC ::= SEQUENCE { - sn-FieldLength SN-FieldLength, - t-Reordering T-Reordering -} - -SN-FieldLength ::= ENUMERATED {size5, size10} - -T-PollRetransmit ::= ENUMERATED { - ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms105, - ms110, ms115, ms120, ms125, ms130, ms135, - ms140, ms145, ms150, ms155, ms160, ms165, - ms170, ms175, ms180, ms185, ms190, ms195, - ms200, ms205, ms210, ms215, ms220, ms225, - ms230, ms235, ms240, ms245, ms250, ms300, - ms350, ms400, ms450, ms500, spare9, spare8, - spare7, spare6, spare5, spare4, spare3, - spare2, spare1} - -PollPDU ::= ENUMERATED { - p4, p8, p16, p32, p64, p128, p256, pInfinity} - -PollByte ::= ENUMERATED { - kB25, kB50, kB75, kB100, kB125, kB250, kB375, - kB500, kB750, kB1000, kB1250, kB1500, kB2000, - kB3000, kBinfinity, spare1} - -T-Reordering ::= ENUMERATED { - ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms110, - ms120, ms130, ms140, ms150, ms160, ms170, - ms180, ms190, ms200, spare1} - -T-StatusProhibit ::= ENUMERATED { - ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms105, - ms110, ms115, ms120, ms125, ms130, ms135, - ms140, ms145, ms150, ms155, ms160, ms165, - ms170, ms175, ms180, ms185, ms190, ms195, - ms200, ms205, ms210, ms215, ms220, ms225, - ms230, ms235, ms240, ms245, ms250, ms300, - ms350, ms400, ms450, ms500, spare8, spare7, - spare6, spare5, spare4, spare3, spare2, - spare1} - - -SchedulingRequestConfig ::= CHOICE { - release NULL, - setup SEQUENCE { - sr-PUCCH-ResourceIndex INTEGER (0..2047), - sr-ConfigIndex INTEGER (0..155), - dsr-TransMax ENUMERATED { - n4, n8, n16, n32, n64, spare3, spare2, spare1} - } -} - - -SoundingRS-UL-ConfigCommon ::= CHOICE { - release NULL, - setup SEQUENCE { - srs-BandwidthConfig ENUMERATED {bw0, bw1, bw2, bw3, bw4, bw5, bw6, bw7}, - srs-SubframeConfig ENUMERATED { - sc0, sc1, sc2, sc3, sc4, sc5, sc6, sc7, - sc8, sc9, sc10, sc11, sc12, sc13, sc14, sc15}, - ackNackSRS-SimultaneousTransmission BOOLEAN, - srs-MaxUpPts ENUMERATED {true} OPTIONAL -- Cond TDD - } -} - -SoundingRS-UL-ConfigDedicated ::= CHOICE{ - release NULL, - setup SEQUENCE { - srs-Bandwidth ENUMERATED {bw0, bw1, bw2, bw3}, - srs-HoppingBandwidth ENUMERATED {hbw0, hbw1, hbw2, hbw3}, - freqDomainPosition INTEGER (0..23), - duration BOOLEAN, - srs-ConfigIndex INTEGER (0..1023), - transmissionComb INTEGER (0..1), - cyclicShift ENUMERATED {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7} - } -} - - - -SPS-Config ::= SEQUENCE { - semiPersistSchedC-RNTI C-RNTI OPTIONAL, -- Need OR - sps-ConfigDL SPS-ConfigDL OPTIONAL, -- Need ON - sps-ConfigUL SPS-ConfigUL OPTIONAL -- Need ON -} - -SPS-ConfigDL ::= CHOICE{ - release NULL, - setup SEQUENCE { - semiPersistSchedIntervalDL ENUMERATED { - sf10, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, spare6, - spare5, spare4, spare3, spare2, - spare1}, - numberOfConfSPS-Processes INTEGER (1..8), - n1-PUCCH-AN-PersistentList N1-PUCCH-AN-PersistentList, - ... - } -} - -SPS-ConfigUL ::= CHOICE { - release NULL, - setup SEQUENCE { - semiPersistSchedIntervalUL ENUMERATED { - sf10, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, spare6, - spare5, spare4, spare3, spare2, - spare1}, - implicitReleaseAfter ENUMERATED {e2, e3, e4, e8}, - p0-Persistent SEQUENCE { - p0-NominalPUSCH-Persistent INTEGER (-126..24), - p0-UE-PUSCH-Persistent INTEGER (-8..7) - } OPTIONAL, -- Need OP - twoIntervalsConfig ENUMERATED {true} OPTIONAL, -- Cond TDD - ... - } -} - -N1-PUCCH-AN-PersistentList ::= SEQUENCE (SIZE (1..4)) OF INTEGER (0..2047) - - -TDD-Config ::= SEQUENCE { - subframeAssignment ENUMERATED { - sa0, sa1, sa2, sa3, sa4, sa5, sa6}, - specialSubframePatterns ENUMERATED { - ssp0, ssp1, ssp2, ssp3, ssp4,ssp5, ssp6, ssp7, - ssp8} -} - - -TimeAlignmentTimer ::= ENUMERATED { - sf500, sf750, sf1280, sf1920, sf2560, sf5120, - sf10240, infinity} - -TPC-PDCCH-Config::= CHOICE { - release NULL, - setup SEQUENCE { - tpc-RNTI BIT STRING (SIZE (16)), - tpc-Index TPC-Index - } -} - -TPC-Index ::= CHOICE { - indexOfFormat3 INTEGER (1..15), - indexOfFormat3A INTEGER (1..31) -} - - -UplinkPowerControlCommon ::= SEQUENCE { - p0-NominalPUSCH INTEGER (-126..24), - alpha ENUMERATED {al0, al04, al05, al06, al07, al08, al09, al1}, - p0-NominalPUCCH INTEGER (-127..-96), - deltaFList-PUCCH DeltaFList-PUCCH, - deltaPreambleMsg3 INTEGER (-1..6) -} - -UplinkPowerControlDedicated ::= SEQUENCE { - p0-UE-PUSCH INTEGER (-8..7), - deltaMCS-Enabled ENUMERATED {en0, en1}, - accumulationEnabled BOOLEAN, - p0-UE-PUCCH INTEGER (-8..7), - pSRS-Offset INTEGER (0..15), - filterCoefficient FilterCoefficient DEFAULT fc4 -} - -DeltaFList-PUCCH ::= SEQUENCE { - deltaF-PUCCH-Format1 ENUMERATED {deltaF-2, deltaF0, deltaF2}, - deltaF-PUCCH-Format1b ENUMERATED {deltaF1, deltaF3, deltaF5}, - deltaF-PUCCH-Format2 ENUMERATED {deltaF-2, deltaF0, deltaF1, deltaF2}, - deltaF-PUCCH-Format2a ENUMERATED {deltaF-2, deltaF0, deltaF2}, - deltaF-PUCCH-Format2b ENUMERATED {deltaF-2, deltaF0, deltaF2} -} - - -NextHopChainingCount ::= INTEGER (0..7) - - -SecurityAlgorithmConfig ::= SEQUENCE { - cipheringAlgorithm ENUMERATED { - eea0, eea1, eea2, spare5, spare4, spare3, - spare2, spare1, ...}, - integrityProtAlgorithm ENUMERATED { - reserved, eia1, eia2, spare5, spare4, spare3, - spare2, spare1, ...} -} - - -ShortMAC-I ::= BIT STRING (SIZE (16)) - - -AdditionalSpectrumEmission ::= INTEGER (1..32) - - -ARFCN-ValueCDMA2000 ::= INTEGER (0..2047) - - -ARFCN-ValueEUTRA ::= INTEGER (0..maxEARFCN) - - -ARFCN-ValueGERAN ::= INTEGER (0..1023) - - -ARFCN-ValueUTRA ::= INTEGER (0..16383) - - -BandclassCDMA2000 ::= ENUMERATED { - bc0, bc1, bc2, bc3, bc4, bc5, bc6, bc7, bc8, - bc9, bc10, bc11, bc12, bc13, bc14, bc15, bc16, - bc17, spare14, spare13, spare12, spare11, spare10, - spare9, spare8, spare7, spare6, spare5, spare4, - spare3, spare2, spare1, ...} - - -BandIndicatorGERAN ::= ENUMERATED {dcs1800, pcs1900} - - -CarrierFreqCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - arfcn ARFCN-ValueCDMA2000 -} - - -CarrierFreqGERAN ::= SEQUENCE { - arfcn ARFCN-ValueGERAN, - bandIndicator BandIndicatorGERAN -} - - -CarrierFreqsGERAN ::= SEQUENCE { - startingARFCN ARFCN-ValueGERAN, - bandIndicator BandIndicatorGERAN, - followingARFCNs CHOICE { - explicitListOfARFCNs ExplicitListOfARFCNs, - equallySpacedARFCNs SEQUENCE { - arfcn-Spacing INTEGER (1..8), - numberOfFollowingARFCNs INTEGER (0..31) - }, - variableBitMapOfARFCNs OCTET STRING (SIZE (1..16)) - } -} - -ExplicitListOfARFCNs ::= SEQUENCE (SIZE (0..31)) OF ARFCN-ValueGERAN - - -CDMA2000-Type ::= ENUMERATED {type1XRTT, typeHRPD} - - -CellIdentity ::= BIT STRING (SIZE (28)) - - -CellIndexList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellIndex - -CellIndex ::= INTEGER (1..maxCellMeas) - - -CellReselectionPriority ::= INTEGER (0..7) - - -CSFB-RegistrationParam1XRTT ::= SEQUENCE { - sid BIT STRING (SIZE (15)), - nid BIT STRING (SIZE (16)), - multipleSID BOOLEAN, - multipleNID BOOLEAN, - homeReg BOOLEAN, - foreignSIDReg BOOLEAN, - foreignNIDReg BOOLEAN, - parameterReg BOOLEAN, - powerUpReg BOOLEAN, - registrationPeriod BIT STRING (SIZE (7)), - registrationZone BIT STRING (SIZE (12)), - totalZone BIT STRING (SIZE (3)), - zoneTimer BIT STRING (SIZE (3)) -} - - -CellGlobalIdEUTRA ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellIdentity CellIdentity -} - - -CellGlobalIdUTRA ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellIdentity BIT STRING (SIZE (28)) -} - - -CellGlobalIdGERAN ::= SEQUENCE { - plmn-Identity PLMN-Identity, - locationAreaCode BIT STRING (SIZE (16)), - cellIdentity BIT STRING (SIZE (16)) -} - - -CellGlobalIdCDMA2000 ::= CHOICE { - cellGlobalId1XRTT BIT STRING (SIZE (47)), - cellGlobalIdHRPD BIT STRING (SIZE (128)) -} - - -MobilityControlInfo ::= SEQUENCE { - targetPhysCellId PhysCellId, - carrierFreq CarrierFreqEUTRA OPTIONAL, -- Cond HO-toEUTRA - carrierBandwidth CarrierBandwidthEUTRA OPTIONAL, -- Cond HO-toEUTRA - additionalSpectrumEmission AdditionalSpectrumEmission OPTIONAL, -- Cond HO-toEUTRA - t304 ENUMERATED { - ms50, ms100, ms150, ms200, ms500, ms1000, - ms2000, spare1}, - newUE-Identity C-RNTI, - radioResourceConfigCommon RadioResourceConfigCommon, - rach-ConfigDedicated RACH-ConfigDedicated OPTIONAL, -- Need OP - ... -} - -CarrierBandwidthEUTRA ::= SEQUENCE { - dl-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100, spare10, - spare9, spare8, spare7, spare6, spare5, - spare4, spare3, spare2, spare1}, - ul-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100, spare10, - spare9, spare8, spare7, spare6, spare5, - spare4, spare3, spare2, spare1} OPTIONAL -- Need OP -} - -CarrierFreqEUTRA ::= SEQUENCE { - dl-CarrierFreq ARFCN-ValueEUTRA, - ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL -- Cond FDD -} - - -MobilityParametersCDMA2000 ::= OCTET STRING - - -MobilityStateParameters ::= SEQUENCE { - t-Evaluation ENUMERATED { - s30, s60, s120, s180, s240, spare3, spare2, spare1}, - t-HystNormal ENUMERATED { - s30, s60, s120, s180, s240, spare3, spare2, spare1}, - n-CellChangeMedium INTEGER (1..16), - n-CellChangeHigh INTEGER (1..16) -} - - -PhysCellId ::= INTEGER (0..503) - - -PhysCellIdRange ::= SEQUENCE { - start PhysCellId, - range ENUMERATED { - n4, n8, n12, n16, n24, n32, n48, n64, n84, - n96, n128, n168, n252, n504, spare2, - spare1} OPTIONAL -- Need OP -} - - -PhysCellIdCDMA2000 ::= INTEGER (0..maxPNOffset) - - -PhysCellIdGERAN ::= SEQUENCE { - networkColourCode BIT STRING (SIZE (3)), - baseStationColourCode BIT STRING (SIZE (3)) -} - - -PhysCellIdUTRA-FDD ::= INTEGER (0..511) - - -PhysCellIdUTRA-TDD ::= INTEGER (0..127) - - -PLMN-Identity ::= SEQUENCE { - mcc MCC OPTIONAL, -- Cond MCC - mnc MNC -} - -MCC ::= SEQUENCE (SIZE (3)) OF - MCC-MNC-Digit - -MNC ::= SEQUENCE (SIZE (2..3)) OF - MCC-MNC-Digit - -MCC-MNC-Digit ::= INTEGER (0..9) - - - -PreRegistrationInfoHRPD ::= SEQUENCE { - preRegistrationAllowed BOOLEAN, - preRegistrationZoneId PreRegistrationZoneIdHRPD OPTIONAL, -- cond PreRegAllowed - secondaryPreRegistrationZoneIdList SecondaryPreRegistrationZoneIdListHRPD OPTIONAL -- Need OR -} - -SecondaryPreRegistrationZoneIdListHRPD ::= SEQUENCE (SIZE (1..2)) OF PreRegistrationZoneIdHRPD - -PreRegistrationZoneIdHRPD ::= INTEGER (0..255) - - -Q-RxLevMin ::= INTEGER (-70..-22) - - -Q-OffsetRange ::= ENUMERATED { - dB-24, dB-22, dB-20, dB-18, dB-16, dB-14, - dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3, - dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5, - dB6, dB8, dB10, dB12, dB14, dB16, dB18, - dB20, dB22, dB24} - - -Q-OffsetRangeInterRAT ::= INTEGER (-15..15) - - -ReselectionThreshold ::= INTEGER (0..31) - - -SpeedStateScaleFactors ::= SEQUENCE { - sf-Medium ENUMERATED {oDot25, oDot5, oDot75, lDot0}, - sf-High ENUMERATED {oDot25, oDot5, oDot75, lDot0} -} - -SystemTimeInfoCDMA2000 ::= SEQUENCE { - cdma-EUTRA-Synchronisation BOOLEAN, - cdma-SystemTime CHOICE { - synchronousSystemTime BIT STRING (SIZE (39)), - asynchronousSystemTime BIT STRING (SIZE (49)) - } -} - - -TrackingAreaCode ::= BIT STRING (SIZE (16)) - - -T-Reselection ::= INTEGER (0..7) - - -AllowedMeasBandwidth ::= ENUMERATED {mbw6, mbw15, mbw25, mbw50, mbw75, mbw100} - - -Hysteresis ::= INTEGER (0..30) - - -MeasConfig ::= SEQUENCE { - -- Measurement objects - measObjectToRemoveList MeasObjectToRemoveList OPTIONAL, -- Need ON - measObjectToAddModList MeasObjectToAddModList OPTIONAL, -- Need ON - -- Reporting configurations - reportConfigToRemoveList ReportConfigToRemoveList OPTIONAL, -- Need ON - reportConfigToAddModList ReportConfigToAddModList OPTIONAL, -- Need ON - -- Measurement identities - measIdToRemoveList MeasIdToRemoveList OPTIONAL, -- Need ON - measIdToAddModList MeasIdToAddModList OPTIONAL, -- Need ON - -- Other parameters - quantityConfig QuantityConfig OPTIONAL, -- Need ON - measGapConfig MeasGapConfig OPTIONAL, -- Need ON - s-Measure RSRP-Range OPTIONAL, -- Need ON - preRegistrationInfoHRPD PreRegistrationInfoHRPD OPTIONAL, -- Need OP - speedStatePars CHOICE { - release NULL, - setup SEQUENCE { - mobilityStateParameters MobilityStateParameters, - timeToTrigger-SF SpeedStateScaleFactors - } - } OPTIONAL, -- Need ON - ... -} - -MeasIdToRemoveList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasId - -MeasObjectToRemoveList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectId - -ReportConfigToRemoveList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigId - - -MeasGapConfig ::= CHOICE { - release NULL, - setup SEQUENCE { - gapOffset CHOICE { - gp0 INTEGER (0..39), - gp1 INTEGER (0..79), - ... - } - } -} - - -MeasId ::= INTEGER (1..maxMeasId) - - -MeasIdToAddModList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasIdToAddMod - -MeasIdToAddMod ::= SEQUENCE { - measId MeasId, - measObjectId MeasObjectId, - reportConfigId ReportConfigId -} - - -MeasObjectCDMA2000 ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - carrierFreq CarrierFreqCDMA2000, - searchWindowSize INTEGER (0..15) OPTIONAL, -- Need ON - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CellsToAddModListCDMA2000 OPTIONAL, -- Need ON - cellForWhichToReportCGI PhysCellIdCDMA2000 OPTIONAL, -- Need ON - ... -} - -CellsToAddModListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModCDMA2000 - -CellsToAddModCDMA2000 ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdCDMA2000 -} - - -MeasObjectEUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueEUTRA, - allowedMeasBandwidth AllowedMeasBandwidth, - presenceAntennaPort1 PresenceAntennaPort1, - neighCellConfig NeighCellConfig, - offsetFreq Q-OffsetRange DEFAULT dB0, - -- Neighbour cell list - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CellsToAddModList OPTIONAL, -- Need ON - -- Black list - blackCellsToRemoveList CellIndexList OPTIONAL, -- Need ON - blackCellsToAddModList BlackCellsToAddModList OPTIONAL, -- Need ON - cellForWhichToReportCGI PhysCellId OPTIONAL, -- Need ON - ... -} - -CellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddMod - -CellsToAddMod ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellId, - cellIndividualOffset Q-OffsetRange -} - -BlackCellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF BlackCellsToAddMod - -BlackCellsToAddMod ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellIdRange PhysCellIdRange -} - - -MeasObjectGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - ncc-Permitted BIT STRING(SIZE (8)) DEFAULT '11111111'B, - cellForWhichToReportCGI PhysCellIdGERAN OPTIONAL, -- Need ON - ... -} - - -MeasObjectId ::= INTEGER (1..maxObjectId) - - -MeasObjectToAddModList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectToAddMod - -MeasObjectToAddMod ::= SEQUENCE { - measObjectId MeasObjectId, - measObject CHOICE { - measObjectEUTRA MeasObjectEUTRA, - measObjectUTRA MeasObjectUTRA, - measObjectGERAN MeasObjectGERAN, - measObjectCDMA2000 MeasObjectCDMA2000, - ... - } -} - - -MeasObjectUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CHOICE { - cellsToAddModListUTRA-FDD CellsToAddModListUTRA-FDD, - cellsToAddModListUTRA-TDD CellsToAddModListUTRA-TDD - } OPTIONAL, -- Need ON - cellForWhichToReportCGI CHOICE { - utra-FDD PhysCellIdUTRA-FDD, - utra-TDD PhysCellIdUTRA-TDD - } OPTIONAL, -- Need ON - ... -} - -CellsToAddModListUTRA-FDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-FDD - -CellsToAddModUTRA-FDD ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdUTRA-FDD -} - -CellsToAddModListUTRA-TDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-TDD - -CellsToAddModUTRA-TDD ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdUTRA-TDD -} - - -MeasResults ::= SEQUENCE { - measId MeasId, - measResultServCell SEQUENCE { - rsrpResult RSRP-Range, - rsrqResult RSRQ-Range - }, - measResultNeighCells CHOICE { - measResultListEUTRA MeasResultListEUTRA, - measResultListUTRA MeasResultListUTRA, - measResultListGERAN MeasResultListGERAN, - measResultsCDMA2000 MeasResultsCDMA2000, - ... - } OPTIONAL, - ... -} - -MeasResultListEUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultEUTRA - -MeasResultEUTRA ::= SEQUENCE { - physCellId PhysCellId, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdEUTRA, - trackingAreaCode TrackingAreaCode, - plmn-IdentityList PLMN-IdentityList2 OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - rsrpResult RSRP-Range OPTIONAL, - rsrqResult RSRQ-Range OPTIONAL, - ... - } -} - -MeasResultListUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultUTRA - -MeasResultUTRA ::= SEQUENCE { - physCellId CHOICE { - fdd PhysCellIdUTRA-FDD, - tdd PhysCellIdUTRA-TDD - }, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdUTRA, - locationAreaCode BIT STRING (SIZE (16)) OPTIONAL, - routingAreaCode BIT STRING (SIZE (8)) OPTIONAL, - plmn-IdentityList PLMN-IdentityList2 OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - utra-RSCP INTEGER (-5..91) OPTIONAL, - utra-EcN0 INTEGER (0..49) OPTIONAL, - ... - } -} - -MeasResultListGERAN ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultGERAN - -MeasResultGERAN ::= SEQUENCE { - carrierFreq CarrierFreqGERAN, - physCellId PhysCellIdGERAN, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdGERAN, - routingAreaCode BIT STRING (SIZE (8)) OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - rssi INTEGER (0..63), - ... - } -} - -MeasResultsCDMA2000 ::= SEQUENCE { - preRegistrationStatusHRPD BOOLEAN, - measResultListCDMA2000 MeasResultListCDMA2000 -} - -MeasResultListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultCDMA2000 - -MeasResultCDMA2000 ::= SEQUENCE { - physCellId PhysCellIdCDMA2000, - cgi-Info CellGlobalIdCDMA2000 OPTIONAL, - measResult SEQUENCE { - pilotPnPhase INTEGER (0..32767) OPTIONAL, - pilotStrength INTEGER (0..63), - ... - } -} - -PLMN-IdentityList2 ::= SEQUENCE (SIZE (1..5)) OF PLMN-Identity - - -QuantityConfig ::= SEQUENCE { - quantityConfigEUTRA QuantityConfigEUTRA OPTIONAL, -- Need ON - quantityConfigUTRA QuantityConfigUTRA OPTIONAL, -- Need ON - quantityConfigGERAN QuantityConfigGERAN OPTIONAL, -- Need ON - quantityConfigCDMA2000 QuantityConfigCDMA2000 OPTIONAL, -- Need ON - ... -} - -QuantityConfigEUTRA ::= SEQUENCE { - filterCoefficientRSRP FilterCoefficient DEFAULT fc4, - filterCoefficientRSRQ FilterCoefficient DEFAULT fc4 -} - -QuantityConfigUTRA ::= SEQUENCE { - measQuantityUTRA-FDD ENUMERATED {cpich-RSCP, cpich-EcN0}, - measQuantityUTRA-TDD ENUMERATED {pccpch-RSCP}, - filterCoefficient FilterCoefficient DEFAULT fc4 -} - -QuantityConfigGERAN ::= SEQUENCE { - measQuantityGERAN ENUMERATED {rssi}, - filterCoefficient FilterCoefficient DEFAULT fc2 -} - -QuantityConfigCDMA2000 ::= SEQUENCE { - measQuantityCDMA2000 ENUMERATED {pilotStrength, pilotPnPhaseAndPilotStrength} -} - - -ReportConfigEUTRA ::= SEQUENCE { - triggerType CHOICE { - event SEQUENCE { - eventId CHOICE { - eventA1 SEQUENCE { - a1-Threshold ThresholdEUTRA - }, - eventA2 SEQUENCE { - a2-Threshold ThresholdEUTRA - }, - eventA3 SEQUENCE { - a3-Offset INTEGER (-30..30), - reportOnLeave BOOLEAN - }, - eventA4 SEQUENCE { - a4-Threshold ThresholdEUTRA - }, - eventA5 SEQUENCE { - a5-Threshold1 ThresholdEUTRA, - a5-Threshold2 ThresholdEUTRA - }, - ... - }, - hysteresis Hysteresis, - timeToTrigger TimeToTrigger - }, - periodical SEQUENCE { - purpose ENUMERATED { - reportStrongestCells, reportCGI} - } - }, - triggerQuantity ENUMERATED {rsrp, rsrq}, - reportQuantity ENUMERATED {sameAsTriggerQuantity, both}, - maxReportCells INTEGER (1..maxCellReport), - reportInterval ReportInterval, - reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, - ... -} - -ThresholdEUTRA ::= CHOICE{ - threshold-RSRP RSRP-Range, - threshold-RSRQ RSRQ-Range -} - - -ReportConfigId ::= INTEGER (1..maxReportConfigId) - - -ReportConfigInterRAT ::= SEQUENCE { - triggerType CHOICE { - event SEQUENCE { - eventId CHOICE { - eventB1 SEQUENCE { - b1-Threshold CHOICE { - b1-ThresholdUTRA ThresholdUTRA, - b1-ThresholdGERAN ThresholdGERAN, - b1-ThresholdCDMA2000 ThresholdCDMA2000 - } - }, - eventB2 SEQUENCE { - b2-Threshold1 ThresholdEUTRA, - b2-Threshold2 CHOICE { - b2-Threshold2UTRA ThresholdUTRA, - b2-Threshold2GERAN ThresholdGERAN, - b2-Threshold2CDMA2000 ThresholdCDMA2000 - } - }, - ... - }, - hysteresis Hysteresis, - timeToTrigger TimeToTrigger - }, - periodical SEQUENCE { - purpose ENUMERATED { - reportStrongestCells, - reportStrongestCellsForSON, - reportCGI} - } - }, - maxReportCells INTEGER (1..maxCellReport), - reportInterval ReportInterval, - reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, - ... -} - -ThresholdUTRA ::= CHOICE{ - utra-RSCP INTEGER (-5..91), - utra-EcN0 INTEGER (0..49) -} - -ThresholdGERAN ::= INTEGER (0..63) - -ThresholdCDMA2000 ::= INTEGER (0..63) - - -ReportConfigToAddModList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigToAddMod - -ReportConfigToAddMod ::= SEQUENCE { - reportConfigId ReportConfigId, - reportConfig CHOICE { - reportConfigEUTRA ReportConfigEUTRA, - reportConfigInterRAT ReportConfigInterRAT - } -} - - - -ReportInterval ::= ENUMERATED { - ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, - min1, min6, min12, min30, min60, spare3, spare2, spare1} - - -RSRP-Range ::= INTEGER(0..97) - - -RSRQ-Range ::= INTEGER(0..34) - - -TimeToTrigger ::= ENUMERATED { - ms0, ms40, ms64, ms80, ms100, ms128, ms160, ms256, - ms320, ms480, ms512, ms640, ms1024, ms1280, ms2560, - ms5120} - - -C-RNTI ::= BIT STRING (SIZE (16)) - - -DedicatedInfoCDMA2000 ::= OCTET STRING - - -DedicatedInfoNAS ::= OCTET STRING - - -FilterCoefficient ::= ENUMERATED { - fc0, fc1, fc2, fc3, fc4, fc5, - fc6, fc7, fc8, fc9, fc11, fc13, - fc15, fc17, fc19, spare1, ...} - - -MMEC ::= BIT STRING (SIZE (8)) - - -NeighCellConfig ::= BIT STRING (SIZE (2)) - - -RAND-CDMA2000 ::= BIT STRING (SIZE (32)) - - -RAT-Type ::= ENUMERATED { - eutra, utra, geran-cs, geran-ps, cdma2000-1XRTT, - spare3, spare2, spare1, ...} - - -RRC-TransactionIdentifier ::= INTEGER (0..3) - - -S-TMSI ::= SEQUENCE { - mmec MMEC, - m-TMSI BIT STRING (SIZE (32)) -} - - -UE-CapabilityRAT-ContainerList ::=SEQUENCE (SIZE (0..maxRAT-Capabilities)) OF UE-CapabilityRAT-Container - -UE-CapabilityRAT-Container ::= SEQUENCE { - rat-Type RAT-Type, - ueCapabilityRAT-Container OCTET STRING -} - - -UE-EUTRA-Capability ::= SEQUENCE { - accessStratumRelease AccessStratumRelease, - ue-Category INTEGER (1..5), - pdcp-Parameters PDCP-Parameters, - phyLayerParameters PhyLayerParameters, - rf-Parameters RF-Parameters, - measParameters MeasParameters, - featureGroupIndicators BIT STRING (SIZE (32)) OPTIONAL, - interRAT-Parameters SEQUENCE { - utraFDD IRAT-ParametersUTRA-FDD OPTIONAL, - utraTDD128 IRAT-ParametersUTRA-TDD128 OPTIONAL, - utraTDD384 IRAT-ParametersUTRA-TDD384 OPTIONAL, - utraTDD768 IRAT-ParametersUTRA-TDD768 OPTIONAL, - geran IRAT-ParametersGERAN OPTIONAL, - cdma2000-HRPD IRAT-ParametersCDMA2000-HRPD OPTIONAL, - cdma2000-1xRTT IRAT-ParametersCDMA2000-1XRTT OPTIONAL - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -AccessStratumRelease ::= ENUMERATED { - rel8, spare7, spare6, spare5, spare4, spare3, - spare2, spare1, ...} - -PDCP-Parameters ::= SEQUENCE { - supportedROHC-Profiles SEQUENCE { - profile0x0001 BOOLEAN, - profile0x0002 BOOLEAN, - profile0x0003 BOOLEAN, - profile0x0004 BOOLEAN, - profile0x0006 BOOLEAN, - profile0x0101 BOOLEAN, - profile0x0102 BOOLEAN, - profile0x0103 BOOLEAN, - profile0x0104 BOOLEAN - }, - maxNumberROHC-ContextSessions ENUMERATED { - cs2, cs4, cs8, cs12, cs16, cs24, cs32, - cs48, cs64, cs128, cs256, cs512, cs1024, - cs16384, spare2, spare1} DEFAULT cs16, - ... -} - -PhyLayerParameters ::= SEQUENCE { - ue-TxAntennaSelectionSupported BOOLEAN, - ue-SpecificRefSigsSupported BOOLEAN -} - -RF-Parameters ::= SEQUENCE { - supportedBandListEUTRA SupportedBandListEUTRA -} - -SupportedBandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA - -SupportedBandEUTRA ::= SEQUENCE { - bandEUTRA INTEGER (1..64), - halfDuplex BOOLEAN -} - -MeasParameters ::= SEQUENCE { - bandListEUTRA BandListEUTRA -} - -BandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF BandInfoEUTRA - -BandInfoEUTRA ::= SEQUENCE { - interFreqBandList InterFreqBandList, - interRAT-BandList InterRAT-BandList OPTIONAL -} - -InterFreqBandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterFreqBandInfo - -InterFreqBandInfo ::= SEQUENCE { - interFreqNeedForGaps BOOLEAN -} - -InterRAT-BandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterRAT-BandInfo - -InterRAT-BandInfo ::= SEQUENCE { - interRAT-NeedForGaps BOOLEAN -} - -IRAT-ParametersUTRA-FDD ::= SEQUENCE { - supportedBandListUTRA-FDD SupportedBandListUTRA-FDD -} - -SupportedBandListUTRA-FDD ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-FDD - -SupportedBandUTRA-FDD ::= ENUMERATED { - bandI, bandII, bandIII, bandIV, bandV, bandVI, - bandVII, bandVIII, bandIX, bandX, bandXI, - bandXII, bandXIII, bandXIV, bandXV, bandXVI, ...} - -IRAT-ParametersUTRA-TDD128 ::= SEQUENCE { - supportedBandListUTRA-TDD128 SupportedBandListUTRA-TDD128 -} - -SupportedBandListUTRA-TDD128 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD128 - -SupportedBandUTRA-TDD128 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersUTRA-TDD384 ::= SEQUENCE { - supportedBandListUTRA-TDD384 SupportedBandListUTRA-TDD384 -} - -SupportedBandListUTRA-TDD384 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD384 - -SupportedBandUTRA-TDD384 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersUTRA-TDD768 ::= SEQUENCE { - supportedBandListUTRA-TDD768 SupportedBandListUTRA-TDD768 -} - -SupportedBandListUTRA-TDD768 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD768 - -SupportedBandUTRA-TDD768 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersGERAN ::= SEQUENCE { - supportedBandListGERAN SupportedBandListGERAN, - interRAT-PS-HO-ToGERAN BOOLEAN -} - -SupportedBandListGERAN ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandGERAN - -SupportedBandGERAN ::= ENUMERATED { - gsm450, gsm480, gsm710, gsm750, gsm810, gsm850, - gsm900P, gsm900E, gsm900R, gsm1800, gsm1900, - spare5, spare4, spare3, spare2, spare1, ...} - -IRAT-ParametersCDMA2000-HRPD ::= SEQUENCE { - supportedBandListHRPD SupportedBandListHRPD, - tx-ConfigHRPD ENUMERATED {single, dual}, - rx-ConfigHRPD ENUMERATED {single, dual} -} - -SupportedBandListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 - -IRAT-ParametersCDMA2000-1XRTT ::= SEQUENCE { - supportedBandList1XRTT SupportedBandList1XRTT, - tx-Config1XRTT ENUMERATED {single, dual}, - rx-Config1XRTT ENUMERATED {single, dual} -} - -SupportedBandList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 - - -UE-TimersAndConstants ::= SEQUENCE { - t300 ENUMERATED { - ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, - ms2000}, - t301 ENUMERATED { - ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, - ms2000}, - t310 ENUMERATED { - ms0, ms50, ms100, ms200, ms500, ms1000, ms2000}, - n310 ENUMERATED { - n1, n2, n3, n4, n6, n8, n10, n20}, - t311 ENUMERATED { - ms1000, ms3000, ms5000, ms10000, ms15000, - ms20000, ms30000}, - n311 ENUMERATED { - n1, n2, n3, n4, n5, n6, n8, n10}, - ... -} - - -maxBands INTEGER ::= 64 -- Maximum number of bands listed in EUTRA UE caps -maxCDMA-BandClass INTEGER ::= 32 -- Maximum value of the CDMA band classes -maxCellBlack INTEGER ::= 16 -- Maximum number of blacklisted cells - -- listed in SIB type 4 and 5 -maxCellInter INTEGER ::= 16 -- Maximum number of neighbouring inter-frequency - -- cells listed in SIB type 5 -maxCellIntra INTEGER ::= 16 -- Maximum number of neighbouring intra-frequency - -- cells listed in SIB type 4 -maxCellMeas INTEGER ::= 32 -- Maximum number of neighbouring cells within a - -- measurement object (incl blacklisted cells) -maxCellReport INTEGER ::= 8 -- Maximum number of reported cells -maxDRB INTEGER ::= 11 -- Maximum number of Data Radio Bearers -maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier fequency -maxFreq INTEGER ::= 8 -- Maximum number of EUTRA carrier frequencies -maxGERAN-SI INTEGER ::= 10 -- Maximum number of GERAN SI blocks that can be - -- provided as part of NACC information -maxGNFG INTEGER ::= 16 -- Maximum number of GERAN neighbour freq groups -maxMBSFN-Allocations INTEGER ::= 8 -- Maximum number of MBSFN frame allocations with - -- different offset -maxMCS-1 INTEGER ::= 16 -- Maximum number of PUCCH formats (MCS) -maxMeasId INTEGER ::= 32 -maxObjectId INTEGER ::= 32 -maxPageRec INTEGER ::= 16 -- -maxPNOffset INTEGER ::= 511 -- Maximum number of CDMA2000 PNOffsets -maxRAT-Capabilities INTEGER ::= 8 -- Maximum number of interworking RATs (incl EUTRA) -maxReportConfigId INTEGER ::= 32 -maxSIB INTEGER ::= 32 -- Maximum number of SIBs -maxSIB-1 INTEGER ::= 31 -maxSI-Message INTEGER ::= 32 -- Maximum number of SI messages -maxUTRA-FDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA FDD carrier frequencies -maxUTRA-TDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA TDD carrier frequencies - - -END - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-UE-Variables.asn b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-UE-Variables.asn deleted file mode 100755 index f42396c649..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-UE-Variables.asn +++ /dev/null @@ -1,47 +0,0 @@ -EUTRA-UE-Variables DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - - -VarMeasConfig ::= SEQUENCE { - -- Measurement identities - measIdList MeasIdToAddModList OPTIONAL, - -- Measurement objects - measObjectList MeasObjectToAddModList OPTIONAL, - -- Reporting configurations - reportConfigList ReportConfigToAddModList OPTIONAL, - -- Other parameters - quantityConfig QuantityConfig OPTIONAL, - s-Measure RSRP-Range OPTIONAL, - speedStatePars CHOICE { - release NULL, - setup SEQUENCE { - mobilityStateParameters MobilityStateParameters, - timeToTrigger-SF SpeedStateScaleFactors - } - } OPTIONAL -} - - -VarMeasReportList ::= SEQUENCE (SIZE (1..maxMeasId)) OF VarMeasReport - -VarMeasReport ::= SEQUENCE { - -- List of measurement that have been triggered - measId MeasId, - cellsTriggeredList CellsTriggeredList OPTIONAL, - numberOfReportsSent INTEGER -} - -CellsTriggeredList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF PhysCellId - - -VarShortMAC-Input ::= SEQUENCE { - cellIdentity CellIdentity, - physCellId PhysCellId, - c-RNTI C-RNTI -} - - - -END - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/Makefile.am.sample b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/Makefile.am.sample deleted file mode 100755 index fa68b7cf89..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/Makefile.am.sample +++ /dev/null @@ -1,816 +0,0 @@ -ASN_MODULE_SOURCES= \ - BCCH-BCH-Message.c \ - BCCH-BCH-MessageType.c \ - BCCH-DL-SCH-Message.c \ - BCCH-DL-SCH-MessageType.c \ - PCCH-Message.c \ - PCCH-MessageType.c \ - DL-CCCH-Message.c \ - DL-CCCH-MessageType.c \ - DL-DCCH-Message.c \ - DL-DCCH-MessageType.c \ - UL-CCCH-Message.c \ - UL-CCCH-MessageType.c \ - UL-DCCH-Message.c \ - UL-DCCH-MessageType.c \ - CounterCheck.c \ - CounterCheck-r8-IEs.c \ - DRB-CountMSB-InfoList.c \ - DRB-CountMSB-Info.c \ - CounterCheckResponse.c \ - CounterCheckResponse-r8-IEs.c \ - DRB-CountInfoList.c \ - DRB-CountInfo.c \ - CSFBParametersRequestCDMA2000.c \ - CSFBParametersRequestCDMA2000-r8-IEs.c \ - CSFBParametersResponseCDMA2000.c \ - CSFBParametersResponseCDMA2000-r8-IEs.c \ - DLInformationTransfer.c \ - DLInformationTransfer-r8-IEs.c \ - HandoverFromEUTRAPreparationRequest.c \ - HandoverFromEUTRAPreparationRequest-r8-IEs.c \ - MasterInformationBlock.c \ - MeasurementReport.c \ - MeasurementReport-r8-IEs.c \ - MobilityFromEUTRACommand.c \ - MobilityFromEUTRACommand-r8-IEs.c \ - Handover.c \ - CellChangeOrder.c \ - SI-OrPSI-GERAN.c \ - SystemInfoListGERAN.c \ - Paging.c \ - PagingRecordList.c \ - PagingRecord.c \ - PagingUE-Identity.c \ - IMSI.c \ - IMSI-Digit.c \ - RRCConnectionReconfiguration.c \ - RRCConnectionReconfiguration-r8-IEs.c \ - SecurityConfigHO.c \ - RRCConnectionReconfigurationComplete.c \ - RRCConnectionReconfigurationComplete-r8-IEs.c \ - RRCConnectionReestablishment.c \ - RRCConnectionReestablishment-r8-IEs.c \ - RRCConnectionReestablishmentComplete.c \ - RRCConnectionReestablishmentComplete-r8-IEs.c \ - RRCConnectionReestablishmentReject.c \ - RRCConnectionReestablishmentReject-r8-IEs.c \ - RRCConnectionReestablishmentRequest.c \ - RRCConnectionReestablishmentRequest-r8-IEs.c \ - ReestabUE-Identity.c \ - ReestablishmentCause.c \ - RRCConnectionReject.c \ - RRCConnectionReject-r8-IEs.c \ - RRCConnectionRelease.c \ - RRCConnectionRelease-r8-IEs.c \ - ReleaseCause.c \ - RedirectedCarrierInfo.c \ - IdleModeMobilityControlInfo.c \ - FreqPriorityListEUTRA.c \ - FreqPriorityEUTRA.c \ - FreqsPriorityListGERAN.c \ - FreqsPriorityGERAN.c \ - FreqPriorityListUTRA-FDD.c \ - FreqPriorityUTRA-FDD.c \ - FreqPriorityListUTRA-TDD.c \ - FreqPriorityUTRA-TDD.c \ - BandClassPriorityListHRPD.c \ - BandClassPriorityHRPD.c \ - BandClassPriorityList1XRTT.c \ - BandClassPriority1XRTT.c \ - RRCConnectionRequest.c \ - RRCConnectionRequest-r8-IEs.c \ - InitialUE-Identity.c \ - EstablishmentCause.c \ - RRCConnectionSetup.c \ - RRCConnectionSetup-r8-IEs.c \ - RRCConnectionSetupComplete.c \ - RRCConnectionSetupComplete-r8-IEs.c \ - RegisteredMME.c \ - SecurityModeCommand.c \ - SecurityModeCommand-r8-IEs.c \ - SecurityConfigSMC.c \ - SecurityModeComplete.c \ - SecurityModeComplete-r8-IEs.c \ - SecurityModeFailure.c \ - SecurityModeFailure-r8-IEs.c \ - SystemInformation.c \ - SystemInformation-r8-IEs.c \ - SystemInformationBlockType1.c \ - PLMN-IdentityList.c \ - PLMN-IdentityInfo.c \ - SchedulingInfoList.c \ - SchedulingInfo.c \ - SIB-MappingInfo.c \ - SIB-Type.c \ - UECapabilityEnquiry.c \ - UECapabilityEnquiry-r8-IEs.c \ - UE-CapabilityRequest.c \ - UECapabilityInformation.c \ - UECapabilityInformation-r8-IEs.c \ - ULHandoverPreparationTransfer.c \ - ULHandoverPreparationTransfer-r8-IEs.c \ - ULInformationTransfer.c \ - ULInformationTransfer-r8-IEs.c \ - SystemInformationBlockType2.c \ - AC-BarringConfig.c \ - MBSFN-SubframeConfigList.c \ - MBSFN-SubframeConfig.c \ - SystemInformationBlockType3.c \ - SystemInformationBlockType4.c \ - IntraFreqNeighCellList.c \ - IntraFreqNeighCellInfo.c \ - IntraFreqBlackCellList.c \ - SystemInformationBlockType5.c \ - InterFreqCarrierFreqList.c \ - InterFreqCarrierFreqInfo.c \ - InterFreqNeighCellList.c \ - InterFreqNeighCellInfo.c \ - InterFreqBlackCellList.c \ - SystemInformationBlockType6.c \ - CarrierFreqListUTRA-FDD.c \ - CarrierFreqUTRA-FDD.c \ - CarrierFreqListUTRA-TDD.c \ - CarrierFreqUTRA-TDD.c \ - SystemInformationBlockType7.c \ - CarrierFreqsInfoListGERAN.c \ - CarrierFreqsInfoGERAN.c \ - SystemInformationBlockType8.c \ - CellReselectionParametersCDMA2000.c \ - NeighCellListCDMA2000.c \ - NeighCellCDMA2000.c \ - NeighCellsPerBandclassListCDMA2000.c \ - NeighCellsPerBandclassCDMA2000.c \ - PhysCellIdListCDMA2000.c \ - BandClassListCDMA2000.c \ - BandClassInfoCDMA2000.c \ - SystemInformationBlockType9.c \ - SystemInformationBlockType10.c \ - SystemInformationBlockType11.c \ - AntennaInfoCommon.c \ - AntennaInfoDedicated.c \ - CQI-ReportConfig.c \ - CQI-ReportPeriodic.c \ - DRB-Identity.c \ - LogicalChannelConfig.c \ - MAC-MainConfig.c \ - DRX-Config.c \ - PDCP-Config.c \ - PDSCH-ConfigCommon.c \ - PDSCH-ConfigDedicated.c \ - PHICH-Config.c \ - PhysicalConfigDedicated.c \ - P-Max.c \ - PRACH-ConfigSIB.c \ - PRACH-Config.c \ - PRACH-ConfigInfo.c \ - PresenceAntennaPort1.c \ - PUCCH-ConfigCommon.c \ - PUCCH-ConfigDedicated.c \ - PUSCH-ConfigCommon.c \ - PUSCH-ConfigDedicated.c \ - UL-ReferenceSignalsPUSCH.c \ - RACH-ConfigCommon.c \ - RACH-ConfigDedicated.c \ - RadioResourceConfigCommonSIB.c \ - RadioResourceConfigCommon.c \ - BCCH-Config.c \ - PCCH-Config.c \ - UL-CyclicPrefixLength.c \ - RadioResourceConfigDedicated.c \ - SRB-ToAddModList.c \ - SRB-ToAddMod.c \ - DRB-ToAddModList.c \ - DRB-ToAddMod.c \ - DRB-ToReleaseList.c \ - RLC-Config.c \ - UL-AM-RLC.c \ - DL-AM-RLC.c \ - UL-UM-RLC.c \ - DL-UM-RLC.c \ - SN-FieldLength.c \ - T-PollRetransmit.c \ - PollPDU.c \ - PollByte.c \ - T-Reordering.c \ - T-StatusProhibit.c \ - SchedulingRequestConfig.c \ - SoundingRS-UL-ConfigCommon.c \ - SoundingRS-UL-ConfigDedicated.c \ - SPS-Config.c \ - SPS-ConfigDL.c \ - SPS-ConfigUL.c \ - N1-PUCCH-AN-PersistentList.c \ - TDD-Config.c \ - TimeAlignmentTimer.c \ - TPC-PDCCH-Config.c \ - TPC-Index.c \ - UplinkPowerControlCommon.c \ - UplinkPowerControlDedicated.c \ - DeltaFList-PUCCH.c \ - NextHopChainingCount.c \ - SecurityAlgorithmConfig.c \ - ShortMAC-I.c \ - AdditionalSpectrumEmission.c \ - ARFCN-ValueCDMA2000.c \ - ARFCN-ValueEUTRA.c \ - ARFCN-ValueGERAN.c \ - ARFCN-ValueUTRA.c \ - BandclassCDMA2000.c \ - BandIndicatorGERAN.c \ - CarrierFreqCDMA2000.c \ - CarrierFreqGERAN.c \ - CarrierFreqsGERAN.c \ - ExplicitListOfARFCNs.c \ - CDMA2000-Type.c \ - CellIdentity.c \ - CellIndexList.c \ - CellIndex.c \ - CellReselectionPriority.c \ - CSFB-RegistrationParam1XRTT.c \ - CellGlobalIdEUTRA.c \ - CellGlobalIdUTRA.c \ - CellGlobalIdGERAN.c \ - CellGlobalIdCDMA2000.c \ - MobilityControlInfo.c \ - CarrierBandwidthEUTRA.c \ - CarrierFreqEUTRA.c \ - MobilityParametersCDMA2000.c \ - MobilityStateParameters.c \ - PhysCellId.c \ - PhysCellIdRange.c \ - PhysCellIdCDMA2000.c \ - PhysCellIdGERAN.c \ - PhysCellIdUTRA-FDD.c \ - PhysCellIdUTRA-TDD.c \ - PLMN-Identity.c \ - MCC.c \ - MNC.c \ - MCC-MNC-Digit.c \ - PreRegistrationInfoHRPD.c \ - SecondaryPreRegistrationZoneIdListHRPD.c \ - PreRegistrationZoneIdHRPD.c \ - Q-RxLevMin.c \ - Q-OffsetRange.c \ - Q-OffsetRangeInterRAT.c \ - ReselectionThreshold.c \ - SpeedStateScaleFactors.c \ - SystemTimeInfoCDMA2000.c \ - TrackingAreaCode.c \ - T-Reselection.c \ - AllowedMeasBandwidth.c \ - Hysteresis.c \ - MeasConfig.c \ - MeasIdToRemoveList.c \ - MeasObjectToRemoveList.c \ - ReportConfigToRemoveList.c \ - MeasGapConfig.c \ - MeasId.c \ - MeasIdToAddModList.c \ - MeasIdToAddMod.c \ - MeasObjectCDMA2000.c \ - CellsToAddModListCDMA2000.c \ - CellsToAddModCDMA2000.c \ - MeasObjectEUTRA.c \ - CellsToAddModList.c \ - CellsToAddMod.c \ - BlackCellsToAddModList.c \ - BlackCellsToAddMod.c \ - MeasObjectGERAN.c \ - MeasObjectId.c \ - MeasObjectToAddModList.c \ - MeasObjectToAddMod.c \ - MeasObjectUTRA.c \ - CellsToAddModListUTRA-FDD.c \ - CellsToAddModUTRA-FDD.c \ - CellsToAddModListUTRA-TDD.c \ - CellsToAddModUTRA-TDD.c \ - MeasResults.c \ - MeasResultListEUTRA.c \ - MeasResultEUTRA.c \ - MeasResultListUTRA.c \ - MeasResultUTRA.c \ - MeasResultListGERAN.c \ - MeasResultGERAN.c \ - MeasResultsCDMA2000.c \ - MeasResultListCDMA2000.c \ - MeasResultCDMA2000.c \ - PLMN-IdentityList2.c \ - QuantityConfig.c \ - QuantityConfigEUTRA.c \ - QuantityConfigUTRA.c \ - QuantityConfigGERAN.c \ - QuantityConfigCDMA2000.c \ - ReportConfigEUTRA.c \ - ThresholdEUTRA.c \ - ReportConfigId.c \ - ReportConfigInterRAT.c \ - ThresholdUTRA.c \ - ThresholdGERAN.c \ - ThresholdCDMA2000.c \ - ReportConfigToAddModList.c \ - ReportConfigToAddMod.c \ - ReportInterval.c \ - RSRP-Range.c \ - RSRQ-Range.c \ - TimeToTrigger.c \ - C-RNTI.c \ - DedicatedInfoCDMA2000.c \ - DedicatedInfoNAS.c \ - FilterCoefficient.c \ - MMEC.c \ - NeighCellConfig.c \ - RAND-CDMA2000.c \ - RAT-Type.c \ - RRC-TransactionIdentifier.c \ - S-TMSI.c \ - UE-CapabilityRAT-ContainerList.c \ - UE-CapabilityRAT-Container.c \ - UE-EUTRA-Capability.c \ - AccessStratumRelease.c \ - PDCP-Parameters.c \ - PhyLayerParameters.c \ - RF-Parameters.c \ - SupportedBandListEUTRA.c \ - SupportedBandEUTRA.c \ - MeasParameters.c \ - BandListEUTRA.c \ - BandInfoEUTRA.c \ - InterFreqBandList.c \ - InterFreqBandInfo.c \ - InterRAT-BandList.c \ - InterRAT-BandInfo.c \ - IRAT-ParametersUTRA-FDD.c \ - SupportedBandListUTRA-FDD.c \ - SupportedBandUTRA-FDD.c \ - IRAT-ParametersUTRA-TDD128.c \ - SupportedBandListUTRA-TDD128.c \ - SupportedBandUTRA-TDD128.c \ - IRAT-ParametersUTRA-TDD384.c \ - SupportedBandListUTRA-TDD384.c \ - SupportedBandUTRA-TDD384.c \ - IRAT-ParametersUTRA-TDD768.c \ - SupportedBandListUTRA-TDD768.c \ - SupportedBandUTRA-TDD768.c \ - IRAT-ParametersGERAN.c \ - SupportedBandListGERAN.c \ - SupportedBandGERAN.c \ - IRAT-ParametersCDMA2000-HRPD.c \ - SupportedBandListHRPD.c \ - IRAT-ParametersCDMA2000-1XRTT.c \ - SupportedBandList1XRTT.c \ - UE-TimersAndConstants.c - -ASN_MODULE_HEADERS= \ - BCCH-BCH-Message.h \ - BCCH-BCH-MessageType.h \ - BCCH-DL-SCH-Message.h \ - BCCH-DL-SCH-MessageType.h \ - PCCH-Message.h \ - PCCH-MessageType.h \ - DL-CCCH-Message.h \ - DL-CCCH-MessageType.h \ - DL-DCCH-Message.h \ - DL-DCCH-MessageType.h \ - UL-CCCH-Message.h \ - UL-CCCH-MessageType.h \ - UL-DCCH-Message.h \ - UL-DCCH-MessageType.h \ - CounterCheck.h \ - CounterCheck-r8-IEs.h \ - DRB-CountMSB-InfoList.h \ - DRB-CountMSB-Info.h \ - CounterCheckResponse.h \ - CounterCheckResponse-r8-IEs.h \ - DRB-CountInfoList.h \ - DRB-CountInfo.h \ - CSFBParametersRequestCDMA2000.h \ - CSFBParametersRequestCDMA2000-r8-IEs.h \ - CSFBParametersResponseCDMA2000.h \ - CSFBParametersResponseCDMA2000-r8-IEs.h \ - DLInformationTransfer.h \ - DLInformationTransfer-r8-IEs.h \ - HandoverFromEUTRAPreparationRequest.h \ - HandoverFromEUTRAPreparationRequest-r8-IEs.h \ - MasterInformationBlock.h \ - MeasurementReport.h \ - MeasurementReport-r8-IEs.h \ - MobilityFromEUTRACommand.h \ - MobilityFromEUTRACommand-r8-IEs.h \ - Handover.h \ - CellChangeOrder.h \ - SI-OrPSI-GERAN.h \ - SystemInfoListGERAN.h \ - Paging.h \ - PagingRecordList.h \ - PagingRecord.h \ - PagingUE-Identity.h \ - IMSI.h \ - IMSI-Digit.h \ - RRCConnectionReconfiguration.h \ - RRCConnectionReconfiguration-r8-IEs.h \ - SecurityConfigHO.h \ - RRCConnectionReconfigurationComplete.h \ - RRCConnectionReconfigurationComplete-r8-IEs.h \ - RRCConnectionReestablishment.h \ - RRCConnectionReestablishment-r8-IEs.h \ - RRCConnectionReestablishmentComplete.h \ - RRCConnectionReestablishmentComplete-r8-IEs.h \ - RRCConnectionReestablishmentReject.h \ - RRCConnectionReestablishmentReject-r8-IEs.h \ - RRCConnectionReestablishmentRequest.h \ - RRCConnectionReestablishmentRequest-r8-IEs.h \ - ReestabUE-Identity.h \ - ReestablishmentCause.h \ - RRCConnectionReject.h \ - RRCConnectionReject-r8-IEs.h \ - RRCConnectionRelease.h \ - RRCConnectionRelease-r8-IEs.h \ - ReleaseCause.h \ - RedirectedCarrierInfo.h \ - IdleModeMobilityControlInfo.h \ - FreqPriorityListEUTRA.h \ - FreqPriorityEUTRA.h \ - FreqsPriorityListGERAN.h \ - FreqsPriorityGERAN.h \ - FreqPriorityListUTRA-FDD.h \ - FreqPriorityUTRA-FDD.h \ - FreqPriorityListUTRA-TDD.h \ - FreqPriorityUTRA-TDD.h \ - BandClassPriorityListHRPD.h \ - BandClassPriorityHRPD.h \ - BandClassPriorityList1XRTT.h \ - BandClassPriority1XRTT.h \ - RRCConnectionRequest.h \ - RRCConnectionRequest-r8-IEs.h \ - InitialUE-Identity.h \ - EstablishmentCause.h \ - RRCConnectionSetup.h \ - RRCConnectionSetup-r8-IEs.h \ - RRCConnectionSetupComplete.h \ - RRCConnectionSetupComplete-r8-IEs.h \ - RegisteredMME.h \ - SecurityModeCommand.h \ - SecurityModeCommand-r8-IEs.h \ - SecurityConfigSMC.h \ - SecurityModeComplete.h \ - SecurityModeComplete-r8-IEs.h \ - SecurityModeFailure.h \ - SecurityModeFailure-r8-IEs.h \ - SystemInformation.h \ - SystemInformation-r8-IEs.h \ - SystemInformationBlockType1.h \ - PLMN-IdentityList.h \ - PLMN-IdentityInfo.h \ - SchedulingInfoList.h \ - SchedulingInfo.h \ - SIB-MappingInfo.h \ - SIB-Type.h \ - UECapabilityEnquiry.h \ - UECapabilityEnquiry-r8-IEs.h \ - UE-CapabilityRequest.h \ - UECapabilityInformation.h \ - UECapabilityInformation-r8-IEs.h \ - ULHandoverPreparationTransfer.h \ - ULHandoverPreparationTransfer-r8-IEs.h \ - ULInformationTransfer.h \ - ULInformationTransfer-r8-IEs.h \ - SystemInformationBlockType2.h \ - AC-BarringConfig.h \ - MBSFN-SubframeConfigList.h \ - MBSFN-SubframeConfig.h \ - SystemInformationBlockType3.h \ - SystemInformationBlockType4.h \ - IntraFreqNeighCellList.h \ - IntraFreqNeighCellInfo.h \ - IntraFreqBlackCellList.h \ - SystemInformationBlockType5.h \ - InterFreqCarrierFreqList.h \ - InterFreqCarrierFreqInfo.h \ - InterFreqNeighCellList.h \ - InterFreqNeighCellInfo.h \ - InterFreqBlackCellList.h \ - SystemInformationBlockType6.h \ - CarrierFreqListUTRA-FDD.h \ - CarrierFreqUTRA-FDD.h \ - CarrierFreqListUTRA-TDD.h \ - CarrierFreqUTRA-TDD.h \ - SystemInformationBlockType7.h \ - CarrierFreqsInfoListGERAN.h \ - CarrierFreqsInfoGERAN.h \ - SystemInformationBlockType8.h \ - CellReselectionParametersCDMA2000.h \ - NeighCellListCDMA2000.h \ - NeighCellCDMA2000.h \ - NeighCellsPerBandclassListCDMA2000.h \ - NeighCellsPerBandclassCDMA2000.h \ - PhysCellIdListCDMA2000.h \ - BandClassListCDMA2000.h \ - BandClassInfoCDMA2000.h \ - SystemInformationBlockType9.h \ - SystemInformationBlockType10.h \ - SystemInformationBlockType11.h \ - AntennaInfoCommon.h \ - AntennaInfoDedicated.h \ - CQI-ReportConfig.h \ - CQI-ReportPeriodic.h \ - DRB-Identity.h \ - LogicalChannelConfig.h \ - MAC-MainConfig.h \ - DRX-Config.h \ - PDCP-Config.h \ - PDSCH-ConfigCommon.h \ - PDSCH-ConfigDedicated.h \ - PHICH-Config.h \ - PhysicalConfigDedicated.h \ - P-Max.h \ - PRACH-ConfigSIB.h \ - PRACH-Config.h \ - PRACH-ConfigInfo.h \ - PresenceAntennaPort1.h \ - PUCCH-ConfigCommon.h \ - PUCCH-ConfigDedicated.h \ - PUSCH-ConfigCommon.h \ - PUSCH-ConfigDedicated.h \ - UL-ReferenceSignalsPUSCH.h \ - RACH-ConfigCommon.h \ - RACH-ConfigDedicated.h \ - RadioResourceConfigCommonSIB.h \ - RadioResourceConfigCommon.h \ - BCCH-Config.h \ - PCCH-Config.h \ - UL-CyclicPrefixLength.h \ - RadioResourceConfigDedicated.h \ - SRB-ToAddModList.h \ - SRB-ToAddMod.h \ - DRB-ToAddModList.h \ - DRB-ToAddMod.h \ - DRB-ToReleaseList.h \ - RLC-Config.h \ - UL-AM-RLC.h \ - DL-AM-RLC.h \ - UL-UM-RLC.h \ - DL-UM-RLC.h \ - SN-FieldLength.h \ - T-PollRetransmit.h \ - PollPDU.h \ - PollByte.h \ - T-Reordering.h \ - T-StatusProhibit.h \ - SchedulingRequestConfig.h \ - SoundingRS-UL-ConfigCommon.h \ - SoundingRS-UL-ConfigDedicated.h \ - SPS-Config.h \ - SPS-ConfigDL.h \ - SPS-ConfigUL.h \ - N1-PUCCH-AN-PersistentList.h \ - TDD-Config.h \ - TimeAlignmentTimer.h \ - TPC-PDCCH-Config.h \ - TPC-Index.h \ - UplinkPowerControlCommon.h \ - UplinkPowerControlDedicated.h \ - DeltaFList-PUCCH.h \ - NextHopChainingCount.h \ - SecurityAlgorithmConfig.h \ - ShortMAC-I.h \ - AdditionalSpectrumEmission.h \ - ARFCN-ValueCDMA2000.h \ - ARFCN-ValueEUTRA.h \ - ARFCN-ValueGERAN.h \ - ARFCN-ValueUTRA.h \ - BandclassCDMA2000.h \ - BandIndicatorGERAN.h \ - CarrierFreqCDMA2000.h \ - CarrierFreqGERAN.h \ - CarrierFreqsGERAN.h \ - ExplicitListOfARFCNs.h \ - CDMA2000-Type.h \ - CellIdentity.h \ - CellIndexList.h \ - CellIndex.h \ - CellReselectionPriority.h \ - CSFB-RegistrationParam1XRTT.h \ - CellGlobalIdEUTRA.h \ - CellGlobalIdUTRA.h \ - CellGlobalIdGERAN.h \ - CellGlobalIdCDMA2000.h \ - MobilityControlInfo.h \ - CarrierBandwidthEUTRA.h \ - CarrierFreqEUTRA.h \ - MobilityParametersCDMA2000.h \ - MobilityStateParameters.h \ - PhysCellId.h \ - PhysCellIdRange.h \ - PhysCellIdCDMA2000.h \ - PhysCellIdGERAN.h \ - PhysCellIdUTRA-FDD.h \ - PhysCellIdUTRA-TDD.h \ - PLMN-Identity.h \ - MCC.h \ - MNC.h \ - MCC-MNC-Digit.h \ - PreRegistrationInfoHRPD.h \ - SecondaryPreRegistrationZoneIdListHRPD.h \ - PreRegistrationZoneIdHRPD.h \ - Q-RxLevMin.h \ - Q-OffsetRange.h \ - Q-OffsetRangeInterRAT.h \ - ReselectionThreshold.h \ - SpeedStateScaleFactors.h \ - SystemTimeInfoCDMA2000.h \ - TrackingAreaCode.h \ - T-Reselection.h \ - AllowedMeasBandwidth.h \ - Hysteresis.h \ - MeasConfig.h \ - MeasIdToRemoveList.h \ - MeasObjectToRemoveList.h \ - ReportConfigToRemoveList.h \ - MeasGapConfig.h \ - MeasId.h \ - MeasIdToAddModList.h \ - MeasIdToAddMod.h \ - MeasObjectCDMA2000.h \ - CellsToAddModListCDMA2000.h \ - CellsToAddModCDMA2000.h \ - MeasObjectEUTRA.h \ - CellsToAddModList.h \ - CellsToAddMod.h \ - BlackCellsToAddModList.h \ - BlackCellsToAddMod.h \ - MeasObjectGERAN.h \ - MeasObjectId.h \ - MeasObjectToAddModList.h \ - MeasObjectToAddMod.h \ - MeasObjectUTRA.h \ - CellsToAddModListUTRA-FDD.h \ - CellsToAddModUTRA-FDD.h \ - CellsToAddModListUTRA-TDD.h \ - CellsToAddModUTRA-TDD.h \ - MeasResults.h \ - MeasResultListEUTRA.h \ - MeasResultEUTRA.h \ - MeasResultListUTRA.h \ - MeasResultUTRA.h \ - MeasResultListGERAN.h \ - MeasResultGERAN.h \ - MeasResultsCDMA2000.h \ - MeasResultListCDMA2000.h \ - MeasResultCDMA2000.h \ - PLMN-IdentityList2.h \ - QuantityConfig.h \ - QuantityConfigEUTRA.h \ - QuantityConfigUTRA.h \ - QuantityConfigGERAN.h \ - QuantityConfigCDMA2000.h \ - ReportConfigEUTRA.h \ - ThresholdEUTRA.h \ - ReportConfigId.h \ - ReportConfigInterRAT.h \ - ThresholdUTRA.h \ - ThresholdGERAN.h \ - ThresholdCDMA2000.h \ - ReportConfigToAddModList.h \ - ReportConfigToAddMod.h \ - ReportInterval.h \ - RSRP-Range.h \ - RSRQ-Range.h \ - TimeToTrigger.h \ - C-RNTI.h \ - DedicatedInfoCDMA2000.h \ - DedicatedInfoNAS.h \ - FilterCoefficient.h \ - MMEC.h \ - NeighCellConfig.h \ - RAND-CDMA2000.h \ - RAT-Type.h \ - RRC-TransactionIdentifier.h \ - S-TMSI.h \ - UE-CapabilityRAT-ContainerList.h \ - UE-CapabilityRAT-Container.h \ - UE-EUTRA-Capability.h \ - AccessStratumRelease.h \ - PDCP-Parameters.h \ - PhyLayerParameters.h \ - RF-Parameters.h \ - SupportedBandListEUTRA.h \ - SupportedBandEUTRA.h \ - MeasParameters.h \ - BandListEUTRA.h \ - BandInfoEUTRA.h \ - InterFreqBandList.h \ - InterFreqBandInfo.h \ - InterRAT-BandList.h \ - InterRAT-BandInfo.h \ - IRAT-ParametersUTRA-FDD.h \ - SupportedBandListUTRA-FDD.h \ - SupportedBandUTRA-FDD.h \ - IRAT-ParametersUTRA-TDD128.h \ - SupportedBandListUTRA-TDD128.h \ - SupportedBandUTRA-TDD128.h \ - IRAT-ParametersUTRA-TDD384.h \ - SupportedBandListUTRA-TDD384.h \ - SupportedBandUTRA-TDD384.h \ - IRAT-ParametersUTRA-TDD768.h \ - SupportedBandListUTRA-TDD768.h \ - SupportedBandUTRA-TDD768.h \ - IRAT-ParametersGERAN.h \ - SupportedBandListGERAN.h \ - SupportedBandGERAN.h \ - IRAT-ParametersCDMA2000-HRPD.h \ - SupportedBandListHRPD.h \ - IRAT-ParametersCDMA2000-1XRTT.h \ - SupportedBandList1XRTT.h \ - UE-TimersAndConstants.h - -ASN_MODULE_HEADERS+=BOOLEAN.h -ASN_MODULE_SOURCES+=BOOLEAN.c -ASN_MODULE_HEADERS+=INTEGER.h -ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=NULL.h -ASN_MODULE_SOURCES+=NULL.c -ASN_MODULE_SOURCES+=NativeEnumerated.c -ASN_MODULE_HEADERS+=NativeInteger.h -ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=asn_SET_OF.h -ASN_MODULE_SOURCES+=asn_SET_OF.c -ASN_MODULE_HEADERS+=constr_CHOICE.h -ASN_MODULE_SOURCES+=constr_CHOICE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE.h -ASN_MODULE_SOURCES+=constr_SEQUENCE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=constr_SET_OF.h -ASN_MODULE_SOURCES+=constr_SET_OF.c -ASN_MODULE_HEADERS+=asn_application.h -ASN_MODULE_HEADERS+=asn_system.h -ASN_MODULE_HEADERS+=asn_codecs.h -ASN_MODULE_HEADERS+=asn_internal.h -ASN_MODULE_HEADERS+=OCTET_STRING.h -ASN_MODULE_SOURCES+=OCTET_STRING.c -ASN_MODULE_HEADERS+=BIT_STRING.h -ASN_MODULE_SOURCES+=BIT_STRING.c -ASN_MODULE_SOURCES+=asn_codecs_prim.c -ASN_MODULE_HEADERS+=asn_codecs_prim.h -ASN_MODULE_HEADERS+=ber_tlv_length.h -ASN_MODULE_SOURCES+=ber_tlv_length.c -ASN_MODULE_HEADERS+=ber_tlv_tag.h -ASN_MODULE_SOURCES+=ber_tlv_tag.c -ASN_MODULE_HEADERS+=ber_decoder.h -ASN_MODULE_SOURCES+=ber_decoder.c -ASN_MODULE_HEADERS+=der_encoder.h -ASN_MODULE_SOURCES+=der_encoder.c -ASN_MODULE_HEADERS+=constr_TYPE.h -ASN_MODULE_SOURCES+=constr_TYPE.c -ASN_MODULE_HEADERS+=constraints.h -ASN_MODULE_SOURCES+=constraints.c -ASN_MODULE_HEADERS+=xer_support.h -ASN_MODULE_SOURCES+=xer_support.c -ASN_MODULE_HEADERS+=xer_decoder.h -ASN_MODULE_SOURCES+=xer_decoder.c -ASN_MODULE_HEADERS+=xer_encoder.h -ASN_MODULE_SOURCES+=xer_encoder.c -ASN_MODULE_HEADERS+=per_support.h -ASN_MODULE_SOURCES+=per_support.c -ASN_MODULE_HEADERS+=per_decoder.h -ASN_MODULE_SOURCES+=per_decoder.c -ASN_MODULE_HEADERS+=per_encoder.h -ASN_MODULE_SOURCES+=per_encoder.c -ASN_MODULE_HEADERS+=per_opentype.h -ASN_MODULE_SOURCES+=per_opentype.c -ASN_CONVERTER_SOURCES+=converter-sample.c - - -lib_LTLIBRARIES=libsomething.la -libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) - -# This file may be used as an input for make(3) -# Remove the lines below to convert it into a pure .am file -TARGET = progname -CFLAGS += -I. -OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} - -all: $(TARGET) - -$(TARGET): ${OBJS} - $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) - -.SUFFIXES: -.SUFFIXES: .c .o - -.c.o: - $(CC) $(CFLAGS) -o $@ -c $< - -clean: - rm -f $(TARGET) - rm -f $(OBJS) - -regen: regenerate-from-asn1-source - -regenerate-from-asn1-source: - asn1c -gen-PER -fcompound-names -fnative-types -fskeletons-copy ./ASN1_files/EUTRA-RRC-Definitions.asn - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sql/Makefile.am b/openair2/RRM_4_RRC_LITE/src/foreign/sql/Makefile.am deleted file mode 100755 index 9e132b3115..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sql/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -noinst_LIBRARIES = libsqlite.a - -libsqlite_a_SOURCES = sqlite3.c sqlite3.h diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sql/sqlite3.c b/openair2/RRM_4_RRC_LITE/src/foreign/sql/sqlite3.c deleted file mode 100755 index 5073c1683c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sql/sqlite3.c +++ /dev/null @@ -1,134854 +0,0 @@ -/****************************************************************************** -** This file is an amalgamation of many separate C source files from SQLite -** version 3.7.5. By combining all the individual C code files into this -** single large file, the entire code can be compiled as a one translation -** unit. This allows many compilers to do optimizations that would not be -** possible if the files were compiled separately. Performance improvements -** of 5% or more are commonly seen when SQLite is compiled as a single -** translation unit. -** -** This file is all you need to compile SQLite. To use SQLite in other -** programs, you need this file and the "sqlite3.h" header file that defines -** the programming interface to the SQLite library. (If you do not have -** the "sqlite3.h" header file at hand, you will find a copy embedded within -** the text of this file. Search for "Begin file sqlite3.h" to find the start -** of the embedded sqlite3.h header file.) Additional code files may be needed -** if you want a wrapper to interface SQLite with your choice of programming -** language. The code for the "sqlite3" command-line shell is also in a -** separate file. This file contains only code for the core SQLite library. -*/ -#define SQLITE_CORE 1 -#define SQLITE_AMALGAMATION 1 -#ifndef SQLITE_PRIVATE -# define SQLITE_PRIVATE static -#endif -#ifndef SQLITE_API -# define SQLITE_API -#endif -/************** Begin file sqliteInt.h ***************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Internal interface definitions for SQLite. -** -*/ -#ifndef _SQLITEINT_H_ -#define _SQLITEINT_H_ - -/* -** These #defines should enable >2GB file support on POSIX if the -** underlying operating system supports it. If the OS lacks -** large file support, or if the OS is windows, these should be no-ops. -** -** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any -** system #includes. Hence, this block of code must be the very first -** code in all source files. -** -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch -** on the compiler command line. This is necessary if you are compiling -** on a recent machine (ex: Red Hat 7.2) but you want your code to work -** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 -** without this option, LFS is enable. But LFS does not exist in the kernel -** in Red Hat 6.0, so the code won't work. Hence, for maximum binary -** portability you should omit LFS. -** -** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif - -/* -** Include the configuration header output by 'configure' if we're using the -** autoconf-based build -*/ -#ifdef _HAVE_SQLITE_CONFIG_H -#include "config.h" -#endif - -/************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ -/************** Begin file sqliteLimit.h *************************************/ -/* -** 2007 May 7 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file defines various limits of what SQLite can process. -*/ - -/* -** The maximum length of a TEXT or BLOB in bytes. This also -** limits the size of a row in a table or index. -** -** The hard limit is the ability of a 32-bit signed integer -** to count the size: 2^31-1 or 2147483647. -*/ -#ifndef SQLITE_MAX_LENGTH -# define SQLITE_MAX_LENGTH 1000000000 -#endif - -/* -** This is the maximum number of -** -** * Columns in a table -** * Columns in an index -** * Columns in a view -** * Terms in the SET clause of an UPDATE statement -** * Terms in the result set of a SELECT statement -** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement. -** * Terms in the VALUES clause of an INSERT statement -** -** The hard upper limit here is 32676. Most database people will -** tell you that in a well-normalized database, you usually should -** not have more than a dozen or so columns in any table. And if -** that is the case, there is no point in having more than a few -** dozen values in any of the other situations described above. -*/ -#ifndef SQLITE_MAX_COLUMN -# define SQLITE_MAX_COLUMN 2000 -#endif - -/* -** The maximum length of a single SQL statement in bytes. -** -** It used to be the case that setting this value to zero would -** turn the limit off. That is no longer true. It is not possible -** to turn this limit off. -*/ -#ifndef SQLITE_MAX_SQL_LENGTH -# define SQLITE_MAX_SQL_LENGTH 1000000000 -#endif - -/* -** The maximum depth of an expression tree. This is limited to -** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might -** want to place more severe limits on the complexity of an -** expression. -** -** A value of 0 used to mean that the limit was not enforced. -** But that is no longer true. The limit is now strictly enforced -** at all times. -*/ -#ifndef SQLITE_MAX_EXPR_DEPTH -# define SQLITE_MAX_EXPR_DEPTH 1000 -#endif - -/* -** The maximum number of terms in a compound SELECT statement. -** The code generator for compound SELECT statements does one -** level of recursion for each term. A stack overflow can result -** if the number of terms is too large. In practice, most SQL -** never has more than 3 or 4 terms. Use a value of 0 to disable -** any limit on the number of terms in a compount SELECT. -*/ -#ifndef SQLITE_MAX_COMPOUND_SELECT -# define SQLITE_MAX_COMPOUND_SELECT 500 -#endif - -/* -** The maximum number of opcodes in a VDBE program. -** Not currently enforced. -*/ -#ifndef SQLITE_MAX_VDBE_OP -# define SQLITE_MAX_VDBE_OP 25000 -#endif - -/* -** The maximum number of arguments to an SQL function. -*/ -#ifndef SQLITE_MAX_FUNCTION_ARG -# define SQLITE_MAX_FUNCTION_ARG 127 -#endif - -/* -** The maximum number of in-memory pages to use for the main database -** table and for temporary tables. The SQLITE_DEFAULT_CACHE_SIZE -*/ -#ifndef SQLITE_DEFAULT_CACHE_SIZE -# define SQLITE_DEFAULT_CACHE_SIZE 2000 -#endif -#ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE -# define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500 -#endif - -/* -** The default number of frames to accumulate in the log file before -** checkpointing the database in WAL mode. -*/ -#ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT -# define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 -#endif - -/* -** The maximum number of attached databases. This must be between 0 -** and 30. The upper bound on 30 is because a 32-bit integer bitmap -** is used internally to track attached databases. -*/ -#ifndef SQLITE_MAX_ATTACHED -# define SQLITE_MAX_ATTACHED 10 -#endif - - -/* -** The maximum value of a ?nnn wildcard that the parser will accept. -*/ -#ifndef SQLITE_MAX_VARIABLE_NUMBER -# define SQLITE_MAX_VARIABLE_NUMBER 999 -#endif - -/* Maximum page size. The upper bound on this value is 65536. This a limit -** imposed by the use of 16-bit offsets within each page. -** -** Earlier versions of SQLite allowed the user to change this value at -** compile time. This is no longer permitted, on the grounds that it creates -** a library that is technically incompatible with an SQLite library -** compiled with a different limit. If a process operating on a database -** with a page-size of 65536 bytes crashes, then an instance of SQLite -** compiled with the default page-size limit will not be able to rollback -** the aborted transaction. This could lead to database corruption. -*/ -#ifdef SQLITE_MAX_PAGE_SIZE -# undef SQLITE_MAX_PAGE_SIZE -#endif -#define SQLITE_MAX_PAGE_SIZE 65536 - - -/* -** The default size of a database page. -*/ -#ifndef SQLITE_DEFAULT_PAGE_SIZE -# define SQLITE_DEFAULT_PAGE_SIZE 1024 -#endif -#if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE -# undef SQLITE_DEFAULT_PAGE_SIZE -# define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE -#endif - -/* -** Ordinarily, if no value is explicitly provided, SQLite creates databases -** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain -** device characteristics (sector-size and atomic write() support), -** SQLite may choose a larger value. This constant is the maximum value -** SQLite will choose on its own. -*/ -#ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE -# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 -#endif -#if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE -# undef SQLITE_MAX_DEFAULT_PAGE_SIZE -# define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE -#endif - - -/* -** Maximum number of pages in one database file. -** -** This is really just the default value for the max_page_count pragma. -** This value can be lowered (or raised) at run-time using that the -** max_page_count macro. -*/ -#ifndef SQLITE_MAX_PAGE_COUNT -# define SQLITE_MAX_PAGE_COUNT 1073741823 -#endif - -/* -** Maximum length (in bytes) of the pattern in a LIKE or GLOB -** operator. -*/ -#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH -# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 -#endif - -/* -** Maximum depth of recursion for triggers. -** -** A value of 1 means that a trigger program will not be able to itself -** fire any triggers. A value of 0 means that no trigger programs at all -** may be executed. -*/ -#ifndef SQLITE_MAX_TRIGGER_DEPTH -# define SQLITE_MAX_TRIGGER_DEPTH 1000 -#endif - -/************** End of sqliteLimit.h *****************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - -/* Disable nuisance warnings on Borland compilers */ -#if defined(__BORLANDC__) -#pragma warn -rch /* unreachable code */ -#pragma warn -ccc /* Condition is always true or false */ -#pragma warn -aus /* Assigned value is never used */ -#pragma warn -csu /* Comparing signed and unsigned */ -#pragma warn -spa /* Suspicious pointer arithmetic */ -#endif - -/* Needed for various definitions... */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif - -/* -** Include standard header files as necessary -*/ -#ifdef HAVE_STDINT_H -#include -#endif -#ifdef HAVE_INTTYPES_H -#include -#endif - -/* -** The number of samples of an index that SQLite takes in order to -** construct a histogram of the table content when running ANALYZE -** and with SQLITE_ENABLE_STAT2 -*/ -#define SQLITE_INDEX_SAMPLES 10 - -/* -** The following macros are used to cast pointers to integers and -** integers to pointers. The way you do this varies from one compiler -** to the next, so we have developed the following set of #if statements -** to generate appropriate macros for a wide range of compilers. -** -** The correct "ANSI" way to do this is to use the intptr_t type. -** Unfortunately, that typedef is not available on all compilers, or -** if it is available, it requires an #include of specific headers -** that vary from one machine to the next. -** -** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on -** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). -** So we have to define the macros in different ways depending on the -** compiler. -*/ -#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ -# define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) -#elif !defined(__GNUC__) /* Works for compilers other than LLVM */ -# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) -# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) -#elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ -# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) -#else /* Generates a warning - but it always works */ -# define SQLITE_INT_TO_PTR(X) ((void*)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(X)) -#endif - -/* -** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. -** 0 means mutexes are permanently disable and the library is never -** threadsafe. 1 means the library is serialized which is the highest -** level of threadsafety. 2 means the libary is multithreaded - multiple -** threads can use SQLite as long as no two threads try to use the same -** database connection at the same time. -** -** Older versions of SQLite used an optional THREADSAFE macro. -** We support that for legacy. -*/ -#if !defined(SQLITE_THREADSAFE) -#if defined(THREADSAFE) -# define SQLITE_THREADSAFE THREADSAFE -#else -# define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */ -#endif -#endif - -/* -** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1. -** It determines whether or not the features related to -** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can -** be overridden at runtime using the sqlite3_config() API. -*/ -#if !defined(SQLITE_DEFAULT_MEMSTATUS) -# define SQLITE_DEFAULT_MEMSTATUS 1 -#endif - -/* -** Exactly one of the following macros must be defined in order to -** specify which memory allocation subsystem to use. -** -** SQLITE_SYSTEM_MALLOC // Use normal system malloc() -** SQLITE_MEMDEBUG // Debugging version of system malloc() -** -** (Historical note: There used to be several other options, but we've -** pared it down to just these two.) -** -** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as -** the default. -*/ -#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_MEMDEBUG)>1 -# error "At most one of the following compile-time configuration options\ -is allows: -SQLITE_SYSTEM_MALLOC, SQLITE_MEMDEBUG" -#endif -#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_MEMDEBUG)==0 -# define SQLITE_SYSTEM_MALLOC 1 -#endif - -/* -** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the -** sizes of memory allocations below this value where possible. -*/ -#if !defined(SQLITE_MALLOC_SOFT_LIMIT) -# define SQLITE_MALLOC_SOFT_LIMIT 1024 -#endif - -/* -** We need to define _XOPEN_SOURCE as follows in order to enable -** recursive mutexes on most Unix systems. But Mac OS X is different. -** The _XOPEN_SOURCE define causes problems for Mac OS X we are told, -** so it is omitted there. See ticket #2673. -** -** Later we learn that _XOPEN_SOURCE is poorly or incorrectly -** implemented on some systems. So we avoid defining it at all -** if it is already defined or if it is unneeded because we are -** not doing a threadsafe build. Ticket #2681. -** -** See also ticket #2741. -*/ -#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) && SQLITE_THREADSAFE -# define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */ -#endif - -/* -** The TCL headers are only needed when compiling the TCL bindings. -*/ -#if defined(SQLITE_TCL) || defined(TCLSH) -# include -#endif - -/* -** Many people are failing to set -DNDEBUG=1 when compiling SQLite. -** Setting NDEBUG makes the code smaller and run faster. So the following -** lines are added to automatically set NDEBUG unless the -DSQLITE_DEBUG=1 -** option is set. Thus NDEBUG becomes an opt-in rather than an opt-out -** feature. -*/ -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 -#endif - -/* -** The testcase() macro is used to aid in coverage testing. When -** doing coverage testing, the condition inside the argument to -** testcase() must be evaluated both true and false in order to -** get full branch coverage. The testcase() macro is inserted -** to help ensure adequate test coverage in places where simple -** condition/decision coverage is inadequate. For example, testcase() -** can be used to make sure boundary values are tested. For -** bitmask tests, testcase() can be used to make sure each bit -** is significant and used at least once. On switch statements -** where multiple cases go to the same block of code, testcase() -** can insure that all cases are evaluated. -** -*/ -#ifdef SQLITE_COVERAGE_TEST -SQLITE_PRIVATE void sqlite3Coverage(int); -# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); } -#else -# define testcase(X) -#endif - -/* -** The TESTONLY macro is used to enclose variable declarations or -** other bits of code that are needed to support the arguments -** within testcase() and assert() macros. -*/ -#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) -# define TESTONLY(X) X -#else -# define TESTONLY(X) -#endif - -/* -** Sometimes we need a small amount of code such as a variable initialization -** to setup for a later assert() statement. We do not want this code to -** appear when assert() is disabled. The following macro is therefore -** used to contain that setup code. The "VVA" acronym stands for -** "Verification, Validation, and Accreditation". In other words, the -** code within VVA_ONLY() will only run during verification processes. -*/ -#ifndef NDEBUG -# define VVA_ONLY(X) X -#else -# define VVA_ONLY(X) -#endif - -/* -** The ALWAYS and NEVER macros surround boolean expressions which -** are intended to always be true or false, respectively. Such -** expressions could be omitted from the code completely. But they -** are included in a few cases in order to enhance the resilience -** of SQLite to unexpected behavior - to make the code "self-healing" -** or "ductile" rather than being "brittle" and crashing at the first -** hint of unplanned behavior. -** -** In other words, ALWAYS and NEVER are added for defensive code. -** -** When doing coverage testing ALWAYS and NEVER are hard-coded to -** be true and false so that the unreachable code then specify will -** not be counted as untested code. -*/ -#if defined(SQLITE_COVERAGE_TEST) -# define ALWAYS(X) (1) -# define NEVER(X) (0) -#elif !defined(NDEBUG) -# define ALWAYS(X) ((X)?1:(assert(0),0)) -# define NEVER(X) ((X)?(assert(0),1):0) -#else -# define ALWAYS(X) (X) -# define NEVER(X) (X) -#endif - -/* -** Return true (non-zero) if the input is a integer that is too large -** to fit in 32-bits. This macro is used inside of various testcase() -** macros to verify that we have tested SQLite for large-file support. -*/ -#define IS_BIG_INT(X) (((X)&~(i64)0xffffffff)!=0) - -/* -** The macro unlikely() is a hint that surrounds a boolean -** expression that is usually false. Macro likely() surrounds -** a boolean expression that is usually true. GCC is able to -** use these hints to generate better code, sometimes. -*/ -#if defined(__GNUC__) && 0 -# define likely(X) __builtin_expect((X),1) -# define unlikely(X) __builtin_expect((X),0) -#else -# define likely(X) !!(X) -# define unlikely(X) !!(X) -#endif - -/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ -/************** Begin file sqlite3.h *****************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the SQLite library -** presents to client programs. If a C-function, structure, datatype, -** or constant definition does not appear in this file, then it is -** not a published API of SQLite, is subject to change without -** notice, and should not be referenced by programs that use SQLite. -** -** Some of the definitions that are in this file are marked as -** "experimental". Experimental interfaces are normally new -** features recently added to SQLite. We do not anticipate changes -** to experimental interfaces but reserve the right to make minor changes -** if experience from use "in the wild" suggest such changes are prudent. -** -** The official C-language API documentation for SQLite is derived -** from comments in this file. This file is the authoritative source -** on how SQLite interfaces are suppose to operate. -** -** The name of this file under configuration management is "sqlite.h.in". -** The makefile makes some minor changes to this file (such as inserting -** the version number) and changes its name to "sqlite3.h" as -** part of the build process. -*/ -#ifndef _SQLITE3_H_ -#define _SQLITE3_H_ -#include /* Needed for the definition of va_list */ - -/* -** Make sure we can call this stuff from C++. -*/ -#if 0 -extern "C" { -#endif - - -/* -** Add the ability to override 'extern' -*/ -#ifndef SQLITE_EXTERN -# define SQLITE_EXTERN extern -#endif - -#ifndef SQLITE_API -# define SQLITE_API -#endif - - -/* -** These no-op macros are used in front of interfaces to mark those -** interfaces as either deprecated or experimental. New applications -** should not use deprecated interfaces - they are support for backwards -** compatibility only. Application writers should be aware that -** experimental interfaces are subject to change in point releases. -** -** These macros used to resolve to various kinds of compiler magic that -** would generate warning messages when they were used. But that -** compiler magic ended up generating such a flurry of bug reports -** that we have taken it all out and gone back to using simple -** noop macros. -*/ -#define SQLITE_DEPRECATED -#define SQLITE_EXPERIMENTAL - -/* -** Ensure these symbols were not defined by some previous header file. -*/ -#ifdef SQLITE_VERSION -# undef SQLITE_VERSION -#endif -#ifdef SQLITE_VERSION_NUMBER -# undef SQLITE_VERSION_NUMBER -#endif - -/* -** CAPI3REF: Compile-Time Library Version Numbers -** -** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header -** evaluates to a string literal that is the SQLite version in the -** format "X.Y.Z" where X is the major version number (always 3 for -** SQLite3) and Y is the minor version number and Z is the release number.)^ -** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer -** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same -** numbers used in [SQLITE_VERSION].)^ -** The SQLITE_VERSION_NUMBER for any given release of SQLite will also -** be larger than the release from which it is derived. Either Y will -** be held constant and Z will be incremented or else Y will be incremented -** and Z will be reset to zero. -** -** Since version 3.6.18, SQLite source code has been stored in the -** Fossil configuration management -** system. ^The SQLITE_SOURCE_ID macro evaluates to -** a string which identifies a particular check-in of SQLite -** within its configuration management system. ^The SQLITE_SOURCE_ID -** string contains the date and time of the check-in (UTC) and an SHA1 -** hash of the entire source tree. -** -** See also: -[sqlite3_libversion()], -** [sqlite3_libversion_number()], [sqlite3_sourceid()], -** [sqlite_version()] and [sqlite_source_id()]. -*/ -#define SQLITE_VERSION "3.7.5" -#define SQLITE_VERSION_NUMBER 3007005 -#define SQLITE_SOURCE_ID "2011-01-28 17:03:50 ed759d5a9edb3bba5f48f243df47be29e3fe8cd7" - -/* -** CAPI3REF: Run-Time Library Version Numbers -** KEYWORDS: sqlite3_version, sqlite3_sourceid -** -** These interfaces provide the same information as the [SQLITE_VERSION], -** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros -** but are associated with the library instead of the header file. ^(Cautious -** programmers might include assert() statements in their application to -** verify that values returned by these interfaces match the macros in -** the header, and thus insure that the application is -** compiled with matching library and header files. -** -**

m4lna$D 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%0A(N4(W~ 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%0Df-!&lu!T0b{TC?YGvIKoDV;NAFz% zLCdlPfFCX&G{x7wOT2sX_?KsqJX~y?V08!x00T*(W%_+y*;j{Sk0kg5TUaRyqCFEq zADCA|AnZ$dGv2#Nf^TVdqQ*`BQIrHB+Vtqq+J|7@Q$Cfn^AUu;-a-_&k&$&?V2k1| z+)h#VPc#eD#z&RM)#8s)qph)f;1B1F6iH@+((A$r*N^N`nEQa9T)Tz)#(;1F>WfF| znRtQEN<2k~1mD0dJ|l6FoIvo^GV*W?5bWFj$P!_(Wc4;z*&tHPHo)>7=#+JO;yR6t zC6nemxr>8o?Zpc;!D>}^haY;tM)L^V`QOS02qG^N8oNR(ZGa9-8(-V?*FAUrys)p# z`Y(9y3i>`l^T+QgLC{h&0efJ~qh&+KPzOJ+>nmIQmqZB=L?R{>CkXsuLYE4GA95eG z+1DrN(0fYogK<9aiTjzZ&d&?`+G^kw>_?7KVXvzbyKf2g=3IyE6ENo~;&L~b^TZJ? ze<8mEmY}Mg4$Npi^WL&4#^W4S+#5l7gV_s7(!J43IZeFUYL7z9U%e(cdo7T(HessG z=8?(GGJPgYoxa=lWL-kpV9t{UKZ=xm1K;I%l#t8tQVGK!+uHDR{IH%;@MewOJyR0d zvE_7QtUM#rXL#bPsGNc5>|_5U*7wRwuRtEC7!oUa)P`y)Sos>@CAbq zA_;XDbx%s(Q6 zgGqwJV#MIVQRpW*!@v~!ff#a|3gZOH`a`C z^Io)@h-RjMB}hht)K~$H^Mp4100SWo+Uz^dlZS_m8(a?kIp=w(ui{9L(U0al+ag)} z_MIo?v!1Loe#Oj_8c|ou^2`alGjdsdF)?_8ct(@u-70q3P#hI)-pioDo3P# z(v{9l*{H$p4#{?VDgH4YhJ(gC;5@-E&A!SBxIT|K1J8Nn;DL7jA84O( z`o((!_hhUeoVoOf7v`b>?0_}bV2wdE(^g}8dJVU9-RV?yQnk@+WuE9x<*6Cx$Q|!o zeiUQ+#HMx3>+tty=6ZttUR);Y63g|%H@p*F%Q@iXvPEJ459wJ97jI08Z0U%aTpt$y+ z#f$>LoQ-cAfNKw+^CdI?h9(gSvwzy@*y*^~IOe@(L5=wM)BBSK{gL>IXD)+h4f=2zBx*)`kI)&@MwV&T(TBXfdJyFrDSw#yN00juVp{ zf{Fg8-~k}W7*c3X6x2bH#AjB923R^>fBDqnPRAkpn;m$;l z$JB(?=PPd4ZIutbOOH2M*?tv)TVOwT&f(GfvhE&yGZZ;)6#2Okioi;#ETICW2VNZ| z$*jAQ5AVN{mN4Y-=|M(PINdB!Il`bQpnJANQB_C4t!I*8P0wqV+e%k6?8WLKX*&hlEx( z0TY$JZGc}HKkhH>DUev=W$YOsA;5NTGe-qv)6b3B^3FiVFLiJzCk@o3v?Jq zx>tJr!3oi6dyFayKt~#WqVN%{FUJn{U0m>uB0Ix4I&P)pU-W6CSLI5$$c{g|7|~YN zM{YzTbreZ0&7F|Az}Jp45u!JE1#2sV-*%pHVS3Bk#T;8kH6dF=+6BT~+_`XL;{4lF z?Dtd~DtxF(1sswim4$or*7TZ$oSJk3b^L}dg)j}ePcT3VG4?^8$FULAj8ZTI>L0Sv zp(c*Kn(Pm4B!~vLZ=>o_@`qwZ8;)jbHCTz_dq&C%In_Tp^hUStESxLu9dv_*`}KWz zp#w62Y2_uoSChV_(p5-(!fXcXmN-_x$CC5}8}%W_IOjp{ey1r#0MaW z2NS8f9pI^W^QpPZkA<#Eq*_JB-|`3m8!2_r{W1e8glp!wq*4&nq*5?J?At~#GSIl>FdieMetPNSGo9>lc4X8^p|i zNgJ>eFIZcb(L+P=M3wPUxn$5#IUU0=IF&;jxQxUq@z7U7%X z2ZLWCia*2+0FVs?wPt@9HhP2!H@V^9J{}J2z_qPl(z%YAiAc^SCiRzRx2EXjOQ!WD zBo^iq#PPCk*x6E6vagYy6QR!Aynq~IbQb%Xx-foRe5}2NU<_(W64C3_Om#oW`7~cQ zLgN`3T1+wcnVK9Dg+e(&{Ck?(gZ#894AF_LWQ4gq2yz`6BAJzb?siU8FL?Dni47*B-koQPtLnca{T))macBZJx7m-6IJuU5tE z%B1ZG{HU_B2BfPFqT~UEA`dmNbg#Spn-)HBEV=mDxWR!RCmR>kZCd*r)~`G!_(k=P zJZ5hAenC5M-XoZd$CgV6ltAHFHiGG^sqhCVv8u}IYz_4t+VHIrg~hYj9Sw7MXwOOr zkW)|`XEPZ^+t5j+LA>aOBeliNT;atzoMrb)F^X8Ed}dPQKHTPfg-AD3p_!g!QQLWa zW;4c6I&(BI#rEMGwwn!?x3X5?IWjVlCf~OYK(n>)&@O7Q&oQ`Z#YE}ZGSR*j&To?9 z6fkUm)la{P?D3@Q`Q7wc*(?agJTAx-1U1MMOvn4SF@I%tc9>-P@5|1>(ZXN%*Uvm& z0YOb91w$3TZJYxq?HJm{{<6M0X}@pn3nE(-itYiZ(V}}*`~#luvps(GtParr!oD)W zzoB^%A~6&iV?bLq*_%7~O=BGH5C*Y&Yjc<`WG8g8u;AzVdrZOtk2f^GG-O@j&rw590Q?euYhtZp|mKfFhC zcdoSd!^yHCZFRLUv(#aOD)g;XcU>x^nC2c&@>&Pek=%Zyc~jCqb=t4LV6mgcn0t9n zZi$|2aA}iliEy`;UmVi?bKGD8YR)K_C3(=QU)RF8exU$$7&ZE@6`&wuMWIQPq2`K$ zf8d|7(P6OYzgK{Qhz^CqJ3>tk1^ZA z9{Bl0KY;k8&B>)HO%4f$h{suCxmdw?Da*TnEW2TW+hS6POBVRgR8E+3MPHOvjSAtF z?EqR9e(af|@A2MZahKJavl6Wu)0i!~-OR^uqf_!FmW^4I3rjWIn}w|B0xP>8MDNHd zmR>pC*2qlhoxd}s->`rfAW5wc!OuaYfI?#)Xr+ujMDBsh>uWd11CGJJB*lNo?A&Zz zAON&2G=~tNM|f8L9hpgMuT4hdO9xFnlRCIFhByw~FatYb&`Et7^(6^Xd;ztttNw$h0>m%e>VqAhV06%rqJ(2^b)f0~Ufb{OwI~OnA*8*AbbUkd zSwqd?1jBIukIVdC%K>w3wr_8OZIk_&-|$b@FEp?wDeM#%mXdwqzJ`SL(Aa?JDq=IuMc)S{{4F$nDNzKQxY0L+G|J+0?_O=)K}x-B>V5V z8V{i;|NgzM5B##%XLkwpAno-r??$LGlVAt`k9^nv^xa7R?#o__Iuk;G`GX*0B%%1O zp{7WJ9qB)^*Z=h0Xj=c(UaJurL-?-2hwFcpQt%@SFv1Vq;eCXMtxyvp!My2jZ}tJD zl!u#*53B`nvjKrn*PQm(^_5PyH!TsWGVUKUbyWoI?Tx<7)IE=g2A-)4!rhyxDKu8Y&w=duf7i=_A?z$i>DBPC$Ro28ZsBC<4jHGFnXK99=sBO_zAv?|**p&EsOJM*MT+(+KV$*zPO z#_SR^3@)1Y^`wOBehCpcPg@%sS184_PFQ<0cGNvXpgM;YUh)W*?^)FKp5AhP_1HN6 zC+X|$I3i}Ui29?WqsiOP$*GJn?D9E~dSS-B<=;`wl!n%eFnb5*79ch@ZC8sbF2?io zy}bhBD66RGgwG{^Z$;kvDeE$99)bKj7?W_C#u`LpxK9HdA{3V~Hi|%QE@_@0s zcKBK<3~I^n$P4uOg&at4d8=G``(nMxU~HOTnUo7*5c$Jj+^sM4BI$tJsUU^H6?`=` zva`5D-uUbt)}`cvg4{>s9rXjx>e2Ph4G`fNgIYTI%lTfyd2`cOWB91vD6!cQAxsXy z@0fZqe6!gH<_a|(%tCHWb+0|AQ+~d^U7B-o{>H$m=kpvkr7WgKrwlEuFbc2O`S0r7 z%?yBV{501)K)jPU%Rs87M%rHOofQyv{rx<>Y~mbImnF+=(plwHuei$V!@Ci2K8Y}v zp^0QHiJ>szf-vKzmTe3CmD!KUr?BW=*?iPGF?h$R#0lnADZR)bK}K>ZrHjJ3WHjXA z@nQ7E)veOeY8(Mv+^4nAdQkKcfJON}y9^r%M8+Eoo}^WN0i+_=K8Cr=!qgAltyXZe zSq2t7DzMva*t)q6%xp5N9>92UmwY!Dm!QNE-lfnMW-9hA(a=;a@?)py(BBx1Jv|w<@?h01w40>(Yu7?oZ^2$ZWAFftu?5ny$jF7x_ZKER8 zGPK@CPj~AMDU;vBvt@uu%uuoaN9QuVz-VI@W#>`d|Y2`gdL@ z-wPMHv>2Eez$+I!7Ju3vt#kzdcW!>Lnh6zt@`UMz4eq82qQh0Kv-gDqH%a{lV`i&o zu!{gCT*~3<@%wljna`fI6 zG{rQ9@f){!c{d30Db)(rC;~_0ZWwPI47$v2GLP^?H4Z7E_sE<VIT!#MIB)F1=!h8 zo75qm_0ks7$HbO9r`K7%2S`s_$?aTUjCuJ%?{wTC>c)K`Q%o4YdjW5&-Hg3jrY|Ep zY^lAJwUKP|db%4QSy1HnypL#CJ+BmJ=fv(uZ(k8>Dx*&U8d^qoL|WpXzTRY_7Er55 z0_aW^-Ex;Rtthzap?+VtK-w>iH@Y=cBF<(MO;C1pBW7;#+3K2}+GL(Usm1l_ehr)V zLA7fyfLmR*o81(m3T=?coHs59VCEvV*vHh&_jhhO z)16}{m<-1>kKTQ$bTN@SHZd!6>aFM!hTEdy%ZU>*Pi~UAjB!`vg32-$x$|N#wXw zPSYd`+x#M$AfKq2GyW72fBNkrQt}h@^A%0$FpMkb>2hv0CieAVoJ=*#jfW*He_QBS z=)qrpnRZn9#EwX3_G{u7=S3wm2unEfXjWBTQ@n=1g~`WM`#x5XZ!ALp+UrL>>d^?b zCe`Bp&t@eow{63y&UeIg6X{tebH}(ats1%yE?vOL@SGjwZ)e7a8$3@ zsw^=Sc{*rzk+t(}j;)qIiC~O5Dppd6TRAgA`KUrd+ZpuWd*^H}HVl8%40v_#6ro~S z1fZc#KF8Lp?ILEEq(V#Kv*$B$T3LgO{m=4JU1BqOZ3Z42-4?`Ous<~cN-|)0c(7a*BOK^ds97yXEcJ zo<{vxPA@m9o*n_-6T zJqerbw`|QNA4nQzsjq4A3wP7x<9n6>#|#1uHS5igf}@gjt2<-QkB!f0B+Q=aQNY{Nc*v=pG;zRs1i7d}?;E9QvCfbQnYt-?hqx8f;Ue@eeb zgGmmbY?yPOZkp<2C@V8<*$E6YGD)65_I5vn`+S)GW6D$SV{SiU)2B%(?}$&8nRI@{ z<#%l*7H=l!q`gU zs9Pvz_5~Kp_tz-6!{}x4me>V4eTgFK20t|9y{dG*gdyneW+rS~Bnos) z!r(9*Rb22fFO-$NDEP{NgG%6Hgz)t1^EI?^Q5cp=Gl`$@6}$3-32CsO_`zcN+6`A) zp53BQs7IuaFcC$db`ct`;}yunS$g1HH-^H)T4uIlbb5w;clqX2Ow3b>wP6&@9&@L2_-9QJ9-DQ&r@?*s4uxNsrScQS==2&}5O=~Gk~5`= z&BXPs1A6M|l&7xoOs@&+As2uy3pK`T_99%AkNjGi_BQh zv-gSzs-t7=D;(wStG621hBc@uKV5kGsaaYgU*%%u(^NPddd;Uu3>VJ~Nx1Z^nRqda zSDz+izQ>SUZS&+VIaZ8v_(jx5Z zM&NBmuEU318=4>#zhO_!#!L)Xmu>l3cfNB9Fp1f+FAF0_mR;wvl8Q zCbHBwaKa!JA}uAj@_}7^EeW*;6c-9-j1!Eni?5z1__zRXh8AO8Af^+ONXGW2=8XtR zIhAnMuKMXldHoItsZym2=A9sTg8-~e!x?MCdAT=?U9ySOz6(|tRmswnX%$}qHb=_f z(5lb7G28a$GM0yg)z8W}mG~#XJ0skseCMESj5jiUP8-`x@hyroN*)nPN*r}hfq(A@ zA)0F|-5BD`xjJ==)J{UuJs9Yed5sA61!B&e%dscWv*>t3Qn>_*um{!MU&zY{SifTM zfvXrT3!V>CuT~^heVoyFRc86h_=5xoB(^^? zH$`jW3F;Rn$x>#h%T+zjZut5=vB^el9I_RRzd*FyIjk?kfdC_V*8!`hw$h%@ka41H zM|2+RRS9)lTz=yNKMGAr7mjERGoRBa__>ocr*S2(R7(|^NLgPwH+;#OX0|20wqmlN z|JrLZEw(Y(nzOAIpQ5-WB`mP%BM_9AqQI49 z#_5~pbQZ56xGb%<#k)KRVre>?{XDWZ0K1BSfp~0#Dz1#ag9tuRX0cshBx7!Yqdfln z1ocwHtBWCv^L3J8^I~x~DDbP!Be-!%6lG&rm}%!-8X_tPVeMYaZrPAbcI{J~oladK z9Q)uVWAny)enp_>L~LbdKQexp#EHhvW)78S-Pw4vi=6JdTx?@VuI7{K?t@WFwuf#Xw9TA+9OqZFN2d{KDm0x%)G@14V& z_`64k8UtdUw^WBvW+aP@V z_&SNxY(w#YtHU5);)2Mo0rdmGy$oJeJpvmEtFt`rcS?H5@sr{*?YWPZC)(5L;`rSfdI3f;j=FoB*;uF@>@uI02K^xSyqR@7yFW7CK9VHD?5=FW)! zdeu%(Qtxupa}V1qgRV53p3CcR?az@&>QXMd4w{`6=4EI%nq0ln1H7hSu7Hi7jLkG_ zmqx|Q_hQh3*{DH~FD)&aB3I=Vb+tdipqqoqdk+o%btjDJ5t)%~yv8_3HO5os%l8VJ zH?PTp@+~W{m2#`b`Y`L57;0Lux9>Mku*-(iH#inYJ9E-i&I=Gz(FazlGgrpc4G4rw z8`G?wXB4ztSEc5oycBz0)GD>7v1&%HF5#9aMawCyK%0PBi{%p>?M3l* z^w!DPZh@Ti8k61O;tymkku4=3B&pZqpI(ik&SE!xw-9TY={D(&b4<8+$CA9vsm(= z&6z5_J!!C|KU5v5QzsWJeNv9*r9gBanh&M9ho4Q#Hpegy3r&;Crti}XuheYKyYexD zcb7a|WS*R_F;3B?EF#6(g1;P&-Ps<;FrP-lOY86siCWiW>)vEfJ=SU$^5RYMw)aJM zOC$pDxr%`DtFn^`2s${VRScpO;oZ}|7?dh!b$gEm4~ z0mm-@9`^?}F?& zu;$c_Ru!U+{@4A>WL!wivoiuTUhm|uU)y%>nYX%)KUyL?=SI<)x;9U&#XZwyf1PJO zlcxBCUhw^(XEnu+1TKYXo@`5Dp)X@=&Jqs-RfhX4iXD??9QaIL5DBWptH85HGmvOs zc+*b;UtaB`;buc&AbCydtYh6Y?SsaSCKJBs%eIeC=9{`=X3h=K5seJQoF5L$-{=_V zhqJC2E-5qVLkW3=B_=)=OctP~-sX*@=1W!-7)FU?Fpy&;Bs#Xv9QD9ld0a{1!h4@_ z5+?>9$IWP4mI-l2;Z0coGF=zZEW*Hn8n)W>a%Ms!4D&|~t>ZJ@lu=fgD)$6$1+;}Z zr7^rVRcNF`dL>@uSn%w+#RES` z3#^b)04|@4eqelVws034y_4E2HZmTIFE?GcTbV%lT-^1j`jai`r3iY>$z9dh=g+uF z_*52VX|PXYs(#v9$zzhb9vdt#6A9a_Y}Hk>gSePjMb*`BY_Rjm$bc4Q_D%2``zqY1 zr|Z@!`p-54^(xO;^uk*@tdsWphmJj8odKK>PLMHUZt!}T?~I4#k(9+}p;galO=#|I zJQ0`j?c5nFzkEmri3rWY^0+AtunkpP=z3B^j)~L5vShKa!MZWsYZDZCV$bbm#pp2<~G;q!~DCK#OMTA>~jY$ zp4`6Qu5zONb_rH00-DuhJ?$3qTW5qGrQwK)dSIjzovGe(sJDBdOC*-++r#2Adf=8t()Q2j2`v63M*(@u@*K+B(Zbie8lM&9@6I_-gM_3aM92q$--SK zSi-S8Po>F`#7VH`zNwHfGirryr(2qn@4U52ULd6tesc7qXIQ)cIqFwN_HSIDCLs?~ zeXuvX!#3`x^(v}Rk|(1+D=n2J;e+QE+C!2emAf6vSh2o$}->Q54NF|wrzyIpg`-d}RPVU*XhFwDGh|*h8=~6nt+rGuPQSk70uZ#qv zBHe8_3G!9aygDEyHju+`;yxZ)tK3UPsTSPpMMTpa%rI@nXr}$XlphG*Mm zxzV~<1k0jxo~NIP(33QAycbG={3h5_4qVQrp#q7hg+mrtFH)Cr&P&x}aCDu+E{tuP z7z$BRrq@8D4v5jy_O80p;3+w!BBdM|QLZJ=zA^o5^Ge4G3ZrhA_)g?2?XIiqBijRn zvW2OP%4Zl_V14M8`GaV+Nz{B#~A!Q|@jFRs7F3d~OB?NnPYc&YFxG2->SuVDDfdc4a=qFNK_ zl8M;ZwG0C*m*Q*>Qy9WU6mcWAM@A3ZxK7yc`ylr%kQrqwn?lf5JIbV;PhGvE?MeKhn}(&#*bbIb zo1Zt17mr8OgVl$v>P_5rDd{@?F6{&&!IyH^9uZKyHPO`;cP0#8LBBqs*^r~jhl*!| zv_{U`ZHj9Y$Mpb}qr-3EL;S~?t#LK}Jbo!OL=sJB$41|VOpU9UT6ZF|pD=jW&#KS} zcS;Pr#>9$$E@0v=^8j{t0$;UCh2nk~opAxO3mkSkh6K;!ZjZef1%_vWVM=?v@2B zW%FTdV-I`zBim<)13jxN4Yzfs@M}sHZ`lLhkfKaXjT5`TV7aOBiJy1iJcBeO>mJ&8 z>GkHEtVYz_t?}-pZpG$N+&hetX2g;BL8hlt7Ljero?BSJ6pMYj6d-wvG;)E%_LOR> z6$`Im&{_)q=oL5C6;2}I^61pCt1p7y+D$CSo8M?lMnY%yjKnUvywtCLvvn3=$&;fv z$DpB~K$wdP+dLF)hMf7_lTdE5|9QJmrw*PJ)rzo#Gp9t+V+Nv6sTHZX4J=fi?S-mo zKGRDpF`9#4YJ>Ubw__Vx&E%Y&c80u=-D_w7mYmL@CyeiZ!bROhqd4I)s zK5wv+r4|yv+ke|6!c&=oo)r+4FA|2@0MuO>X-! zy9Nd%!1>N=zBHjyt!AKtMYR|LP@#rUlrYs7)K;occ`pPp&gkMl&sVxFpZpxHeCqUu zKkX$<-4S{IV#FBFEJNLpOMEm2ef3N6Iga#gUPXify*<`&8DiV;e9K~|1T1gpDN0G> z5qPv8n=;BoWDDqb%^?Gfzrb@H@s zu#N=qR^co&>IUUq6kR;aXH_!>(=)~t_!vLa=)zS0tjYcNN#STNJIq-g&3!pp95hJc z_v7k%aUay2;O{8}+`lml*XYlFsVq9a9jC#mQYBEu`xab_=j~~3btP{*>z%lZQq2RG z8N}(>U@*s%r$sSvy>8b(63`mdwk1<{FbouuVVShU~O{Iq!O z-t4+@LD474WI6VPGwNt3!vI&!1{Ih-HtQjCVlGbJhW%I?Uqv+E!JeIQ9sPYAYqF1~ zpR8`uJ%^dcbV342kxuOAZ;hqgA7S&nh+vZ0$YX83V2<&;Q}!KV)!SEH0qRja1ROz< z4KU9mEl%SpTWXx{BTv!DO=+C|;3B$eb2bBR6N8rY+6`EMkpg@Vp|ev$zS-bAwM=awe7-rmW;0$~7h$SeQ(qaj9e5HRYbFSl-@m1mj?E$q zndrVkf_hOwtn$ozf?QHm*Mxy8eKmtRUTgBY>?R`mGKbLlgsMQ^_sME{($+O}uy7sW z;}ofD2)<_73&h>I@+g>|L0iFRJA8E1`~zpA7w1_m%g;-6k2`344UEwDMxbhM=$9cP zn`KOU+;_XB_b81Tmg(Oz?B(O*v2U_<+Fm`L-$`lRQJG-BZoi zbDT4i^j`MnH!Lj2ACyQi)^oqddtH@f*nlv6f9z}(0{^MSfob1&R;7&E12LOvs83?!Yh#;5<`w!>fIfj!GGFq!tJ)IC6Pm}c!sP2x{oZ5sN+*5le}tF zO%)F9LKBpmniQvdFnc!bae2lZXCKn!21)jbs^NQ1p}zOkJ(tVNiF74VeDyloG<(e2 z1;qd<4ldfF(G$w~qaL@AfmR(85k?Q|=nxxm__;>oDQ1%|l*@(}7V<7dD{UaX7D8ZO*K|_UA!xRL7k^ws^IwI z0ij7O7pi8`?V|fEb`IvI9!oQkl~=XTJ#m`L8Raj#X~N59ETMdv<^r%&G}pP1lmP$K zQ!no|<>J(Hoq9pG)vM|sv8ct|T%(w7I)+gtp$mH{TXWUx$d^@p%346UtIkj!xmNB) zLcA#n0|UDE-W^oNruKn_Cugp8VgT?W z;_}9gwrF;NvIk12gg1nEkgj!v?50sW!%@NeKQ-2ExA(4Gl6wp86p-U`B@JHneBg{|Y0Fd!&#JVg15T=Ve5?c1EqBa;?(ql;8U@_L$$f=;Mmcdm6a81e8C zPn>65aq*#!iV)n1dP@;gfCHx!=nzkxd!{c~5N=?r6I%7UE$->Qt4d`woY{dd9@Vhsaq+zXFtdk#`V*8$oRB(K4dg`N3q)bW<0}r zxp8)6d+PMFz64R*3GJpQh}Z@u9@h=b`D0h#Ucj9fbE{srk6gkh)}!u62PEnu^}&*l zNW44se#Py>lWV~yJZoY1JiG1_vee)ysTTo3-Snd!Of_$m1=p@D7O;?)!jTHYMk4sR z5^qEkFOt`3$Zw=_Ja}?e%Q(yX6V6WYYf)oVTje;^ov1FF*obTvB(nLj-pe=3a$ld1 z*3Be}skpHz*{W~WMMuf8cINhrj&^s~SNZ+f#82i`P9>bwkH(ge<_*C!QIwDf z74p86LPLu)0%ykHZO#f=3U`O5t9ndwN@=>t1k$n{b=srA)%Bsb3ifa*aRaE<`Q}2T z)27yoWI*8JfT7)$$d6$H>e&9*W%$g+;6CDXHyP*^*H0{+qphv2slP@kqt+nVoli3% z{ciJvrSILI>DB1zkJ++$uf^Xgwr~<%O%Z#6a_*c!lKdT4w^t$U7kXrTs3nzaL>$zF zolcMe$K3i|)e+l1;*1agXM9GN@1{lQ;j3)TG!;C!>5Bj6Nj9Nen^k7HDyMsiL}%-*@Wr{XlV=dDhCTkp{$8}_0lBOPTq9f&+$N>s?$5u zeS?AX@;bN_VeXElY?AX?fYP2NADlcKL8rINu0?*L0^K()rW0DEmQIJQts1pg^nmF3 zn|4^4(gGB{S}&v8UFCVx^-?E2<&;6HZKDL6=)>E#j_4S-#woVCUQ{`j5*L*^220KR z_Mk0F3^u{jx@=fFh9qocQzDFi1&#zCdcMN)X|*dOJSCA!_>&%FFo1O;NO6c`EnPPIvu+b?B5kNlz0({#r;Mc?b0XH{!Zr2hg;~ zJ0+~vl78H&6lT5XT?uQN;;^!^({-GQu(J&FOStnJPS?ltR7g%o$%j1H+>jJXRz=$) z7iSU|Av)2o%(fCK%&By)8@`zQExcxT(gK2`QifA%E4y{kjJep0>DB;dL_7~U;m)iYP+RYs9g$Jf?{h7ymY&`Ybm;9Qb%E! z#&EMgyfbLwA+~T{gc@4b^MLk3A$;19OB7^1F_H{qFJ4DUv^bR7B=4LudnSa1I0IKQg`+fZBP zObRMeG&L<_e3Y*47>HjOMvVcf$RjDXg!a+)y$?I*INk*G_Lh*jI5)yvI#VjLYih6R zG6OTD27rxaqR9#h@UV$rkAAoCsD*mt(m7J<0JZC@s~O#T3Z5>h*^h2f$|@RR<4)sh zX9Ry}Wl)Lcu!39aSeQe*tV&QN%-JqR{47drm@=Qwp?-vOt!qVp{vPsu^?ANV8?3pw z*IpW}tX_t!6!M6E#@&8X{%UUu`FJhe+CttYx3XN8UFqg!w58p?`rMA@*^`B)r&GrA z>znVwR`JoDGEde>B^gwB`mMH3W8khCLd9aZSo+#Cwr#j0k>w}>uum?;*%~MdVv=4^CY3%})U()lv!Ji_?kSdg)KsTQ z9RzWMLKe^vi}hr-0!TV)*-J3_8(ytHD~<^sc>0l9c~{*6u_KFR_W$m1)t_jG9vViY`{eRh4SW&H0_TCHME;8T7bW7+?s`e!bc`lG_Hf60ThRq?EwAQ~IxN=DiMWc|})k-=S}Sighln!b`ha<`=lzm%8c46p`u{pzR5)fQ9cN z{peKK5-^V};x?s7{tWx71SWfEq`LwJf6{XFQy5IcPzfUKTED2l@|zX8n36z{yiI?b zFuy4*Ii1_c2x_;$t4xtvajMpDELdEr%C-7%F_{sZadZuxN#EIr2sBLZZ`?V>#0w4* z8WR)56ug9K1esy8O1CEtN%CO&m=ydE1m=W@>|d z1ug=6LQS^$&`fSzFT&7j2DqFjj`T0lan+%Sov=}{3Ol2BdQ)z~f2`aORxtbSw-5W- zO}a|*A3109%=dJj+JNF{a(AXs(7xzKYt#=*Gqn1WN%cPEtgq=yB6rrilrQ>d#9tJ&oFUXj6tEq)ST}5tz7^ zt}EkLjWv*Ll!6klPUqEweoNnmbYpl4b2NxC`4^77nD)e__{mP{BW~3~xes){xcL8LvuWa$8}Ly~k_#dr~mk8Tv6_bbKf`ZZG-2GNjW#ts62 z>Mga7q@`w^!l`7No;6sjU>#qDGm)fIXd`2>-u1K+%i@lh)~$(RE)Nf8BgwJzNz0aC zTx|RyKOrTXxa!V$*5|L@9E<51FH_9Z9xlR@TxLgS$KFqDBZ*$GP-&EVl1C#Ig6rf- zYlBxadnjdbXB(nQt)evieJ-6%h$3Hkfw{ecGhLKz;a@`1 zGYCqXH?1;AUZ)9ryt@5wmPLDt;=ek415p)sH}tPWc`^lczn-JjC>3y_`t`b~qK{q7-#2lWJd7>D`h->6f71(! zHmi=BPwknCWptgyP4bEq#w2*Up8j+;o5K4Z{iiC&6TOiNS6e3L3NO#kM0p|Tqi$oO z(o0j{e@Mk+JUf4)VzR&JFB+}Pj7>?+Xcm-th`*&t#N?*7XC2AqAo}(?4yM@U zF6`&>$@2wm*T((-rq}a-3a|fTE)z3zF>$tXbaikB20H`u3PyHjBmi}J9YqN_I#GFf z>3TO$h>l79dPV1xfet^le07+8RGfk3fVVBk1A6Of%k*u})m-j##{7^)5sHFA_P zv$C)RW`W`UfPaJht7BmPS1IjkWNT$2Y;R#}1}p&c#d?tXkC4 z$XV6Qm4q4~1&{_P0F(hL022p0J0pM@z#L%VY-Z$Y<_xd|SOKg7wg6irJ7ZHLfUTK} z3&0-WXy$C?Uwk#Z{{tbK*_#4+oZ(pi zmrS}Y7aJ2J5GKXO&B#T<2_)g-;NW27B;jIZW@IMe1QOP90lBY%rCiL693-6F%>U}x z{=;&x0ZX`nbe6z2TtKiD2?rOJuL)4_5SVZS=MC(}0;JAjW&*19asm@JPDXYT zu7A?Kzzi1)a2 zfR>93=$8|?^2{V`T>lONGYb%~$_4xg+&m_hfA&9J0Gj{-q?|zcVW4FKHfQHx{kPj} zz>U)T-^c3z0FeC$X&^w=&Dhn;5qRJJao_?^yoiyD*?-pjKQ7?^yr``Iag~AKQwb|) z7uSE+1jug&L@pTpSB9Ax2+7g3GIh0d0iN;y0EzwgGydNIS^qaEf`u8VNB_S;5o}ys z|10}HKoJ})K%v_IPf)}Yq*9j6G87!yuwJyR0f9#lY(oP~8O39GhY6!)V|Xz< zxX(Xip58vbCb?5G_uJDA&h*a|M1%{A$4P9VSU_b0&-HM$a5B9>3U6u8LCnoLB+Sh< zJmKKj>9BRTdyB6z@Pw!==o0y71n&zKgiJC#GJiBobY}965s~a!!y6ib*E?RcXCb^2Qw#W~d@O1%SiZT{!8@RVc5HokV+9t*6MID`6YL^q zi}3r!RG>oO(>jQ{6?b4E`0S^_i1QaqKJytrH_4$`O2M0UkUv8W= zADzFtAd@w=K_KF=+!ENx*xrE+-G2?jM_Q)yJpxQPP3Uw@QanO>;W?qCVCcYOw_ZN7 za+)eq(n4Zbi<;6d3=lFu;qEp~oqSl86LSb>H-~XQ>t2Vdvja=7^qx##-?Z$`g)bjB zzq~nG8#!6OVuCZPz*9Q9(~9Vnbk4W1uD(4BvcTuV2j*mEW~RizgSbL~@XIj(oz@-wsAHh`EJ0Ap%maRdDU z!ccv_^CcF54LxImoa zpFloE&@bil&i1B1g3}QP-G2jidkuu;7}FK{0@!Z5`LLe^ZMC$vAiu6H{GP7gRkwV$ zx&jrxSibVi*xcN_E%t7o%wBpbzWM_K@WFzJgjAmoAQNdE65afiM*V7-dUyvf$-j`J z^`_YHpsviy6qY4Tf0+LKSsiGg&^qv&%&**LZFiAVgl-71Ia;%2D6)o@ww5O#h(A&_ zdEPPzkT*e8z$Ap{L_irpWh#fg@bhx&F>Pfl@Z&#Ny%d2F~ws8mC2>i?n$} z{c_`L2ui8z$cTxYeXo#XGKw7MT$*iiy* zaiD28f$U8qG8FSYFFrYI&(7Er3i>Q0k#GShCR7czUAPOgQEE3P@|{NH;j)BTh>6$v z6W>iCWfjeWLYa3c%bweui{ZhO!2}e{NEoAOMvgqP300-+gRU#p{>@EaVT7kqO#unqeofVZVQoh1#4?_ zDL1+pjY=tn6MoogIUx{^t@VDigAU1f$UJ313U_`+m>Wk@-HSsiT zu$CfI=N24KKk2+!svKDu>~2kNXrF1ZEI5fESjQr`N8JgzLTVyb#@Y!^OMZIm*g%Wk zm2Z7P_LdmkH#7_+BEc*sy}RLiSaNMK_I1gYynvtzQ3A33dYwEQv8oC)Fd{bX7;!bGZdlrleO>e3$k4As zE6z&`qO*(^*;(5Q35xd^K5LWZy)2e>>L%a&WD7^E@t4qdCEM>6-c#kAO-waC0|dkw zBlFPSS06aK!Nqlr?(7++GXfd<`5@Y^wgDyzl1q(qKYs6E^ZG+B9N}iQelm?r4E;1@ zLT;jUvMWzLcrsR<31H|6(6`*xX{PntpgxsA^qf?rI(M+$?*-=-!>J8?D|Ysp(`KH* z&cf}7cW%w3-AF+(-b^gRwMnSpWHK(o8G@5yVO9xT>r;n6z1;aVl6c>nrT70EuQY&#@r}ooTX%Ib=R5;?{gD+YyJ6!?My_g z!_Bhdecn76dv6;fvcJ`XIT-`)b0X)N%hefkw)SH@XZr4cvxg{o6FxLmpdj91~$7>h3;iOgCkCTmRr1=8@ z<)esl9X;OPHO&obzqEPtMT193cw-$*u#m==W#{?gQOUnT!jA_ZmUZ8&5jqvhzu~aw zChZLrpmy49o}z&_2;qItt>yTES^a~D-2@8rq`WjfdVaPRc(jGk z^S<(@ITG#7hZ;I$7Z5amx+9MWh8pu|fzL&QI8L^FzTuErOnj?3T4T z)f)>HGJir=_b8E?C)X(GqJQ4#HB4%TN8-&R@eVEZn*aU5;$l8*dWsoA5c|<+G-~Y` zV_FPN{nrLkOv@$fp?rVYCN3#$u!aCmH7^+#4NmXidYl^R8YOfvcno6pr*)rx&60S$ zaCEfs+4NwWlS13mgRYp>^qd_cgZ?ckF@CT^J$E!s-GoaQNysyJQ7u=>iSGKWEFt{{ zSv~p-iAQkP_L6{q*F^onTt9_CE#A<)Lu2jV^gcCRL5<32O?9f2w19nYKZzvcoF0EQ z$Ap0L*I+1-Pw(6&xFv$3zvDzs2H+5i9=m}YI3X(t9d{61=Fo66_iBCwZkWPf>E9*&U~`Ynh}(W2 zWupnJ6Ku?3-YVr}g|gL_u4;_6L&iti$*MSj?9vD9uz@7|PQ|5Vj9)0TV&AcvC` zFF!eBG*~VQ;$O^}rJb=-2xrV3`krS9ImXeFi3|hJFXUQucWUz=QlI`hq%|Hvkt0El zFp{%y{J^ucRXrSmK=2z*J98Be=Gh%X;g^c6Gx98&^v{ADNJ7Q7XUwAV-W8UUB(F>j zg@E7!xuo_wEFv;~!&7w<;t#x6wjV&TOkb9MW6pd0-~FsGG%=JF5%nY6Bl+cxFOKC< zM0EG|{9tw~mC&FJ_@`A%eiJ`~tOqQ|AFMUB0(#o>hrohxl-92 zJGdnRE;L@DoR~cR)bJ8)XJ~?m)K(L}P|ogkDMl~p?R`KUr4?k7kV}@&pP6fa?8KNs z)IFFk0kO^$kp#>eat!lL~v`dG6__N#Y$e01HNSC`vd>AEq# z53oGG3ge~%BsFNHDCm)@A`XxtaYhG&LSVqG-LUW;jS76B^ z`MVeRvO`kQDZzDU67$6EtF8G&o)Sm3@vnq7pET8d%tDEG^y%ci%okNvUtx3C=oNID zoQ6G9qR=Z;NxZGly`(JvGHj=clPNNZ%2Y((bcHml>_ytrc7uL%)@iID#O1{W+N8Q- zjSc81PaK>hh-EJ}7*2pVl}6Gxri0nP##F~c6wSDhfz4P0dn}b$Q>t2X;q~iAr;%0+ ziGx)P`B=@)m#LA;O|{W+E!DA82k|$)P692j$NJ+0gJ)f$)604+LaznqcH?kaupM<` zQ%So74V(1ow=3|P%v*f!e_H*q6;WEE`1XF&3j8ftWwMpnj5B1d zYysFOnQ=(Hij+~;ID|qxGgiuV>#l@)DDsxSoV(}879I;D%o@g$+Q<-VsuSFie``&Z zmNTK$r+Bf?TLnfV%T!3OEqTM&h#G4{ms_hy!V@Q zb+4JY-u>?<7IAAU12fc)Hx|C$_#8W8bHl?%*0Ksc z8yfA4@$x|W!Ss9y4y_6OyG zTYdF*%f2p4kc2RpAI&E&a2rMTun24_0hlaq5M6<{SL`fsK8W_z*$$9s9!R$zs!ntk z;hbSM1WL7ef`fKR`k!bt0~>x(-cC&Bwr_vSc*N#VYHK+K4dvBoE$<=h^_yvZBz7$d zL<~d{o{N%i8Cg)fr&y*bPX=O4QYev8N4`X%dj#{WQxb$W$6*>))vfTE3&iP-j90UG zXYb`O@)kF4LkcAY3R-)z8Cwn6{PIqPqF{!irbXCUQYPWq$+u>2qU6AB+YZl_J(YFR zeo>D64eK3^FJ`t9X*V1;$&To=V2B8rw zn&^yrSBZNPf+K!Kz3?a)c?)x9#&hW+z%OcmqEdfJ90h?aVJq^g9P z+uI)EQwl~)H)=sK;glZ{6LP1XWD_cqw{z?Uj(=(i?1IE#Ve$l@F28~AhpmHM88o9W zSr}!HOV`}BJjRt%^819lC6_buceZSYm@CX~Iq6(>uPOyWa?c~+h(i2OA-*YYzfA$H#y@0*82(aXb!V<;?AlDV3p>rSw=Y1>-q!Ma=-Hi{hoZo1UgfPjMA3zGy_} zPDOhKw_mY4@cKEIb9=~ahYvjj>+WwAk_7nQNg3w>@v=1Osi`k`M@iWneP~G&g+v~2 zhU;~WZEOI)xsc963LUh*MFn3<7Md9Cn3A&ST?atVK5Mb=Cwopk1Nt{Nl5bK!ksEUn zv1W@)8g;5ZJ(xbJ{Nb4y=JxDQt#4C0Hxnc44;L&(Rg@D4+FRo){1_He*D=c)gys1& zcLuvknVz?t6hrc{Mj1z*S#&*Q0G-70)2TaqR!yLlo5a~iZew)mBm@zvloDP?(g4VI zsK2YreZ4Ze&`Qoo%&Oc|b)mfj3Tz$A?MJq)+z@aiX4lZ!#q|Lm@!8TO;$n#ARmP6Z z1>>@a=Tb}in?HWhARGQJLihR=fi(My)Xdkenx5EkL+huH{^N(TEyU1=k;hy1dxaA(&O`r<$CCfP+io(46(~SrzU^xPu2mi~px8iPdu1V;$XA zg4aFn!=HGthP}VFblt)9OZo;}vY}_}mwmsw-r5w?y}b$o>P%_K!s3Ci#^Uuoq*HDe zmSU={xHI~d<|SaDjwu|%1Nh}@x1NXy=gobs-$06TryX#dL0C0sGz?mE2-lD>cX|je zM}6hFY_+OWy)V9X;r|9k6&=q#FrcFcaMUDyXC#wUnHv?z zZwySC{Ox@qb}eo0um!*Y7zm&AR-Z?0XcJor77t>M>d;*aN}KfNQ!7|%o9_}sV_#JS zB|;47TMWI^+n^#5+FDcEVhfurQGED2QrEtpe9Lt?C&$XrTMzU+j33EGSLl#EBIc$5tdFe_d4t?!ZW;4}_Y z)js|b`DH~5mX{fU1Zb+`IdOB`HN;tBq|P;VrvGkP2=>QSda|ON@Ida-1)LEMf4zur z-siMqez7AJpQyuJMVV%&T9)j+a+H^o@VIwV3`Afawp5pKYasFOYjX32->sX~=D-^A zy&C>rs0s_5TwbB2FfpE7>_Y)LTGRcZ>NHAdD9xn(?zuc?29+NDUE&gTBL*$5BW!Ig z0&;y;wjuebdTymo`Y@BvKDbA3_6xRQ)d6He^!Jx>S3Jt1w}o@H8wRC zY=gY#2hgrH24EsW=$|3nYotG>n+*)U7J}c}JJor#F{!M01}0vZ3#rZMs3aXrrxgox zeST?(9w>TPL2UjSEO{>dorvJ)GWiy4)Jb({5sVU(H|he2;P=+|ZKwH`?c=+#@ zJsvYQWOAD(hTXBx^$G@l9~nDA3I@h#5#EA0!`sp{t*){U=4+;ly8)9!7jlg*`9+>l z-pK;d7KOXVPyoe-ZFn=wqDD^GqpiR+w+<%0y8beAMaNGM>pZ`a{LOlrb~K)W_4J6U zEgAQVq#qUHB!)u+gV9rgJ{{(`rn%h>-#&^_o8oaTG*>QPPdXy5*R@zZpZ1Pt5*+5KNW5uhrH@JX1|1mX0>MU$66ki>( zKRbp>;6%&(n^AQtm!qR5gPM|5k!gsXUCv8ywVV8?lC;P1Sr z+H+h%hl6U}#Ivqt?JQon3y7O1sN2Dg=-p@TX8<9$%&;kTQN;mO^#!#kE`i~I=8A4t z3!88e(C?>0IH&-~RR;%=_LBX<={#bUo*3mdj~C~i!YtIY=I?kO2fZi`MxmO6Ph&$E zkWhZKKNv6Q8qlgrm+(Mb!L>b|Is$htBTu)Hcon85HlNFSoY)Vy9j`@D(mv+*2rLjx zHsVc>OFVKD7$QuprMF?Z%_?b1KU8@RB-xFP9j#Qr=xD{j;7Gd zpE2|T(fJIQ%~IOQeV1^FD{NffuN7<&Yq` zjB(3x{lX_RZ;U)0%9lDVO9iRKgRy+?&Ngd71TkHcG{8K!)YyRiSZycot`GW@t17i48NiGF`^mD>`Nr zHh4pG6&uFkhq6*&RIeVNlO@M<{K(!EZ4F+P$gUjHL37 zQ{oyU-8jCJ7`;%WZX-AEKO*y4+-Y0>L|aCdwZPBD-&f;($Biv#pSz6%6uLfVxa!Zx zpaP)2q4%s|AW9xQ!#VZWHQ!6xR^m!#pvLo7xqc4j%t3I9H^<~B%DOzxUUel!qsEH5 zKK*#yB5c<~|J9MfUsqO!NBoL;+}Q#~niBdBF+P^1s_{*Z-)9C~(S>>P{jgemFCd0H zVk%|(An(^z>!FLP$#*K9JF7*rSmuloXkqgTIO-VI z=@7{xMqr$#^}3C&Qqps;$qxLj?UkgVxd$R{ktYU-PXjRycBJ&6cca{4IwNneILRO^ zo|)}TzNIEN8}mN5F?GFTKe%z5P^ecl&Ud~ZkfQXL(va@Iy{9!V0x6g3LE26;A+vZ; zy@eC$0iEaU$28xK1m<)xdg-Ln^DQ%j3~KA6V@c-)k#=wM2fex6?U@8IHm>I>y|Aij zkHiY0TDzvv<0|gqxw)l^AwI+Ns&S(|>>dL~e#y;}%rr8ke~ZrTk)~OCddcMZ2upN; zWkBX{T0#%UkR=J#%udKNXTxkH0LM4vTDFxbfnL?7*k7Li<@z8gZ3(vwxz6Zrj~4I_ zs-a+|ao@T1_5C;VV^qIl=cR0drco@nF8UBH1>7or4}Y}$Yt z$evl>B>L0-p4jPgn<;L~(%`(cJeVK|oenIIGjE79_1)m%ui(!n;^ zG50U;c8kmoIhm%a3H_GwcSJXU1@1Z`Uq(Z$^Nk5QvxZyJ@>=_P(4t@=n^ER`!=N)5 zMXNs&Mv9c-c{4*`=cga}WXf}DMw#nc*)E0V=3oPX`L5-}!TF|c_I;6DvZgG*iwCWK z*bXG}ngDHw+!be`lYZ)9w(E&we|sjU+3Pxion!*uF2>tol|d$NL|2CRWLPD_MbG>sglIwwVf`J3p!<$*&EoCx?xPJcP!{`^I-e z$#botaCN7f*tiO74*C=x!J{&MYvy465qS$fG$_Qqf7IuVk?d(k0tv%ew6H+cWtOib zLGc#Gmbpgy^ZkzV!N@uk^>-EWu4Td>oVm!sDOn8^aO~CUjjdt927DnWtUAju@nc2l za9Xn793a%&l^hq-g09^>CjU4!%*^}XFc+ndKc(p&+3l()Ga%`F1^G1Bj|-Vf!{UyL zo!fvdi*LQUx%#GTY-*sX6{}LUYLVjQxSbfJOJIDVl)pI+aWX(zyd)`9w_fZm&K9>z zTR=#&7Xf!y@;wOF&fN+4x5g#YzYhC5KTD@$p>D^ z2utR7;R<~&F1&#I0t2NGOKRBvGip^!t9yA;IFAitVIFQ17^R}y#pyct+qB8`O z;%6ioY=%*R%cF4!q9wy|;f*K`vk5F7Zz%^(a5G5$rg1CyJ?L3vKPmPcr%X1$+XwS&{dOa4P&P%%1#&;^%S`F@a|8ooaos(3E;=5)%{gq_G8_pTl-i2!!u9r zWgQk*;sN&qv3_?-eP_pU$YOw?IO*aIJYUNI_U`ESn)Zrd<*IIq$ygT2dDqonBF$Zs zz-L3#^aaV89CIg}E@8qVrYl^rlY?8nuSpS)kkw>OkvQ&6r)v^EgZfn4u!gleHgDs@ zZgvZVQrXz3Q@ZaK*@MZ372t$4ScLRVb&s>doz#9_fj^2z-Sem4gFa&Tcc{- zP~36qQONh!4*?Vwdjg!8>rAP`$DatsmI}gu>q3b)J96tP#T&g5{}ci;(w&bfqOvSx z&=dwu`k4@k8S?b;x5|-7TmDG5dckjqHj6&S6$27JPV4Q^t52!5ojfLT*2Mwj*Kz?K z9AEB4MdB>SJ6r}$?Tn)Ymm((R=kBa8E!WLSr=9E0Xob2k87VKMFNtVm;}+2y-0!*! zG@K`+B*t&^Vu zO$68xTa;Zl>rm_1tqByr31Y1@#cF$Cf+W>Gb7&L!NBBn{^|NRv+>89Cm&_b|w$m?$n!X010|x0#3}ldC=9U{Al+bcuXKN_ihstOsoUr!*Ap^N7A^l<%L!QtdB$hTB`+hkj zZBogiIa=0B4pb|Z!K^FiDHw0>_i0)jV)|u=DVArHDj>;i^tXm!A&(kyxc=Z-eP1K9 zg#p(&^&2NW#KwT7Ds<0uDzvz5O@ppnD+*SU+1;ytWF6KkEYCLW$AHt0^*AFP>2}wU z@-YaW_`Lu{h1$>5BZyv;4$t{DZ+x$IQ80lqYQZEJ_B5DY@P)>!2*+c9+zMe=7K^D|=b@_W|UBUqDp%0Dm?wEGLTUiF*;j3)9j zJk{${rBaFiKKoK|1KIC0C5@rtv&zZb}mPox)TR~qqhwB(C} zX=!kxJ*utg1m!jrtjjmnT~lz-5nGdh{pN)GT8&*K2%@eF(^Cktcd3R8izEn>X$7-b z#3y;GBuQat+&-u4-;0YwaM%~T$~a}c0^Qp@Y1f%r=kfoFljh;>yMiQ1`|9SD6k*Av zm>)5G@5so-|38>Av zbuOB`uw(~h1b!(_xI?27s)c2y1EwJ^emoPEgw|52&uNWx^D1_>jz)%sVby~;{ z6aQ%CG@Mr=h%`ZT+&jFNW_>n3HDS zfwi6%kM<|c4*XL?6RMCK_6JDYfh3NKuO*P-=n)8{;Tde_ap=moe)>`Qc{boF3K!x- zW5r7RMg4i*%xozB8ZR7^8F3G=KQg*Lq8*hNo-dM%bPfscl+0F){eCKfJCzui85u!T zVQX!3&vE6Mb7*IU>-WiffR8wQQNvUHl6l7O_^@a8=yW5(Su>0OMcWae<0M>luDG{E z#9ub6P0%tpnOkG$UN;Lne~6+XP1u0n3X9-*ZaQ-IVy3!g(M|9iG?o@#zbuCF&06SD zs6qaDo$k&$piY3`dzs-oPjJ^9_th<7QbLEoDeRK%Uw6#`|E9)TcCxn;) z`?dI4F2FN83-G(~3hOWRveG61J#t)vlMUxRE}oV-whDr=i8Z9&d>*3~AXOs2j8mvc z4mSarhx-|A9Okn2QJxcMeJ!kU_ebI@eDiWz?$77CGXSw4t;JMKuR#ahhN_|ab(?_a zT7D@~_X3dtG_AEN^Z}7Ju<@uc%|8w?^&n(jlu7|%k)kjO6;^j`aZeAin91+Yeprwl zd)|#r4((Xwh#;S(05&CEXBJPiwpLT@-$ltT(rbFp(q!gID-Pp|MTJuen~A>H`|8-2 zoSKM|HMvf%oY|2ApH}V}Ginwit(2x5I;%BF>l90JWGeoHBIIUBQDTuzMFGK`a9)C+ zjc-5hqn+efsZJ^j==2l_n67zg;&5z*sZqpQ?e$a{zcYmg8s9(>=}|eXgd{H_^ZNA9 z$90RDY~9@`jw^VAqhS?GqXp`vFvbFu;?$*idv1PpMOPJLurmw9+phcTIZ9qGqI#X0 z%7}=k2c>!rpCLVH7d;6|*@0ia-CFi2#}Q|#Z;wECQb^4O+qv;G*dG0GjlV>j3p@R7 zp@=V}8<)n3N?Ehk#SmH%5tnlm)DxbYoZ8YlyFZ?CzW1TiGbt2=LfotFjY_TaWu6j} zPD4+B!hCt6GV=JchYX{+Qddiu+ve|*ff*U?u$OH*X^Ck5XlY@Ohy5Ttc|dN{z^Ec) z(#RCvS_YeU!MKonMCnN^l`(ZXg{Vd-cC{c#z!S8OeEc><@xDZ*6e=8@)maaDxB*ZU zm`<8o03)Y{Iqxn%{L@}g&UQIkZ?y`#Jjl<{0%7%xCYVyrWW3zzAPxJ6c%XZXxj?jYVV7QkywDn(<^s@}wj z)b))B(;Hvw6>l`OQm6-NM96aSprH{njJyeCZ+oO?W~;fO@(zqAt1Yld1Q4PVA0qk{1lG_6paM znv^Fi^cG9`*;D!xoSiSsV=yy>xVC8stvc1K+z~1asdk7ST-tAgt zjfG3SsKuzZOexHzyRDn0$=HJQLaCKKUZvnnjdmt5ZwvrC=LF$0^=41)C z+gOs-Dyxu|@kAJk$0wvNfWNPUVlX_B&-FzJ+?vNuVtnRI^kr`8N->2P(@4soA%_K$ zF^|iL>K41S_{i!thfW#1IJri7&>YFA_A0SaiQ90K?HBh5bAYw+2?g4K`DP0q+F&*n z)rIbHK1+@YjYw@|e&u(v6#fwT07rN@mD{{L9~n5WPC1%s?tS4!IUydeA`0~SF$x)H ztjcACif#b56^-?Y)7t^L@-d3n-YW`O+P1%x^jUo3pQ{e?Lt(rqa;Imvk(DXHr!KA{ zohW^i2~v2|I|BT@xwru|FVF46vjDHHNBUmmP{W%Q)}LT4Mhgi%00g^EtnTJ88im;Y zE5XoCoNR3~TAEqQ><_MQ>7rRazam0e*(XPf^9K+qb z#wHfH$MPa%_y$?VU#ULUiXhh~7a#RVru4$gz%j1PHm>qeGGtCThoRpH3wJyq3{otWvW2L!PpW;0l+51(jsDGPcp0wEF=lss(CW9Z$F5RIQ^ zZWtJQm!eF6Q#tef&RW5#s^-@`f(v0i;}zEPez5!uTyT|ddXhOAj|ACdrQxqA03rL1((_2G zZ%>_XS1+pnQrdfvpVm(yJ6%@-x`C*ph)IEG!&{y*ybi~alh#D33fr|^>TKnBUyk9es-m0O zZ_Zov0Cf*q&-)>-l+3>FEm**K@}o)lwDMSY`j7#(8trB`k0uRXW(4n7X6)XCjVf^q z3i-Txffo!Rtj-41jLe1bZ@+(50^v>uemyD@e{{S~lj@&P2dVx+srnV* zgHzbwxJfeVgD@`7yc~H^_P%k&rLrfegwu+~HfX!d!pP(~l=;Fo&(tjb!aF+E3%79? zgx?l2+FBV~0A5kHYHt8YL{>G56YpkK|Wf^#@Wzl`UvFUj?1};Jk!P5L_ zMSu7=n2R5vd0n9fc!DHDE3!Hq$FK#JS-LyX#Bu`#oe9+V?S;5_ycmWeLHQ_+RYOmw zn#PudQKvp&XL5LF(QiK5dMUF&TLd$k~{k;SS z1UhaOQDD`yn|VW|lEbMEz%_rJhU&MW7%w-t^4qJLqs0!)&G7fmQ8q_`(ue9FXJeeQ42K$0kSnal7o*S z_`~>m15r&!;1Ew4RWDPoa5!!==N3jJbjXo}j@3*};5BG6(vKz@o<|e-8sC#QK<1`c zIRIV4#bFmafao0&V86?)XF90)P~s_YAIZUqvVrm7-}hC;?-;yI~hKuSOqNe|;Oc)`UcV-o|=CIR*OY!Wd|HY#{U3q=OtcEm(v`weXucqiJMBM#WSy=ix(%Z6vl5*Sxn%Nocol{?szz2`( z3L(8}({}|!lg=q-z!6gAy|)%~9>Eqe@E+A9`I7}xz148or5?aWcf*RbL9dEcw-xY;1 zCU_@uBe(Z=p;AD{V6H@GI6Ql6b+(fZ;>q}ng6fjC}B->RGq9UcP_E~=L zxrL?JA+PnuR$Pv%=3XFY*6sB7mIBmo{mzS}ZbnMIj)s%EU@!4dN!FRLni=l>YqS_H z4x~ob<=At$p@UDwDzNGkgR}c4&zNC*ZB3I$JndS2uV7yq+hLSjBYEq}_{Y9!pHYbkwyqh8{J2QLYbzYrl zSk*H{wcc-F^A_*xcF1U84-L+$JUWrJ9(&s$;x6uV{}jIP8YHW%UkURt(ivVAzJ${G zcBsYs_e(fw`aQ1|MO?uVsz<&cCT)6OnjWIP(5eaUJd6ozl0Dv7OAvgCHSXhF=FuA4 zfmr>#^U>NhD}I|DLX<)T8HN57QE8ko7>+PYmQ9PI21DyKVX?W~9KxyU1(NYFLpMC$ z3>i;J~3Z@m$1nrh!yy$u%B+AWlYDv^H7k;dYfqj_RvO1C^vK;!|0jmrJWn z_w8XVLu(7ek(fvxgf&8O8p%cLkHhyYilU)#INv%g(l@MQEtwZ0Q@&h2b$2x)nLai+ z@Uw$&YLn0oXBt@Z&a-TMJ(p-IUjVN%Y(g{BA@k-Fr&#%j9QVcLm%dkvN^i?GB9f|v zU5Okk#up>HK45sqfQ5j#)38r)siZX#zMWTX!Ch{YE&vg=33H{5Fz{x;bYnq4fD`2Qo z&+E#STWaIj*EF~kvLDLWK6Q9hpYEz{gJ->rS{*#y%EV#$R`AYOih?$&jPrLlFriHh zu=IuEhp}mq-ovE3y$$bRzsLDZLZGZHVR}>!}nu@#gNeQQQ2gN)&42ca~UBA8{gnyq4q` zBBAIKfGa?Jn$!0Qwtzma5}hbKhhi!F8wjVV$)3534w@7SHXE%szq~h%I~Ow9?Gm_h z#;v?L{tQLV04xlv0;dciqlyM?6Vq5v7q(=+_Aq?ly9Hw!HPQ=g8z>L1pDEuI!=)AS#ChA#yeH{50_@lue^Bg%v>)^Q7r>NNyE51H$31xF@PDB38 ztEfCU*o4Kvr8dclEMwC3)LWh7PQ532Vm?=&L}$6@DU#PL9YIfq-`u+Ihchi)Bz)t| zCfqwCJAD7; z4wk3oS5^GGL0GMFiCmD+=!%Ms3_ne(XB*FEC8%?xTpJ}Gpn^|NhYEf!)!O;RBt)?B z&a^25F7k=9MjFYETo=UsF4okybS;!NfVF6eXG-Y4ZJT{@k=w0ZA>3LmI!^Sf?+ul6WG?7eC7DBrJB2uH za1~tUnVt!MXiZtEEESzLmK#c6rD}NU6{1UJof?r-!8#LW=C!WCZ|R9;XdE6uW1s?6 zUiqlon8h~RJ#(gid~No*RE@CS8y$bw#aAM_#>zefFOstTsjil$kf*ZA= zE?Gs(kz8E4!-D&E!wEuar9Sw-a}8M-7=8@Z-l7iJ;j{ovU!uQEFSJeRAxtNw z^7IPy8uXgH+3wHbaXAh|7^ZRBtox6uVrAab=z3iNXLd=n_k=0QbTKtR0JRc z*=8D{*SU3D!w4V-(KWCF_(4o>o73xUlY({vcOi zVfa4oT!nR;4rJ#m8$cWZkYF%u(^;@=^GC1%BpFNuJ3sF{{3l<(z2^2Se|ww#-`H4y zIosbq0q6F|;bh+8CE?tr7XkP@Sb&ei32ZD5wr!#k27m~Ig<$8IESxL=VF%kb%LyX` zKzy>r(y_fFMt~>-;P}|Pysg*x_THRqoWTD9Tk6}pe0$%WXESdLWAC3h7`L9jS0w-a zdGBAgUYLz>n~-JqCl=-{Zjl{PZaw}@Fx!7+-~Qw~e*tJrwx~n4Ut;_7Z2h$Jgzvy{ zY!QKMgZSgI9ck@6Z~N;m#|QATpmY+@iJx+O?AOfw6dyY(zK`OA1yHab6dzlJAKxfG zb~fD}8XFddEz%Bv(1w7Udz-Uo`#UGV1+v9Mvh|{DTY}m88Q8k?(&naGTRb}|^wO7w z04@?88%x!_TN>=)?|}aQbo4B+h&{8f0ZJBTfZT?TlLa6U5;8S6-agHMrAcU5nj6>< zsBEbdu%EWR0?&}uu>ka1O9vn$+Fl~ClpO{WV8;QJC%+lix_|h4JjAfGz9r@*2I$KZ zkt*SnnBkNpW9FP5W*?s^Q-zN!U&Fwnc29!TX`-cB5T|WI6_7;*=2fw3T`FDZdle{; zF^P!<@QGqgL?}h_p<+6tRvBBJ8G?eCuEYZ|0GNeg&m`JyhLcf<^UTL_Qbet$?zjpr*nf8Idi;`lfI@23bi;(@;mta*zIRZSQRu zM6?MQIe?-AKQAO3%>Bd)tT@)mC#6e4?wiT+qe0Ivp2M3{~Pk!^qBxKFL0>c}o4 zpBwSMffwdKsruhL1x z@98n(7EhfRg7>JY-3)Vsg3|Q3tl^`0<$l~roRewAoKOx>5OLWYab6s7CuZIFG@UL~ zpB;8i484Ggpg#*?XogXX7N-C?{mH|*yPHs^XKfuWTg3vxK~s~cx1t7;lN=7p&=>}q zB{R?pnY=BaLovV^uNMoR-)>zP-b&;GNsDrHSZ7U*TYY0gC~QD>=;+`{?)WPg_|S*p z`HL=9R?=5Hr-Y)sM`FfvP~;mxocIdc>DEKQlZlKB0mC8in2_PBygN1m0zX7r6C_W& zu=4}v6JP3A-r~cW3_j_GaNu^>Oj@P>dX2p@emCmnpGPt;;5Skd?M#@u$U;<<6riPk8dA-jqG+zocU{(6Qq zU+l{YpXt$2-8boVPxC_w5HM46 zQHx{<&F?t4T6C@W5(G*0nc=bdiZh$V)ng;jmC`p!W>Gaydkk$x;lf-p+Q^h?66WK9 zL_rp{cYql0oQxx9zF%5t7XGlaV!C4W<)iiY2?+&6o%nT|UGF~(#X2ML;?MGlOCt}W zprXQDu3d(x*nBmIv{_NSDU|;>-YMqHf~kN)_!%7J)k}~H&ngUxHk0AMRFHW>FE`_| z3{g;Cg81STY6^c2O8H^`@z`Kdzn41p7wGBlKD3FmsD0-AwGBqC=xt>_Ta@(Ei$S0}TyM@(%f zP#vB`kEb@q$7dAdznHmK6Lgzh9e;8f77Ye!J?sptWd~xK*mJb@>;W=3!;}pRb<%KF zoVA<=|HLd;VmRORUg?+(Y(W=E>F}t@3KNRTrn9GR3w>TCC#;f&PERm9x8u6nSWZ*vd|aIh~V0O{_v!tkB=_mZP-%7W7$&;ph{Rw=Nq1j>SpI1 zi0bcK6dj~cDa*ZH#Ny}Y*{kAD`H(l~t|t+p>XaKbR#fR5ZvhSSHJ-@psSE`$2x37V zFLORk*SX_C7GkMLco0C*Zn|76T*_0jw)Fk-&oXHS== z;D4s`k-CC-Ldn1#?db$^uNq0UL*&&ebHQSLo)5L6Yl1?0BJYw(1`=(3%5vpas6Gjx zrwP{zwU2oBp(({tXm`8g&PWWHPFuC+UJcLm6fESDyCr8^s<*k~-*(M!F|>7!RE_Vm ztmDGT+qh`G#I}+ChJnu?s6A52r@mAxWOHTE<&uDYj98MB^Os3B!nsvRQFkx?2MQ^k z7Ppg4*i0Dx?h&K$oTtti&{k7B_2nJu!iU6{Es?p1DiuYM`ZjCVoaWx?SxynfKATS| zjmEQkColIjnP2ra_XDMC)XDBvrdASkPo(Z;LR;{t;0-Up^d~f%kuBw+zA$h1xu?fG zaGG~&Re4oabIv!5YRI$5)*Qb!WkXBf@lNPx>Pa4M+|G8=buPNQ-Vt$ja&;fL6m+9U z=Seb7o(!d5(iO!WxviWWeYJI(#plXMQ-47nS=NnrRV)|18#aPUXS01j)Kwuuv-gH` zrMu861|cq~L_NUwCK=J8br({FN0L69Gw@1$4DRy4v&^9^t}CypnnoyC3h24#}@U{HiZxLZ+rO|0uK4Mj<&sI?36}^Nhgo=S-IXlTWkH zDDcjD(x?aJgg=2DU{{8=TcnthwBdRJXZWOa(8l$yH6LX}6*P?p$HZc&5qim|PAVhy zM^kx|(Zo%;c^90=zUEte+_;~G)4WOw+ke%F#j>R0Y;VbZ1mlmkreC_gL;TByaU&ZQ8TzSK-g(*&*!MNM zLy}C-5mDW)xjaS`tdIHWTFnJVt1EQQEw=)iM!g-&FP6 zsl9U%OSe$$W@wh|gJr7WDl=^M)dhKoJoP?Gh5$aR{IV>q zVDpY1-7kxNjXs909vznRcQ+|Wma3iRP7s@y>$E2+dW@_k^um^oj6V#&jgPVLVb zGgF4{DC#@n{qcduatAtMRR0$gr<(Dl%d$goYwLBAa-qeyN?r$j7<8g!FILQt2&lQsNmiz0I)pCmFdN z-^50!;3SD{$A^Btt@tuAug@3`60=%&{pFX}e9m5^YOR-3q`dVhS<)enNB6;J*X2=^ zCv0CO)@McWpke1T%aMDQ{ScI~R9k`*+fUddeOrA6g8KK9GqPQuX+U(WeNu{L}vrMNuJ+FnM|qxIJO zO=NSap{tx1-e1(NTz`w+5%$jYrpeOT7*yCz&ga$X?q;w3opW?T%}de~#Y=O#K8ADT zO{d3K29nAN!k$~axjM8MvdGGKSH-bR7zTaLR_0L&Ca!$!TS*E(lR{rFCvUv z&rrs54+|Qb3oEBgo1{#_X3Q^%zeF|7dmX@wdcYLRLVyQx>m1@F(W6=d1(X~zlR zig_B7ER$}EKz@3GT2fX~TM?K*0>iE%3Da%3id2}Kji-G5khXgGcZAc^_=P z7k@U}&WzEJC5o;*|2*fRbqs?7EIUKQ$2Ct8p*#X#A*O({o)0+siC?_q*?>MHDv~gB zbA0BCmLqJFlBc6Y<|R;IfLSqiqaY1nW2#Ohh5{4JzHuKu(AlC&28(mwM$U zPh571PA!EP*tVCJs~kVZnT}hX@5hOatPc^Nc*hiLN3)iCntK;uvT$q z!hA#LiQmK7kmosnlE33TptBY|kY=R4@Zp8NtLQqZZkFIjl2XzTjL9plIf7xuLjqNv ziFBj7Chv$07pQUhWsx2#A)R~HGsmU_>wVAcawxIWs*qx$!D%m{T&MU~y1|(j8~Uno zGpwd@s{0-kY1~w@Gp9+vBcNJHjEK&Rb7jS@#t5^Q@Ofv6qoh!6cKPXH-9h#x>ik+; z73FAE{>q{@&mhuHYW1=wK~WX`m4s2qvZr!zMl*Efl=&|SO4f4*&uh1uYSr$g{tTzYcygfUN6#Ddoz z(5|lOt6^mp@GbzQdF`c_ICu0s>bfh1AI?dv_>fOoq~l+F1WZmJj?H3$T6@A2)s*-Y zuaokn9NM5Ut>)+Fx=9ynupX4f!pAGk#}>y)E@yJwv@-pQ@YsTqkF}pLSk6X}j88S( zJ}QZ)SK$O!y`%%i6H(zJM<^}NB?Skj-X#(Id>hg`&1|YM7jrL8O9VL0Un|LETzWs* z0dc+g1}zx^5oNstAJ($corL@x=YksE49Y^rss*#eXR$8?aN8KhBA(X~HYnfkWW%m8 zRE=w}L5EfM9lBEQ?5KDL`L2JZ7Paa?{YHnM^26unKfR-%eqBC_+a6$>6?Nlb^E=ne z%Jp={aGoZ(7gS@#m8WMRx~)z-*y*`GJoR4wI_a8B5oAv54J{iuca90Kvk+Nt_jSluNSC0La-)9kV!>u%m2 z{uJf?Nw>qWTVv8?qrX~pfZ9(;w)8^CTzO$$xEyN0JoIy+4r}fFOw2``YNGp{ z!yZ}rc#LAE4`is-4SH#vKEe-(FzdSnBUZHG$U4(dg_JSQnvYrL>XQ_zcG<1AB~D`8 z2rH40yb$-?aX~Gn-b<#OqW{CR_@_na5E7Rct`4$QsY|j6<18U@s3z62=OW3>V|6d$ z`)XB9B|2PR(cy%e(}0U%VeJrfO6@%*5su|O?Zzuw07t@@YK=VL&6~>;0Ec3BTATnr z{w;^5IZw5d&R9vyRNOdSBU(&0D?|yYQ5A~8_)S#qs(Zc$tdpJTQyuT$KW8{amlcFf zqpf`BTp2fqnlL+!b?WK+qdly7)Z%32bH-B>Z}muV@;+d;r0EJI>#uW-`4A*O<-edY ze@aP`O5wu&N&b<5*Xhr?$>d@LUIM(VkEz3SntFnA*%Kx^p)HFIHWsQctC;Y)CFq{J zdqWP*z&}MnSdY6(14+VtERiSR-IthX`@S!7mk`LB9!qYt$DKuRYkxLSqD;W$cg>?C z$p(G#Iiti(KvuR?Nyi87MZ0bh%!Yw;1Rcz!Ws$V_XOtsf!`k<|Kl!pkz3OL(7BZ}e z27gWmRjQ~e&5y46-o>7G884O2TLegW2!}H{zsN$*4EM<|x4n@iZgpn@BJt^HZM~r3 z!u@U-+N{Nkipgq*i{ZWH4_WNRto^FGXJl;rh5SR`o@9DPCO9Nql`-)q*$TamgAO+2 zGq=H;PnYpZZc>}1Nm|U$%-n>ey0e^Njff;(Vqs!pFKHvK80@nF;)qtDFg*iFWSI z9YjwUR7S-zO>VO{bmx2fJ)LXmWaw?+K<&zX6eMp@9&c20`BlUDv$Z{HeGECY-9^UC zd{*zdWBXPO?33EB+pA80dVMkeR)R5q)w*PEo!09>+{f3A9^#iJth*_`O`fLe`&tCQ zd{TzqNl3&&a$2-#)!QnYFthKbyI7j@y;W^Q%U)>Py=l|W?Ad}@@haq0-XcZN{j>XKt;Q~;&Nx{f{4G|$Ax}g zjM}SW%~TaBd~e}!MskQ17B7)6<;P# zB9?yh++~5fUaNQI@*(CIZ++OPd`ZIpD3|7)?S6cAN3qmqnocCM(~B39W9>;d@twL$<-06Lm}B?#`ez`7ga|S zz=*$;GS-7T)jZ}_Y2LXefsI=H?lRQl!q}WZaVQ+=IFf`%@5v?G@Uit;C++o~YkJH1 z*sfta7JkjUER>Zw1sFra7D^yKtn?*qg!-o-u(<7h3H29=pA5A651+UC!*S7F_`%1WpoO~}onqfI(i z#C+Qbo`ZKzLE^-tQyGMbefaLAByt(+3&M)Z*ZkE+TR1;|uscCi=4cbCFjaw!62Y`o z4C}F)db9N|!cfl=19D(?C}v`uk3&2sxBe@)C*8u9rzc9}QU$N_@+e#lj5NZvH4-Oa z?rwQ+OqFeMQr%o+J+>}M*<2`ZjY_YtK9TU*)lnG~F`Gp4g0`60Cw{j4JvS9@);l)V zwR^fgiX&br*YaGY*1T2Pil>I(d-IETIIfk6U(%B{izu>W-{_4uca}r&XzYrDEKcZT z+GO!v?vc}gm$gSvh%X$xb=@$oM)~|r_INg;Y-myxRtAUB^_HoZwHo>hLL7n;Zo)>( zD%xy!_|^?aWoP|}g1TL)yeN9rTJJvW&b(9D6@)ppfvGT5+b>r@&wCn44>h6z%|i?` z0{^9#2LBg~hdCJ!uuT;WwSCU(c2eosbLh^faa)|6Q5A?w=zMdoUF>ew6Q2jJ69qgX zR+H9^kBd#b+f3|6Go>{!-e`#Eo_LG)>ZR#8rYUY)$%o)B`ITYH$l(o}(C`M6QHJNQ zrzbyJL&!XvvboenZBEd@+1Qs#rol0;o!+O?TgDQaf9)LvNtcN~=1VbkiwaoM^)CM? zZ@Q>W>0S#2O0LrwC08L+?~guIy6z z-o-F4Yjjmzm@zsd77`Gy(l2P=9DAM13cu&$%XjB=o9#3%2>J9G6%^ZNa8ouFo@uNs z>|ZNgO(@Vu6Et$=q;DKC7!mWq;XM=R7!Yoc{PxNq;9ZjKQMTR-i zib{;-nAM5t9<*kjEDl@5=sMN9CTs7cSd&Tr&r?mh+>cGfbZDD1vdzk^FKZGQyS>q3 zdBmZaUo;aI-S}RtkOC)=9Sb9Df zP7L?vjKy9vP{4~z2`aUtqC)x%hQ5+xPl0uG*C2Wlo-Ul&?5SXD)IQ^FRQiRNs7aac z(M!=@*qY>0Opirl^5}55G}`ItCK>$ly!1B>~36Asi zn5rnxu$E6mnP$-APkw&4Y7*syGCLS;jX^!#p{XwR*tT^uIjqVJpNBRxri!|0^4VoU zyT`B(^Xpev^K>+2@L5SG9wQDjj=fM`^h{IbLQq_fppO&Fbx(CCywxTw-Zx24S0FFO z;PxVGS{vZtxSjWSzG1-m!`STsv9@V$Ob+|f*?ye{h@OG>&wK7WXi`!3$6CSMl6K6? zs!YqcEfQ`$W3C~^e|9PC6Jpck9b1P5{jcsK^%M6M@V<&{;6XMMy>|4yG1XT@-|1bf zQC0In+*AV=ZlbwdKT?QN>6}Jl+_P3hYa3Ipx7Y$A9;dH{D5`fzCGdY#aY!P&8;r*j z+xgCaL^LNpeZ)T`+S1JCtMtfei3h_=3hNgc!Zh|uVUfl*19&D`7e*03 zKG0EX;8suL$SIf7Baz7`V@KCa3~?_+bL+h)@7k+huWK!uffA_DfLlQ%Q%Xo#rVzN| zaVm_0jdB#?RgcScpCk(mS+a5gebM`hglnwt$cF~V9Et1iy@<0cZC8JKg%D=m?X>2) zLCQV06QV>Ym&PYPsV#i2(H}rouwy34y3A`Q6~`D_vnUr4F`W1IrDSsP^3d!GLGdd{ z|331JJlVS_bQSEGMq+;WW)uD1(sECGXs_}ZnXg@!dWQ1)vBdmIu@>Y-`i(ocmOl$T z;d_i1W;x=0Iw7wW<7Bv>h`kUi>EAi=9}ksr`6j`Qp8;j$O-^um$z$CC_e(5|LIDJbpACB5w2~uo{o;mXR^8 zYuZWtJlgg^{~|e~MT?ow5Ur6FElbWG$=+?vkl}@DYWA@u4Ne+&v(6y*Nxo>~o7WA+ zr3P#a3+mgsuNU~nCb=HrlV2JqN>wXlUK$yev_qpA%wx5Lv;IVf_26wZd5Lh@YZ|UH zrv;tsP4^|5=ufP01X$c!q#%1uPn(M0L!uXPeLM<-lZW`M!mBe(40c2zie16{JUyxT zgB)EXHs0}mLK>+8%O!e}nRTcys}-#yJjxgDeRFNs^^TOBr7x7Xb3H8Z}X<(=$Qm@2t;5V@Moyn8O z=udxu_>Rk_LeoK2Ytk4yW%_pfEa4b!&r~9loG;G^G!t`=nTp-p4;x~d=ZJJgPuKSp zM%EkR)kpgcn73B5b2(y=$AEqa-La_zc*@SwG0Z^}zNC4J89=;jy! ztW4G?={8&gcI+|&39notr7jIcR9wk_FMHv}_|5u~scH(n8`-bagxER0m}%+>^j~nC zm{^|GYv$^sJ<2GC@wWV{a@aNZw-<*AuJmnBo)(S?+w^?`wr?y z-0|(1kDn%tUc9&{hluQnkqj%ZFJhkf z$}6-nKD;V`cgfPm&DJ62n!QMZh|>skD(=S`H*|wLtN3NSFGz95xKQdZv|_#YJkhJv zed)Q}d=uBT7iKk*-T}Fa!EVr~s+9WlFGU6;S_jq&D-0&@7&nu(RWQwWxAiTV&xKpC zv#R=H%9|#!oG%vBd&;1Sl+`T4kj=|GE@h)5`!RDYFhb=?j${5C1+&}5`VG7UyzZtg zNnN9qc2gtya?C^Uk;)iF)j3X;6E_G98Ez0yEb%fboelw2xB#*k4|IX7wBi*d>B~TY ztei6F3R$4kj+T=Jm{rEY0?hs51m=2upLMrY7!bW zEN&WWSnAVjYM9e&-ZnDQ0ZL(kLRcdmpaOP#+TBjwtFeIzP`+w>+sM+u%*giJ{JX9C zSRHd6?Y%XtEZapLd#eS33XYvp8I^D2-*(2s?VAM$>X&bSJIuG8`F48;*B$1+b|%w- z@yz{W^!ESzzQ^``l6{YSA0YSbpZ7fmjI7%lTL*eh-?xv+!m>NZ57;w6E$Yr!V1C^8 zoV%TGTeV3X3|oWocE0XBXXir!1-4tG?{>d!Pv`sg;@fWy4A$FvS)f=JnA!(S&ja3X z>%#(L7=ZzF96&Md*6cbC)~$JbjKI7_;JG`6wcjg!S%H5Bh7>PHWQog^b76eB{vRUiY^p&VC!nDlPm0HDX%1~d8zT|&1r66) zWik}C&G$Rs>g5trrP`ow@$7z<6vRQ9g;dDac@LAikqVLxjWfL^koc2lt7c(o7oJP4 zy`_N6?NOxA8R5_Bsn9xKNaHbIzv8wZzDIiheW75+#)^&BGz?QFwKoX81DvYe^BZKb z@6oaQkMH-pT5RBKKL+f!SG=b_9%y{{{h3(?55H zzLYGKC7<2{JsC*z_)L&QMoLBb4T4Ge{%JxVRC{h{=J{DfID%Dd#8zmRsZ}(n*JjOO z+%{haH<(3{X)qv-E9^QmJFuhO&OOCKkADXZWigp}`;3LGt1fIgDH2@kg8lq0jip7h z`rPNNBs#`Ctxw5xY|SsGD7&D1?l8Xb&{vryiy$KdBeth9LmaO)npBUtbkUj0U1au( zmIMxN5o+IS>``y*O|}wCinEWSq3XtwdW;v#oH$Ep+}OC9K8Zbg_9jkm5h<94o&K{V$b!7lj_PJYSG^}RoIn4z&YeLG=NZ}CDIt)Ba) z$5mu6<*A{!Jts(4-_C9n!TIwk<|rqH3phSzTHx-cS4H*cx4({ls|XsCNCuzlUUY*# z^5eh?BJ!vcGy(hKm&n#WD`?O%`T;STER$F7#&y=;Ec&%^s z?3J7gHqm}zTAQ;g@EzEuwzzd)g!^Lr+6?(ATnnWb{j6nTHB8^lyXA4+9^$W+BQ=4` zKi8-*d@76G=#E_1WSVYR!gAglLJ#*qj6t@kVdU#Ec18FCIrTP1^rWxNscFPBs8`Bk zFCxBc*Ur}%mAZ5p*OWFrDX28WsmRUlar~<8BKnxP1pz4a1LbW34%xPn9Y(Rh_9;0I zDAvyJJAMfhFeH4BUIC#99TU(13JeKnV+Pl&WIEtgGW}kyXe9x!k^#AI=4x*^f_Ip& zL5l)|AbC(vTS5oYWgqFUn~dpmgN}6f0^w7}h}`QDdo`(|!n=a+arkAQRnkGv&Nr?( z)A;Zc<74ANck`N%?ho<)OKP|*!tF?=O(K0`>R~sR+cdCNovc&%8m_BbFiNUxBe^dM z!K%2>>(CG~f`SK>LkSK%V7raKYPSPMobN?vr{9i^j+J>Uivd={9n*fdajT{5Hy-~l z`|Tzo!j-AMH{4-HQYlR+M`A`$0v&fBG+GEL;ooANjLacaGt*MNR0Khlf=&%e)S&!7 zFhmW^oZt094%M~A`KvyN@>JS?_n7{=KZp z&hL@67rGuOS^uFmWd_%pa{ekq^A}~k-lj zWqrUj{`2#?&hv+?`8UzkLCN|LZ6m-o0OlF;s|?6rl=X4jMzYZ#vKFvL*99SKAmzU+ ztKD1%7`BlGY}@#&jK$xR_4c}s(>ChX?UD6WbZt(ls z`&C{6a0q{7)Y;kSI9WLf*yxy;*uizLS@zpTMu3Y4Jf{y%*ZGR7#c4Sn3kxle_t)uC zk?9=SFNwjN<`H9NM)3$_iRTvQA`v9KRzsR!M8Zs;L&D4}CD++it5m}X%+i*ANReNp z#LQOf`;re*`|gFXn{en5c@bC>pfCVwGr_?CY@>NF1l^k&--iJcz;gqHDo4ZMfX)1U zf^L6^b7%;NIV$ofI2FE2J9ruJ{P#33;V>Lj+{3 zD3yNhpEI)W1B98CjtRId0&aG}KZEw$R?Z{Bfdaq*8jZXyG>VIJcF>S^-+~~=Q$V>p5T_-Xf#91LU8xW#r1!-x)5j~iumI)yA`nl-$pFBX$i-YZGC(rh} z_E_3~cla}sChtAyW4|5r!Kkl6iTh8DEi0JDmI+{`I;6M(LNiW=BN|)Q1IBhMhY41O z<kEMz_3g8s)%_8&NnnsmY)}rSQhsvr*%#U4O3)st@zG(fF0nbu9s-<7 zI$5qkvBeRTfuRqPU!i$D7bVt`zu+r&PE6FdiVcgxxpWZmDJI0S3(Y1dz(85%-5Z!g zB!_{*BruPrgW>Gn16}k^!_TW-6v|m^JE61kRy4XK-92zdvE2LkFvdg@B9;AZ+#(4 ztPUJW4=JAWeHVJhj?f9r(8NFpoeh-H-Mz{MJ}EeCf^1+L;9teM`v3qKE04-1xV^+5 z_V<6yl=eF|K{il!`N)WXZKDqz5dR4x2Tb(w@H_sLDQy>#pRfr6Y-hW6b2kNaWJJI= z!iNrz{{)f!Cis7?BfH#n)1cV|f#Qz8hzQsg`d1c}o4pL_6DK_T)tEjy4H+Euv2q`H}aBEDllf2t#HyE-zD2P)YO z^n2_I@sBM#JGhp8i(PeJr1vjQt?ecL-_em>L_UAQTLYydf77zFgKOD=K8|BROg=)4s%40)@%nwCzA`*{;eR?%X$%#!TI zgkc=t5CkSb#%5QHe|&OrfNkB6BW~Yb;@*?%STOmSEdelb-PMy`d}UCW{7w7L0k(ZV zj>w(kpnX3UOn#v!yO=Pn;NJv=2`CHy`+kN)WYdA`pj{0-+(GuMK%R*SC|KQ-PiOwt z!@vTxUNVDy`O2|BoM!`C4S$z&d@QeO8pVL>*!*PhF~ONm{4P%(NyC(BjaH@%iEB%P zt|9S|uPZOVtcc@{m!NKu5JRP0Hoy0oXADmrgKvJ4Z5q<8eH8}5=tf*B(~Gj~O-3n( zD@x~3n}$`(i`0m4NC?Evo|?N|3GrH~vK93Pbi>O*dmE&)_wKyM*Db$ORy(e50k0Gs z>DTi>7!wic83h@|ebXsegh-r(voL`zrvlCdk_}yQ&z+4=zBf(i;pHD88ig!z>i&z8 z1($yKsjFo?h@MZ=aN^_UM#dB;>gcV$+?O;!d#)>!X7_$9-;Pkk@6=%62}T&qF+GE) zUv*#WabNGyY;87hMX6+n8#JVUW}@%dq@bec!9d#6!jDRhb9Y_wOb9$uYzb1s#I3_pvC2<8@O0D9!pX+Q=vzBoOhAx+*b5W6Ah_|BgC)0*(0Nc8 zew@=I$mJc+ivo<7CUj%P1IzZy2BX6mY*((_KLvu-#cCFzgpI&!Nz+F0b09ZG*+shb+b=ZOTV1g#yXYBfW;BRH3GrmT$Ht+OoD#&c|n?GSE!wt5Q{IA2>68>^M)X!qXi< zI(tg~O{2jky#>VP{9@XkV@ z2lM9;>^}&Pp7;kY68B!b{9jMl02^dih=1(Taf0j80d0N%9+B-O{!ocyLgZ)e1Lp4% zHb6P|Uql34hmMKqI1oAL&;ec~Sf|uq4Ms6{(*x6>6E;BE(qBXbTn`So_df<5+3&mk zk98#C$K}{M-Z}_70u+7xMMS_g@z_tTp9Z44h|HY8n*@c(U$pG3 zKy~6SyoZW%fIiP-K;(a7*?(q7ey1a>yMsgbHq{^T0-5!{vnYSvJI};)49S|ECH~*h zk=^Uc88p04|J4!Jzd1yc6{y$(Q%8;=RkO3iV@KqtIsx_4^kQ4|75 zJ%gtZKo9%R{i(kv>K)?9@6$d3R>9wD!~XWD17YCr86bX7OTfCzUAfn70%u!;YnQiZ zgpOfb?{EwrqpW{VOTY?cCMwJm?$f7Pox1W7yZ*>pIST{d-yh)@_!$Kan-qw((an>)+eg+v_?`S^u7vfOVU? z>_4(T{0${5kbwbnWB)2N-Ivz<16qQeb^Va_|7BVN)@_EeKf(ZPqj@kA{b_aPAJ7u) ztm_8`K#t*eQRsfZ`_Rp*;LsAV0_1$V8}`RZ4#tiLmwk;1prrZvQGS4yfE7r?09{f? zp(WT^*$;XD4`~TpJY0zXOH1%|46_16gb$jb4IDtgwXFa@%%K4RNaR_8cHkoca)6_a z5pa%=qydNKi7+#e_1;R60aOumfuikgtZa-eUW^Q^3~3Au3`{4UBCu**DlI}l<$F+U zQS503389OCH46$7P?y8tBrL&Ya$^FhgnkamKC1u__8*n5fE5VL_IdHZv3Hbojd$=Eus{!N89`y zLVSS_0cG&ag>|2djzibFp&zVv?Y>fQL|p3k1aZqwf*58EmmicCfQ)6qIheq;%K*pI z&tci81wcJGCqPeql%{P~<^!=T5Y_z~Eg+`I=g3c^Vcl(#kKgIne*GTp3MhI1sbvP2 z`;Cd^R{`w-%ghK+ZZiO>q@!7a{UI&mR@UM-G6yp9h}8tBeJef}sv*?yJ}_py#UgLb zPKPdN=TG+jxGAh}5j=k#5$gP!nlFJRZIEyJtC&uxe3uO|t01EQCTH}jYtWySt;Vnu zqCGe&L)A)XG~bJ~0*ukU(?BfuR)OlEyIs+x+KBap0`_gS)H)q;ZV@`l$M=cUjvkZ2t)%zA>)? zTMcOb+0M=%f@qEvT%x%x)~25Wbnspa2PN>_4 zh@v+QmPY(&e(3oY+JTtP-YZBSp4m(^!ifa#w&2@D>MS1^Q9x-J zNN-^8BpzUE{&!5l@5}mGx91sr+a-reLIHEbevT|N8&GKgqO5;AYzMcjpA|TY_qt|` z3|p5&zd0hylvG2a*iappo(!ICZu2SkSbH#)*`r$!Q){&v{N4q|wx;$ZtXbsRsv4n} z%i>et21{8NPR)}#Kil#VCM+BM@r1f}u1Y@FfQyVq)u z;TAbsAT|1}#zZdXFUTVkP!$*Ymo06;inpzed};D%SAR@lAb}Y89&$mxwZKAReWrfJ z_3Qx66cj^bzK{yDyS}F!21St*Z)*3Z8rIcSXBe`l(;}j2!6|NLx%X6)*H9m1$#+d< zn_b^Y~J?qYRdoWF8FjGQf?g?2r9K7%X0=yGEs!$v> z=@WL$FWy9b%Pju07wq8**d~(Z2C~#u=A7316duy_sm_I3)Oy>wJn;=P!;fMT|DxLH z(bp5;#PPvm_^wWHau!d|qUMMRp8gobf+FILF+O$^8m7XYcVQ1+Q=FpH(9{`S7yk78 z%|cy`*T>4$LM+SKv<|P+r#_SwMwCrTqC?8cBS_T862Fkh%FC>ApHw(U%>SCDg8&lp zyr7Y9ixhmPWnuBk^L&QkYmu?M?CfYA_qY{sUO!sK{Bll7RR3*02bdR=$1-~ zg`^}rA~8VdzPx6d)lH#jLKLE;@x)Luoi73_nd((ohzK!r<**X{R~CxrS-L?6982cs zd@+U~@&Zu874J?ru55IEG$WIvqr}v;D51SZM5|nXo~T*dY7R9p;&Px<%Uw0sYjgvntz?{+al{L!SA3nAAOgF#Usr4n3L zXHt2!Dcy6ZWU;TW-o_evLG=owKf43bWiQ+>ZaH%2`n5TW*}T!Ir&NJo zwa6#xu6S`>SDE_oDYD@Vzt+_vWV&F&%o~F6w`vTh*6WGTu7&p1tTUt|$>OCTrPz;} zNhtUi;5CMH+E2z;ui1IPI3grPTJb=57kbIHX{Ys=POFAO3K@ikblZkBlG+R1baGX= zP6YM5K>1O7hcYmFK(-a*K}_RFx{h{}x@@bh=woz2)M*KacMHr>#KtqNgdZsUjbaU@ zHnjLjC=j9+lqSoXhqDn>Ki-K`;1i0YFYiP>H&?%j;gl+4#i1yw<&)UJ?^OB-hLjs; zX%@n?;v(e0CIrXg1_+`%xC#mdPzg1#PyqK% z3)tI-N8t~2;UFdDvFXAN3O~_>2n-oeD1h>;!9oGtJR2aLL!$uX7uW$ht|Qrn12mK1 zH&%SRYXMsqJaRbQ&uZN;M7|#x4xM!7dw#i~XeYnyJ&W-I6cB%Epjp8+&;X(9;elYL zV*tXDqXDr$w|4wM3`RtSBZ2@z52G3s5Pxc;!RDm|cIx4Q_!EsdXrqsK_i_Y{fcce1 z_@H1kfB*s{S0y+{6WIKeTcf-W>ns7;<|AvwA5&Bw{b_`jLhHWGwkxTrtIYXm#?5U zgAzF?vkaEV!8Xgk%4_{Sk?&7w9gE1NzfiG07IJr>Z1zULt2_>o{}0UP^@Ad>Ko1E}x#RP}AW(J#bk?mKZ=-(6d_PX|j zK)=6W-X8+}i$1_@(!oEGHMr3xKreqB+xh^R;=k{gIz%7fHgn*g$Qs-*lkHbw=3m^` z2Mpyu-`9ue0|d={2gY#?ZhQ%l^dHNE13Zz>YodHU)=sDeSq8R`r-2(xk%s;Egye6o|qLR-5gjLfNM0j zCa@klcXHJ6#5?Qyfx-WgK0r>80p;Nf+1bFRj|0Y4{9M`xx()uM4{&>BKji)YNgp5^ zNG3Tjwm%!#>~TQi>(GGwK_B4G%Ju?s#JlLf(+8Lbst+(0Yw5p9m#qTt-9!B-y|Qdz z)5mQ^MTb0*j@}2jv#uY20P_g`)nzC+eSmD+bZY-`25n$ z(V{OgF+pwkKTPbhflUerD{&x ztUoH1)0Y53Spb+0Lg zP3Ck~Sy7lrQ_tJyhWpMWKnima(J1x9o|B=4MicZB#iQx03Y(=SGn_MCNznRY&3>Qd zr0|tFxbiNIm)0_PJGp|A+;q>Yrs;n9;*oQ(MzN@hrI41V(fHB|A=L!sI3Av#m0-t?603@i*4!~KDG{VZBn6~f8j1Id zo}WiOoO7HL-g`gqKjR?7%dm@^^n#S#m}$%w_(7$p+-9HS?^tkzo# zzR~^26Kh~#4NGgiS*PH|~`EfTKlyF~$vtJNeFPv}^uXD_LsQb$8k({`3-iN;1 z#+q#& z&sdV;A99v4#4+{25S5R%_fg{Hm&?Nwd~Ii--p01%AWV<=UVvTjQID|KV#Hvj)`BT% zmPvtmIZHEKiHeIoLD(BaYDF(J-T>VE$vm`wlm_EwzI1T zrj2Wrgl*}j{G2)OucAf_l(ik8n0Af2qHy|BXJ$N?D08e0DG)?xwpoZTAri!%snSkXsLI zpu>`mD9tnXxCmuYo{4zKg-<^5h40=Pm*NOX->z0Cw6`Hb=?Xf$?>33ASF{}iU)tA? z$faXELEtdUVyPaZm}a;opo+FLT>|`S5VjzTZ(3Zq|o8IYMFsLY`pvUqiOtA zQ883k6-%Kg9h)#BKJRLJ`R<%v4cHMlq9+C~Hk0b3q&xCPZmUp<tSAKW(SBX@^rX7liKrr?UPs3xQ6#JldIPiJpi>lo# zMTO?RjW^wxBdeZCd%QIayMc$=KWCx8@+!4`xRWj;Q9|Icz2=-^AU?d=ZFPjq996So z43;#L1_l*v+P9<{94@g8=yIcaV=8==8_JAVDO)l{20CFtVKA9F*j0~$iqh(q?K}{7 zUO?Fs@9O0`l3l_-Kv*!oynaF0^)(x&l%bWeg9#HM6Z<&@+UK8`0n*O%)AQ$_&JQKO zJSF602CmZoY&Q~^>0PLu#Wr%iYDrH;LxJ$L4i&Art@|n(bZ4%q z`Su4$Z$3{e!uv>p@#>fF*+86;bm$I4x4uKB$Q|)g>uhQwgi#$=no6ERheb+mN1nW`>3_qk9p&#AI_4t02_Yi$frGDPmQ_j%uNsnXr*kH^~+upsq zaEY^}CRv9~_AMvmIjM&ulOV0HRjpQGD1685N$T1jmiwe-9<)3 zte_u z{0t7*Z&i~a&V+f}w-Q}zTJ0#KG)qfpPxXIQtSr!8dT7!6Hy=(if{n}%h zb-4|%`>Zf#h9{u`4+}t%^k_3P@G1{Z#x7B{9Fmkll0e+!Bb0-ogn)Pk(S#pc$x zveJjo_EbnTqKXp!iJf5?-Gb^UZhM1xdpGzH6 zF=xsWlH4v3bv1qm5Ss4y>LBEGuX{gDgKJu7Y(3WS_Ub%~HS;F)BDi)yk%lrfdWG-^ z^RmI#>Gbs8zRuH=de&9%v);||E1bPL5M!xJ?2zzKbWykJ&R%hEj?JA}?|2CxHp-lx zrHD?co=<=gQ22#X#QHQ=l5Im(`_bI(a*YA)b!fbY)@gGCrXWbHm zYsxrcK;ge_cFgY%f&b(dT)fu)9nz4O*N%MeAJU!)ck<7dIN0&UE)fKKH!%cf%n~4J zzn|IkKC31~GQ4X05ebsHsv??Z^%m}Z?6ot#_iS4nXX4&G)u0cfeq7#9u6t$Hc}bq( ztler5quxC8?!-CHIw^KiuWh+s6f{NSzdCp8V889kB{y$6Ta1My+Ekdg%9krNl_lhB z>^<tq6+JK}yn6j5$6IAl@w>+h^>Ceul1s5- zAsZ=)?bZqbDk_%-KDtI9$l5E_()hg)2%-|Ji&+8%&K^;T=?^|!nWm&2xQEFs%=EYo zZ~OXU);6OeT}Fp%AbN9qS;I%CLaY6)y@0F~>~T(Cn_bhqu+4%OibKv}4@p4NW;$qSK2VYBCXg7>675OB#B2%sfhFdfr;V+op%R@8}k{ha1|DxlNT7 zba%80J)!JtmDg5M^|2dW5iitVpGC*bYNxGw;22(%&*B&8OHTB5?m#fH6SioH({UP8 zHl1V^Pi11GVswAG{@ubd5A~La!vaKLO&eSNQ4J+b>Woe17ROfCJ6ZMZ$MA5vcub;H za^pOvJ(5+|jO&dx=%Vj%n|XZ@oN3DRn|4%Eee82cW`WOLoPdI;rPQ;=)UQX~EHG|ShRvnU?;be?A`Ot@4+cPbNM|C(j6Jwj2$&_`O+C0#ji~Y|n2{-R& z*qME#kmhW(h^ve!g|ApjyuJTE7#ckw?(QAly<2;<1|T|Jmh9)^ulx@(TJDt{5iJfm zq?972yh*g!%u$C$W*y6BJa`sqD{kpb;Tg5hkjNlYo?%szg5Z9@6Ao_JbbQQ+a#P;veh}uQ=HwzpJb=OBv|y~Jn|go?JfoR zhDwNdWQyy)Fnwyr>mV5JgdeHx^b!Xn;iX-v54QlyJNTPDpssyv$k%q;8UeGMSlB9E zYc?>8gGmScZg5;qw5bc!ZVJ~yD}xG25AE)Zj~W%cE7w|og7==>=CT*P><)1=X!MyI zZMi0vo-gw%E~9ek9Bw+bMuR8Q68lHwT%3Dx@2H4ey>3Ss+FarJ;aMV&PgYuj8Y@mCb@8}6 z$-?}#%US54RP^#O3B+)@iN)1wcMO#Mrv@jst+}pUc=Y9%{Iii}-XXJ>HCx@ZcF6_Z z?yR_m<`Ln)VeM85Y)-8`flVHgklwi5oFyA^!h+mf>FTZUwKN4gE?t@DEfaOe@7ra{uB?cO zP2#x*F_~$Xg`#PNEa;jwQXx>T^=KuZ`nB*$?$&kI6EnX|P&?}l474hIIZfVb<+DyV z?OW{N4k=;CKgVzD%@BZMm)mZ}FjbnOd(&efv(OA6t(6Ym?MslwBX1Hy7Q8(5tr;8r1~FVL;6D_gAZ@=B zGk14eq2rD*%%~$-G|=hTi5`KaTN0<%V%L>A^S-@No|^e$@hx52hQi5$08LNCxRuBh zof8jUNKn%$gvv&Gn}_D*w;Q<|cOr2g2ioIMf?&)?3V4xn%_!Q9A%?CFF;3^QMMgcm zQllJdI+O?-79hixGyqYi-j&HO#2QwR8U~Yo>5=G7_Qc^ALD-JWUc`EhG};>Pr1gzu z13X{TxIXYW+3L;!(LNcU6T>V*fKjg{8R>Eq3>`=4j$@7KG7@^iEV0!`UlW*%?$)(8Z^HBYN!OqCbYq(1GFVu(VPI;1kY}iT7Y@(5R~|Pw`pV41QjH)67ge8Q zWgrbBQufT|gWa3gM;wx;lS;k%VI}?Bbvq%Pp7hWQyPy|(W%rTqU?NX;G|@TFqFD|5 zKE3bqfc@aI2~l=1A`$iNhuA{q_3SkJq$9?XxsqPbUr*d0hgnMycl9>nymly0BQ(`R zkXGzjy7%&7_mz=`<^-2r3qq#ZD-uiYCl58!TgG2jdJ9HJ91@f@fnQsT@R?U-5AKr(U z6jgex^o+CN$!s0Qa|PO+q}wgTiaTvsi9>;#ZP-xGks?~06i>D-szQZV*afj)qO~W* z-SdRtD%&+CIg&raw?FG^LQ%S0x)>#HM6yDf+AAY~fx~VZg6Pt*L`B9#4;$o)?5l({ z6QwfeTbOfSzO=>SVZ9BugtlVHcsX$-oe8>&)X18D%YJ0V^xWR7+vwW4SEa=bO^c9c z$`4T}&qof&P;G{`RWtYBa@&&E zvBDDW&i6Mlt*jTVsHhCF3NNxfHnU&oi=R}z8?J}hQW@w(A$^}1wu+9Qv5p*0C9bE} zbV-U@(M1G4{dtG8hHr0-bl9eeoka7}2EBYix5JuVuA9T9jjUANdkr2bg?Ds04ztEW za%C>jpIUk#)2+gtwfVX$mWZ!sT1xV0gVbW3VOwu68QBUiNX;DBXJBL%J;bD?9&@AZ zLN}h*t)NL7CCFQ9A2Vq+qMRy{atTv5MvRm841>eXA4OfCo3OlAdh=-{qj3ZZ=8!&i z59%y}(v8k)&x6DE{@5n{y1u!`LeOODh@c3?zF9JbYO{%D$!8@s{%`NcF2r0B<$Gd& zF9-%teq65Ch_a-=Yu|HUfvC5mC`zvjNeg1LA)MgNrTs3Wd_hG+XVIqVIVudh%64&- zrT2CU#IBxmTGssgkEk~wi-pG?)nZm6p+PB7$ONHz|rWc8=j|_DQ+3Cn_sef z8HXLVgf^9+cKU*2pQA}e*kfS)t&~_M2|*x1%14XbcP}NnD)a=9&bF7{FWOS_sWmyR z43B~WJ=ULez3LvAscun?Xr?!OKO3OB{1`T9874;&w^HO4dmCb@RHoa9a0&Tt7;0F< zL3lFeXR9-9mUEs$Hc07+gAI2h?mj_3w6FCHi?>#>JfyhEshx0L>N#3SFdXPSD%&Ru18F+bC(4TbI-+CW|<(9d6km&LA`WJ&GP0EGHmWie)B4q-s zVWKPnhSk>+UpTG@Gzk>p8=wT9z2p+AXscE*ft48$^6OvTaeJ-MKwDE@tk6t~zQ3C@ z7Sbs1;sVu@7UNd7Jio1_)t@8Ja@mK5Zo;!OcReI)@5&~%*o~mc&RZnwExrq-nPGP9 z?6QsQlzU~Dz0XL^LeG|VjznLT>!~Df&gqnJ41bN^@4W27d^ZF ziB5O*kYm1do<0$Dh5ErxjgZI#jO8e|v8bu{)9~RRR$smxXtS7=q8NX?JUxCjU9yuG z&sh9Yc*%Y2kLGCF54oY!?mf94H+~zMh&;SCp)lpv{q4}|LWC#@_U1>FO!$bTY98sC zMqBQeK{GQqcsn%bYaI2jG1cyqiulfyOqNF2y~n(a=O$61`!H!|mbaqcf&7W0t6JMz z)V&E+A%u=Wp@*^hV{L8Iz&3zL4)NT zgn|<4$|28ooE?OFkQwG#!l!nY6J@QB?E=p#w3A53$gvG&gGvSr=Gw|Ixralw=_7MX zXcP@;*j@T!hL{mjf&)Fq0xFm=7msd+Nxr=*X(~V=$*~D~!ELTBtiE{{JL!7pm0p)* zb5T)b0=wI2DT~$*WCLq%x`wPQV~>2?#+{3gfFr4&#gC~;Ls+uBrnKQs%JUTZ(#ND!bF!NwU+RzZUf~XOG4hzFp7DEiQgDahWnDBM#J>JS z>DucKS5?bL+*GRiw=4YFE6oNYB%mMMBCt8yYxjqfKvk-LJrHJ0X5@gYFF1!-bDuCj zEe|!WDcnMA+PNopc4N}4TQ114gD;*+p@wJNh1@qDA9Y6U71yf{CLt3QrF!g&ba&g@)8V+eo1mTx`b(zus1)_mCa`>gnLEb!K)eeUd46 z9#_jHN%(P1%$1;;?OPN9dOa!4hH8zSVcLCV4Y4owMpyg?2HpHH5Qp%^1mB_gjoonF zntcLtd*OcHgdA46<}l~98sla$RVCZ&^jAC$Z-h0YGxuC>J$}vW;k`Dd?h|LrjAFPN zU2RE_PVv-ukCmI74jn6cnMK^T%DsrNm$1|7UVptA((`pB70$=_eAS4>ux=q98_A6Q zTNdMcBwY*~&(sc+@Cbd67iMscsm59c?JcfX<>o}4?QkUy_AVQm;->btSAI}#>Ui7i zSV+uVelRId%=@exGCQNVUXCJ6MCQOvBYVg)}k@ZJY;T*p{1GTNf%^1H0~OCKyq zzm^gz-$TwS-)phJL9!sVv4$|QsqiW|Xsx5a%b7{h7UGA++B|AGrK%?LphU>+?p9wC zRRvyp{TfGmcXbO&fBti!p-U+nr%8?IBWtp!90}&r7R zg|Cf8uC<`*5p#WD>F&ue#8X+0WzYj{p{ z^yB6jql`Xe80Oirk8IKzEuHAm2}YtQ2ocAt1qW@Mylf_Lh%X7(dXwS%vA1x$*T4!Z zJ0MdE{`xyVSrwsnDr&j{?chUCN)x9_QLYuOYl z-nbeL_X@R5VkboWJxZocaN_(TE{!+g@;m= zu@)Yu--3!+jtr&6v`C`gywx-JppGloxwH03EBx>ccYd_AJg6sQu1=oEvk^~H9kywe z)ndydqI*}bZs5#oiZ>z$Q0UUrRv`7bThzPiY@yJTat&qlq#!`Y^_a1(d%lLdPh49} z75_UUP@&@T3ieEBHW$3?)Iwpo z%{&uUbNEclo~3TMXVv|u5g?H=hRe7OqobvHALFbRoyU2%hpbW{)LwZVkQJF*uUAY8 zQN&!!Dnfktf(79eUxB9gVHvO5o#B1yGOe{b?upwfltpfD^~%lYAa~>MHH=sAEE{0`i@~mWbm%kF~?Ac@MHxyJ7aQh6*EIHhNI5jYVr)w-)Rz zaPqE{QqRVoR6e3G^nIl4jpSv(K3dimUd@HHg1I>bddQHbkxqW#iJm!}z|7|G5ewr$ zDS{}TUL&shpyTzG6U=*h6w@rda?cNzq8CprrIKGYGn9vs`pbvl(ih_^BoAK-uppJ7 z-|VC1lN)C1>%HcXRTB6J-}l246D1)`5@`dYon17F)f*hRLotztd;H1_kWt(Oy=`@Y zV~8zeL1oYjis+%j)j31(sB<>0I(xNW(j;K|Y!DfOTrX{MA2U(a^CDKYWrfr^36<;};~;_G4$+|3_J z1+|a#&q_@vU>(#NJxb;cCm?G5Fqm%}O8@o=cDg}I#>$Ny;^EUa6(9B=1Ut(}$x1f$!)jOb=@Ut4$zp+_0j$n)xqdgr!^SG`4*%uD4Cox!};Flm_9UCshRdBMUybR zhO!t9WE*N#;U-kv`MV)mgG&MvwK}_ZtCP#(q;int@GRf7Z(a4>OCaB{LD>Q(KMm5u75NOQm%P-&W0=zFS3Ue51a6@@Z*{9?xg z5zBa@<)|R(rTFfx)xd;3U;|A}u;}cK>Gn5j%Jypa>wyB$wxx4;Yju0xJe5F8zq2-=xQY@YF?D)Hp-H(H|6wgj>D(LQhG#_mfGqur{ojeA+vsdphG!D=$ChQdzriM zNp3u}7Kc^$qlC+9VMW7Mu`}6@DW9oH43=`}m11rzY#6*w%r4<*pLyl6TbfD@3y1UJ zT;VEbKTf8EO8?eLpAE<4?)yh(OJUaupJf`j$pm4~L#*ui#wz%tG;GW)`ngQDbnIKf z#c7A6p*w9p!s#`WaepE9B!)$>$}0Jlm(Y}^)5y?$)ZW(8`Xo29MMu1sv0hWIr2|K? zN>rn;8aXo*+KO*{Y0~|-?(V<36>n2i0w2y@ptL`$Q-0T}^p?#k;lzMd5gZx4fe7uu zXmjsPL9wkz4Wp>!?{)m^@ApY4MGMc0)?ASeUPa_b4;FJKH*k0J)-Dd3yGxgQosMSW z#Sx!a=f1^$tcB)qKXsQ7w8aW@1?sZ!zGYL9P6*$d(d&_FccL?&4xIA$-Vhm-5VH-% zEm&H8DMlwIE6PmC7GgY*-kJ0MvAZ~>RynR<80VJNtI1As%NKRAH_1J8VIm4$xA4(+ z=S(jXtV`-{Uw+7J5jojSIU&5`))x$mtM=?DQ;XVq5qSz@>=GQiwIx}qVP>IURg6D&$ z!(i^*yFr%GvB%t#)u)WR@Wljc-1fC&6nRFTOXqzd0winIX;?f{@RR@K-VgFd;wwo5>MM80gp}`2NJHqEUAcG zZ9=KMth3zk7-f9*!A)dx%B;Rp2|wEV~c4c0^4m=o;)uf8JK=2yW3^@IyUPP5=T+z{^hGA zFyb#c$FpmvESy&5EpJJ~6i$pJONkBlJOA|LQ@dt__p4M&UBqqjyDOzl)z@_1?Wqc$iBMsyHRWLz ze|SuDtI{Zh(zWO+hRN+gT952nY3>=qG`zRG4@;dXH+t2r2T{+zb5kRLxa9;VUbbWr82%zy<^5H3M*H{I%@{ASDY1Z#&g@k$lOFDIM~-~9an1S zuP7n58nBawwBUOT_M%`FO+QE*vx{#nu43jkc=1ZniG!XaTh@!^rU@ISTo9H6FV`NY9V3$_4MVP#P+AYQehm&`{vuSHw)oa z$kS2p8C{Ar%e@=jV*aY5r7vH2zU+or0GCyVM-zRjl1ydJO)Z#2&?@fIy`Hv*u)YEr zZ!Gunmh(ZWG<3R<5qs<5o>p%%=&qJAEs4E;;>uP)gdBo7zwe0hL(jA;@+G5AnbWu15L8Hm@Y2gn7Pr@Wm2LX?larOU znx7ST(L6&7NKSh0ZaT&-W{M7C+ZD6gGT)TdO&^oi6V}4W-qSrpwa$Q}wsm+GghbIC zxj&;3B@-LC&1Mft${He_AfaL|C_)~#`0)P5ggZ|M6&WUr*0T!dB-TC~*XC=chRjVY zr`4)&;5J62sB!!%lk0aV41&n(9cN*c9x1RRSKQ1kjy65HNgvk9$Ko4#f_%%~&0HSF zN!?LdBsTck$QEYvbtF!E1#0v7q%+7tW>q&HVzgc0#!PIz=n<) zAhYEJDw)_>Ie_w1etUgGD+fY0px&NAP}fGx(A3!EmmkkR<@|SaOy|E8chI#k)#tY| zwlF-eiBfbhv{WHH?`l!|R;wq!{EF6d05l zbQ$y+^sOzdt$;^MOI-#-1|w4^;KAC_j=`M4hQUVH&d|!j(8%HQGrRNe!eGzfK=pYL zKq0IlA=_u!Uw|9J(8>TP=Z0qk+B83Rj%a{580k3(KR>bn`W$S)7i0n+nSpLg&^Z_O zr)Qsk^LHN4-|y3VGBMEuYWAN#gN2P5c>m9jY^=<{_h19K!P(Ax83@?`Ha+0G0OCd< zLRJpY`6DYEJ;1K_`E?wCP6Z(|8^E)&tC~lJsTVQ`DX&}a{j4+nmf?W^!XdG6S8u0oR1yohWk9~ub%xf z5*DE62zVVMGw@AVKmhmOH_w?lIf4KA{I{Q914x&je`la|3?MIMX9dRc`G44fZw`#^ z^ZR^4;Pdm(k08+bynuk$g9rg-4thYj;R}erX(u^fw!k`b)N^pL0ao`pH#$&=Eud>} z`1v>AFZXZlf(?)%`6TinVrpmaaK0=F&$aQSbbtAQi3wP`s-^}GCicLR`owDR^^&@% zHv^ELWCQ-{^Sgqfa>53-&@jMi@@>WW=hhh^LmLMZLI8}f3(lFD03=vB34x`^$;t|L z!TGlw1D~1_{-oYqIZ_&-g%L4e;{<(c_}V^{gF zyuUgvodN@?&r|G6ctDo%Sd7!2Oo9dDh+6|DwkjWjSY5q$ukzt z;7d!(*Uh)KpRZ;&6wPW&KqC@)R2fL?5Tpcw9$d7eUet>T2Ky-+*iy#lO{l-yKfrw6 zAM;iF0I)d#%5eauY#hvBgZV9q0TUnu{AcB=-}XLz%Q}O#jD6!aCFz14r@zh8Gi+>{ zxJC8bSU5C(nUHfmbhJBC(un8+3TWx9_cU1@!=O;*p$Q2*=gUBueX@)H{327sdiY~tqt^DR9B6JXmv z*J92|%)ho6MsddfGnnT8vll^n61t0E`MM|l1(Sg`!Y<^CBgf7rwP4{l_i zl%l`3m;Vx2&dudlSdcH?#x4vUfT-$IF+{4y(=bgkq!P~IPs4`4Q|W0N!}j0m1ql(m_KolJ%YIN78LW(a813$* ziW-9XR9)->4RAKl9|kD@6x3h~R|C{|KLP6RBA6e7`fIDMb&~pvR?V7>qV~nAwHcqI zt{Oc~CYZ@y`dzCgCQDtFr}5Y3f6}j^I`ZN4SgSn)lN(S!y@b6(nrg`6Z=atu_wm`N zT0KPZ_JvSisBHa@Z{T3dUw_K;+ZZZ3*cm$L1DQr3X?za-FL}pr4|soh1OHz9`iG$Y zPg%8)-OaHKCHVS#3K>=OWv@>TpM{AsIN=VR{IY?Uuj$W`PEEb`n}IEUEyj1j27aMj z_CF6bxG5HZtnlBr>hDFge+cUTlvSro+tYA*lajRz2rlDVhg_Wm!O2 zW>oM?SjLh25!9JRaY&nCI@a+*yrHq+N*hA4yx6Uatoo;fWngOq1GJt$!K%Lx%lPIh`)+J|yv2 zRnB~87~R6f>oj3&vF%!DORDfC-mZ?YY#SNQRQJY$@Ye`MD;FdEQ=&4k^@lmZ$SwVK zqy9cB`w^r8qvk^l*gp*k<6@DfuP>H=jE;xMVit z_*)lixvC`(+wQmVcgAnx?-{u;Ax6lLg=Gm47!{jvxWSYlqk#L&BrWQxhm;QmiqnP` zpLCBbpB}T$_J`tOI(lIMQ5gX!q0-~!()*8E(v;doJz_U6u;~lsi+`L08o0~{_q_Z^ zX{djUv!Crd@#6mi*$=i)O1|G`mcW^6FvA@XK%o2k8{_@6Yw0%YLw3 zC>adST!ZNvLFdx$KVe;eCm8(i&-I_nez1K~&;1*|5nNGV5I_a}Q|9_-`^G<){a^!x z*Z$rf0=94bqqF!ww_kr6*RKT>|NgrEbJ-7|KJ}ux27_@NkhuB+){oprfdD4z-(T23 zK=^Cf-QSS?_&ly(=lZ`{_Ja*juKF^CzxqrtFaTE=7zB`%{~!iHjr3oY{rEhtUorUa zko{l-a$tXRw!wCre{`b!=VU)VkL=g^{$G*(_@u1+8`lcX@(1_adCuScyK&5SfczcV zkMA^tnV5jB?@w;Uzb*a!MfTvIk^NwXC`CLkaHvK^h``^G{rFy77&uh?l?~|6#m~T${QzR$zqjJSl^6yA z#a6#R-~XKK$ESgPwd8>&gTFN6sJzhn{_i#EbCBsh*aanF5qKp*AXNYRENSI6{&^`i zH6;RKAp+$AiP=$EBJz4g*+q{<^0SLdf};ZLMa=Bjf=mmqC*4*{NXRkGjY`VLzA@8g zmQ0($rU49g2-Kdj2030IA9wf`dfQ9-8q0QLRU-GlpdoFSzT zLj55_(*xdbCdOL_JckUpV{1*op?2))1HG-6QtUxg*?Rmcb6AWDy|5BfwLA3g8^24q zOF>U{TrkCiDiD>>h^SqjYF@t6Y8{u`wLjMp@pei}aR3XKsEg!4FOZHRA>h@suCOS^ z_{1xG39OmHd}=|rlkTOxn_lx<-mH-rA7iIwj5?LP-At2r3pvGNcsj^|;_u3j5g7_%3UTnONUT3}slGCKd<@X_)4)p{!|+mAh?IT`ZwT+Id~l8rl2# zDtux#;^2UzM{P|)Exw4R?8#hlBF(ckOm1b|dm_j19#^Eu%1zAcWL_vot>?46(k{}1 z=5XFp%!GY7dlj~@d6)A>4*d0AUGi(P%X@gn%7MjZLg~JN8XtR>ZWv)_Y0;?bAim45 zbnQ-PEBme-u-`oO(k_cEWfTW|lv&C2pSnd0)p7EcqK0KpVO6Dk3}B|pD-^Gd3L zmv$bjDD8PeM1#bp!{na7truM?>Z~gA z_Xz2lP~_xD9awI5zbGCR`EPqn(8arJ=%v$VP3;H9$ zyGfO6T(Tro!Wvo`Syx1YDqbXh)TuL)i$BU(WO^^RD?|5q$GO)KQQQt=0VSN6k{1m% z2vycB)ZDn^)kn)JSSk!@gcqD-)^Rp5DRk|R#3YA@qdT#ci15f%5}phyYvSD-iOz+? z+~V5xv#~UN^IF*BSc^CFa=td%l73IW7Xy6{;>Ot~y7>qFRD*)dSMrzc*_fH$y!no( zOrf{;18OcU9OqY~qWJf1317z01Tv_%HSeRK<3%9*n<5;TrHh{o(MU-(H;ucPb{1_^sYZeDZFjDek-v}~6EW6Zu`g8#X zI+i<;KJY=0{BG#H9}-n3sdxkF@?eB@+1G5x3QtKbV!^0I9xb_}2P)ndAxcc-W#IVs z9ND8#$)k=}Ay@p_qWGNf-OgurNm-8Zj+H^vakl9k=^j!}``Y zlAqozK$?*4w%`y*=qocL34!s|M}&lW?ihUgrqd*KlL(wCnPR}gYPbcLOxtj&1V7hn z3NAJV^4ci8+7DEvA&4(@ch@=#9{I%)LyepTe!RXndeUi~ig7Aog{RuE`E26-F#q&( z!>NT{Y1PAFtuZn~^}+qrJ3Q7MV-wj8Z2H} zy+FC%r&i_9LMDVvY``b~Nkpa`*$od=&kFA!hS)yxmZsQPmNBOZLAbIcp(W-)D}=mz z#$<{d<5Tl!n(^)>NPXTR$TORXYY$vDw^_AhmtL6{MG)nRI=X!Ce0%%%UjxgJwDevmSPvE~;6@4OXZfE4%XdM- z&-O3B+c}CH^EG9}@3iz@sA3NmFyK1=^ZEHXzXX zxPtc};LU#$F#lo4|GS-|-&xFsExqg)3g3eT47iS;`H!-p|DfalJhcB{sQkOYd}lEi zw)Cy_d~rSU$+VU zPqp;21NBxv18T5ij_)%Q|3dTM=dpte^?#~O=x?|5vI7-JKLcv8qZlyK7k}NVzl&hN zw(9?>mR@$oi%P5h@eLfPC;76Very8=BO&tFq5du=`XQ+QQ&#=ATYA}n3X(4%{CmC{ zaPnV1<;S1~BgOKUq5d>>a5wO;ef7_@>c8F6%l@@m_`e7>xM3MUMfLB8WuJ+5|9@%e zWe4v2zu4Qq2sOB289*WR6QKSs4Fr_={@Gp8|87e!J5U_?Gmr*1Dg(-0ege|pM`b^P z^#5v0FFSDS@LQyRyl;seT&~}9?%r=P{Q7#A>6}XE*QNue^NM#yHbM@14px8(8zAwt zv;5@f0gIQ`b+9vaCe%2OGytZo^GDzn3WoLoRl2^RJ>ln(edUM2PTYPe_!UG&{k8l{ z5mpi?{~`gMmw(lrmw);AKmJtyC1T@gbzb#VQW9{-Q{0Rx$TU4F_40LUIvFWhfA}nZ zzYqjFX33EMtNI;&_POe}C5y=Pw>P%zp9pb(Qv~@<`Pct3W&-m9q>uob@*g5C16a|4 z7yk0jKNK|q9Cg2s7zZOz*7y}<%m86KK)-%|nNAO42OG3c!~P01j`Q}-Ke>~yP}5Qz z<3RIRP<3{GYj6p{%Zmrfa%7dSTOiIUaIbj;eru>i(TneJ-;GS`ZR~6x#(-`BM5I#!x+ZTHE(f$XJbk4lE9L2X@`ksYEM?AQ>*$?>tql)|u7^lhXLM9A z&*eEhZx0fbo=ZffSoyOq%+{TpJD6u-FFkq6Rwuh5w~`=IHs8#HjAvyW#~jIRnJQYu z)d$Q#ucz}nqa}Fq5RNtFou*~-rDKP=u1Rj+=80Hte#$b%;=B<$jT8E6bLx4C3o(62 zw#p@~D&KMO5+!m6asuNG`Znd=x`sd+eFcM=cIX~cZ2nA}Vgo)#WG$2aV8H zu*k%)Er~_T;Djy-V5Igt&R#@*I2047vgAqB$VfVA>zdQ+)E z(Zft7xlC*=Xu0aJ_kxn|vqRQFTneGi=yROH@RNe|aAtCgE`%CdVzOCt1qRRVhrA2w z%a1ki9xaJURc9kncI_yVwc@JD;-r9G42oQap(YAM30C#lu*YBe*w(y1oF_F#;j>}V za0B_x-FU4D57u%Rd?=OY*Pz#ek+jUoZJ}fNvL|qlX{4mZ`^p7poH0^g?D3L*e5;O0 zYb-P+h;B)xSF%g-$j6)+&rjS;uitPW2G~P-8pTu9%e#ft+uxoI9pc;#Ut2B8 zu9KU8UqAlNCV+I>C7=7bf;4OJ^5UblX0K>oO$INY`vv`TiSvo{u>$$!U(vTt>5Wc}eT8IpCxdrj$p_h=uvm5~Q&QK}mhP@`8N z#GVaGw=$}Y9PM7wSaZVaaW}%BY2gsCChI4FH4}lS$+xt$&oK$qTcrd|`ZNJ`Phw$m zWcMEM#h}~y(7!N@)7y5xQB0*w3 zHY4R(nd@t_4vE6o`~v0f%^oq8AIVv$$Aarub53NObROp;?pOw>HReEf#EkpUsE}ks z8|V5qQx5rHN}XnpYvCejLE@8uI3R4!T9%DqG_9WTqmUiA>V`B!!BrDcj!w-zKQWZ# zIB2=D{~#*issD}jn>bHU-)ec^#?SNQY&;Gcr!37bJEmx0DmMrYt&=cR6oKS3^|MKT zYiNARFskk+slWr#Pa4I$cI}ay{2n`lgx({Ku3_KE`Gm|l+p;K2KWEq7eXoK05nF0N zI;~JT)-zGUcK4+SS0J<{4K2x-3i{!qw%>`^RMGv0xhJ8X-Tk+m-xXC!5U9BNV|T+N zRvt%XSD33B5OI4jMq1op+=U=-)tPwkAjgbh@0Eg-0NB@CQq+-am>nQgPng$btBHi>cZgBnH+8OV7Zj{P6LRO`#Lm}Tk|H==KP+yW_AFH1_4Nf6?fa?M6H zZIF)5JQu=x?G|STS%B_35ogCV>a{XO3`ecF?y-*aB3Y>^6;)o|dPB);Hi*I294MjB zwlX|*kSQGQ+;}A59E#OUSakUEgloi%Cs562*IeXS!Lnm8s>1&T*39K;_Tk}cVmh43 zk>ME@XE27Zh#L-w?$Pbmjba^uIaDy=pjLQ{@Cx2f|;L$sPdn1~d#7CKbc z4Nn^nHS_E82#e}kKV_<;EITl-0_NF1X18Pcw@Y|KSb#6@=| zK*;xrLHh?7PT7IL0?c6HkFG<2Ncz{{jtx+v0m3~%(}kHG+}IAt8h%~5cdqyGCqcr6 zy<9)gO3_53p!jCwxmqizxSEuSffM~XXn?UV?CRDGvmAu_yWTmR7FY-t53KNuX8)q| zGB~j{*eBsXx}f-W^3MZnK>miFlj&UJ2&};RJMQ_vKKalHf)~ftJW^bw!bG=8K2QG0 z*OTARIP~4*Gq7U0Tr~L?9bv&*`e2_<|M1S>{Fe9E#m~e9gvmf`3+NZIfgdD)cS1eC zg8VDX|3_OH1Bx@Uqx=KPJnu(lKMp7Z+FJrVy+iH2KexCTYuk$JY1>f;85ioN{a2e}xS*AczID;&aloGqHee8{g&m z&&!m+g62DcnI&xXII4>TW~i{1)N!zA;xyD2vE$<@{W2+q%&QL;1CLDF1DvTAahBqt z4IMx0%sgoB!p@`0;>;5!gths2&V%&QiRi-xu>4(`d3JDV=0O0V@3%+GZ*Ek974a1; zOrM2+IO$nHVEc>jS?13>m;M$k@d?;87sIlso{&g&4oiFj7WF4s4!F#4)Xg}|&w;^O z!p2UZTugvcR_8PDCFVo1NjwMSeIEYlMSxu7zQM8+aNRd>>+$1&oJ*ViH8{R?-%RKI zm;VwR%khcvpRD8y95B@!mp>T^)=E519MxjNvU-9BU*^4YFwD=vh@QYtx(JMmyg684 zfa}fy9^fAbMgKS;f89F1 zbMOB#>%hVRu=s2p0>4^^4u1SaVEkQ|4(vSOoiqUIwGcPoCGSiVUQ1BX5k&@RpbC^3Q^TYXQ94zPCqnb(kx;6?&;E&T4D!AAxQ z4b+WtnER+OrdtF-qWAlV%D*_nH0_pC=Sn_KmL1Ohkcq!*Awx%Nq%hqjIY+&!EhkEu z0H2JQN!RYyo+1`|ZT9Lbiz?ntNuG4Jfe~*3Nz79*=`@otEj$fzp=x-`>Ze)yQK%&j z9+3p}QaaGD9yA~nq_)qPlI+wxrr^xpye2|^6O;GVtbM}GP@pwR)0JV0ofk(!m2?!JWhTY>YRi03oBpap75 zvjOL)CF*z!(*zV&wSu;`4hZ*mOvvz#OZT@7ff4FLh0oJV3qx*Lu3FtyS5%V00Qp`g`ksBi7Y6sX z?>}wxNx!ciI0K*#@ShJ}^nh{mZ}LC@*ZE__itbMK z=>IRutAr6p_D>!N*!dUl1NdD~Zx4#i7q2jd9ufaR#fN+XRUpf2T$%4-@v9d7zKY!p z0Py}jSbXE8-{~Fw2e9aYL;Z>cK0U!d!0^D8`VJW1Ro?#HssnESUljddxvwNQ!<{|< zQ)^FuC$ImHC>J9=z(WKSv0`Jmx83+glA8|jGW``sYN6H8AiS`Gm*)YI)vY=aj$1m) z=n6&Qy3m4oC?7uV-NLK_7YpMTICne-i(EX+^U<6n_o9!yD6lXU9pl9?46<;}mXK*S zdBPghgf;{UrpAaMFu>t!<0oc6lk99-yBRI(F5#yYLivfdILxIiZ5JYllBeVu67V)1 zgy94uD*Vfn4iJ5@aWIO@IrQm_y76P$?~%3dDtrGeP~MjV+&$BO2bAA<`}c>E^l(Dt z&!B`559u#K1MQZ?B;(J%g&xh+!HF9P0x6G~B4+9t^L(ad^#-?Lt(8xwZT`U!4)v_1 z`%WoLor>f&6OONve9dFx?sF5tIXDajk4z6=OdFopGlhl}*unrPb;aiX2g(TuTD0%= z%I{HzzXi(sQi(e*{O^GB8z%7+6#ScB`JaPQ<)ogbOvDv<0-YB9dszOEdi=@=d*3Jn zU`YPAVEGLr0jPcd^$7dhI=4$yOqHdfjMG}>yai$_Z^E}IZ*BH&AFkw+34)wEB@@5$ zX!#V11r?$qC>?-wi<&R8&n_Tz@E~8Rv@hq8Gboy@4(K`jQ+5%)ptUFbb&c=Xw)#FW z_c5Q3NIK318+I~ag%p>i6=3ecG!R*yZBQzW__d+IGIGQnr{H8F=xbu+L@qg@0GSq- z@VvXdG>;gCJgsC3_#UV~b<4W0i*uE1=Me-4M4v8o}h~DQkMS-sx2Of&fG?{ z7Bdu}@5uHwQsYqyh>+vo%wN3N%&RIYpQoi$>abrM6hn#|p6xwL zDKm{P-w@Mj?}05tteVw7J)Q!ei_&%{uhx3I%9%i3?a?kNjr)On`X6U%;XkQVA$rj3D6b-Wpx)WA3$0|GMHaSR+mv53jTZ z82F9Gga?^{-6tc)^yeu&{O+RRsd2R6=bab3Ycv$|eUw_ko+n*79ZM6682Z;_Rlgb>xVIKGpkCn5+l^mXVEjep`Va2qf5A}otNPC@Z1*IhXP0N$%g5 z3-POZ&n$pY{{1Ef?gZ0*8jN4*9p4)ApO_ku{<2<`RyPG^mLW^Dn2aKFFX|63;Ouj9n5 z_m*}BL;-&ukbixo`X<8vA0t)w$l7B4RXOK70h-^@{3*E{K%n^N!T8rls;@2kqv80! zK2ov%rGoSCA>p6tB=Irfa|?kXSra3AYP>Op;znCzgQmX(O5bDRX- z?1VFzj8^CY5JM|*2O$b*`i!Mv$fdQhD{QZgQNi*+@H**0L?+N9k&?U-CU$wq^OyjDP!#_*S1!V-?{xQv zz|A%}9%9)CWDotNdw`XqWKbeGsC%{S&0K|x$lsqRpUh6&Vt`oEp9w_UhCSq$Ys>`l zNj`W&4K{vx+Ad*G~{-2wryp!bk z{n`IZ)ZyOh$AF2MA6TouO&H;8%l?4ff0Hl*DiLU++?PE7Cdq!#PXICOKg{RT{i_uFYrFmk$A3XEfEDo0{300lL+=w2092L!{T=u@L-X&62z(=PNOza#^A`xJg-E~vq(*#q zuTj~`{PZO1qt$UF_sD8r`+ZL2I0NRtt>1(Igai_nTpj&^8OCkYS{k%SVI$wI)$?~t zSLMeIw1BNvPv|@^1*F`xEa5-o>1gEZ4QfPQ!VM{wW9}3QbKz3gK9!GOk}yQC=~=W{ zce3re%n7bX2n^$e6lW?3$|NTjX0T<3ay`h^>bkx>We$AUlS}RSJqUjoBDgPv_vQ*e z3K#rsIa93k-;jm>G6;E>Z?2saS|NLCsJ*@i;SU1^_k{4?YKnkr;Qu_5ezkJHjii5D zT#o)5f^nCy^_RU+>aG{I?p~vO>4oF@>!Y8+LWdF@F#0OJ-BZ?1?PqxeKpaIrEk1*d ztvs+r1oeAMD;=G73s1$r&Q66Ke?S)fN?)-cblXoJHi@;^%sT z2j>nF*D8kLEbokWb>a`+;f;`Q=jNaLD4Jk=Y{ziW{b(w}o0wg~yOyQ`r?N9wUoPST z)YD7t{T&Q{EVp=H4DZcMei&i++c5lAdGWuj8~(*e3Q!gM-F}Jdn(5mZ(Bae5-buZF z{RF6kK+DJscx}IaygT~0T|kNyAVcae-{;^`@E0gsXw>4O7NI}zbOP~_v#Vf0-_*6piH4+OpALB$AfGF0m3(P+YRpRj|%pZ zrloIZW1~y&yz`8_ck!v0KLa9FB;Dp_X{afWORI>g*8~0-ShVg z^@tRtqz%|Q5Wuk@RJ?Xs^|k!1Jc0FeHa8*oEDev~*DfqUSlzC#SEp6heB->gO=jE^ zZkb-%nTqHdK6tR=E_xFxBZIUBv8RKI0#<0XZw184#^wNY<$~>Tdb_>KjdNChQJ=9v zlHy*xc((n#u@3|m;i?+S;Pi&7WjVQ5^K8`w1Nat)7Zr9^AK&Bi>BS?9J*!w=Zr0o6 z(0Q7!+qs?Fg9CT9+uL5@vB|a-ny1Zk5Vv@>ucx$ z=@o7c+rW0gHAG>_q$hziG?4PVvj_MD;_>*4a|hrpq=K8^cR1UQTqE z4;OrdXhElWRL%;P6i6p~Z#@!$?B?+hu*Mcxu6%gh4N?siZ-5H*v7wpeZWWCufpqAnjf>zoyQ=G8n9W( zcmIgeWp@e6Cu?&H%9nd^26Hn`oxsMym+NtLyugEgt#LK}5C&llf{|Y>5j5cer1Cge znVN#gn~LI{kU;z!;kvQqmpJ_l0=`F`;+UpwMtT`EOR6L#L+^C&xjX& zM?7TdjkT%#x|WWXv%+gw?1XJbYOvM)^wkO|*fSxAH!tELvt^tgLmqPF4lI+Qjt{?p zm%8exDX`(C-l!{lYFaQtw=oJ@w4!aXK)N76!~;a2<{gZczjhQh3qCgg!Q~-eCX}z` z48a?ab(kT_CsJzE>Y_bq$R?MCG(oZ_`wGM9;`_@oMe^BuyDvY}tz?UN3JL14s09tG z96+%@>{~aAm^6CxyzY^WPG3>kvzJ#SnS&`#rq0~_HRd4<8AVC4=CzydM$4yYOuNqy zZA>*Gr0DwQe1&cd_=#WxPd~uOuLr5M?zB8zxK@_!EQ4)dIC{msW|JKqEyTFBQVFDC zOtV6p$UDNDu8B+r>3QDqv4!ebeMy$apd7lXH5q}m9I&`Uzd%9e6Uhug^A zOc@cxAcUy+nCvm_4U;z93Zk#HVz5r#jxw0$=Ntrfz82wAy#CxML51qQwA32DWV@j_7BMMzu}2ysQ0P?H^* ziPL!9K5@OAE*CFx(wUoC>(?ySnd5zUD)@TT?GaGSqoj>?4+XH(9(RtzCWNB0bfx%HWRV@QCsVUcJK6ig z+*#sCJ%oMavi-&8+pnI^MR&+qxU8MB31i|FY7NK5J;-y_25aX=5=r2ChKX0<1p+$u zgwNl^+Q|YEbtlEBCcBNozWpSu<8WxhNg+U7LtP3d>6(#1C&IknM5#6 z_}GG8v_UHW?SzNPDck0ANm@R01Fq*i$wWx*NwgiUVE6`+cr+6qHY>( z4fv!%A?_oD)JA{e^-#i3kZ1xd0g;}}EhI9^gEK_1NAqaA6I^lDauvRj3>t#8Q462X zuoCU@9;GIs<+w^;o}Ea5KWx{NXJR0Hr?m-t!!x--2p#tbPl?%=QG7yYH!H+8HEyz`ks=M{vLvdbj)atLwiiJ+c&)Z~s*9iFUy(F+HJ_8;}5p z!(4Uf_iE5K`RTyE$9v%ZH-34=HC-JX8)kZqgn~7i(+N^A?L(rQ>IQWz0W(4`Sq6Fw zIi2z!6Nln{bRD0%kv6kJ)}c4~kaLDpE9lKYZU*OS7apIv8;mQIvFDM~8q#e->|$~7 zs+jvg%F(XNx=-?~UB~|Ut%np#X+{zTX--9?nU+@86gFJJ3ze|zO@8FL9H7CB9MUlx zxrXjMlgsw7K6F*PD{jL>@OJK$2SZ`Or`)8{t>qiWYO&AI3Uwr~wCd+H+F5iDGH{5K z8v{RfCEI)`DQ#+JgpDiP)y7{7smPqc*jC-Qo(~UP2_dpk?Bx+%T7McgL7{A%=`=m? zj>1e)B9?yF&;rUcY+d~-ZV<+=GeCXI)<1Q`-1c=h_Nz^f!yI~%?HnOVfe_V3g!+J% zxzI;|`Xmc829N0@*1W2Q+@0aMqMq}S9pKX-`VyhQ^!g7$diW@aD>PIqv<0P@(&AO< zqSUJIhesN7E7I%x2bC695W%-`8gDqXju@zRbv;WemZ(Et7HRN)pQLWQ_JA+1n4`W9 zEJjE|Gh&=eVy0G(?^VhW*`6Uqzg!CATr*@UON;WUonT)^Jg)E>OcO>Lt$rkpyGXR^ zpnPCx-{SBjls%8WoT3;L+rh zCN%6nm);Iof@zE$kJwpnoTsSY(zmRO7Hiv$eVth=r)$HP4Y=K<0+gqwCY~q>m+-}t zLW#f+Ia{t+D$=IPE!kYP!cgr$sy2h6dXm1IrKIv)8B#Fg!W%(>@-+x3T!jFa^L=Iw z>iSGPIy#>3ad6{^kM$!G5c@_INvZ;2c(jeVW!6VkrR$uwsMB)27+s}$+-BC{YZ-ph zNEp1-N=G&C2VQPYy^@QdkCFFDmzh>h&`>?gq#dfk<s< zy0#9jqZPRdvunJZFB&w9QtN{f_VcvO_8J)NijcI}?X!%d&2-FU=w%Jq%9XJT#ZhVOKY!H7ajGnPp*;?(o=Ca`11Zq+cB@QRRt0qzw^LzgGgG*;8Tn~-z?EZp zrnOspof1}~7DUxGww@0DOn&^{(+D-!j+?r-H%@YRTNHJ2xg<7mfg~OQZYHNLn%DdR zc6r4gTFf?~4X|_qyPe?LyHaiJagLb9R^K_YwCkinEMUA&%WD>>#>{V-e%JXnhx0mz zFQbMw@pN7dH7p(Pa z;^u4Y$rYdyRY{}`U&83y9d@cqdHF0f*~dLS9Q%iR%ko&{r*EZ-32;(dkc)POD`S&v zSja(xUUN&zG$APsj^t zq4u)+AUBgeA+ayh(qZ`R}F zDvj|K6Q}VkHyZcOVXMVAdBhqlx(J5xWQ%9#wLMa0AGPLo=ekrSW%DAKAzC5kszni# ztmc$^A=H#kFfJ2Ju(hVu@E~qcirlJ!%;|(LrW^-hKE!S`BbPZapU@)drVvV$>kJKb zZ;%B{_#m{iHv6W}%S7Xhk@${``diPXeqLL}RMM^+&oe@~IALY+N{|EJZ5@!r8$xNu zm>VRKaxk7&SgE-6SPKQ=%Gro8YpF168CHs7O=}8{2tzHV(gG_oBDRX&< z6s4dk!Mw%+q-CJMP7zkGP2X)GW~4d9p!h)-!o^N!zzQp_)1Pv-aVL{+Iu#D7M>iDI zTFWf($q4Bx@_UP{d@hYDa_3T=Eg7l8CL_x{%7xR`T?VF6p~#I`XJCd>>gQ=m2JQ>b zI*b+0^ZX(;ui%(YU5I?rFIC%!Bw7**9J@HN_Hui=nMUTkpID&Mify{NOgB|#d_0iJ zo2BMVODW5&;_#zwSIs+g;~G2Zq<$?FU1j`H9TSV&-GkxoS}EmwOY8O z#^+8*p1$O-sHME!*dnq_aWyW2CWinor0%cfD}nn+n(yJb;;GeYM`>BBGD)O9W}8Gh zZ&PX@X}R`nvPDqHh4+P8r>WYmAGdC%UZ$c`)l>+wwH&AiZ`BjhMxxH9tVfZ(-YS)b zR`U7-^LDtK{W^t7@to^~BR$ML}_TR3m< z43Wi|;ePec6tnv>y?jbf_fJs!f*4zu2{Bh(12Db#okk>~WEz;ZKhbDkm`tfX#U7K< z_y`on#Tn8+-c;ljwep~x>{$UcU+8K1k%M44EZ##IsL`U0hs6}JQ&&nPuSlD1N|h=i zj;l_a@gqbouS@)h%Hh&or@hi+9>e9A#ZU32@Kx;7_3_=B_x4Nld5hI;rKh|s8#LfP zCMHC4@4@wq+pbX08Eq$tH&oR3vn1B(jTvY$(g}%yI$!^+w}AX{^I9ot^)Mb|XS6Gm z#=$t8K*~?X&RD+1Fp7>PnBFb~p+e0x8>WvfIs`Qa7v*VK)4TWt_ZdQS&=y#(IwH`8c^9j%q z3N`i#_J7o?9NMtPRITmccP#omfT7e!fqf=?Gb;S-nF3u$`0MvCRZI*ns>> zM7mu#=?QqQNBfP{#yg6Hcp0xIwcZXOQ>@g!^Lf+Z$UMp$loYbph|rqLltj zq*M;=jSp@;wVovHNmq=|G6+a8x8!e3pY;lW>gA z7NyAb+Aj7M!w%njF&N_sc$JrpXc|aqi-~6cIW4_KM7g7*xfU1pwqPoqs_pnkF_gqv z>ZCwtwxslMJ9}3mk%w>85~E&gK~&gY^44(5b}{cb>xkzpAfHaZct7rSx~JAgS(npK z6_0GWs+AeKjO#IKU+i+myM>He7F7eCUYe&Qio8R7&{zbrDEZ*rVA6!!LR=S#7zMd@`Ob#LD4e7uYG%-LngH7UB7-#?vh+w^@faI zioKE8MMj;|tFyDz<0=d;-?&g6d68#?S*rpk919exr2NS>_NsPdK=C+w6QPjEq24}p zG0T)}K4jNst5`+E69+rn>lF;Y3uAfTTwr8}g-;UVu47h%alD@>R-CF{`#M@z9fl*l zx5F@f)mP9Leb`i$>&auHDoP*AKc|?rNzFvs)W`B4_9rSn)lY}`Rb>|ez z{tO**dUMRdcsBWH`FQ66%;eiAdIO5Hu8Q@MZs=>tIMU9K@O*{}#%~&fUkHqRZjomf zMU!q24CO{*%|5DNT}|NFdG|;n6NvIGQAdn##LS@NG`;0rg8OR^N6M1R%30v(rk5;O zRNFgm{CzD#)N&hw`c>EmCoZ9rANtB)P=$cDzCg z>Ya%T%P_fd3zpLGMJ_S9B7-cuydRv7-1W%Nf7dfnuG%I*uo`aqj*R=PTNm?*$%I+V zdyLv9(in{K47%d_J~rRYW}!NLf0(?uqmkj;i)+e3QR+62o7WI4Fv=$V>jO1O9MigI z=?`DGbRGEgk@ea{>kL9WqRBn6-!wFDtaWWV%qSg8>J=z2Wa^zvJYAFwTE|gVc$~C1 zq1Hb6F??}4RP3|JRFQEE0dxf3EaVd{331(o0gb+0aXVjg1}=)T#}ou=LfIHE!!Q)| zk22H@;SKP{GDT0Lc5&nMgrq;j$)>c%9TX-O22l*%ke(eo-ev( z?{9VniDhsWbs2`6F@`)%PmWghDjv70FlRMO@e6_iT#N+y_d7L2 zVc-wZO5n#EYcY>Y#)U?m=D~7xTRx4v*drv&3vr7%Cs?K{9D;UUHNJMOH9liPiD(V$b?pSMoGlSdmL|{fpy*U&g49Wax{*Q`rd2(rm`7MWre$5py(KI^{8`<^gpf34ZD^a9Em9N4R6<5AvV;kzT^7 zmq9`0x+Ck4KZKv~okx?^e^t}KSs}YsGoP4Cf-?t0f%`F_T5RJQtCpvgqPs{a1%!vg z<4_jQu2N?u%)kwSG+Kg=Nm)+W0TI`}9NX1gENz&qxyy*(72Q&a@hoS0Z?!T+E)utJKC^!e#n7E+-1N57 zXk6kj;}NkTl2Jegqv@qb@Yv;!(EFaHeJgYpY+!*sgN%$|-ew@f&=Ku1_5B_g`L z12&6%PEL9^lZfl9X&K(}%JL8nkEDh^dAVn=t{CvR)kbr{cg)8?fd>qccU?JsTGl|$ zF64wX@}zq_vf`2H)spmS)*eRhC#$=#ycNq~&!qQmmAr=lIzPu&XQU$$(>Ia9x zu^Mtl9DPs9QsdSDwWgg=!#6W`}>$WoQ5*xkSC(kFs z2HN&MYiE(KWhNkA+O4mo)6_F0?PWs6E?4qB!Ixz2UJgBqT9^uj$xBESjW~38GGhqQ z+?d%%Y5u_IacsWIryCQ9&=K}{4%0F)P;g5&@`!Z)H?Rnk2Cx@0 z%tWj9b8Sc6BGS#BEF4QuTM}_%#G%|Uof}=2`C7HSa4{{oGPcu?YkfPGp9^S{Yj-b~ z&3nm|XNi=mBMS{vI9F9L-2_xvX&g60C%=Tt;|D{< zutQgP5O0t0I#;~b!qOmCXS+a5uKn{X60kTYNbhX+-dC1*ZL(`+Op~u=p-@n4MV#QV za$ELso5`8b>srX3=3H{)&N!m&iuSVNBt1lFVseW@Y_r#~xC!Ged5&6QKeTNeZ_yee z=hVa|aJ+R6J@rK9#)gXAb}vM@UnFp4x}RfQjk)x-FHxn}TpNVB9JX(M=rZ;(IjTnv zjpiBu2j;LUy@o2fW6@^SD&ziU|ZLu7UKWOS8V)VD@5lbcfF}eCoqf5R;tFeg??bFG6)Id>y?e z_uzIB-!4bu*ij2t?&cb_+0KEzQ&5(Ce24v=zbyf}v%@-Z;?=T<|H0y3vzvZRk^qs3W%n%qKQ5ZSeL&jkGsc*;y}e zEkYO~Zm?!&W>0Z!WrtvHgjHM?Kc5w`u)Xoi$WxcaS_rL^1Gl1hHO)ZOO!e`hj6nb$ zHhMU_ClPOmj2WXvciqzH1BF=H$AU9b*0xUeLyw1wKOngXwH#TrV)TZ~aK*b7P!LWE2I%Nn0m$&iAycX=^XH-{g@j& z&EKFT5eLa#bQ0F252}7>^;Hw;4nR~qA`I9cCIVVyqzIkIV>b0Vkg`pF4<1bVsGq7U zrvaj98!yyDrtPS}2N3CZC8V{OaNTS=ja)kmt-6qTHV_MDEoPieIjklXs9(Uv(BOBC zAAFpihn6e&_7=qcl5>6j!%U^6GKM1eHleH;whb#{Ef>bd)3efCR>{7MWy<8ibUQsh z$A?AD9!Qd>&ZV9zQsLk;mY<-D5p&jmZ)C_i4(%3zkl}LfVNejs{`vo zCWznU4an^Bo8;@5BRk&)Z-Z+(IrUx-@b#!}X^F`zxr@eO+KlSKy}Si_wP3rbe3&_4 zc|GSRCzo2pOd9zHmU}N;txLs?kh61zdB=Ii;o%&dIae?RvpzCBbU(PfDe_>LpC4yV zJmL}Z<+wm|*&Lz?^bw(ul~)(3a&5N3)%Zwp4jG}*ql`FD6;$oDmF&14GD!_xRDP;f zW_AI7^U82TNE=xcDcn?4Mg~ZSfFk_N#kh!vIq@sU*p@D z!0-Z#h$rYYT1R1d5u3dNaG^?1+X+dZKW%OV(?HyL<7FRk>be6HTM~q5;G?h@<44NQ zA0$+4OtGzm24NKWNVWQy`QgTsjuFR4eYJz9Q3OO{7KElLDOZ#vwOx@&)T1&LBYLTW!@M*Epcgr2S&No~1q*W23I(5& z+}hq)e!|hJNoYn$A!pz!If*Zmy_tBds+?{X&+rz7v@4q~u5@!rH*3U49?T#knr-ym z=`iYw1R-K@QmPlZ!X`9V_`29h7az{3B{_UBht6ES;lnjywiqu9%1I)`76L-ugCQO+ z#-=vL;Z=;2EvL6gGhHW5y~GV%Wk*L{O0^F~HWDKXUTbKbF3@X@1WQu~Meg&9ZBVVH z#n%yWkn+71HoPVt_pMM8xEwp*c!m?7?hGLYMSm`qp0uOKKxb0xNIsPBD0gUdQSFS0Uj;R=Iu07uL*J4Lx9xp5py+5cZ0_t> z!Wqt>UUf99s=y=P#fd1Unj9zT>Q^pxh#$^uX{qIdSQ<|a&BO_RLaJ>U=M`>$!ex0; z^D5wE#&2vShkQE(Enp4k-PEW;|OYKK~o-B%OQ(Nf0S!76Rge6{y0+0v#QT7JtZNpaqC1<$uoL*MJ zhdWUuK^BKQw8@>3Yo1Y6U^@zG$lHjxh+~q+GQ5Zm#Iot;tEZCug zhA;(&i8gq3f%9C($ZlQ?qr`m!B<2*ti#Z~5B_GA{j;9-wJ!?Zb_X!H0a;%JHakp*V zHfSwXL#Q)V%%ht?eVAzSQxl+TJ6JU`p5@`^^Y$iM={vR&w3v2QP)dr{Ka)7s^*c6?jOe?6cmHOHr2Wpu;@~ zL`(8dO4%NaCCPAW4AhRz)CszN+MIPBjRw3Rm4Ycm`Tk&?$e3tXcj!@j7{%~(uJr+_ zzAM-wByxUxE95J7`YvyzY=R`|cZFP^mLOD}l~%_U$Wm7p``#sEG(27UfVx#6+Q)t= zRngt>#4_z7OOU}k;`L${-0L~u0>?-7+&E!kpE`CAYaG^bttaHd_Sj}hv~JqT^N&Uz z*6ad5O3m~AeNMBKgUWercW zm2l#niWisld74yvvSJPuG1g07z zYhFd@P(65@D{bY1`)m+>*=h}|+M#FyIRi1FHU^YtTH8~HUZwO;)|si6>^8;}+L1XQ zXAjxQD8}cL8t44Y4Jn2*ZgEB{Q!VY+99jHcylN(gtIlTHdQ#N_EZcVK>sgwKs?#WS z3Bm=3GUBOY0ZA^^3In9f0_CqZ8A@Mci9Er?`4OSt|L_D%a#!2WlTo|AYF&@CST)Q2 zCR9y&XGN;c*Oq|fR8KIK9?UU}PqZ6%r0=lUNQ5(@sXEjMMQJqvFC_T*QugJUv!{_n zIL^*c6HGd1zf4^=S#mvsftqYvDueL>u5+cx-Z^IRa4YIc7&=m4m3?9(TPf5m7btiX zQI%MFxtoEYYx;Iz8@M2-ys>BNv#^<&f>pn*!_VQUvbKJ&E|=J+wnh%&!DgCx>papW zo+UMG`=_Ky+uwGEEEdDdLqd>wxiJVED$lbT=j zBCol74mV|{MolNpToxu~6zAI~uoR2edlXmENEmMC%jveh0t2Mf4j2ct$bDjuy^z6~ z&MA6B=SWmN(a16QjgGa6vYi?+qREPE&pEK+Cp9r&V*#Ju87yCKI(?Kd zOIIASDXuL(HY!j zvRs$VFM!X8xyiwdva_E**YF|;7JZR?4eg)U_0$kb8 zyQ>NTc|J9E7h2Qa))~D82ZgzaoStLBrPq;r5(&yvmfl3~oshy^Q<@hI(2V)3MjQkq zpRlS**!T(#d|H|gq~mZS<|0H-uB+Peb=lEtE~@Ow@~^3fRj$-;`|cV|Osg5|@To zo1m=AIy9f(4pV_PEqJ~lsJd1;%9=WnKqv{8!qn>9D6j;|-kGBfgq3fWbKZc)n;YY3 z3MPj+;fzGlBJftk%v6oLID}Vk;>uI)@1t1IU?HtHf2kWSNP88J&PTId+*;dsPWmx`z4&zkR&B%-wHPbay|B*l3v;YV(@u zo9F_*0p#b(+UT0fT%fpjiRcMZPYuS7BlT)RDyhx@84q=P?3~zT46>GTm)i818=FoW{gV4X9Kp&|UshHo!1r{t012+IUw=J413eSquU}8k z3OE7NKkc)yumMg(5BMt+J_F!nEWd5P9{<~UzWxfhAoFiW{`h8p=GU)R{O!75?(pli z7y;J;lso^jWd>~N@tIkf0e1!1;xhy8o*B?^27G3KOaTKv6D#YNU+#`#p}%`H^Z-#< zM!@lO_$+jH=V1b9;?v`^va#NM^W_K@rn~ks10E;ft^B&r%yjqo0U~`YwDfmpqP;uQ z*Q>Iz+d-#Bc}wSK$7*&p`J-uzmgZpI!yP zeE=}|@^Y}!G2gZ0%UOPVu3z`RY#Es70C&Rx=rar~cYD8G0q{ZrUXU-XVf?cH+m;c~ zGPQrapZ_a?@k=TzjjZiU8%GO3FTcxb1gI78X<6%j{pH(k|IgzCE5qFg0>~W|GPJU` zx$B$wcYRk}>-P_UPYQ-QHU`#!_y3D-(I0!ucN6<)0gvIglLE@w1A5JG9{`!@^moa7 zcUJ@C4>R0l5PjLF$NzfFPbdWd)UAF`fcdEePJl-3pQnxig#7=x#uEcTe~KP}5;FtS zeUoqjB2HhL^ELAZ@Du^MMt_w()~nEMHO-7Ndr4W5kx3u`g*b+n^lDOfix_;`gR&g zgELBr>8#zKgO$sS61EBPE9aog8tO36fP=H@DbR=yt3$dQC3mVhn|DYIy~ti~QP;3M z+oT1evRi>Ld?hSY1B4ve4zW82*|jTrL)$LB{s9ylB{vx~Q(Z5RoKS0=cYXX< z;_M6bm~naIhMcz5lCN~T2A@*GJqPi77uh7OCz=+|o0JX}n)1oOPD18{sNn(O=U7>i zx*b1{cQVCWOfMT^(_kYE5qh!BV|B>7G<;aai;BbWbl_z|m>e}ZML+tuZB5DtmSV)> zU9~fX z@uIxHsbo_rffzzQPRE@*9(!Kj^)A%f3YNTyv53t8=F_2GK0CoXheQ$-TPU+TJjgYu&mN%yqtKYi9;I9#q?#K`r)WjGvR>Qz zzGwAOOkP7V5obARywJf5(-70+P}7ZQI{_an;TS_LMYXoh1H}wWI3%qKQ=i(}@C5a4 ztkRyd6OY7i#T4XbQr|dQR*%knK8=^BUAB_4tCd{IWNajS+>?oFO_2}tL69}d7MO0z zrw;#xwsgV^ochHD`TCLpiK5Ex&kov{!&6yyIGY*;qkwzo{7}} zr8%vAdW?*4u-5cwyqJVnd3JMM_NqVf-6;G=WkR8@EDB{7)%I~UUcGeuWgPytRHMe{4IQ zt(QZu*_S}v@OfO>)2SlHgtA~}LM4qJ(=fGb@}vu4r}7r47h$CCdpz`e>B0BVR$!#P z@38)@BF~Ss6&P8l?`nDcOWFzm3-(XL`dzWyzsL!ulI(`}#z&|*M0I|Z0qq5it0HUa z%y=~7fG>&%SpnL@o091}s4@Pk%oyW+lYjvt<$rFCnHd2f{-a72 zfLk*F_&I;?mwTytj$ng=Q21m}(wIbHpc!q0;TUBCZJ4zAYfxa1gCxXJY$T4K^!5@^fN&C~ z(xZ{+Az;Gzi%WwEgY1xuBTxgSbv~Z@9z1_Y_Wi=;I5`2t2|$6r5T~CYO8|H4o@D7q zN5!=B{0Tz~(39N=&7yp+V>nwhmEcjkLtYt*Q;dQS)Vo zaTI3x;cNI{u3cGx!3ELm^z5TC#~OrZX~1D6A$8yQ1=R;o5uc*ct#`aKlb_BQyA1Y= z@v#*q3WDeIh_!`9l?m0O3+`qfHHsP8)|NG-q_;$Yoy<0ba|$!EvVB&-_w-O zn!A|HIkYruug=YxX+{>e>rQ+Lu2V?2@jcM~$AP>93&6GU?+x1jV)%-H1s%HDHUN+M ze@MQNxs~acjwGV<#gX{)KJ`zaG2ba+F;cUzFy5EkGJawH|L9J4QuTi^3YtoFLjy!+ zYjzcuCUE0-N)pt;Ri?aCc0L^GLADrkXmu}2FbQs_gKg*w@_08*&~(@ z@ak&)T6;1u*m5F!{(;C)i~>n&n*C+&)X;q4E0;R5>j@$Z=>p;PnyP(^F8?2QZy8l* zvTY6H?h@RSK!UpmcL;95A-KD{TX1)G2?TctZo%CN?(Td$>3h=YzPa6<)92pryys8G z*ctG!tL9UyR?S&!O}seF_4{1JGq59EX2>65_`_oj;Dr12B=c7m-cO%We%~tS3!!46 z`%8n1e`#F&{VC<&CoXQ}`hAUy!oS8v@n=&%g6Buc#?Qn>0K@f@aq*A30R3i({jIq8 z`&8r4+c^Ed6BhyIgx}`;pNfls#OvDw{@Tg^5BvW7wu2_%$p3{41n_e7%s(3&zmDv? z?d(f$!at3T@4v*xg+ua11OG0uGDGVk&0qvCrz94`37#C$wx!EA(o#>u8;>F{QDAY_ z+;D?B3z?p{j!kL!L4Ml&FdmX^F|9W6G~P1ib5AchyALSwGcTE#Ml>jA6T#rZ)Ms-v z%ww8n1Vnbx!CfMfxXhW;ddBa==5b?_6*>HRVdME3GwCPwuDc_BP1IeShhCb^Euy{9 z&ju$!KgnsHwu}r~lO9V+ysg^yTU#vaCP_0dX8%!w0@%2}LGml6KM^MZ%~`%Z;ICo& zOPVihW2I}O18AZKAO!z+;^fz%eFrLlxcW0t|LyWeK>MO^v-{7%^V6xwANBb8S8iip zhxYFY&tKlg7=M^${6u;WXh;4H-@meY7yu%}U(6K$&NlXST;E~yAC=xS{xJ9WiI4|y zY5qyje$RA#AM$?Z3I&j?{`qa}ci9JEJNz3F?~ja#;pyi}0W5yM&G|nE z+E1nu3;=VO{|nImlerE+qq)Bc+D|4J41jA1{}-VBj_vr5+Q9&<-G2w|C#ZUWhv&E7 z|7+3l_uR%WIsA{?Apaez{_DuT50HSc{3i#o|7WOrrXS`V-zn|C5!Zi0PzNx1KMCg_ zaUrzyU+(+-N)vz4)9C?MQ0M?x7yxvrmFd?v29VK6XxUg9IuNRS*{cEfjlTQ~_z4+Z zYjayG9bLd(gRcYr6-@ds%E6z2nIqHtx`PI(X_I^-Uf5>m_(>9uT(kf<4>TkgZYCAd z3kg2d*x~N?b23O4JQ1tPOO1J05Cg77LXR|<1VV6ZdCuV*_R(H(D*@${tK zd$2G+yb}Jz!9g>#7eiXLlOLuw|W-bdt$A zz9L*2 zRZ0oeyx9gA7d~$2O{b>b_dR!RqmiBHf8spQ&}jt%uRr zFK;03`=jQNOm->^)ch{k(z-c(G$1Q0_8_>!Y6ZHo=`r8vg4)!%P&{|UatbO;DcQJw zJL!V(W-TP2OVq&ojhsZ1VyPMRRsXwzm(ytFf=i-&3}v}Q1KwPi3@Ss!u|zEROAM)W zD%OmiyVS-{gJ%~$r5VeCl%R(j@qVsyOBsf7z*q`9C?=V*XLC z^)pHZpkwpTEg^s(+h0tO|9LU+>!`k4KL5XqfkposF%a*EVj%MmGq0aud;m^fKZ)T_ zFg|}P4E~Ps`QNlR`lB$2sZ91?B+pykU*ljT5PsMX;vm2y<=bq2%O!qhNde@UZx8rO zyV954;eVgq`8uxe7S(^$nG@g;^=;1oInaJKmH6^5|25DU|8bM$pSTwBbzI+p1~|0* zSt4O7*#-kJjA*(fx0*)?9-N&yds+J)53H)@eN>W@MW)X3;hX{*8uWV8QG0(d*tRj7 zKzMnPj}Hylojh6OC;ASEQx|A|>EdLi=sJkdSP@TlFMi`T8l4PiRYcQ@fKjl= z@q=~tFJK7(1}xtm{MUl!?@6EURf{i$1ivE*=xC{!m{@<7B=|bsU)LW!%b%~m92p78 zwJ#)r;s9*~_8L}q)gZi5P|($EWU2?BTsz7OkxCIe z#_pkl?K>3VG%Vf=ac#6T$?s`p$b8ESyw(_4l)}Nt=Uq~{Z@}J=m9!~6>p{s5v%pvs zV;JFcdVs!Z16lCbBmH2Tj5YWAQCD7e!(Tet098SG3f=wm%F59Zuk&Swg)LeH{M4f3 zikuvkwGK`(`kTK_lB@)~Ou!j4{b{f}hshP-WAWtFt0Nb-G$$(T@IX8e`pB zVBuW3skb2^OtIsx*zH`sPM4w^2(^2{XyLkSpM|@G9bU zm{bsX-act)YHFH$AIAgyhGE&lk7COYldPZ6Yyf2*Kly_G5smdPJKX?Y$lpYk|EOJ^ z_3x%)08Z~GLHj+g^Lxuj_kX&_HRMO@%)2|GsF-2!Da>UD*HB>zn*4(A`xc&*=!16 z$@`ZR;lG8(myvys#{b$KkUu6yf6EB`1CB^!{O}*a@x$EVufxF#xEA#d&%c!10*Y7v zZ{YY{_VDkpI0pWKM#S)s&|szcVN&ojX#8waKu7m~g2pc+`*&L$-{6R}$B+H*i-Q$# z%jMg<{m;ZIR=|ymZx8rui{mddFW)X1($W3o!S9!0{ffn35QqOrz=_{YP$BzKao3CZ zU95!P$v4+5U+$*0h1$WdfB=PbU^4$`*8k>y%}VpL`!#?8{hve9kCUu_V%C4llYH^) z{2Q{_AI$nTmI^lcZ&b4@HY02tgI}h8(EiKRgOg#Q{%GpI+nj$X{-Y(NW%yEy|H~&p zX9yZ5z}fGYPhVEYKWYS-X=njI^(O-gl>?WPGj7P0}Yd?IsOPh(rhk7W5bcB_s@l#$zUB?D2$}8xK&1Dl(0}Jd_HR zUxEiizfqdp*P)m_O%E* zTA#94*zm$a3dXw6x-W@IPTc|Md5fQS6&Yh#*?Dy!Ipcn@dB~+B{q^Fj=KUu>D|*KuLt<(?C_Wo=9BcmL>=v} z6M9r6;{*8sUqRxdgm|!Jg*OW4uSo{DaLs9&DMRa(0NGo4wMq#`rftgl5EE(+R5_pA zFBXHs9Uz?E=uC5KO)_!uC^fL1VzsAJl_D{Aa=pOB=;eB)0tG_|hlYxdh6=*13WS7M zj<+;?0g*ZsuEFz=W(EgBK&@X(-wFW=vI<(|srew>7*5Cx1>|etd*yI{+1f&h;^yYT zh!z5(#AA{{6X{;BGmn(C#H4o(l@Hkp7qEiQ1$1?Kd6@+6r#@*BpS8)g-Ez^NN2X8w zDC~R7yxO93a$_Z$gvF zLOgAWkf!Dm1F43qarrI_i>kFn$e@GvtsfA}<4QBD6ed&`$JOH!%$58}3-Y6W++*E|Wyu_d)18kYT*H+9N)trQwRBBV7^DhU~Q> z#1F%uRK8y#LPE*n887?%@PP<3=KdB}l!j*hCJz_fM*xTr3}juziwLX>1;XK2$Ho}` z_)5S5h=3aIU3)YTO}r}*lLc7sFypC?-4NvMHp#W3Mmaf%C)QmsLVSk%ObY{|rvrEE zQ`t3(BX7dnp!BXax;m8ujw0{KtA@btE)WjynXo`9HPJN6IPLQ>nLI|A=sdRT7=pPP zgZ>8GykSX~Q(nczf)g~h^}4J^Gw1G?PIo&<&J07l0TH^%nF!>&(v2KZAKCdaVh{Gq zcS}CfO;)Sj?4d2%le0Zvn`g~GjTV^j#;HnD=|7QSG{ou*t&Ste+$nK_SMY5aTNqTb z3xZLFW_C|VPZ`K0nsMPp*;RLPeV%uhP1MKWB}WGwQ7_C_vOMlQqM< zzKL}>UmaP{SS)AOW2S76PG!+aplCoaoq#m?ZbxxTcBM!ar|Hi!PZXVLP61CU}Ld^y7dlh@c` zy-tS8a!MrJxdbY9U=n{CUq!Apv>!zpFs{ca!KI@EIZKW>q z{WZMAstpB5SGj>&odk+T5iyR}$X$}C5*sAsmXGswFe56k{uS^1WKVb*ftm40dl(YE z+X|#QK?{ZH9T3b%CwqBSsMuKKaqh;(P=TEl_t}XLavYmtYljTa+1byl?5q1uXct#n<=O8oFo>Kcg z8FXivdCr27=TQ;5Q*#)g`uD+STZ)Ji0(u5)#9x~-@8ba^Q@zn8cmw# z?RR$}q>Dvj(+_RD#lVYeU>Z?#cgrk%}L`LrI8JV2|!F)H8>A(0`{h=URB+G9IObzv+`EH{Y=bH zW>#97xly#|Q0wM?%_ADE=@tEX`hKVF1igk`LNOXBS%wSVI`I|-tEN&Bwn45HIatH4 z;vD^Ycoe%(9Gu+0&URWCArXBLzigNt{^fkO+}4`f0zRuOJ})K1ZBQ-j0=agjsBQo5 zlr(){TzO~|Lhiyo;dqj0f$JgbsGTL=BvK*q;$?-wek`r=#U;juG~KbilW0)X#Cy!S zz>74jMS2yZo)DL_aTkjhX?ZA=d$R{p954a-m&6TkXC!v&WU%cLr7wxhnHo}HWW}<~ zhG+LViMA4h1$v(_^-A~Y7{e8kFS{3`iV$xd%zh*}N<`PxOQ>#!crCO1Bs@~6g{(M= zQ9HkdeH{7Xt#jz*H1=jLFjj8|lmC2NEqmM$dH3s)KI>fxG!s(?K0_hIqu zh7q?}JUJQ`OFGUl*m8wCbXZFkuLEJ%w|B&sLD*1c3RX^`_d2oPD9D9baga70Nu!u9 z`qCC_b!!ekhoBSLYOA?)Rw^&;#_lvtsjp|Ud>Sd{rM>0Qy~;<;@zSL_%V?HjljL$} z6t2t7Md|1%K}NTt({RDKyaVImS>Mrz1ZPeb#`>I4wQ2h4X9RseEFgt@c2(B0i_;~fN$K9m42H)k_^DR6F zb<8v;-R8&}v)d=K5kgTc2 zDv~VRdbmQu#Ar}YPzabJUtLKU#ACQTx}e<-ng$K3q*{x15zhK=o>t9upNU6bSJ;{@ zRaAAFarJU=HoCle*ejS|R&+o);y=pg_o^W|;c51HL-i@mY)pk#*l{*!Gq6U|Qva+m zfus9&1@Urc)!4U4&Wu`sY)+o_MEE8F)qcv;cQNsX@m3#9a%iqpPEIBSt#Jaj)9ED` zQ88VAy#}-Sp0x4qqDYHH{~Us4E9_MGZNnAl z&_XT05UmIKegN&tXO&NJ;7)~Xnz!*Whut-!q=};LNE;Dg1ij5IF9;7jQ85F6&gGtq zX3uA2GeT*SOpmhN-b}}lRQ0M{(!9@oyuy@BL=Jm6y_S6xW_eFyHEcPSIdwg2uROlV zct+{8ip%rLz(*w-2k1L3A~RliNds8x$rW!JOG7r zw)B~@#cE$l>&uYrIe&iwRzz7vZ|G00eaE|S5pi_*E87XdeY-I;rnn9hhQvDY;HM*?9Z54c6p=&Z~+r4|1x-giYU; zco~17_XSJX?k~et#XFZ}Af89nXlZ&p<|olfnjaRV8zWM20479NIo|Ug_rNM6q#<%w z(yX+j+5k;1O=lQE$y9nPwzygbMH6iXx_OIV{!VH1=#wfT;)^=#D=4RNYvQ3kN5iSr z#-j?^VGrIb@tQOvVWiR#M)bwO58bpop3~_w#5iqXPCHp9p>3VA*mGfpLZ{CUpqK+X zcVwF`Rj@9S-ApBy#1~DIQcDu?1aIyUa3aeDRGdxtpU06uQ{b&mPfN|UNj>=}K(ZQ* zE#6`r#j9=`F5cn*_in9LL*qVS2hbpkZ$$nB(nINmRoASyjhL8r{`OoHNrQe?1vyGy z>FpB9IG-v+*3+w_I{7s>DL458eZ=?u1+W;(26Bx1+nEjeJRHk}uBp=ldRbNhpEOCt zO)1QB-ce}5zlDd2jgB8+o!E@+(3qcr-&Lu9O*Jh1W`-wd+`Ll zHC5RViKWZx?buZ`HlK#AXqxHVl%=xnBM8_nEl|gsHLyROp$HPzQ?hjy+GJ46{B!ny_ z<|1?umf_0#Aq~YJv%rh)N&bB$UTxP<%#d-*)xDI7i+mIbnZ8qUnu@_fR%6!rxW;^9 zLcy9i?ZgBs*UOV{=taxBQb}^ zaT~I(8J`{R;D^ACMNqQ4Q1P%JOXT4fO2c<@_uL3uDTtm~wS9_lI}jS6Gbzfw)HR0l zA?ec*EU~#43pIJrNhEb4w=#gYt=iLXq6|=YkfU!il65DQ}lx!Ru z?}M%uVY@lRxWAa@9N|E!vJf160!-=PyVuIRyr%U*kSS$#yQ_v~{dtGZ+=fwQnIjA7 zelz>M9Z8FkvnsFVGqsEWFStC!w$Y0XyV$lP!|p(3ElG#xWE3IIlAqhTk_u@{@3rqL z9p3O7=9KSUl)f!bnzizJ+RIscWZ$Ub+voWF#7pfLoNFYWvptH9DE;tuLOwg-u^octpw6mbMS zuuPM$FHdmcS45T2S*n7|MZ<8V7>eUD1i|1tJUiuk#F9Iqys1TPXpRt2Okr0L zzLUB;BDx^4ZV`f%5qBTveVe|Hmy^RRf zK4}DI;?(P`wo)5juoT%jM@LsdTdo`jQP-nE{V@{0vo4|e_iF>ruHoG?D@(_3l631+ zlqla|cHXASzH3B8-@=QIG-eogU+|-raDdO7=ztKn9?N@E3KpF863&nR9c7bXjaWhb zKn?4Vg>MU$@?7Tnj9rtGE85vB-cr>I8L?5Rs5UPAwCIyLC?bN>1|L}VE~;EQp_~VO zSo^%Yz*lP6uBS#I zmKvQx#0BD)6nK5YYKf`v^vB4bgLN74(92rLLF}(%L*j!^HB2)7<;@O@o8t0e7U)9z z?ltR$*?1{Aw~J^|lAT&M>}X~<84|3k@;HfkxhHFwI|6MO#XB@f!2FpNpm<7hdY*x> zU$l-T@8P$nvEF_-%n5!CLAF5C{Hl;wb0p#I&0BpVn#kxIaX9m(SCB26okzKc_ZbF5 zcaezwqI|gUqfDpv;M6zx+0Sg&X`){4ju#F_h?%Q5Tq}=VU!Q>Otun>!qPlkoITO~V zf5PeoqB^ZBzZ!yVxInG=jLwO2_w)j4JBlZ4cn5?BB5}eRGDr7lc_t7qFplN?+Wa;< z3~hRNmacw~EhVuf0Ig_@ToQg!>i%sm#UY&_4D&Nb8#k|4xM38=I2{YfYnO(4q74ca zR?n29s4e6}iYC=_gY0;GS5)%dChW8Ei<1Z(cAvV3%aM+A( zMzMPg`w&Q&{!|H_l>H`B8=cC2#TPD!m3Qm5Cn~#aiGq9Pqn`CkbMbiA?sq!YFpEibN--vi-(X!@+t-OSQ4*`0BhB*{fprl2rW@wf!o@bbM8V zcB5s%$j1m8<|z;_=~-dq&~P}4YOS60hm}z|%4q9@KicgIKzco4m8mw9X%%{sI>h;j zJ-Gw%!|Rn|hsm{cZDh*D!A#8>d~{s`N`-T|;goqDH7%{}W#mse!;Rj2jOdQuLyeAE ziFs2>ipb87oi#Tz+Y0XpDxQ_c8dkTifMgvPMv9>f8K<>aQp!6gFWRb>LB%(a-fK}b z^9mXVUkw)B_|*aR&WczzXfG3GStMUIZ#=E1NVB26b#|KI^F_*Zeg`HK5Zr@nf}kM! zJY0kr6#kRN(Mya9+|zOYwh>V@-6j4KyJsTiY$WWX#PYs*-sDEWVeW#(J(EKa^Xu*pzpgYf>LlEwWgb(FR5RR<6IJTuTKbD4_j3sT69XGjITa)aDz0iLF9>-kh zf8zMmvc}iPYyNF&4M!-Q?a6IlFcrB9vOnVChc^TtCd=JfpVf}>TlzlKFJAH0l0=DH z@2Gu>YZj`-2|7@hH{4HvPju56w>?k_E?8~Uc)1?BGuYsdZqd#P7V9-yZZ50P@@a@6 zHk^7p**Eq>YN}{mAnOx(3A=?6E!VV(xR}`VjV3fCa(2=9SeFIv*wOUdj5^NIfU4uJ z4sSkSg`W55_M>(B__ltW_Jf~_Mq+s5aHg8b7!uUcxRR$;iWZ)0pTf)Y_J%~g2!W0uy5n3#ZtkX*$h9 z{=hU|$RIdnrKc)h71XUZD;1?B)79Qk41v(sZ<|N8qX&hd?v7VLid7kj5@_$ z&aZr?2s#EYwsCEr3!u~*-{o1xN`CH=rtNWBDN#K`DjRt1Bt7 zLUq4{V#xK;DxV8ks@V|4h|YY#D*f>|>zo)KnSRPi!Vvb!)rbCTc_RG4bHxG(nr2Q0 z;jnqdr%gw7iva_Z<;2dCI(>Iinc-0W=0Q~?O~AhQz(j%OB;9Kt^4c zlp9te=BNx+myEi-XLv~3jm&0mR-$Z_8`u+G7NOJoq$Qe(BQKY9o~KwA+;(Ga$k4}! zUaIj|mrLv`aSQTNk|-o7mB$F%?=@j44|Je|wyYn+XOJBPs4iE=m?g!9RIoYDA@pd+ zJYsydPuu>HviIL^&3qBGf9!R@&!fz%CcH%K*8x_Vuh(nT_u|57jZYqR$+pZ=@a`!C<= zJ8J}1+V5_5d{b8Gzlgx!DXZUf*54_se=Ze&QC3k88e$Q)6^uNVw?YpPwjqE6fk6dL zbV48^q6N9RMWjWuWwXV&>$Anco`C}c7qH(?+}|H^ZZ1|@S06erx-?%pcK7C*e=OVb zDEBTTS~hSi2NH%!FV-Q02J-X)=O!f5e*Ibpa~A#vQgpx&M!>Nh$)eygjbH3CJ^WDNlzETp%_OAPF$s9g%^85bm1{ z&DTQ);xR4nfYLdcfhb8jTeGj5>)SweTHXyeV@Gai?jFv!XBx{h66s=VE zRzWDC4~Ssk;F>_p@tkM}fzU@@?A+2o;-(%EeoWkm(7ul=#rOW81k1yDz#ibO?s>QL zH;TlVclI48X&Dk{x@(eVcg=gjCx>EfkPM3WADw?AJO^Xou;) z6v_u=6a)bT<+qf!$FVO>^K@3W6?NkxIAghtAznzqmz|7cej&r+1L<+ugPbN=KIg{7 zJ(zpg1p2!pPslq9%~=*OVcyz z{1Os~56#=%lcJ-MnmvHrv_ybf!pWe3AfSVRKhpZAyX#*kJ!;ImXWbx8r!{##^yUNG z^8-D7O!shXXfbejEP!54+ii!xvIkcK6YQ1(IwF|i0t)onqt#e`thsXczcWvKjQRW+ ze(!#fwefl5Vh-j`_klnmfPG-_P?BA+Q{7-daEp+}8Te6Bk$#IntQgeR!?Er$PaYJ$ z&BTv*zIXpn$j7m;%_RfjhUP=lDFMihF+}{C84ZgZ!3y;4IWy=oq&N4YR>xjq6ZuBj zM^yTPrRQXNF%N1o=w@LSS5?-$nc6^5FyO}|U2yo;sNi58wEf#a=l3PX9_c{1o?Sjb zG-qBw@1W3*%N&DXfWh#P)$=vB%(?k72?K0SPwwFFilUn^V0@KZmSkGbj;HP~OZhUI zrJPr1!l0bDE#h{LHpWB+1PLC_wPv7)Y%BHW?|>`wpOmG&1uK|GSI+3qCkQIIPeFq< zE^O8DWu5Hz*zbDd)qN-fmpBAUZ4wFBJ((1sFSxxJwr);7c}9audyGSF0;cW+mgrZz z%Aj3kXw`gl6iGPdF5WR2h5Pd!6z=Kl;=G5#*TEsqM8ls=;6j?#KeHk+T=1LU zc;0rE72Q#+j);+K37+-TCcU_iw-H!`z!j_K@M!!1>`5{; zf4!AHvs~fb{PsR6vI2gXBeqWDB=4Y4*($w7bxQ*ARW`XT#q+we7?yWavLqS1B!{`3 zE8%#N{?a&ZTLhqQ5cUWr@n$G0goxL{t9P88VJ{%ULKk+`U#iuc&a?M9(WV<|W0_?< zd2>HIx!e;rXJ;7Vwldxe>?9^Z(gdX2{-}Ps!l+Yx_8+E9VE6S- zhU;_m@`F5wwILPz0@?XbTMYzWFr-2GYQ+R5YW6KrDyNNiAQHRQJId$XI%_KVDrhb{ zRZFcO!=5Q0qDQL&NfeG9b>Q&49(P{UdTnvlKF?fYOvu7Ur2MiYT8zo;w#0k9i|MYe z;Vd~|3N?Tew3NCqq{K8rN+poLuIV}ugMCIv6oN9Q1k4qNe^#mTKA|O~=)HlH~23I5uiK3dNruQa1tv4^*noHfgR^u1ZxjC8|v znB3eirfv%ZbLW~PJ;q@_1I5WFoXD_)K;o1ECDkJwo)(W9%)OR~6d+%W?m74@7P|KO zxJ6Gj`AlC6okX%vuhsTV`YN4L(T7jv#Zk0kRWW5PW9KNx;j=0Gm2QZWM;E0*Cetex z9Ln{V6TH;7U7Kr?3wYKxq4M6HM8qHJHJT_Wc0O13R>4O=G%O`)u%^ZO)3{kgs4rD> zRd|75?D!FzmBgW@=*Uh}E(UopAfFV%#crt%y%Dn>Y->suR}8|?NLlT1+BlJ059Z8A zaI5o0SBU8Fao=)izT+sl7Vvj|glSp+`l$q*#gFd0WsD_QCixr#M)NxN=tK}Dv*TkP z=M=X+>x0kxCQP{20?l@7q{7l_{p9$3T*GI1_SHFiVD`pnKpVs8Tn6_aa}X>jQq|n9 z#2a0_&V9B*Eaa(z8`c;tAdJI(JiF5U$?6y0gw#o^8D^)dB(%})HmTS&jH%3wC?+wl zQW@8Ki@`1;UlOzC%WLqPkdC*AiSt>sYbq8{cA<#-q%685s{(7&?_uxVs9QZZd%EU( zG>~r2npBtOG$pETiY)GIitJ|F)~|BZPt>AsikBF5&HsSx+~}h%ulQ7fS9LdX5(A|C02vv?@{-m7AJ?6a}FO_>c7h@e*n`c+X8u#>8)l31<)axcv78B#j4L{0K+gV~A%PY`R?YrrAEy7*s^=*hs(&i{a$wWFBDaf6jsBztZ zr)HC6M2&$z^p0YCZZeEyKB;84UL7RV=wDN30*2Mi6X=|;yq1}4(@7@55;;VEg1#K@ zUAYcLAV$G!EdKT^!e!1ipKpj%}$M7-B#ZD)d7t+v>$LC?*8s-v3P8-+UnLr zhxR=8^7GgA;qx#gIFc^HP-_cww8=(Qx9`TL|J-I)2LYdoRf+?dag z!+%PRSuKg)t*2mF@7%@~6=QcJ*Nvn(^7e3^yT0`hA0c)!+aR*@gpL15n3t@Bx>iTjHsJUJ<-SFOEEDoc%-`B-@vC33!rP!n~ih!~hCd{K@?{Xzf zD{&9YMoFkY>#rYfVRXid@c=z#(J zTnH>r_4hcyNIeFj83pv*v`Dg~ZiD zo1#8kLsb^MvO3ENg~Q$kn;A(KA3@(q-HyhUgyR)e8Op0_b|LOYVC_(&;$VMUr9 z<;pslgygKns2GRKbB?cpWE*l-qO`Ktae1$HZ`wd|90~#vAr`-$G)CJ#v0y;xJxD$Sew*sQ}qX~R+tDaEo1O;DT!)NRGHu~8OtJ=2(y0zXYxgznP) z?7KTBH_OR(;mJ zZihyv2fB=*PPnJ6#}(BMG0{w)`#&*D>n8?6&tupRyx6F=4^`kD&wJkilq$H1XkH|R z5e@5SX~0DBar^8_@A$%^gf4~!lMAIs%xcIjZ8`DKJ?ZU8UPHts__4)H+JvW`!=@vf zJ-L!ro*DImp{luMWz@RZ%F*xbz+i$kD&CsJFzNe%9gZhGPo;hm+i)9#QQ+@s!2WRy zZm?3A>CjSyO~4TExtFN2ghB?BNL*7=n4o? ze#CP3K5`dk?XJ2ejkFb7fvdHq{K+wQ;{p~UxHb!<_pF~%goY|^<GqAWF^Xs?m)iPn{7cifWtN3CVrAGXV0&gK_ctPrGlrLjsLjIRuVBxfvtqQD zBmhU>t*o1|8-nVW*Ub-WjXhWU_*(c-+~g`^?pA<~Hx5_XaLL?KaY0uofq>1ocdG7K ze`XvJAmh@%OH`;K_VDQ@@Bw*Jt3_tf=%bm)7wagQ#;PmL+bjQR1bfGn z^BrT$J96`ZqgD8ZD(rQ>n(LJc!C(_r&dhS7ShW;C~mN z+~gCo4ti|Ld9rI?Ef=)?9!gZB;laExTWAd{!HIj&r?Wj(#kE5paPi^Pj98FfFw~aOektN~E^1-p5$)<(u3S#2?MmusQjxtk1w5#i zS4tYj6yI@j*F0D1N*|8xSW(J0txUdMYbU8wteto)sqB@ze;&#h|=DLm56g`^ixm-a5~|LG1TN>cDc+B`()^L!ECOIdM>(S*Fn6iM*W3y zq;27kI;BkEPGO1l3sHMa?wGXXl3Q_;_{zB|>ko^9ah4_HMO2cClx^z$_^KiJadMoD+RF!7*oV?Ld*r?z#byF5ZqJGX zXTN4xS5XbkYp~h-m}27G}b4|(#y74PP&jU774sr69`i0PT?Ht zb=khgaTOMYB!5CEbSq?am0#Cmyc1cctsuN%pGroD&4;b-U$*b^s({*wE8$69OTL85 zv`apV9b<2kGj{&*40RD$TiaM7z;_2)cFz9T`6J|VOUvC78o z6(5NMRG_PeR_wLIih8T|>vzsA`{}Rx47=dWkE;ux6%o-lAtJ<_J+*&zFR83q@@vgfBWozLqYRQyNGHsN6gg>z#+@dKHpB&%1Nziz|L z=)J1FdcHh)L*aH1uQR0@pScte_aa1R-6Be4^^H#vuRviNPZ(^GnnV|niMPw%tn8_} z;P$a|Df;KSr+6wmMa*|v>F4J`A5~tDR_7fb*fM8$OM*#<$;2KGYTQPso>lcR)4Olxm1lDP#|dI0vaT zYkUMh&+J{hkP?`fZ_Hek+?ExO3;=EtRmrm zErLNV|3MnNeUyY4`gM^|s*8LU&h7}@4BjyNhCLn}hX_-mT2{P0u}O$S$DQ{3NOD*b zgmnO~aj7g1WAMSp(&;MUuHf*c5XVgDs#t}Nj+2Dl@QA94<=#q;&~#kbS^9z_aCZn8 z(baoSFY4-fL+KA76T`^Y7edQ=wa(zeHi4R&uDBVFK6}j=_UWo~9!D^>b^YQo?m37E znYY4VI?Hs=ZTB5|s}GHUP4Vx5{5w5{@bN_Xx#u~(diCb%uxGS;eHDx@%Oc~Qf(Gad z=<@lJIH0{o$>rC!Kghov7YcExMYnmDDNq-)G<>Q{cZHia8LA)9Q!O6!e)lR1)v9;{ zow2UugKWi-bekmy_R)tRRoz``2or2dIe{}9h}>S~nA>5U$u){X>ij(&pN-tqcq#r3 zNfAWUmz_B^5d|}N`4aNk&qZ*-$JW{pHz#w9X-L;z8i5wCy^C^S;{((%fFv0rx?%5^ zJk&P53QjU8U8!2@wpgkZPrZ5GPsrk5*R*fJApKGUuWUYJH5gLiIN|_LA`hi8&BAne z7+4g4gP>T|EN7BcJ%M~MqZ(D)t|P3a;|&%BfALNP*yrecHnlsMs8 zv5;h_B1Cytaaut3Hsc0U3$Tw*qPj71WRH~jokl23rgt*A4kwLbI&(MQ*nA0m_Z$2w3L zU#w3Km$~{;i71!y1|?YSs)}n(P6TV1W8H-HvdIXV=US$*)sa!<&Y!!QaTZ{>+V@`;#$3*32@g~3bM zN@?>W*psQPN-kbS^OTft1j++Dp6GLs~#)@9j(eb;w=lf{ILpl%Nl-f`c( zk>NK(9>%h)e~@Mvd-n2unH~w23!Cd%ql1mJWUs3E)ok}$t`;U&#u*}Ir?N4=OqqNx zcORLn<%vJ0v?vFufBica*bf(d;W;-}UZ6&!v}S^MSFc`>~4eH4Vj zm295&G%4X7?h!6zi`CYeWa306`4}W^1g8#IH71W{HfNeI(C!us%+_BUHFL%)qaIkO zjI_r&EP{KjB#^vqaDx$u*%F;Xs1O=B^pVE|kX}>+yBxL>EX>TNPb$1u`JO;_8T$vp z8MPT08gUw~Gsp$rwP39*Ld=L7%DQmpl09q<8fGbS!uCYOf%<;j=fUwAdx|<{UwE=d z=FnCtZ~?4XvV}p=LfI1iA(gI}H?m@_14Y23&uzNsy*T^0XVm3A=1-8g5|dii#x0a80zE5|6e}>W*l;F*54={-CUjBYh*pC%06p;FnXT znW&P}j9~$a#3acoyPP@JB~MPevf*Apa){&QwN892A7iXq1zGMG*UGVeC!J_Sd=K?( zweJ~UU}vl_`st!5aCElJlC_LAeQ5vIT_<`ge;mDc$EOAM7ZnZ3q^>aIuts>gNJ-jN z_40R-&!i}a^lqD9o5TBl9vU&KZVh{ezT~XKnM8sYJ@1Pfp|UE?rJB>PTY{2|SX^py zGjR3@yJhP41H%MXKw0?@WX2y0t1`+Wii%%Mm>bJD^5%I zMW_FhGT%WZ3F|o~q^4WNBQgo{fGY@RV-CwG+{AGOeY&U(?%?pw7hJfJR(lu2_B-HcXIaoLYS(LR>%+=Z7#1aA!De9qT_jFPeSgxS(IFUiTRDgM#z^uj5X(J41r<--SZ<{) zr>!&P)^R$UrJSso?cUq;6s*MJ?Ob32xO4LE1kUYHm$4@jli3%-Q)!#Q!x#Ay&Svb% zabsB0QT%g4sJ0|va>SEUO7)rTiILo9?8mx?2Kd+*(7^~j1VExGBcBrY$+?V5J~F$ zK6PEfeHLe~>%Kp~`~Lme*+ z@hIF)%(Ff${R!cj;)plDu{TSH+hZ{`T`0!?+R}PKy1({jgXT8+M zg7rj(-)H(r2hU%)9Yx>#K}>Y^j-3LtOioD8mG!Wdhc29}k7sX}6X~Kx7tNJd-9Jqs z6RWgfQQ0_trsux74Jxf@aG_d29PyKd*Tf9()TWRIv>CprY09r+mEYa)CT7SKC21fp zZ@om{psMEbQ0b0_L^9rut!!E>LHx>7nk9wu72hhmq+*d$(=R#7h2*K##F#O3Vv5@F zD+6=4v^T**CI(#jk`F|1!@l^bz2+JNkIi4$u%*GX#G)f>!KcxJoavAg1JX-^ayktTo1(u4TqZIkD%yj*qukS)SkEAl4k5;kH;i*NOx7}B@*Ng=@|urF|FWJGc`+mxlQTszQ+4)URxq2!=roi zWZLSjIZlQ}fn=w~vxOc=)aQ%-bCWft1p~2PRaSzmu3yjph9ec0>TLMXoi*MjL+gw7 zB~A=O$j}1s(D+3mh0|jy&DU!tqHgKPq?a%?l@N@I-8aup@*&4h_6|N;2Rb8>d9Q=jS{z_{4=q-k9!^=!Ms0L+@|hDqgqi zHqf@kuJ(38!>YYJqE4TjIB-n?$6*WIz{zm{#@H2Tm!ZN=jXAt|zW`vWuv4QBXCSiQ znGcvL+Ib5V%meU_pH%^Tg!e)Ow!dswVfbHU-Y)<=2ePy3JE#FRQb1AtQQKj@7jige za0oI0{HC2>e>l*A0kL2D_44yVA8Y!FI`mZ$5Fan_))~Byb^chFU6_M`$G#3G14DL0 z()eEM+8{*a%Pvng&r~0P(8diBJ>C1gjcT_e$EO$^-x)`Q@kIp{D ze9>2_dpHsKdHGU5ZHReIbwnGwzV^ycsn?r#_W|Xr&&zg_rkWWx~X4IjXX&|J-T_jucLZvP6?E%Dk68+ z+gX>n(nW8=ftS>R1|uxtE&iz>G9^!N`xCM$+C*g9`O_uIhL=gT(*>z9{7_y;`;}u$ zQ5`>XwLukWY*gU2w2X2`tCD1NF4eWRteV0xWK*275FGD)!WXl?@~P zlue_y&QH^z6EBV1Rx_r=l`Nk!BfAdeGK)-HLRn@>EYG_yr{;#ej;kE%F+%zX-H6qU zmJRu9rMiwTX-80wl4}kwYZYtm8-A6d!I6?yH`6USxAR#zdH3F%G13SWO2c&qryn&O5h zeK!efkT?pz(k2UiizIu#O)g!jB+X5gyP}~{63{^z6iQl<;|bP z8b_GTB~WbRxBR3y+%gvBVb8nn2Al;2qN&^6DBy3stsmdvL&8ze)5y!51*S(U*G6Rgth{ zuH&6n4s0wz4oekeh%ET^%{^u+AfKc;q7&+f560|#8_o(El#E4u>WG+-$qdYwAagoX zS@`KfXadS;f-KmdOT;D&2^-6w8a%>&N%)BeM4YiIP(bCyI`A+#7cGu((<`SZR04Mx zuM;?6mL#1@Sd)p^xT#-@?e&~7C;3@qH>a(W*Gfq`-kpX=d0RI&*>NzvE4E$-`Ks2* zvIkuqXs~)Rmb;beKA$yjSM)WHo-7K|jI>II6X+x@h%1}#98cVB{N9p=LF43GkHrl; z%mglJ+^vYw#Wz@;F6-LkWq41r=a_&Pkv} z(&PEy`4;6Z+r_mVJYpCWLvJ- zry62;^e_8zlxS=dPA=amC2$Y`z@KgB?;oxf z{3!T8ANl>a2*CE2?J5TUn+O2#P|wb)@1XWe0ssPD=>qS zuJd3B@VMN*IuGIH1oOjd3@)(!^*@n?0EFS7Dqj(+bUB3!KWJ%_?J7#X;#c3&5!2gt zuM7q)1SI7hGuSEbE_Wd%ufFTNa&LfyXJ9Q#0|SS9?NNyZHFKt$%N4uKiRF>dn2)9g z%H|2!VV$y=n4zGU*M)rVXD@ZIbQ#CcGro_I#aAQDL1pfceaP^-7T28hk<#h3yla&f z7Owq1y=dHv{Zlfrw+x5+(+7-)7{esnk)MVd2Zv;~uiZR0WWoH$zugcYtIl%y zjcebG1Owq1YniUsGKWE)92#aTis`+bfpG-uh=-i??J+anUSvZbi9WoVH1N?OF3!lznN z-t>3Y#@i|)%jx*U_-0QIVbRmjWn#2U*eon_k2ZwyXz({;kcnFC|FsR&OER!_ z*+81QByh?bft&Z)*YleOT%}nTzK$86IsXx1%AoW_YnEpyA!1x=01CMPzWrtH@5>+S zr?zgU8yilT_w_$Xb82AXI6gb%HT|AGT2eD7o~R}>=0#Z3ipi!BW-WNqF!oVcdY&xrhAzYY7kfWk18>f75ei z0^lR|slW^GI|=hpWeR%3=dh@OctD&yz;6)X6ySwhz})__U8n)6`k-XC*XSu33XHj5e4p3+<{R%8IP(1L(=l21I1-S#ml9mZl~uKmzI`F z%Ual37ztjt%_1;0wvN(IQjf{kk5P?FN=|tBEE3RPnq<>q(0^cM+%e`%l41B9JFD(z(c1b!!w+X}#oX`O)xCc5w5eEMJ z<4IB=73862t{QH1yfA6k9`%eQ* z`X^u>OlM#L29xyt6M+4fGcO%w6Kiu*XW*31#l#u7h6sc#@Vx6bN^)kjJlsDb>L-W) zS0W797XQ%^*7Osw8%$?m0S1d|?4-fNq&~R0#_vwu_M|@G{D7K! zz+v0(lAg{?B3Uxq-$_rGHDN|qkBovXAR93U$a$aG6_tMEyk%(0dz1SRn$5`2j`PA= zYghzfXRYBaIdHRu{i^ma0|LYgJcYyulpF{zFT5p(d;4bb-#2n;LC_1mM_7HJe2^vY zIAiZ${nhq%j$Nz2I?^7ck?@|JED8CQ?_>qUB|N+xqA1$>CcXxWiiS1KO<1V>TciLu z$=)emhvRdkcUZh8TEu#s+rY z2nP1vpT-vt+zjD&q7gS3c(ZgDs{=!zbX;DRPQ{KX_~rN#^wGiU=k*<(IKG@hK*UnYfOTl8uqAw7_%oOZ+!dzD{Ic zt5Qe}b2_VN%2bkacK9-48?X1&)3KM=o*uhBV7_<x@(()FGbWyi$d+>`ovqmp1*?am$XaW^s5*Toui zEB6TACfRdg;YL(Na=p1|e~}s$lo@d`TXPi4&>D-#v4rx4p(&UTbCWmxj&d-!c{_?z z2^w*KR!{mp9-gQ)ECzJXiut6bXE@qLU712y$^(Tty;urr7u5-r1$Aq z-yC5_BENWz!h+bJBTWazY8L&f3_7F#b@r(#g&GJu^}EFMQfFU0qj2ytDtp=n(x%Qh zVpN3?ZOudE8|x#!oy+uk?y)cM=&v;~ZJb76J~sS0s7J{AIKA_Ws5Hd)xhg)0Wtx?5 zYLVVy8Wotl4CH%j$H1;_%P_c1(kSEX{xU4Fn*+y>77=BPkjU&>%<}hI5;Ub`CMP6Z zsSC|pWM$52cY`T|>}i)b$7|mv;2AT7JA36?22y8yY!jb#jK&_x%1}cJ!3j(M;KCp4 z$KoCHQuCr=)oN*JvC5@VNr9USmaIe3oI}i41r#n#6S&-xm0|sO+nDQ_(ksZ?!f64V ztOveS5~7Va_;U&QD^ltoav1rq2kXnMrRzOMpWTFzjUrWc_T1x2$q(;t_akv0kSVr5 zUvojV5O0Z^;I7r%n1%Z){#V(r4>fz?^JwEoyru>rY9`b3HX5!P;dT^0QI*=XqcT&# zH9BUv>1CHp6(%O@H7#Z`aE7U}(uy)OE##4WT(bnjYI{Xm%3X=d`{4_Y9@b4BQMdHm zdhT9G{VEJnCc7C(IP{9jTyNZERy=Nux9Lh@YSV||0hRP{@#fs}t%TZ+PnOFpPdAT~ zRDX|#m35=7Jc6-e}_Q;UiuEOnqN1e|A?DZmecmr3&MrSTx% zgHd3JXakF)DtWlNn6w`4wVSH+=P~-sfHb5zQKjo4Tcsl`rd>#@OF#lij;2-pA zz$DY2Joi7|tKo?4^lE%GF)&bpz@q*;s2n0dfCJW@-r-O^8FUo-aJt_gsukOx^pnf~ z=cpCHqoX@ZwbN$ptThn9@Cf7(cndwi3=X;OM^P)bzwzhd{|BfQKO?}C2G(jk_T(o7$Zf%(?oL~ zR$78p!*_$SN1cExZs0EHhgSKHQaK>|DmpOM@!yCLPIy$@519`*S85<5BNOdSpko2O z=H>$Xvw%=q>J6tT>QE7kQy9;|0_&fw?7VPS_CsrYN6KseX_Y^gn;?lojP{7lD}Wb`?XO1w+#CS<`yhe4&nyz&;ejN5l&PN-QORD4giOR|5=UX!Lb611nj6ThiD}E;4S>n z(cZ%~k^raR;e=nc~e z>ZG&8UkJ#9L)D1XY3Iq1)%|BP95+1*JE`8sL${q#yP40FJ-~Wwl5>^zzD${U`T=T(Q znfEv9yGO1;0zkt0IRgse=HvnfYxp_&A#e}m0CNYsYcnw33g62AHM(mmB0)s-%hBEZ zG~d8XSfjfSp~c{qFH*C?6;5bHP>&^5g|+&>EyuvWc(<4WoH6l13jna4e$f>I|6#{p z;t;i*AMRTIyCxpQ#}BOWPw+s0cOhJyd|YskdH|ChyW!&nc*jBb6=^A59u$RIN6Zsw zxc3h%iSTO1vIZ9@2}ov9F(+iJea=(r)!14|H8eFbrPa`pb;~jAOy;}46dvvHW%3x# zySIysJGso(re5mwj_{6RKLPkk#|;2}NoWZCe&aZbPtEJ@NSk zWGqd!f*YyI^;P2hiY9-|RVv1(u3_wc#AH2MalEAz;R4BBqa5#OADcdX*MchXlC#0X zWGtpcf6;}V?U~bS_GeR|PR9GZ1uH%VF21t@WV6!95bsP!W62^t!76E0Pd1lO6&wYK zn@u5MR`^o+(9_`e&+-g4`8E`i)1zqJ@(K_p+ZnzFAiX6$h54X^r?W|8L zU>j_(YIbSe%r;nqysD~yHhIoDcJeN+ZwkiDcYiM2SB}FZD<`Ub?uiIT$ytlI*;4X3 zmtXtpl(iO@*l^BTxkOIYqy&s}5}K1VsmTc&gqRkJ7d&4mqKVM!8pQP16+Hhb6lT_iFMmF-@g?lh6f>)EWg z8RE|?kZn&dn@O486eKv=!rCR0N@bJPYpi)(MEDZwQ0Z+{%eOtX{h6}eo7{JOkOnz@ zDzZB%hEUGTqhMfZ9*>enn$E)9U~P4BrWNrDn0XNJCIZX%`WEt8Y^`b-vCscoHn=bL zcbX+=h{MbShlzK%>En;w411Os1YE7y9q$4^rYFICoP7LnPwa0m#?Ly*0}SgO815Qv zc0*kFkLK9i;#4djD>%x{Qe@yoN%&R@63aTtatL7JH|9^!E{$V}1dikN9Js zf)~$F`P4J-QKSR4Qe#>3MA_g%%YSrD?4m-p zMnaR&XT7uYZEKoY^yU%{uTqBP1lrG2jElgU#0FmZfx-O#-s6Ya)^PLi-wA0T=#9mn zRSX#W;N#@_gAKipi37FvzzrSsbBbfOjz97JsSzwz=Q|eKHBptMwO^P~y~pH4GiTMr z!HLzkJjL-bg3s>(j#e0 zfUJ@gdT4?y^d1^;q&|G=-#pVi_=XXD<}NdVb(f=PM`ECiy{oY^yL15eeD4%`jE-qi zShb7G7wNLD_OHk2V_(o;2%su{AkxGsHl%w0e@1^D3R%lv!!G6;(9 z0iC9;at&S`7tZhs316L$!*HA+8!>*WTR{G-Br5g^>Dp0_N2DI;qTN( zYjUt5doTOBuwSt|P4giwX{|X|oADH-gZ;!SQjFJmk&ZK6=Vo8o4F)#d^>@Dtj?2DV zrreO5P-(iVYW+;Zt&xoqU58ckRLwgxJnvTFe5bL%%`Yj~&y`I+QX(myHi7|{08EYq z4_xq49_X~)9=LWNf`I^>umDM!#RFAQge4dR9_oE^6uTxkkxYZipZ5hkw`8}EMDw1-F z&}mpe9<|5=$_bp=Z@<{~@5CJ-SnTdoLBK)HL0A?=J%+|zz`Agt3>ijcY`0n9^6gMW zOF_-lJmXAc_D5&VWuGJ=i)Prodw(%D%ttNKh63YGk@$6mlyp1>f=%`-*x~K=i?6_W z8$ld83n$1ij(QynQG^A4CqOyJki#$~~{ahjoBZNbo$p|wq{K^N#TOv^} zQixpq+=I*nIb$V0I5{K%p9CdUM=RRpuTn1a}qop8_2`p$K=; z-!IVpO9<{Q`+$sbFoMy$5acS2EpNe^lp#TW$+d%^9DtypR{Z?^7Y{GrLm{7aQI@E4 zXQFRlcyT^B=DJt(5Do*kfl%qPNwqmHMJfa8H`1@8YaG4z->MX?uQc56jyTmUIWwtNOpZr{-Ut_c*<~TxF-5bp=-JpBHE=&Ce$#(0OUxv8&VvQGR zP7~afPI@)USo0~~m?mEUKR(*s;sT{os&xwIJ@AdQnI@{`Um_mA3U=}ujJmCpQkQ8g z8#wCVa-STrCg=F zUU1%!jDijQlp?26Od+KoZ*c+hsnOa~MCiulFB%t-geo>n3s8&J&lfLzRP-!k5fG55 zRh6P5CLM@79n-FQ|3&cQvytd$5Z73R>|w%rL<$5f9NZk}cR~l>-Ug88N05R9IQij@ zQsAGqmj(gXJP!=hA~huiWDx%2Y3+8^V?yVixW*J_h+nq0s|a>^P=sBhZ&>)viz$mTHTdOV!s+nsi@P{*HUM?C+?f@=Cz0l6|`k@7KbATgDkPFPC4O) zjS9$~VDC(;sq_*&pA+~{es;1st4P$ux9onRRrSdkvq}VUO604=6Bra;7~Qz`C3a7{ zdZ;TV)w^E1+BH4TOs_mPAy@eVFQXgH#!;n(==s^r!e~DNE&nrp-pkK*oao9vW(X`k ze2_V?Ui03#P&BmgLt$@1m)urxZ$Jx%I>Ex7Ef4Cxj+zOrFanBBCaVF8aLx?cCuYRg_fC3=^C=l=(TLC+4pIijJrGF5uirm%o zP^3H+G>k^br;IA%f~Z6do-}^*$-z$)DYLos_NMbREp58~Ey_9z2K??*pUz87(v6_H zb0|r@#5198xRlSKqw8)?OQp-C+^vgEC(a$R^;kq{J(CnFK^!+H%LmJcm8svCxqkPR z&!xrj=oZ8{=h2nkdab+PCs>$nW-h&~?>BnuKJPjcrI2%#IZTo@(|EM|26s-c{Pe;o z%``{)ZAYP6SXp-afr`I+mOtrXL0sE!M!?hc@cm9t;(;nZyU_fr1oLq6@WBu1kJmSL z97w>x5XV7~7Dd-sOMq~K0Jr@nSN;Ms{nAbfS?qy94+U`cbQE?9c1PfoYvz0?YJz6W z((&`(Wxj-A%D%p!Pgpy2gRVI^#hc9_^pQ3l3NdBI`wpJOI~V6_O-~Gn4dzj2wHnb@ z+;g+6F}?3;kW-z=u;RW@caFoQ6m7}rPGe|>rY&ATal{AB6cH}@Fg=$Kc1GV5p8L($ zExa^!(pje&xz^7qC+p9RsB!!<12fSTnslj%wez2KO6EIXUc1ye@}-<6nDUG`oBVWF z+a#TxU;GWXE%L^%XwEGcATWVHGWXi{*nkW8{rb~xA@QFI;~(#m>|hT1KN7}ACQEQX znF0;eUy>z0=$Pey31cu9FuVls*b zoUuXPV%8EH9@av`@sOdYQz*D^THYi|mZ6K|uz3EKZU1!_{L9Blx-mbZnybepY1Kwq zQ>x@W_U{yr5VcHI&<&7r_^xoaOg5<``NdXmc&CGRzX(fVckVpGMB+_STf?o6^MMmH z=fCFgIZfxjbNGCHWb>O_)!K6%CP@lsMW(X+Y+d<6D}tJm1)c|}W~+nKpym%DJrFGo z4bJlkQyXYlcs7?|hWC*f7u;_pKxL(0Zis&@y!SJ%{~J~M$eatfQv@gH`kk7!Zz2E$ z0&Uxb{mEDW5Z-%<7Z^H2a{%!wirE$3$aX1=;rHJe`?!kwP4c?>@N#8`-^2@W^Bk6^ zy&0iT!r*H1d~AuCqC9M>nww&=I4;PwXYeV(Y>KPM$|X>gzhlXis`;%ZKPs+C{B-)o zYEfI92CTkViBuyRBZ^k7>DM<{lsL;gHX$PoIeLn~SI4Wn{sj*D8F$U`-k&LA=^0&kTG{`8+PqkVt>zsVtFAuQJ{w zS|+o!d@!3E|F^{9w#1Ps9k74k%o4wo(*QN)Cj|fjHfKMq1o`-Q z;52{%_Uc|S4Ri>XGh1aP>}`Qmd!p*Z{2-@(&FwmkpqZ5F=6*5Wo4zZi$G<^z&)sH+aU$dl{^!bnk6-a2^QpnxD)FRR=hn3DC z2~}=6QAM-$j^X7c6{`G0Q&Myu(YJ*iLia)>3mfKtBvg8Qz zEV_*37kM8mA7?N@oYH%&#vdb;eZC!BkHZ!P9kr=-knnS+|Ej6TXr;`WTB>tHL3u^A zr^3a4{uMDWYIDqS=4F`cjfE;)ND-3A8S>W3yJekvu_j4cFQxK>?8iw;F3n%4(g>fA zAUg3a&RuKz3HExM6DQS~kjBescBd_1M&FTX7u;^((8Ihvi2WNq@_sY${~J9rYzOhf zk81!!eDEF~0)xE2M)Mz)y7t+HgMmtZ5Q)x-7P$-@3J0x!#fo(1H=TZ$qR&<#dnxeJ zGtniDP-k=`y-!Q;Py$d)3Qs;iH>$lx6zJo8f{%fqoiT`(#_^g)6|sAXB#J+YCHhKI z`{xml5B-v^QBO2(<&_!Um{jo(}1+47aLkzyi`_|$5|v{*BCZR`HX(&8H`LTn9cuc{|?uPm#tKe(*g%8ff^%m^!vTNSeEu?T~R2ZQ0cpA7h=p9ne~M5fFT9C%(2zAD*MdL^^{i~E%QSwOw-&fF;NG=(c6z9au#MU1S^-6HZNXJdmRYvT zm4wz2MWR`F)Mp$mkOTTW*YNI<@_Bzy6154U7+loJ`SMty#PlAUDz`n-y?3N$WHHAs zTZK)aur3hGF1^$hk<6V#zk6;dcQCR=60L|=JtL$FJLj9{jF1(Bax2A?vm`bfNcJNk zw_$FHBNHs(X=ymO#P5VNZs4eFH*5ak=?3)IfH^bVta+dPISAEAD-P6wi7cqZ4#_=cZ z%zkV1LyYhgMV$rO8T`ietD%%GA0BQg;EE5|n@IT?M`i4NPYivf#R@T7B^!cF zo33=kQB=J2HkQ9pr+jM4er_!;>NIsr$~bJu;^PPWa#qxZg=x|J+~} zzz_B+S=+PG2Pj##JCj*cd2gDsj|~B1JZ|cq>c`58kEy5*i%XtrQ(~%l7ww|E<(Zz&i0YU&(fkfpewx~`;6bLD>iI0F!12k+7tKk z5toz#RgDLc36%|cSVKd19~f{~T0u}_^O4g6-GZX9>0FrDd*{;&ZzH}Qt9)HwDsZ>o zLB3@)FPm{rgjL35E7=?^TWTGPxNjQ$efM#5E|Gp%sBYVkAE~m!ZL$u%T6?%qJ(~2e z{b{>;8)#2;5U9$vcz(ca))JdXfWIlFfB0?2JUVFt4^V(VA_<}D#M`ABjxI^lr1BE? zg*i543zLUcbs0JYXqBa(ZjIyh3#;p?(wSJIm5CCv2cpOkbx1tBKYp{1Cx+@?U~5g} zouSfnx2Te1zMYS8bFYPy%S8*HNm6^sFF%|Wqg7czULMry)5X>G!Py_#p2EuZC5e35 zcP9gR*6c5?K8;uPr)rS=OXtGkcx(}MB8i=w@TW{si9{5z zB}}1@SP3f%(o50loqAT^Ga#Y93q z(9L(aJO=nOaS1@ZW&dc)?>#vCH@AG_z^}JFxSzxw=EB3I1@J69+|J6-&3DL!=i}rB zoNE4X;rEh)e{G z1$X1Q&rBH%eN^;-wJ(ZMR`vtoG%alsi_DI57_Q&(EMYXMQyRe)V1AT^Ned=?`ecNQ zJ_G%j+53kJ?%n5m!hD<;;yDO}hspgs@;3}h7gW~I(VI9TPT4rcc38Gk3$L{ZHkTAA z5aOH>HF~ycEpRDlWaU~_+GI#|$JC0>b&fA_N&1gU8gse*0lLCHEAi+O|ZAnf+|;moM*Wap3(7WTlGj9aiJ|VQhQIBGw?87oZ&jhg}`0we7Cq#(^K2ln13ySY?=;SC=pT81(}}*_c8?jfcMEt`N;_4XhZP%KHyn z3b#sgESL?mr}l)=>rQ+jljOLs&)f?v$ifxX>o zoum8Ab+t`-RYgmNiS5+_g65;H2~rn$IRq7+XyR!RiN%wp@*WRK&$&6AUoyTfx%LCkz0IKyLyzT*PxV_W_1kFSTWDA&?+DQaiLIE}% z2i}woOp8to**2yMa=K@ya_^d`{k>~k_~`rso|dx|$w`(d)uc9nWaU84>@#ma?T9;$ zgmC3NIXO%;V6qi>k~iFL(Lk^B>*W2<2JK$L0tU$bL2wksc0kANe748!kc(5Blv@81 zk`s7beJa1oQnI1`7|1D_^Oe}1$Vp#dM#;YIK8sSjkV9w5S2V9*r9Swn0XYJI zHkffVF%M{7fz(d$$AY42Z{J$Q*EKwA>>${0X3>;^C_~GAXXfhK_cQlTmA{p_AjDBG z_jG;$K?5UE+TD<}iG4MVuXs^bmg&m;Sm$kluLykt53ylw7nqLLaB(cSovWedZojPc z0(2c3=!Lg9|5 zn6F*H<<1R384^2Tc&?xjdf%K9G6dU3juxaRyM|Ct)sOE*LrKcus5p6u~yiPl^O|j+B)rRGudD?r{hgqGh ztyGb^)x%b7%M!0;aF#qwKK~7Oh;qKQU!Sc!Z7+HKsm~r!31A_Ypw#}a#^%kAp*4J^ zxt3L4+&TW$Gv6~?2i!r8u5(n+FAjw%ArO6jPV&u%FWp>v6egT70$eWs zHJqTm@d=#b@I&9uf}4f!bI1lC!Unh~S_FIhO!!-9n4p2;7YAEyF;u>aWI^2*jqg-Y zzCWqPLZ23pmy2C~G9kx|*y3)WaI*h0vDo*Sl?Qb>GfS=L{=_E@^ePmsOZ!OKo1USm zoqBkTI<+DSOm(q3IlV`#DCXfY4yrx_10#d(2{*>(tV_Nx8xTs~+W2+_(!RpQvtCD@ zjBXUEb5XLpBZ}9&dYoS7uK5bV{e@-Xd=Y8=@5uS51WlWopRY(p&{r`@Fqle}WR_W` zZt5t8C*2UfT7dHzjiuL$A12H&DHL2V!%3kaz}t3Gl!3VA1;dZ>KK2A$ z%Q&c9?`2Q>UUq+U0m8n@uGI0v|5?4LrvggUB%hywR1?%hIvbC)t8^Y`nVqDPWUwnQPGw3($yw4uL~8%LV6(^s%N z{^%=KzfzRJ3JTzA+|JSF&)azL5DPvy2UH-y4f?%E{P^=fYo4<`*~a+P<|28H8Gni-QKNbr77yBKl7LXd{mrO+=@QNNlCCjU zNelFXLEeOhR~D8dm`_zBxJ$~n21}9*(z~5-y|A{m#uo#bb!PnTGr=Qrd%D@Y5PR8! zo9GMW(n8EE%C>GQeEB8ZmFq2Ru))B=ZHA<(aB7BY(N-VUz^xcUNDRk~po3HUGmY=ii z$Hym~V%9=a#r17;Xe7^GH@eM3wtCJQV@T)X^h*lNOn>vzM5;D<^)A~lldNHlT-SSg z6u`N~z0Vj2IJ8j=*~5KRJkf8l3;RgU8MLq6!@qx8<$YJwRfaiN!Ej5PP}BUY4(HtR z7F%1hE?yxzH)yeH&KuZ3-ECN{br$zdX)!r#2EOg5VfSICNPrnyIFb6D zSh6Q-0BbuyxP~UMKN;iO_G$hJ6*qK;96&FNVnuA~{~|TE_Qir;Hn`=1IDwVaSXOAy zU1P+bunNU}-E0ktAAIq$mdu&Zqk38_hWy@#4O?xpN5axLgHrmzLcL0Z4i2{OYJ-tY+o)#rr^G9x0_z*+xF#s#i=Fci|#| zAjZYom8=c^6VDmxaRgbIROrT4LTcOk=T~fJFB{(!uU{b6A;C*U z>&&c9E9|AI$5na$ZKK1lp6@kB!v~oA>&Qe1UcY4s^m(ygX5zhq4bZZ11N!Tq32^%? zmqEa&=s|mmBV6QI9WAlc`a0Vv2C~kRfMTWc5P$y*+;{;dJ(;~PzkQc2s&471zF3Wv zoCMDLTzfkhdCj6v*Y0iuzr^&o^Gz(sTv$RX%8FyTdGpCvTnehWE60u>J72@h0CUL#%A%BIh67<~6jFUtmTNOg;lo zI{~ltGXyY;`87CTsL1_Ogb@I9@&f-qh>KI;4@Ug$NM(rV zgB-PDM)9|*z$`8bYm70S%J<6(;m7Z{%wMu_<;70e(DT5d6nK4od^DD#Hl0xJS++`4 z8I}E}IC^+lD0a%793cx0EMwC;S3b)Zl)kq*X?AXyc+4V&mOcduG0g#A z^>O>VH#3Imb##gGfuRC?jEVXbH7`b=H%p4Jb1s&5HtBH}*YFR%r^KZbT6SMi9YkrKGTa&?kx9WogB0*wbVxJ`T{0( zm}tS|OYpE+c+H?8P?`9b^=vO%KpX->8V@HI2!0Eu{btZ`pY8AO@pSbP_OMw5RGe@U z@ot}GXfBPfI%$e2e;^4-$Zl&|XQ4 z0uu|E+~RL6fW7wf`QgKmSAZJ88AkgRmtRVwJRnXmpuGMeFncu@5WqVQ3M1Q}S5TaK zYI(eqCcwm*jaVm8Ao}mkG*N_R-o9QZ%-4w)UF2MU_gDr6LoiZ-6={ud45p%plKy`AxNqiH=%r~%3Z zX5B@V2vJQbzar!s?=0rVz;L591yhrhN}`uN#fY^PGH#5H87gSe4=Jho7nLn@s&mR? zdtX0cZeXpBcq+blS^-Hk8z#s{J_~}^>=^OP%Hm&DOsAhAcC;!*l3Ms1U5SLc_;aZde;_y zXSwOKB+-5^04~|9RX1Ljn-)&0=37@vgz}BdWsb_4;hDAyj>RT^P$DBJ?{&|G_fEX) z^Iy^!QCX+eZfK4?%bHM;VnL7KakWsB**iX25XLnHsDI^&81@XyH8G z#xWA)x2f-Mb@U~n%Xgek^erQok=dIb?DY;M?dQ-5D$IDP)_s|#^I z##$xH31?sg7U1UdbESUrj=!_#ArdBFCh+qo9FBMVPM6tR$$(S|JW%{c3G>I7?cyEK zhVX#E+Pm6^tz_)#M5s>K*dhw*zyT9+pk;WwiISnZsYE!!`HROe3afZnikLxsuZ*^z zbG-w-M{=Hs#uz3TN2L|OO&NH>IJES#ljZ(Eu!O#+vpdUypbnu2fU(Okdl>IV$6)b- zrs@U0iU+0sch!$kz6kleS&51&h2(yk-u?9WGl}+T6sk4-COT3AZ=pEZ_CQ{WoT!)K zm)`fAsLMxL;$qq}F=JL2i&FY)X}%HW8JOkAanD3C@98&O?t67h36+( zNL-TR{f|AS;K#CglgKDTtI>qQ`^GVpldB?Q5|s@c2q# zLJ5(U!u z22Wa^7Ywh&j61zENHS@iI-fo|5mB?qr>P$&`CaT4UeWq`Zx27u=9=K*=|r5b-1WE~ zb7xMTuDdSy!6h$EJWrfCU)Is+ETey}*VAt&7q;*|FB=KLj5k=E0gjOf5KtcA zET9!@G|xaNdy(1(?Z<9tP=>-n;>ZrgAb1^$A<$#(Jy7gEb^9lyalb+FAs*NRCiIl+ ze@xFV_2YroyabVvHGDKe5UV&^eJJ!a<^4p&h&Ul>EfI zjan{wm9L#)VYf^Qv*X2`br#xfd9~O3>eY+hM!m*okW$NegIX=Yt^a6k>k-yDi{uB9 z?#Z{NIFr|%Bs$GLeWu^&zHdc75~b(Y@+!2X)E+&Ps~6<)DB%va+39SSa|0vRo5^Ge z4b|SXXqjf_^1{yP&pUY|`EFD`Q`M!rgQuAx_+GdFlSj>212WkU6Y9|yS)?|ZyrTKB z&TS?sPL#h#+`_HQzdQ|d6C9bz!0T2Ffja2y*#x`eaeJ2Xr&Re@CoTYtD#1O#2LhC^ zJrM~Qioh3%0dMbD40A29{vxn5itai@b?1s zuSM%#ssaXvtPcXJDCVcbPGxXXb_mh*Gjk%^1+)oX*StYHMQe2D*f-O$8YbO(5t`Zk zeKwm8XXu-&g6b{l9|>b(vdFp?OvZ~c*g?6-7wzH4QdL-@y5GrNalZZWy%ccMx(dx{2;=(mJyY3 z`*m%h+c)$Q@}lt}#H2-or=5u!S<7~q%vR2d4_x z;_B&lq!-G>9+_CdYf21(9?R^B;@z8LPjd+RVd%mQ4B^5pbN=|UpUolMcTM+(u+9t+r+ZY+ z8C^Xx3O3-mPhB)=tSQoX57OM+A4;eD1~gvnZyN$eIuY??uzc)5+YY-&86N_{Yaa}O z^2%SX`@ZbCLumgfd+y~kVBpH(!9gjajQp4J*@8Xe`Ex10s3@`{K9@9uXC1ZAJruW6 z25he!eNR?AmnLCxHQV&M)JSM{W>X17m_{8C@DVh)a-H>sn|2xmtyAT4qY|<9`k-Iq zvsTedwYOa8T{Jnx?sJ^s)5nz~7FZQ{E&U2A9JjkK65U~R`Q%~QO*{_) zOp6ik@iq6Q`5lwE-*bwX)g~(2KeY9{*8|NfuWcWk#p$VR&icf7gIr_u`yCEPX2Z0V zi*gZf{Dh0OrM(f!s6wk?CG8`72}7Nw;AFc$s_D;Xwf?Q@y3a}&^q*N>#l7}aSBaM_ z958`8G7W;);THnErSR)O-a7!g6UcwknF2p*Hw^+qUl2Gz(%EeTJ|v;k-4No`4@7be zVs-e5f=bHRLBtV!;WKg!j4qQpQmsof54Hs4q1APZnJ|qeFu+;XV<8VD`*(F6MsrwE zq2QX)wZaf$R;9FWpJ@@dG>#q7G`w{@TeI?Vit*+k`u)UPM>`-_`IsG^^K`<~{JMS0L27wn_qRf80-I0|tD$4i3vUYoNXYf)N%+Y-3*h`IrYB zO0+eVqk-&o?GuQxG7_{;X*`)(dMwl_aN@(}JvootymU|P^XmF=Mw6m7vp1b+Hn~ij zJ)jQd(>W2QPdp$zDrq`wD^%%Iy%xyvX6aSO#B`g=kk#R?oeWcs%0p23b%+0$u6xRyYoxgq8;a z7=?!_sCi{vCrU*?EP{YFGJ5iuFIjf8ZqG^3cQ*VR>}S{#FQY&2s2m**3Fy*W$FOWx zCF2gbCgr$kPVR-;NEpTgGZta#NATD>fZ(+bh5*BrzuptDVv&av;H~i9Hv{(2o;(dT z6*(YH@70g?Qr(0(T^%x*RF{S9eWGp>bUbxdHzA32+f-5`cl#<$E$$WQ?fj-oF? z!2A*X8-Jg{E(m&{f6&g~J@MBjN_V2!ej3~m<;x|SU0fX)lIB|~?#Ovd9pl!MZ%HVLFM(6Ob4jt4(uD+*3MGm-I)}V8$ik3;eN98t39ox%ZNLg=lXFFS0 z816?u{W*#{RD{AQ8fRF!Xxj#MfBOfImJP4PEd=+k$|r%zIDME;lc2WAp2Zx!BF?}0|KN-wGA*1 z!GAQ(ww8cpUV7rGmX_X>QG_98-;G6CONt0mBHfbG zEsZoNDTpW{jf5Z}t$-l;-5bwQ;n~KP^Pcg1@B5z)$8e0ju6wRE*R|&S&4GR^WgDxh z1^HQ5gF^l}g^KAMJVu%q@-(ci(7E4F#VwSMFHeZ1%o$AJs_gMDZxF`Td^OIEN>5)} zjBV^}d_~l+icBSZkjeKFss5h0nz{Z9nf`Y&63(aCFVLY|>9&_Vd%H>Bt{xl_m&iQf z#*zM-^@U}j#GdP1$W;GT{pHq;<{VjjI&B`6eub5tU`4m*p;Zs5?n(*v(7! z&lZqrbd3*hFrZPZk`7|BB_y6R9T`;&9pxatc|aCa52JqiBE*;d6QgrM(4uoWf#R}% zN7ese=l=Tg@ZGHALGl_pc>}IHyf&D`;Zy|LFf0njxt8RP|9?Zq-&ww8^k zfEHsa8vWA?7t(S4tBbWG%7Tn>R4+)Zm5PdoMEeOfMLa@^iAyAIt{gNPWxfz}MPp<< z{>HVP%ve{u&)Q66(FSB!NY5Kg_USOcLb67c9tJ%yv-hNKCRGY8P(OIpA2FC?^Wiey zrBu?({b{TnuKJ(4>fK1`I=XjObQck?2wY5r6s(7c*%NK`(86;$!E+J+m0&%F&;2dV z^?wE{eNJ}*=TCw)=c*_*P&i7>zzH&;wXmm6ul27cjLhU>eWyOX>V{|dP@+Tb1;MI7 z{3|me6RxZ2`}_`1?G_kIRwuXhdTDu2vyh&*IBWJ=W*s(<^1O49iDsQ}xDnPUG0C@J zW%^ODUeUOi1yR)#TP#3BJ#SRAKTbY9y?N80T0MR#ChJ~v$xlF|)~-%@S9d1{c2?K(Er z;yG(aRYOQ;$%zTTAZQ7|oIpzPn;QT18vbV%;W7O0f1yovV(KmkTIwz*aKQfN+Mg`G zj-KNnpt=3m@l_2T#pk!<9&kRg$T*QH>DvQJ?2BQV>%d$JW_mHN!@btOd#~PkFAf z0Y|~&_)c=g)VGxbEU?+tZfQML4wD$Pf{4M(~l+{5%bW*RhNNi0NN!pg%jg{wEB0&J$-1(Bg49fduh4*ZySDbu?@E!_y0B zuj1xR;FD5y%*kP%9OuTQrw_5WrFipn%^m^o;l(!LVoemURH8{|$u`4PVv;ug3#o#E z_fDs~UK764FNL@aLwkntPOylMlr1?|hr@VXIhrrRnIeNw9>Np zl_ikf!7e~UiRN7O_cjU32}adGwru&MnSxS&p&Mg~&7N zCYLj#s5LfM8)6BY)+sKc6fI7NRx_liZ5miu<6RzgIb$3{{g_ET&}&YJN&POJPcnJP zULBXMg;FH4H7k!$puBQmnX2;*_0>0ucjM%D%{EE72g*U|5AAcZ%wNa2H+V2FIl@kP z7&k+V!xK9aT+liaz?JUkx9~q@3LgX5Lg_P^V(Ub5lz>g)3Hjh`z!VllTWUn!-l2m< z6esx9xcK6^OgqkiDg$mpW|+U&!^i$I^3Pp6;!_hg>eSKT6Vlz!oZF8OR&O0y5w%JWK?8c!QLGnSHJoY;T? zW4}knqqF&+wcNNvz1s1SoxI=B&7ux-Z!X)#(uu7+_AVj3T6Pf)jmhr5NM1-LEITuGjMKxi_+trJ`OO zAe)G7Qt1Xqp@~kZ*8k)zRt2Rp$>~z0e*Mqzg&asa6ss1_x#k`#^S34AZ@s>nD|g#e zS0Z6g1Wv2BCHV}O(cdSiwY;i6#K=8ymIO5c7hJLa!(IHyyX?tM(4$$>f8hxVk$4N$ z2?{mx7F^E=)!P4ACHgVs?SGk{2pMn-P1XoC;1)1Rj;{Onr`3^f{v<%sIisz+A_W!^D5i{2lpORL5#h)cw}tA$I#pm7gsvjJE9=aY&oaA!_wR z&r-mIhp$J|Z}sPcEAs!15C5p~@!$60pZGwBn&1jXEJL;Ke`fX_qqzPzZuSrl+P`U( zzf+S2HMbR9f&0U?X9M==BULwCEL=cZ1Qh6UutGg+4Fq(|fB$d?0<4o??L0;yAZ#yI z9ABWLn`Gq9a9LE0@@XnQbMB^YVOko`0KTmitJbPmS(foy=M{St>fSf7wVkUoK1`?&y!WTp}UmYOUlYfP9^#`Er1+R?b|5R8c_RCminpiw{Xx6ZCZN zJ?CJKy~MXO@>;Qr(dwkSa_9651_yGcy63`+=05|c+N`Sz_B)>J{ z0)rda0I30}D<>D!mCeU+u7^XlpgP0f`~g5eczuCH zMB;1JE%0Zc3+fAd_qTRCXis?Xmh;2ij_cTV$Hx1m1{WxBXJLbW-U%2~_Wgdx`5OmL zy;_I$2rEwg4x>Xr}ep?6K0-o45VLkVRyUwV#b7Hoh>ojY%!YT zLZfnoOCVDdNBT7l*Ma@nFea}H(@)QJ&zjJT%f7ISnBH#5(s8nkLJLlN4|nOtb;Rx0 zWqiWQq{Q7-SpGst{#$AHZw_0(HH8l^HqFwcW-(8YaMZ*dW8P3vM7dO4;Z@cqEPp14 zoHicmRYDe~9_}Q6M{0hF$x?T_URYi$Y(S*1$C%S=6dWwZk9{11mPj0HZm@y!7aA1O zrZ;m`Fe90LugDci6$Q^N~?~j*O;BVMwEfrWj2sTaiLwT?%UkNRD1{HF7*J#2Mxt6poo(FLM7>ewNmp;l z-|f%v7<;$vP`wMIXQNAx?$whtl3Pzotc^8q!j02yPG}N&aJFgYQ$sDp5|Hch93hp&7e$Z+wlpN-Gt6_EslI>`Ddh_A8?XWUF)wisCayQk3}QG!O7Omh;BSQ;w2lp6RR1{aj@)cO zAQm3r!pg-0@Lr(b7LUF+{VAbGRp7=AgKxW{EFwU-VrM`7{S1}f%f~2Vg6X(v5EmO# zMhDem1J?uSZZW`X#qTaQ4+|I2sPTu3eKeZ`&az)6b4Ra{U+FBrTI}@ayqxDG|6cF- zFH|?*+o$&-tv5uPEOhG)ZG$lI4)AZR_c5C6f6ID9df+fHD6AWCc(d@_il!?l*)^jK8*;vjXr2H@@xb-_OPZvfXIRplI`+c z0;UA^rqEEdaJ@pY_x8`sh%utehBLwdt5b!6C#>+-C|A+Iak&flKL66UDqW{!nWILWcn;$ zb(OD`3&i4PnkTYMNWLw|$0vawKl?Doj?7)wO>r~SS9{?ho5Z;-2$hB@#Ar9;#WQbGWoZqQ}~U}^pp-Hzo0 zzd<+qTQ_jT>AmUtnQo{wfNnT1B*mp<;~!&u(QUx+RhRi}-zQy}s2V%%C!tMRS1s6( z8YI=3r}(z7EY;U|FujW}dq$){M}>P+Pcw|=%w3cIE?ph4Zh?Gz_e$gcQ@02ZB;GsQ zA@=lS@doYf9BlIcE4m%Mo`Ze^fc3p@c6QvGQib?xRia9-ee;)nC-ASOK3<_qNoj9d zW@5kCj4Ndx*F%|z9e{J6$Aegb^3(Ggm8)Rk7W#~B(C})U5}U!onf)bP%|`IBtK)%s zJLkD*5UISV?3}NeFkcbb18Ht=$M=aTBrNmm=bo7pY+ThA;x8P<2_ddLzquFs?lFvE z9vcP3kb{(CKoxROqgcT-=^skR2?n)(OYneUPlt~;oGcvB6WrO3(^!9_T3bg^9^FeA zY-Y~nOcY)$Tqqpqf9@qbTz~m)am15Q*164W3kUx@n`5gpU91>`Y6esOje1j{*o3$P zG6#JLY9kq6nbhUF=#4aL1~zhLgcRBaG0Mp-pg^QO7SD6b>?u$7Iy8bR@o<*{r?L zLu;Ub|BN=bq2rBQR;>&{sT<9E{{03Ov~VL}YN=JS361 zc%h!d&UTFQ3Iblxf0fJVgm$7GGM7IGXjJIxM{pGtJYw*ow9?K+e;+7Xkcs$sJnIgN zq3$x-%yZvV;n_0@;`D}+ml`n@4!A8rg$9{4_j2w`20Ia0Ve|XN5_M4*bFzvdM5dI} zNk|pbzVX%y$WCP#u3;8sq9%~Ddi}U&)$HYydqK3iB0)V5$lLO^qO8XGb5h1L=4*zE z5g&l8tFrszlcp0E1QitoN!&^ZeTf~fE~w^;3)QjnK)RQ)9a2qCwBtfeYz0a~eyr$` z1m~}y{iCs^Uw+wl2@W9dujD-H(H*&!X~q6SeKMfL$=d_l}xpuoqo9o{Pb((|{*k#0JP=> z<}z@wK|NWT4X|U5_!z$tU76s9vM&r};*rMKT8nxI=0Qh(%6Z}(2WmhoP`2}9IYCGD z1ZwbkfQfB?aPl3sP!541zt9rko1?>l;jH@sL44YB+jdr0MG(0kCGcsyXq{3*IB2Lw zL!RZ8k&gV>@J^Z@w!>9hmU_?zPvig?blQ|TxAF|x8;@FB^O2l+Nk0MLEh4F$t-&Tw zdKAV+YEqq${Q62kL=84GX}`AiHSL~vE_Cf_mUp^aV2UO!?!5A)?8C$|--MqIZxv{A zl()_n#%f+4Rw05d&=_6jQfP~foeC}C3gSPgkYnMW3s?Leg8i*IAmYOE*sLKV% z2lC&_!`MPP-)qJLNoI(gRVeIaHmEVHK+)Jym49X@1G8}1fhhkYJDKemXZ3fawhHSo z2hYM?xf#GKgOi`$6;XI+nCEV{_+8QY$mv+>exPP#Q5xB_!j0jfn#y1Ub7n8IdjX zd-T+^&-gl&HHbbL61Que#c)}+&=4EUs&|Yhc~5z1uzR(cAro(}DyTX9a?h)(i*jp= zgqYVtH7tfX*O)>oM_E~BjJp^_wCGGD#h-2$Q?J}fOlB2jEHuB$RKRp8ft)I98ZC@* zW#XE`CS|p=V6M;>UGjk~y3P%wMMn35H|rfV3d(h-K8g)LUxi636oSM-2Y1ALwbs5C z@Iz(J9oBI`b>RNY;Q2?*xnro-f7KcN4O^P+5Eptp_k?cop>=713c;g+_CMx~9%rHc z+Ftuf_6g;i!0*`75NW8;Ek3kX3s6M&Z!P|@;ON~+Vj#E{h z6uy;({e~E~LW|>{I<6NCyE*OvE}2O*C{a$7X1%GLQilWUaE zF+6&QC7!$Bfb01?;1)<8t<8Tb3A0dOFyM*ziRngv?dfpsB7dYc>_QK($W`s$_li+{ zO!Gxmw_TopZ%beAW+Q+o9YjY3icTgrsHv*p5xqYQxqsA_J`Ps>ziLaLnAge%pccR0 z1Afak1J9}dvB>|VEqx5v`hUZgKIDv^D8qr8p$cZ~{!r0>&Xzt-Q2qbGmWIqeg~rB& zntjT1+!6WyqIT5wVgm|!0dD!9*_g-Cr(kHpFRU-CP!O1N=DWEYz&$_VY8El(h;M0z z3=HBexv@vQ0BEs6jrTf`Du~ravfI&1lvxA9M^c06nOU!)qugas;i!C7@jMxXcU$3g-LDlHB-8tPQv;Nux5)-hCiOQdWeTJ zxn#$9r?(Ip>vGiKJu;7qbeyn|?Oc3>d`7Wu%QHijw)q?jaoAX@1ntpHQ2}9 zCkr?5s?W~J!ovl1dnUN}{m6|HsGv94;)rQ2P9xD|omlbQcG3BkYfb0LH9;SI@%E0kp|- zQT|!f9w)d0gXK@4gI4UE#+mP`(&Ol15ScK7@kM()Kh6*k+>H5q(4|Po3v%$NOG^Q2_VJs@qcVL6qXe9t+f%Rd7q{52ZNjX@a;}KtMkAXQj5s zIIAG=o9?gn&oCgz6vpt~+`%VyWTm_RpkAvl507xkF)xWJKo?nOcV~=@UX6@4tZubw zhY|sA{25A0SCBFnk?g~&Vm2+uWT`XLH>;zR~&b}QKbI3noxmj)1E*nJmU zTtHI}APff!FAww&=739fWRC+sEB#VYp!k6mr*-od0CQ+uiwLwTB`EI}Q7VhZYRwBQ zQ5WCa$|6QM2(q_zUL{{~CWZAqgJp;FP?l(g817Ohg2dC&9lUB1m~(j zIc%7P-h4yMf#r75u@~)b8>yE+Ojks{?w?EI#Uh1|Q_5)@DuIn_(&n>-LQ=8~8`+rB zd(m#hZ9KUlRW3I7v64n=1Vyh_0vl~J;$6vsYa{XTF0hSTP4;!~P*v@uApy_8BkR6y zcVFL2p(<#B8rKR=K!00QZWi$5yFV25*rU;JG#MTuum7%4N(F7|xmAKiEe0xDqAF@! z2=a4;#uqTXDAExkp6q-Sq(XRS!RI5QgdcR*XjwXooyI!l22-VF2>~wNnJ(JF`T_O= zImpc$ zXQjp3!J6M)j8>0fUo;vH@gQYvSY3rf$M)v>(xZZWAMUqEUZ3x^-s(I(w<-f^U@6;) zNw92ClVHI>@gK_yMiqQZU)jH8uRJWEKPc-w{B7T|S1_31*Rjfr4kv=)yYm^ps8@fA z=0>F#n$x_4{&e3%m#J}QC-KJgC}FIzv)BFoSnP%?#0~gV&UAJ6D*BFObzJuMOH)u^ zRujq}Q(|JuY)5j1r|Lqbl8||Ewup5labYjBw%vfUeSS-`MN~S2=d_(&jM18JTb`+b zDckwUem-Yidr(Yao1FY@%AtrU=Xb{LTXX?Rt8XbTl^7&)KeA$raKr44MB5&2(mxq##4#Rok3p|3_&P&hyhF#zq*PG4xrcoal zNv}Z^6=JRgm8j4XK)wC7UKHpRS=y#>4po|svhAV*@XdBz3(#|*@Z2KX8ziR zZy(=+@2qA#ixe+<>Sn#FPmd7XeyGEEmw&`4e4_UJC(B z9hk@ng5E$l4v77YN~G^2)zMV$rn8kbeqOh{z`3Q~N#r?Q@%33ZXHjsVexATwIV~zo zwe8M;&{<6l5Mq~}+IlM0vgWMlgKxVfDh zSFyFb+I{Q1Lv>Q@4Mp3q;$+$}&S=#c>gc|ZCLbeJaDy|=RUw8bF2vLcDsiEFq~Zcv zPk$`#krNh}_i<Nl^xt0H?oTv#@wtcNDH zJ7`aGF$im8LfHAk$_N1-9xBa+x~H9i2=6T#TBuTo&`|YI*X}Ey@@XhGR9>L1l76UR zNMiLwSDFD?&}|G?PY-VuMW=L%VX2w`Kk(^OZzV#m`G=@1Iv4cT9l%5i48N5%Jl+cA*Ktn6(xCwt&2`$m{gK~Oi;m)7 zAAj%Z)u{}pvDJLwYdb;rf<%i)?qZM_r`m?|3eWRVa9nK#ij;%fh-+hBdgxmLI2Z@Tq1ScR0mw@6ttFI-n3n3#X}vx1r67*}C{+7nz>R;CY-uXr|-0ZIPoCz;~ z*)H)G?{e#I&8xTEUmt2*wrVo7LyX!}zt(>aRa#LhC!WEB;Thp&OCqiuM+7sf;VTF_ z^1?)A=3b*bqpSu}XqHHUny%UuS9Z$K==NNdu0Bd#>b>to$#*63+C^ytytdojN{^gM zqQZF1U~m&a&7&Sn!g}qCd8Eer+wclL@y~1F6UrsZI(SMNnIH2Yzh54KsjZ&FzJ(Qj zZ~XI64SktbL(OuhceBC#hnHd(Nw7DJujoOP8)7mA&AtpR>y`^>3jeX(M~x@o%>6Ud z=@{ttw*cPX*Yp!by3}Xor=)qOIH@APnx90y{dTRq!4le-Yo3SuNflr)O0oC?U?%6*z zqQG^q-!8XYKsi4!vl@8BW`!F1#dgRE{&u-#1N}xohsy_oJ2zJL@OkI;^oO%vuQODk zk6m$7#pb)+M86o+x%_h63E{&6J#ClP$B%+{aFzJF3M~*K6~)6Ss)ZCB&VAHzDKYi- zozL-8#uUVWH^8x?vc98K2Ye;V& zj0P!JM~FjHUfrX)+^ptaPdSf!K3D7A%*q?4{5AGowg5Ne-kA1V*j87T*u#iBamHZY z;RbJA)OF)on(s;^&FqQ8^rfO9OtH-wx^8K9IlcD7hTH3a16~*_bBM~HIOT$t=F0_k z*?+i`AM4los{Ehy>>T6yf*b#Sxs`|4TLX`BKF$J&PmNh+=d;rW;G|(~tR7{Od$mZz z4`L11%q`sS*L@-_Ar>a}7Hd-(2loB8;I!!KCw-K*PW2-E7hNs{%A^rd#VgNmu!WK= zG#Z>=q$Il>iVJeVeh)Kp*U9vXW8QPVxT5o7-F~s|%I;^%3Q(~aE(_1e+<9!d=n3*S z9cZd`t%qk+=FmmjwX$&~?Y>)#5Oy}g`Nrh_je*TBvWMvOr6~R4>#tsvbiK4)c543I znSY99LhGb=yKN%wo7u{o2}Prrk)EHhoR>Jd%UVnVl86xenQ~m*YC*TZnt+ zmzf|54G}mDRXz^5yio4#Kef01!M*+Pw|(2&f5*7A3Oi)$i0|BLWqveh_i@-zO9b&E z=cqZ={4+0XJn{7fd1@wl+?m$;=fq7DTZKE?L~HkSGpPEmi_g$aH@V8!^bC@=vidiw z6BFgt^`cA;H80KT994B~vR)CeJW#^hJjIMnFk$4<6|$ z@=!~D(TEK}CuF9UMGDSIbq~F>4(_Jc7qr|2nTPB#;#h=JrFa9IA~=?(`e@I`^(`Y$ zCfURk2n9e?_QYu!P(lr*vOo2>{=pDFPA~?ie80GASt%a&LXWOoty8|+_D*nkfgz_` zzP^A@gHiM%J>o%w^En54+=%PN<~(xD+T*InrMzM;WSV#(`fSD=G@VXubzPu`O<_j=OTG8bfhj#U`V5W z-U-J;sajHRd9MHz5n_ROlGaSjg7(@#AJ1+k2SibgU$&63gnj+0UShMf5ML(gp5(44 z!X#1wF(Q5oykB}3$#uKUY)JtTwF%>wwB zyKPSuz^K<+k+eDbQ?(4V6vUL(7T z0Wbbemp}q@rr(V3X|#QqQ^ovu9YaVk$J65Zx7}_e_BR-!zbvGnjaw59lFLt5zkGTa zCORc$WmT>P){A7esn?*h--F4hn0mu#XgNXFjnDZa8=lG~XTu0ti!frAaxzzjS(SE& zk(~|ODRiO@epZNad*Un#T6`}TfQR|9q-;Qw(SKf?c!7%(^!PKLqiz=%WcMpc3zYr_ z*J+vCS$yIGNi*i?W@o9Q^CsImH+u#1y5rZOWM(Red7CXN zW~M9gWw^I@no4~RpZ6Qj#)*4W);`W-shmiYXvPIvuIHVW#7T2+t7YFuFOd?B;0q6U zZJDY^`v#>v)~)KC5u#7O+mK9b-iJ{BQmMr;vB1&N!hvaLCU&IF`|1^@waF!S=c@`Y zbS~^Gy?oSXWsa((3Sa8^9G1<@;*IJHo#*FEippe%kl&-IOG8o`A~+bTGzzfvp$y*N zw!ApFSh#^})t^ydj)8+g;3);a5xT$yxo(ruzSp~?q(B}BT{l%Xtxvu442$siA2zMf z(E<=6P}!f;;2P#>Y5Do=U6E>+eef6qKWyiDsdxd0&$Wkju{H!}IQZxg_oG}ogI+K- zO6HskT_%6=y6vj|QtQT)C|a1lLq$?EWU|tCY-m9rH6Y zs+p-f4tuJp91b=!w?gQ6=oQWJ`g9}MS&h1w*ZFuE%|bXE1c*;y_}?a&JZ@a2F;XUN>}y6{EA!~3#$$L-L6^B zu^Nw6W~wsxSqg@?Dw4j>5jY-DMRE=a7_qk`M(oy9GHt>Xy}AsMDtULBDk+X$0VBz!M&@Pd4k9R%qGds}0I8SuJuXW0TAYudi7#g7-x!1czzh}WO*m~q6hj9+2Y5O&O4J znq-3=S|BnPK+*c~+8=#i`%>r&;J`spCzW4**|((!_lTZk=@&F04;TEq;@TLE>O9)3 zGmRqPdTZMoI$~8YlE#FPZfEQ#1{t$M3o_;c=1v@4^DimGB_mq^6n$jPzb1HpP<)(+DI5D(ONzc0V*I~jfh2WJ&piv^q?;+wa8 zC5g-@`Qr`6;WDg+EArsY(J|D7Pfc#xdFkea(F!?)-m*fCFyNo2)~h^)+Y>ggmii_` zo2RHd(#r{_lb*oB=!x!X1{Jx6^O#;StUmI_A{Y7aTHU>9b#c1`E2`jr1PKA$^txPY z8i$9MDV342i{yY2;Ptc1aBd}gQ<4PIwYl#fE!EBr3PrHvoylZO)$OUmPL)-=^to`Q z^VT?t8XVs^#EtBvmIpgf`}p;1_$|u=z<2#v%YU-zi~SJA{7q0cpi%Z$n^{3bBe>}c zC>8k9^hGD%WXCFek+Kn7)Wc;UMZyT{a}a9}*|S;}j+>(LRl&+<7%BK6TJnUZ{8Cc45%SXq7iRE+0*ZtGd<6?aT4 z{{Ga@{%@^NxbS08dEf>!2--I~b~afrWg!%<6G>Tg&y|K^REDZ2SK6tr_?a4eTS}VU zA4Y;FF|??9ft>xxk#`BYDO5`|RPE$#3C( zl0xb)zwO%>@p~y^3AjLLbcK;^zB_h(dDswNZ7vI_j+YWA)9hy1{ydgMPme2g%_Vdb z7cPJ^X^nEw3PVJ*XV-|wyEjmi3GMuPx&~62`h6_YykcM5fE+dKM<{tkl%%Oi@}aJT zXUfoKK9wk|$*_rsl+N`!Av~4h6gIs)@xb>i>&N?d z#SIlAE|8L}_cZC@tWna*8c}koo1;il_U0ix4I0x#5hzbLf8(pECh|s5i-Unenmn`1 zZ8#()R4Qpkp!w_?QkZF+fzzG(!98X6_80E?RtZD;0;3qS77@WRG-P;49d))kX%TG6 z>-$^}J|XBwa8E)M6XI(U6cy9#&|;3cfQNTEX!^tcA@<{hV{p9wBB+ku zyiTlxLs+5SS0(H81nfm zAqslx&EY{9FcYJSsU^f|?SexwPZ0{IMH713wAyiS&&d{c?{*Iqz3gt<;3G$pm5@k2 zMVC^?l8uWpmW(IjJU2NWz#?6#Sg-EzPH#L3j?#`+! zR@mjv=LmYZp`2Oh6fkfYFfOCzdDnxBl25sMnWZA-RlvJN42z9V*aS+kJG%8DU7h?~ zMfpRYWBj<>I5b1=l%-&&7G?M8OKFB0E)iwmJ7{lo`1z$x@#~R`IdFxlZ?DeQ!n`)q<6mg_Vl~s6yohL4Pegh8qSr6i{mMbxBy{RemOoGaVpKT?XMJ72L=b#&ptVe+rs(^CBPF6Z`xx1jD{&qc2*QYCIOhgZ%0h; zY3VR)4~FnhpCYY>sK$wN1>kUp@>=&ZuY?OggM61O0O(G@ALM0+-kv(f17-v7$G?TD69s<;xaFL|Nk1}R*G z9dDFyw{rmH1^ZicH8ie;^_5aDnx9H{MZ{NFKGDY*7T(5N_7>Ck<9Om!di_EEaJS*$ z%RC*;oXU)b+si%VYq_^PHD-4zE_#U!!lB4x*fL*KOesMXDLq@4zk!|~Vk#|^Cts;) zbgp;2+?w^KP}2=saUHa*Q$DAdYMu7eR3tv0`q(*CEp*wuTY6<#fayiU`0kZbamG9k zrBaT}lF(iEMu+~N84Em!3DlKAto zaIiyNFU)?7N(}l9ixPPD2HP}m*6_*oa!N)roUYK2&m$Q!%Bit-V^LDkG(5J|rJ``4r$@z^7Xat~~{QO81?#jD&k?&`wqZ7iJF*ZJf zUG=OMg&oErMCl>Z$K0YNO0j;A@>z_Skma;6A=-`4&4u2@b{oZ)L}8qfkco)koU1!+ zy|u)`JZoEF`DF57FwddvhU)eS!STR&Jivr$LEKJQez|!466@BAp)4!W+c`tjO|M2P zST0s%6k)Mz(Vcy-qv3T?EBEnD-%of|byhl5`tYi2jw0@kRnrPzlR?*YJ-4dp%A!m2 zyra*z6LDr$mU{C-e64DXw^k=5DH)aRRl+ydcOreMs3vL+HYfMfOF!BAAivpB)P?uf z8rj9wTbgOv!@#=X@}DcVwevIV$~k67H;y2+`cIC z__;IMt@WH*T-QUA*_1MYC zJoNy^MnRC$Gx9D43d{%84{!*d5n&n*vOe#??BgDc??gD84}3&nGl;>phSR>s+unbCa9E+`sm%=YdI%;JZ-e7zrNrgKWi)zK_;C850#) z9u(Bi#mQ$-OZt7Py;40Ky03FqopttXq>4u&94yL5dV&fEchKz2ZLPagyU;RSsPb4R ztk!IMGs51MwP|}`@WY$FA>4cA>rM5HyJVBdF5b&Cug^?=t}TImqiyT6po2D{ka*z< z(w&yQ%Zjj6FqMlJUfa;1AlP;uc)P&73Gg_ZdNE@UdlJ!hVb^J*b`%E_$$h^ATm&aE>Xn&Y=jPGeJ@kVHHA);s6e4G9Bv=B>l6)*P z-lC|R6OGj%YQc{3)Z}N+-V5Bdblj2lkAAKhPF(KAA1y;ZM}18@(ttNSF}wEDnANRN z{IRHI_NgjZkvLm+@nhzM*>TB$^5Ma11V2TTdsxdYL8%hn^j4UvN!P6{K5Z-=kj^zQ0Nn z&&QiY(?wpNsTyMPbYnDd#(lx6{MqRnpuJnUYWJUJddG(k`v(y0`K(XzlvS>OVl;ZD zI3|vGA>&?zN-7eP?FAGvtkH0rcD2oxzTLKf7sBgN6?Dk`BQ_uK!%bsEGFPV6S_yrl zpTDx}ouL&)DE-Nnik^)#jnjzkp=LUx78YgMaVvQq*!o9qG24ry}N*0jC)PNTS?-xn5$zcXcF z`d%Je)q!Ko_+~7(s_F1pSp02Tm6R!h?M2V z&GKxbefO>S$nKEXR9O~wkueqQ&Fb`zIT}_LXrG4o^Hi0rWUhD>6%R`6ZqgLdMWKqW zQnb|dVY3?yc{cj!sm(^1lBBb^&*w$ZR$7%`HBPRgXW6!T)tcCEVzN3Bgy?@Swt{JE z+O~Un)<%OY{a(|%E(*5sMf{%i^aLYvqlovkzNN;xmC?w_XyXW+%RWXel@~wPH>;RE z)ZfqTvQK|fmpmhtt-!KjfBl01=$bIyh*Z_M zGT)f}T%}-vnn6raXS?v*0fTJDu?JU_h*|&M*{*4$YR+Oqa|S`!62~gDP?4?rMV`kG>@KbQSgQFmcJgqx$7SU_ znNu@zkr<)p43G_+2_(Ig7(9TLl!zd`(O0^>`2vYBo>d*UV6nf(3Tfb$5zlp9b&N3$ zx3spP9_{TpiFQkZ*>(%o8l+L=0X-Gl#UAlx!5TA+@_|z8paIVE1!PZNEQ`DSEkz0q zS%VFZqUVQ{58zWtTx(A+wojfu*W;W$?Wr;PM7V9;^ujdihH4@q1B!|qQTavoiAw=( zTI6rda+c2fR7QMYIhRGPST12NG()w%;O4xMFRq2GVW#ZbxF2Uy@${jIxB(`8x+2_Z z9J{6#*{0mkZ9(4Zg*NJ1K6iwR39DvWulLW#KH*v~k-ju<(kLpJ3rbx@4ZtI`-cDq!KN#|s;$@poWATK`3LS%Wz=-nyq zl!@?$hMv4@LbKP1n_~hxrE1Vvu5_nL;5g$v;@t@_Zd)Gip1@J6e^GHSKGE?qKjnUm zz844Io`0&b+`(Hn6h%!Hd7QKcuX8uFrC#+vw22G{9L9qS+mxvw}gkJ zMzgujrKD?ysSxpPNy9WbNw&~u-o$;Fu%w`8G0W+OYW%xSVXRy)pL`PKf5UcfjN-nY zGV*ZXzB=(D@BIulW%)BnnWFmhEG^lYqq0RA$-Jv+DQjGn*>uv|qUPm8m9z(}&pW2y z5?yrFVem6=l*N7g=(8H4k4kLFMNs9d{Mc7D8}0MHt<$X=o48HnR)vJzZIU0_NgS^S z;id4uzhYWTptGemm%SCjGPwV+7J069;DPCj4zI!s*t@T{gOr9=tqAcusiY_N+1>2w zmdc&W-EQXP+UCCCy)H-l+>)v=R60noOSGNwWAP0^%{Jqlru&zA*g3XY`a6SF(_QX& zCg{eQ`xV#pYbQOxB zXzcPm<{vyCT{G{KgBVr`a$c#~6E!xsj2gHSoOJzdU-s4eW#ezmOC<+<9Is;LT-!wO z2vOhruo%tK^Z@Oqnm;`5W@XFG$5z|%?uzF#41-YKI#i7`6d>TrvpLq_eiGfQrXCI+ z;fma9KNr`_{!I7LX!@J7)L>ua?^qa_siTx4OltZA?xKBhIogP+Q~ zX_k98OJL8ZLVtMB-7rA;@&5VtsZ;XjXPb>msDt~@y+N7Q6!@qbF4!bfnW28a@BS+z zMEWF(JOjG=@jBs%*Y(Q-5}j5irWWkhnJy@n=&qqcQMT(0J#Pfo1lnG|XFQn1dyYf3 z9JxhMCz!r0nLI^-Uet1X)q1p(71OOCBZ{QvTua_#|4(f}@9i5u+-@787+68+%~K{I zx{12=F41<-FG4#Xmpxxd#jmSd^A$~x65lQ3=_bCB<;AOv=S_D?sVQB$d)W=_hm(Bh zmurjc#jI{|$;=Zz#jVfaS>w2M0 zu`vXNd`T5ypmoWTp<`->T+L%~Q#rWKe_xQ>w?~0dJE0p-e%xupO7g?0R_@SL6wT!H zb2hg3CL1VqN9>BdWcS?7GrQ84oIllmNXj4*3Mi_6tyX_GIA-Y;GgrFDSj$c3D3ZVq zt;B^EHzK77Owp>!*c%Qz&T7)Z{zE-$*XW~2B(E<<*Ky*H%DS?ctX)Du7LLE;q|OKT zq}z`{mc2W->$%7Kj}LEOtV5H1c#HT#I84d21#IO=?&{K6qL)LUdb+zRL>n0~Df6H% zGa2wt79pt&nLQ;Wa^mm3a$Z)FaQG1iDCC+#e;9SfwSQ34jc>2?IFEhRz zIV-%Ths#&z7}uoqLKyGNY2GCpkugH2m2#Mj5a=pcZIPE?-(_a1oM%|u^}KnGgjUg1 zdsM1crKL+LfSee=x&AiJNA_@Lq-_{8lWgmx(_OK#xHaRF*V%3{8Bo5o3a`AUwi{Rc z*s$3C+FQzN<~py*{Y5;IWS%!hsxgVGkqtS7Q@~XgXJoP4ud%#r#$}>`RpckNxjvhl zmO)z()bn;8DP&f1fG*o_n9p2CnviVn{J3K3W?#pwY$#`bhD_V3XKD{&329TgZdKqk zUFnYs{md^}EAUjGE;Zoo`I-VM^qGpGIumV+>o0EBrjJYaIl4t95X#40fG6(L=AIZQ zd8eed`N>0?)=+XpOYy@yBig68GH1@nUL9@6a`2_7+?zVpea>i5vG3b$sl)mF?vLZql-$TjczvxRw3x-6gOa= z8?oH4RU`aR|A4llt?&tNf7H^>HFtteiE$H_8&QdCv2~SY^H116!e%F!Bwr#78Z(wH z&L(a%yA7&b!lJDz+_9ccT)tYKSpB9^?Rv@;)s1T7&SZ0Dmr0d?ODZ>GHScm}IV5H{ z=V{)KuYN+k-qlc`R;PN9GC0DXONgKrpM`b0;Ig*^gB)Kk?5kvTitIp%NTVWyS@j4c z{RV_8BV}f$2us-oGs3%~il}*kf*q`tI_j{y*RM?ojL+f_l-=}Az00 zvEiv0%vnhFIw>zr{H(o_&+Hd2^+$~;v4xn0PRFdRn%>W*)Q+s*Jpbsa`A+2RI3~Xd z&AM*3(#x_67wgxaAYn3nuHk%^JLXoE{46z&mcJs~`!=7>$Mx+E}ubLWzi(*mQePkNcq?klU- zP>Sj6D+a2oxK%=z(Gi}cMpbGy20eEyZ~I?OS52*^A?ZN{z7h zXmW~;`SN=Tj8{d>l3giiwJgwQaARG|UY=i)$Mi`*eZZmtaXv1A01w%_Ilk2u2+9$kw! z^JB)Bjjdk4_QrNYKOb$POKw1>dpr7(m*K@1H5J5#w#AO`HSQW-%4>QM_Q9-@X^5}I zn8a`^GxwQ9PS!XIsm!`fXHA`t z?(R--2@ot;f?Eg#2pU{NaOd45b7nGga_>yez4y=e{h;=)-rdz*y{cBNZk}g70noMG z2tfsU7HL;B0+UMwEj`bkIz8KFzk_9Ch$yr7%PZ){LCVj7-G{xIWxd?b)!)_{dne}* zwH|Znle{um|M4UGYtONW{<`TeC1e|XGF`HLByzZWiRKvwp5sws=S=S1rK!$jw2c-` z`xr9$ww{@JUDcSiUjYs5w~huK@-|bP^(Zd7ki)gl9ZYv%yl9-Ij-hg4J8@u8^iTy_ zDxu?LEe*kC^1+{xvB6Ivw@R32UoxL6=BvU40P3J*Z#(mK`mh}Cx;gZ476%c(>>;fH z1aJeaN`dnwH50erdd=LX(ynfhd)h(3)W|Uf7vWkr1(QSo(NlrIS6N20{_JT-saXuR zhIW6*H6wJy0jH7UG^;hFt=B-#W@geTuT8e3pO)l!xHi?C6lW8i^oUx-$&32THoZ9H zt$hv3ht>#v3pnswA73g+ zgc8(MP>_B_2|pNM8er>fdACOhyIu@W%!+!To?)$A6LL?S?R?nfAjyh=P%Rf%%`$=9 zK2outfy6w=te2thfRhnq4ysQU1)U7*8t8`NVk6Yxp$-e{jUDkY6hn4Za}JF94jRo z{pFjonRUy61IEv^&j~%ru%}w64p_t#=q;EQtW_M|P2kbx&^{5ZgN-o6=0(1-59lmB zoFoBdHI#MJR~OqDqOpu;@%Hw+6P>}~ctTN2Ra`%Vy)3ocJ65D4|2j}$jV8u(I&?3W zmaWdhn0Ipx0&<>4C?M)?@eJ|xg;t+C|x|E>?ZJR4N(eX<3I zG#{qgUN?a))W5+mVZ! z$R?g$RU}PSzwntyS(`%ZX`*`btNM&DE%xlD)=1ko_Kdk8dP{+W>B4aWW1&6A*eWR> zPF*hLEaE**%smC{jfF(G=qyaFXg>O|`Q)vd%Csrt9&GElL$BX86U*OX7v6yiW8`y& zw3Oygt)D#GEtWx=p3@ltZ@~{j)X8E=@h&MgTIdNZ1C^Xfe_s9(P38T3&4PQrGmQXF z7O@B16k$iy!Em*3E8i3NSFFXp+{F0HwRWasXe#B$Qcnub4vC-yrEN=;h{|+x_>f9^ z7*E%t#^!R*qZo*aXZ50Kt30sLoCBMOi51hWONQ*vCLW^EL8f1AG53WZt(HNgW}o+8 zv~P2;IaeZ8dMAGXHQFp&4okUCZ-(7rF~72Cx=12@3Q#rlMuy#MMB)?Qv=(nD~D_Yj2{S#LXdO@|P4`HOSb zX9pe{nvn~Cn2en9%@A+dn+UR&eN+%UcFfeJdMQY2{g4k5BVcA3?A41zZxoN)TZkme zhao-U=m`YkHZvJl(bjC9y9r}cY670bjy)tq)+V35V>rB51{ijh1aV&=dbS&@1IqE9 z4KlVa&%+3K-|`;PQCoW6+DucOyzlxzkhDA}&|$e3yJ6kmKmUG#@p-8P#io6dVuzL7 z-VhzZ72;OUsI5Fy;%R=zgP~rvn#DuY3cFU5n-S`v!I(EB`&O{fYIrH<7qX69ZS|#G zhS;tg9!y3K$fYXe&~wgkvo9Q5h?B!ce}V*nOaQxiKn_W^zuSR|(*8A;sxAvwbdhUDusp8ZS0dm@9_R zh_Phv>g7FWCwmeumnJQ*uQn5BnIrMKLn9}dx6d%FOW=b~bq~XBN@Q5>TSnQSD03Xl zX+A=#v^!Xr^`wYFYs42*&0Itx4khY|27>z^xDaFJ1e{Y=4G|&>!)bi2bEY@E{Xoie z(@j8`jo?-p%jNOMw5gthi(J;}xlF&(_RBqeg7nP#9cSi8&n-Rg?VdOOuuBPO`+n85 zon~q%Vl{ex$8_u3Do!GF{Ql(&jj+59Co07=GY{7{6OHgnxtz}ihhO4Rd$wMcnP}72 zKR~&Jbq#R`EAlhWHimJ~-?%{Z8Q66nu~Kl^mRB(8kk^R$H3x;zXltQ5za*k@k<5iw z4-RK=;oSecO$RqNv_no33z|?yejITWmxt5VMSL>q z8`lS12+_n_g9gT=-K^-EVdbykltRxKO+9y8Lzh$VI$+ydO|rs?*QQyAu}uV)@?SQr z+6)uzRyMZuS>vuB3Iot$*@F{H*Wc~(l;M8H!o+kC$Y=6oUy~SIxqYH+3s&XdPI%qI zFmyqGD8GH${sB=^ha@LFBy1fL!O@bKtRdoxCZ7NglyzUuaaM|gN9l>~n`0tACh>}{ zICsx63XR)^UFu%GH|bk)+^`hGAvT~1 zx~b!D`KPb@M7ZgJc}ZnTnzX(BuvLBx+3=D;))|deq7VXX0h#Dy4H6r`>r;z`Zhc>y z1AMH}D}-zfMH>Almnm7r&r62h^krSy8b`4^1aBS}_0>%QDCr8*3rLF28xMcPePtVco)S#Yt!4Y|~jF~;LtodjpoZY$Y z;qg`%jnYJjbsD!tHVCf3=7R31FekB$=?%7&#><>-G6+%5QOD@E(t)?5@j>EODY|uV zuJ)mJ!;xMEcg|I2*aH-B@z(sO$1ybHO};a*9sSGLuetaqJ?-NZPWVcjo5}gmR3TMd zE|6)t^Zf3F4D2ARUKu5p1RqK&(Jv$5WuLZ2f=HEq*3u??i^S{?_RPVq%rWq)^_H2l zAKxm}5c6pFnSpooaMsiNMu_Jj_Y{|KzFomNadW9sD(16VRsm)2yr5W}(P_$eR5Ed} z7to*kseg#)+KY~2hMFNF7@hYU+&8ehN}%w6udl7TU&bl6sW)y34|`jn^Ty z)@=`abxYHDYLhZA<00c_v@yB5&(qS2mkpn9sX@u(Yxb&`4-T)23jMYWt9RAP*Q?b* z`K9mcUY?h6Ge2a-9;CgWohVHgBXBB8m6=Q7<(fpt*b`9CTjK1n#(KRJV9sBoeQG+k zpzB>ITQMOdO&6Q)wW_SEpzZw7UqbMytluCWt4VhFE^Qz#1LREr$=QHEV-f#Agwk2C zbVd3q`c1Hnq#@Zs4}Q+>%-&vYStWiZbcg)#3{iC$=q!n~Sma4ZDU9}9PaNSEsKDFq z{rO<-MRKPK3L;)vrgA8Su4@>zy+}Oi-~{uzu2ja^mI+didFyeILd7Enc}5BKG`mbx zW3IW82a8Ic14zZ!C4`1@=-1Te{8cri+T#*DV6Z7?9CBGD{8iKPFw*WT^pW?oIf-}l zrKh&a`J@L{yMs#&C*q0e&y;PLy1s59H>sYUjIg?l*;TR|&LKh+S_I-|ZM5ef=8A?m zU?GZdDKgZ4?1LJXs?J2GN^46?H)uUr6v-dbNz&%VhrjhGz)xn=yK!P#w1@%;U9rLp z5n|!TRdL93V6Q{>qBIgDFXr`-*`n5YDd4kFM0n9Qwa&6QHPEM7F@i=3&ohelrNdo7 zWwdg(o0|EP+dl5++N@Y45p+!JnSAojg@mkKINH_v^C{u|XR#G@GM{Yf6JdIboA^2U zW=?2Tb;w87g~TPu$mV-K+MmYfk2_lY4>({AFgR-aJ~ z;4KHTsV%+UYfAZ&*5R&-y*GjWQgm_@ssNhA0}B1#IHw-q{cK3Uk@P@+ig;rppS*xG zVa;7Wi*$^jkIBh~Lwlho%d$2yp1@9E3`fI!tTiI($|)&W0@~ql#@D^5abLdFqqmM( zlbm?cZgjb_un}Yir<#EU;xoPT2}E=|Plb=6*rC0!hxwTnulktp=uqg?19xzE&wY=| zM{5P-?cPNooVWB|xo7|OVt?>PK3XR#P;LUQP|5%@Cz6E{0xo{Hbz4GcTt*vin5CZ7 zlRjZRK{+STRdM^N-9}qs!Va_OeZ)1U!@(q%IESs~Q_cYEvS%jIT`HD!-q*~g(p`oX zb>ha!#JVGB2f^wk3)f4I7Vf^vw&>js?hibXd?_>M{hHc);v)!UcEaKl8_Lu-{BHeU zVGp=p#l2VI>7%n&P`ky)Ww))0AKsXLf|Bg&2-*>T_9U-xXr1sO>Y_{SIaQc?VAcuw z7&PSA9C+Py8M~uYgQWDv0~lLkQNYiTRsSwb{Ya}8F>x|>w6J%!a|9v{fps}U8xvwi z6*+NfEfrc}Ss{%_h`hC-nG-RP4)M6dcbFSJ5Q0O`4Ai&+umV$Maj-p#P(5=pHnDXk zW`7jz5jM1!FtIQ*2UZ^eY>#Jo{EZ&)P0`2M(AvWInXQ?%$s@Q#+1bQKjTivTu*sw zfMQjD!VGgUumBSS0Lks_zYgO5i_A3ZKaiQOQXRJa#DvnmM?0J8a%3vWpwH$Bs|7hg zBB;A)O|;N*_*M#qa(nHIv|@@-h)l){LqUq#!nte`E}@Wnw_BY1IQkkILd-iSTe^Vc zz(v<-6K!2qk*F?B2FRqp8@_>&z}i{txHF^KKo%BMThp(5-dv+f#5^kUdmRHxsI^3XxWRwCcBtE2p2U0>4O*Ul@Um)4s$A^9qA z+<}JE4^U4zESB{@X&ujfty}4Y3{4~flHBaTiTdAQJpcD{rLg=}k^BEwib5+rEKqvN(4F#mdvI0p4|Cyn_g<5}1 zqDQLBe=>=b`F_bzI0`f42~@OFvrfegC`QK*Y0BCHeW->^aI_lokccOmF5D! z8J4Om`-M<|+fz{&qNXaRF0pV+vXrX=4OMkBCl*0-V#$K1wNg!aZLz}ecxWDRW#GCm z(hlItPv+Q7$sl^=5N2%^jAi-_+V{5gj0hp$pWOrmMkwWvj~i2v+UM|?D;pG)2;jOB zC+A#~clymAAnRjciBivP<{E1j`(xaxL;BhER8nc~U?f5_@_g|46e=Pvy!EPHyeUj9 zke?#Wp6uE6pu^`u4<|a9a<+vknKr2nM6tH)MsG=%!?m7K^?W{-z7P^CXm>|NY^I@2 zCx13*ls13_meQAfVr#zcC1mqwuk)(xqdII)nC{rk+x}1Y=Yaengp^xJ6)v44K|q3! zK2}0cWpdINbX3lx+2#%90=wR#<)$4p=N9>MR&sOL2ukvOe)hdy&m5E{h;_LFE3W4? z?^;(Ub*ob<4)X^TKE&Rc9IRpmiz%o5bc*~eslsH_Vxqi2Qq`YY>t_V;|H4}T zC+_W6CCu4@f#RQ6tRLMQ%cBJEA0$a;pu8^^Fc#rt06M2%%{t2R7YTFVOOU^{?~ncs zQzbDw{SGZZb%KICZeqUmH3P()1%j)jHKonHkLlT}L^2W|cEHoL(u<{$&UiJg>cyJf z{OMDg?p^XF79wmqZB^UENK&pgRxz9b@OqlV(^`D8{gJUA7*I?qhfKc~C z7S`vgb)_Hm7)Mw7hygk`!FDEGh;vrFBXQ}$jki|cg^v;NE=B5OA|opdRJik96v7Y) zH!Ula&#&zTS8_p7zcNRXUbE9vWpQtI#769DBHS8 z>mkOy$r5k*cLX3&v+PWdtELlWaBH}e-RM6fK?V#9f12-SHMXL$L&Wf!BUZG^tN0WN zBiV^DIOTxHlkhqd$LST=`fRi7VDXmCBivn?5Zn#Jv> zy77OWJU_+*zvT9QRZ*V(F*Dac4Y`2{pn&wd|16UGtDyX2HtxUkdSd`MU`8;=3Ek3( zGz7){p?Z`0CmDkMD^<=?7O6og3w~t>bkB%=CWHs_24DH@GI7cqSW$Jr(-eWGB38p* zPjWe9Of#3b=|QWabr^WA7N&nPYrQBGfF;4g;gRnC8j$kkoJWV3i*|i(>%}yJ*YJA; zD+hyGUiNPKZlXEjr|UoSeBb2Q|C-q8f6I8k8ioVas(;0JTtHX!ABEw6)u4Yo@81~D zB=(!+M99T$L=-n`N85sUjBOx2XUeC(@`6awuMfx_Z3P%o#IWu1gkeI-dpDKBtDOGT z(mS#!;%N36t4VnWRie_0tj3<}oMCb3FLq)+_PVzhOMkjSTpbX5C#GE6E;QwJU#YWT zKOb+F8=SmzPAV*RnOf1|AHMc*tLmtr!H>I=WdQnu6cF`OJN^)o|G+c_t^@yKnzFM! zzV-cHdwdM}*ONR4+oP!B-*i9P1;{kD`N)vRTIReK<~%k*PEAd|$TWh$1joXJuoz8D zMM6(cKuYkQnBYALb##$`&{1K{my7!^Zev17)Y<_uf(1o; zJnd82^fv;a`zS~t5;8JDH*TDQGlU_5!d)=_+}Jko4R6X}KtF*x$Dwc{9NgDn>?bst zH@@H`%B`rNWt?3K#|p2H|GWa#(lglvVv~lBumSc0%oi2P-2cGP53ojV0J=TjlYL*m zM_e^oZGeGbZ(RFA*Z`(96UGbzBLr*#1A4ox43w3?AnZ-n^u6N>)GZetNEp^>uCrf( zA9)~|FZ2r%l%fuB>{TT3S&+(AS0?|G0$j#<#8E^Lvb;C=-L7&2neMgl*tXD3tqzwR zPE3M|=hPtH!biw_lrV6I{;r>00zcgq3|!ETj#ASS=N(IUd0~Sch#Xn@#ja9euW!yS zUfu8RJ3+jEvU+7^h$t>t~hBJOub{VmOZJ;v#9P{9y{%>*~ywev4;3Gt4Uq7tfx4rSc zj*x1d=hpE9+#^#^hB|}0ANyZ|^4=N=<>9?Ljsy`A@dx?hw{}I zK&^^0BjG=*|I}9QiybM0pL6%UnJFj8Lv>z2J1Pr8*M01{Y=Ds9z$o(egBO@@=~OGt5H>j$*SW!)A@J81E)#yGhn{bodeXb6aVELRqX zxGfHjh$-0`U*X!!fNM8NNC*hnJ2sD7p&k$>I7nAYkR_NXeF>Nq*j5}xs*!`{CQ$Eo zn5Wki5cb03cm~lTsJFXRC|z6jPK?C+1~cZgEu)M_%>+-c?N3^pSc|== zcdq8GcySxpryIJu{1u^-W}>B105L9=mj`ViCN04RM>~>J`|0B5_?v1ETM1Zi+s>6_ z3=%mm-MKIun^!#tY%YL#bbDvT8qGgzvYii$rB?RKH{ZokrN$GOQmiYKO}!s*?1bqEoeW|G-H zw?f0ZEWrzDN5xNDtLTkFDVLR-i_kdcgDi42kif+>JDaFi(CIMCHAs`iEwfn&mSt|* zkz*H%U(Lfhtk}@@4qWWh&pKF$5WW;FksgIk(v4J1CUG^mdH+&#F*LF*Hy-qz3CtXk z%X=_ev~AJw@w3mZDGk`u`5GC%GS7*)JeKl zx8a$19pNs*0xuI1?{u3S+rlw8BDYjhE|sU~*IW4?D78XghY##;*(N+Uq1HZ>x9`^@ z5P(AB8A{XO;;&*VR#WU%?;TM<4f8|CJr3J&Iw|XGpredB)5_Z4?MOx|U8{=agx)9- z7pK)lkxR*4F8l!fPK#(?B}!mzM}PkPPW!#5ZjOl6HY!rr3<+XdUBQFteO#KVnSwQ$ zce{`8lFOlSbPKh6Ip&sb)wshUWqr@~pt{4d;3&7TlJ62(lc_n7gA|A%lmNo(Yu+B# zldUa9p5=D)yjGGKe|9dv8ddp_`73u}4_D(ez5~HMe>ZB=Zpc|gyyFXWio$7+#j~d@ zq+gA3zf^~zy43ViOfeSeVOD2vaPaTNncid+KhR~{D^MZM$mgg};@x&+ z92}Qop#4zh{}RQ^>zu@g0bBWDFVVHRwa`!%)gmDIY*ySddCj>{yoOMM_JRX37uszU zA4Y)?@rfs;_pI`kzZeUXA_+J=HCmM)u!%62>IqPyhOp(VP~j{i;9u)2tB zSaWBo#SD~`k{(;lL)-~;x}+f_*Phl5bYAQWP|>{X8@}dMaeyU}d`##BO%)t$j&*}Tz3 zJx`_a-)C*)%H|(*VwhN-h{Px-0&yOulDLN~hmeWL(jy(&v!kRGH$Cd^hCB%sDkv(c zhB6j1$30l<2^JipfvOxFf*@EAUi9AHGyPVRL4F;U2&XIOx+EF?B-+Rt4~(^@byU2Zk43}D zfEURuZ!aD7m4;l+imG5JBN{ki7}XSdQLC9*l%yEjC_}D9U2mu4&_!K(RBT?n3P0|N z(@4U+cDjLLQ;6>g+a>fO>KOsCxU>-laVBvlPESPBE}TCYKyfvy@}#I~k9#4%kgDNR4AZMimvT71-qct6j*p;JMk zxa~6^hK%oW1D4o=u5LkF4c2W0S?)0gk@%{YmP8HUFGbA~D`vfGau=Zb5{ujP79aA9 zJK}pAq7*^pL6J$*;awbzfP$^jWnr#<<_|Z1QWsKmfy_N{)NYAg#j%*M~hbHfZa)w#w!1;<;(%<28Jw;<^u4A?2@Z=fTGaKNH2# zQ(%$nyk2i;bR?#(Nh)1BN*+#9 zW35&kseLixUgoo&?P7U?9z}3|$tSNlZ%BFe1WMWh1XfW?HJ4+QkMVu4iW0(m?~`#B zk9{nbJkwNX7n$B+>N&F-qU~jVIB$ki^NL8ew^UBhW1I(`81J`4ljZN&`$RkGgy1*p z3f$Yg`5mW}0QQC-LHQBB5`o;K#c| z^+-}Tp4&dw$!Q8Oz4#j;s+Foj?$GM;ib!h3gI{_F^@5yhFd|xPlztj zg(n#Zq-shX=PMPGiwdSz%%(`5farMEV*WHT-1G+QvzNn{dVU%hrbszO1A%7g8NIxc zH|6}$@Hji~-<>RR1$5y^h+~u`VxgSen5#z>pDI? z6+780^Y9`EYupw10nOvN_O&Mb2Pw)~+G(x*`{#Aek*lCJPR&`FuM(1b$ZIMB`b6!~ z651ehceAtRPqyS=@;bb&{Az8@@EUNy-VvdJw{y#{ysY>I%E>eqklSux?&`s*PXCIm zpc#Dbl)${^9es~MMK>w3=m*OM0y$iW4jH|1wzMxatv#c;oin*)G!h@|->ssx<-De) z5<*+8c24yvILQ-lNB^|54Hu4tzLXz5mNu_MOPwDj_JvCQ= zz=^ks`9{i&{LWK1!XoZ7;-(97wW9RVlIRTrY+BOWoMvU(Fd|o}yQ64Ozewl6jR!KL4g+DxwijRMs zwZ(LYBMP3obCmZ9jhx9e*=DU$xjB+-3f}W9g=y1%4EEK@ja!OKVm8OVMVQ_M*^XVx z8~Pr!_IkUH-RGiO^~i0Ng?G;Bl{@;(izy-56goJYb??kMT&TR~DOiWM)K5Oa?R24Z z$~qI<43iAa%Xd>kcbXBnqY>Tsza+#~dllQMUdS+q<1ma8w(}LWv5Rg*Msdw&)sFZz zh-VX=J|?Q(!{EYG4WwRgeN9jeMg{E+SDcX#F21b+mFN$Sm)l*L`BM4yjJZCdrOkFA z19+cwFd;Lxh=cSL#31;2cU8M_;>?exm+UIO)f{((Uo5637U(%ONC{h<=%34w?hTz!UOa4oc+A%>V{X8PgIbXA&*C1W? z&7ol1@Vz*<+EeP_`eL{HLfce@T01ogOeHlH>Gw|i+*Dkf>?QOk+cU}=;z+wsD4}+& zcLeL+7%SA^0=__LJFYh-t09=*l*dlqwstubEv0Hh83bBjC$k2UvFE^U}_3Zb-#VO$&2)y zYb~lp*i+9vCWPBWv1Gv5(p~T+Ucw0jSWuETly~X8<&=Rx{XI+wz#Ns2+VnCaJvk9t z+o}0-7iCtksh&wvDlQ{(g;K3L?xcrIRcx{MBtc_?2~K9xyRaBnN`!vyC~nJyEB0aW z9nqG%#rEF#l2$5@!!}YxC9i681V=&QV&VL0gLJz}Nlr(~n0~b^RnPXJ`i76$TqU|W zqL&K}-Fs8+7$Jxt^RlIy`PK+*Zkg-!e2wGwOK?NTbHl{VhRvYZ#$tFDE1l#PD5m+Z zhNWO<4tGH?F+D`#U&X5;TY_Igi(NzeP!}Zg(C5wMa!!Q4v?P|YU_KkNwO}q8!>DM# zFRgOhzR1|EBw_0<+$kH1H3>>!cjb@wf}Io+Gm#G=yxOZIOtTS&ect1EOJ^VaE;$<$ zoFQh5sgc08x+;Iy~R_$HZY89JTC1ZE+q+Hw4Cl_elEhLh!}L#_9zs zgh*q|twi6KO1pTgcT9aC=ng7RM>_l<>TX*Wzad0GX+1O&M*IG2o2N69*{F7|XDepx zYtKOsH@^=v8G3LqlmrOPJpq7IT7N zKLnetn%auR%ni!|m>_9g?f9mIn|VrMZS68$(gl;cF3g}fYms!jW(h>;TIB4xt2>7I zd>OcCSCuFaW`d#c9RJMbK9Lo7*a^wc8ZcZfkvf=&%5b~X16f?dC7u2xF!X93m(rJy zFK>d~zB`0*u!`iQeB1CsHae+r(R)=ur>Z_7)qQ5W)`#k(0YpO?!SW1$%=Qa39F=4W93$WNMC13=m%v zM@XmI2vmf8fS@2ohwauG-w=TgKHQ&SK-LO6|Nr+z}ZD?N3^V69% zzq$$lDIv`GYDG*>5s+=<~r{t={ut#mrJ3SX|t-{Fq)y_*OsqXEsR-eq#Tksd8@g{^*x)w zdzH<59Y9;ft(;Fiq8iQ%=vihcNhHnj!F7(6h+-9Vww_Sw!p0lq@sG zdPQcty|T(9YNx6BKEQ=nJ+FY6@N}!Wvn|GL3uDTTxD7tb>qeJo7~>w9<3J8c-6+Fl z^>wk?)-Ds8Pt2*dOe50kvy_Vmp=n0SBM@?SbSsFjS)M)U8R2_Fj$^(MlmV9&>O}#* zIG9*L2(9Eo^j1A{BKODkQf*E!W*K(NjAH8Pr8K+=2+B>D12FK@vAal4z_|~Kc~LRo zz~*4D$n8wfUQoPb*eJGfywpi-DB9FaXH7JhY9?})QYf-&3t{-+qeO)|lwvByqH%Vd zh|Q>qx)j|P!O~~M5*%X3%XM?OKKhXG?xdV9l(uRY6ZfM%AOehGR@ zP~@c94X>DE;zNOG&^xIao>>9D@bm19)wGhMYsh6jb~@>=H^RoyM0GTow1p=)djM)A z5gWai2FygX4sTu`sy91dsLc<_7Vjo+`uB|(juXA5)Q_a&Bk?At`FH~uLTU(gi-Cdn z7~vGrWIM#)6gn!RkP!C-F{jfUm~bz%%?VNI(#n{PBuimMcoAqQA2#a4Pd{_%uqx0p z)ktMgqq2pzV+)RvI8^c62*PI5mxVq65wk)CeTOstbfA2DrX8QiiR)>0h>eQLQvXL= z_d}!peN`}lMNn?;eZQyfyCHx;p=zpJ0mKRk$FH0k@;e9%p~135FrD=y4&N5gf3{_}%BM*ZL zXR|B9Pos=MaiPgn-=aluiGoA0iY$6bd>Y^yl-g616%3a?<`$Xn5xaXG2dD?X3cjWF z@%0p4G24rZ)8eT)JlVM z*I-*4e@pw|IP#lhznH^bvn`gLIL)sKapSsOOyGq<>hBO^!(Sj+zOKXFAnO5w*s109 zco#hkpQpdEEw?05ZyGSq#`8B}2kk3|xFus(5K1OO%Z=b} zGYI_oR#OD17DjajIwo}|bU~f0H#BlorF6Nn!XM76J+a{#Qh|95r2~)jO7gT{6$X1j zc1qW+=x|7dlaLiq4a0dAOdWSKXsoX;>47FDPmwMtMzp<{!JZtR$jK$GojFHiUl_ly zUMR7G^N5$8gmLd{FZ5A!%GPsXQ}>S1O&N2w(p1Giu2dlA=*q|yBrB295!AbX6|~u* zheaW&KXeGEX;CLWYMj54rnqY>e|+L})){iNi>_w(iY@5mlaBtbTVTV^HN{<|PP-;% zx0?3V$aZ4E$2|Ha%P%?M@`Y7#@x#pHHKGX#)C@eOPOspT?g-JBg~`WZp_!0Aw}m#m zF$g;=wBIbRxJ_580-KnY>9n@R`hk~J&vyR;(+hMx!_6o8# zEo4`VUaH13`fR}NR>Q|5%Ih%oc)w1KBu^$zXs1&Ry0A`Di2v+R1$pY-+l;)|=pa2@ z%vV9jx(Fe^TkX+ftg96o9frOJRYxB}Xo8|^#M9Ff_xbu2V}RbXO?sT0)VssioH>w; zgXkS3@yjpqWrWi|s*EuRPnIk!KdBov!;nMr62gC7HIpm@jnWfN*uKxH3%?<=k3 zx+-kaVv*CeL{3x>?s;&#X{#bdz(s{3a)02Rsf-pz2(9 zqSd9nRBPc6iF^IVek-jWVxf2k#XQ=d;9@5~-%1+iZ zdY&hH1vE2VD*5#vy-Nx|^(#bAw>8a2@}`E^`7YgUXYS%AwHHcBB=KtOE@rFeCodG9 zhlg@_tT0nkz4W3NU>!}qz)l563&Z%L`FXdBkCrwPi(QuIW%-s=OGPm)ucxW=oLYg& zkd`aaGd3? za4R1~ESHTj@vb8I*0zUQ2i^LZRfN^eC)OD*FE!#Se*>|MGp6M#?}(2@3=?hYP*7KL zr3yD9Zw)ecDM*qOM)115PzwEZTYSFYX~lO!a4cMa!(&Z6FOPYU=S&-!Eo?yb6Qrc_69ey<&{jm ziW~{swz}H8Q>7k$5tbeT`m7w5-F6kS)SEz*Wxj=NcJ(JI$dI{$V#|a3NxPK;i3d=) zC&3e0FWNF*vNuNuGnDrZ7QzrzulW&vzWk^l10P*aFTJOI=5jngr!$qKx-~xyBL{t|J19d7s&VmL6N5!YDc?$jHwXk0FYOyI1;dL1!FO9rJ2nGV%uCu*oW`h1#zbNC!y`meOXkBZ}`z^NJ;G< z0#t;_OfmJ~t6ZwLnx7E7jG(T2CH__3LK02t7?hr64~6iuYc$s@OOqePe#d~@x>m|M8DI;9)S*j(8cTx z9ZhVlO-!AQEX){xto&AUd?cp*{@cH5W{gfQHa3RN7Qj9NsXu>ama%=qQ~t;X0%A12 zV?VXoSh#@vtnVc&7t14W>s!eNS{`WOt zpICoj%CY?$4D#=oa(|gEf1XtU7PiNU2c$Lp!IXPMM*NE?_c-!@=gEB=hJWJ80rk^= z2PJ>Ij(><@2c8b77X&={zZi6XV5I*E78JOGtAPuud3iG{iHnww zs##yvwzcKYBLy$A}KL{3BWLc}{oH^>SEm7-s?<1aADn7J6( zfMoRlj7j#b*FPHa@1c_>vEQUKLoRql#RxJsGfo`4WoseDU(06Ev^G-tJajKTDOLcJ zTzNQthV4-6~~Y{^!Z73+I!CcdMl%<~K9@=vv- zL9+<7;=3jR*B6(XoZ1eDg3o&B=tdl9Ez831Q%}^0pPma4IU+?}6(fzocJ>|tek!O4 zqZY{*Z+~{|Fd=7FmkK!*HbN`VlB8fV+}#lH zWDY3e!xr(W&>n=|9p7$t;4p&j?47A!5x2bFZ}A@d;sXOK3byd2HCEWoGhUEMw2A5V z!vPAUFborK*TLlI*F}35&sEwW;U)w=V-%jiL%%QgQ7swa1fF}zwFdl^;RqS#r9N8d z8jTjdx8>ANVN|#~ zzzyD1F1(A~6PRi5*xhhB#(e3Y%2QJ`v6s*VlqcF3+uuRNP>4 zJ{x&)c;QM06g`~1MVy(v`Qd<|`-QC@Xg(^qAG|a4OyOX%K=;Q(Pkc0Xmq3;$h6#7^ zu~vqd#?Hx_%Xp>$Pp!1GauYSu>I6=S%vjq@`k4Nz@aciudrvCOBpTyzM=b%(y{V^L zlUECl5z(5B;B21)oSA0xOmgsgnvl?KpmY7~kka7_jzX+Q@ah4fV&IxZ<(mIJd1a&kOxbRM8B|G^$fxd=AyvshU zpfhvPq-4Ar6^0BaP)P%qlNFD9&|o|{J4U`@ES~x4^7XHH{uil#k73jQN_qicGKAmf z>pxrL{>l&hF@R#_0M`DPMnDmEhR2)=z!;tNTe6N{i=fyaZ_Xdn=+VvoZ3LyNYlR0u z@qVM9-#Lc?R5`Sh(F1dlCWMo{ODQtgXDyz6>XI-c@P;<~3(eJYiEzN>*o?WEt?T*I z;Pvrye%+#$>sbj@zrMXyxRT6EK8LY@Ni8~#(YNhfnP00yRusdp-1OX*z^LgrX&v}l zahJy!$4%LVu_vB|!v;=yO&lAZ%zhRM5e8S&WJqJ0I?za;bmprJg_yyOpXRZ97R-QL zh9j)>D$Nd+j3NP4Qs&K(MOmM{MRINTt2`TcAsU4g9F~b_5naX4f=Uk>;*)wjKjvMSR=A# zG}YB8(*HCV13UL3?%6xMrifB2B6u=dcIsNfWpm}IkR9s?#p=C#FfI_CfIMe=0+x#(_1pIlXaWF7(a1gUGFf;uJtJP!I z{+MRK#4>+7&3;N}XW?^_{)00u{R5l*J7xMemEfp=`0__pV1r15*ol|MPoe`K~_ehBz0 z+weyR`Ije5W_C6P7U1>&XLQ?dcjFJku>zG>|IR;-s>n+B0_nC}>XpqHgU)8>R%%~K z%gTtGHch?aW@3eR#YOLK4ohq@SiMk1p2k6Jj<$2yxr)Q#m7@)9sy|-@rYUK35q~J;V0*s%;m66mSsQX}dk$a6MZz{oxT}ngehCj0z27p%VmrNMGls9@6PMHKj8Y}DDLj}HlTCEr!({)XB zrQ$VBYaEE*Y*R{X)AYh60Q|wSmLw)R;m#gvaAOwl=!(=P6wVj>K_BW?{AAH*B%C8W$j#n^TECjwl!JTZ}451fc@>jRMOY8`; zz|=v1D0_b_Yp?$hQ=$^QM@2-CF4GK{C{71*c{Mh#2y+KK+lLP8C1D}q9 z`&~Id#-LN88kMim0EnH3pt2(j^1;sTpc8bo3E=Rkl+fPhJ}fs037TXteR{@pfY2Ytbp~Q(l%APs8jh_@c0CrW?Cmdxy{meIbYuch?963`FD~Pxl0^Hc1SvYij?c+!> zWIv&5BMkdy30A#%VOw807D|${?8Ej6xR$BL2ZuI7{Nm}wG+Km|$rOch72_<}rjBT% zFs#h}rMHEbGu0vK9vMxtIq-#@YCGe*jO*hzx7g*Pvg-ejyf=@ha{cl*gIp|HodUuRR?J3C|940l?61HW|*e`8)D;bY4# z=Gcg^DevxvbHwPjoEANzvE(07;&i88Fq8Ug$dJ@0L52XicSyp57n(j^Cer2fj2jU- z^5r*p>9?vz@N)I7b^Bv3w+r*SSYI&+N=8!|0$gaZ@%$Y-UVii}_AYfak6jWPD{PTNe?9)@^XHpNE*oBGxxaez7v+H73bBO9uFbQx zqSjy0b}Ayca}}OAaWpvLHsMs2zQBo59y6=6U3p6#7c{8m-ZZbZWWT+9;U2Pyq3f24 zoh{7c%WV!iJiHrsQs=!^563S2{fGAZ_~wj9+}NAyVUz1|@WC4=gIFDoS7$Uno*2D7 zbL3WW*$&o*t1dcg#_>0jOpk>4bqgnRCPhx?ou;|RFFIqdD%nY14JjZe}a4l7>fer^?D z&Zhz1v@f!Hpzeha%e!9r`L%1`zh4w2XsS`0>%ww$rCzi|$zl_4x%YN{`A#9BJsDwU zyo-349r)d(+=EQ7GOGn2mddqn9?N{X^~L&|`C@t_yLlTTT~$r$XfDN)Hs>Bt9Un^$ zJ{65hdT>zIveIJrHOU@9h0L|>oo}BhpC2ML;==>j8{?{W@wr*`6QV_{`JXei3m*Ek za6;F_>OLQ8V)yo#+w|v<8goBA!Dw&!`AD4zFMqzHme);oJ)DcWXR~@R+J_l zeAAHm@r)-|x_jfBH{3AP*NrxKIpd=lKjWLxMIB29KWyZGZrYh`zGd$|wnj*Pl6RCUun$YHCpjeyk%PkSnmRiz;@yKk7S~yOvMweh zBxTjL42_Uyf#q!nrQG-VK2IjGz2e%Ov({h1r(bVw<{pc4@!a_aOO9y7gg2GxjY582fl&+l8x9-8DJ?x!d_27&KJ6&@*AfBN(!X3B z{bPtzRB5>BpE&|auSw*NEKT@LP?HmV4T2i}eF2Ma9W#A)(Iv0$gb1f}8uPPI3tvvj z4(;}3{<~de^teo=tDom@CZ2I*i!Tar4tYoQjog_zbWX;&vA`((rU-7u0J-!;K%Qx0 z0!uru;K5n4gmA?wnKJ8@~OQqCUQ`={E}a#Gae3s8;gO-LJFC(P;kJp(P4z-pj?t z-md7rYgAD8!cP1X>({N8%2OJ8$^ds-Lwee=D^TiRmJR+*FAhZltf6s#P&9Cho*2@4 zW4mst6g~EQ|76oz9oB`U)~!-K_k#I^^@e+mrIqCcJ8xa95v^$ZlsjfSd+6YXRH>%* zdYub8D*TPFG(4VrOZ`B(jp*#GtBoAI!Zfv)SLIyzi!%ahclegPH94_m@67a#!Z*{_ zrZ3Ohl+b!Vb@xbk{-FlpxdP%*u9{1Zj4bkDSH9UNL3(Ag*IveZx6}IGwE>G%TDJ2f zsA?x0&>||15C>j2%~wch8eo5Q$|Ejkarl&${g2}_>a^ptzsqF*t3!BldemjKS zR!*F;(fZcvzwM|Rm`D^$q2BZ!6qC0Zj%Q$Fn9Vl(thxg7s6s^p2#%{6QW6u?a_vKS;ds&)e z7avkEG}_#i_j>nw?^(3hQ=0NW4!CI34!C|zmHxM}@#KJOB9{9t8{=GHQAeon*KkU4 zNS<%=-9>q!ve7D;Y$3gOll$9v3^_lK#Rzj;?zg%5#^maqu^Bk(si7^-kza4)-phPE z6MjtUg{8}KSH_1AuIYcgm^*X%se{YD1hTwh%MoRrd6PNpT=f^N-C9wey;cuSi5nJ~ zRodkjCsu~Vcp5Z_tSBScM!e%l-Vm2A>f!#8y@6o(NHt;ii}3|JWq3#VmO5_CiNEQ; z=(<;%#gV%iH;*1nX<%_15PxB+qPORZ_nJXA$4#qJr!q2as^AJolAKsW^e59P+O%V< zU-PQibU2JCG_ryd)>R3xCV~tOclw7IPV@{7tzg00Z%6Bt>2Px`W^P^j5u&>0tVUW! z1Q|kTG%-nYg@&x2)Eb$p2P@4VJ$`H>(~Z{VYCts z2rV0f142KPSJn*FEZRrqe-cPd65Pd2lN5JOTbh!*b!=#1vF8N`8P%#I*WT~?CSFR= z582t@T+3YhO7rYyvlrF;qJlfUuGen1^dW8`k4hgQG#zc$johGhqNiMWNH0H2HL5dn zKYv^Mii6QdJakG$+5;r{Pc-VO^W3vxIw*UTw>z=f1BQ%tz%Vn2!t(WzII1HP2~uo;NGa zF=3<8m9+tndre**Kg7SU67ER76O`n=BQd;FaNe$!AGCtkF5Rl)tMnrG_HB;f2zJ^m zp)ZLy*akS;s7o0Nze(=f5uz{oCZTUeOT&iOW*@@H*CkvGKIGin)6X76)#iUuxX`7v zm#A#*Bwpy3$=+MI>>Ig0=Rw@-C&Ra&ZFOXNKSmjy1=6!{^*dpYW(_o{F&a*+nadJ z!_vQno_e(U8}p?Le7;kTgsEb>$s+-~8VEZo{-u#H-H;Gg{QdPvz`;cc7%zi|mAzD0 zLk_-X`l)K#H6a3hx@ApFI2KI=QAz3w(Nb3e$bb>*VAW(kGSc+;olq3#cQMXVSne&hql>; zB4WXE^U3R}eOH-#Kh=diF79=|R8nfwLfFSR?^w6Ml5NaR1PYPO_s|NjyX0H>bJ<+S?a#gFIs6SefC;(An|>Y z;?Y+NT-vGv{gsR!wSCe)S;twRVrav1?%wtIxq{j69Cm$-AB(qBD{@v+WjStUZI_2D zwDA-w*+watN#x>5#F@+wVwx%PsNnYPF>~=}mSTe9D}AW3{sPpFS(dpts%+pg9+Bb6FOsNsD&>RU^>HgR zAI*j5=8jvo7)Cd=H(Vb$>hs8atYG8S{eed%-YSN*H0szk=06#D+(u;K4gVx{?U3VF z#_gRd@1`6YQ^m-CI5hrZx%7YFGGGtDG!tF0aPhAP3LaT%hlXQ#xb_AX|HD8b)25%? zhCw&UWx&$&-;b1qFjDxRk0?E^74t56{cZ=xMV6e9&GM$!Ctgc!Ybex?On0yU_VviI z>~QkYv>=9qf{XX?iLcC1UpKb@i+0hKt@3;g*M`cOWX|{Jmh_z{NW(_m zMCrNZOSuoXdfu!!&a6@yaD3MT1@qyMRgX117P`5*jkDI@)A4?W&mOo=+Jm<~e^xKx zc;3#9$!AAW*GpHGTjqnJ!g&Qk~D{ymH-oYJ{!H?&MXg*%ZZ$#iCatx>^!8jhgLt zUc|?1bs&bj?W)?-zHbj5^%}XOA9_fO@h@>rTQZ#KxTeqJ(hJ3giVgZl$CXs_S>72* zeH|-ywC&q#nI*nmDe{(|b!Hs%;+eg%92(!WRwP|IkhCLwLp8?>kLXYS*A8w`JX6YM zIoi5z{;a)>n^lNYW%`Ja=cH$3={eoWP;p;f1xtlYx(oc_%vv zKs|)t1XcXB^ZMVriJ61^L3($}ke3^lZ3j&~-TAc^5s zpp&<#t~&G5p2W4sdqiz!E6R3lr-g2NQ!1LMXw$PgQ8YneUn*mVJ)9HD^*~J3T`DnO zYTdRFJ9yt~=gzt{<@=t-?Bb6Gz_cd|zve^#dH}$rPn`-Y<6(2wbSqm#*mi@ZeH_Ts zd;Rn~R?N8xQxAcwC84aQPYk3crs4(!@=c=`wStDBnWqn?6BKPD$<2BW+9A)Ui^_ArX8yOUG@@LDT_K_xBw0*F2i6TPCHU1 zs!xtoAvHHWJN%bnaAJ)-It=77!=P5BW|&7sS$N4R;S|zF9v)+&gYMO~1*Kuz7#X}M zv%02y@xPCwCQT*i&H;KspL_g?ec+BCy5spXNAZ1Jprt_UIQeBN0hjWr6OjvVrazM) zs!xuO;J(4%8p!hSV(toUo?9PxAqO}c?=0EtQZ6#LgH7j@@F`oC>wCSl_APJg2>tk4 zK)?9&)#h7%i8@y1MG<$+4gB_2+9aK^FjJ88v^gzuM_6I$LUF&AQy(vF?~@ZHACSuv zW#8yr6Wc;k9-p~mc^t9xY2XFMV<}Bs9esPWPPZ&ow4&~ z`7iwYzhuwprXR_Fmwx;g?K$xVP`C5H*`BvB_7qc|Ii)?P3J+*>+PFWCT;J?0VMOglE;PK zYR8M+Iac4rFuJdI^YiB;_?bRRg6d%w_UsgC$_g8Sg^?r29mEEA$v=_YrmZHbe0Gzl z=+UEbU!O0|`pgu1Sk-4rD^3-3{7Y7xZv25P>iZwE;x8e{|L?6hWsou{oA58$bh@z& zEW-P1n@*lop&>na`avZujGGix!hJoz9hXr*eC3$1=+l=C?cZJ~76u=!a_dQz7q%V! z%KlbN-jc~*?dpp;OSE^yeN<$LKP&CD?BV!6>xadM@5;0=L`7)`lUAI(VQ=D^e08fh zA-Rj8gY(hAvlrFQ$KM|wYzq3&eMB-s(sj>l2N`w!E|$aqH{(9{rONJcR*z$kM=ONr zY*a|N?Yj7o-fqUA`}nCUu0-5aQPAYgmH&=qVTS?TJ^xV@1WUO8XDs_m6!d?KWufpx zf8q3a2wNGNmdnIXH|Rk&8T}>Mk`RZA&NAS>=!w045XDlby`YUa(NRp;gWTBtn}oQX zX*E{`+$G$l^x<)^;n4-SHu!F44$uW?6COLj^{>!o)z4T#|2(Wn);tSCA;mV?0$&{kB3K8 zc09eadayiO(jw!suAXtP|A~!pkEIrz?=N~ErM7tJ>+x6}iLo}ln^SpOFzvr-?`elf zf0tYNckTU4i1h!ey{C$-rn7R9h@W-<^=kqL8wMlkxGBaoK~;VFC!iqJU97vs!x;bF zn9ez(69Hp7^zG-FUfz83&K)Ht*s@v=raxW#ro2^OU` zZo{z%ufINrt9)lNM?-W^!4W>=Q9>8XHIYv}joB6teaRc@jdGKp>9-!#dqpLh8kdb- zc(dr~pjEsPNv)}Fw?LQEQZ@?VoTH_2{Zcp1eNVVgvTtFhi99f;(@Fwhx=3^+2nLKo#5f!(Vh68WGwL0j>3M;C}A@eztnUf zV?lzg<8a6nW!fbjZyTM!t*sGaDQ zK15>^?;gCFKFk@Yux$-K_!E=C9k_J%|FiJw*CZ2mEEA~64iwZu<7v2wbT}1Go+17N z4?Q`=A|gTiZ#?uhb7PN_aHz%Gyg`A~<3)^W+gz<%Ewn5w@2T7^4{FJ7y0w6fY`k~3 z+wISit)~?&4UQ+gyPEKE^M-vTcb?a=%UH)N>0fYMX^TOo6>vr?8_&vXL8Rw)(kHLVOEWOp+szvmUoK5_VLPgEess;H!*xwiY*E99RqJS6`< zRTFLj7?+C?>w8>b_AS%c#k+fj^Kj(;w#RGzj%!m^7Lra`j7mF^clhFV9LO*gOVE10 z*LsU~Ui=N6Gcmns{9lgQ@mKM3m)9yhev@r6+vDvetXL;+9iFOu>%6z0=SBHbTXf9VEjZzQH!a?au_frKjCjyf$+0uH zpT1VN)q7(!o|H3oaxaU=sNJ5^B@(wbo?3fuKjlotT()r+zm&Yhu`iN7@|&2KviEQI z)F!hJ?`qw%c;U7t#@!ZIPBDtl8r_v;eVuVevxLZ0g95fT(2+}zQ>T>xCrmpw{WT$n z#s0sT0H5d@8kzntOMpXOe~K6X-!Q2sOgEN94vhQDxdRTFprO?CW9|SuB>q7LeBu?L z211q^{EnFHex2114|FfEDK~5unF(JX0VH{G% z2>m!V)1xujd0^Gs?UFNCm8kdJijJn4sD2yQ@d_8_Y@h$OBSig^U0uM;+a2w*i;sVk zE1S`LA~pDF<;blfUHxUNuO%rP2p?UxDlOVqo^ZQ%&%)RO+`M;>G;CMj?DILGL^VHl zK)dg2m#T$@0qN}O&##}Y6#2SGOXMRH{;*=ulw>$nR5y*4xJ1HqLpP*2{g)=1G)sq- zxHLGK@Sl~$p|&(Ba6={wzX<^**TjDmWv8<=TC%a_$I|Fu*WteUz798wAU0*`0Yb0; z%8b*RTEWHA^cMao97DX$Br{-L(l2|3pz(jS+m|@eFU&~!gI(@!D}QE6Iy3g?wrC~} z!)}rjiEH~a^|Wm2gS)#04ek`}KUv!AcW@)cGUp_YFmFeR*|(owIj{ z4SW6*MP}XDEr+&+$u!SA`Ee8PlBmtNvUsY zlBXI?aE&qD3iQxodUl*{XaVb+|Hh8UvUim6;2cL}jR{p1N1OgSpNYOIXO7t6<#%K_-@#ai_5*e!g!Bl%aPZg zZ|~gbRjSOa(P;y=xl*hIMWV0e$7+;opA`Na03i@HQe;)wZzF; zDjXEx|B-FXwYbsKuYO%?7kWA~G-ioG_>w~XXgK^TzU;*OBV6WMLPid(b`z#KkRol2 zG0v&)#$gSe^K44vOch~FHqNBNI(-;H*QOOL!m5;M4ynISB25}nRJ^J>Y~}&#B>w}m zO^!uik@0WM=60mieRu$t6vWA^9q&<&fm^z#LB{{Q#n41%6a!lk>g$Q z&(CQD2T_%{ks+Lflf=rf&J9oORxlZ+?EXsjZJB#G%gWwBmK>!QrN9tS^tpDC@5--6 zd#G~{!XZw(F7g;ebVSNWxIFee8NA(AbN$ie4B=gOEk;ZCc+|7Xz88-oJrCi@7fw() z6Cv&+yxDF??vPQeeQce4<3i5X#|u*$TbrpV3bsP>jW;;v9^DaN=8;(7&l7*Kcf-rA z7iy(>!_KVV;c%gNr&&vw#GFV5`Bj99nYuoFPW2|^Z#E4Sd}f`!Janp~S&6V$fo@B> zBc0Y99gcpYxA12K`*-=Ne{qgJ(KXbM{x6%O!|_M-*Y*!z{InyO|Doi_MA!cJzWCn< z7*o^apF|s^=|&p}DksejCOI?+1u@YERh0sM32t5>PW!|NBI%c41FF9N(4ongoBw67 zQF1z=J#b_;Gqb}1MI&J^Z{y(=ku_3Vw`+4<<`LGO zvAt_M?@K0zNC9c>seIeSr5As5qWd4&X1c)!Z2FyS8|=(&QoN7<9`D0-4fyFVru}}Q z2mOSy>91=3Wi@TDXyRJ>YTAV3^2fVZubC~Tv@ca*Hp6Otu1*n=o#_k0xF(jDdm@X= zxvubwLck%zEOcNWy8)B?ITwyu4C+_s#ZGC7siKVOIgIIs53nozukG+JI*jiZSkMje zzs+Gx<*Dg$8;oX@wfFBFQZ}h z8u}KC1O@tFU`(r3Q67%0S@C^odHBPjjXW!OgIDRK(ur%kjDwc0j8T&6g&yE7-2>8_ zWDX5SDn|+|U%{(0JC$c(4YK^d^{LWS=W`OLyoBOEu-A0GJ+gRWl4to#_WFK1bN zcJ=qew~5MPE2gx{RN=ss3m^Vy1Wh|M_%*YDwGe@b9DRsp>wd0vpuqM^{PaWUUv3_N z%L{%xh_0=wKKxK!xb>sb)fKWQpZKphGT$7hX~hvbv$CSdV@|})(+5wbeA6{D4KsN8i%ahI|3-ZeuD&i95_d3wEYE9Rrg7&kv} zjZIw`t*De0-e?@tVXUK}S0)=3`RL7~flA)terAuorO!57J`B6Jv;TEh>%hE~&SoM9 znfMx9T;kMM7FHJC81xr0F&}Fmk!Q=E?UGTbwPM4n(|#*VBz4YgsOXNdtu z)vi!ie(9Ab`*dnU$amJBT;O-Q{IhbJqov%!{IYpLJ9afhcyNm^&1Whvdd7V=T30-m zn$sC!vwvn&6``p7e1*=9W!LM+lp++KEcH()a{SDvx#wEP$Gsz>ym95qg~ZX4Su=!v zULCqDQ0}}?A|Sg;{Zi1&xZ^ri7jWXL&;65YNl9l1ztkM;;s1*kaRKZd-8aG1g$v5t zXsU!u?R&1o)ZW|Mal1R0+K)db{uPIa&hFk50v^8V?CR{k<)`!=(2zZVGm+tu5cb(| zso9u&J8qMt(YVxBPyB_0pP?6zfm)yn{eCj!9y}G;#X=^lBg^s7KM)#Hht_^xPX;01 z6s0_*Eidowj`nU`eovs5XR1zw|E%PfTN=D(Vi0j)=9%h^LFW8t!sGwr&eQun@fNTz z;J>f)X!JH=YPdxXES+u02@P*!>OSpFc~vwSVFhUU#znF#V&)Z)GexBDO#vE z6qu?rEa7+Cday3 z$YRFI@cf{_o+%B9hB>Gqw>WaC=_1!vx_iStcf{|fv`>a0m*g+!DXUq)<(78HKkNB< zFEjVH_jZJz!k#+h9l*cpdboOQH{WLO;5ad^Om)pA*Zv$Q$iNmMyVE`i->x zeJCMMN8a{C6F;wiLdK=O8(cw&e1QCkmxQelKmI02PHbVA_;;e@M4f%&Z<6Fhv3KHc z2;3(cMScrW82z_Y$%*{u#CPBpNBVc5m@|!2lRUs-C(@Z?=^ITO<@xgvF~4l z!?4f>Ak%}q=-6VCFD4G_|NaRas!#tK^l9RB>WNQaHRZ&C#oq$q02P3rpCMOvqOFkOvQWAnklx3^>-_mm zSl|SSh@TQ%+zIaghXjVip$3Pv8V+M}&}Cv1#KhB~Du+bgKYurIK_^`TUFfSg-QYkI z+{EI{@4o|GCYGyxmypF)Xe*%0_XVE_d;l;w49Gwi6lMS*`Plu!(ZlZoU(I(&t zIe_x#XP^rTLx2|!1tKIea3~Z3Z8#K*Fuz6?L;Yw4z=uQ82y;0c3P->q4#gu(A#f-l z;V&GDNC?ewC?w(Ek<%=HJ^^(3J|2<2!?%!2YJPqOx}boC-{4Th0u|y=$U+M^6tloC zI25$d9u7qr9opnie0!B6gjo~$6EsZ@hEm7DTzn13%$Xk z*o71g9>p&74L`9FU;;g`l@*U-7kY|Eu?q)J;Zf{Dzwsz`VW%B($Hos`kRgmm!3$U8 z!V+hCpO7JqN8yV&IXsGAWQZdx#_3IgMks=jA&*BPjDsTv@F<263c#Zv#=!=6Jc?q3 z67VRDk!md-#W6w=cofJu;9NY4WP~#CD3p=YS@0;95emVhV1}zpK%`p@p%gp{XB@J~ z8^tq1F?bZv$clD6ifDv#@F=8lFq6fjm_{fFkAfNpVHzGqHCzcSiAQ0LgXugT#Wg}v zcof(;JZOa?8=)*b3T+&$WJPY*_-Pb?0RaU!4ra6j6x|4=5m0!;b+#bV@r_U%0R=d+ zNu7Wq9HBe{3UM5)SR$YpM<|ehf*h`HmL#AkM<|hi!W;)2O+ayuP$U5bIu2?i1Qh8A zWfD-RLvR2hYC!-X0R=k_YKF+!hCkm1;E{kqI~2AE7_gZU{xAS0jT6T4B%*NGD*>4!ljkpdJ1sV9*ZC zO~9ZXJ|SSx4l`Z?2JP@g0tW36s1Yz|hu;w}Xb1i#V9*ZD5HM&51}9+94y_U}Xa^1_ zV9*W^Az;uBEKb0n9iB%HXF#K|vx0 zlfdT4ZCdnCk&qCzK9ZZmU=q~-z64!n_!0pI! zNF}34?a{goHsma61WucK9L*gLdF{ z5(e$?I}!%%!0pJUxt}^iGsu=&x(HgK42(oEBn;Yt+esL-!$U|Iv;()3FldKok}zlo zZby#nr9TL?!k`_vorFOBX+Arb(RQ9KiX+sP=N zk$8}d;+X*4PDb&Jgok7l&jjFhGKyy;S|p=*CIGjSQ9L8TBN@dr0m+r1ct&DLGKyyc zvXuhGGZI>oQ9KiX+sP=Nkw}w_;+X*4PDb&J1fFCR&jjFhGKyy;4ke>_MlR~4pm;{Y zQVNP^0&qJ8#WND6Qcye-fZHi3o{^xHg5sF~+)hF9jKr`Ml)VYS?G%)~k&u>xq8&MN zfr6qPiEt?>+6lnz6cp`9z)L~VP5^GFplCSiw1GiH#Xot>GF=z*Fr()0!eWha14%|+~pdGqS#h@Lyor*y_ya_4> z?ZE9+4BFwvz&fm-EDAfGL8N;+WS&9ApdGlKia|TPHYx_~!0l8F+TkrCOUi#ZO#*N` z6@zDZsZ${{}=gq*NRMe&TxoTwY)eJ)OayMHqIf2Psi`QQk;BobD4yYLP!KUqfmSGZanXyq( zJR`>-QBgc26F4f0XXJz#8j5FRK1W0GOayMHp?F57cQh2w$VnD76qCqo4{jErcOST& zhGG(#{LxTM5`o)kC?=7)APvPN5xAX(ViK7e(ojqif!kq6Ed4>izBH79k$s^wl!1|n zBMn6?5xAX(A{LoP(on=AyU1uLVv%Vj4Mi*wxSfU~7MW$zP{bm;S!gI?kx3^FMJy4x zorXayv`WJu7Py^;K`cCkhCwWFI}L+acqR>lSm1UV2C<+54TD(Vb{Yn;pb-s&Sm1UV z2C<+Z4TD(Vb{Yn;pf3%BSm1UV2C<+%4TD(Vb{Yn;&>I>CvB2##3}T^kGz?;a+i4iY zLSJbZ!~(ZZRGNQK12R(v8HEF|JIHjpL#ECkqhkrltE;0ljLfAWi%Spokjfp%XnXLw zK*qEO`E_*+?BV@^jN%^2v8!W%4=)sCOnZoa80fy)bJ$U7iM@IDnt_K-y z4{QK3svodD$e8vJ{V*c{_#P6`nD!9;Fk=81A7r#WFdN8dd%*c1qxyjzVZ|=m9)DzJ5z$bu=wg*rK8Pgu6B2mS$MOnZoa==dOkhk)*2+C%h1#|H^~1juN6@Kun} z_P|SkjOqtJg_;W59{356QT?DPkTLBc`k~_kN#KBtX%Ep49Un+W2V_iph<=#y0gnb5 z)ermy$Y^_@3RHDa{g9d~reKLAfj~y}1D^phraeSI%=iGW0p`ZEhv)L=0MOeB#6btSYt@Estd{e`ZAjA;+i4>LZX>mZ~3Mf?Y*n2F?`K*qEO`e6#1 zNHPj!R6oRjV2YYZb_yz6sD6n5z!Wx-bQQ>`en@>5Q`|)IS0JPMA^rnX;6xHyAfx&r zby`f36UlIajOvH@4@{vGNqIqS4b>0vADCh%k^=)7)erF>n1Uyg6ayL65Ah$Ek|&ZS z0~ys1@gJC?Cz3V;8PyN*ADFTyl1GE;9;zSWKQM()B(VlEsvpc7K*qF(=!Y2}FmnL9 zz_f?xhZ!F*cL15*9+Ha#ncf~5@gJB1D3Y9m`XaqOxR)4_>HS5rbs%HfL-a$(2a>)6 zng0IZDszz0@qy&?K*qF(=!cFEB*6zVsvqJ%Fr`o=;|CQ^R6oRjV2Yt+#D8F_p=8Jt zfsAPn(GMLTWSC6=onqPp{V)|#GR!AHM*EBS4@^yzjQ9^sQ4~osLX8z|5Ah$EvM7>u z1R2vF=!YqcB56pF(f0@Q3ZQpPdx(DM_#nf~0%Wv3#D8F_qh!Q?V9KLN<`SyBXnTnN zz?49dR3^yi^AZ1nDS{%oO^{LhA^rnX21SycAfxXa@gJB%D3bkzIx_lv#D8E)p-4Iu zWVAns|G<t9ChCVsCKqH>KbU=hjA;+_!&Fd_V=X{N`-}JwObwNc%s-IX z{g3$xlKcf3Z4dDum?A5Z4F(x)5Ah$EGAoiE1{u>Hq8|p|i2uM;TH)wHM8>p-=!d~K z;y*CORwSbgGO8cqKQQH1B*hFe+8*LRFa=j6=L|BcAL2hSC08T~4Kiw9#D8Flu1HoI zRxF_QMf?Y*?24qRK}PjM{0FA+isY?9M)gDd2d4CjB(gz9^+Wszrud3vwn0YqL;T0j z^6SL9%87-;j+>nAmw5O|u9Z}oh%J$%C%6t+Dy*~Jd*TC#!-1w$NuVE+c?Q3)N}#~! zruN%mO{nCA0+ScEB8!c`Z|VHGjP%E9O)fR_9UHyiQFCO3OzWvR9ECT}Nbm%ycF z;OM-?$s0=G>d1mq`T|jOIVjguOP0CRmNEwf;f`oTr7x#N;&~z!QI5W< zx$hLat-1Bsoj1k1pO&31Ez0q^EFhO8FMWV1Sh*#DYIE`93|afP*CCy+UlLY7Kul9qQhKD))Y4*T-t(l$ zrN(w%#>v}r3FhI?iRusKcmnVm8l$W`-`8>5Qn|S!LPPcDpK@9hoRE;Pd;yV0Gpr-` z#-&hd>q~M}Mx*9rM;yE#d%oW zJi3gwS!3wd&LiLQxIsOS=)km)xBHb>I6X`^9*zwR=@m&;OUuf-;;t}Ss(RsSZyeLC zTlE)mmBb2Wtl5$-d^vhnw@{eY-O9=#CaupGZ-kV+_@>(btmJ4%TF+CD>#Vyj+gGy1 zStmuzQY%YIEO#!ry8Ph5gOK>SdMs9p#je&i`N4?7k!YL<K%*@^?X6Zd^Tk%)!1UY8cM4%`?>6V(Iq!8&vM(r*U3w`rG+N3L z^iuJ4{0#BHxr;QN^v;xZcrl&SwiAhFt~|L=R+G`1K{?r(TbMnzeiIwbnwf8(7XOC{ zlmXnn+67w)T_28$^dAfqBn4!%iL3814IpUi^jy;3$fmhYA>it8lRQU&X~7+(LnS{S zxl^fJCjWxa7cRk?*$lJ0%bDlyyBOqMt{|j3V_ju}RKusZI)%KQ3>r)qSn4@;h=bBS zk6&A6>+3vb{#NDc<|Y7dg+su+O^0Q?inIGcUrlSkNB7n%Uq8J&8ru;Y+R@Px8X8*i zISqEgeGY92{oL}oqDQ zDV)z!b@eUVd0UOG`N?=b5XwirVU@HjZJp zi0vYlR+gQX@m;UNxsA59OU!2tyK@YIhS>M%2}jELkrA>XYJZ7`z_mH;!RDP})$72F2eisQcb>>=ZhVig{_0~J zeU!tp#<%#%8p7q7i8lxB5}UR(9>E(kyl|&Qq&_NMoJ?Th9A+Cz(~e4eb>)#=<|X&M zMIH)aq6^Z+^Sx2fZ-p0n z$>VLOS9XxrN@mmc(wC=VIsHXw{7YE)j@Wx^8?qBieSamC4%1qg4`;KWsbQ5bozzDqN<3;}oyo9eHJM(pnLMqjj&ppZlC^H%>)s5Ok|J4V*Vn zozIlDK02wTv2fv=kGfKP7x)beWE*4z6SOwIKI=L^)wQ_aYjmeq4P)6-ZkJ_7y1Lw2 z=1RJ=tj`su-n{?nUeEg{4M*OlRoZk4PR4bX z7TnGf8Pq#F?h}|tsNKG1YdptLThOhIdD*Jc@3b_(4JobY9v$h8l2}~!ehHItU|4gN zI)&mp)M?zQban6gkMA5f7Z5@YZ!GJ)YpARpe1h`&OxLD?#nv7*wfVYjII@+_P;*Pc z7Jz-G7|W8+zq~2tmCrwzL?9H+BVbWhb~J{fxN=ka1@;p@Qbmx-fQhI{=-7_5(R-ma*>FRLh-lyODu zQN7KYb(UtfX66PyyN@xym#>UH7HeU7%-6D+H0$N66zNm-AHp_|igfCKlfTnV;OaJZ zO<(LW^1Ni(_)VOV|C{QT_;}9hs!xx4dBp8SYl(>eNeoqNT&~)a@_A!Jn+Oy5!Y`G2 z`v=R6=`4zFy74+Gc(L$9zU6H(jN#H8TNu`_N}RpOL&?w7oc;1H z<2&A_EMl4d>joLplJ4(M?|2v@VJtwcVyJX&Y%3pJ^4xn+QpHTrzbaIC)~rt1U2H{X zT9>pR$jNd_3W}3km^VgoEnl|u%dlF>=cJnYPM<}&F$wY2JzKZ-_9z-v-;40 zTQT$XycPcR1fQK?|Lw_P7ni5?Mg1ddnZ+Adu1eyljb^V*w%@G5>#bI~+UtVE?6NHt zj&E9T5!-YYx4jn$WVe5#uzTOF{j0gSPPlEkb|b%4Ux#}0me|?M$c)8_b*N6$SXbKy)QVMZyZ;1pV_4E&Z?n@94suF>lO|MehYi~IfeL~bM$UnW1X$b z-aFRSoFU7MjcZ#=ePv{11P1+ZgWbKod6{na)w0E|^#lgqIl&=bZ%+Q|yHCo`bWSbl zs!*PoW*e`7cFKN71r_e>WoYHuw9%N{-{jY(fx4KqXH6XaL}jrUftdM z_badX&rY0uqT8i(XYvx`$de_0nq;@A&#|QALrF5@0t8lp{pP!puMZshwC8-kj!7lq zoca5PK>+i-w(|BYk=fOv`l@Lkcq?AVHm;cAK9A@d)#UEd*v5FjzdVHf)~#E;!OL8i z#5K^i445yFyJg0AZt-=WuM53SMA!5+#B+$NxXsI5m!GoA%J$3cB@MY}AMHupGn|?1 zZ@OyvgZldVh@fSbJI=1uZn$N%ZtIgWJ;zre)`#OQoB3wU_~t*@-QRC?#WpFqWBaN` z4Vh)klI2A%4>kZ z>miN@?Li!yTDg<=2yg6G+i5@8EqdD4?Unqe*qwf?i@Zi3h|Jc!;a_2F`r^XFqLtlLQ&VTvt8a3LOTS&Y74VeNL$yqD zW|8T!Q)kb{7RThq#l)OFfBt+y?Eb=~!AF+A+Osa=?cV&BQp%F0HNg$1viJbGB})p)z}V(x$svql=KEq6Z}DYAC`+V82E)KS>zV%cnG z!cCxMu&=2m6D}E4$`RLl&DMNBG!zjY{_6E>#sG%3eH|ToyyDEvn|f{SS~GIqmPGY3 zJ(Y4>grgXa%+_lyjB#1JrgVmZ^HL5&`|n*7wODoSG| zA)4t-4Q2Q)q1X}plPfKGFTSkSC#N)No zuC-&CzW;Q}k#9S1v)#Kl+C}`bBBw8u z^_lNL&VyiU&-btjI+mn;bm zj{CZ|!dy^bG;~l|XPLG9;$)en%NIz$1XjMu(yno4zM!#m^og_g2hTmV^`)t3&tTx> znI-*|)E300a`y9R_6N(f=W(nXxAz1njOeSl^fd+RpKWbzEhs3MGiOfel`DY?D@;tn z$}1me4P1_v3S=}{bpGM?pzX7cGV;j3Nmp_@m(?Se(Icnmv_7u%xNN{8lNAqE+OWB~ zihjA;_F$)@Yh5z;TuqJalWU$WF?ppZz`&=i6zHbi@kAu~iHN0OhmLd50*)cW8;6-MQhDRSQkJFM+%M{yX)l%E6fTvvF?slDvNj#6wFSv7=2`OEds|KBT$Z9P z{&Jl8<4g;=?zx{n9~kv1yd8Q&ZU`pno$Kywdm#Nq^~+$<6DMwxpXuVu4}_{+W{CId ztIp5cdN9J%%BtYC#@5ec9*1q0Y4Un&EuD{hb_aLoutwjLH{)aOefFx#i`NH6OYVHJ z=WOkDjlQmnO{N7_$38sYeZ&5tm0a0tsRg6Y1yka#-dPc~?Quc>@Cz@=BkQZI4C*^L zqPhll>s0@HR_Mk%Qf4M0H9{=Xw8E-~`_3(|7Z_9(*i5zQ;+Y1v1Y12bR`uRdVdMZf(fk%2);SbjEeU zA|i|Y-=~(9?SVuFgQl{n!v2-V4KwsJ=giES({WyGlhXQol5^a1ga?P58w^>=vt&ym zIN#5DeR`JW#qGT&hL`6F6~;72K2ldrDLj(KwB|u_;rnskn6->Il9FNz7x|?gi@2w8 zP@cuyq?F-garhp#q#2(VH^yaUoKW?}nGNiEHh+ktv;6h3j1DuMW5XpZGruZt%W8W+ zvrx6NDOfhoc#&I+7w(*+t!mHMqsHQ^C2jT_Hb^Qdjqx$^^_=tj^mHk&c;kz_>)e_) zX;(A(D&k^JOSe^Rz7P}IyI+b?_*@C0-j}_1c%-EdDBW;^SqB_KQaaDzglpdV1Q3w_i@pbdn9Y9knCs(F37ov2fK+ zjhJPJFMk`2Xg%FOdyguGF3o=JS~=2Z`?nfRRM z&pYO{VDpVT$%}XNs7ZeH<=VsjUUbPalU_ZYZ!5iCNN;93!1#3cNROqjukWCSvT|Q@ z&f41AT1ek<#w*qKzc!wSS9zd!?}~F4o4?qC(4N~RifjqtS2ERSGsv2fsw@dLkJM{+ z1|^F)oRBqt>bLBYW`K45@~rSZWGB5!s&$j3`N3Bo1J{_99OFHbsMC3+&CIM-T*R(j z!b&i~^t{KZvngkotqsbVP1kaLJ~`sm7|C@%VUyl`D*~VRb4HqevFN>cJYz$KXlI~C z>`22nhr=fQRSnfFyP57UR=Om1@bx?WK=zS9ZuMptz9Q3=2@GrkqciX)$(#~b+Y<|l zd3Og{stm83&ybL`Bh!WDGJ}7H?pM=0ttl^_C*JnuIwYi%SERn0C;3$xPf`6!EBnXi z+cuVOVf@O4uV1jay}x>a`4V1@yi0 zUU>73%C6CihjE>s6bkyYXRz}x$)89S|>TKW6A5+luptxa` zukcZP`%7}y!hKe8e3}c|u1C$Py|cfwgJ+?4mE)Ldj+SeNuI)gDTrKO2HK(XscORn= z2(btDAGiO^chJBjQ2v0dwj}Z3)e>&T?PP7D_I@wEN=Q+atv`JP}LW*~(l^ zI)slMZXm7T3Y=$6sDYGYWrnFC#jaAG`E|s3m!6%BgBL0{oqWhwr{tPm^Rat`FOTZ6 z#9gmdetji%Wvl%D_bH|i<&}uVS*4fu+6_9nzwz8&deXXaX~H<|c*3K;wsk34XOcNH z?#eH#Ww5Zx*riZ?Q);nBW_n4{$C6GzhExT4XXTqkC8P1qvo}YttT|?zb1#jD!68sX zyEbr3BQO3!nd9gA{gLT6rQ6;m2D2B9?Bi+P+E!lgjz76`bb0*4ie^#w7_mJ`qGA_1 z(sCComd3J~NRAn~4P=%xn>2dXtz*#4IG38c`x-+~M&)U3mo3fRg)j>deg5V=5Fz{+d<(Wf@XhU<-Qckq|0^!k*(wl%x0uOo=x96+7-(aW#TacI-i zd3z$+Riroh9H{hv5p=^X+s4YLPa&o|xY6-qKU?}-v31Fbn(z8L%wyWltmG4_vR$Ho zbpCQ_?YBoy#|5s}&P$l%kbFQ}{6_Mpy;X}dg+6n1SlsPjWpdnLC#SATn~C7jryuy( z`JA2Kq^B=fzkYq7XnA=#pTwfbq>S9$+;ivTl$2cV9G;h-pWieR(lt_eAcYw@f;|>|mQGOl^8*N)X#(EFZ9saoz8} zQ-9&+dIs@@^RLClol)gKethSy6*4S}=Ob#_mR%LvdPZZ@F0Pls8^b(_Bf6xT8kOP? zt%Wn>(+BpK#Vo964L)O?`(kZCcxa%H>@F4y){iw}vzWv}>)6}bb3XEnkFQxgxbx8Q zE*Ia#fE6U~rT3*dPuuZHu(&a1B$*^h?n;YQIqMS0-mPj`+DH;%ytdj)Gw$F@ife>H zj7!fkHQSpBHbtD;GX^Rng3~ zysOY+SXKUtVRh-;g${SUDn^5Y`DX3!-9zS1cwNjTH!o`Y!VB{XUtFtmQIlK#X;b~` z7=Ce`0P$~)DUq{q&xBo8-Vm}HRH~MJr5QxsFUOzJ7Q~>#^p3W5Pon6Tn?jxE(!+Y@ zT&Y$X&2rhPbbjpK`O)h0Y(`2~!o%}?ckqjJ{U55{vLVi<3)aQmHP~RmEeQ~8aEIU! z+}#}p8Qcl(?wa84?ry=|3GU9G=RN1c-t!ag>0aHd)>YN?*3rm8f)^JQaVY;n{=WCU zkI|;QcRatpTvSw4T&%Ug9>G)(?T@9913}X(Dck!e368SI1UMSqqmdR51qO?p;ne%=9?$Gn5g>m=vWT)C4guZBL-5+fgfDlHyeK zmj{-70J9&Pzb6GXcSD>RJKmB+Afed?eC$PlPcqWo5*!FUn5$6pN#x8j&#n9mQA?uP zPqaI~$r}mQ;8mDvVZnjK?dc`r++i#r#Y{iQSA`$2_h_ilLrqCLC?Yg&#gwrgZQF^H zuOyFge!^(MYIkV+r&PBspgG#}_wZ8A&i(SW*X2|fclFr~euDe#g5z}878_&uMh!`u zbxKofdT0cWmNYU8Ta@7@$-lnjHa)F)`8zq8pc}^_C=Z^aMlSz~ zt~~;gR}lw*&D}eY zuD%=9Y!M1Gy%X%r52((Hj*0k=EoeRBJnnUPUR`mzjY5nOAOF3#gcQ_LD8j!cz(U+(Jd@JA|n4SC~3iX>bs=CWNIX@5(@Fp%-6~;$DoTPlHr!A zNb8&qxGsLdn74Cq3dV);;@-M%v~Nty=eB}9=#sjZnQvaYrtV(DXICmKWTowNV!_l> z34BMr;fl6B4*cQtxchL{SsdnbHkhHWLR}G$&4Zb**`q5=EZ{{1`}H)??c>$;8jMH( z{s0_$rDCN|d*_CNO!4?~@cg=DxqWZSPZomYNi%%bqCythK`ui@`0UhWFWl;sAR+Gt zL$PaOT?s+KuI+8Z5Q6D()~|FQNr9m? zwjv(;V{kD?L9+*c)nNdJU%BCc8_dwMaESLNsn96z9$IWxXVOUXH{`hy{U;#cJPw5tB&UZZb#A2S|0b#J^ ztvoFBnN%~vBbqv@vkaR9@${c?PEUJuJHsUcZ_;+ZDf5PyPZ5nWWKiGn7tt>YMRUln zDJtT&(V;Mb&>uExvZ^+}YQj=s+1P$wC$?a9wFU5|Ck&Y^x{(OD2_DaNdbi8-J@8c5 zw$#`~3QX>^G8B6$E2_(FNa>Nf25i3lN-da{=E6^^7JW^XYm4H!_ZUTjN6Hc+TQcrz zoZ4UHU-5d#RNZ}AR=D^5{z`He?P~>oggxvdH;ne)^Et(3>r?>43)~65X~qtRAk|<} z4{(V^fN>b!rJI)|4b26Ruzlz*Z(n@O1#b9W8gj^yu(CTqylVIggQ3Bz?kaN3+S78d;1GcW{|Gv;%|hQ;pW-o#&d|cRfNy7zW&BW2GrB|-z4;i4FPj>O}f^| z$cPz!;E%?GmJ>Ng67bB*FeE9le!YdPZeLwt5;j$3r~>{;$?GB1W`(rIG;#rXBQoFU z`7mi>!SqjXunnf8u^YLIx~el_VmAPrgWI`RDVF{9K_Be9Y}6RD`Vv-sbEP6f#~n>i zzHBr3Kt7~$!I%ArHTJ;Pv`gLwcp47Bfwhi~VTty!>v^b|xWZH%5^&spYogmc?0n4$ z%JgBA2%u5A&%%3(Q7#nxA@JfDe>-%gOp;F{5RSD9B}AimDJV>}i6~`r6SsY>#!q6E zOL!49iSdh7j@gpIs$=%M=gUbS9VXJFpiKyBsj-xM--w; zfoCs_9o&G9Gg7PFw%dBIXaB6l_|nz}%?*Gi%Sd-Fv~O=j5N`DL?_v6n0KcKuE&m<^ zC=v)M1N6KtZEPgaI*dFm(Tmi`&MiDnC`txuX&eP(X*lr%NR z_hxg_kfFpVmx8c5a{Z=cot_fg-5J*1krI!vg!%;#N|vG9eBUCCl8%b1G4f7zyqb72zRmBIQfKbq!_D<&9* z`|(A2C(xiKCSafoC4Oa(t&g~Hl+ZHQahXUP%dv&3s;J}mq+z=(4Uwt3FF>kQN%w4m zW{=9jtr^X|q@;6ts-kbeeCZRr(}soEKcfqt1s{(AO5tM!`JQgFQ`7V8#{u~3QQ}?_ zWI(QnqO-aAq4l-7H11H})YJu}pLBF|><$Z5f$y?gYsPMe8u#;qOjQ4e5j4R9FX4J| zt{6a{CB;^m=nV(N*JA+pJHSlPPfG8HuS2ks%t?i|kSg8i0QcUy9u8*Hx~^~gMSnjn z%=KN~n8uWhhNtQ+6zCCcJYU#>HWlnlcD2zC-(ViP>WCo-k1ScHav+Ie( zbId$a&l3^!ApiIqa9&QOef&?eEJ` zk61uJYad4R;N?AcS;b6z6$WO-JB}%`9DaTb>>&lA1YcD{|o8~KIjkAr5nzN=$ zSeu`cEfWK#KYnpk+~Vtq2gyZ~Iq>(NFtP1>>2#ZucSUVk-a4N5XORkLH2u3+w;gc* z@n!`YUnYquVW;=|)G~@;%H_v{dNk)QhO+6M>e622 zWmL(U@7w1OT;^BPy)p${g*uZ=(~(3ULAmFI&t)HjQr<+LU+t$7$eV9!ny=dfd9E=c zcEK-!7pvzV)92j?ZGq&=jy}J3-q}JfWFcE-;@;a&;MyY-PBviJ3p?QBj_*!?Dq(eP zASiIMttFNFY%RyyPJrD9SABISD={rWUFUdv=1*~Aqp|hTAh~zfGwasxi{8!`-s6|5 zy3Qxo`!Vv9dbDKP^Uf1Zz=y^q6e9xz^gOg)VM$3wS{gbAMt~259)ZT(`yLIcC6q96 zq(iU~BSgtqwhT1ZeV*NJbM^p95Rgr;J|W(X0K0K#$+lxZG*-XKDEg8I6%~k-(K;p>`@3!1Lf)GXfu{h9@^@0nAKWdcOBkMSz1v+;LnlGaBQphG zQF>t;35kCdDZ2#s*{V6MSDaA8t~%FMx!+C7O$pJlcU3!F%&f=piORv+YT`F{pW@w& zK`T4{B*nJsf|s?uCHz=<8BY<&*GCBRC1QROPo4M8H{FztGnZBa9oC*AGR%_G$oODU zUmGS)BT~`{+#kGPravHBpGUR62yovFNNRO~@u{zsIzP+SaLdNg%jO};CSML21{jsx z2W4S*EGl(1*TyTYpX23dZ}NXjOi*_h<~JO>*vRoAy529IzVL}ys{iVG^MJo;&-}7k zoVdAM_1U!JWNJSL4IqSzi+gr43vz6 z_wB_kTgWMIFR=IL4+-46!xM+z%JWJ>^Y@oExmk$St3D6A{5UQLXb}mx4Zeh)Q^M># z`20MYx5Dym;PycrC%b6c4XV(Jhj$xqlM;eMAAV_5b+W|Z!Z_MhwjwqnJ)PkEQe$j1@oOU2>xhetU0ob9~|t45(0a&3w1z@>ZA%bX{i zsoi{zcpp2zG}rUa`5a!emuWa6cq1P&97<$#aUktO#=`1t;?-LA)$-(E_S$J^>8w3D z``<$`VPzE83XjQkCfbXc?C3|M8MukxajuG?%dT>Hbfxv56by;GsnF5r=rwWK{ss?@1~A404{ zv`4jnqn4xWT;l@gU~CiC?{G+ys3ryi?m!|9522Pd@Yb~mWoJl=kgDH2@^KpTz9SeU z^?n34%ZMDV+A#83r9PRf)7-w4Vx53+ak zcsz>=1{N3WS1ljmjr)hMwiDWdH{9Y~d^onM5ZnR>$r@bA) zz)btOc(X9sD$c4^wEZ)yxjHV+B>bCBeQhmTn2F_kPj7)XyL*+uC-Qc$ zhJSw*?<^$W4Z!lga%Sot5~9LxYUleWe@Y|vEOd-)JdCXN_w%oHbX=dZNOl*BuCVn+ zpSDj1MhN;~7ak<44z%;Hqpy-KOsaP9MhOxlQhrJUOLFYaIF$7yrms11R$o})=eI1)+D7dq;h8keXJWpO%?Q{*RIau`2HoxxUdsI@T$g`a(Raii}Eu2R@AG=#l{i z`GiQ5*F&6S6;6Lv%v#DSSTYE+DLG}x*cq7kuYKU z-L!Tw22+T$N@bXX%}`NH4BF)QI2Mws9l|Jvv#gkmSagFo?|isarvc0rvVXHwcLEZV z?ARDTxR2V{cz2ZTQ5%LlmC2 zewHP+gYv#?l*@$*)LZ2Sz{A70w6th2H&#_)ZXx=`#>eAW_%K}4fZzII{Sm|aw=US} z=n#)7#L&dM!ddd0w0~Dxd9>~_YH~?Pupz=5qu<_&1+xP9h*=A8hCJ6yaeps30=UFA z?e%<4C(lZC|3rH|fKbW$WNtDpudIGsS<#PaB3&+xhG(e&?Hu1-e&O23P082Y=<8Ik zSrO74d@8i?zM4Na4rR4k&exrdni;W@@VU>HZdez^RY`!g-B(kRFVblE?w+J17$xk! z>_)dijM`{b2ezf(pwutxq1Y$TA0TEE&rC5B$1AS_+B(@7*ty-8RY5CY>^Dd`F2<@K z`~j{m0Tcont7vd?Y;6>lSEIhUiDGnJrHZAO=)BC%I=OEq`TwTI7vCt;kk6buaGB4} zbg?nDHg~fzi_eztEZ|}N+FD$io8Mkrm`}^k2N_F8N>K=`t2`tjW5F22Ko+Pk5{R3R z&&$I@TwL6L@#*R5=H_PWYI$VD5+cC+Nnphw?pz7o9(JJHbAhHqwLh5d9va_QtQLlg zI6jF`+}^spJU>~LmuXpA@gjxu*4FUZFYmW}_#IwRN7Ka^-aCoE*3-DnVJ;QeNWh3_ z9lE&8tC0mOq&t((8VUL(E8TwCmcCvm-LI9s*_rzL-WwgKEU#olCwsN4dSxy3`wkcE6dDNW@3K=$n$zDEhliG| z&T}?Lc17cF=jZ42@~)^&D>(+&uK7>jb*PH-^4OZH$x_r;HZ&GzS7w*i z=BJnDSN>`#YAkJRKo5C>cW-$mS>Yl5vbDWEVmme#78E!1tLN>J5*#oa6X-B)WqdP;tRd6hABi6_odEwg#-mqBu72%!|MBnj~=6->o6MR1`>W>()$FYU}0r( zZ)yyEe%5I&%qym~8=i{VXdUytVQmW3(Q6Md6ls4)^mTvPr;8zzoY?2IE!^L6chIsq z*jcACr2tLJ-5bOWx#>JsX+&-=++nWLF{BSU8sZGFRG-w8J7&&Wv)bT?xzC2GG$+*6 zEbejA0vgQ=AyZiY73l3wN4udjZ!0f&M9bD|lWQgP1~PdysJj9|1R)oek<(KfQ|&CT z)V93JS`5sTbvw5z+svbm(3x4fX{({Lr~9@GJ~O5gqkP8T1Kz@V(fgDfw8y6GI)hb} zvrA*qN5U3?RaPt8xqIBYi36@*M$TjL5lrEyWWHO330qs)hTB;M=UA0iB!A9Gw{fzS zmgiqAl7Vx3?~e|Mtb~L|I?;cR#AFp7nSQ`CY}_Z=xo~G0vZk6+YD5wIyGiLHDCgLt zSqZ{neps*{iE7_ieKdJ~ulq+4i^N`-6k3=h`MH-WPD-Qrbi7sygG+`MOY73&->0Lq z(hXkHuJKOxX$`Fy5ni?ifIok@dyTwZMUoo4_ZfCq-0wBe;gP%V#GP1Bldmb{a za_WYS94Ia>?tN6!(&B}veL6a5dJw87aM79@mw?b63ia`^X7BB#)w<-^@^r^&u66kn zE!7n@&T$s!H)b|WL7&qx?_g9^o12@{{~stF8x!=q)lui-Qoq!B5`O#NRqem7nr&=X zI5$j+LJ~hP`iG#m;;Lf!eZ61_h5tTo&5AElhppEZ^!G7b#EOAnGFD3-9p%~-?un+i z*Tv0@TCinahdA@SSoBZ1TDmB>o=2Dg5Iv~qKND=RZ0_*B?FOWwG zo)2+rW@&9@Wc0(8XCyML--V%h{yv{g&~#5cC|4$G*m%Ot^xtj?G1|x+Lf4PBD3n* z6{N%2^a>Yc!6Yw-LVafp(Kgh3|fi zd5DOVV@T+TvDWflt^8oUJ1B75e8yxSVi{rHv<(%e-rOk#W&^4%t3tjF7N)7OMe+9A zrf>+SS)N~HfCNV=S5@c+47@MCWAN|bRT`x;Im}5xh=G6+siMrVx#Cqb0rZT1-lI9g zfsR8DuO_nD0nvB2eFCT8h!g#*61RuY<)A;;K3KU1y9z zVv}ZMl%1w2_jP7|ZXnya&Y25=cePej7VK)BIrYl`1bE5O!oc@Fn&3Yj*0b@fhoYG~ zsNevUJJE@`&8t<9T&V_!nt8}5nrq+8uk$I=Y@r;46^c9XKbp>7b07;st|V}nAYiAj zL22O^LFzRI92&s+Fzx~Kny$NtsiUKbjnV7<9ZA!mjEoG#$L)vheZ4mVxoT&~l2zR( zMuvt;s;e({cs=0Y;!@rtp`v~yFA0_W!}vs3}et~3YPHq+Z@v@-NbOtnLj zZCwRi$0QwSb&P;gmHooNF`d%kSCb6b&7gWR_OSrmYRH!X}mRJZZ#U{w03jE@+v zy}~_+ttccUq_Oe)<)_a2TlF6ph~xx*aD%9E8xog(i8(ofkfN!k2CvK4-LBna_uuCI z@dF~*`V9%90CVYd3<3?bG5Lw-R^4N9HEazQ4KVz(%hYc`s*QR@Un9F~RY+Wh&0%~* zOt)=v@wr!N7D*jo=FL&tFiI8B>{9ZEVDX-kr!3bEDXcvGnFTqJh4cuL1w(!_rd;eQg{Q0=C z-k0+k`~_?9Csq-8+%MPR_=b_gZ!vo=3W;O3KVTaK($W~{E2^EZTyLYDB1hTXWL4`h z7Q2hBy-d?R1_n#aHroXdK4Vs@)G)+utBTbwrThRkJ&sub(NZ?UFc{k z1cXvY;#Uc@GVGI7!M`(rZioy)09s@+-flrB6^+zMUb z{+qRX1+yi*J1RBcIyW`$4}FU6nLWv4gd2o4X;<#5^{GRl8*MU=Zg*XD!wfX9t zMtiC1M0%YoW60qMAeHch6EOyYi`++_N0bk~_MTAbyiI7=KAa!7GhZH^A5ToO^feDy z5IyRWYzlaUHWXJ9LC0_r152ZrP3lT}0#_o0V=ff~BKtz(xA&Bns6>}@fz?gqRM1Ov zFm2yHo>2FL|0BbaekE`lRn!*TxE(#zIZl5}s16!T?$v6eARJD8AI@ z!ue8F^#Qll;Q)Ja$iO%phsgRLpC@rfR5((kg0_Dr>>rAfdo|#sgo!p)u6pKE8;c;c z*^l1ffyZ`U`VeB?^!d2(&@jLEa}AK4NN6cP6z%(prl&JgyQ5jo17 zTAlOz-fDj&?PVttju}A72tKBc_aozbd*jo0BaPOg69pY)qJdy=ADI75G;m!MmY=#n zeaLPtz4gK1edP3;50OH)e_T0284~CVGC+uv zlM`a*Oh`z8$Rv=RdD~dk)TDlvKj%}4D#zlbpEXnf89OiadR^q9E)I5SX?lE2c>&YY zS6puS3zJAIbp>CPfdHB!&hOEAC1Mjipb2;gi91Q>_Hc20YKkA{y6_bvEPBk^@=U0E zR}KPkq#|Zz^capn$E>`5&vD(L$F%bppFe|PLDNvE><)a@zW3@@M;_C*K6=edm5WQ^ zma?vLOomAq=x11~Ik~$+GspL*+eE+=^Fb2lYID%C7cEE(U;Ejtd|4vPU8eSWs?H%& z(qnKhg%hGkw>q+5cZqZ-6cn=Ugu4T#TpnDLO(pi8j*@tD&aPtH@tK_kRiEvu_o{yj z70{@+U_+i_p8*iY{p&QRdlP%n5s#>e5QjF?H7$Fft5hGY3l}LVqDoN^={db6L2Ut?K$YoP)OIDd%g=?BqMlNcC|RUgokeN2l=fqazy5Ict zM~wOiq`GX^kNiz^Z{dN(A(2ka!aBvpIUl9d0?Frbjo`b|CK#`b3E-;f*E~`a@NAz} zwOPgOa{O}oLcBTUIs2jO`!w6Xv@l9J9c6rxvXNrL6Lqyey4jRrYS?hXZv4K61>pm;Nke|EQTh0U*FS=uArqVo zcZs2My$(-FZ1;5CUJd20^;ia|n?9M}&n8y1`Sz4dspZ@VO8URB?A7ppO zBqYu0i0|_<il03 z>?;&mey*z~;PrEfs%Zz>rO4Q4NW<5J421YeMd!ZtOwAU@39cLs6qy3S!RZh<RZj4VqJ|MYjR!rl#O`b90ndvLL0}%Yoc$5G71Y{PFVl6u z=9+^lY?;cYwny*0oCu^Ln4uYQCJQJ9;#~29bv&ib8Xw2yILchxb< z5VKF+MX`rm0CM{gKw1gFXdP08(9APD6_+@l(>IzwEY8uNy%5|31?#R5>k&+zuUuTk zC$fU#%5s%vfkZ&!6YJ2>kjm(FTp;laY~;r|dW~T1=SV$h!_YYc~L zxMLK9b40hU&;X?LX*?e0ilF|enbFHjt5`2!0!4h)FZ`@XjM-wI-D;IR&W0AFSHU#W z6U;~0R?2BiGt@42ftcBHLH8v zVzCt{nXXC2Pb=F0&4au{{Q7u12Q5bJaYz-Ou5pOAF(|0<39<3znXAQX=MPyrOyAG* zxGri`F^li49R1hh&bP#VL;q;4E~R8;tt~D6cT)Z?E+WFg3H|346{Wfs$8U$g${fE? z7ot#9(Q8%j*!|;@7GQeY}Ko=ngT1(%N6O= zASARj7y3MH5dc7@Km4jFtMNlx#*+r5q&Y`~rBq}bS7Dc0Wf)&&mk1%+k-6bq665uX z^K9i!jC75i*5!ubz9PLSNG-OX8Y0fKaj{D#)pFPpudEyfj?xBrmr_?SrZ z*RnS^-SApkmN5!@alh2%^S7?`)T%@&bloEinVF+;74OQ~+a4wD-3= zV~k-Q!ToIwvb5 z1DPXP(0U1NK{Nk>yczn_r$AdMErc?Sl|wF)Lk^n6MA!fdXA7OP&zq(LjWZAp5mQG} zee(vR;gjazzf_4LvjsX+j-%BB#^a(ul&Lg)l^-4m7I;?T`^t^!KD46+HoBL?On)Nf znXAgr(4s3lO_Bg;m09fZo?5!@^vWE2HxLvghEJ#S?%TGx z%o&@$02)Eb)Jrawj!QPpmQ)m{tgPtry<|zEi})xDn{#qtYP( zOJk}C$^tivroL3dqZ~yT>Gb6W zuT)ytJraNQ+;0AH2mVuHN7KA8bNgGk7>J8R2n-8m_{u;Hn7|CEg3)gMrEl}6s^uGp zi|uPRy?bvA^GusS_-h)C>*1oXDLgn=RZ?8TcFi1jfL!&(=Ud!!PDm_&lxev8#d=+g z+I2ah7=A=1=H`Vi)1H#cAdi-9FAC<%o`zVOE)JVwq&TwMc_5C@lp1 zr&TRcR|xuhJ=Q)%V_Xny64P6gpl1M-7tHp*=9@WX?5Y)M{umKZu@8JBKhd;GN!l3xLMCcEga{Ap) z5!<4?++Bo4ZmKV-Pgt=B_4!{wfS1rkFRbW1woZ>^_ob-GqoazigTsU(zx~hK>J$;O zEpc~!1zFv>SZ#2Z_{7A0 zux}{G2WNn9%cBsDM(6y3Lu>up&Er>p951q?kp^o=Mk@=9=zF1$=*OeZrP8nDT^Wt? zP0Y3uf5s){CI(%iWKC7u0;r`UW#M4ni7I00ogv({0dO7%A0P744BVH3q9RjBoo;Sk zT3v1X{To$LQc`lLQnw8X^tmwcpElie>Pu#TXD}*u`E%I`!m$OLj=0=IPNt6M2-SP0 zFn8rECa!?j3*v$+)f7>Y6|t#-w=9!&TdMv-e4K7l;!jcMFRU%S)4U6VMf6>T6;<|^ z1GFhH4eqxtZg;bPme7%yj0Ok(7jF}`5#~rxn^RFowq|hXd~u(lx?uKKeV*XZq$p)a zhJ7|tzB=S>FuwYXeM*je@by-{HbxH7$HSE911rUBDd%bebj@{FnWMw@T+QJ&mqj89 z@iB&)ujbFe1rR5(i2=AKwlQoH>Z6m;CayEne8sNVV~4)euP(%0?G9$We6@r(n-p%; zlis*eyYCsWYE(i1jFeV0ixT?&uuug{Ui4DYwDUQJ`{mGKC7U7l4<#;>Cw`6R!J)t& zT|zWv9GP>-jX6B<;v@d83@ZaOE|Z0quGkB!k?rNPR%ciO2pV%~W=!U`RHu91>{yYN z2rU};_ABMA5tis6S*1^%H&T{SS4SeN+IVGfaq{1tPWvRMioCTzkHtcmQ<6|{c>24@4N8Qv6%9#Df#UCvVuy_{Pl>y_(=25!3sqs zR?9-ADs%HwfOw*!yj(AiX&~=)aV=A1(17?3N}2~j^3QS-KGL<`@#?QjsVF7QTAU@R zve_f4VNQG(KbTy^WDw5(!f_O(wKI&NP+(ohqWeoxZH)jhYd2vOat%gC*H8?JR>Bbc zdYHcuEmop&;C(j@P7cY9&}B`^QzibY4Bp5G>%DSY`{VtZv{2Z0FogCLv`-D2)zAdX zy$HFxyttpO;FFS$e{r(Z`q_{M{&sV4JpdEdQ13>fLF?vz z*9issqUtRpF7MO#8#*S>uNvlggatBk6A3y($M+Y4f?OXS`{w_-zlHcM>uIGiF-%^Z z9;K#wGY{q5QOoY!Ppvn3lU~Eho_k!?N